add NOMMU fixme's; move move_fd from runit_lib to libbb; nuke fd_copy
No binary (build failed)
—
(log yok)
| @@ -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) */ | |
| @@ -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) { | |
| @@ -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 | |
| @@ -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) | |
| { | |
| @@ -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) { | |
| @@ -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); | |
| } | |
| @@ -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) { | |
| @@ -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 { | |
| @@ -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]); | |
| } | |
| @@ -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; | |
| } | |
| @@ -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); | |
| } | |