FreeCalypso > hg > freecalypso-tools
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; +}