view libnumdb/readbin.c @ 8:db3c657efafa

themwi-short-dial: old source as starting point
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 13 Dec 2023 03:39:48 +0000
parents 6534965175dd
children
line wrap: on
line source

/*
 * 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);
}