diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2012-12-02 19:41:08 +0100 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2012-12-02 19:41:08 +0100 |
commit | 49ed06bd05ca0998e0028e2c654282c4c3214cf3 (patch) | |
tree | bd9a55a570c1c8cac1787018f6977837a2a98c37 /libglouglou/utils.c | |
parent | add some evdns spikes (diff) | |
download | glouglou-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.c | 196 |
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(); +} + |