ferrule.c

来自「OTP是开放电信平台的简称」· C语言 代码 · 共 160 行

C
160
字号
/* ``The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved via the world wide web at http://www.erlang.org/. *  * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. *  * The Initial Developer of the Original Code is Ericsson Utvecklings AB. * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings * AB. All Rights Reserved.'' *  *     $Id$ */#include 	<stdio.h>#include 	<string.h>#include 	<stropts.h>#include 	<poll.h>#include 	<unistd.h>#include 	<sys/types.h>#include 	<sys/stat.h>#include	<fcntl.h>#include	<sys/uio.h>	/* arguments */#define		OWNPATH		1#define		NARG		1	/* status codes */#define		OK		0#define 	NOT_OK		1	/* hardwired constants*/#define 	PIPENAME	"syslog.otp"#define		DIE_CMD		"die"#define		ONLY_STDIN_CMD	"only_stdin"#define 	BUFFER_SIZE	1001#define 	MAXPATH_SIZE	1001#define		STDIN		0#define		STDOUT		1#define		HEADER_SIZE	2#define		WAIT		10#define		INTERVAL	1#define		FALSE		0#define		TRUE		1#define		FDS_STDIN	0#define		FDS_PIPE	1main(int argc, char *argv[])/*	usage: ferrule ownpath */{    int		i, pipe_fd;    long	int	nfds=2L;    char	buf[BUFFER_SIZE], pipename[MAXPATH_SIZE], packet_size[2];    struct	pollfd	fds[2];    struct	stat	stat_buf;        /* enough arguments? */    if(argc < NARG+1)	exit(NOT_OK);        /* make pipe name */    strcpy(pipename, argv[OWNPATH]);    strcat(pipename, "/");    strcat(pipename, PIPENAME);        /* wait for creation of pipe */    for(i=WAIT; i>0; i--)	if(stat(pipename, &stat_buf) == 0)	    break;	else{	    if(i == 0)		exit(NOT_OK);	    else		sleep(INTERVAL);	}        /* open pipe, exit if error */    if((pipe_fd = open(pipename, O_RDONLY | O_NONBLOCK)) == -1)	exit(NOT_OK);        /* setup for pipe */    fds[FDS_PIPE].fd = pipe_fd;    fds[FDS_PIPE].events = POLLRDNORM;    fds[FDS_PIPE].revents = 0;        /* setup for stdin */    fds[FDS_STDIN].fd = STDIN;    fds[FDS_STDIN].events = POLLRDNORM;    fds[FDS_STDIN].revents = 0;        /* loop */    while(1){	/* wait for input */	if(poll(&fds[0], nfds, INFTIM) == -1)	    exit(NOT_OK);	/* analyse input from pipe */	if(fds[FDS_PIPE].revents != 0){	    /* pipe error, error exit */	    if((fds[FDS_PIPE].revents & (POLLHUP | POLLERR | POLLNVAL)) != 0)		exit(NOT_OK);	    /* read pipe and write to stdout, exit if error */	    if((fds[FDS_PIPE].revents & POLLRDNORM) != 0){		i=0;		do{		    read(pipe_fd, &buf[i++], (size_t)1);		}while(buf[i-1] != '\n');		i--;		/* send if string is not empty */		if(i != 0){		    /* make packet size, [0]=MSB, [1]=LSB */		    packet_size[0] = (i >> 8) & 0xff;		    packet_size[1] = i & 0xff;		    /* send to OTP process */		    if(write(STDOUT, packet_size, HEADER_SIZE) != HEADER_SIZE)			exit(NOT_OK);		    if(write(STDOUT, buf, i) != i)			exit(NOT_OK);		}	    }	}	/* analyse input from stdin */	if(fds[FDS_STDIN].revents != 0){	    /* error exit */	    if((fds[FDS_STDIN].revents & (POLLHUP | POLLERR | POLLNVAL)) != 0)		exit(NOT_OK);	    /* read bytes */	    if((fds[FDS_STDIN].revents & POLLRDNORM) != 0){		/* get packet size, [0]=MSB, [1]=LSB */		if(read(STDIN, packet_size, HEADER_SIZE) != HEADER_SIZE)		    exit(NOT_OK);		i = (packet_size[0] << 8) | packet_size[1];		/* get packet */		if(read(STDIN, buf, i) != i)		    exit(NOT_OK);		/* check if die command */		if(strncmp(DIE_CMD, buf, i) == FALSE)		    exit(OK);		/* check if only_stdin command */		if(strncmp(ONLY_STDIN_CMD, buf, i) == FALSE)		    nfds=1L;	    }	}    }}

⌨️ 快捷键说明

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