diff options
Diffstat (limited to 'samsung-ipc/sms.c')
-rw-r--r-- | samsung-ipc/sms.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/samsung-ipc/sms.c b/samsung-ipc/sms.c index 047754e..bb9e026 100644 --- a/samsung-ipc/sms.c +++ b/samsung-ipc/sms.c @@ -2,6 +2,7 @@ * This file is part of libsamsung-ipc. * * Copyright (C) 2011 Simon Busch <morphis@gravedo.de> + * Copyright (C) 2014 Paul Kocialkowski <contact@paulk.fr> * * libsamsung-ipc is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,26 +23,37 @@ #include <samsung-ipc.h> -unsigned char *ipc_sms_send_msg_pack(struct ipc_sms_send_msg_request_header *msg, char *smsc, - unsigned char *pdu, int pdu_length) +void *ipc_sms_send_msg_setup(struct ipc_sms_send_msg_request_header *header, + const char *smsc, const char *pdu) { - unsigned char *data = NULL, *p = NULL; - unsigned int data_length = 0, smsc_len = 0; + void *data; + size_t size; + unsigned char smsc_length; + unsigned char *p; - if (msg == NULL || smsc == NULL || pdu == NULL) + if (header == NULL || smsc == NULL || pdu == NULL) return NULL; - smsc_len = strlen(smsc); - data_length = smsc_len + pdu_length + sizeof(struct ipc_sms_send_msg_request_header); - data = (unsigned char *) malloc(sizeof(unsigned char) * data_length); - memset(data, 0, data_length); + smsc_length = (unsigned char) strlen(smsc); - p = data; - memcpy(p, msg, sizeof(struct ipc_sms_send_msg_request_header)); + size = sizeof(struct ipc_sms_send_msg_request_header) + sizeof(smsc_length) + strlen(smsc) + strlen(pdu); + header->length = (unsigned char) size; + + data = calloc(1, size); + + p = (unsigned char *) data; + + memcpy(p, header, sizeof(struct ipc_sms_send_msg_request_header)); p += sizeof(struct ipc_sms_send_msg_request_header); - memcpy(p, (char *) (smsc + 1), smsc_len); - p += smsc_len; - memcpy(p, pdu, pdu_length); + + memcpy(p, &smsc_length, sizeof(smsc_length)); + p += sizeof(smsc_length); + + memcpy(p, smsc, smsc_length); + p += smsc_length; + + memcpy(p, pdu, strlen(pdu)); + p += strlen(pdu); return data; } |