FreeCalypso > hg > freecalypso-tools
diff uptools/atcmd/smsend_basic.c @ 362:89fe66cb60f6
fcup-smsend program put together, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 05 Mar 2018 01:47:18 +0000 |
parents | |
children | ac311a48630e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uptools/atcmd/smsend_basic.c Mon Mar 05 01:47:18 2018 +0000 @@ -0,0 +1,131 @@ +/* + * This is the main module for the basic fcup-smsend utility. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <unistd.h> +#include "../../rvinterf/include/exitcodes.h" + +int sms_write_mode, text_mode, utf8_input; +u_char dest_addr[12]; +char msgtext[322]; +u_char msgtext_gsm7[160]; +unsigned msgtext_gsmlen; + +process_cmdline(argc, argv) + char **argv; +{ + int c; + extern int optind; + + while ((c = getopt(argc, argv, "B:np:RtuwWX:")) != EOF) { + if (atinterf_cmdline_opt(c)) + continue; + switch (c) { + case 't': + text_mode = 1; + continue; + case 'u': + utf8_input = 1; + continue; + case 'w': + sms_write_mode = 1; + continue; + case 'W': + sms_write_mode = 2; + continue; + default: + /* error msg already printed */ + exit(ERROR_USAGE); + } + } + if (argc > optind + 2) { + fprintf(stderr, "usage: %s [options] dest-addr [message]\n", + argv[0]); + exit(ERROR_USAGE); + } + if (!argv[optind] || !argv[optind][0]) { + if (sms_write_mode == 2) { + dest_addr[0] = 0; + dest_addr[1] = 0x80; + } else { + fprintf(stderr, + "error: destination address must be specified\n"); + exit(ERROR_USAGE); + } + } else if (parse_and_encode_dest_addr(argv[optind], dest_addr) < 0) { + fprintf(stderr, + "error: destination address argument is invalid\n"); + exit(ERROR_USAGE); + } + if (!argv[optind+1]) + return(0); + if (strlen(argv[optind+1]) > 320) { + fprintf(stderr, "error: message argument is too long\n"); + exit(ERROR_USAGE); + } + strcpy(msgtext, argv[optind+1]); + return(1); +} + +read_msgtext_from_stdin() +{ + char *nl; + + if (!fgets(msgtext, sizeof msgtext, stdin)) { + fprintf(stderr, "error reading message from stdin\n"); + exit(ERROR_USAGE); + } + nl = index(msgtext, '\n'); + if (!nl) { + fprintf(stderr, + "error: message on stdin is too long or unterminated\n"); + exit(ERROR_USAGE); + } + *nl = '\0'; +} + +main(argc, argv) + char **argv; +{ + int rc; + + if (!process_cmdline(argc, argv)) + read_msgtext_from_stdin(); + if (utf8_input && utf8_to_latin1(msgtext) < 0) { + fprintf(stderr, "error: invalid UTF-8 message\n"); + exit(ERROR_USAGE); + } + if (text_mode) { + if (strlen(msgtext) > 160) { +toolong: fprintf(stderr, "error: message exceeds 160 chars\n"); + exit(ERROR_USAGE); + } + } else { + rc = latin1_to_gsm7(msgtext, msgtext_gsm7, 160, + &msgtext_gsmlen); + if (rc == -1) { + fprintf(stderr, + "error: message not valid for GSM7 charset\n"); + exit(ERROR_USAGE); + } + if (rc == -2) + goto toolong; + } + /* get to work */ + atinterf_init(); + if (text_mode) { + prep_for_text_mode(); + send_in_text_mode(dest_addr, msgtext); + } else { + prep_for_pdu_mode(); + send_in_pdu_mode(dest_addr, msgtext_gsm7, msgtext_gsmlen, 0, 0); + } + if (sms_write_mode == 1) + sendafterwr_process(); + exit(0); +}