summaryrefslogtreecommitdiffstats
path: root/src/notify.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/notify.c')
-rw-r--r--src/notify.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/notify.c b/src/notify.c
new file mode 100644
index 0000000..7cc432a
--- /dev/null
+++ b/src/notify.c
@@ -0,0 +1,195 @@
+/**
+ * Error notification
+ * Library: joedog
+ *
+ * Copyright (C) 2000-2013 by
+ * Jeffrey Fulmer - <jeff@joedog.org>, et. al.
+ * This file is distributed as part of Siege
+ *
+ * This program 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.
+ *
+ * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif/*HAVE_CONFIG_H*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <notify.h>
+#include <joedog/boolean.h>
+
+#define BUFSIZE 40000
+
+#define RESET 0
+#define BRIGHT 1
+#define DIM 2
+#define UNDERLINE 3
+#define BLINK 4
+#define REVERSE 7
+#define HIDDEN 8
+
+#define BLACK 0
+#define RED 1
+#define GREEN 2
+#define YELLOW 3
+#define BLUE 4
+#define MAGENTA 5
+#define CYAN 6
+#define WHITE 7
+
+typedef enum {
+ __LOG = 1,
+ __OUT = 2,
+} METHOD;
+
+static void __message(METHOD M, LEVEL L, const char *fmt, va_list ap);
+
+void
+OPENLOG(char *program)
+{
+ openlog(program, LOG_PID, LOG_DAEMON);
+ return;
+}
+
+void
+CLOSELOG(void)
+{
+ closelog();
+ return;
+}
+
+static void
+__message(METHOD M, LEVEL L, const char *fmt, va_list ap)
+{
+ char buf[BUFSIZE];
+ char msg[BUFSIZE+1024];
+ LEVEL level = WARNING;
+ char pmode[64];
+ char lmode[64];
+ memset(lmode, '\0', 64);
+ memset(pmode, '\0', 64);
+
+ vsprintf(buf, fmt, ap);
+ if (errno == 0 || errno == ENOSYS || L == DEBUG) {
+ snprintf(msg, sizeof msg, "%s\n", buf);
+ } else {
+ snprintf(msg, sizeof msg, "%s: %s\n", buf, strerror(errno));
+ }
+
+ switch (L) {
+ case NOTICE:
+ sprintf(pmode, "[%c[%d;%dmnotice%c[%dm]", 0x1B, BRIGHT, BLUE+30, 0x1B, RESET);
+ strcpy(lmode, "[notice]");
+ level = LOG_WARNING;
+ break;
+ case DEBUG:
+ sprintf(pmode, "[%c[%d;%dmdebug%c[%dm]", 0x1B, BRIGHT, BLUE+30, 0x1B, RESET);
+ strcpy(lmode, "[debug]");
+ level = LOG_WARNING;
+ break;
+ case WARNING:
+ sprintf(pmode, "[%c[%d;%dmalert%c[%dm]", 0x1B, BRIGHT, GREEN+30, 0x1B, RESET);
+ strcpy(lmode, "[alert] ");
+ level = LOG_WARNING;
+ break;
+ case ERROR:
+ sprintf(pmode, "[%c[%d;%dmerror%c[%dm]", 0x1B, BRIGHT, YELLOW+30, 0x1B, RESET);
+ strcpy(lmode, "[error]");
+ level = LOG_ERR;
+ break;
+ case FATAL:
+ sprintf(pmode, "[%c[%d;%dmfatal%c[%dm]", 0x1B, BRIGHT, RED+30, 0x1B, RESET);
+ strcpy(lmode, "[fatal]");
+ level = LOG_CRIT;
+ break;
+ }
+
+ if (M == __LOG) {
+ syslog(level, "%s %s", lmode, msg);
+ } else {
+ fflush(stdout);
+ fprintf(stderr, "%s %s", pmode, msg);
+ }
+ if (L==FATAL) { exit(1); }
+ return;
+}
+
+void
+SYSLOG(LEVEL L, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+
+ __message(__LOG, L, fmt, ap);
+ va_end(ap);
+
+ return;
+}
+
+void
+NOTIFY(LEVEL L, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+
+ __message(__OUT, L, fmt, ap);
+ va_end(ap);
+
+ return;
+}
+
+void
+__display(int color, const char *fmt, va_list ap)
+{
+ char buf[BUFSIZE];
+ char msg[BUFSIZE+1024];
+
+ vsprintf(buf, fmt, ap);
+ snprintf(msg, sizeof msg, "%c[%d;%dm%s%c[%dm\n", 0x1B, RESET, color+30, buf, 0x1B, RESET);
+ printf("%s", msg);
+ return;
+}
+
+void
+DISPLAY(int color, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ __display(color, fmt, ap);
+ va_end(ap);
+ return;
+}
+
+void
+VERBOSE(BOOLEAN verbose, const char *fmt, ...)
+{
+ va_list ap;
+
+ if (! verbose) return;
+
+ va_start(ap, fmt);
+
+ __message(__OUT, NOTICE, fmt, ap);
+ va_end(ap);
+
+ return;
+}
+
+