# HG changeset patch # User Mychaela Falconia # Date 1692069206 28800 # Node ID 59a166c50d0ee4bd7bef0c264ca61a3f0aab6d79 # Parent f86ec96cea6fc706b3a70a6d4b56c184a2427c1d themwi-mncc: convert to libnumdb2 diff -r f86ec96cea6f -r 59a166c50d0e mncc/Makefile --- a/mncc/Makefile Mon Aug 14 15:44:33 2023 -0800 +++ b/mncc/Makefile Mon Aug 14 19:13:26 2023 -0800 @@ -3,7 +3,7 @@ PROG= themwi-mncc OBJS= call_setup.o extsock.o gsm_call.o intswitch.o main.o mncc_recv.o \ mncc_sock.o mtsock.o outcall.o -LIBS= ../libnumdb/libnumdb.a ../libutil/libutil.a +LIBS= ../libnumdb2/libnumdb.a ../libutil/libutil.a INSTBIN=/usr/local/bin all: ${PROG} diff -r f86ec96cea6f -r 59a166c50d0e mncc/call_setup.c --- a/mncc/call_setup.c Mon Aug 14 15:44:33 2023 -0800 +++ b/mncc/call_setup.c Mon Aug 14 19:13:26 2023 -0800 @@ -13,6 +13,8 @@ #include #include "../include/mncc.h" #include "../include/gsm48_const.h" +#include "../include/number_db_v2.h" +#include "../libnumdb2/lookup_func.h" #include "struct.h" #include "gsm_call.h" @@ -58,8 +60,9 @@ struct gsm_mncc *msg; { struct gsm_call *call; - char nanp[11]; - int res, is_nanp, is_itn, is_local; + struct owned_number_rec *own; + struct short_number_rec *snum; + int is_nanp, is_itn, is_local; if (preen_msc_provided_number(&msg->calling)) msg->fields |= MNCC_F_CALLING; @@ -93,26 +96,46 @@ msg->called.plan != GSM48_NPI_ISDN_E164 && msg->called.plan != GSM48_NPI_PRIVATE) break; - res = lookup_short_dial_number(msg->called.number, nanp); - if (!res) { + snum = numdb_lookup_short(msg->called.number); + if (!snum) { syslog(LOG_ERR, - "rejecting MO call 0x%x: invalid short number", + "rejecting MO call 0x%x: unassigned short number", msg->callref); reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, GSM48_CC_CAUSE_UNASSIGNED_NR); call->gc_flag = 1; return; } - if (nanp[0]) { + switch (snum->short_num_type) { + case SHORT_NUM_TYPE_ABBREV: is_nanp = 1; msg->called.type = GSM48_TON_INTERNATIONAL; msg->called.plan = GSM48_NPI_ISDN_E164; - msg->called.number[0] = '1'; - strcpy(msg->called.number+1, nanp); - } else { + sprintf(msg->called.number, "1%03u%03u%04u", + snum->fullnum_prefix[0], + snum->fullnum_prefix[1], snum->short_num); + break; + case SHORT_NUM_TYPE_ITN: is_itn = 1; msg->called.type = GSM48_TON_NET_SPEC; msg->called.plan = GSM48_NPI_PRIVATE; + break; + case SHORT_NUM_TYPE_TEST_SINK: + syslog(LOG_ERR, + "rejecting MO call 0x%x: test sink not implemented", + msg->callref); + reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, + GSM48_CC_CAUSE_DEST_OOO); + call->gc_flag = 1; + return; + default: + syslog(LOG_ERR, + "rejecting MO call 0x%x: unknown short number type 0x%02X", + msg->callref, snum->short_num_type); + reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, + GSM48_CC_CAUSE_DEST_OOO); + call->gc_flag = 1; + return; } break; case 10: @@ -164,8 +187,25 @@ break; } is_local = is_itn; - if (is_nanp && is_nanp_locally_owned(msg->called.number+1)) + if (is_nanp && (own = numdb_lookup_nanp(msg->called.number+1))) { is_local = 1; + switch (own->usage & NUMBER_USAGE_MASK) { + case NUMBER_USAGE_TYPE_GSM_SUB: + break; + case NUMBER_USAGE_TYPE_ALIAS: + sprintf(msg->called.number, "1%03u%03u%04u", + own->remap[0], own->remap[1], own->remap[2]); + break; + default: + syslog(LOG_ERR, + "rejecting MO call 0x%x: unassigned owned NANP", + msg->callref); + reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, + GSM48_CC_CAUSE_UNASSIGNED_NR); + call->gc_flag = 1; + return; + } + } /* weed out attempts to call yourself */ if (is_local && !strcmp(msg->calling.number, msg->called.number)) { syslog(LOG_ERR, "rejecting MO call 0x%x: call to self",