diff uptools/atcmd/smsend_concat.c @ 370:076d533f840d

fcup-smsend: implemented automatic concat SMS refno generation
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Mar 2018 17:47:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uptools/atcmd/smsend_concat.c	Thu Mar 08 17:47:58 2018 +0000
@@ -0,0 +1,61 @@
+/*
+ * This module contains the messy code for automatic generation and
+ * increment of concat SMS reference numbers.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/file.h>
+#include <sys/time.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "../../rvinterf/include/exitcodes.h"
+
+static int
+initial_seed()
+{
+	struct timeval tv;
+	u_char refno, *cp, *endp;
+
+	gettimeofday(&tv, 0);
+	cp = (u_char *) &tv;
+	endp = cp + sizeof(struct timeval);
+	refno = 0;
+	while (cp < endp)
+		refno ^= *cp++;
+	return refno;
+}
+
+get_concsms_refno_from_host_fs()
+{
+	char *homedir, statefile[MAXPATHLEN];
+	int fd, cc;
+	char buf[6];
+	u_char refno;
+
+	homedir = getenv("HOME");
+	if (!homedir) {
+		fprintf(stderr,
+		"error: no HOME= defined, needed for concat SMS refno\n");
+		exit(ERROR_UNIX);
+	}
+	sprintf(statefile, "%s/.concat_sms_refno", homedir);
+	fd = open(statefile, O_RDWR|O_CREAT, 0666);
+	if (fd < 0) {
+		perror(statefile);
+		exit(ERROR_UNIX);
+	}
+	cc = read(fd, buf, 5);
+	if (cc == 5 && buf[0] == '0' && buf[1] == 'x' && isxdigit(buf[2]) &&
+	    isxdigit(buf[3]) && buf[4] == '\n')
+		refno = strtoul(buf, 0, 16) + 1;
+	else
+		refno = initial_seed();
+	sprintf(buf, "0x%02X\n", refno);
+	lseek(fd, 0, SEEK_SET);
+	write(fd, buf, 5);
+	close(fd);
+	return refno;
+}