FreeCalypso > hg > freecalypso-tools
view uptools/atcmd/smsend_main.c @ 366:9f856f843620
uptools/atcmd: smsend_basic.c renamed to smsend_main.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 08 Mar 2018 07:09:37 +0000 |
parents | uptools/atcmd/smsend_basic.c@4378d70b146b |
children | ed1ecc249eb3 |
line wrap: on
line source
/* * 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" #define MAX_MSG_CHARS 160 int sms_write_mode, text_mode, utf8_input; u_char dest_addr[12]; char msgtext[MAX_MSG_CHARS*2+2]; u_char msgtext_gsm7[MAX_MSG_CHARS]; 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]) > MAX_MSG_CHARS*2) { fprintf(stderr, "error: message argument is too long\n"); exit(ERROR_USAGE); } strcpy(msgtext, argv[optind+1]); return(1); } read_msgtext_from_stdin() { unsigned pos, remain; int cc; pos = 0; remain = sizeof(msgtext); for (;;) { if (!remain) { fprintf(stderr, "error: message on stdin is too long\n"); exit(ERROR_USAGE); } cc = read(0, msgtext + pos, remain); if (cc < 0) { fprintf(stderr, "error reading message from stdin\n"); exit(ERROR_USAGE); } if (cc == 0) break; pos += cc; remain -= cc; } msgtext[pos] = '\0'; } trim_trailing_newlines() { char *cp; cp = index(msgtext, '\0'); while (cp > msgtext && cp[-1] == '\n') cp--; *cp = '\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); } trim_trailing_newlines(); if (text_mode) { if (index(msgtext, '\n')) { fprintf(stderr, "error: multiline messages not supported in text mode\n"); exit(ERROR_USAGE); } 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(); /* enable verbose error messages */ atinterf_exec_cmd_needok("AT+CMEE=2", 0, 0); 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); }