diff rvinterf/rvtat/main.c @ 346:99471c57155a

fcup-rvtat program written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 04 Feb 2018 16:45:05 +0000
parents uptools/atinterf/fcup-atinterf.c@cc207d81c05f
children e40bb5a6c6b9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/rvtat/main.c	Sun Feb 04 16:45:05 2018 +0000
@@ -0,0 +1,143 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "pktmux.h"
+#include "limits.h"
+#include "localtypes.h"
+#include "exitcodes.h"
+
+extern char *socket_pathname;
+extern char *rvinterf_ttyport, *rvinterf_Bopt, *rvinterf_lopt, *rvinterf_wopt;
+
+extern u_char rvi_msg[];
+extern int rvi_msg_len;
+
+char command[256], message[256];
+int cmd_with_msg;
+
+read_command_input(buf)
+	char *buf;
+{
+	char *nl;
+
+	if (!fgets(buf, 256, stdin))
+		return(0);
+	nl = index(buf, '\n');
+	if (!nl) {
+		printf("Ecommand or message is too long\n");
+		exit(1);
+	}
+	*nl = '\0';
+	return(1);
+}
+
+send_to_target(str)
+	char *str;
+{
+	unsigned len;
+	u_char sendpkt[MAX_PKT_TO_TARGET+1];
+
+	len = strlen(str);
+	/* fill out the packet */
+	sendpkt[0] = RVT_AT_HEADER;
+	strcpy(sendpkt + 1, str);
+	/* send it! */
+	send_pkt_to_target(sendpkt, len + 1);
+	return(0);
+}
+
+execute_command()
+{
+	send_to_target(command);
+	if (cmd_with_msg) {
+		collect_pkt_from_target();
+		if (rvi_msg_len != 4 || rvi_msg[2] != '>' || rvi_msg[3] != ' '){
+			printf("F%.*s\n", rvi_msg_len - 2, rvi_msg + 2);
+			return;
+		}
+		send_to_target(message);
+	}
+	for (;;) {
+		collect_pkt_from_target();
+		if (rvi_msg_len == 4 && !strncmp(rvi_msg + 2, "OK", 2) ||
+		    rvi_msg_len == 7 && !strncmp(rvi_msg + 2, "ERROR", 5) ||
+		    rvi_msg_len == 6 && !strncmp(rvi_msg + 2, "BUSY", 4) ||
+		    rvi_msg_len == 12 &&
+			!strncmp(rvi_msg + 2, "NO CARRIER", 10) ||
+		    rvi_msg_len >= 12 &&
+			!strncmp(rvi_msg + 2, "+CME ERROR", 10) ||
+		    rvi_msg_len >= 12 &&
+			!strncmp(rvi_msg + 2, "+CMS ERROR", 10)) {
+			printf("F%.*s\n", rvi_msg_len - 2, rvi_msg + 2);
+			return;
+		}
+		printf("I%.*s\n", rvi_msg_len - 2, rvi_msg + 2);
+	}
+}
+
+main(argc, argv)
+	char **argv;
+{
+	extern int optind;
+	extern char *optarg;
+	int c, sopt = 0;
+
+	while ((c = getopt(argc, argv, "B:l:p:s:w:")) != EOF)
+		switch (c) {
+		case 'B':
+			rvinterf_Bopt = optarg;
+			continue;
+		case 'l':
+			rvinterf_lopt = optarg;
+			continue;
+		case 'p':
+			rvinterf_ttyport = optarg;
+			continue;
+		case 's':
+			socket_pathname = optarg;
+			sopt++;
+			continue;
+		case 'w':
+			rvinterf_wopt = optarg;
+			continue;
+		case '?':
+		default:
+			/* error msg already printed */
+			exit(ERROR_USAGE);
+		}
+	if (rvinterf_ttyport) {
+		if (sopt) {
+			fprintf(stderr,
+			"%s error: -p and -s options are mutually exclusive\n",
+				argv[0]);
+			exit(ERROR_USAGE);
+		}
+		launch_rvinterf();
+	} else {
+		if (rvinterf_Bopt || rvinterf_lopt || rvinterf_wopt) {
+			fprintf(stderr,
+"%s error: -B, -l and -w options are meaningful only when launching rvinterf\n",
+				argv[0]);
+			exit(ERROR_USAGE);
+		}
+		connect_local_socket();
+	}
+
+	while (read_command_input(command)) {
+		if (!strcasecmp(command, "c+m")) {
+			cmd_with_msg = 1;
+			if (!read_command_input(command))
+				break;
+			if (!read_command_input(message))
+				break;
+		} else
+			cmd_with_msg = 0;
+		rx_control(1);
+		execute_command();
+		fflush(stdout);
+	}
+	exit(0);
+}