Improve error handling when writing
[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 int spawnvemu(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr, char *user);
32 int full_write(int fd, const void *buf, size_t count);
33 ssize_t full_read(int fd, void *buf, size_t len);
34 FILE *fopenat(DIR *d, const char *path, int flags);
35 void make_env(char **envp, ...);
36 void free_env(char **envp);
37 void init_log(const char *ident, int option, int facility, int lstderr);
38 int check_group(char *username, char *group);
39 void log_set_maxprio(int prio);
40
41 PRINTF_LIKE(0) NORETURN void fatal(const char *, ...);
42 PRINTF_LIKE(0) NORETURN void fatalpe(const char *, ...);
43 PRINTF_LIKE(0) NORETURN void badconf(const char *, ...);
44 PRINTF_LIKE(0) NORETURN void deny(const char *, ...);
45 PRINTF_LIKE(0) void error(const char *, ...);
46 PRINTF_LIKE(0) void warn(const char *, ...);
47 PRINTF_LIKE(0) void notice(const char *, ...);
48 PRINTF_LIKE(0) void debug(const char *, ...);
49 PRINTF_LIKE(0) void errorpe(const char *, ...);
50 PRINTF_LIKE(0) void warnpe(const char *, ...);
51 PRINTF_LIKE(1) void logmsg(int priority, const char *, ...);
52
53 static inline void *xmalloc(size_t size) {
54     void *alloc = malloc(size);
55
56     if (alloc == NULL)
57         fatal("out of memory");
58
59     return alloc;
60 }
61
62 static inline void *xrealloc(void *ptr, size_t size) {
63     void *alloc = realloc(ptr, size);
64
65     if (alloc == NULL)
66         fatal("out of memory");
67
68     return alloc;
69 }
70
71 static inline void *xcalloc(size_t nmemb, size_t size) {
72     void *alloc = calloc(nmemb, size);
73
74     if (alloc == NULL)
75         fatal("out of memory");
76
77     return alloc;
78 }
79
80 static inline char *xstrdup(const char *s) {
81     char *dup = strdup(s);
82
83     if (dup == NULL)
84         fatal("out of memory");
85
86     return dup;
87 }
88
89 #endif