# HG changeset patch # User Mychaela Falconia # Date 1693118603 0 # Node ID 5854e48d0ef785a7f5ea6f65db82bb73f88a16c7 # Parent b014abaf0898d92ff6323cf14552391a745e1d41 sms-gen-tpdu: add support for alphanumeric user-addr diff -r b014abaf0898 -r 5854e48d0ef7 gen-pdu/settings.c --- a/gen-pdu/settings.c Sun Aug 27 05:13:04 2023 +0000 +++ b/gen-pdu/settings.c Sun Aug 27 06:43:23 2023 +0000 @@ -32,7 +32,7 @@ } rc = encode_phone_number_arg(argv[1], sc_addr, 0); if (rc < 0) { - fprintf(stderr, ERR_PREFIX "invalid phone number argument\n", + fprintf(stderr, ERR_PREFIX "invalid SC-address argument\n", input_lineno); exit(1); } @@ -43,11 +43,18 @@ char **argv; { int rc; + char *err_desc; - rc = encode_phone_number_arg(argv[1], user_addr, 1); + if (!strncmp(argv[1], "alpha:", 6)) { + rc = encode_alpha_addr(argv[1] + 6, user_addr); + err_desc = "alpha address"; + } else { + rc = encode_phone_number_arg(argv[1], user_addr, 1); + err_desc = "phone number"; + } if (rc < 0) { - fprintf(stderr, ERR_PREFIX "invalid phone number argument\n", - input_lineno); + fprintf(stderr, ERR_PREFIX "invalid %s argument\n", + input_lineno, err_desc); exit(1); } } diff -r b014abaf0898 -r 5854e48d0ef7 libcoding/Makefile --- a/libcoding/Makefile Sun Aug 27 05:13:04 2023 +0000 +++ b/libcoding/Makefile Sun Aug 27 06:43:23 2023 +0000 @@ -1,8 +1,8 @@ CC= gcc CFLAGS= -O2 -OBJS= check_high_bit.o gsm7_encode.o gsm7_encode_table.o gsm7_pack.o \ - hexdigits.o hexout.o number_encode.o timestamp.o ucs2_bigend.o \ - utf8_decode.o utf8_decode2.o +OBJS= alpha_addr.o check_high_bit.o gsm7_encode.o gsm7_encode2.o \ + gsm7_encode_table.o gsm7_pack.o hexdigits.o hexout.o number_encode.o \ + timestamp.o ucs2_bigend.o utf8_decode.o utf8_decode2.o LIB= libcoding.a all: ${LIB} diff -r b014abaf0898 -r 5854e48d0ef7 libcoding/alpha_addr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcoding/alpha_addr.c Sun Aug 27 06:43:23 2023 +0000 @@ -0,0 +1,24 @@ +/* + * This library module implements encoding of alphanumeric From addresses + * that are allowed in SMS-DELIVER TPDUs. + */ + +#include + +u_char alpha_septets_to_digits[12] = {0, 2, 4, 6, 7, 9, 11, 13, 14, 16, 18, 20}; + +encode_alpha_addr(arg, bin) + char *arg; + u_char *bin; +{ + u_char gsm7[11]; + int rc; + + rc = qstring_arg_to_gsm7(arg, gsm7, 11); + if (rc < 0) + return(rc); + bin[0] = alpha_septets_to_digits[rc]; + bin[1] = 0x50; + gsm7_pack(gsm7, bin + 2, (bin[0] + 1) >> 1); + return(0); +} diff -r b014abaf0898 -r 5854e48d0ef7 libcoding/gsm7_encode2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcoding/gsm7_encode2.c Sun Aug 27 06:43:23 2023 +0000 @@ -0,0 +1,68 @@ +/* + * This module implements functions for parsing quoted string + * arguments intended for GSM7 string encoding, and actually + * encoding them into GSM7 binary strings. + */ + +#include +#include +#include + +extern u_char gsm7_encode_table[256]; + +qstring_arg_to_gsm7(arg, record, maxlen) + char *arg; + u_char *record; + unsigned maxlen; +{ + unsigned acclen, nadd; + char *cp; + int c; + + cp = arg; + for (acclen = 0; *cp; ) { + c = *cp++; + if (c == '\\') { + if (*cp == '\0') + return(-1); + c = *cp++; + if (c >= '0' && c <= '7' && isxdigit(*cp)) { + c = ((c - '0') << 4) | decode_hex_digit(*cp++); + goto bypass_encoding; + } + switch (c) { + case 'n': + c = '\n'; + goto bypass_encoding; + case 'r': + c = '\r'; + goto bypass_encoding; + case 'e': + c = 0x1B; + goto bypass_encoding; + case 'E': /* Euro currency symbol */ + c = 0xE5; + goto bypass_encoding; + case '"': + case '\\': + break; + default: + return(-1); + } + } + c = gsm7_encode_table[c]; + if (c == 0xFF) + return(-1); +bypass_encoding: + if (c & 0x80) + nadd = 2; + else + nadd = 1; + if (acclen + nadd > maxlen) + return(-1); + if (c & 0x80) + record[acclen++] = 0x1B; + record[acclen++] = c & 0x7F; + } + return(acclen); +}