diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libgsmd/libgsmd.c | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/src/libgsmd/libgsmd.c b/src/libgsmd/libgsmd.c index 37a50e6..9906ea8 100644 --- a/src/libgsmd/libgsmd.c +++ b/src/libgsmd/libgsmd.c @@ -88,26 +88,32 @@ static int lgsm_open_backend(struct lgsm_handle *lh, const char *device) /* handle a packet that was received on the gsmd socket */ int lgsm_handle_packet(struct lgsm_handle *lh, char *buf, int len) { - struct gsmd_msg_hdr *gmh = (struct gsmd_msg_hdr *)buf; + struct gsmd_msg_hdr *gmh; lgsm_msg_handler *handler; - - if (len < sizeof(*gmh)) - return -EINVAL; - - if (len - sizeof(*gmh) < gmh->len) - return -EINVAL; - - if (gmh->msg_type >= __NUM_GSMD_MSGS) - return -EINVAL; - - handler = lh->handler[gmh->msg_type]; - - if (handler) - return handler(lh, gmh); - else { - fprintf(stderr, "unable to handle packet type=%u\n", gmh->msg_type); - return 0; + int rc = 0; + + while (len) { + if (len < sizeof(*gmh)) + return -EINVAL; + gmh = (struct gsmd_msg_hdr *) buf; + + if (len - sizeof(*gmh) < gmh->len) + return -EINVAL; + len -= sizeof(*gmh) + gmh->len; + buf += sizeof(*gmh) + gmh->len; + + if (gmh->msg_type >= __NUM_GSMD_MSGS) + return -EINVAL; + + handler = lh->handler[gmh->msg_type]; + + if (handler) + rc |= handler(lh, gmh); + else + fprintf(stderr, "unable to handle packet type=%u\n", + gmh->msg_type); } + return rc; } int lgsm_register_handler(struct lgsm_handle *lh, int type, lgsm_msg_handler *handler) |