aboutsummaryrefslogtreecommitdiff
path: root/libbb/xfuncs.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-03-26 13:20:04 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-03-26 13:20:04 +0000
commitbb7fcb4229fd5ff583039f26ca1c06340e3f09ea (patch)
tree5e4a6cc92e42ff7694ffc8b6a91434640e953726 /libbb/xfuncs.c
parentf62c6fa1cae0f944243c57b0a776c29eb0c61f18 (diff)
downloadbusybox-w32-bb7fcb4229fd5ff583039f26ca1c06340e3f09ea.tar.gz
busybox-w32-bb7fcb4229fd5ff583039f26ca1c06340e3f09ea.tar.bz2
busybox-w32-bb7fcb4229fd5ff583039f26ca1c06340e3f09ea.zip
libbb: rework NOMMU helper API so that it makes more sense
and easier to use. Doesn't compile - need two more commits.
Diffstat (limited to 'libbb/xfuncs.c')
-rw-r--r--libbb/xfuncs.c78
1 files changed, 0 insertions, 78 deletions
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index 1dcdbc065..14bd62a15 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -187,43 +187,6 @@ void xfflush_stdout(void)
187 } 187 }
188} 188}
189 189
190// This does a fork/exec in one call, using vfork(). Return PID of new child,
191// -1 for failure. Runs argv[0], searching path if that has no / in it.
192pid_t spawn(char **argv)
193{
194 /* Why static? */
195 static int failed;
196 pid_t pid;
197
198 // Be nice to nommu machines.
199 failed = 0;
200 pid = vfork();
201 if (pid < 0) return pid;
202 if (!pid) {
203 BB_EXECVP(argv[0], argv);
204
205 // We're sharing a stack with blocked parent, let parent know we failed
206 // and then exit to unblock parent (but don't run atexit() stuff, which
207 // would screw up parent.)
208
209 failed = errno;
210 _exit(0);
211 }
212 if (failed) {
213 errno = failed;
214 return -1;
215 }
216 return pid;
217}
218
219// Die with an error message if we can't spawn a child process.
220pid_t xspawn(char **argv)
221{
222 pid_t pid = spawn(argv);
223 if (pid < 0) bb_perror_msg_and_die("%s", *argv);
224 return pid;
225}
226
227// Wait for the specified child PID to exit, returning child's error return. 190// Wait for the specified child PID to exit, returning child's error return.
228int wait4pid(int pid) 191int wait4pid(int pid)
229{ 192{
@@ -510,47 +473,6 @@ DIR *xopendir(const char *path)
510 return dp; 473 return dp;
511} 474}
512 475
513#ifndef BB_NOMMU
514// Die with an error message if we can't daemonize.
515void xdaemon(int nochdir, int noclose)
516{
517 if (daemon(nochdir, noclose))
518 bb_perror_msg_and_die("daemon");
519}
520#endif
521
522void bb_sanitize_stdio_maybe_daemonize(int daemonize)
523{
524 int fd;
525 /* Mega-paranoid */
526 fd = xopen(bb_dev_null, O_RDWR);
527 while ((unsigned)fd < 2)
528 fd = dup(fd); /* have 0,1,2 open at least to /dev/null */
529 if (daemonize) {
530 pid_t pid = fork();
531 if (pid < 0) /* wtf? */
532 bb_perror_msg_and_die("fork");
533 if (pid) /* parent */
534 exit(0);
535 /* child */
536 /* if daemonizing, make sure we detach from stdio */
537 setsid();
538 dup2(fd, 0);
539 dup2(fd, 1);
540 dup2(fd, 2);
541 }
542 while (fd > 2)
543 close(fd--); /* close everything after fd#2 */
544}
545void bb_sanitize_stdio(void)
546{
547 bb_sanitize_stdio_maybe_daemonize(0);
548}
549void bb_daemonize(void)
550{
551 bb_sanitize_stdio_maybe_daemonize(1);
552}
553
554// Die with an error message if we can't open a new socket. 476// Die with an error message if we can't open a new socket.
555int xsocket(int domain, int type, int protocol) 477int xsocket(int domain, int type, int protocol)
556{ 478{