1 #ifndef VLG_H
2 #define VLG_H 1
3 
4 #include <vstr.h>
5 #include <stdarg.h>
6 #include <errno.h>
7 
8 #include "date.h"
9 
10 #define VLG__TM_SYSLOG_SZ 128
11 
12 typedef struct Vlg
13 {
14  struct Vstr_base *out_vstr;
15  struct Vstr_base *sig_out_vstr;
16  const char *prog_name;
17  int syslog_fd;
18 
19  time_t tm_time;
20  char tm_data[VLG__TM_SYSLOG_SZ];
21 
22  time_t (*tm_get)(void);
23 
24  unsigned int syslog_stream : 1;
25  unsigned int log_pid : 1;
26  unsigned int out_dbg : 2;
27  unsigned int daemon_mode : 1;
28  unsigned int log_prefix_console : 1;
29 } Vlg;
30 
31 extern void vlg_init(void);
32 extern void vlg_exit(void);
33 
34 extern Vlg *vlg_make(void);
35 extern void vlg_free(Vlg *);
36 
37 extern void vlg_daemon(Vlg *, const char *);
38 extern void vlg_debug(Vlg *);
39 extern void vlg_undbg(Vlg *);
40 
41 extern int  vlg_pid_set(Vlg *, int);
42 extern int  vlg_prefix_set(Vlg *, int);
43 extern void vlg_time_set(Vlg *vlg, time_t (*func)(void));
44 
45 extern void vlg_pid_file(Vlg *, const char *);
46 
47 extern int  vlg_sc_fmt_add_all(Vstr_conf *);
48 extern void vlg_sc_bind_mount(const char *);
49 
50 extern void vlg_vabort(Vlg *, const char *fmt, va_list )
51    VSTR__COMPILE_ATTR_FMT(2, 0);
52 extern void vlg_verr(Vlg *, int, const char *fmt, va_list )
53    VSTR__COMPILE_ATTR_FMT(3, 0);
54 extern void vlg_vwarn(Vlg *, const char *fmt, va_list )
55    VSTR__COMPILE_ATTR_FMT(2, 0);
56 extern void vlg_vinfo(Vlg *, const char *fmt, va_list )
57    VSTR__COMPILE_ATTR_FMT(2, 0);
58 extern void vlg_vdbg1(Vlg *, const char *fmt, va_list )
59    VSTR__COMPILE_ATTR_FMT(2, 0);
60 extern void vlg_vdbg2(Vlg *, const char *fmt, va_list )
61    VSTR__COMPILE_ATTR_FMT(2, 0);
62 extern void vlg_vdbg3(Vlg *, const char *fmt, va_list )
63    VSTR__COMPILE_ATTR_FMT(2, 0);
64 
65 extern void vlg_abort(Vlg *, const char *fmt, ... )
66       VSTR__COMPILE_ATTR_FMT(2, 3);
67 extern void vlg_err(Vlg *, int, const char *fmt, ... )
68       VSTR__COMPILE_ATTR_FMT(3, 4);
69 extern void vlg_warn(Vlg *, const char *fmt, ... )
70       VSTR__COMPILE_ATTR_FMT(2, 3);
71 extern void vlg_info(Vlg *, const char *fmt, ... )
72       VSTR__COMPILE_ATTR_FMT(2, 3);
73 extern void vlg_dbg1(Vlg *, const char *fmt, ... )
74       VSTR__COMPILE_ATTR_FMT(2, 3);
75 extern void vlg_dbg2(Vlg *, const char *fmt, ... )
76       VSTR__COMPILE_ATTR_FMT(2, 3);
77 extern void vlg_dbg3(Vlg *, const char *fmt, ... )
78       VSTR__COMPILE_ATTR_FMT(2, 3);
79 
80 extern void vlg_sig_abort(Vlg *, const char *fmt, ... )
81       VSTR__COMPILE_ATTR_FMT(2, 3);
82 extern void vlg_sig_err(Vlg *, int, const char *fmt, ... )
83       VSTR__COMPILE_ATTR_FMT(3, 4);
84 extern void vlg_sig_warn(Vlg *, const char *fmt, ... )
85       VSTR__COMPILE_ATTR_FMT(2, 3);
86 extern void vlg_sig_info(Vlg *, const char *fmt, ... )
87       VSTR__COMPILE_ATTR_FMT(2, 3);
88 extern void vlg_sig_dbg1(Vlg *, const char *fmt, ... )
89       VSTR__COMPILE_ATTR_FMT(2, 3);
90 extern void vlg_sig_dbg2(Vlg *, const char *fmt, ... )
91       VSTR__COMPILE_ATTR_FMT(2, 3);
92 extern void vlg_sig_dbg3(Vlg *, const char *fmt, ... )
93       VSTR__COMPILE_ATTR_FMT(2, 3);
94 
95 #ifndef VLG_COMPILE_INLINE
96 # ifdef VSTR_AUTOCONF_NDEBUG
97 #  define VLG_COMPILE_INLINE 1
98 # else
99 #  define VLG_COMPILE_INLINE 0
100 # endif
101 #endif
102 
103 #if defined(VSTR_AUTOCONF_HAVE_INLINE) && VLG_COMPILE_INLINE
vlg_dbg1(Vlg * vlg,const char * fmt,...)104 extern inline void vlg_dbg1(Vlg *vlg, const char *fmt, ... )
105 {
106   va_list ap;
107 
108   if (vlg->out_dbg < 1)
109     return;
110 
111   va_start(ap, fmt);
112   vlg_vdbg1(vlg, fmt, ap);
113   va_end(ap);
114 }
vlg_dbg2(Vlg * vlg,const char * fmt,...)115 extern inline void vlg_dbg2(Vlg *vlg, const char *fmt, ... )
116 {
117   va_list ap;
118 
119   if (vlg->out_dbg < 2)
120     return;
121 
122   va_start(ap, fmt);
123   vlg_vdbg2(vlg, fmt, ap);
124   va_end(ap);
125 }
vlg_dbg3(Vlg * vlg,const char * fmt,...)126 extern inline void vlg_dbg3(Vlg *vlg, const char *fmt, ... )
127 {
128   va_list ap;
129 
130   if (vlg->out_dbg < 3)
131     return;
132 
133   va_start(ap, fmt);
134   vlg_vdbg3(vlg, fmt, ap);
135   va_end(ap);
136 }
137 #endif
138 
139 
140 #define VLG_WARN_GOTO(label, fmt) do {                \
141       vlg_warn fmt ;                                  \
142       goto label ;                                    \
143     } while (0)
144 #define VLG_WARN_RET(val, fmt) do {                   \
145       vlg_warn fmt ;                                  \
146       return val ;                                    \
147     } while (0)
148 #define VLG_WARN_RET_VOID(fmt) do {                   \
149       vlg_warn fmt ;                                  \
150       return;                                         \
151     } while (0)
152 
153 #define VLG_WARNNOMEM_GOTO(label, fmt) do {           \
154       errno = ENOMEM;                                 \
155       vlg_warn fmt ;                                  \
156       goto label ;                                    \
157     } while (0)
158 #define VLG_WARNNOMEM_RET(val, fmt) do {              \
159       errno = ENOMEM;                                 \
160       vlg_warn fmt ;                                  \
161       return val ;                                    \
162     } while (0)
163 
164 #define VLG_ERRNOMEM(fmt) do {                        \
165       errno = ENOMEM;                                 \
166       vlg_err fmt ;                                   \
167     } while (0)
168 
169 #endif
170