ifport->out_channel = selchannel;
/* additional channel selection for multipoint NT ports */
- if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
- {
+ if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode) {
selchannelp = &(selchannel->next);
selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
memuse++;
* and return pointer to next element in buffer */
static char *get_seperated(char *buffer)
{
- while(*buffer)
- {
- if (*buffer==',' || *buffer<=32) /* seperate */
- {
+ while(*buffer) {
+ if (*buffer==',' || *buffer<=32) { /* seperate */
*buffer++ = '\0';
while((*buffer>'\0' && *buffer<=32) || *buffer==',')
buffer++;
struct interface_port *ifport;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
/* add value */
- if (value[0])
- {
+ if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
}
}
static int inter_extension(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
- if (value[0])
- {
+ if (interface->external) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed, because interface is external interface.\n", filename, line, parameter);
+ return(-1);
+ }
+ if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
}
interface->extension = 1;
return(0);
}
+static int inter_extern(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ if (interface->extension) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed, because interface is an extension.\n", filename, line, parameter);
+ return(-1);
+ }
+ if (value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
+ return(-1);
+ }
+ interface->external = 1;
+ return(0);
+}
static int inter_ptp(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
struct interface_port *ifport;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
- if (interface->ifport->ptmp)
- {
+ if (interface->ifport->ptmp) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptmp was given.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
/* add value */
- if (value[0])
- {
+ if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
}
struct interface_port *ifport;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
- if (interface->ifport->ptp)
- {
+ if (interface->ifport->ptp) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptp was given.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
/* add value */
- if (value[0])
- {
+ if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
}
struct interface_port *ifport;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
/* add value */
- if (value[0])
- {
+ if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
}
ifport->nt = 1;
return(0);
}
+static int inter_tespecial(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ /* add value */
+ if (value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
+ return(-1);
+ }
+ ifport->tespecial = 1;
+ return(0);
+}
static int inter_tones(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
- if (!strcasecmp(value, "yes"))
- {
+ if (!strcasecmp(value, "yes")) {
interface->is_tones = IS_YES;
} else
- if (!strcasecmp(value, "no"))
- {
+ if (!strcasecmp(value, "no")) {
interface->is_tones = IS_NO;
- } else
- {
+ } else {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
return(-1);
}
}
static int inter_earlyb(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
- if (!strcasecmp(value, "yes"))
- {
+ if (!strcasecmp(value, "yes")) {
interface->is_earlyb = IS_YES;
} else
- if (!strcasecmp(value, "no"))
- {
+ if (!strcasecmp(value, "no")) {
interface->is_earlyb = IS_NO;
- } else
- {
+ } else {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
return(-1);
}
}
static int inter_hunt(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
- if (!strcasecmp(value, "linear"))
- {
+ if (!strcasecmp(value, "linear")) {
interface->hunt = HUNT_LINEAR;
} else
- if (!strcasecmp(value, "roundrobin"))
- {
+ if (!strcasecmp(value, "roundrobin")) {
interface->hunt = HUNT_ROUNDROBIN;
- } else
- {
+ } else {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'linear' or 'roundrobin'.\n", filename, line, parameter);
return(-1);
}
int val;
val = get_number(value);
- if (val == -1)
- {
+ if (val == -1) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one numeric value.\n", filename, line, parameter);
return(-1);
}
/* check for port already assigned */
searchif = interface_newlist;
- while(searchif)
- {
+ while(searchif) {
ifport = searchif->ifport;
- while(ifport)
- {
- if (ifport->portnum == val)
- {
+ while(ifport) {
+ if (ifport->portnum == val) {
SPRINT(interface_error, "Error in %s (line %d): port '%d' already used above.\n", filename, line, val);
return(-1);
}
}
static int inter_portname(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
- SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not implemented yet.\n", filename, line, parameter);
- return(-1);
+ struct interface_port *ifport, **ifportp;
+ struct interface *searchif;
+
+ /* goto end of chain */
+ ifport = interface->ifport;
+ if (ifport) {
+ while(ifport->next)
+ ifport = ifport->next;
+ }
+
+ /* check for port already assigned, but not for shared gsm interface */
+ searchif = interface_newlist;
+#if defined WITH_GSM_BS || defined WITH_GSM_MS
+ if (options.gsm && !strcmp(value, gsm->conf.interface_lcr))
+#endif
+ {
+ while(searchif) {
+ ifport = searchif->ifport;
+ while(ifport) {
+ if (!strcasecmp(ifport->portname, value)) {
+ SPRINT(interface_error, "Error in %s (line %d): port '%s' already used above.\n", filename, line, value);
+ return(-1);
+ }
+ ifport = ifport->next;
+ }
+ searchif = searchif->next;
+ }
+ }
+ /* alloc port substructure */
+ ifport = (struct interface_port *)MALLOC(sizeof(struct interface_port));
+ memuse++;
+ ifport->interface = interface;
+ /* set value */
+ ifport->portnum = -1; // disable until resolved
+ SCPY(ifport->portname, value);
+ /* tail port */
+ ifportp = &interface->ifport;
+ while(*ifportp)
+ ifportp = &((*ifportp)->next);
+ *ifportp = ifport;
+ return(0);
+}
+static int inter_l1hold(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ if (!strcmp(value, "yes")) {
+ ifport->l1hold = 1;
+ } else
+ if (!strcmp(value, "no")) {
+ ifport->l1hold = 0;
+ } else {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expecting parameter 'yes' or 'no'.\n", filename, line, parameter);
+ return(-1);
+ }
+ return(0);
}
static int inter_l2hold(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
struct interface_port *ifport;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
ifport = interface->ifport;
while(ifport->next)
ifport = ifport->next;
- if (!strcmp(value, "yes"))
- {
+ if (!strcmp(value, "yes")) {
ifport->l2hold = 1;
} else
- if (!strcmp(value, "no"))
- {
+ if (!strcmp(value, "no")) {
ifport->l2hold = -1;
- } else
- {
+ } else {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expecting parameter 'yes' or 'no'.\n", filename, line, parameter);
return(-1);
}
char *p, *el;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
p = value;
- while(*p)
- {
+ while(*p) {
el = p;
p = get_seperated(p);
- if (!strcasecmp(el, "force"))
- {
+ if (!strcasecmp(el, "force")) {
ifport->channel_force = 1;
- if (ifport->out_channel)
- {
+ if (ifport->out_channel) {
SPRINT(interface_error, "Error in %s (line %d): value 'force' may only appear as first element in list.\n", filename, line);
return(-1);
}
} else
- if (!strcasecmp(el, "any"))
- {
+ if (!strcasecmp(el, "any")) {
val = CHANNEL_ANY;
goto selchannel;
} else
- if (!strcasecmp(el, "free"))
- {
+ if (!strcasecmp(el, "free")) {
val = CHANNEL_FREE;
goto selchannel;
} else
- if (!strcasecmp(el, "no"))
- {
+ if (!strcasecmp(el, "no")) {
val = CHANNEL_NO;
goto selchannel;
- } else
- {
+ } else {
val = get_number(el);
- if (val == -1)
- {
+ if (val == -1) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of 'force', 'any', 'free', 'no' and any channel number.\n", filename, line, parameter);
return(-1);
}
- if (val<1 || val==16 || val>126)
- {
+ if (val<1 || val==16 || val>126) {
SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
return(-1);
}
char *p, *el;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
p = value;
- while(*p)
- {
+ while(*p) {
el = p;
p = get_seperated(p);
- if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE)
- {
+ if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has values behind 'free' keyword. They has no effect.\n", filename, line, parameter);
return(-1);
}
- if (!strcasecmp(el, "free"))
- {
+ if (!strcasecmp(el, "free")) {
val = CHANNEL_FREE;
goto selchannel;
- } else
- {
+ } else {
val = get_number(el);
- if (val == -1)
- {
+ if (val == -1) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of channel numbers and 'free'.\n", filename, line, parameter);
return(-1);
}
- if (val<1 || val==16 || val>126)
- {
+ if (val<1 || val==16 || val>126) {
SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
return(-1);
}
char *p, *el;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
while(ifport->next)
ifport = ifport->next;
p = value;
- if (!*p)
- {
+ if (!*p) {
nofive:
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects five timeout values.\n", filename, line, parameter);
return(-1);
struct interface_msn *ifmsn, **ifmsnp;
char *p, *el;
- if (!value[0])
- {
+ if (!value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one MSN number or a list.\n", filename, line, parameter);
return(-1);
}
- if (interface->ifscreen_in)
- {
+ if (interface->ifscreen_in) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'screen_in' parameter.\n", filename, line, parameter);
return(-1);
}
/* process list */
p = value;
- while(*p)
- {
+ while(*p) {
el = p;
p = get_seperated(p);
/* add MSN to list */
struct interface_screen *ifscreen;
char *p, *el;
- if (!value[0])
- {
+ if (!value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID and new caller ID.\n", filename, line, parameter);
return(-1);
}
// printf("interface=%s\n", interface->name);
/* get match */
p = value;
- while(*p)
- {
+ while(*p) {
el = p;
p = get_seperated(p);
- if (!strcasecmp(el, "unknown"))
- {
- if (ifscreen->match_type != -1)
- {
+ if (!strcasecmp(el, "unknown")) {
+ if (ifscreen->match_type != -1) {
typeerror:
SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
return(-1);
}
ifscreen->match_type = INFO_NTYPE_UNKNOWN;
} else
- if (!strcasecmp(el, "subscriber"))
- {
+ if (!strcasecmp(el, "subscriber")) {
if (ifscreen->match_type != -1)
goto typeerror;
ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
} else
- if (!strcasecmp(el, "national"))
- {
+ if (!strcasecmp(el, "national")) {
if (ifscreen->match_type != -1)
goto typeerror;
ifscreen->match_type = INFO_NTYPE_NATIONAL;
} else
- if (!strcasecmp(el, "international"))
- {
+ if (!strcasecmp(el, "international")) {
if (ifscreen->match_type != -1)
goto typeerror;
ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
} else
- if (!strcasecmp(el, "allowed"))
- {
- if (ifscreen->match_present != -1)
- {
+ if (!strcasecmp(el, "allowed")) {
+ if (ifscreen->match_present != -1) {
presenterror:
SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
return(-1);
}
ifscreen->match_present = INFO_PRESENT_ALLOWED;
} else
- if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted"))
- {
+ if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted")) {
if (ifscreen->match_present != -1)
goto presenterror;
ifscreen->match_present = INFO_PRESENT_RESTRICTED;
} else {
SCPY(ifscreen->match, el);
/* check for % at the end */
- if (strchr(el, '%'))
- {
- if (strchr(el, '%') != el+strlen(el)-1)
- {
+ if (strchr(el, '%')) {
+ if (strchr(el, '%') != el+strlen(el)-1) {
SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
return(-1);
}
break;
}
}
- if (ifscreen->match[0] == '\0')
- {
+ if (ifscreen->match[0] == '\0') {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
return(-1);
}
/* get result */
- while(*p)
- {
+ while(*p) {
el = p;
p = get_seperated(p);
- if (!strcasecmp(el, "unknown"))
- {
+ if (!strcasecmp(el, "unknown")) {
if (ifscreen->result_type != -1)
goto typeerror;
ifscreen->result_type = INFO_NTYPE_UNKNOWN;
} else
- if (!strcasecmp(el, "subscriber"))
- {
+ if (!strcasecmp(el, "subscriber")) {
if (ifscreen->result_type != -1)
goto typeerror;
ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
} else
- if (!strcasecmp(el, "national"))
- {
+ if (!strcasecmp(el, "national")) {
if (ifscreen->result_type != -1)
goto typeerror;
ifscreen->result_type = INFO_NTYPE_NATIONAL;
} else
- if (!strcasecmp(el, "international"))
- {
+ if (!strcasecmp(el, "international")) {
if (ifscreen->result_type != -1)
goto typeerror;
ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
} else
- if (!strcasecmp(el, "present") || !strcasecmp(el, "presented") || !strcasecmp(el, "allowed") || !strcasecmp(el, "allow"))
- {
+ if (!strcasecmp(el, "present") || !strcasecmp(el, "presented") || !strcasecmp(el, "allowed") || !strcasecmp(el, "allow")) {
if (ifscreen->result_present != -1)
goto presenterror;
ifscreen->result_present = INFO_PRESENT_ALLOWED;
} else
- if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted") || !strcasecmp(el, "deny") || !strcasecmp(el, "denied"))
- {
+ if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted") || !strcasecmp(el, "deny") || !strcasecmp(el, "denied")) {
if (ifscreen->result_present != -1)
goto presenterror;
ifscreen->result_present = INFO_PRESENT_RESTRICTED;
} else {
SCPY(ifscreen->result, el);
/* check for % at the end */
- if (strchr(el, '%'))
- {
- if (strchr(el, '%') != el+strlen(el)-1)
- {
+ if (strchr(el, '%')) {
+ if (strchr(el, '%') != el+strlen(el)-1) {
SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
return(-1);
}
break;
}
}
- if (ifscreen->result[0] == '\0')
- {
+ if (ifscreen->result[0] == '\0') {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
return(-1);
}
}
static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
- if (interface->ifmsn)
- {
+ if (interface->ifmsn) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
return(-1);
}
struct interface_port *ifport;
/* port in chain ? */
- if (!interface->ifport)
- {
+ if (!interface->ifport) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
return(-1);
}
p = value;
while(*p > 32)
p++;
- if (*p)
- {
+ if (*p) {
*p++ = 0;
while(*p > 0 && *p <= 32)
p++;
}
- if (!strcasecmp(value, "gain"))
- {
+ if (!strcasecmp(value, "gain")) {
q = p;
while(*q > 32)
q++;
- if (*q)
- {
+ if (*q) {
*q++ = 0;
while(*q > 0 && *q <= 32)
q++;
}
- if (*p == 0 || *q == 0)
- {
+ if (*p == 0 || *q == 0) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' expects two gain values.\n", filename, line, parameter, value);
return(-1);
}
- if (atoi(p)<-8 || atoi(p)>8 || atoi(q)<-8 || atoi(q)>8)
- {
+ if (atoi(p)<-8 || atoi(p)>8 || atoi(q)<-8 || atoi(q)>8) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' gain values not in range. (-8...8)\n", filename, line, parameter, value);
return(-1);
}
interface->tx_gain = atoi(p);
interface->rx_gain = atoi(q);
} else
- if (!strcasecmp(value, "pipeline"))
- {
- if (*p == 0)
- {
+ if (!strcasecmp(value, "pipeline")) {
+ if (*p == 0) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' expects pipeline string.\n", filename, line, parameter, value);
return(-1);
}
SCPY(interface->pipeline, p);
} else
- if (!strcasecmp(value, "blowfish"))
- {
+ if (!strcasecmp(value, "blowfish")) {
unsigned char key[56];
int l;
- if (!!strncmp(p, "0x", 2))
- {
+ if (!!strncmp(p, "0x", 2)) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' expects blowfish key starting with '0x'.\n", filename, line, parameter, value);
return(-1);
}
p += 2;
l = 0;
- while(*p)
- {
- if (l == 56)
- {
+ while(*p) {
+ if (l == 56) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key too long.\n", filename, line, parameter, value);
return(-1);
}
key[l] = (*p-'a'+10)<<4;
else if (*p >= 'A' && *p <= 'F')
key[l] = (*p-'A'+10)<<4;
- else
- {
+ else {
digout:
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key has digits out of range. (0...9, a...f)\n", filename, line, parameter, value);
return(-1);
}
p++;
- if (*p == 0)
- {
+ if (*p == 0) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key must end on an 8 bit boundary (two character boundary).\n", filename, line, parameter, value);
return(-1);
}
p++;
l++;
}
- if (l < 4)
- {
+ if (l < 4) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key must be at least 4 bytes (8 characters).\n", filename, line, parameter, value);
return(-1);
}
memcpy(interface->bf_key, key, l);
interface->bf_len = l;
- } else
- {
+ } else {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has unknown filter '%s'.\n", filename, line, parameter, value);
return(-1);
}
return(0);
}
+static int inter_dialmax(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->dialmax = atoi(value);
+ return(0);
+}
+static int inter_tones_dir(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ SCPY(ifport->tones_dir, value);
+ return(0);
+}
+static int inter_gsm(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' is outdated.\nPlease use 'gsm-bs' for base station or 'gsm-ms' for mobile station interface!\n", filename, line, parameter);
+ return(-1);
+}
+static int inter_gsm_bs(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+#ifndef WITH_GSM_BS
+ SPRINT(interface_error, "Error in %s (line %d): GSM BS side not compiled in.\n", filename, line);
+ return(-1);
+#else
+ struct interface_port *ifport;
+ struct interface *searchif;
+
+ /* check gsm */
+ if (!gsm) {
+ SPRINT(interface_error, "Error in %s (line %d): GSM is not activated.\n", filename, line);
+ return(-1);
+ }
+ searchif = interface_newlist;
+ while(searchif) {
+ ifport = searchif->ifport;
+ while(ifport) {
+ if (ifport->gsm_bs) {
+ SPRINT(interface_error, "Error in %s (line %d): port '%s' already uses gsm BS side.\n", filename, line, ifport->portname);
+ return(-1);
+ }
+ ifport = ifport->next;
+ }
+ searchif = searchif->next;
+ }
+
+ /* set portname */
+ if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
+ return(-1);
+
+ /* goto end of chain again to set gsmflag */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->gsm_bs = 1;
+
+ return(0);
+#endif
+}
+static int inter_gsm_ms(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+#ifndef WITH_GSM_MS
+ SPRINT(interface_error, "Error in %s (line %d): GSM MS side not compiled in.\n", filename, line);
+ return(-1);
+#else
+ struct interface_port *ifport, *searchifport;
+ struct interface *searchif;
+ char *element;
+
+ /* check gsm */
+ if (!gsm) {
+ SPRINT(interface_error, "Error in %s (line %d): GSM is not activated.\n", filename, line);
+ return(-1);
+ }
+
+ /* set portname */
+ if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
+ return(-1);
+
+ /* goto end of chain again to set gsmflag and socket */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->gsm_ms = 1;
+
+ /* copy values */
+ element = strsep(&value, " ");
+ if (!element || !element[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): Missing MS name and socket name.\n", filename, line);
+ return(-1);
+ }
+ SCPY(ifport->gsm_ms_name, element);
+ element = strsep(&value, " ");
+ if (!element || !element[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): Missing socket name after MS name.\n", filename, line);
+ return(-1);
+ }
+ SCPY(ifport->gsm_ms_socket, element);
+
+ /* check if socket is used multiple times */
+ searchif = interface_newlist;
+ while(searchif) {
+ searchifport = searchif->ifport;
+ while(searchifport) {
+ if (searchifport != ifport
+ && !strcmp(searchifport->gsm_ms_socket, ifport->gsm_ms_socket)) {
+ SPRINT(interface_error, "Error in %s (line %d): mobile '%s' already uses the given socket '%s', choose a different one.\n", filename, line, ifport->gsm_ms_name, searchifport->gsm_ms_socket);
+ return(-1);
+ }
+ searchifport = searchifport->next;
+ }
+ searchif = searchif->next;
+ }
+
+ return(0);
+#endif
+}
+static int inter_nonotify(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->nonotify = 1;
+ return(0);
+}
+#ifdef WITH_SS5
+static int inter_ss5(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+ char *element;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->ss5 |= SS5_ENABLE;
+ while((element = strsep(&value, " "))) {
+ if (element[0] == '\0')
+ continue;
+ if (!strcasecmp(element, "connect"))
+ ifport->ss5 |= SS5_FEATURE_CONNECT;
+ else
+ if (!strcasecmp(element, "nodisconnect"))
+ ifport->ss5 |= SS5_FEATURE_NODISCONNECT;
+ else
+ if (!strcasecmp(element, "releaseguardtimer"))
+ ifport->ss5 |= SS5_FEATURE_RELEASEGUARDTIMER;
+ else
+ if (!strcasecmp(element, "bell"))
+ ifport->ss5 |= SS5_FEATURE_BELL;
+ else
+ if (!strcasecmp(element, "pulsedialing"))
+ ifport->ss5 |= SS5_FEATURE_PULSEDIALING;
+ else
+ if (!strcasecmp(element, "delay"))
+ ifport->ss5 |= SS5_FEATURE_DELAY;
+ else
+ if (!strcasecmp(element, "starrelease"))
+ ifport->ss5 |= SS5_FEATURE_STAR_RELEASE;
+ else
+ if (!strcasecmp(element, "suppress"))
+ ifport->ss5 |= SS5_FEATURE_SUPPRESS;
+ else {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' does not allow value element '%s'.\n", filename, line, parameter, element);
+ return(-1);
+ }
+ }
+ return(0);
+}
+#endif
+static int inter_remote(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+ struct interface *searchif;
+
+ if (!value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects application name as value.\n", filename, line, parameter);
+ return(-1);
+ }
+ searchif = interface_newlist;
+ while(searchif) {
+ ifport = searchif->ifport;
+ while(ifport) {
+ if (ifport->remote && !strcmp(ifport->remote_app, value)) {
+ SPRINT(interface_error, "Error in %s (line %d): port '%s' already uses remote application '%s'.\n", filename, line, ifport->portname, value);
+ return(-1);
+ }
+ ifport = ifport->next;
+ }
+ searchif = searchif->next;
+ }
+
+ /* set portname */
+ if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
+ return(-1);
+
+ /* goto end of chain again to set application name */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->remote = 1;
+ SCPY(ifport->remote_app, value);
+
+
+ return(0);
+}
/*
struct interface_param interface_param[] = {
{ "extension", &inter_extension, "",
"If keyword is given, calls to interface are handled as internal extensions."},
+
+ { "extern", &inter_extern, "",
+ "If keyword is given, this interface will be used for external calls.\n"
+ "Calls require an external interface, if the routing action 'extern' is used\nwithout specific interface given.\n"
+ "Calls forwarded by extension's 'settings' also require an external interface."},
+
{"tones", &inter_tones, "yes | no",
"Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
""},
{"portnum", &inter_portnum, "<number>",
"Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
- {"portname", &inter_portname, "<number>",
- "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
+ {"portname", &inter_portname, "<name>",
+ "Same as 'portnum', but the name is given instead.\nUse 'isdninfo' to list all available ports and names."},
{"block", &inter_block, "",
"If keyword is given, calls on this interface are blocked.\n"
"This is required on interfaces that support both NT-mode and TE-mode.\n"
"This parameter must follow a 'port' parameter."},
+ {"te-special", &inter_tespecial, "",
+ "The given port uses a modified TE-mode.\n"
+ "All information elements that are allowed Network->User will then be\n"
+ "transmitted User->Network also. This is usefull to pass all informations\n"
+ "between two interconnected LCRs, like 'redirected number' or 'display'.\n"
+ "Note that this is not compliant with ISDN protocol.\n"
+ "This parameter must follow a 'port' parameter."},
+
+ {"layer1hold", &inter_l1hold, "yes | no",
+ "The given port will not release layer 1 after layer 2 is down.\n"
+ "It is required to keep layer 1 of telephones up, to solve activation problems.\n"
+ "This parameter must follow a 'port' parameter."},
+
{"layer2hold", &inter_l2hold, "yes | no",
"The given port will continuously try to establish layer 2 link and hold it.\n"
"It is required for PTP links in most cases, therefore it is default.\n"
"Channel selection list for all outgoing calls to the interface.\n"
"A free channels is searched in order of appearance.\n"
"This parameter must follow a 'port' parameter.\n"
- " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
+ " force - Forces the selected port with no acceptable alternative (see Q.931).\n"
+ " -> this will be automatically set for multipoint (ptmp) NT-mode ports\n"
" <number>[,...] - List of channels to search.\n"
" free - Select any free channel\n"
" any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
"pipeline <string> - Sets echo cancelation pipeline.\n"
"blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
+ {"dialmax", &inter_dialmax, "<digits>",
+ "Limits the number of digits in setup/information message."},
+
+ {"tones_dir", &inter_tones_dir, "<path>",
+ "Overrides the given tone_dir in options.conf.\n"
+ "To used kernel tones in mISDN_dsp.ko, say 'american', 'german', or 'oldgerman'."},
+
+ {"gsm", &inter_gsm, "",
+ ""},
+ {"gsm-bs", &inter_gsm_bs, "",
+ "Sets up GSM base station interface for using OpenBSC.\n"
+ "See the default/gsm.conf for configuration for this version."},
+ {"gsm-ms", &inter_gsm_ms, "[<socket>]",
+ "Sets up GSM mobile station interface for using Osmocom-BB.\n"
+ "See the default/gsm.conf for configuration for this version.\n"
+ "The name of the MS folows the interface name.\n"
+ "The socket is /tmp/osmocom_l2 by default and need to be changed when multiple\n"
+ "MS interfaces are used."},
+ {"nonotify", &inter_nonotify, "",
+ "Prevents sending notify messages to this interface. A call placed on hold will\n"
+ "Not affect the remote end (phone or telcom switch).\n"
+ "This parameter must follow a 'port' parameter."},
+
+#ifdef WITH_SS5
+ {"ccitt5", &inter_ss5, "[<feature> [feature ...]]",
+ "Interface uses CCITT No. 5 inband signalling rather than D-channel.\n"
+ "This feature causes CPU load to rise and has no practical intend.\n"
+ "If you don't know what it is, you don't need it.\n"
+ "Features apply to protocol behaviour and blueboxing specials, they are:\n"
+ " connect - Connect incomming call to throughconnect audio, if required.\n"
+ " nodisconnect - Don't disconnect if incomming exchange disconnects.\n"
+ " releaseguardtimer - Tries to prevent Blueboxing by a longer release-guard.\n"
+ " bell - Allow releasing and pulse-dialing via 2600 Hz like old Bell systems.\n"
+ " pulsedialing - Use pulse dialing on outgoing exchange. (takes long!)\n"
+ " delay - Use on incomming exchange, to make you feel a delay when blueboxing.\n"
+ " starrelease - Pulse dialing a star (11 pulses per digit) clears current call.\n"
+ " suppress - Suppress received tones, as they will be recognized."},
+#endif
+
+ {"remote", &inter_remote, "<application>",
+ "Sets up an interface that communicates with the remote application.\n"
+ "Use \"asterisk\" to use chan_lcr as remote application."},
+
{NULL, NULL, NULL, NULL}
};
if (interface_newlist != NULL)
FATAL("list is not empty.\n");
interface_error[0] = '\0';
- SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
+ SPRINT(filename, "%s/interface.conf", CONFIG_DATA);
- if (!(fp = fopen(filename,"r")))
- {
+ if (!(fp = fopen(filename,"r"))) {
SPRINT(interface_error, "Cannot open '%s'\n", filename);
goto error;
}
line=0;
- while((fgets(buffer,sizeof(buffer),fp)))
- {
- buffer[sizeof(buffer)-1]=0;
- if (buffer[0]) buffer[strlen(buffer)-1]=0;
+ while((GETLINE(buffer, fp))) {
p=buffer;
line++;
- while(*p <= 32) /* skip spaces */
- {
+ while(*p <= 32) { /* skip spaces */
if (*p == 0)
break;
p++;
parameter[0]=0;
value[0]=0;
i=0; /* read parameter */
- while(*p > 32)
- {
- if (i+1 >= sizeof(parameter))
- {
+ while(*p > 32) {
+ if (i+1 >= sizeof(parameter)) {
SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
goto error;
}
parameter[i++] = *p++;
}
- while(*p <= 32) /* skip spaces */
- {
+ while(*p <= 32) { /* skip spaces */
if (*p == 0)
break;
p++;
}
- if (*p!=0 && *p!='#') /* missing name */
- {
+ if (*p!=0 && *p!='#') { /* missing name */
i=0; /* read until end */
- while(*p!=0 && *p!='#')
- {
- if (i+1 >= sizeof(value))
- {
+ while(*p!=0 && *p!='#') {
+ if (i+1 >= sizeof(value)) {
SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
goto error;
}
}
/* remove trailing spaces from value */
- while(i)
- {
+ while(i) {
if (value[i-1]==0 || value[i-1]>32)
break;
value[i-1] = '\0';
}
/* check for interface name as first statement */
- if (expecting && parameter[0]!='[')
- {
+ if (expecting && parameter[0]!='[') {
SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
goto error;
}
expecting = 0;
/* check for new interface */
- if (parameter[0] == '[')
- {
- if (parameter[strlen(parameter)-1] != ']')
- {
+ if (parameter[0] == '[') {
+ if (parameter[strlen(parameter)-1] != ']') {
SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
goto error;
}
/* check if interface name already exists */
interface = interface_newlist;
- while(interface)
- {
- if (!strcasecmp(interface->name, parameter+1))
- {
+ while(interface) {
+ if (!strcasecmp(interface->name, parameter+1)) {
SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
goto error;
}
}
ifparam = interface_param;
- while(ifparam->name)
- {
- if (!strcasecmp(parameter, ifparam->name))
- {
+ while(ifparam->name) {
+ if (!strcasecmp(parameter, ifparam->name)) {
if (ifparam->func(interface, filename, line, parameter, value))
goto error;
break;
struct interface_msn *ifmsn;
struct interface_screen *ifscreen;
- while(interface)
- {
+ while(interface) {
ifport = interface->ifport;
- while(ifport)
- {
+ while(ifport) {
selchannel = ifport->in_channel;
- while(selchannel)
- {
+ while(selchannel) {
temp = selchannel;
selchannel = selchannel->next;
FREE(temp, sizeof(struct select_channel));
memuse--;
}
selchannel = ifport->out_channel;
- while(selchannel)
- {
+ while(selchannel) {
temp = selchannel;
selchannel = selchannel->next;
FREE(temp, sizeof(struct select_channel));
memuse--;
}
ifmsn = interface->ifmsn;
- while(ifmsn)
- {
+ while(ifmsn) {
temp = ifmsn;
ifmsn = ifmsn->next;
FREE(temp, sizeof(struct interface_msn));
memuse--;
}
ifscreen = interface->ifscreen_in;
- while(ifscreen)
- {
+ while(ifscreen) {
temp = ifscreen;
ifscreen = ifscreen->next;
FREE(temp, sizeof(struct interface_screen));
memuse--;
}
ifscreen = interface->ifscreen_out;
- while(ifscreen)
- {
+ while(ifscreen) {
temp = ifscreen;
ifscreen = ifscreen->next;
FREE(temp, sizeof(struct interface_screen));
default_out_channel(ifport);
if (!ifport->in_channel)
default_in_channel(ifport);
+ /* must force the channel on PTMP/NT ports */
+ if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
+ ifport->channel_force = 1;
/* default is_tones */
if (ifport->interface->is_tones)
ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
else
- ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
+ ifport->mISDNport->tones = (ifport->mISDNport->ntmode || ifport->mISDNport->ss5)?1:0;
/* default is_earlyb */
if (ifport->interface->is_earlyb)
ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
else
- ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
+ ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode && !ifport->mISDNport->ss5)?0:1;
/* set locally flag */
if (ifport->interface->extension)
ifport->mISDNport->locally = 1;
/* unlink all mISDNports */
mISDNport = mISDNport_first;
- while(mISDNport)
- {
+ while(mISDNport) {
mISDNport->ifport = NULL;
mISDNport = mISDNport->next;
}
/* relink existing mISDNports */
interface = interface_newlist;
- while(interface)
- {
+ while(interface) {
ifport = interface->ifport;
- while(ifport)
- {
+ while(ifport) {
mISDNport = mISDNport_first;
- while(mISDNport)
- {
- if (mISDNport->portnum == ifport->portnum)
- {
+ while(mISDNport) {
+ if (!strcmp(mISDNport->name, ifport->portname))
+ ifport->portnum = mISDNport->portnum; /* same name, so we use same number */
+ if (mISDNport->portnum == ifport->portnum) {
+ PDEBUG(DEBUG_ISDN, "Port %d:%s relinking!\n", ifport->portnum, ifport->portname);
ifport->mISDNport = mISDNport;
mISDNport->ifport = ifport;
set_defaults(ifport);
/* close unused mISDNports */
closeagain:
mISDNport = mISDNport_first;
- while(mISDNport)
- {
- if (mISDNport->ifport == NULL)
- {
+ while(mISDNport) {
+ if (mISDNport->ifport == NULL) {
PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
/* remove all port objects and destroy port */
+#ifdef WITH_GSM_MS
+ if (ifport->gsm_ms)
+ gsm_ms_delete(ifport->gsm_ms_name);
+#endif
mISDNport_close(mISDNport);
goto closeagain;
}
/* open and link new mISDNports */
interface = interface_newlist;
- while(interface)
- {
+ while(interface) {
ifport = interface->ifport;
- while(ifport)
- {
- if (!ifport->mISDNport)
- {
+ while(ifport) {
+ if (!ifport->mISDNport) {
load_port(ifport);
}
ifport = ifport->next;
struct mISDNport *mISDNport;
/* open new port */
- mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->nt, ifport->l2hold, ifport->interface);
- if (mISDNport)
- {
+ mISDNport = mISDNport_open(ifport);
+ if (mISDNport) {
/* link port */
ifport->mISDNport = mISDNport;
mISDNport->ifport = ifport;
+ /* set number and name */
+ ifport->portnum = mISDNport->portnum;
+ SCPY(ifport->portname, mISDNport->name);
+ /* set defaults */
set_defaults(ifport);
- } else
- {
+ /* load static port instances */
+ mISDNport_static(mISDNport);
+#ifdef WITH_GSM_MS
+ if (ifport->gsm_ms)
+ gsm_ms_new(ifport->gsm_ms_name, ifport->gsm_ms_socket);
+#endif
+ } else {
ifport->block = 2; /* not available */
}
}
printf("[<name>]\n");
ifparam = interface_param;
- while(ifparam->name)
- {
+ while(ifparam->name) {
if (ifparam->name[0])
printf("%s %s\n", ifparam->name, ifparam->usage);
ifparam++;
}
ifparam = interface_param;
- while(ifparam->name)
- {
- if (ifparam->name[0])
- {
+ while(ifparam->name) {
+ if (ifparam->name[0]) {
printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
printf("%s\n", ifparam->help);
}
char suffix[64];
/* screen incoming caller id */
- if (!out)
- {
+ if (!out) {
/* check for MSN numbers, use first MSN if no match */
msn1 = NULL;
ifmsn = interface->ifmsn;
- while(ifmsn)
- {
+ while(ifmsn) {
if (!msn1)
msn1 = ifmsn->msn;
- if (!strcmp(ifmsn->msn, id))
- {
+ if (!strcmp(ifmsn->msn, id)) {
break;
}
ifmsn = ifmsn->next;
}
- if (ifmsn)
- {
- start_trace(0, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, DIRECTION_IN, 0, 0, "SCREEN (found in MSN list)");
+ if (ifmsn) {
+ start_trace(-1, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, DIRECTION_IN, 0, 0, "SCREEN (found in MSN list)");
add_trace("msn", NULL, "%s", id);
end_trace();
}
- if (!ifmsn && msn1) // not in list, first msn given
- {
- start_trace(0, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, DIRECTION_IN, 0, 0, "SCREEN (not found in MSN list)");
+ if (!ifmsn && msn1) { // not in list, first msn given
+ start_trace(-1, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, DIRECTION_IN, 0, 0, "SCREEN (not found in MSN list)");
add_trace("msn", "given", "%s", id);
add_trace("msn", "used", "%s", msn1);
end_trace();
ifscreen = interface->ifscreen_out;
else
ifscreen = interface->ifscreen_in;
- while (ifscreen)
- {
+ while (ifscreen) {
if (ifscreen->match_type==-1 || ifscreen->match_type==*type)
- if (ifscreen->match_present==-1 || ifscreen->match_present==*present)
- {
- if (strchr(ifscreen->match,'%'))
- {
+ if (ifscreen->match_present==-1 || ifscreen->match_present==*present) {
+ if (strchr(ifscreen->match,'%')) {
if (!strncmp(ifscreen->match, id, strchr(ifscreen->match,'%')-ifscreen->match))
break;
- } else
- {
+ } else {
if (!strcmp(ifscreen->match, id))
break;
}
}
ifscreen = ifscreen->next;
}
- if (ifscreen) // match
- {
- start_trace(0, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, out?DIRECTION_OUT:DIRECTION_IN, 0, 0, "SCREEN (found in screen list)");
- switch(*type)
- {
+ if (ifscreen) { // match
+ start_trace(-1, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, out?DIRECTION_OUT:DIRECTION_IN, 0, 0, "SCREEN (found in screen list)");
+ switch(*type) {
case INFO_NTYPE_UNKNOWN:
add_trace("given", "type", "unknown");
break;
add_trace("given", "type", "international");
break;
}
- switch(*present)
- {
+ switch(*present) {
case INFO_PRESENT_ALLOWED:
add_trace("given", "present", "allowed");
break;
break;
}
add_trace("given", "id", "%s", id[0]?id:"<empty>");
- if (ifscreen->result_type != -1)
- {
+ if (ifscreen->result_type != -1) {
*type = ifscreen->result_type;
- switch(*type)
- {
+ switch(*type) {
case INFO_NTYPE_UNKNOWN:
add_trace("used", "type", "unknown");
break;
break;
}
}
- if (ifscreen->result_present != -1)
- {
+ if (ifscreen->result_present != -1) {
*present = ifscreen->result_present;
- switch(*present)
- {
+ switch(*present) {
case INFO_PRESENT_ALLOWED:
add_trace("used", "present", "allowed");
break;
break;
}
}
- if (strchr(ifscreen->match,'%'))
- {
+ if (strchr(ifscreen->match,'%')) {
SCPY(suffix, strchr(ifscreen->match,'%') - ifscreen->match + id);
UNCPY(id, ifscreen->result, idsize);
id[idsize-1] = '\0';
- if (strchr(id,'%'))
- {
+ if (strchr(id,'%')) {
*strchr(id,'%') = '\0';
UNCAT(id, suffix, idsize);
id[idsize-1] = '\0';
}
- } else
- {
+ } else {
UNCPY(id, ifscreen->result, idsize);
id[idsize-1] = '\0';
}