1 #include "global.h"
2 
3 
4 int pval;
5 
6 
ErrOut(const char Mode,const char * func,const char * fmt,...)7 int ErrOut(const char Mode, const char *func, const char *fmt, ...) {
8     FILE *errout;
9     va_list args;
10 
11     if (icfg.Mode == 5) {
12 	errout = stdout;
13 	SAfputs("<!-- ", errout);
14     } else errout = stderr;
15 
16     switch(Mode) {
17 	case 2: SAfputs("SAWARNING", errout); break;
18 	case 1: SAfputs("SADEBUG", errout); break;
19 	case 0: SAfputs("SAERROR", errout); break;
20     }
21 
22     SAfprintf(errout, ": [%s] ", func);
23     va_start(args, fmt);
24     SAvfprintf(errout, fmt, args);
25     va_end(args);
26 
27     if (icfg.Mode == 5) SAfputs(" -->\n", errout);
28     else SAfputs("\n", stderr);
29     fflush(errout);
30 
31     if (!Mode) exit(EXIT_FAILURE);
32 
33     return 0;
34 }
35 
36 
SAshow(const char * fmt,...)37 void SAshow(const char *fmt, ...) {
38     va_list args;
39 
40     va_start(args, fmt);
41     SAvfprintf(stdout, fmt, args);
42     va_end(args);
43 }
44 
45 
SAsystem(const char * program,...)46 void SAsystem(const char *program, ...) {
47     pid_t tpid;
48     int tmp = 0, status;
49     va_list args;
50     char *argsarray[ARGSCOUNT];
51 
52     tpid = fork();
53     if (tpid == 0) {
54 	va_start(args, program);
55 
56 	for (argsarray[0] = SAstrdup(program); (argsarray[tmp] = va_arg(args, char *)) != NULL; tmp++);
57 
58 #if DEBUG >= 2
59 	SAdebug ("Executing '%s' with next arguments:", program);
60 	for (tmp = 0; argsarray[tmp] != NULL; tmp++) {
61 	    SAdebug ("%d. '%s'", tmp, argsarray[tmp]);
62 	}
63 #endif
64 
65 	execv(program, argsarray);
66 	SAexit("Can't execute %s", program);
67     }
68     va_end(args);
69 
70     if (waitpid(tpid, &status, 0) < 0) SAexit("waitpid %s, %s", program, strerror(errno));
71     if (WIFSIGNALED(status)) SAexit("%s got signal", program);
72     if (WIFEXITED(status)) if (!WEXITSTATUS(status)) return;
73 
74     /* Some error during execution occured */
75     SAexit("%s returned %d", program, WEXITSTATUS(status));
76 }
77 
78 
SAinet_pton(const char * src,in_addr_t * dst)79 char SAinet_pton(const char *src, in_addr_t *dst) {
80     struct in_addr tdst;
81 
82     if (inet_pton(AF_INET, src, &tdst) != 1) {
83 	SAwarning("Incorrect IP when converting from string: %s", src);
84 	return 0;
85     }
86 
87     *dst = tdst.s_addr;
88     return 1;
89 }
90 
91 
SAinet_ntop(in_addr_t * src)92 char *SAinet_ntop(in_addr_t *src) {
93     static char retval[INET_ADDRSTRLEN];
94     struct in_addr tsrc;
95 
96     tsrc.s_addr = *src;
97     if (inet_ntop(AF_INET, &tsrc, retval, INET_ADDRSTRLEN) == NULL) SAexit("Error converting IP to string. %s", strerror(errno));
98 
99     return retval;
100 }
101 
102 
SAmalloc(size_t size)103 void *SAmalloc(size_t size) {
104     void *retval;
105     if ((retval = malloc(size)) == NULL) SAexit("No free memory available");
106     return retval;
107 }
108 
109 
SArealloc(void * ptr,size_t size)110 void *SArealloc(void *ptr, size_t size) {
111     void *retval;
112     if ((retval = realloc(ptr, size)) == NULL) SAexit("No free memory available");
113     return retval;
114 }
115 
116 
SAstrdup(const char * src)117 char *SAstrdup(const char *src) {
118     char *retval;
119     if ((retval = strdup(src)) == NULL) SAexit("No free memory available");
120     return retval;
121 }
122 
123 
SAstrldup(const char * src,size_t size)124 char *SAstrldup(const char *src, size_t size) {
125     char *retval;
126     size_t tsize;
127 
128 #if DEBUG >= 1
129     if ((tsize = strlen(src) + 1L) > size) SAwarning("String [%s] was trunkated by %zd bytes", src, tsize - size);
130 #endif
131     tsize = SAmin(strlen(src) + 1L, size);
132     retval = SAmalloc(tsize);
133     SAstrlcpy(retval, src, tsize);
134 
135     return retval;
136 }
137 
138 
SApstrcmp(const char ** el1,const char ** el2)139 int SApstrcmp(const char **el1, const char **el2) {
140     return strcmp(*el1, *el2);
141 }
142 
143 
SAsetlocale(int category,const char * locale)144 char *SAsetlocale(int category, const char *locale) {
145     char *retval;
146     if ((retval = setlocale(category, locale)) == NULL) SAexit("Can't initialize '%s' locale", locale);
147     return retval;
148 }
149 
150 
SAmktime(struct tm * tm)151 time_t SAmktime(struct tm *tm) {
152     time_t retval;
153     if ((retval = mktime(tm)) == -1L) SAexit("Error converting date and time");
154     return retval;
155 }
156 
157 
SAtime(time_t * tloc)158 time_t SAtime(time_t *tloc) {
159     time_t retval;
160     if ((retval = time(tloc)) == -1L) SAexit("Can't get current date");
161     return retval;
162 }
163 
164 
SAlocaltime(const time_t * timep)165 struct tm *SAlocaltime(const time_t *timep) {
166     static struct tm retval;
167     if ((localtime_r(timep, &retval)) == NULL) SAexit("Error converting date and time. %s", strerror(errno));
168     return &retval;
169 }
170 
171 
172 #if HAVE_STRL < 1
strlcpy(char * dst,const char * src,size_t size)173 size_t strlcpy(char *dst, const char *src, size_t size) {
174     char *d = dst;
175     const char *s = src;
176     size_t sz = size;
177 
178     while(--sz != 0 && ((*d++ = *s++) != '\0'));
179     *d = '\0';
180 
181 #if DEBUG >= 1
182     return strlen(src);
183 #else
184     return 0L;
185 #endif
186 }
187 
strlcat(char * dst,const char * src,size_t size)188 size_t strlcat(char *dst, const char *src, size_t size) {
189     size_t dlen = strlen(dst);
190 
191 #if DEBUG >= 1
192     return strlcpy(&dst[dlen], src, size - dlen) + dlen;
193 #else
194     return strlcpy(&dst[dlen], src, size - dlen);
195 #endif
196 }
197 #endif
198 
199 
200 #if DEBUG >= 1
strlcpyd(char * dst,const char * src,size_t size)201 size_t strlcpyd(char *dst, const char *src, size_t size) {
202     size_t retval;
203     if ((retval = strlcpy(dst, src, size)) >= size) SAwarning("String [%s] was truncated by %zd bytes", src, retval - size + 1L);
204     return retval;
205 }
206 
strlcatd(char * dst,const char * src,size_t size)207 size_t strlcatd(char *dst, const char *src, size_t size) {
208     size_t retval;
209     if ((retval = strlcat(dst, src, size)) >= size) SAwarning("String [%s] was truncated by %zd bytes", src, retval - size + 1L);
210     return retval;
211 }
212 #endif
213