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

📄 exec.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
字号:
/* * * $Id: exec.c,v 1.13 2004/09/01 10:12:42 janakj Exp $ * * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of ser, a free SIP server. * * ser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: *    info@iptel.org * * ser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * History * -------- * 2003-02-28 scratchpad compatibility abandoned (jiri) * 2003-01-28 scratchpad removed * 2004-07-21 rewrite uri done via action() (bogdan) */#include "../../comp_defs.h"#include <stdio.h>#include <strings.h>#include <errno.h>#include <stdlib.h>#include <sys/types.h>/* #include <sys/resource.h>*/#include <sys/wait.h>#include "../../mem/mem.h"#include "../../error.h"#include "../../config.h"#include "../../parser/msg_parser.h"#include "../../dprint.h"#include "../../dset.h"#include "../../action.h"#include "config.h"int exec_msg(struct sip_msg *msg, char *cmd ){	FILE *pipe;	int exit_status;	int ret;	ret=-1; /* pessimist: assume error */	pipe=popen( cmd, "w" );	if (pipe==NULL) {		LOG(L_ERR, "ERROR: exec_msg: cannot open pipe: %s\n",			cmd);		ser_error=E_EXEC;		return -1;	}	if (fwrite(msg->buf, 1, msg->len, pipe)!=msg->len) {		LOG(L_ERR, "ERROR: exec_msg: error writing to pipe\n");		ser_error=E_EXEC;		goto error01;	}	/* success */	ret=1;error01:	if (ferror(pipe)) {		LOG(L_ERR, "ERROR: exec_str: error in pipe: %s\n",			strerror(errno));		ser_error=E_EXEC;		ret=-1;	}	exit_status=pclose(pipe);	if (WIFEXITED(exit_status)) { /* exited properly .... */		/* return false if script exited with non-zero status */		if (WEXITSTATUS(exit_status)!=0) ret=-1;	} else { /* exited erroneously */		LOG(L_ERR, "ERROR: exec_msg: cmd %s failed. "			"exit_status=%d, errno=%d: %s\n",			cmd, exit_status, errno, strerror(errno) );		ret=-1;	}	return ret;}int exec_str(struct sip_msg *msg, char *cmd, char *param, int param_len) {	struct action act;	int cmd_len;	FILE *pipe;		char *cmd_line;	int ret;	int l1;	char uri_line[MAX_URI_SIZE+1];	int uri_cnt;	int uri_len;	int exit_status;	/* pessimist: assume error by default */	ret=-1;		l1=strlen(cmd);cmd_len=l1+param_len+2;	cmd_line=pkg_malloc(cmd_len);	if (cmd_line==0) {		ret=ser_error=E_OUT_OF_MEM;		LOG(L_ERR, "ERROR: exec_str: no mem for command\n");		goto error00;	}	/* 'command parameter \0' */	memcpy(cmd_line, cmd, l1); cmd_line[l1]=' ';	memcpy(cmd_line+l1+1, param, param_len);cmd_line[l1+param_len+1]=0;		pipe=popen( cmd_line, "r" );	if (pipe==NULL) {		LOG(L_ERR, "ERROR: exec_str: cannot open pipe: %s\n",			cmd_line);		ser_error=E_EXEC;		goto error01;	}	/* read now line by line */	uri_cnt=0;	while( fgets(uri_line, MAX_URI_SIZE, pipe)!=NULL){		uri_len=strlen(uri_line);		/* trim from right */		while(uri_len && (uri_line[uri_len-1]=='\r' 				|| uri_line[uri_len-1]=='\n' 				|| uri_line[uri_len-1]=='\t'				|| uri_line[uri_len-1]==' ' )) {			DBG("exec_str: rtrim\n");			uri_len--;		}		/* skip empty line */		if (uri_len==0) continue;		/* ZT */		uri_line[uri_len]=0;		if (uri_cnt==0) {			memset(&act, 0, sizeof(act));			act.type = SET_URI_T;			act.p1_type = STRING_ST;			act.p1.string = uri_line;			if (do_action(&act, msg)<0) {				LOG(L_ERR,"ERROR:exec_str : SET_URI_T action failed\n");				ser_error=E_OUT_OF_MEM;				goto error02;			}		} else {			if (append_branch(msg, uri_line, uri_len, 0, 0, Q_UNSPECIFIED)==-1) {				LOG(L_ERR, "ERROR: exec_str: append_branch failed;"					" too many or too long URIs?\n");				goto error02;			}		}		uri_cnt++;	}	if (uri_cnt==0) {		LOG(L_ERR, "ERROR:exec_str: no uri from %s\n", cmd_line );		goto error02;	}	/* success */	ret=1;error02:	if (ferror(pipe)) {		LOG(L_ERR, "ERROR: exec_str: error in pipe: %s\n",			strerror(errno));		ser_error=E_EXEC;		ret=-1;	}	exit_status=pclose(pipe);	if (WIFEXITED(exit_status)) { /* exited properly .... */		/* return false if script exited with non-zero status */		if (WEXITSTATUS(exit_status)!=0) ret=-1;	} else { /* exited erroneously */		LOG(L_ERR, "ERROR: exec_str: cmd %s failed. "			"exit_status=%d, errno=%d: %s\n",			cmd, exit_status, errno, strerror(errno) );		ret=-1;	}error01:	pkg_free(cmd_line);error00:	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -