summaryrefslogtreecommitdiff
path: root/pppd_plugin/src/util.c
diff options
context:
space:
mode:
authorxeb <xeb@mail.ru>2009-06-17 00:56:34 +0400
committerxeb <xeb@mail.ru>2009-06-17 00:56:34 +0400
commitdf2441c834cf341d9b969dacc2dd8dac07cd588e (patch)
treeca0c7d8bade520ac35f5cd5c34dec54b136bd491 /pppd_plugin/src/util.c
downloadaccel-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.c158
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]);
+}
+