diff options
author | xeb <xeb@mail.ru> | 2009-06-17 00:56:34 +0400 |
---|---|---|
committer | xeb <xeb@mail.ru> | 2009-06-17 00:56:34 +0400 |
commit | df2441c834cf341d9b969dacc2dd8dac07cd588e (patch) | |
tree | ca0c7d8bade520ac35f5cd5c34dec54b136bd491 /pppd_plugin/src/util.c | |
download | accel-ppp-xebd-df2441c834cf341d9b969dacc2dd8dac07cd588e.tar.gz accel-ppp-xebd-df2441c834cf341d9b969dacc2dd8dac07cd588e.zip |
initial import
Diffstat (limited to 'pppd_plugin/src/util.c')
-rw-r--r-- | pppd_plugin/src/util.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/pppd_plugin/src/util.c b/pppd_plugin/src/util.c new file mode 100644 index 0000000..dabddbe --- /dev/null +++ b/pppd_plugin/src/util.c @@ -0,0 +1,158 @@ +/* util.c ....... error message utilities. + * C. Scott Ananian <cananian@alumni.princeton.edu> + * + * $Id: util.c,v 1.11 2005/08/22 00:49:48 quozl Exp $ + */ + +#include <stdio.h> +#include <stdarg.h> +#include <syslog.h> +#include <unistd.h> +#include <stdlib.h> +#include "util.h" + +#ifndef PROGRAM_NAME +#define PROGRAM_NAME "pptp" +#endif + +/* implementation of log_string, defined as extern in util.h */ +char *log_string = "anon"; + +static void open_log(void) __attribute__ ((constructor)); +static void close_log(void) __attribute__ ((destructor)); + +#define MAKE_STRING(label) \ +va_list ap; \ +char buf[256], string[256]; \ +va_start(ap, format); \ +vsnprintf(buf, sizeof(buf), format, ap); \ +snprintf(string, sizeof(string), "%s %s[%s:%s:%d]: %s", \ + log_string, label, func, file, line, buf); \ +va_end(ap) + +/*** open log *****************************************************************/ +static void open_log(void) { + openlog(PROGRAM_NAME, LOG_PID, LOG_DAEMON); +} + +/*** close log ****************************************************************/ +static void close_log(void) +{ + closelog(); +} + +/*** print a message to syslog ************************************************/ +void _log(const char *func, const char *file, int line, const char *format, ...) +{ + MAKE_STRING("log"); + open_log(); + syslog(LOG_NOTICE, "%s", string); + close_log(); +} + +/*** print a warning to syslog ************************************************/ +void _warn(const char *func, const char *file, int line, const char *format, ...) +{ + MAKE_STRING("warn"); + open_log(); + fprintf(stderr, "%s\n", string); + syslog(LOG_WARNING, "%s", string); + close_log(); +} + +/*** print a fatal warning to syslog and exit *********************************/ +void _fatal(const char *func, const char *file, int line, const char *format, ...) +{ + MAKE_STRING("fatal"); + fprintf(stderr, "%s\n", string); + syslog(LOG_CRIT, "%s", string); + exit(1); +} + +/*** connect a file to a file descriptor **************************************/ +int file2fd(const char *path, const char *mode, int fd) +{ + int ok = 0; + FILE *file = NULL; + file = fopen(path, mode); + if (file != NULL && dup2(fileno(file), fd) != -1) + ok = 1; + if (file) fclose(file); + return ok; +} + +/* signal to pipe delivery implementation */ +#include <unistd.h> +#include <fcntl.h> +#include <signal.h> +#include <string.h> + +/* pipe private to process */ +static int sigpipe[2]; + +/* create a signal pipe, returns 0 for success, -1 with errno for failure */ +int sigpipe_create() +{ + int rc; + + rc = pipe(sigpipe); + if (rc < 0) return rc; + + fcntl(sigpipe[0], F_SETFD, FD_CLOEXEC); + fcntl(sigpipe[1], F_SETFD, FD_CLOEXEC); + +#ifdef O_NONBLOCK +#define FLAG_TO_SET O_NONBLOCK +#else +#ifdef SYSV +#define FLAG_TO_SET O_NDELAY +#else /* BSD */ +#define FLAG_TO_SET FNDELAY +#endif +#endif + + rc = fcntl(sigpipe[1], F_GETFL); + if (rc != -1) + rc = fcntl(sigpipe[1], F_SETFL, rc | FLAG_TO_SET); + if (rc < 0) return rc; + return 0; +#undef FLAG_TO_SET +} + +/* generic handler for signals, writes signal number to pipe */ +void sigpipe_handler(int signum) +{ + write(sigpipe[1], &signum, sizeof(signum)); + signal(signum, sigpipe_handler); +} + +/* assign a signal number to the pipe */ +void sigpipe_assign(int signum) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = sigpipe_handler; + sigaction(signum, &sa, NULL); +} + +/* return the signal pipe read file descriptor for select(2) */ +int sigpipe_fd() +{ + return sigpipe[0]; +} + +/* read and return the pending signal from the pipe */ +int sigpipe_read() +{ + int signum; + read(sigpipe[0], &signum, sizeof(signum)); + return signum; +} + +void sigpipe_close() +{ + close(sigpipe[0]); + close(sigpipe[1]); +} + |