diff libnumdb/readbin.c @ 1:6534965175dd

libnumdb ported over
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 13 Dec 2023 00:53:04 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libnumdb/readbin.c	Wed Dec 13 00:53:04 2023 +0000
@@ -0,0 +1,71 @@
+/*
+ * This library module contains the code that reads /var/gsm/number-db2.bin,
+ * as well as definitions of global variables into which the booty is read.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include <themwi/nanp/number_db_v2.h>
+#include <themwi/nanp/number_lookup.h>
+
+const char numdb_pathname[] = "/var/gsm/number-db2.bin";
+struct stat numdb_file_stat;
+struct numdb_file_hdr numdb_hdr;
+struct owned_number_rec *numdb_owned_numbers;
+struct short_number_rec *numdb_short_numbers;
+
+int read_number_db(void)
+{
+	FILE *inf;
+
+	inf = fopen(numdb_pathname, "r");
+	if (!inf) {
+		syslog(LOG_CRIT, "open %s: %m", numdb_pathname);
+		return(-1);
+	}
+	fstat(fileno(inf), &numdb_file_stat);
+	if (!S_ISREG(numdb_file_stat.st_mode)) {
+		syslog(LOG_CRIT, "invalid %s: not a regular file",
+			numdb_pathname);
+		fclose(inf);
+		return(-1);
+	}
+	if (fread(&numdb_hdr, sizeof numdb_hdr, 1, inf) != 1) {
+read_err:	syslog(LOG_CRIT, "error reading from %s: %m", numdb_pathname);
+		fclose(inf);
+		return(-1);
+	}
+	if (numdb_hdr.owned_number_count) {
+		numdb_owned_numbers = malloc(numdb_hdr.owned_number_count *
+					     sizeof(struct owned_number_rec));
+		if (!numdb_owned_numbers) {
+			syslog(LOG_CRIT, "malloc for owned number db: %m");
+			fclose(inf);
+			return(-1);
+		}
+		if (fread(numdb_owned_numbers, sizeof(struct owned_number_rec),
+			  numdb_hdr.owned_number_count, inf) !=
+		    numdb_hdr.owned_number_count)
+			goto read_err;
+	}
+	if (numdb_hdr.short_number_count) {
+		numdb_short_numbers = malloc(numdb_hdr.short_number_count *
+					     sizeof(struct short_number_rec));
+		if (!numdb_short_numbers) {
+			syslog(LOG_CRIT, "malloc for short number db: %m");
+			fclose(inf);
+			return(-1);
+		}
+		if (fread(numdb_short_numbers, sizeof(struct short_number_rec),
+			  numdb_hdr.short_number_count, inf) !=
+		    numdb_hdr.short_number_count)
+			goto read_err;
+	}
+	fclose(inf);
+	return(0);
+}