📄 sms.c
字号:
/* end of element */ if (modems[nr_of_modems].device[0]==0) { LOG(L_ERR,"ERROR:SMS parse config modems: modem %s has no device" " associated\n",modems[nr_of_modems].name); goto error; } if (modems[nr_of_modems].smsc[0]==0) { LOG(L_WARN,"WARNING:SMS parse config modem: modem %s has no sms" " center associated -> using the default one from modem\n", modems[nr_of_modems].name); } nr_of_modems++; eat_spaces(p); if (*p==';') { p++; eat_spaces(p); } } if (nr_of_modems==0) { LOG(L_ERR,"ERROR:SMS parse config modems - no modem found!\n"); goto error; } step++; /* parsing networks configuration string */ if ( (p = networks_config)==0) { LOG(L_ERR,"ERROR:SMS parse_config_lines: param \"networks\" not " "found\n"); goto error; } while (*p) { eat_spaces(p); /*get network name*/ start = p; while (*p!=' ' && *p!='\t' && *p!='[' && *p!=0) p++; if ( p==start || *p==0 ) goto parse_error; memcpy(networks[nr_of_networks].name, start, p-start); networks[nr_of_networks].name[p-start] = 0; networks[nr_of_networks].max_sms_per_call = 10; /*get network parameters*/ eat_spaces(p); if (*p!='[') goto parse_error; p++; while (*p!=']') { eat_spaces(p); start = p; while(*p!=' ' && *p!='\t' && *p!=']' && *p!=';' && *p!=0) p++; if ( p==start || *p==0 ) goto parse_error; if (set_network_arg( &(networks[nr_of_networks]), start, p)==-1) goto error; eat_spaces(p); if (*p==';') { p++; eat_spaces(p); } } if (*p!=']') goto parse_error; p++; /* end of element */ nr_of_networks++; eat_spaces(p); if (*p==';') p++; eat_spaces(p); } if (nr_of_networks==0) { LOG(L_ERR,"ERROR:SMS parse config networks - no network found!\n"); goto error; } step++; /* parsing links configuration string */ if ( (p = links_config)==0) { LOG(L_ERR,"ERROR:SMS parse_config_lines: param \"links\" not " "found\n"); goto error; } while (*p) { eat_spaces(p); /*get modem's device*/ start = p; while (*p!=' ' && *p!='\t' && *p!='[' && *p!=0) p++; if ( p==start || *p==0 ) goto parse_error; /*looks for modem index*/ for(mdm_nr=-1,i=0;i<nr_of_modems && mdm_nr==-1;i++) if (!strncasecmp(modems[i].name,start,p-start)&& modems[i].name[p-start]==0) mdm_nr = i; if (mdm_nr==-1) { LOG(L_ERR,"ERROR:sms_parse_conf_line: unknown modem %.*s \n,", (int)(p-start), start); goto error; } /*get associated networks list*/ eat_spaces(p); if (*p!='[') goto parse_error; p++; k=0; while (*p!=']') { eat_spaces(p); start = p; while(*p!=' ' && *p!='\t' && *p!=']' && *p!=';' && *p!=0) p++; if ( p==start || *p==0 ) goto parse_error; /* lookup for the network -> get its index */ for(net_nr=-1,i=0;i<nr_of_networks&&net_nr==-1;i++) if (!strncasecmp(networks[i].name,start,p-start) && networks[i].name[p-start]==0) net_nr = i; if (net_nr==-1) { LOG(L_ERR,"ERROR:SMS parse modem config - associated" " net <%.*s> not found in net list\n", (int)(p-start), start); goto error; } DBG("DEBUG:sms startup: linking net \"%s\" to modem \"%s\" on " "pos %d.\n",networks[net_nr].name,modems[mdm_nr].name,k); modems[mdm_nr].net_list[k++]=net_nr; eat_spaces(p); if (*p==';') { p++; eat_spaces(p); } } if (*p!=']') goto parse_error; p++; /* end of element */ eat_spaces(p); if (*p==';') { p++; eat_spaces(p); } } /* resolving default network name - if any*/ if (default_net_str) { for(net_nr=-1,i=0;i<nr_of_networks&&net_nr==-1;i++) if (!strcasecmp(networks[i].name,default_net_str)) net_nr = i; if (net_nr==-1) { LOG(L_ERR,"ERROR:SMS setting default net: network \"%s\"" " not found in net list!\n",default_net_str); goto error; } default_net = net_nr; } return 0;parse_error: LOG(L_ERR,"ERROR: SMS %s config: parse error before chr %d [%.*s]\n", (step==1)?"modems":(step==2?"networks":"links"), (int)(p - ((step==1)?modems_config: (step==2?networks_config:links_config))), (*p==0)?4:1,(*p==0)?"NULL":p );error: return -1;}int global_init(){ load_tm_f load_tm; int i, net_pipe[2], foo; char *p; struct socket_info* si; /* import the TM auto-loading function */ if ( !(load_tm=(load_tm_f)find_export("load_tm", NO_SCRIPT, 0))) { LOG(L_ERR, "ERROR: sms: global_init: cannot import load_tm\n"); goto error; } /* let the auto-loading function load all TM stuff */ if (load_tm( &tmb )==-1) goto error; /*fix domain length*/ if (domain_str) { domain.s = domain_str; domain.len = strlen(domain_str); } else { si=get_first_socket(); if (si==0){ LOG(L_CRIT, "BUG: sms_init_child: null listen socket list\n"); goto error; } /*do I have to add port?*/ i = (si->port_no_str.len && si->port_no!=5060); domain.len = si->name.len + i*(si->port_no_str.len+1); domain.s = (char*)pkg_malloc(domain.len); if (!domain.s) { LOG(L_ERR,"ERROR:sms_init_child: no free pkg memory!\n"); goto error; } p = domain.s; memcpy(p,si->name.s,si->name.len); p += si->name.len; if (i) { *p=':'; p++; memcpy(p,si->port_no_str.s, si->port_no_str.len); p += si->port_no_str.len; } } /* creates pipes for networks */ for(i=0;i<nr_of_networks;i++) { /* create the pipe*/ if (pipe(net_pipe)==-1) { LOG(L_ERR,"ERROR: sms_global_init: cannot create pipe!\n"); goto error; } networks[i].pipe_out = net_pipe[0]; net_pipes_in[i] = net_pipe[1]; /* sets reading from pipe to non blocking */ if ((foo=fcntl(net_pipe[0],F_GETFL,0))<0) { LOG(L_ERR,"ERROR: sms_global_init: cannot get flag for pipe" " - fcntl\n"); goto error; } foo |= O_NONBLOCK; if (fcntl(net_pipe[0],F_SETFL,foo)<0) { LOG(L_ERR,"ERROR: sms_global_init: cannot set flag for pipe" " - fcntl\n"); goto error; } } /* if report will be used, init the report queue */ if (sms_report_type!=NO_REPORT && !init_report_queue()) { LOG(L_ERR,"ERROR: sms_global_init: cannot get shm memory!\n"); goto error; } /* alloc in shm for queued_msgs */ queued_msgs = (int*)shm_malloc(sizeof(int)); if (!queued_msgs) { LOG(L_ERR,"ERROR: sms_global_init: cannot get shm memory!\n"); goto error; } *queued_msgs = 0; return 1;error: return -1;}int sms_child_init(int rank){ int i, foo; /* only the child 1 will execute this */ if (rank != 1) goto done; /* creates processes for each modem */ for(i=0;i<nr_of_modems;i++) { if ( (foo=fork())<0 ) { LOG(L_ERR,"ERROR: sms_child_init: cannot fork \n"); goto error; } if (!foo) { modem_process(&(modems[i])); goto done; } }done: return 0;error: return-1;}static int sms_init(void){ LOG(L_INFO,"SMS - initializing\n"); if (parse_config_lines()==-1) return -1; if (global_init()==-1) return -1; return 0;}static int sms_exit(void){ if ((!domain_str) && (domain.s)) pkg_free(domain.s); if (queued_msgs) shm_free(queued_msgs); if (sms_report_type!=NO_REPORT) destroy_report_queue(); return 0;}static int w_sms_send_msg(struct sip_msg *msg, char *foo, char *bar){ return push_on_network(msg, default_net);}static int w_sms_send_msg_to_net(struct sip_msg *msg, char *net_nr, char *foo){ return push_on_network(msg,(unsigned int)(unsigned long)net_nr);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -