Add comments to all the functions in this file documenting what they're for.
[oweals/busybox.git] / libbb / xfuncs.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6  * Copyright (C) 2006 Rob Landley
7  * Copyright (C) 2006 Denis Vlasenko
8  *
9  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
10  */
11
12 #include "busybox.h"
13
14 /* All the functions starting with "x" call bb_error_msg_and_die() if they
15  * fail, so callers never need to check for errors.  If it returned, it
16  * succeeded. */
17
18 #ifndef DMALLOC
19 #ifdef L_xmalloc
20 // Die if we can't allocate size bytes of memory.
21 void *xmalloc(size_t size)
22 {
23         void *ptr = malloc(size);
24         if (ptr == NULL && size != 0)
25                 bb_error_msg_and_die(bb_msg_memory_exhausted);
26         return ptr;
27 }
28 #endif
29
30 #ifdef L_xrealloc
31 // Die if we can't resize previously allocated memory.  (This returns a pointer
32 // to the new memory, which may or may not be the same as the old memory.
33 // It'll copy the contents to a new chunk and free the old one if necessary.)
34 void *xrealloc(void *ptr, size_t size)
35 {
36         ptr = realloc(ptr, size);
37         if (ptr == NULL && size != 0)
38                 bb_error_msg_and_die(bb_msg_memory_exhausted);
39         return ptr;
40 }
41 #endif
42
43 #ifdef L_xzalloc
44 // Die if we can't allocate and zero size bytes of memory.
45 void *xzalloc(size_t size)
46 {
47         void *ptr = xmalloc(size);
48         memset(ptr, 0, size);
49         return ptr;
50 }
51 #endif
52
53 #endif /* DMALLOC */
54
55 #ifdef L_xstrdup
56 // Die if we can't copy a string to freshly allocated memory.
57 char * xstrdup(const char *s)
58 {
59         char *t;
60
61         if (s == NULL)
62                 return NULL;
63
64         t = strdup (s);
65
66         if (t == NULL)
67                 bb_error_msg_and_die(bb_msg_memory_exhausted);
68
69         return t;
70 }
71 #endif
72
73 #ifdef L_xstrndup
74 // Die if we can't allocate n+1 bytes (space for the null terminator) and copy
75 // the (possibly truncated to length n) string into it.
76 char * xstrndup(const char *s, int n)
77 {
78         char *t;
79
80         if (ENABLE_DEBUG && s == NULL)
81                 bb_error_msg_and_die("xstrndup bug");
82
83         t = xmalloc(++n);
84
85         return safe_strncpy(t,s,n);
86 }
87 #endif
88
89 #ifdef L_xfopen
90 // Die if we can't open a file and return a FILE * to it.
91 // Notice we haven't got xfread(), This is for use with fscanf() and friends.
92 FILE *xfopen(const char *path, const char *mode)
93 {
94         FILE *fp;
95         if ((fp = fopen(path, mode)) == NULL)
96                 bb_perror_msg_and_die("%s", path);
97         return fp;
98 }
99 #endif
100
101 #ifdef L_xopen
102 // Die if we can't open an existing file and return an fd.
103 int xopen(const char *pathname, int flags)
104 {
105         if (ENABLE_DEBUG && (flags && O_CREAT))
106                 bb_error_msg_and_die("xopen() with O_CREAT\n");
107
108         return xopen3(pathname, flags, 0777);
109 }
110 #endif
111
112 #ifdef L_xopen3
113 // Die if we can't open a new file and return an fd.
114 int xopen3(const char *pathname, int flags, int mode)
115 {
116         int ret;
117
118         ret = open(pathname, flags, mode);
119         if (ret < 0) {
120                 bb_perror_msg_and_die("%s", pathname);
121         }
122         return ret;
123 }
124 #endif
125
126 #ifdef L_xread
127 // Die with an error message if we can't read the entire buffer.
128 void xread(int fd, void *buf, size_t count)
129 {
130         while (count) {
131                 ssize_t size;
132
133                 if ((size = safe_read(fd, buf, count)) < 1)
134                         bb_error_msg_and_die("Short read");
135                 count -= size;
136                 buf = ((char *) buf) + size;
137         }
138 }
139 #endif
140
141 #ifdef L_xwrite
142 // Die with an error message if we can't write the entire buffer.
143 void xwrite(int fd, void *buf, size_t count)
144 {
145         while (count) {
146                 ssize_t size;
147
148                 if ((size = safe_write(fd, buf, count)) < 1)
149                         bb_error_msg_and_die("Short write");
150                 count -= size;
151                 buf = ((char *) buf) + size;
152         }
153 }
154 #endif
155
156 #ifdef L_xlseek
157 // Die with an error message if we can't lseek to the right spot.
158 void xlseek(int fd, off_t offset, int whence)
159 {
160         if (offset != lseek(fd, offset, whence)) bb_error_msg_and_die("lseek");
161 }
162 #endif
163
164 #ifdef L_xread_char
165 // Die with an error message if we can't read one character.
166 unsigned char xread_char(int fd)
167 {
168         char tmp;
169
170         xread(fd, &tmp, 1);
171
172         return(tmp);
173 }
174 #endif
175
176 #ifdef L_xferror
177 // Die with supplied error message if this FILE * has ferror set.
178 void xferror(FILE *fp, const char *fn)
179 {
180         if (ferror(fp)) {
181                 bb_error_msg_and_die("%s", fn);
182         }
183 }
184 #endif
185
186 #ifdef L_xferror_stdout
187 // Die with an error message if stdout has ferror set.
188 void xferror_stdout(void)
189 {
190         xferror(stdout, bb_msg_standard_output);
191 }
192 #endif
193
194 #ifdef L_xfflush_stdout
195 // Die with an error message if we have trouble flushing stdout.
196 void xfflush_stdout(void)
197 {
198         if (fflush(stdout)) {
199                 bb_perror_msg_and_die(bb_msg_standard_output);
200         }
201 }
202 #endif
203
204 #ifdef L_spawn
205 // This does a fork/exec in one call, using vfork().  Return PID of new child,
206 // -1 for failure.  Runs argv[0], searching path if that has no / in it.
207 pid_t spawn(char **argv)
208 {
209         static int failed;
210         pid_t pid;
211         void *app = find_applet_by_name(argv[0]);
212
213         // Be nice to nommu machines.
214         failed = 0;
215         pid = vfork();
216         if (pid < 0) return pid;
217         if (!pid) {
218                 execvp(app ? CONFIG_BUSYBOX_EXEC_PATH : *argv, argv);
219
220                 // We're sharing a stack with blocked parent, let parent know we failed
221                 // and then exit to unblock parent (but don't run atexit() stuff, which
222                 // would screw up parent.)
223
224                 failed = -1;
225                 _exit(0);
226         }
227         return failed ? failed : pid;
228 }
229 #endif
230
231 #ifdef L_xspawn
232 // Die with an error message if we can't spawn a child process.
233 pid_t xspawn(char **argv)
234 {
235         pid_t pid = spawn(argv);
236         if (pid < 0) bb_perror_msg_and_die("%s", *argv);
237         return pid;
238 }
239 #endif
240
241 #ifdef L_wait4
242 // Wait for the specified child PID to exit, returning child's error return.
243 int wait4pid(int pid)
244 {
245         int status;
246
247         if (pid == -1 || waitpid(pid, &status, 0) == -1) return -1;
248         if (WIFEXITED(status)) return WEXITSTATUS(status);
249         if (WIFSIGNALED(status)) return WTERMSIG(status);
250         return 0;
251 }
252 #endif
253
254 #ifdef L_itoa
255 // Convert unsigned integer to ascii, writing into supplied buffer.  A
256 // truncated result is always null terminated (unless buflen is 0), and
257 // contains the first few digits of the result ala strncpy.
258 void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
259 {
260         int i, out = 0;
261         if (buflen) {
262                 for (i=1000000000; i; i/=10) {
263                         int res = n/i;
264
265                         if ((res || out || i == 1) && --buflen>0) {
266                                 out++;
267                                 n -= res*i;
268                                 *buf++ = '0' + res;
269                         }
270                 }
271                 *buf = 0;
272         }
273 }
274
275 // Convert signed integer to ascii, like utoa_to_buf()
276 void itoa_to_buf(int n, char *buf, unsigned buflen)
277 {
278         if (buflen && n<0) {
279                 n = -n;
280                 *buf++ = '-';
281                 buflen--;
282         }
283         utoa_to_buf((unsigned)n, buf, buflen);
284 }
285
286 // The following two functions use a static buffer, so calling either one a
287 // second time will overwrite previous results.
288 //
289 // The largest 32 bit integer is -2 billion plus null terminator, or 12 bytes.
290 // Int should always be 32 bits on any remotely Unix-like system, see
291 // http://www.unix.org/whitepapers/64bit.html for the reasons why.
292
293 static char local_buf[12];
294
295 // Convert unsigned integer to ascii using a static buffer (returned).
296 char *utoa(unsigned n)
297 {
298         utoa_to_buf(n, local_buf, sizeof(local_buf));
299
300         return local_buf;
301 }
302
303 // Convert signed integer to ascii using a static buffer (returned).
304 char *itoa(int n)
305 {
306         itoa_to_buf(n, local_buf, sizeof(local_buf));
307
308         return local_buf;
309 }
310 #endif
311
312 #ifdef L_setuid
313 // Die with an error message if we can't set gid.  (Because resource limits may
314 // limit this user to a given number of processes, and if that fills up the
315 // setgid() will fail and we'll _still_be_root_, which is bad.)
316 void xsetgid(gid_t gid)
317 {
318         if (setgid(gid)) bb_error_msg_and_die("setgid");
319 }
320
321 // Die with an error message if we cant' set uid.  (See xsetgid() for why.)
322 void xsetuid(uid_t uid)
323 {
324         if (setuid(uid)) bb_error_msg_and_die("setuid");
325 }
326 #endif
327
328 #ifdef L_fdlength
329 // Return how long the file at fd is, if there's any way to determine it.
330 off_t fdlength(int fd)
331 {
332         off_t bottom = 0, top = 0, pos;
333         long size;
334
335         // If the ioctl works for this, return it.
336
337         if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512;
338
339         // If not, do a binary search for the last location we can read.  (Some
340         // block devices don't do BLKGETSIZE right.)
341
342         do {
343                 char temp;
344
345                 pos = bottom + (top - bottom) / 2;;
346
347                 // If we can read from the current location, it's bigger.
348
349                 if (lseek(fd, pos, 0)>=0 && safe_read(fd, &temp, 1)==1) {
350                         if (bottom == top) bottom = top = (top+1) * 2;
351                         else bottom = pos;
352
353                 // If we can't, it's smaller.
354
355                 } else {
356                         if (bottom == top) {
357                                 if (!top) return 0;
358                                 bottom = top/2;
359                         }
360                         else top = pos;
361                 }
362         } while (bottom + 1 != top);
363
364         return pos + 1;
365 }
366 #endif
367
368 #ifdef L_xasprintf
369 // Die with an error message if we can't malloc() enough space and do an
370 // sprintf() into that space.
371 char *xasprintf(const char *format, ...)
372 {
373         va_list p;
374         int r;
375         char *string_ptr;
376
377 #if 1
378         // GNU extension
379         va_start(p, format);
380         r = vasprintf(&string_ptr, format, p);
381         va_end(p);
382 #else
383         // Bloat for systems that haven't got the GNU extension.
384         va_start(p, format);
385         r = vsnprintf(NULL, 0, format, p);
386         va_end(p);
387         string_ptr = xmalloc(r+1);
388         va_start(p, format);
389         r = vsnprintf(string_ptr, r+1, format, p);
390         va_end(p);
391 #endif
392
393         if (r < 0) bb_perror_msg_and_die("xasprintf");
394         return string_ptr;
395 }
396 #endif
397
398 #ifdef L_xprint_and_close_file
399 // Die with an error message if we can't copy an entire FILE * to stdout, then
400 // close that file.
401 void xprint_and_close_file(FILE *file)
402 {
403         // copyfd outputs error messages for us.
404         if (bb_copyfd_eof(fileno(file), 1) == -1) exit(bb_default_error_retval);
405
406         fclose(file);
407 }
408 #endif
409
410 #ifdef L_xchdir
411 // Die if we can't chdir to a new path.
412 void xchdir(const char *path)
413 {
414         if (chdir(path))
415                 bb_perror_msg_and_die("chdir(%s)", path);
416 }
417 #endif
418
419 #ifdef L_warn_opendir
420 // Print a warning message if opendir() fails, but don't die.
421 DIR *warn_opendir(const char *path)
422 {
423         DIR *dp;
424
425         if ((dp = opendir(path)) == NULL) {
426                 bb_perror_msg("unable to open `%s'", path);
427                 return NULL;
428         }
429         return dp;
430 }
431 #endif
432
433 #ifdef L_xopendir
434 // Die with an error message if opendir() fails.
435 DIR *xopendir(const char *path)
436 {
437         DIR *dp;
438
439         if ((dp = opendir(path)) == NULL)
440                 bb_perror_msg_and_die("unable to open `%s'", path);
441         return dp;
442 }
443 #endif
444
445 #ifdef L_xdaemon
446 #ifndef BB_NOMMU
447 // Die with an error message if we can't daemonize.
448 void xdaemon(int nochdir, int noclose)
449 {
450             if (daemon(nochdir, noclose)) bb_perror_msg_and_die("daemon");
451 }
452 #endif
453 #endif
454
455 #ifdef L_xsocket
456 // Die with an error message if we can't open a new socket.
457 int xsocket(int domain, int type, int protocol)
458 {
459         int r = socket(domain, type, protocol);
460
461         if (r < 0) bb_perror_msg_and_die("socket");
462
463         return r;
464 }
465 #endif
466
467 #ifdef L_xbind
468 // Die with an error message if we can't bind a socket to an address.
469 void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen)
470 {
471         if (bind(sockfd, my_addr, addrlen)) bb_perror_msg_and_die("bind");
472 }
473 #endif
474
475 #ifdef L_xlisten
476 // Die with an error message if we can't listen for connections on a socket.
477 void xlisten(int s, int backlog)
478 {
479         if (listen(s, backlog)) bb_perror_msg_and_die("listen");
480 }
481 #endif