atd

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/atd
Log | Files | Refs

commit 1b608a4b7082f4560ada5a4adcb78a6143a16ba2
parent bc10541f884d3430ba4c05f9e833ea7a32a79ed8
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Wed,  4 Aug 2021 14:56:42 -0500

pdu: working message encoding for GSM

Diffstat:
Mpdu.c | 68+++++++++++++++++++++++++++++++++++++++++++-------------------------
Mpdu.h | 3+--
2 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/pdu.c b/pdu.c @@ -487,10 +487,15 @@ pdu_encode_semioctet(unsigned char *dest, const char *str) while (*str) { char digit = *str - '0'; - if (lower) - dest[len] = 0xf0 | digit; - else - dest[len++] &= (digit << 4) | 0xf; + if (dest) { + if (lower) { + dest[len] = 0xf0 | digit; + } else { + dest[len++] &= (digit << 4) | 0xf; + } + } else { + len += !lower; + } lower = !lower; str++; @@ -507,7 +512,9 @@ pdu_encode_number(unsigned char *dest, const char *str, bool smsc) int len = 0; int i; - dest[len++] = 0; + if (dest) + dest[len] = 0; + len++; if (*str == '+') { str++; format = 0x91; @@ -526,16 +533,20 @@ pdu_encode_number(unsigned char *dest, const char *str, bool smsc) if (ascii) format |= 0x40; - dest[len++] = format; + if (dest) + dest[len] = format; + len++; if (!ascii) - len += pdu_encode_semioctet(&dest[len], str); + len += pdu_encode_semioctet(dest ? &dest[len] : NULL, str); else - len += pdu_encode_7bit_str(&dest[len], str); + len += pdu_encode_7bit_str(dest ? &dest[len] : NULL, str); - if (smsc) - dest[0] = len - 1; - else - dest[0] = strlen(str); + if (dest) { + if (smsc) + dest[0] = len - 1; + else + dest[0] = strlen(str); + } return len; } @@ -543,31 +554,38 @@ pdu_encode_number(unsigned char *dest, const char *str, bool smsc) int encode_pdu(char *dest, char *number, char *message) { + int len = 0; + char *ptr = dest; // may want to set bit 6 for multi-part message - *ptr = 1; - ptr++; + if (dest) + dest[len] = 1; + len++; // message reference - *ptr = 0; - ptr++; + if (dest) + dest[len] = 0; + len++; - ptr += pdu_encode_number(ptr, number, 0); + len += pdu_encode_number(dest ? &dest[len] : NULL, number, 0); // PID - *ptr = 0; - ptr++; + if (dest) + dest[len] = 0; + len++; // DCS - needs to be determined from message - XXX don't assume GSM - *ptr = 0; - ptr++; + if (dest) + dest[len] = 0; + len++; // UDL - user data length - for now we just assume it is the number of octets in the message - *ptr = strlen(message); - ptr++; + if (dest) + dest[len] = strlen(message); + len++; // User Data - ptr += pdu_encode_7bit_str(ptr, message); + len += pdu_encode_7bit_str(dest ? &dest[len] : NULL, message); - return ptr - dest; + return len; } diff --git a/pdu.h b/pdu.h @@ -55,6 +55,5 @@ struct pdu_msg { } d; }; -int decode_gsm(char *dest, char *src, size_t len); -int encode_gsm(char *dest, char *src, size_t len); +int encode_pdu(char *dest, char *number, char *message); int decode_pdu(struct pdu_msg *pdu_msg, char *raw);