FreeCalypso > hg > freecalypso-tools
diff uptools/atcmd/smsend_pduin.c @ 384:3eb92855f7b9
fcup-smsendpdu program written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 09 Mar 2018 03:29:40 +0000 |
parents | |
children | dc2fd8e6f42c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uptools/atcmd/smsend_pduin.c Fri Mar 09 03:29:40 2018 +0000 @@ -0,0 +1,116 @@ +/* + * This is the main module for the fcup-smsendpdu utility. + */ + +#include <sys/types.h> +#include <ctype.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; +char input_line[176*2+2]; +int lineno; +int initdone, cmms_done; + +process_cmdline(argc, argv) + char **argv; +{ + int c; + extern int optind; + + while ((c = getopt(argc, argv, "B:np:RwWX:")) != EOF) { + if (atinterf_cmdline_opt(c)) + continue; + switch (c) { + 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) { + fprintf(stderr, "usage: %s [options]\n", argv[0]); + exit(ERROR_USAGE); + } + return(0); +} + +more_input() +{ + int c; + + c = getc(stdin); + if (c == EOF) + return(0); + ungetc(c, stdin); + return(1); +} + +init_send_process() +{ + if (initdone) + return(0); + atinterf_init(); + /* enable verbose error messages */ + atinterf_exec_cmd_needok("AT+CMEE=2", 0, 0); + /* set PDU mode */ + prep_for_pdu_mode(); + if (sms_write_mode == 0 && more_input()) { + atinterf_exec_cmd_needok("AT+CMMS=1", 0, 0); + cmms_done = 1; + } + initdone = 1; + return(1); +} + +process_line() +{ + char *cp; + u_char pdubin[176]; + int cc, scalen; + + cp = index(input_line, '\n'); + if (!cp) { + fprintf(stderr, "input line %d: too long or unterminated\n", + lineno); + exit(ERROR_USAGE); + } + *cp = '\0'; + cc = decode_hex_line(input_line, pdubin, sizeof pdubin); + if (cc < 1) { +inv: fprintf(stderr, "input line %d: not a valid PDU\n", lineno); + exit(ERROR_USAGE); + } + if (pdubin[0] == 1 || pdubin[0] > 11) + goto inv; + scalen = pdubin[0] + 1; + if (cc < scalen + 1) + goto inv; + /* good to go */ + init_send_process(); + send_pdu_out(input_line, cc - scalen); +} + +main(argc, argv) + char **argv; +{ + process_cmdline(argc, argv); + for (lineno = 1; fgets(input_line, sizeof input_line, stdin); lineno++) + process_line(); + if (!initdone) + exit(0); + if (cmms_done) + atinterf_exec_cmd_needok("AT+CMMS=0", 0, 0); + if (sms_write_mode == 1) + sendafterwr_process(); + exit(0); +}