# HG changeset patch # User Mychaela Falconia # Date 1693583092 0 # Node ID ec7e23d5151f314eb6dfb714c34b750badd32d7f # Parent 2969032bdfac0b434e0c81bf344b8506ece6069b fcup-smsend: add support for backslash escapes, new -e option diff -r 2969032bdfac -r ec7e23d5151f uptools/atcmd/smsend_main.c --- a/uptools/atcmd/smsend_main.c Fri Sep 01 07:33:51 2023 +0000 +++ b/uptools/atcmd/smsend_main.c Fri Sep 01 15:44:52 2023 +0000 @@ -13,10 +13,10 @@ #define MAX_MSG_CHARS (153*255) #define MAX_MSG_UNI (67*255) -int sms_write_mode, text_mode, utf8_input, ucs2_mode; +int sms_write_mode, text_mode, utf8_input, ucs2_mode, allow_escape; int concat_enable, concat_refno_set, concat_quiet; u_char dest_addr[12]; -char msgtext[MAX_MSG_CHARS*2+2]; +char msgtext[MAX_MSG_CHARS*3+2]; u_char concat_refno; process_cmdline(argc, argv) @@ -26,7 +26,7 @@ extern int optind; extern char *optarg; - while ((c = getopt(argc, argv, "B:cC:np:qRtuUwWX:")) != EOF) { + while ((c = getopt(argc, argv, "B:cC:enp:qRtuUwWX:")) != EOF) { if (atinterf_cmdline_opt(c)) continue; switch (c) { @@ -38,6 +38,9 @@ concat_refno = strtoul(optarg, 0, 0); concat_refno_set = 1; continue; + case 'e': + allow_escape = 1; + continue; case 'q': concat_quiet = 1; continue; @@ -73,6 +76,17 @@ argv[0]); exit(ERROR_USAGE); } + if (allow_escape && text_mode) { + fprintf(stderr, + "%s error: escapes not supported in text mode\n", + argv[0]); + exit(ERROR_USAGE); + } + if (ucs2_mode && allow_escape) { + fprintf(stderr, "%s error: UCS-2 escapes not supported yet\n", + argv[0]); + exit(ERROR_USAGE); + } if (argc > optind + 2) { fprintf(stderr, "usage: %s [options] dest-addr [message]\n", argv[0]); @@ -94,7 +108,7 @@ } if (argc < optind + 2) return(0); - if (strlen(argv[optind+1]) > MAX_MSG_CHARS*2) { + if (strlen(argv[optind+1]) > MAX_MSG_CHARS*3) { fprintf(stderr, "error: message argument is too long\n"); exit(ERROR_USAGE); } @@ -176,7 +190,7 @@ exit(0); } rc = latin1_to_gsm7(msgtext, msgtext_gsm7, MAX_MSG_CHARS, - &msgtext_gsmlen); + &msgtext_gsmlen, allow_escape); if (rc == -1) { fprintf(stderr, "error: message not valid for GSM7 charset\n"); exit(ERROR_USAGE); @@ -185,6 +199,11 @@ fprintf(stderr, "error: message too long for max concat SMS\n"); exit(ERROR_USAGE); } + if (rc == -3) { + fprintf(stderr, + "error: message contains invalid backslash escape\n"); + exit(ERROR_USAGE); + } if (msgtext_gsmlen <= 160) { common_init(); prep_for_pdu_mode(); diff -r 2969032bdfac -r ec7e23d5151f uptools/atcmd/smsend_multmain.c --- a/uptools/atcmd/smsend_multmain.c Fri Sep 01 07:33:51 2023 +0000 +++ b/uptools/atcmd/smsend_multmain.c Fri Sep 01 15:44:52 2023 +0000 @@ -141,7 +141,7 @@ send_in_text_mode(dest_addr, msgtext); return(0); } - rc = latin1_to_gsm7(msgtext, msgtext_gsm7, 160, &msgtext_gsmlen); + rc = latin1_to_gsm7(msgtext, msgtext_gsm7, 160, &msgtext_gsmlen, 0); if (rc == -1) { fprintf(stderr, "input line %d: message not valid for GSM7 charset\n", diff -r 2969032bdfac -r ec7e23d5151f uptools/libcoding/Makefile --- a/uptools/libcoding/Makefile Fri Sep 01 07:33:51 2023 +0000 +++ b/uptools/libcoding/Makefile Fri Sep 01 15:44:52 2023 +0000 @@ -3,9 +3,9 @@ OBJS= alpha_addr.o decode_helpers.o grokdcs.o gsm7_decode.o \ gsm7_decode_qstring.o gsm7_decode_tables.o gsm7_encode.o \ gsm7_encode_table.o gsm7_pack.o gsm7_unpack.o gsmtime.o hexdecode.o \ - hexdump.o hexencode.o number_decode.o number_encode.o scaddr.o \ - sms_submit.o sms_submit8.o ucs2_bigend.o ucs2_decode.o utf8_decode.o \ - utf8_decode2.o + hexdecode2.o hexdump.o hexencode.o number_decode.o number_encode.o \ + scaddr.o sms_submit.o sms_submit8.o ucs2_bigend.o ucs2_decode.o \ + utf8_decode.o utf8_decode2.o LIB= libcoding.a all: ${LIB} diff -r 2969032bdfac -r ec7e23d5151f uptools/libcoding/gsm7_encode.c --- a/uptools/libcoding/gsm7_encode.c Fri Sep 01 07:33:51 2023 +0000 +++ b/uptools/libcoding/gsm7_encode.c Fri Sep 01 15:44:52 2023 +0000 @@ -4,10 +4,40 @@ */ #include +#include extern u_char gsm7_encode_table[256]; -latin1_to_gsm7(inbuf, outbuf, outmax, outlenp) +static unsigned +handle_escape(ipp) + u_char **ipp; +{ + unsigned c; + + c = *(*ipp)++; + if (c >= '0' && c <= '7' && isxdigit(**ipp)) { + c = ((c - '0') << 4) | decode_hex_digit(*(*ipp)++); + return c; + } + switch (c) { + case 'n': + return '\n'; + case 'r': + return '\r'; + case 'e': + return 0x1B; + case 'E': /* Euro currency symbol */ + return 0xE5; + case '"': + case '\\': + c = gsm7_encode_table[c]; + return c; + default: + return 0xFF; + } +} + +latin1_to_gsm7(inbuf, outbuf, outmax, outlenp, allow_escape) u_char *inbuf, *outbuf; unsigned outmax, *outlenp; { @@ -15,9 +45,15 @@ unsigned outcnt = 0, c, n; while (c = *ip++) { - c = gsm7_encode_table[c]; - if (c == 0xFF) - return(-1); + if (c == '\\' && allow_escape) { + c = handle_escape(&ip); + if (c == 0xFF) + return(-3); + } else { + c = gsm7_encode_table[c]; + if (c == 0xFF) + return(-1); + } if (c & 0x80) n = 2; else diff -r 2969032bdfac -r ec7e23d5151f uptools/libcoding/hexdecode2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uptools/libcoding/hexdecode2.c Fri Sep 01 15:44:52 2023 +0000 @@ -0,0 +1,14 @@ +/* + * This module is a subset of hexdigits.c from fc-sim-tools/libutil. + */ + +decode_hex_digit(c) +{ + if (c >= '0' && c <= '9') + return(c - '0'); + if (c >= 'A' && c <= 'F') + return(c - 'A' + 10); + if (c >= 'a' && c <= 'f') + return(c - 'a' + 10); + return(-1); +}