⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
		/* 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 + -