add NOMMU fixme's; move move_fd from runit_lib to libbb; nuke fd_copy
This commit is contained in:
parent
10f8f5f443
commit
cad04ef4f3
@ -22,8 +22,9 @@ int openvt_main(int argc, char **argv)
|
|||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
}
|
}
|
||||||
/* check for illegal vt number: < 1 or > 63 */
|
/* 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) {
|
if (fork() == 0) {
|
||||||
/* child */
|
/* child */
|
||||||
/* leave current vt (controlling tty) */
|
/* 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. */
|
/* Fork and execute the correct program. */
|
||||||
pid = -1;
|
pid = -1;
|
||||||
if (!noexecute) {
|
if (!noexecute) {
|
||||||
pid = fork(); /* TODO: NOMMU friendly way (vfork)? */
|
/* TODO: NOMMU friendly way (vfork)? */
|
||||||
|
pid = fork();
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
bb_perror_msg_and_die("fork");
|
bb_perror_msg_and_die("fork");
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
|
@ -250,8 +250,10 @@ extern char bb_process_escape_sequence(const char **ptr);
|
|||||||
/* TODO: sometimes modifies its parameter, which
|
/* TODO: sometimes modifies its parameter, which
|
||||||
* makes it rather inconvenient at times: */
|
* makes it rather inconvenient at times: */
|
||||||
extern char *bb_get_last_path_component(char *path);
|
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);
|
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_issue(const char *issue_file, const char *tty);
|
||||||
extern void print_login_prompt(void);
|
extern void print_login_prompt(void);
|
||||||
#ifdef BB_NOMMU
|
#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 void vfork_daemon_rexec(int nochdir, int noclose, char **argv);
|
||||||
extern smallint re_execed;
|
extern smallint re_execed;
|
||||||
#endif
|
#endif
|
||||||
|
@ -133,6 +133,16 @@ int ndelay_off(int fd)
|
|||||||
return fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0) & ~O_NONBLOCK);
|
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.
|
// Die with an error message if we can't write the entire buffer.
|
||||||
void xwrite(int fd, const void *buf, size_t count)
|
void xwrite(int fd, const void *buf, size_t count)
|
||||||
{
|
{
|
||||||
|
@ -337,7 +337,7 @@ auth_failed:
|
|||||||
fchown(0, pw->pw_uid, pw->pw_gid);
|
fchown(0, pw->pw_uid, pw->pw_gid);
|
||||||
fchmod(0, 0600);
|
fchmod(0, 0600);
|
||||||
|
|
||||||
/* TODO: be nommu-friendly, use spawn? */
|
/* TODO: be nommu-friendly, use spawn? */
|
||||||
if (ENABLE_LOGIN_SCRIPTS) {
|
if (ENABLE_LOGIN_SCRIPTS) {
|
||||||
char *script = getenv("LOGIN_PRE_SUID_SCRIPT");
|
char *script = getenv("LOGIN_PRE_SUID_SCRIPT");
|
||||||
if (script) {
|
if (script) {
|
||||||
|
@ -272,6 +272,7 @@ int zcip_main(int argc, char *argv[])
|
|||||||
// daemonize now; don't delay system startup
|
// daemonize now; don't delay system startup
|
||||||
if (!FOREGROUND) {
|
if (!FOREGROUND) {
|
||||||
/* bb_daemonize(); - bad, will close fd! */
|
/* bb_daemonize(); - bad, will close fd! */
|
||||||
|
//NOMMU
|
||||||
xdaemon(0, 0);
|
xdaemon(0, 0);
|
||||||
bb_info_msg("start, interface %s", intf);
|
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 ***/
|
/*** fmt_ptime.c ***/
|
||||||
|
|
||||||
void fmt_ptime30nul(char *s, struct taia *ta) {
|
void fmt_ptime30nul(char *s, struct taia *ta) {
|
||||||
|
@ -40,12 +40,6 @@ extern int coe(int);
|
|||||||
#define direntry struct dirent
|
#define direntry struct dirent
|
||||||
|
|
||||||
|
|
||||||
/*** fd.h ***/
|
|
||||||
|
|
||||||
extern int fd_copy(int,int);
|
|
||||||
extern int fd_move(int,int);
|
|
||||||
|
|
||||||
|
|
||||||
/*** tai.h ***/
|
/*** tai.h ***/
|
||||||
|
|
||||||
struct tai {
|
struct tai {
|
||||||
|
@ -251,7 +251,7 @@ static unsigned custom(struct svdir *s, char c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
if (haslog && fd_copy(1, logpipe[1]) == -1)
|
if (haslog && dup2(logpipe[1], 1) == -1)
|
||||||
warn_cannot("setup stdout for control/?");
|
warn_cannot("setup stdout for control/?");
|
||||||
prog[0] = a;
|
prog[0] = a;
|
||||||
prog[1] = NULL;
|
prog[1] = NULL;
|
||||||
@ -312,13 +312,13 @@ static void startservice(struct svdir *s)
|
|||||||
/* child */
|
/* child */
|
||||||
if (haslog) {
|
if (haslog) {
|
||||||
if (s->islog) {
|
if (s->islog) {
|
||||||
if (fd_copy(0, logpipe[0]) == -1)
|
if (dup2(logpipe[0], 0) == -1)
|
||||||
fatal_cannot("setup filedescriptor for ./log/run");
|
fatal_cannot("setup filedescriptor for ./log/run");
|
||||||
close(logpipe[1]);
|
close(logpipe[1]);
|
||||||
if (chdir("./log") == -1)
|
if (chdir("./log") == -1)
|
||||||
fatal_cannot("change directory to ./log");
|
fatal_cannot("change directory to ./log");
|
||||||
} else {
|
} else {
|
||||||
if (fd_copy(1, logpipe[1]) == -1)
|
if (dup2(logpipe[1], 1) == -1)
|
||||||
fatal_cannot("setup filedescriptor for ./run");
|
fatal_cannot("setup filedescriptor for ./run");
|
||||||
close(logpipe[0]);
|
close(logpipe[0]);
|
||||||
}
|
}
|
||||||
|
@ -191,7 +191,7 @@ static int setup_log(void)
|
|||||||
coe(logpipe[0]);
|
coe(logpipe[0]);
|
||||||
ndelay_on(logpipe[0]);
|
ndelay_on(logpipe[0]);
|
||||||
ndelay_on(logpipe[1]);
|
ndelay_on(logpipe[1]);
|
||||||
if (fd_copy(2, logpipe[1]) == -1) {
|
if (dup2(logpipe[1], 2) == -1) {
|
||||||
warnx("cannot set filedescriptor for log");
|
warnx("cannot set filedescriptor for log");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -153,12 +153,10 @@ static unsigned processorstart(struct logdir *ld)
|
|||||||
if (verbose)
|
if (verbose)
|
||||||
bb_error_msg(INFO"processing: %s/%s", ld->name, ld->fnsave);
|
bb_error_msg(INFO"processing: %s/%s", ld->name, ld->fnsave);
|
||||||
fd = xopen(ld->fnsave, O_RDONLY|O_NDELAY);
|
fd = xopen(ld->fnsave, O_RDONLY|O_NDELAY);
|
||||||
if (fd_move(0, fd) == -1)
|
xmove_fd(fd, 0);
|
||||||
bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
|
|
||||||
ld->fnsave[26] = 't';
|
ld->fnsave[26] = 't';
|
||||||
fd = xopen(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
|
fd = xopen(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
|
||||||
if (fd_move(1, fd) == -1)
|
xmove_fd(fd, 1);
|
||||||
bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
|
|
||||||
fd = open_read("state");
|
fd = open_read("state");
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
@ -166,17 +164,15 @@ static unsigned processorstart(struct logdir *ld)
|
|||||||
close(xopen("state", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT));
|
close(xopen("state", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT));
|
||||||
fd = xopen("state", O_RDONLY|O_NDELAY);
|
fd = xopen("state", O_RDONLY|O_NDELAY);
|
||||||
}
|
}
|
||||||
if (fd_move(4, fd) == -1)
|
xmove_fd(fd, 4);
|
||||||
bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
|
|
||||||
fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
|
fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
|
||||||
if (fd_move(5, fd) == -1)
|
xmove_fd(fd, 5);
|
||||||
bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
|
|
||||||
|
|
||||||
// getenv("SHELL")?
|
// getenv("SHELL")?
|
||||||
prog[0] = (char*)"sh";
|
prog[0] = (char*)"sh";
|
||||||
prog[1] = (char*)"-c";
|
prog[1] = (char*)"-c";
|
||||||
prog[2] = ld->processor;
|
prog[2] = ld->processor;
|
||||||
prog[3] = '\0';
|
prog[3] = NULL;
|
||||||
execve("/bin/sh", prog, environ);
|
execve("/bin/sh", prog, environ);
|
||||||
bb_perror_msg_and_die(FATAL"cannot %s processor %s", "run", ld->name);
|
bb_perror_msg_and_die(FATAL"cannot %s processor %s", "run", ld->name);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user