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);
+}