use bb_sanitize_stdio() where appropriate
This commit is contained in:
parent
cd75a96f0f
commit
e06bed30cf
@ -14,16 +14,18 @@
|
|||||||
|
|
||||||
int nohup_main(int argc, char **argv)
|
int nohup_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int temp, nullfd;
|
int nullfd;
|
||||||
char *nohupout, *home = NULL;
|
const char *nohupout;
|
||||||
|
char *home = NULL;
|
||||||
|
|
||||||
xfunc_error_retval = 127;
|
xfunc_error_retval = 127;
|
||||||
|
|
||||||
if (argc<2) bb_show_usage();
|
if (argc < 2) bb_show_usage();
|
||||||
|
|
||||||
nullfd = xopen(bb_dev_null, O_WRONLY|O_APPEND);
|
nullfd = xopen(bb_dev_null, O_WRONLY|O_APPEND);
|
||||||
/* If stdin is a tty, detach from it. */
|
/* If stdin is a tty, detach from it. */
|
||||||
if (isatty(STDIN_FILENO)) dup2(nullfd, STDIN_FILENO);
|
if (isatty(STDIN_FILENO))
|
||||||
|
dup2(nullfd, STDIN_FILENO);
|
||||||
|
|
||||||
nohupout = "nohup.out";
|
nohupout = "nohup.out";
|
||||||
/* Redirect stdout to nohup.out, either in "." or in "$HOME". */
|
/* Redirect stdout to nohup.out, either in "." or in "$HOME". */
|
||||||
@ -38,16 +40,20 @@ int nohup_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
} else dup2(nullfd, STDOUT_FILENO);
|
} else dup2(nullfd, STDOUT_FILENO);
|
||||||
|
|
||||||
/* If we have a tty on strderr, announce filename and redirect to stdout.
|
/* If we have a tty on stderr, announce filename and redirect to stdout.
|
||||||
* Else redirect to /dev/null.
|
* Else redirect to /dev/null.
|
||||||
*/
|
*/
|
||||||
temp = isatty(STDERR_FILENO);
|
if (isatty(STDERR_FILENO)) {
|
||||||
if (temp) bb_error_msg("appending to %s", nohupout);
|
bb_error_msg("appending to %s", nohupout);
|
||||||
dup2(temp ? STDOUT_FILENO : nullfd, STDERR_FILENO);
|
dup2(STDOUT_FILENO, STDERR_FILENO);
|
||||||
close(nullfd);
|
} else dup2(nullfd, STDERR_FILENO);
|
||||||
signal (SIGHUP, SIG_IGN);
|
|
||||||
|
|
||||||
execvp(argv[1],argv+1);
|
if (nullfd > 2)
|
||||||
if (00 && ENABLE_FEATURE_CLEAN_UP && home) free(nohupout);
|
close(nullfd);
|
||||||
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
|
execvp(argv[1], argv+1);
|
||||||
|
if (ENABLE_FEATURE_CLEAN_UP && home)
|
||||||
|
free((char*)nohupout);
|
||||||
bb_perror_msg_and_die("%s", argv[1]);
|
bb_perror_msg_and_die("%s", argv[1]);
|
||||||
}
|
}
|
||||||
|
@ -518,7 +518,7 @@ void bb_sanitize_stdio_maybe_daemonize(int daemonize)
|
|||||||
int fd;
|
int fd;
|
||||||
/* Mega-paranoid */
|
/* Mega-paranoid */
|
||||||
fd = xopen(bb_dev_null, O_RDWR);
|
fd = xopen(bb_dev_null, O_RDWR);
|
||||||
while (fd < 2)
|
while ((unsigned)fd < 2)
|
||||||
fd = dup(fd); /* have 0,1,2 open at least to /dev/null */
|
fd = dup(fd); /* have 0,1,2 open at least to /dev/null */
|
||||||
if (daemonize) {
|
if (daemonize) {
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
|
@ -264,7 +264,7 @@ static void open_tty(char *tty, struct termios *tp, int local)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((fcntl(0, F_GETFL, 0) & O_RDWR) != O_RDWR)
|
if ((fcntl(0, F_GETFL, 0) & O_RDWR) != O_RDWR)
|
||||||
bb_error_msg_and_die("%s: not open for read/write", tty);
|
bb_error_msg_and_die("stdin is not open for read/write");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace current standard output/error fd's with new ones */
|
/* Replace current standard output/error fd's with new ones */
|
||||||
@ -314,7 +314,8 @@ static void open_tty(char *tty, struct termios *tp, int local)
|
|||||||
strcpy(vcsa, "vcsa");
|
strcpy(vcsa, "vcsa");
|
||||||
strcpy(vcsa + 4, tty + 3);
|
strcpy(vcsa + 4, tty + 3);
|
||||||
|
|
||||||
id = (gr = getgrnam("sys")) ? gr->gr_gid : 0;
|
gr = getgrnam("sys");
|
||||||
|
id = gr ? gr->gr_gid : 0;
|
||||||
chown(vcs, 0, id);
|
chown(vcs, 0, id);
|
||||||
chmod(vcs, 0600);
|
chmod(vcs, 0600);
|
||||||
chown(vcsa, 0, id);
|
chown(vcsa, 0, id);
|
||||||
@ -628,8 +629,8 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat
|
|||||||
tp->c_cflag |= CS7;
|
tp->c_cflag |= CS7;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Account for upper case without lower case. */
|
|
||||||
|
|
||||||
|
/* Account for upper case without lower case. */
|
||||||
#ifdef HANDLE_ALLCAPS
|
#ifdef HANDLE_ALLCAPS
|
||||||
if (cp->capslock) {
|
if (cp->capslock) {
|
||||||
tp->c_iflag |= IUCLC;
|
tp->c_iflag |= IUCLC;
|
||||||
|
@ -1040,10 +1040,8 @@ traceroute_main(int argc, char *argv[])
|
|||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insure the socket fds won't be 0, 1 or 2 */
|
/* Ensure the socket fds won't be 0, 1 or 2 */
|
||||||
do n = xopen(bb_dev_null, O_RDONLY); while (n < 2);
|
bb_sanitize_stdio();
|
||||||
while (n > 2)
|
|
||||||
close(n--);
|
|
||||||
|
|
||||||
s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||||
|
|
||||||
|
@ -22,20 +22,6 @@ long uptime(void)
|
|||||||
return info.uptime;
|
return info.uptime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This function makes sure our first socket calls
|
|
||||||
* aren't going to fd 1 (printf badness...) and are
|
|
||||||
* not later closed by daemon()
|
|
||||||
*/
|
|
||||||
static inline void sanitize_fds(void)
|
|
||||||
{
|
|
||||||
int fd = xopen(bb_dev_null, O_RDWR);
|
|
||||||
while (fd < 3)
|
|
||||||
fd = dup(fd);
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void udhcp_background(const char *pidfile)
|
void udhcp_background(const char *pidfile)
|
||||||
{
|
{
|
||||||
#ifdef __uClinux__
|
#ifdef __uClinux__
|
||||||
@ -57,7 +43,7 @@ void udhcp_start_log_and_pid(const char *pidfile)
|
|||||||
int pid_fd;
|
int pid_fd;
|
||||||
|
|
||||||
/* Make sure our syslog fd isn't overwritten */
|
/* Make sure our syslog fd isn't overwritten */
|
||||||
sanitize_fds();
|
bb_sanitize_stdio();
|
||||||
|
|
||||||
/* do some other misc startup stuff while we are here to save bytes */
|
/* do some other misc startup stuff while we are here to save bytes */
|
||||||
pid_fd = pidfile_acquire(pidfile);
|
pid_fd = pidfile_acquire(pidfile);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user