1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*
*
* Common things for all utilities
*
* Jan Kara <jack@suse.cz> - sponsored by SuSE CR
*
* Jani Jaakkola <jjaakkol@cs.helsinki.fi> - syslog support
*/
#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, int len)
{
strncpy(d, s, len);
d[len - 1] = 0;
}
void sstrncat(char *d, const char *s, int 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"), QUOTA_VERSION);
#if defined(RPC) || defined(EXT2_DIRECT)
printf(_("Compiled with "));
#if defined(RPC) && defined(EXT2_DIRECT)
puts(_("RPC and EXT2_DIRECT"));
#elif defined(RPC)
puts(_("RPC"));
#else
puts(_("EXT2_DIRECT"));
#endif /* defined RPC && EXT2_DIRECT */
#endif /* defined RPC || EXT2_DIRECT */
printf(_("Bugs to %s\n"), MY_EMAIL);
}
|