Add init script for 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, int lstderr);
37 int check_group(char *username, char *group);
38 void log_set_maxprio(int prio);
39
40 PRINTF_LIKE(0) NORETURN void fatal(const char *, ...);
41 PRINTF_LIKE(0) NORETURN void fatalpe(const char *, ...);
42 PRINTF_LIKE(0) NORETURN void badconf(const char *, ...);
43 PRINTF_LIKE(0) NORETURN void deny(const char *, ...);
44 PRINTF_LIKE(0) void error(const char *, ...);
45 PRINTF_LIKE(0) void warn(const char *, ...);
46 PRINTF_LIKE(0) void notice(const char *, ...);
47 PRINTF_LIKE(0) void debug(const char *, ...);
48 PRINTF_LIKE(0) void errorpe(const char *, ...);
49 PRINTF_LIKE(0) void warnpe(const char *, ...);
50 PRINTF_LIKE(1) void logmsg(int priority, const char *, ...);
51
52 static inline void *xmalloc(size_t size) {
53     void *alloc = malloc(size);
54
55     if (alloc == NULL)
56         fatal("out of memory");
57
58     return alloc;
59 }
60
61 static inline void *xrealloc(void *ptr, size_t size) {
62     void *alloc = realloc(ptr, size);
63
64     if (alloc == NULL)
65         fatal("out of memory");
66
67     return alloc;
68 }
69
70 static inline void *xcalloc(size_t nmemb, size_t size) {
71     void *alloc = calloc(nmemb, size);
72
73     if (alloc == NULL)
74         fatal("out of memory");
75
76     return alloc;
77 }
78
79 static inline char *xstrdup(const char *s) {
80     char *dup = strdup(s);
81
82     if (dup == NULL)
83         fatal("out of memory");
84
85     return dup;
86 }
87
88 #endif