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