summaryrefslogtreecommitdiff
path: root/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'common.c')
-rw-r--r--common.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/common.c b/common.c
new file mode 100644
index 0000000..69e6178
--- /dev/null
+++ b/common.c
@@ -0,0 +1,127 @@
+/*
+ *
+ * Common things for all utilities
+ *
+ * Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ *
+ * Jani Jaakkola <jjaakkol@cs.helsinki.fi> - syslog support
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <syslog.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "pot.h"
+#include "common.h"
+
+static int enable_syslog=0;
+
+void use_syslog(void)
+{
+ openlog(progname,0,LOG_DAEMON);
+ enable_syslog=1;
+}
+
+static void do_syslog(int level, const char *format, va_list args)
+{
+ char buf[1024];
+ int i, j;
+
+ vsnprintf(buf,sizeof(buf),format,args);
+ /* This while removes newlines from the log, so that
+ * syslog() will be called once for every line */
+ for (i = 0; buf[i]; i = j) {
+ for (j = i; buf[j] && buf[j] != '\n'; j++);
+ if (buf[j] == '\n')
+ buf[j++] = '\0';
+ syslog(level, "%s", buf + i);
+ }
+}
+
+void die(int ret, char *fmtstr, ...)
+{
+ va_list args;
+
+ va_start(args, fmtstr);
+ if (enable_syslog) {
+ do_syslog(LOG_CRIT, fmtstr, args);
+ syslog(LOG_CRIT, "Exiting with status %d", ret);
+ } else {
+ fprintf(stderr, "%s: ", progname);
+ vfprintf(stderr, fmtstr, args);
+ }
+ va_end(args);
+ exit(ret);
+}
+
+void errstr(char *fmtstr, ...)
+{
+ va_list args;
+
+ va_start(args, fmtstr);
+ if (enable_syslog)
+ do_syslog(LOG_ERR, fmtstr, args);
+ else {
+ fprintf(stderr, "%s: ", progname);
+ vfprintf(stderr, fmtstr, args);
+ }
+ va_end(args);
+}
+
+void *smalloc(size_t size)
+{
+ void *ret = malloc(size);
+
+ if (!ret) {
+ fputs("Not enough memory.\n", stderr);
+ exit(3);
+ }
+ return ret;
+}
+
+void *srealloc(void *ptr, size_t size)
+{
+ void *ret = realloc(ptr, size);
+
+ if (!ret) {
+ fputs("Not enough memory.\n", stderr);
+ exit(3);
+ }
+ return ret;
+}
+
+void sstrncpy(char *d, const char *s, size_t len)
+{
+ strncpy(d, s, len);
+ d[len - 1] = 0;
+}
+
+void sstrncat(char *d, const char *s, size_t len)
+{
+ strncat(d, s, len);
+ d[len - 1] = 0;
+}
+
+char *sstrdup(const char *s)
+{
+ char *r = strdup(s);
+
+ if (!r) {
+ puts("Not enough memory.");
+ exit(3);
+ }
+ return r;
+}
+
+void version(void)
+{
+ printf(_("Quota utilities version %s.\n"), PACKAGE_VERSION);
+ printf(_("Compiled with:%s\n"), COMPILE_OPTS);
+ printf(_("Bugs to %s\n"), MY_EMAIL);
+}