aboutsummaryrefslogtreecommitdiffstats
path: root/libglouglou/utils.c
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2012-12-02 19:41:08 +0100
committerLaurent Ghigonis <laurent@p1sec.com>2012-12-02 19:41:08 +0100
commit49ed06bd05ca0998e0028e2c654282c4c3214cf3 (patch)
treebd9a55a570c1c8cac1787018f6977837a2a98c37 /libglouglou/utils.c
parentadd some evdns spikes (diff)
downloadglouglou-49ed06bd05ca0998e0028e2c654282c4c3214cf3.tar.xz
glouglou-49ed06bd05ca0998e0028e2c654282c4c3214cf3.zip
source cleanup and utils improvements
* move utils functions to utils.c * add log functions * use an ifndef for the whole libglouglou.h for multiple inclusion * move gg_packet_props to libglougloud.c and set it as extern in libglouglou.h
Diffstat (limited to 'libglouglou/utils.c')
-rw-r--r--libglouglou/utils.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/libglouglou/utils.c b/libglouglou/utils.c
new file mode 100644
index 0000000..4f53afa
--- /dev/null
+++ b/libglouglou/utils.c
@@ -0,0 +1,196 @@
+#include <sys/types.h>
+
+#if !defined(__OpenBSD__)
+#define __USE_GNU
+#define _GNU_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <err.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <pwd.h>
+#include <grp.h>
+#include <string.h>
+
+#include "libglouglou.h"
+
+FILE *_logfile;
+static int _loglevel;
+
+static void logit(int, const char *, const char *, va_list);
+
+/*
+ * Log
+ * handles only one log file per process
+ */
+
+int
+log_init(char *filename, int level)
+{
+ _logfile = fopen(filename, "a+");
+ if (!_logfile) {
+ printf("cannot open log file %s!\n", filename);
+ return -1;
+ }
+ _loglevel = level;
+ return 0;
+}
+
+void
+log_shutdown(void)
+{
+ fclose(_logfile);
+}
+
+void
+log_tmp(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(GGLOG_FORCED, "XXX ", msg, ap);
+ va_end(ap);
+}
+
+void
+log_debug(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(GGLOG_DEBUG, "", msg, ap);
+ va_end(ap);
+}
+
+void
+log_info(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(GGLOG_INFO, "", msg, ap);
+ va_end(ap);
+}
+
+void
+log_warn(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(GGLOG_WARN, "", msg, ap);
+ va_end(ap);
+}
+
+#if defined(__OpenBSD__)
+void __dead
+#else
+void
+#endif
+fatal(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(GGLOG_FATAL, "fatal: ", msg, ap);
+ va_end(ap);
+
+ exit(1);
+}
+
+/* XXX mpsafe */
+static void
+logit(int level, const char *prefix, const char *msg, va_list ap)
+{
+ time_t clock;
+
+ if (level <= _loglevel) {
+ time(&clock);
+ fprintf(_logfile, "%d ", (int)clock);
+ vfprintf(_logfile, prefix, ap);
+ vfprintf(_logfile, msg, ap);
+ fprintf(_logfile, "\n");
+ fflush(_logfile);
+ }
+}
+
+/*
+ * Various utils
+ */
+
+void *
+xmalloc(size_t size)
+{
+ void *data;
+
+ data = malloc(size);
+ if (!data)
+ err(1, "could not malloc %d", (int)size);
+ return data;
+}
+
+void *
+xcalloc(size_t nmemb, size_t size)
+{
+ void *data;
+
+ data = calloc(nmemb, size);
+ if (!data)
+ err(1, "could not calloc %d", (int)size);
+ return data;
+}
+
+void
+fd_nonblock(int fd)
+{
+ int flags = fcntl(fd, F_GETFL, 0);
+ int rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+ if (rc == -1)
+ err(1, "failed to set fd %i non-blocking", fd);
+}
+
+void
+addrcpy(struct sockaddr_in *dst, struct sockaddr_in *src)
+{
+ dst->sin_addr.s_addr = src->sin_addr.s_addr;
+ dst->sin_port = src->sin_port;
+ dst->sin_family = src->sin_family;
+}
+
+int
+addrcmp(struct sockaddr_in *a, struct sockaddr_in *b)
+{
+ if (a->sin_addr.s_addr != b->sin_addr.s_addr)
+ return -1;
+ if (a->sin_port != b->sin_port)
+ return -2;
+ if (a->sin_family != b->sin_family)
+ return -3;
+ return 0;
+}
+
+void
+droppriv(char *user)
+{
+ struct passwd *pw;
+
+ pw = getpwnam(user);
+ if (!pw)
+ err(1, "unknown user %s", user);
+ if (chroot(pw->pw_dir) != 0)
+ err(1, "unable to chroot");
+ if (chdir("/") != 0)
+ err(1, "unable to chdir");
+ if (setgroups(1, &pw->pw_gid) == -1)
+ err(1, "setgroups() failed");
+ if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1)
+ err(1, "setresgid failed");
+ if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1)
+ err(1, "setresuid() failed");
+ endpwent();
+}
+