From cad04ef4f3435e56181a81c896912543be34ea3c Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 25 Mar 2007 23:21:05 +0000 Subject: [PATCH] add NOMMU fixme's; move move_fd from runit_lib to libbb; nuke fd_copy --- console-tools/openvt.c | 3 ++- e2fsprogs/fsck.c | 3 ++- include/libbb.h | 8 ++++++-- libbb/xfuncs.c | 10 ++++++++++ loginutils/login.c | 2 +- networking/zcip.c | 1 + runit/runit_lib.c | 28 ---------------------------- runit/runit_lib.h | 6 ------ runit/runsv.c | 6 +++--- runit/runsvdir.c | 2 +- runit/svlogd.c | 14 +++++--------- 11 files changed, 31 insertions(+), 52 deletions(-) diff --git a/console-tools/openvt.c b/console-tools/openvt.c index eb9f49fe2..0584584df 100644 --- a/console-tools/openvt.c +++ b/console-tools/openvt.c @@ -22,8 +22,9 @@ int openvt_main(int argc, char **argv) bb_show_usage(); } /* check for illegal vt number: < 1 or > 63 */ - sprintf(vtname, VC_FORMAT, (int)xatoul_range(argv[1], 1, 63)); + sprintf(vtname, VC_FORMAT, (int)xatou_range(argv[1], 1, 63)); +//FIXME NOMMU if (fork() == 0) { /* child */ /* leave current vt (controlling tty) */ diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c index ad22fcd7a..c31ab3f1a 100644 --- a/e2fsprogs/fsck.c +++ b/e2fsprogs/fsck.c @@ -667,7 +667,8 @@ static void execute(const char *type, const char *device, const char *mntpt, /* Fork and execute the correct program. */ pid = -1; if (!noexecute) { - pid = fork(); /* TODO: NOMMU friendly way (vfork)? */ +/* TODO: NOMMU friendly way (vfork)? */ + pid = fork(); if (pid < 0) bb_perror_msg_and_die("fork"); if (pid == 0) { diff --git a/include/libbb.h b/include/libbb.h index 152b87099..aba9316d1 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -250,8 +250,10 @@ extern char bb_process_escape_sequence(const char **ptr); /* TODO: sometimes modifies its parameter, which * makes it rather inconvenient at times: */ extern char *bb_get_last_path_component(char *path); -extern int ndelay_on(int fd); -extern int ndelay_off(int fd); + +int ndelay_on(int fd); +int ndelay_off(int fd); +void xmove_fd(int, int); extern DIR *xopendir(const char *path); @@ -616,6 +618,8 @@ extern int index_in_substr_array(const char * const string_array[], const char * extern void print_login_issue(const char *issue_file, const char *tty); extern void print_login_prompt(void); #ifdef BB_NOMMU +extern pid_t BUG_fork_is_unavailable_on_nommu(void); +#define fork() BUG_fork_is_unavailable_on_nommu() extern void vfork_daemon_rexec(int nochdir, int noclose, char **argv); extern smallint re_execed; #endif diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index c496f9a22..1dcdbc065 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -133,6 +133,16 @@ int ndelay_off(int fd) return fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0) & ~O_NONBLOCK); } +// "Renumber" opened fd +void xmove_fd(int from, int to) +{ + if (from == to) + return; + if (dup2(from, to) != to) + bb_perror_msg_and_die("cannot duplicate file descriptor"); + close(from); +} + // Die with an error message if we can't write the entire buffer. void xwrite(int fd, const void *buf, size_t count) { diff --git a/loginutils/login.c b/loginutils/login.c index b7428de45..791e44d83 100644 --- a/loginutils/login.c +++ b/loginutils/login.c @@ -337,7 +337,7 @@ auth_failed: fchown(0, pw->pw_uid, pw->pw_gid); fchmod(0, 0600); - /* TODO: be nommu-friendly, use spawn? */ +/* TODO: be nommu-friendly, use spawn? */ if (ENABLE_LOGIN_SCRIPTS) { char *script = getenv("LOGIN_PRE_SUID_SCRIPT"); if (script) { diff --git a/networking/zcip.c b/networking/zcip.c index a8bfee65a..c50d5abaf 100644 --- a/networking/zcip.c +++ b/networking/zcip.c @@ -272,6 +272,7 @@ int zcip_main(int argc, char *argv[]) // daemonize now; don't delay system startup if (!FOREGROUND) { /* bb_daemonize(); - bad, will close fd! */ +//NOMMU xdaemon(0, 0); bb_info_msg("start, interface %s", intf); } diff --git a/runit/runit_lib.c b/runit/runit_lib.c index 0830314df..4762096b4 100644 --- a/runit/runit_lib.c +++ b/runit/runit_lib.c @@ -61,34 +61,6 @@ int coe(int fd) } -/*** fd_copy.c ***/ - -int fd_copy(int to,int from) -{ - if (to == from) - return 0; - if (fcntl(from,F_GETFL,0) == -1) - return -1; - close(to); - if (fcntl(from,F_DUPFD,to) == -1) - return -1; - return 0; -} - - -/*** fd_move.c ***/ - -int fd_move(int to,int from) -{ - if (to == from) - return 0; - if (fd_copy(to,from) == -1) - return -1; - close(from); - return 0; -} - - /*** fmt_ptime.c ***/ void fmt_ptime30nul(char *s, struct taia *ta) { diff --git a/runit/runit_lib.h b/runit/runit_lib.h index 7b268e276..9fe4166bc 100644 --- a/runit/runit_lib.h +++ b/runit/runit_lib.h @@ -40,12 +40,6 @@ extern int coe(int); #define direntry struct dirent -/*** fd.h ***/ - -extern int fd_copy(int,int); -extern int fd_move(int,int); - - /*** tai.h ***/ struct tai { diff --git a/runit/runsv.c b/runit/runsv.c index cd806851e..018456847 100644 --- a/runit/runsv.c +++ b/runit/runsv.c @@ -251,7 +251,7 @@ static unsigned custom(struct svdir *s, char c) return 0; } if (!pid) { - if (haslog && fd_copy(1, logpipe[1]) == -1) + if (haslog && dup2(logpipe[1], 1) == -1) warn_cannot("setup stdout for control/?"); prog[0] = a; prog[1] = NULL; @@ -312,13 +312,13 @@ static void startservice(struct svdir *s) /* child */ if (haslog) { if (s->islog) { - if (fd_copy(0, logpipe[0]) == -1) + if (dup2(logpipe[0], 0) == -1) fatal_cannot("setup filedescriptor for ./log/run"); close(logpipe[1]); if (chdir("./log") == -1) fatal_cannot("change directory to ./log"); } else { - if (fd_copy(1, logpipe[1]) == -1) + if (dup2(logpipe[1], 1) == -1) fatal_cannot("setup filedescriptor for ./run"); close(logpipe[0]); } diff --git a/runit/runsvdir.c b/runit/runsvdir.c index 2f54cfef8..cce2c5d9c 100644 --- a/runit/runsvdir.c +++ b/runit/runsvdir.c @@ -191,7 +191,7 @@ static int setup_log(void) coe(logpipe[0]); ndelay_on(logpipe[0]); ndelay_on(logpipe[1]); - if (fd_copy(2, logpipe[1]) == -1) { + if (dup2(logpipe[1], 2) == -1) { warnx("cannot set filedescriptor for log"); return -1; } diff --git a/runit/svlogd.c b/runit/svlogd.c index e454bace8..fb834a403 100644 --- a/runit/svlogd.c +++ b/runit/svlogd.c @@ -153,12 +153,10 @@ static unsigned processorstart(struct logdir *ld) if (verbose) bb_error_msg(INFO"processing: %s/%s", ld->name, ld->fnsave); fd = xopen(ld->fnsave, O_RDONLY|O_NDELAY); - if (fd_move(0, fd) == -1) - bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name); + xmove_fd(fd, 0); ld->fnsave[26] = 't'; fd = xopen(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT); - if (fd_move(1, fd) == -1) - bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name); + xmove_fd(fd, 1); fd = open_read("state"); if (fd == -1) { if (errno != ENOENT) @@ -166,17 +164,15 @@ static unsigned processorstart(struct logdir *ld) close(xopen("state", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT)); fd = xopen("state", O_RDONLY|O_NDELAY); } - if (fd_move(4, fd) == -1) - bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name); + xmove_fd(fd, 4); fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT); - if (fd_move(5, fd) == -1) - bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name); + xmove_fd(fd, 5); // getenv("SHELL")? prog[0] = (char*)"sh"; prog[1] = (char*)"-c"; prog[2] = ld->processor; - prog[3] = '\0'; + prog[3] = NULL; execve("/bin/sh", prog, environ); bb_perror_msg_and_die(FATAL"cannot %s processor %s", "run", ld->name); } -- 2.11.0