diff libnumdb/readbin.c @ 8:ffd48df829a7

beginning of libnumdb: reading the binary file
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 26 Jun 2022 13:07:33 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libnumdb/readbin.c	Sun Jun 26 13:07:33 2022 -0800
@@ -0,0 +1,69 @@
+/*
+ * This library module contains the code that reads /var/gsm/number-db.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 "../include/number_db_file.h"
+
+char numdb_pathname[] = "/var/gsm/number-db.bin";
+struct stat numdb_file_stat;
+struct numdb_file_hdr numdb_hdr;
+uint64_t *numdb_owned_numbers;
+struct short_number_map *numdb_short_numbers;
+
+read_number_db()
+{
+	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(uint64_t));
+		if (!numdb_owned_numbers) {
+			syslog(LOG_CRIT, "malloc for owned number db: %m");
+			fclose(inf);
+			return(-1);
+		}
+		if (fread(numdb_owned_numbers, sizeof(uint64_t),
+			  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_map));
+		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_map),
+			  numdb_hdr.short_number_count, inf) !=
+		    numdb_hdr.short_number_count)
+			goto read_err;
+	}
+	fclose(inf);
+	return(0);
+}