#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <syslog.h>
#include <unistd.h>
#include <pcap.h>
int want_pppoe = 0;
static void cb_pppoe(const char *arg _unused_) { want_pppoe = 1; }
+static void cb_syslog(const char *arg _unused_) { want_syslog = 1; }
+
static void cb_verbose(const char *arg _unused_) { want_verbose = 1; }
int want_daemonize = 1;
{"-r", "file", cb_capfile, 0},
{"--snaplen", "bytes", cb_snaplen, 0},
{"--pppoe", NULL, cb_pppoe, 0},
+ {"--syslog", NULL, cb_syslog, 0},
{"--verbose", NULL, cb_verbose, 0},
{"--no-daemon", NULL, cb_no_daemon, 0},
{"--no-promisc", NULL, cb_no_promisc, 0},
for (arg = cmdline_args; arg->name != NULL; arg++)
if (strcmp(argv[0], arg->name) == 0) {
if ((arg->arg_name != NULL) && (argc == 1)) {
- printf("\nerror: argument \"%s\" requires parameter \"%s\"\n",
+ fprintf(stderr,
+ "error: argument \"%s\" requires parameter \"%s\"\n",
arg->name, arg->arg_name);
usage();
exit(EXIT_FAILURE);
}
if (arg->num_seen > 0) {
- printf("\nerror: already specified argument \"%s\"\n",
+ fprintf(stderr,
+ "error: already specified argument \"%s\"\n",
arg->name);
usage();
exit(EXIT_FAILURE);
return;
}
- printf("\nerror: illegal argument: \"%s\"\n", argv[0]);
+ fprintf(stderr, "error: illegal argument: \"%s\"\n", argv[0]);
usage();
exit(EXIT_FAILURE);
}
parse_sub_cmdline(argc, argv);
+ /* start syslogging as early as possible */
+ if (want_syslog) openlog("darkstat", LOG_NDELAY | LOG_PID, LOG_DAEMON);
+
/* some default values */
if (chroot_dir == NULL) chroot_dir = CHROOT_DIR;
if (privdrop_user == NULL) privdrop_user = PRIVDROP_USER;
/* darkstat 3
- * copyright (c) 2001-2008 Emil Mikulic.
+ * copyright (c) 2001-2009 Emil Mikulic.
*
* err.c: BSD-like err() and warn() functions
*
*/
#include "darkstat.h"
+#include "conv.h"
#include "err.h"
#include "pidfile.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <syslog.h>
#include <unistd.h>
#include <unistd.h>
+static void
+to_syslog(const char *type, const int want_err,
+ const char *format, va_list va)
+{
+ char buf[512];
+ size_t pos = 0;
+ int saved_errno = errno;
+
+ if (type != NULL) {
+ strlcpy(buf, type, sizeof(buf));
+ pos = strlen(buf);
+ }
+ vsnprintf(buf+pos, sizeof(buf)-pos, format, va);
+ if (want_err) {
+ strlcat(buf, ": ", sizeof(buf));
+ strlcat(buf, strerror(saved_errno), sizeof(buf));
+ }
+ syslog(LOG_DEBUG, "%s", buf);
+}
+
void
err(const int code, const char *format, ...)
{
va_list va;
- fprintf(stderr, "%5d: error: ", (int)getpid());
va_start(va, format);
- vfprintf(stderr, format, va);
+ if (want_syslog)
+ to_syslog("ERROR: ", 1, format, va);
+ else {
+ fprintf(stderr, "%5d: error: ", (int)getpid());
+ vfprintf(stderr, format, va);
+ fprintf(stderr, ": %s\n", strerror(errno));
+ }
va_end(va);
- fprintf(stderr, ": %s\n", strerror(errno));
pidfile_unlink();
exit(code);
}
{
va_list va;
- fprintf(stderr, "%5d: error: ", (int)getpid());
va_start(va, format);
- vfprintf(stderr, format, va);
+ if (want_syslog)
+ to_syslog("ERROR: ", 0, format, va);
+ else {
+ fprintf(stderr, "%5d: error: ", (int)getpid());
+ vfprintf(stderr, format, va);
+ fprintf(stderr, "\n");
+ }
va_end(va);
- fprintf(stderr, "\n");
pidfile_unlink();
exit(code);
}
{
va_list va;
- fprintf(stderr, "%5d: warning: ", (int)getpid());
va_start(va, format);
- vfprintf(stderr, format, va);
+ if (want_syslog)
+ to_syslog("WARNING: ", 1, format, va);
+ else {
+ fprintf(stderr, "%5d: warning: ", (int)getpid());
+ vfprintf(stderr, format, va);
+ fprintf(stderr, ": %s\n", strerror(errno));
+ }
va_end(va);
- fprintf(stderr, ": %s\n", strerror(errno));
}
void
{
va_list va;
- fprintf(stderr, "%5d: warning: ", (int)getpid());
va_start(va, format);
- vfprintf(stderr, format, va);
+ if (want_syslog)
+ to_syslog("WARNING: ", 0, format, va);
+ else {
+ fprintf(stderr, "%5d: warning: ", (int)getpid());
+ vfprintf(stderr, format, va);
+ fprintf(stderr, "\n");
+ }
va_end(va);
- fprintf(stderr, "\n");
}
/* We interlock verbosef() between processes by using a pipe with a single
}
}
-int want_verbose = 0;
+int want_verbose = 0, want_syslog = 0;
void
verbosef(const char *format, ...)
va_list va;
if (!want_verbose) return;
- lock();
- fprintf(stderr, "darkstat (%05d): ", (int)getpid());
va_start(va, format);
- vfprintf(stderr, format, va);
+ if (want_syslog)
+ to_syslog(NULL, 0, format, va);
+ else {
+ lock();
+ fprintf(stderr, "darkstat (%05d): ", (int)getpid());
+ vfprintf(stderr, format, va);
+ fprintf(stderr, "\n");
+ unlock();
+ }
va_end(va);
- fprintf(stderr, "\n");
- unlock();
}
void