FreeCalypso > hg > themwi-system-sw
view liboutrt/readbin.c @ 152:7176dc850d7a
sip-in hold/retr error handling: simply send BYE
Because we know that the SIP state is CONNECTED at the time of any
such error event, we can call initiate_bye() instead of disconnect_sip(),
and thereby get rid of struct gsm_mncc_cause which will never be used
in this scenario anyway.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2022 16:11:21 -0800 |
parents | 765991f42d86 |
children |
line wrap: on
line source
/* * This library module contains the code that reads /var/gsm/out-routes.bin, * as well as definitions of global variables into which the booty is read. */ #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <syslog.h> #include "../include/out_routes.h" char outrt_pathname[] = "/var/gsm/out-routes.bin"; struct stat outrt_file_stat; struct out_routes_header outrt_hdr; struct sip_out_dest *outrt_dest_array; struct inn_route *outrt_inn_array; struct special_num_route *outrt_spec_array; read_out_routes_db() { FILE *inf; inf = fopen(outrt_pathname, "r"); if (!inf) { syslog(LOG_CRIT, "open %s: %m", outrt_pathname); return(-1); } fstat(fileno(inf), &outrt_file_stat); if (!S_ISREG(outrt_file_stat.st_mode)) { syslog(LOG_CRIT, "invalid %s: not a regular file", outrt_pathname); fclose(inf); return(-1); } if (fread(&outrt_hdr, sizeof outrt_hdr, 1, inf) != 1) { read_err: syslog(LOG_CRIT, "error reading from %s: %m", outrt_pathname); fclose(inf); return(-1); } if (!outrt_hdr.num_dest) { syslog(LOG_CRIT, "%s contains invalid data", outrt_pathname); fclose(inf); return(-1); } outrt_dest_array = malloc(outrt_hdr.num_dest * sizeof(struct sip_out_dest)); if (!outrt_dest_array) { syslog(LOG_CRIT, "malloc for SIP dest array: %m"); fclose(inf); return(-1); } if (fread(outrt_dest_array, sizeof(struct sip_out_dest), outrt_hdr.num_dest, inf) != outrt_hdr.num_dest) goto read_err; if (outrt_hdr.num_inn) { outrt_inn_array = malloc(outrt_hdr.num_inn * sizeof(struct inn_route)); if (!outrt_inn_array) { syslog(LOG_CRIT, "malloc for E.164 route array: %m"); fclose(inf); return(-1); } if (fread(outrt_inn_array, sizeof(struct inn_route), outrt_hdr.num_inn, inf) != outrt_hdr.num_inn) goto read_err; } if (outrt_hdr.num_special) { outrt_spec_array = malloc(outrt_hdr.num_special * sizeof(struct special_num_route)); if (!outrt_spec_array) { syslog(LOG_CRIT, "malloc for special route array: %m"); fclose(inf); return(-1); } if (fread(outrt_spec_array, sizeof(struct special_num_route), outrt_hdr.num_special, inf) != outrt_hdr.num_special) goto read_err; } fclose(inf); return(0); }