Send commitlog mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r3545 - in trunk/src/target/gsm: include/gsmd include/libgsmd
      src/gsmd src/libgsmd src/util ([EMAIL PROTECTED])
   2. r3546 - in trunk/src/target/gsm: include/gsmd include/libgsmd
      src/gsmd src/libgsmd src/util ([EMAIL PROTECTED])
--- Begin Message ---
Author: tick
Date: 2007-12-01 02:55:39 +0100 (Sat, 01 Dec 2007)
New Revision: 3545

Modified:
   trunk/src/target/gsm/include/gsmd/unsolicited.h
   trunk/src/target/gsm/include/libgsmd/pin.h
   trunk/src/target/gsm/src/gsmd/unsolicited.c
   trunk/src/target/gsm/src/gsmd/usock.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c
   trunk/src/target/gsm/src/util/pin.c
   trunk/src/target/gsm/src/util/shell.c
   trunk/src/target/gsm/src/util/shell.h
Log:
gsmd: Submitting a PIN for authentication needs to respond with status 
too.(Andrzej Zaborowski)


Modified: trunk/src/target/gsm/include/gsmd/unsolicited.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/unsolicited.h     2007-12-01 01:54:59 UTC 
(rev 3544)
+++ trunk/src/target/gsm/include/gsmd/unsolicited.h     2007-12-01 01:55:39 UTC 
(rev 3545)
@@ -15,6 +15,7 @@
 extern void unsolicited_generic_init(struct gsmd *g);
 extern int unsolicited_register_array(const struct gsmd_unsolicit *arr,
                int len);
+extern const int pintype_from_cme[];
 
 #endif /* __GSMD__ */
 

Modified: trunk/src/target/gsm/include/libgsmd/pin.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/pin.h  2007-12-01 01:54:59 UTC (rev 
3544)
+++ trunk/src/target/gsm/include/libgsmd/pin.h  2007-12-01 01:55:39 UTC (rev 
3545)
@@ -3,6 +3,7 @@
 
 extern const char *lgsm_pin_name(enum gsmd_pin_type ptype);
 
-extern int lgsm_pin(struct lgsm_handle *lh, unsigned int type, char *pin, char 
*newpin);
+extern int lgsm_pin(struct lgsm_handle *lh, unsigned int type,
+               const char *pin, const char *newpin);
 
 #endif

Modified: trunk/src/target/gsm/src/gsmd/unsolicited.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/unsolicited.c 2007-12-01 01:54:59 UTC (rev 
3544)
+++ trunk/src/target/gsm/src/gsmd/unsolicited.c 2007-12-01 01:55:39 UTC (rev 
3545)
@@ -487,12 +487,40 @@
        return 0;
 }
 
+const int pintype_from_cme[GSM0707_CME_UNKNOWN] = {
+       [GSM0707_CME_PH_SIM_PIN_REQUIRED]       = GSMD_PIN_PH_SIM_PIN,
+       [GSM0707_CME_PH_FSIM_PIN_REQUIRED]      = GSMD_PIN_PH_FSIM_PIN,
+       [GSM0707_CME_PH_FSIM_PUK_REQUIRED]      = GSMD_PIN_PH_FSIM_PUK,
+       [GSM0707_CME_SIM_PIN_REQUIRED]          = GSMD_PIN_SIM_PIN,
+       [GSM0707_CME_SIM_PUK_REQUIRED]          = GSMD_PIN_SIM_PUK,
+       [GSM0707_CME_SIM_PIN2_REQUIRED]         = GSMD_PIN_SIM_PIN2,
+       [GSM0707_CME_SIM_PUK2_REQUIRED]         = GSMD_PIN_SIM_PUK2,
+       [GSM0707_CME_NETPERS_PIN_REQUIRED]      = GSMD_PIN_PH_NET_PIN,
+       [GSM0707_CME_NETPERS_PUK_REQUIRED]      = GSMD_PIN_PH_NET_PUK,
+       [GSM0707_CME_NETSUBSET_PIN_REQUIRED]    = GSMD_PIN_PH_NETSUB_PIN,
+       [GSM0707_CME_NETSUBSET_PUK_REQUIRED]    = GSMD_PIN_PH_NETSUB_PUK,
+       [GSM0707_CME_PROVIDER_PIN_REQUIRED]     = GSMD_PIN_PH_SP_PIN,
+       [GSM0707_CME_PROVIDER_PUK_REQUIRED]     = GSMD_PIN_PH_SP_PUK,
+       [GSM0707_CME_CORPORATE_PIN_REQUIRED]    = GSMD_PIN_PH_CORP_PIN,
+       [GSM0707_CME_CORPORATE_PUK_REQUIRED]    = GSMD_PIN_PH_CORP_PUK,
+       /* FIXME: */
+       [GSM0707_CME_SIM_FAILURE]               = 0,
+       [GSM0707_CME_SIM_BUSY]                  = 0,
+       [GSM0707_CME_SIM_WRONG]                 = 0,
+       [GSM0707_CME_MEMORY_FULL]               = 0,
+       [GSM0707_CME_MEMORY_FAILURE]            = 0,
+       [GSM0707_CME_PHONE_FAILURE]             = 0,
+       [GSM0707_CME_PHONE_NOCONNECT]           = 0,
+       [GSM0707_CME_PHONE_ADAPT_RESERVED]      = 0,
+       [GSM0707_CME_SIM_NOT_INSERTED]          = 0,
+};
+
 int generate_event_from_cme(struct gsmd *g, unsigned int cme_error)
 {
        struct gsmd_ucmd *gu;
        struct gsmd_evt_auxdata *eaux;
 
-       if (!is_in_array(cme_error, errors_creating_events,
+       if (!is_in_array(cme_error, errors_creating_events,
                ARRAY_SIZE(errors_creating_events))) {
 
                gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_IN_ERROR, 
sizeof(*eaux));
@@ -501,78 +529,18 @@
                eaux = ((void *)gu) + sizeof(*gu);
                eaux->u.cme_err.number = cme_error;
                return usock_evt_send(g, gu, GSMD_EVT_IN_ERROR);
-       }
-       else {
-               gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN, 
sizeof(*eaux));
+       } else {
+               if (cme_error >= GSM0707_CME_UNKNOWN ||
+                               !pintype_from_cme[cme_error])
+                       return 0;
+
+               gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN,
+                               sizeof(*eaux));
                if (!gu)
                        return -1;
+
                eaux = ((void *)gu) + sizeof(*gu);
-       
-               switch (cme_error) {
-               case GSM0707_CME_PH_SIM_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_SIM_PIN;
-                       break;
-               case GSM0707_CME_PH_FSIM_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_FSIM_PIN;
-                       break;
-               case GSM0707_CME_PH_FSIM_PUK_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_FSIM_PUK;
-                       break;
-               case GSM0707_CME_SIM_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_SIM_PIN;
-                       break;
-               case GSM0707_CME_SIM_PUK_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_SIM_PUK;
-                       break;
-               case GSM0707_CME_SIM_PIN2_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_SIM_PIN2;
-                       break;
-               case GSM0707_CME_SIM_PUK2_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_SIM_PUK2;
-                       break;
-               case GSM0707_CME_NETPERS_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_NET_PIN;
-                       break;
-               case GSM0707_CME_NETPERS_PUK_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_NET_PUK;
-                       break;
-               case GSM0707_CME_NETSUBSET_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_NETSUB_PIN;
-                       break;
-               case GSM0707_CME_NETSUBSET_PUK_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_NETSUB_PUK;
-                       break;
-               case GSM0707_CME_PROVIDER_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_SP_PIN;
-                       break;
-               case GSM0707_CME_PROVIDER_PUK_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_SP_PUK;
-                       break;
-               case GSM0707_CME_CORPORATE_PIN_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_CORP_PIN;
-                       break;
-               case GSM0707_CME_CORPORATE_PUK_REQUIRED:
-                       eaux->u.pin.type = GSMD_PIN_PH_CORP_PUK;
-                       break;
-       
-               case GSM0707_CME_SIM_FAILURE:
-               case GSM0707_CME_SIM_BUSY:
-               case GSM0707_CME_SIM_WRONG:
-               case GSM0707_CME_MEMORY_FULL:
-               case GSM0707_CME_MEMORY_FAILURE:
-               case GSM0707_CME_PHONE_FAILURE:
-               case GSM0707_CME_PHONE_NOCONNECT:
-               case GSM0707_CME_PHONE_ADAPT_RESERVED:
-               case GSM0707_CME_SIM_NOT_INSERTED:
-                       /* FIXME */
-                       talloc_free(gu);
-                       return 0;
-                       break;
-               default:
-                       talloc_free(gu);
-                       return 0;
-                       break;
-               }
+               eaux->u.pin.type = pintype_from_cme[cme_error];
                return usock_evt_send(g, gu, GSMD_EVT_PIN);
        }
 }

Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c       2007-12-01 01:54:59 UTC (rev 
3544)
+++ trunk/src/target/gsm/src/gsmd/usock.c       2007-12-01 01:55:39 UTC (rev 
3545)
@@ -185,19 +185,18 @@
 /* PIN command callback. Gets called for response to AT+CPIN cmcd */
 static int pin_cmd_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       gsmd_log(GSMD_DEBUG, "pin cmd cb\n");
+       struct gsmd_user *gu = ctx;
+       struct gsmd_ucmd *ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PIN,
+                       GSMD_PIN_INPUT, 0);
 
-       /* We need to verify if there is some error */
-       switch (cmd->ret) {
-       case 0:
-               break;
-       case GSM0707_CME_INCORRECT_PASSWORD:
-               /* prompt for pin again */
-               break;
-       default:        
-               /* something went wrong */
-               break;
-       }
+       if (!ucmd)
+               return -ENOMEM;
+
+       /* Pass a GSM07.07 CME code directly, don't issue a new PIN
+        * request because the client waits for a response to her
+        * PIN submission rather than an event.  */
+       ((int *) ucmd->buf)[0] = cmd->ret;
+       usock_cmd_enqueue(ucmd, gu);
        return 0;
 }
 
@@ -409,7 +408,7 @@
        ucmd = ucmd_alloc(len);
        if (!ucmd)
                return NULL;
-       
+
        ucmd->hdr.version = GSMD_PROTO_VERSION;
        ucmd->hdr.msg_type = msg_type;
        ucmd->hdr.msg_subtype = msg_subtype;
@@ -651,7 +650,7 @@
                num->service = GSMD_SERVICE_UNKNOWN;
        num->name[len] = 0;
        num->addr.type = type;
-       num->is_last = (cmd->ret == 0, NULL);
+       num->is_last = (cmd->ret == 0);
 
        usock_cmd_enqueue(ucmd, gu);
 

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c      2007-12-01 01:54:59 UTC 
(rev 3544)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c      2007-12-01 01:55:39 UTC 
(rev 3545)
@@ -55,7 +55,8 @@
        return pin_type_names[ptype];
 }
 
-int lgsm_pin(struct lgsm_handle *lh, unsigned int type, char *pin, char 
*newpin)
+int lgsm_pin(struct lgsm_handle *lh, unsigned int type,
+               const char *pin, const char *newpin)
 {
        int rc;
        struct {
@@ -74,20 +75,19 @@
                return -ENOMEM;
 
        gm->gp.type = type;
+       strcpy(gm->gp.pin, pin);
 
-       gm->gp.pin[0] = '\0';
-       strcat(gm->gp.pin, pin);
-
        switch (type) {
        case GSMD_PIN_SIM_PUK:
        case GSMD_PIN_SIM_PUK2:
                /* GSM 07.07 explicitly states that only those two PUK types
                 * require a new pin to be specified! Don't know if this is a
                 * bug or a feature. */
-               if (!newpin)
+               if (!newpin) {
+                       free(gm);
                        return -EINVAL;
-               gm->gp.newpin[0] = '\0';
-               strcat(gm->gp.newpin, newpin);
+               }
+               strcpy(gm->gp.newpin, newpin);
                break;
        default:
                break;

Modified: trunk/src/target/gsm/src/util/pin.c
===================================================================
--- trunk/src/target/gsm/src/util/pin.c 2007-12-01 01:54:59 UTC (rev 3544)
+++ trunk/src/target/gsm/src/util/pin.c 2007-12-01 01:55:39 UTC (rev 3545)
@@ -27,24 +27,28 @@
 #include <libgsmd/event.h>
 #include <libgsmd/pin.h>
 
+#include "shell.h"
+
 #define PIN_SIZE 8
 
-static char *pin;
+static const char *pin;
 static char pinbuf[PIN_SIZE+1];
 static char pinbuf2[PIN_SIZE+1];
 
-static int pin_handler(struct lgsm_handle *lh, int evt, struct 
gsmd_evt_auxdata *aux)
+static int pin_handler(struct lgsm_handle *lh,
+               int evt, struct gsmd_evt_auxdata *aux)
 {
        int rc;
        int type = aux->u.pin.type;
        char *newpin = NULL;
 
-       printf("EVENT: PIN request (type='%s') ", 
lgsm_pin_name(aux->u.pin.type));
+       printf("EVENT: PIN request (type='%s') ", lgsm_pin_name(type));
 
        /* FIXME: read pin from STDIN and send it back via lgsm_pin */
        if (type == 1 && pin) {
                printf("Auto-responding with pin `%s'\n", pin);
-               lgsm_pin(lh, type, pin, NULL);
+               pending_responses ++;
+               return lgsm_pin(lh, type, pin, NULL);
        } else {
                do {
                        printf("Please enter %s: ", lgsm_pin_name(type));
@@ -64,10 +68,9 @@
                        break;
                }
 
+               pending_responses ++;
                return lgsm_pin(lh, type, pinbuf, newpin);
        }
-
-       return 0;
 }
 
 int pin_init(struct lgsm_handle *lh, const char *pin_preset)

Modified: trunk/src/target/gsm/src/util/shell.c
===================================================================
--- trunk/src/target/gsm/src/util/shell.c       2007-12-01 01:54:59 UTC (rev 
3544)
+++ trunk/src/target/gsm/src/util/shell.c       2007-12-01 01:55:39 UTC (rev 
3545)
@@ -44,7 +44,7 @@
 static int nFIND = 0;
 static int nREADRG = 0;
 
-static int pending_responses = 0;
+int pending_responses = 0;
 
 /* this is the handler for receiving passthrough responses */
 static int pt_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
@@ -373,6 +373,32 @@
        return 0;
 }
 
+static int pin_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
+{
+       int result = *(int *) gmh->data;
+
+       if (result)
+               printf("PIN error %i\n", result);
+       else
+               printf("PIN accepted!\n");
+       pending_responses --;
+       return 0;
+}
+
+static const struct msghandler_s {
+       int type;
+       lgsm_msg_handler *fn;
+} msghandlers[] = {
+       { GSMD_MSG_PASSTHROUGH, pt_msghandler },
+       { GSMD_MSG_PHONEBOOK,   pb_msghandler },
+       { GSMD_MSG_SMS,         sms_msghandler },
+       { GSMD_MSG_NETWORK,     net_msghandler },
+       { GSMD_MSG_PHONE,       phone_msghandler },
+       { GSMD_MSG_PIN,         pin_msghandler },
+
+       { 0, 0 }
+};
+
 static int shell_help(void)
 {
        printf( "\tA\tAnswer incoming call\n"
@@ -424,12 +450,10 @@
        fd_set readset;
        char *ptr, *fcomma, *lcomma;
        int gsm_fd = lgsm_fd(lgsmh);
+       const struct msghandler_s *hndl;
 
-       lgsm_register_handler(lgsmh, GSMD_MSG_PASSTHROUGH, &pt_msghandler);
-       lgsm_register_handler(lgsmh, GSMD_MSG_PHONEBOOK, &pb_msghandler);
-       lgsm_register_handler(lgsmh, GSMD_MSG_SMS, &sms_msghandler);
-       lgsm_register_handler(lgsmh, GSMD_MSG_NETWORK, &net_msghandler);
-       lgsm_register_handler(lgsmh, GSMD_MSG_PHONE, &phone_msghandler);
+       for (hndl = msghandlers; hndl->fn; hndl ++)
+               lgsm_register_handler(lgsmh, hndl->type, hndl->fn);
 
        fcntl(0, F_SETFD, O_NONBLOCK);
        fcntl(gsm_fd, F_SETFD, O_NONBLOCK);

Modified: trunk/src/target/gsm/src/util/shell.h
===================================================================
--- trunk/src/target/gsm/src/util/shell.h       2007-12-01 01:54:59 UTC (rev 
3544)
+++ trunk/src/target/gsm/src/util/shell.h       2007-12-01 01:55:39 UTC (rev 
3545)
@@ -1,2 +1,2 @@
-
 extern int shell_main(struct lgsm_handle *lgsmh, int sync);
+extern int pending_responses;




--- End Message ---
--- Begin Message ---
Author: tick
Date: 2007-12-01 02:57:09 +0100 (Sat, 01 Dec 2007)
New Revision: 3546

Modified:
   trunk/src/target/gsm/include/gsmd/usock.h
   trunk/src/target/gsm/include/libgsmd/libgsmd.h
   trunk/src/target/gsm/src/gsmd/sms_cb.c
   trunk/src/target/gsm/src/gsmd/usock.c
   trunk/src/target/gsm/src/libgsmd/libgsmd.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_event.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_passthrough.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c
   trunk/src/target/gsm/src/util/atcmd.c
Log:
gsmd: Severe clean-up (Andrzej Zaborowski)


Modified: trunk/src/target/gsm/include/gsmd/usock.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/usock.h   2007-12-01 01:55:39 UTC (rev 
3545)
+++ trunk/src/target/gsm/include/gsmd/usock.h   2007-12-01 01:57:09 UTC (rev 
3546)
@@ -620,8 +620,8 @@
 extern void usock_cmd_enqueue(struct gsmd_ucmd *ucmd, struct gsmd_user *gu);
 extern struct gsmd_ucmd *usock_build_event(u_int8_t type, u_int8_t subtype, 
u_int16_t len);
 extern int usock_evt_send(struct gsmd *gsmd, struct gsmd_ucmd *ucmd, u_int32_t 
evt);
-extern struct gsmd_ucmd *gsmd_ucmd_fill(int len, u_int8_t msg_type,
-               u_int8_t msg_subtype, u_int16_t id);
+extern int gsmd_ucmd_submit(struct gsmd_user *gu, u_int8_t msg_type,
+               u_int8_t msg_subtype, u_int16_t id, int len, const void *data);
 
 #endif /* __GSMD__ */
 

Modified: trunk/src/target/gsm/include/libgsmd/libgsmd.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/libgsmd.h      2007-12-01 01:55:39 UTC 
(rev 3545)
+++ trunk/src/target/gsm/include/libgsmd/libgsmd.h      2007-12-01 01:57:09 UTC 
(rev 3546)
@@ -66,5 +66,7 @@
 extern struct gsmd_msg_hdr *lgsm_gmh_fill(int type, int subtype, int 
payload_len);
 extern int lgsm_send(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh);
 extern int lgsm_handle_packet(struct lgsm_handle *lh, char *buf, int len);
+extern int lgsm_blocking_wait_packet(struct lgsm_handle *lh, u_int16_t id,
+               struct gsmd_msg_hdr *gmh, int rlen);
 
 #endif

Modified: trunk/src/target/gsm/src/gsmd/sms_cb.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/sms_cb.c      2007-12-01 01:55:39 UTC (rev 
3545)
+++ trunk/src/target/gsm/src/gsmd/sms_cb.c      2007-12-01 01:57:09 UTC (rev 
3546)
@@ -64,13 +64,12 @@
 static int sms_list_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        struct gsmd_sms_list msg;
        int i, idx, stat, len, cr;
        u_int8_t pdu[SMS_MAX_PDU_SIZE];
 
        if (cmd->ret && cmd->ret != -255)
-               return 0;
+               return 0;       /* TODO: Send a response */
 
        /* FIXME: TEXT mode */
        if (
@@ -78,9 +77,9 @@
                                &idx, &stat, &len, &cr) < 3 &&
                        sscanf(resp, "+CMGL: %i,%i,\"%*[^\"]\",%i\n%n",
                                &idx, &stat, &len, &cr) < 3)
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
        if (len > 164)
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
 
        msg.index = idx;
        msg.stat = stat;
@@ -89,37 +88,29 @@
                        i < SMS_MAX_PDU_SIZE; i ++) {
                if (sscanf(resp + cr, "%2hhX", &pdu[i]) < 1) {
                        gsmd_log(GSMD_DEBUG, "malformed input (%i)\n", i);
-                       return -EINVAL;
+                       return -EINVAL; /* TODO: Send a response */
                }
                cr += 2;
        }
        if (sms_pdu_to_msg(&msg, pdu, len, i)) {
                gsmd_log(GSMD_DEBUG, "malformed PDU\n");
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
        }
 
-       ucmd = gsmd_ucmd_fill(sizeof(msg), GSMD_MSG_SMS,
-                       GSMD_SMS_LIST, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-       memcpy(ucmd->buf, &msg, sizeof(msg));
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_SMS, GSMD_SMS_LIST,
+                       cmd->id, sizeof(msg), &msg);
 }
 
 static int sms_read_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        struct gsmd_sms_list msg;
        int i, stat, len, cr;
        u_int8_t pdu[SMS_MAX_PDU_SIZE];
        const char *colon;
 
        if (cmd->ret)
-               return 0;
+               return 0;       /* TODO: Send a response */
 
        /* FIXME: TEXT mode */
        if (
@@ -127,9 +118,9 @@
                                &stat, &len, &cr) < 2 &&
                         sscanf(resp, "+CMGR: %i,\"%*[^\"]\",%i\n%n",
                                &stat, &len, &cr) < 2)
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
        if (len > 164)
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
 
        msg.index = 0;
        colon = strchr(cmd->buf, '=');
@@ -143,7 +134,7 @@
                        i < SMS_MAX_PDU_SIZE; i ++) {
                if (sscanf(resp + cr, "%2hhX", &pdu[i]) < 1) {
                        gsmd_log(GSMD_DEBUG, "malformed input (%i)\n", i);
-                       return -EINVAL;
+                       return -EINVAL; /* TODO: Send a response */
                }
                cr += 2;
        }
@@ -152,80 +143,44 @@
                return -EINVAL;
        }
 
-       ucmd = gsmd_ucmd_fill(sizeof(msg), GSMD_MSG_SMS,
-                       GSMD_SMS_READ, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-       memcpy(ucmd->buf, &msg, sizeof(msg));
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_SMS, GSMD_SMS_READ,
+                       cmd->id, sizeof(msg), &msg);
 }
 
 static int sms_send_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        int msgref;
 
        if (cmd->ret == 0 || cmd->ret == -255) {
                if (sscanf(resp, "+CMGS: %i", &msgref) < 1)
-                       return -EINVAL;
+                       msgref = -EINVAL;
        } else
                msgref = -cmd->ret;
 
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_SMS,
-                       GSMD_SMS_SEND, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-       *(int *) ucmd->buf = msgref;
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_SMS, GSMD_SMS_SEND,
+                       cmd->id, sizeof(msgref), &msgref);
 }
 
 static int sms_write_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        int result;
 
        if (cmd->ret == 0) {
                if (sscanf(resp, "+CMGW: %i", &result) < 1)
-                       return -EINVAL;
+                       result = -EINVAL;
        } else
                result = -cmd->ret;
 
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_SMS,
-                       GSMD_SMS_WRITE, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-       *(int *) ucmd->buf = result;
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_SMS, GSMD_SMS_WRITE,
+                       cmd->id, sizeof(result), &result);
 }
 
 static int sms_delete_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-       int *result;
+       int result = cmd->ret;
 
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_SMS,
-                       GSMD_SMS_DELETE, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-
-       result = (int *) ucmd->buf;
-       *result = cmd->ret;
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_SMS, GSMD_SMS_DELETE,
+                       cmd->id, sizeof(result), &result);
 }
 
 static int usock_cpms_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
@@ -253,7 +208,7 @@
                                buf[2], &gss->mem[2].used, &gss->mem[2].total)
                        < 9) {
                talloc_free(ucmd);
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
        }
 
        gss->mem[0].memtype = parse_memtype(buf[0]);
@@ -267,24 +222,15 @@
 
 static int usock_get_smsc_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-       struct gsmd_addr *ga;
+       struct gsmd_addr ga;
 
-       ucmd = gsmd_ucmd_fill(sizeof(struct gsmd_addr), GSMD_MSG_SMS,
-                       GSMD_SMS_GET_SERVICE_CENTRE, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-
-       ga = (struct gsmd_addr *) ucmd->buf;
        if (sscanf(resp, "+CSCA: \"%31[^\"]\",%hhi",
-                               ga->number, &ga->type) < 2) {
-               talloc_free(ucmd);
-               return -EINVAL;
-       }
+                               ga.number, &ga.type) < 2)
+               return -EINVAL; /* TODO: Send a response */
 
-       usock_cmd_enqueue(ucmd, gu);
-       return 0;
+       return gsmd_ucmd_submit(ctx,
+                       GSMD_MSG_SMS, GSMD_SMS_GET_SERVICE_CENTRE,
+                       cmd->id, sizeof(ga), &ga);
 }
 
 static const char *gsmd_cmgl_stat[] = {

Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c       2007-12-01 01:55:39 UTC (rev 
3545)
+++ trunk/src/target/gsm/src/gsmd/usock.c       2007-12-01 01:57:09 UTC (rev 
3546)
@@ -20,6 +20,7 @@
  *
  */ 
 
+#define _GNU_SOURCE
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -186,18 +187,13 @@
 static int pin_cmd_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PIN,
-                       GSMD_PIN_INPUT, 0);
+       int ret = cmd->ret;
 
-       if (!ucmd)
-               return -ENOMEM;
-
        /* Pass a GSM07.07 CME code directly, don't issue a new PIN
         * request because the client waits for a response to her
         * PIN submission rather than an event.  */
-       ((int *) ucmd->buf)[0] = cmd->ret;
-       usock_cmd_enqueue(ucmd, gu);
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_PIN, GSMD_PIN_INPUT,
+                       cmd->id, sizeof(ret), &ret);
 }
 
 static int usock_rcv_pin(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
@@ -227,13 +223,13 @@
        if (!cmd)
                return -ENOMEM;
 
-       strcat(cmd->buf, gp->pin);
+       strncat(cmd->buf, gp->pin, sizeof(gp->pin));
 
        switch (gp->type) {
        case GSMD_PIN_SIM_PUK:
        case GSMD_PIN_SIM_PUK2:
                strcat(cmd->buf, "\",\"");
-               strcat(cmd->buf, gp->newpin);
+               strncat(cmd->buf, gp->newpin, sizeof(gp->newpin));
                break;
        default:
                break;
@@ -247,10 +243,10 @@
 static int phone_powerup_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
+       int ret = cmd->ret;
 
        /* We need to verify if there is some error */
-       switch (cmd->ret) {
+       switch (ret) {
        case 0:
                gsmd_log(GSMD_DEBUG, "Radio powered-up\n");
                gu->gsmd->dev_state.on = 1;
@@ -261,47 +257,23 @@
                break;
        }
 
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PHONE,
-                       GSMD_PHONE_POWERUP, 0);
-       if (ucmd) {
-               ((int *) ucmd->buf)[0] = cmd->ret;
-               usock_cmd_enqueue(ucmd, gu);
-               return 0;
-       }
-       return -ENOMEM;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_POWERUP,
+                       cmd->id, sizeof(ret), &ret);
 }
 
 static int phone_powerdown_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PHONE,
-                       GSMD_PHONE_POWERDOWN, 0);
-
-       if (ucmd) {
-               ((int *) ucmd->buf)[0] = cmd->ret;
-               usock_cmd_enqueue(ucmd, gu);
-               return 0;
-       }
-       return -ENOMEM;
+       int ret = cmd->ret;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_PHONE, GSMD_PHONE_POWERDOWN,
+                       cmd->id, sizeof(ret), &ret);
 }
 
 static int get_imsi_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-
        DEBUGP("resp: %s\n", resp);
 
-       ucmd = gsmd_ucmd_fill(strlen(resp)+1, GSMD_MSG_PHONE,
-                                 GSMD_PHONE_GET_IMSI, 0);
-       if (!ucmd)
-               return -ENOMEM;
-
-       strcpy(ucmd->buf, resp);
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_PHONE, GSMD_PHONE_GET_IMSI,
+                       cmd->id, strlen(resp) + 1, resp);
 }
 
 static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
@@ -400,56 +372,46 @@
        return -EINVAL;
 }
 
-struct gsmd_ucmd *gsmd_ucmd_fill(int len, u_int8_t msg_type,
-               u_int8_t msg_subtype, u_int16_t id)
+int gsmd_ucmd_submit(struct gsmd_user *gu, u_int8_t msg_type,
+               u_int8_t msg_subtype, u_int16_t id, int len, const void *data)
 {
-       struct gsmd_ucmd *ucmd;
+       struct gsmd_ucmd *ucmd = ucmd_alloc(len);
 
-       ucmd = ucmd_alloc(len);
        if (!ucmd)
-               return NULL;
+               return -ENOMEM;
 
        ucmd->hdr.version = GSMD_PROTO_VERSION;
        ucmd->hdr.msg_type = msg_type;
        ucmd->hdr.msg_subtype = msg_subtype;
        ucmd->hdr.len = len;
        ucmd->hdr.id = id;
+       memcpy(ucmd->buf, data, len);
 
-       return ucmd;
+       usock_cmd_enqueue(ucmd, gu);
+       return 0;
 }
 
 static int network_sigq_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_signal_quality *gsq;
-       struct gsmd_ucmd *ucmd;
+       struct gsmd_signal_quality gsq;
        char *comma;
-       
-       ucmd = gsmd_ucmd_fill(sizeof(*gsq), GSMD_MSG_NETWORK,
-                             GSMD_NETWORK_SIGQ_GET, 0);
-       if (!ucmd)
-               return -ENOMEM;
-       
-       gsq = (struct gsmd_signal_quality *) ucmd->buf;
-       gsq->rssi = atoi(resp + 6);
+
+       gsq.rssi = atoi(resp + 6);
        comma = strchr(resp, ',');
-       if (!comma) {
-               talloc_free(ucmd);
+       if (!comma ++)
                return -EIO;
-       }
-       gsq->ber = atoi(comma+1);
+       gsq.ber = atoi(comma);
 
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_NETWORK, GSMD_NETWORK_SIGQ_GET,
+                       cmd->id, sizeof(gsq), &gsq);
 }
 
 static int network_oper_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        const char *end, *opname;
-       int format, s;
+       int format, s, ret;
+       char *buf;
 
        /* Format: <mode>[,<format>,<oper>] */
        /* In case we're not registered, return an empty string.  */
@@ -470,17 +432,11 @@
                        return -EINVAL;
        }
 
-       ucmd = gsmd_ucmd_fill(end - opname + 1, GSMD_MSG_NETWORK,
-                       GSMD_NETWORK_OPER_GET, 0);
-       if (!ucmd)
-               return -ENOMEM;
-
-       memcpy(ucmd->buf, opname, end - opname);
-       ucmd->buf[end - opname] = '\0';
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       buf = strndup(opname, end - opname);
+       ret = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_OPER_GET,
+                       cmd->id, end - opname + 1, buf);
+       free(buf);
+       return ret;
 }
 
 static int network_opers_parse(const char *str, struct gsmd_msg_oper out[])
@@ -538,102 +494,77 @@
 static int network_opers_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-       int len;
+       struct gsmd_msg_oper *buf;
+       int len, ret;
 
        len = network_opers_parse(resp, 0);
-
-       ucmd = gsmd_ucmd_fill(sizeof(struct gsmd_msg_oper) * (len + 1),
-                       GSMD_MSG_NETWORK, GSMD_NETWORK_OPER_LIST, 0);
-       if (!ucmd)
+       buf = talloc_size(__gu_ctx, sizeof(struct gsmd_msg_oper) * (len + 1));
+       if (!buf)
                return -ENOMEM;
+       network_opers_parse(resp, buf);
 
-       network_opers_parse(resp, (struct gsmd_msg_oper *) ucmd->buf);
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       ret = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_OPER_LIST,
+                       cmd->id, sizeof(*buf) * (len + 1), buf);
+       talloc_free(buf);
+       return ret;
 }
 
 static int network_pref_opers_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = (struct gsmd_user *) ctx;
-       struct gsmd_ucmd *ucmd;
-       struct gsmd_msg_prefoper *entry;
+       struct gsmd_msg_prefoper entry;
        int index;
        char opname[17];
 
        if (cmd->ret && cmd->ret != -255)
-               return 0;
+               return 0;       /* TODO: Send a response */
 
        if (sscanf(resp, "+CPOL: %i,0,\"%16[^\"]\"", &index, opname) < 2)
-               return -EINVAL;
+               return -EINVAL; /* TODO: Send a response */
 
-       ucmd = gsmd_ucmd_fill(sizeof(*entry), GSMD_MSG_NETWORK,
-                       GSMD_NETWORK_PREF_LIST, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
+       entry.index = index;
+       entry.is_last = (cmd->ret == 0);
+       memcpy(entry.opname_longalpha, opname, sizeof(entry.opname_longalpha));
 
-       entry = (struct gsmd_msg_prefoper *) ucmd->buf;
-       entry->index = index;
-       entry->is_last = (cmd->ret == 0);
-       memcpy(entry->opname_longalpha, opname,
-                       sizeof(entry->opname_longalpha));
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_PREF_LIST,
+                       cmd->id, sizeof(entry), &entry);
 }
 
 static int network_pref_num_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = (struct gsmd_user *) ctx;
-       struct gsmd_ucmd *ucmd;
        int min_index, max_index, size;
 
        if (cmd->ret)
-               return 0;
+               return 0;       /* TODO: Send a response */
 
        /* This is not a full general case, theoretically the range string
         * can include commas and more dashes, but we have no full parser for
         * ranges yet.  */
        if (sscanf(resp, "+CPOL: (%i-%i)", &min_index, &max_index) < 2)
-               return -EINVAL;
-
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_NETWORK,
-                       GSMD_NETWORK_PREF_SPACE, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-
+               return -EINVAL; /* TODO: Send a response */
        size = max_index - min_index + 1;
-       memcpy(ucmd->buf, &size, sizeof(int));
 
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_PREF_SPACE,
+                       cmd->id, sizeof(size), &size);
 }
 
 static int network_ownnumbers_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = (struct gsmd_user *) ctx;
-       struct gsmd_ucmd *ucmd;
        struct gsmd_own_number *num;
        int len, ret, type;
        char dummy;
 
        if (cmd->ret && cmd->ret != -255)
-               return 0;
+               return 0;       /* TODO: Send a response */
 
        if (sscanf(resp, "+CNUM: \"%*[^\"]\"%c%n", &dummy, &len) > 0)
                len -= strlen("+CNUM: \"\",");
        else
                len = 0;
 
-       ucmd = gsmd_ucmd_fill(sizeof(*num) + len + 1,
-                       GSMD_MSG_NETWORK, GSMD_NETWORK_GET_NUMBER, cmd->id);
-       if (!ucmd)
-               return -ENOMEM;
-
-       num = (struct gsmd_own_number *) ucmd->buf;
+       num = talloc_size(__gu_ctx, sizeof(*num) + len + 1);
        if (len)
                ret = sscanf(resp, "+CNUM: \"%[^\"]\",\"%32[^\"]\",%i,%*i,%i,",
                                num->name, num->addr.number,
@@ -643,8 +574,8 @@
                                num->addr.number,
                                &type, &num->service);
        if (ret < 2) {
-               talloc_free(ucmd);
-               return -EINVAL;
+               talloc_free(num);
+               return -EINVAL; /* TODO: Send a response */
        }
        if (ret < 3)
                num->service = GSMD_SERVICE_UNKNOWN;
@@ -652,9 +583,10 @@
        num->addr.type = type;
        num->is_last = (cmd->ret == 0);
 
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       ret = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_GET_NUMBER,
+                       cmd->id, sizeof(*num) + len + 1, num);
+       talloc_free(num);
+       return ret;
 }
 
 static int usock_rcv_network(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
@@ -732,10 +664,9 @@
 static int phonebook_find_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        struct gsmd_phonebooks *gps;
        char *fcomma, *lcomma, *ptr1, *ptr2 = NULL;
-       int *num;
+       int num;
 
        DEBUGP("resp: %s\n", resp);
 
@@ -743,15 +674,7 @@
         * [+CPBF: <index1>,<number>,<type>,<text>[[...]
         * <CR><LF>+CPBF: <index2>,<unmber>,<type>,<text>]]
         */
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PHONEBOOK,
-                             GSMD_PHONEBOOK_FIND, 0);
-       if (!ucmd)
-               return -ENOMEM; 
-
-       num = (int*) ucmd->buf;
-
-       *num = 0;
-
+       num = 0;
        ptr1 = strtok(resp, "\n");
 
        while (ptr1) {
@@ -774,68 +697,55 @@
 
                llist_add_tail(&gps->list, &gu->pb_find_list);
 
-               (*num)++;
+               num++;
 
                ptr1 = strtok(NULL, "\n");
        }
 
-       usock_cmd_enqueue(ucmd, gu);
        talloc_free(__pb_ctx);
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_FIND,
+                       cmd->id, sizeof(num), &num);
 }
 
 static int phonebook_read_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_phonebook *gp;
-       struct gsmd_ucmd *ucmd;
+       struct gsmd_phonebook gp;
        char *fcomma, *lcomma;
        char *ptr;
 
        DEBUGP("resp: %s\n", resp);
 
-       ucmd = gsmd_ucmd_fill(sizeof(*gp), GSMD_MSG_PHONEBOOK,
-                             GSMD_PHONEBOOK_READ, 0);  
-
-       if (!ucmd)
-               return -ENOMEM;
-
-       gp = (struct gsmd_phonebook *) ucmd->buf;
-       
-       
        /* check the record is empty or not */
        if (!strncmp(resp, "+CPBR", 5)) {
                ptr = strchr(resp, ' ');
-               gp->index = atoi(ptr + 1);
+               gp.index = atoi(ptr + 1);
 
                fcomma = strchr(resp, '"');
                lcomma = strchr(fcomma + 1, '"');
-               strncpy(gp->numb, fcomma + 1, (lcomma - fcomma - 1));
-               gp->numb[(lcomma-fcomma) - 1] = '\0';
-               
-               gp->type = atoi(lcomma + 2);
+               strncpy(gp.numb, fcomma + 1, (lcomma - fcomma - 1));
+               gp.numb[(lcomma-fcomma) - 1] = '\0';
 
+               gp.type = atoi(lcomma + 2);
+
                ptr = strrchr(resp, ',');
                fcomma = ptr + 1;
                lcomma = strchr(fcomma + 1, '"');
-               strncpy(gp->text, fcomma + 1, (lcomma-fcomma - 1));
-               gp->text[(lcomma - fcomma) - 1] = '\0';
-       }
-       else
-               gp->index = 0;
+               strncpy(gp.text, fcomma + 1, (lcomma-fcomma - 1));
+               gp.text[(lcomma - fcomma) - 1] = '\0';
+       } else
+               gp.index = 0;
 
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_READ,
+                       cmd->id, sizeof(gp), &gp);
 }
 
 static int phonebook_readrg_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
        struct gsmd_phonebooks *gps;
        char *fcomma, *lcomma, *ptr1, *ptr2 = NULL;
-       int *num;
+       int num;
 
        DEBUGP("resp: %s\n", resp);
 
@@ -843,15 +753,7 @@
         * [+CPBR: <index1>,<number>,<type>,<text>[[...]
         * <CR><LF>+CPBR: <index2>,<unmber>,<type>,<text>]]
         */
-       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PHONEBOOK,
-                             GSMD_PHONEBOOK_READRG, 0);
-       if (!ucmd)
-               return -ENOMEM; 
-
-       num = (int*) ucmd->buf;
-
-       *num = 0;
-
+       num = 0;
        ptr1 = strtok(resp, "\n");
 
        while (ptr1) {
@@ -874,52 +776,30 @@
 
                llist_add_tail(&gps->list, &gu->pb_readrg_list);
 
-               (*num)++;
+               num++;
 
                ptr1 = strtok(NULL, "\n");
        }
 
-       usock_cmd_enqueue(ucmd, gu);
        talloc_free(__pb_ctx);
-       return 0;
+       return gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_READRG,
+                       cmd->id, sizeof(num), &num);
 }
 
 static int phonebook_write_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-
        DEBUGP("resp: %s\n", resp);
 
-       ucmd = gsmd_ucmd_fill(strlen(resp)+1, GSMD_MSG_PHONEBOOK,
-                             GSMD_PHONEBOOK_WRITE, 0);
-       if (!ucmd)
-               return -ENOMEM;
-
-       strcpy(ucmd->buf, resp);
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_WRITE,
+                       cmd->id, strlen(resp) + 1, resp);
 }
 
 static int phonebook_delete_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-
        DEBUGP("resp: %s\n", resp);
 
-       ucmd = gsmd_ucmd_fill(strlen(resp)+1, GSMD_MSG_PHONEBOOK,
-                             GSMD_PHONEBOOK_DELETE, 0);
-       if (!ucmd)
-               return -ENOMEM; 
-
-       strcpy(ucmd->buf, resp);
-
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(ctx, GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_DELETE,
+                       cmd->id, strlen(resp) + 1, resp);
 }
 
 static int phonebook_get_support_cb(struct gsmd_atcmd *cmd, void *ctx, char 
*resp)
@@ -927,43 +807,30 @@
        /* TODO: Need to handle command error */
        /* +CPBR: (1-100),44,16 */
        struct gsmd_user *gu = ctx;
-       struct gsmd_phonebook_support *gps;
-       struct gsmd_ucmd *ucmd;
+       struct gsmd_phonebook_support gps;
        char *fcomma, *lcomma;
        char *dash;
 
        DEBUGP("resp: %s\n", resp);
-       
-       ucmd = gsmd_ucmd_fill(sizeof(*gps), GSMD_MSG_PHONEBOOK,
-                             GSMD_PHONEBOOK_GET_SUPPORT, 0);
-       if (!ucmd)
-               return -ENOMEM;
 
-       gps = (struct gsmd_phonebook_support *) ucmd->buf;
-               
        dash = strchr(resp, '-');
-       if (!dash) {
-               talloc_free(ucmd);
-               return -EIO;
-       }       
-       gps->index = atoi(dash + 1);
+       if (!dash)
+               return -EIO;    /* TODO: Send a response */
+       gps.index = atoi(dash + 1);
 
        fcomma = strchr(resp, ',');
-       if (!fcomma) {
-               talloc_free(ucmd);
-               return -EIO;
-       }
-       gps->nlength = atoi(fcomma+1);
-       
+       if (!fcomma)
+               return -EIO;    /* TODO: Send a response */
+       gps.nlength = atoi(fcomma+1);
+
        lcomma = strrchr(resp, ',');
-       if (!lcomma) {
-               talloc_free(ucmd);
-               return -EIO;
-       }       
-       gps->tlength = atoi(lcomma+1);  
+       if (!lcomma)
+               return -EIO;    /* TODO: Send a response */
+       gps.tlength = atoi(lcomma+1);
 
-       usock_cmd_enqueue(ucmd, gu);
-       return 0;
+       return gsmd_ucmd_submit(gu,
+                       GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_GET_SUPPORT,
+                       cmd->id, sizeof(gps), &gps);
 }
 
 static int phonebook_list_storage_cb(struct gsmd_atcmd *cmd,
@@ -971,8 +838,7 @@
 {
        /* TODO; using link list ; need to handle command error */
        struct gsmd_user *gu = ctx;
-       struct gsmd_ucmd *ucmd;
-       struct gsmd_phonebook_storage *gps;
+       struct gsmd_phonebook_storage gps;
        char *ptr;
 
        DEBUGP("resp: %s\n", resp);
@@ -980,31 +846,22 @@
        /*
         * +CPBS: (<storage>s)
         */
+       gps.num = 0;
 
-       ucmd = gsmd_ucmd_fill(sizeof(*gps),
-                       GSMD_MSG_PHONEBOOK,
-                       GSMD_PHONEBOOK_LIST_STORAGE, 0);
-
-        if (!ucmd)
-               return -ENOMEM;
-
-       gps = (struct gsmd_phonebook_storage *) ucmd->buf;
-       gps->num = 0;
-
        if (!strncmp(resp, "+CPBS", 5)) {
                char* delim = "(,";
                ptr = strpbrk(resp, delim);
-               while ( ptr ) {
-                       strncpy(gps->mem[gps->num].type, ptr+2, 2);
-                       gps->mem[gps->num].type[2] = '\0';
-                       ptr = strpbrk(ptr+2, delim);
-                       gps->num++;
+               while (ptr) {
+                       strncpy(gps.mem[gps.num].type, ptr + 2, 2);
+                       gps.mem[gps.num].type[2] = '\0';
+                       ptr = strpbrk(ptr + 2, delim);
+                       gps.num++;
                }
        }
 
-       usock_cmd_enqueue(ucmd, gu);
-
-       return 0;
+       return gsmd_ucmd_submit(gu,
+                       GSMD_MSG_PHONEBOOK, GSMD_PHONEBOOK_LIST_STORAGE,
+                       cmd->id, sizeof(gps), &gps);
 }
 
 
@@ -1012,13 +869,12 @@
                struct gsmd_msg_hdr *gph,int len)
 {      
        struct gsmd_atcmd *cmd = NULL;
-       struct gsmd_ucmd *ucmd = NULL;
        struct gsmd_phonebook_readrg *gpr;
        struct gsmd_phonebook *gp;
        struct gsmd_phonebook_find *gpf;
        struct gsmd_phonebooks *cur, *cur2;
        int *index, *num;
-       int atcmd_len, i;
+       int atcmd_len, i, ret;
        char *storage;
        char buf[1024];
 
@@ -1127,17 +983,8 @@
                        return -EINVAL;
 
                num = (int *) ((void *)gph + sizeof(*gph));
-
-               ucmd = gsmd_ucmd_fill(sizeof(struct gsmd_phonebook)*(*num),
-                               GSMD_MSG_PHONEBOOK,
-                               GSMD_PHONEBOOK_RETRIEVE_READRG, 0);
-               if (!ucmd)
-                       return -ENOMEM;
-
-               gp = (struct gsmd_phonebook*) ucmd->buf;
-
-               if (!llist_empty(&gu->pb_readrg_list)) {
-
+               gp = talloc_size(__pb_ctx, sizeof(*gp) * (*num));
+               if (!llist_empty(&gu->pb_readrg_list))
                        llist_for_each_entry_safe(cur, cur2,
                                        &gu->pb_readrg_list, list) {
                                gp->index = cur->pb.index;
@@ -1149,26 +996,21 @@
                                llist_del(&cur->list);
                                free(cur);
                        }
-               }
 
-               usock_cmd_enqueue(ucmd, gu);
-
-               break;
+               ret = gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK,
+                               GSMD_PHONEBOOK_RETRIEVE_READRG, gph->id,
+                               sizeof(*gp) * (*num), gp);
+               talloc_free(gp);
+               return ret;
        case GSMD_PHONEBOOK_RETRIEVE_FIND:
                if (len < sizeof(*gph) + sizeof(int))
                        return -EINVAL;
 
                num = (int *) ((void *)gph + sizeof(*gph));
-
-               ucmd = gsmd_ucmd_fill(sizeof(struct gsmd_phonebook)*(*num), 
GSMD_MSG_PHONEBOOK,
-                                     GSMD_PHONEBOOK_RETRIEVE_FIND, 0);
-               if (!ucmd)
-                       return -ENOMEM;
-
-               gp = (struct gsmd_phonebook*) ucmd->buf;
-
-               if (!llist_empty(&gu->pb_find_list)) {
-                       llist_for_each_entry_safe(cur, cur2, &gu->pb_find_list, 
list) {
+               gp = talloc_size(__pb_ctx, sizeof(*gp) * (*num));
+               if (!llist_empty(&gu->pb_find_list))
+                       llist_for_each_entry_safe(cur, cur2,
+                                       &gu->pb_find_list, list) {
                                gp->index = cur->pb.index;
                                strcpy(gp->numb, cur->pb.numb);
                                gp->type = cur->pb.type;
@@ -1178,12 +1020,12 @@
                                llist_del(&cur->list);
                                free(cur);
                        }
-               }
 
-               usock_cmd_enqueue(ucmd, gu);
-               break;
-        
-
+               ret = gsmd_ucmd_submit(gu, GSMD_MSG_PHONEBOOK,
+                               GSMD_PHONEBOOK_RETRIEVE_FIND, gph->id,
+                               sizeof(*gp) * (*num), gp);
+               talloc_free(gp);
+               return ret;
        default:
                return -EINVAL;
        }       

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd.c  2007-12-01 01:55:39 UTC (rev 
3545)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd.c  2007-12-01 01:57:09 UTC (rev 
3546)
@@ -133,7 +133,7 @@
 }
 
 /* blocking read and processing of packets until packet matching 'id' is found 
*/
-int lgsm_blocking_wait_packet(struct lgsm_handle *lh, u_int16_t id, 
+int lgsm_blocking_wait_packet(struct lgsm_handle *lh, u_int16_t id,
                              struct gsmd_msg_hdr *gmh, int rlen)
 {
        int rc;

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_event.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_event.c    2007-12-01 01:55:39 UTC 
(rev 3545)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_event.c    2007-12-01 01:57:09 UTC 
(rev 3546)
@@ -52,9 +52,10 @@
 }
 
 
-static int evt_demux_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr 
*gmh)
+static int evt_demux_msghandler(struct lgsm_handle *lh,
+               struct gsmd_msg_hdr *gmh)
 {
-       struct gsmd_evt_auxdata *aux = gmh->data;
+       struct gsmd_evt_auxdata *aux = (struct gsmd_evt_auxdata *) gmh->data;
 
        if (gmh->len < sizeof(*aux))
                return -EIO;

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_passthrough.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_passthrough.c      2007-12-01 
01:55:39 UTC (rev 3545)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_passthrough.c      2007-12-01 
01:57:09 UTC (rev 3546)
@@ -59,7 +59,8 @@
        return gmh->id;
 }
 
-int lgsm_passthrough(struct lgsm_handle *lh, const char *tx, char *rx, 
unsigned int *rx_len)
+int lgsm_passthrough(struct lgsm_handle *lh, const char *tx,
+               char *rx, unsigned int *rx_len)
 {
        struct gsmd_msg_hdr *rgmh = (struct gsmd_msg_hdr *)passthrough_rbuf;
        char *rx_buf = (char *)rgmh + sizeof(*rgmh);
@@ -72,8 +73,7 @@
        /* since we synchronously want to wait for a response, we need to
         * _internally_ loop over incoming packets and call the callbacks for
         * intermediate messages (if applicable) */
-       rc = lgsm_blocking_wait_packet(lh, rc, passthrough_rbuf, 
-                                       sizeof(passthrough_rbuf));
+       rc = lgsm_blocking_wait_packet(lh, rc, rgmh, sizeof(passthrough_rbuf));
        if (rc <= 0)
                return rc;
 
@@ -82,10 +82,11 @@
 
        if (rc < sizeof(*rgmh) + rgmh->len)
                return -EINVAL;
-       
-       /* FIXME: make sure rx_buf is zero-terminated */
-       strcpy(rx, rx_buf);
-       *rx_len = rgmh->len;
 
-       return rx_len;
+       rx[*--rx_len] = 0;
+       if (rgmh->len < *rx_len)
+               *rx_len = rgmh->len;
+       memcpy(rx, rx_buf, *rx_len);
+
+       return *rx_len;
 }

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c      2007-12-01 01:55:39 UTC 
(rev 3545)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c      2007-12-01 01:57:09 UTC 
(rev 3546)
@@ -75,7 +75,7 @@
                return -ENOMEM;
 
        gm->gp.type = type;
-       strcpy(gm->gp.pin, pin);
+       strncpy(gm->gp.pin, pin, sizeof(gm->gp.pin));
 
        switch (type) {
        case GSMD_PIN_SIM_PUK:
@@ -87,7 +87,7 @@
                        free(gm);
                        return -EINVAL;
                }
-               strcpy(gm->gp.newpin, newpin);
+               strncpy(gm->gp.newpin, newpin, sizeof(gm->gp.newpin));
                break;
        default:
                break;

Modified: trunk/src/target/gsm/src/util/atcmd.c
===================================================================
--- trunk/src/target/gsm/src/util/atcmd.c       2007-12-01 01:55:39 UTC (rev 
3545)
+++ trunk/src/target/gsm/src/util/atcmd.c       2007-12-01 01:57:09 UTC (rev 
3546)
@@ -92,6 +92,7 @@
 
                        /* this is a synchronous call for a passthrough
                         * command */
+                       rlen = STDIN_BUF_SIZE + 1;
                        lgsm_passthrough(lgsmh, buf, rbuf, &rlen);
                        printf("RSTR=`%s'\n", rbuf);
 




--- End Message ---
_______________________________________________
commitlog mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to