view libnumdb/readbin.c @ 171:4f1f3f799295

doc/Codec-library-depend: article written
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 21 Nov 2022 01:01:39 -0800
parents ffd48df829a7
children
line wrap: on
line source

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