diff options
Diffstat (limited to 'lib/os_mon/c_src/mod_syslog.c')
-rw-r--r-- | lib/os_mon/c_src/mod_syslog.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/lib/os_mon/c_src/mod_syslog.c b/lib/os_mon/c_src/mod_syslog.c new file mode 100644 index 0000000000..87fbfbac22 --- /dev/null +++ b/lib/os_mon/c_src/mod_syslog.c @@ -0,0 +1,137 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 1996-2009. All Rights Reserved. + * + * 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 online 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. + * + * %CopyrightEnd% + */ +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <signal.h> + + /* arguments */ +#define MODE 1 +#define OWNPATH 2 +#define SYSLOGCONF 3 +#define NARG 3 + + /* status codes */ +#define OK 0 +#define ARG_ERROR -1 +#define FILE_ERROR -2 +#define KILL_ERROR -3 +#define PIPE_NOT_FOUND 1 + + /* hardwired */ +#define SYSLOG_PID "/etc/syslog.pid" +#define PIPENAME "syslog.otp" +#define SYSLOGCONF_ORIG "syslog.conf.ORIG" +#define SYSLOGCONF_OTP "syslog.conf.OTP" +#define BUFFER_SIZE 1001 +#define MAXNAME_SIZE 1001 +#define FALSE 0 +#define TRUE 1 +#define WAIT 1 + +main(int argc, char *argv[]) +/* usage: mod_syslog mode ownpath syslogconf */ +{ + int syslogd_pid, n_lines_copied=0; + int otp_sw, find_sw=FALSE; + char buf[BUFFER_SIZE], pipename[MAXNAME_SIZE], srcname[MAXNAME_SIZE]; + FILE *srcfile, *destfile, *pidfile; + + void make_exit(int); + + /* enough arguments? */ + if(argc < NARG+1) + make_exit(ARG_ERROR); + + /* enable OTP or not */ + if(strcmp(argv[MODE], "otp") == 0) + otp_sw = TRUE; + else if(strcmp(argv[MODE], "nootp") == 0) + otp_sw = FALSE; + else + make_exit(ARG_ERROR); + + /* make pipename */ + strcpy(pipename, argv[OWNPATH]); + strcat(pipename, "/"); + strcat(pipename, PIPENAME); + + /* remove old pipe and make a new one */ + if(otp_sw){ + /* remove */ + unlink(pipename); + + /* make a new */ + if(mknod(pipename, S_IFIFO | S_IRUSR | S_IWUSR | S_IRGRP | + S_IWGRP | S_IROTH | S_IWOTH, (dev_t)0) != 0) + make_exit(FILE_ERROR); + } + + /* make source filename */ + strcpy(srcname, argv[OWNPATH]); + strcat(srcname, "/"); + strcat(srcname, otp_sw?SYSLOGCONF_OTP:SYSLOGCONF_ORIG); + + /* open source and destination, exit if error */ + if((srcfile = fopen(srcname, "r")) == NULL || + (destfile = fopen(argv[SYSLOGCONF], "w")) == NULL) + make_exit(FILE_ERROR); + + /* copy source and destination, exit if error */ + while(fgets(buf, BUFFER_SIZE-1, srcfile) != NULL){ + /* find_sw |= strstr(buf, PIPENAME) != NULL; */ + n_lines_copied++; + if(fputs(buf, destfile) == EOF) + make_exit(FILE_ERROR); + } + if(ferror(srcfile) || n_lines_copied == 0) + make_exit(FILE_ERROR); + + /* open pidfile, exit if error */ + if((pidfile = fopen(SYSLOG_PID, "r")) == NULL) + make_exit(FILE_ERROR); + + /* read pid for syslogd, exit if error */ + if(fscanf(pidfile, "%d", &syslogd_pid) == 0) + make_exit(FILE_ERROR); + + /* send HUP to syslogd, exit if error */ + if(syslogd_pid < 0 || kill((pid_t)syslogd_pid, SIGHUP) != 0) + make_exit(KILL_ERROR); + + /* remove pipe */ + if(!otp_sw){ + sleep((unsigned)WAIT); + unlink(pipename); + } + + /* ending successful or with warning */ + /* if(!find_sw && otp_sw) + make_exit(PIPE_NOT_FOUND); + else */ + make_exit(OK); +} + +void make_exit(int exit_code) +{ + printf("%d", exit_code); + exit(0); +} |