Merge commit 'ceod'
[mspang/pyceo.git] / src / util.h
1 #ifndef CEO_UTIL_H
2 #define CEO_UTIL_H
3
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdarg.h>
8 #include <syslog.h>
9 #include <sys/types.h>
10 #include <dirent.h>
11
12 #include "strbuf.h"
13
14 #ifdef __GNUC__
15 #define NORETURN __attribute__((__noreturn__))
16 #define PRINTF_LIKE(extra) __attribute__((format(printf, extra+1, extra+2)))
17 #else
18 #define NORETURN
19 #define PRINTF_LIKE(extra)
20 #endif
21
22 #ifndef LOG_AUTHPRIV
23 #define LOG_AUTHPRIV LOG_AUTH
24 #endif
25
26 extern char **environ;
27
28 int spawnv(const char *path, char *const *argv);
29 int spawnv_msg(const char *path, char *const *argv, const struct strbuf *output);
30 int spawnvem(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr);
31 void full_write(int fd, const void *buf, size_t count);
32 ssize_t full_read(int fd, void *buf, size_t len);
33 FILE *fopenat(DIR *d, const char *path, int flags);
34 void make_env(char **envp, ...);
35 void free_env(char **envp);
36 void init_log(const char *ident, int option, int facility);
37 int check_group(char *username, char *group);
38
39 PRINTF_LIKE(0) NORETURN void fatal(const char *, ...);
40 PRINTF_LIKE(0) NORETURN void fatalpe(const char *, ...);
41 PRINTF_LIKE(0) NORETURN void badconf(const char *, ...);
42 PRINTF_LIKE(0) NORETURN void deny(const char *, ...);
43 PRINTF_LIKE(0) void error(const char *, ...);
44 PRINTF_LIKE(0) void warn(const char *, ...);
45 PRINTF_LIKE(0) void notice(const char *, ...);
46 PRINTF_LIKE(0) void debug(const char *, ...);
47 PRINTF_LIKE(0) void errorpe(const char *, ...);
48 PRINTF_LIKE(0) void warnpe(const char *, ...);
49 PRINTF_LIKE(1) void logmsg(int priority, const char *, ...);
50
51 static inline void *xmalloc(size_t size) {
52     void *alloc = malloc(size);
53
54     if (alloc == NULL)
55         fatal("out of memory");
56
57     return alloc;
58 }
59
60 static inline void *xrealloc(void *ptr, size_t size) {
61     void *alloc = realloc(ptr, size);
62
63     if (alloc == NULL)
64         fatal("out of memory");
65
66     return alloc;
67 }
68
69 static inline void *xcalloc(size_t nmemb, size_t size) {
70     void *alloc = calloc(nmemb, size);
71
72     if (alloc == NULL)
73         fatal("out of memory");
74
75     return alloc;
76 }
77
78 static inline char *xstrdup(const char *s) {
79     char *dup = strdup(s);
80
81     if (dup == NULL)
82         fatal("out of memory");
83
84     return dup;
85 }
86
87 #endif