introduce and use close_on_exec_on(fd). -50 bytes.

This commit is contained in:
Denis Vlasenko 2007-09-30 23:50:48 +00:00
parent deabacdf91
commit 96e1b38586
14 changed files with 41 additions and 43 deletions

View File

@ -248,6 +248,7 @@ extern char *bb_get_last_path_component_nostrip(const char *path);
int ndelay_on(int fd); int ndelay_on(int fd);
int ndelay_off(int fd); int ndelay_off(int fd);
int close_on_exec_on(int fd);
void xdup2(int, int); void xdup2(int, int);
void xmove_fd(int, int); void xmove_fd(int, int);

View File

@ -179,7 +179,7 @@ static void message(int device, const char *fmt, ...)
bb_error_msg("can't log to %s", log_console); bb_error_msg("can't log to %s", log_console);
device = L_CONSOLE; device = L_CONSOLE;
} else { } else {
fcntl(log_fd, F_SETFD, FD_CLOEXEC); close_on_exec_on(log_fd);
} }
} }
} }

View File

@ -164,6 +164,11 @@ int ndelay_on(int fd)
return fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK); return fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);
} }
int close_on_exec_on(int fd)
{
return fcntl(fd, F_SETFD, FD_CLOEXEC);
}
int ndelay_off(int fd) int ndelay_off(int fd)
{ {
return fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) & ~O_NONBLOCK); return fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) & ~O_NONBLOCK);

View File

@ -371,10 +371,7 @@ int devfsd_main(int argc, char **argv)
xchdir(mount_point); xchdir(mount_point);
fd = xopen(".devfsd", O_RDONLY); fd = xopen(".devfsd", O_RDONLY);
close_on_exec_on(fd);
if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0)
bb_perror_msg_and_die("FD_CLOEXEC");
xioctl(fd, DEVFSDIOC_GET_PROTO_REV, &proto_rev); xioctl(fd, DEVFSDIOC_GET_PROTO_REV, &proto_rev);
/*setup initial entries */ /*setup initial entries */

View File

@ -113,7 +113,7 @@ int nc_main(int argc, char **argv)
lport = get_nport(&lsa->sa); lport = get_nport(&lsa->sa);
fdprintf(2, "%d\n", ntohs(lport)); fdprintf(2, "%d\n", ntohs(lport));
} }
fcntl(sfd, F_SETFD, FD_CLOEXEC); close_on_exec_on(sfd);
accept_again: accept_again:
cfd = accept(sfd, NULL, 0); cfd = accept(sfd, NULL, 0);
if (cfd < 0) if (cfd < 0)

View File

@ -39,9 +39,9 @@ void udhcp_sp_setup(void)
{ {
/* was socketpair, but it needs AF_UNIX in kernel */ /* was socketpair, but it needs AF_UNIX in kernel */
xpipe(signal_pipe); xpipe(signal_pipe);
fcntl(signal_pipe[0], F_SETFD, FD_CLOEXEC); close_on_exec_on(signal_pipe[0]);
fcntl(signal_pipe[1], F_SETFD, FD_CLOEXEC); close_on_exec_on(signal_pipe[1]);
fcntl(signal_pipe[1], F_SETFL, O_NONBLOCK); ndelay_on(signal_pipe[1]);
signal(SIGUSR1, signal_handler); signal(SIGUSR1, signal_handler);
signal(SIGUSR2, signal_handler); signal(SIGUSR2, signal_handler);
signal(SIGTERM, signal_handler); signal(SIGTERM, signal_handler);
@ -56,7 +56,7 @@ int udhcp_sp_fd_set(fd_set *rfds, int extra_fd)
FD_ZERO(rfds); FD_ZERO(rfds);
FD_SET(signal_pipe[0], rfds); FD_SET(signal_pipe[0], rfds);
if (extra_fd >= 0) { if (extra_fd >= 0) {
fcntl(extra_fd, F_SETFD, FD_CLOEXEC); close_on_exec_on(extra_fd);
FD_SET(extra_fd, rfds); FD_SET(extra_fd, rfds);
} }
return signal_pipe[0] > extra_fd ? signal_pipe[0] : extra_fd; return signal_pipe[0] > extra_fd ? signal_pipe[0] : extra_fd;

View File

@ -50,11 +50,6 @@ unsigned byte_chr(char *s,unsigned n,int c)
return t - s; return t - s;
} }
int coe(int fd)
{
return fcntl(fd, F_SETFD, FD_CLOEXEC);
}
#ifdef UNUSED #ifdef UNUSED
static /* as it isn't used anywhere else */ static /* as it isn't used anywhere else */
void tai_pack(char *s, const struct tai *t) void tai_pack(char *s, const struct tai *t)

View File

@ -27,8 +27,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
extern unsigned byte_chr(char *s,unsigned n,int c); extern unsigned byte_chr(char *s,unsigned n,int c);
extern int coe(int);
#define direntry struct dirent #define direntry struct dirent
//struct tai { //struct tai {

View File

@ -454,8 +454,8 @@ int runsv_main(int argc, char **argv)
dir = argv[1]; dir = argv[1];
xpipe(selfpipe); xpipe(selfpipe);
coe(selfpipe[0]); close_on_exec_on(selfpipe[0]);
coe(selfpipe[1]); close_on_exec_on(selfpipe[1]);
ndelay_on(selfpipe[0]); ndelay_on(selfpipe[0]);
ndelay_on(selfpipe[1]); ndelay_on(selfpipe[1]);
@ -491,8 +491,8 @@ int runsv_main(int argc, char **argv)
if (stat("log/down", &s) != -1) if (stat("log/down", &s) != -1)
svd[1].want = W_DOWN; svd[1].want = W_DOWN;
xpipe(logpipe); xpipe(logpipe);
coe(logpipe[0]); close_on_exec_on(logpipe[0]);
coe(logpipe[1]); close_on_exec_on(logpipe[1]);
} }
} }
@ -512,7 +512,7 @@ int runsv_main(int argc, char **argv)
O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600); O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
if (lock_exnb(svd[0].fdlock) == -1) if (lock_exnb(svd[0].fdlock) == -1)
fatal_cannot("lock supervise/lock"); fatal_cannot("lock supervise/lock");
coe(svd[0].fdlock); close_on_exec_on(svd[0].fdlock);
if (haslog) { if (haslog) {
if (mkdir("log/supervise", 0700) == -1) { if (mkdir("log/supervise", 0700) == -1) {
r = readlink("log/supervise", buf, 256); r = readlink("log/supervise", buf, 256);
@ -536,30 +536,30 @@ int runsv_main(int argc, char **argv)
O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600); O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
if (lock_ex(svd[1].fdlock) == -1) if (lock_ex(svd[1].fdlock) == -1)
fatal_cannot("lock log/supervise/lock"); fatal_cannot("lock log/supervise/lock");
coe(svd[1].fdlock); close_on_exec_on(svd[1].fdlock);
} }
mkfifo("log/supervise/control"+4, 0600); mkfifo("log/supervise/control"+4, 0600);
svd[0].fdcontrol = xopen("log/supervise/control"+4, O_RDONLY|O_NDELAY); svd[0].fdcontrol = xopen("log/supervise/control"+4, O_RDONLY|O_NDELAY);
coe(svd[0].fdcontrol); close_on_exec_on(svd[0].fdcontrol);
svd[0].fdcontrolwrite = xopen("log/supervise/control"+4, O_WRONLY|O_NDELAY); svd[0].fdcontrolwrite = xopen("log/supervise/control"+4, O_WRONLY|O_NDELAY);
coe(svd[0].fdcontrolwrite); close_on_exec_on(svd[0].fdcontrolwrite);
update_status(&svd[0]); update_status(&svd[0]);
if (haslog) { if (haslog) {
mkfifo("log/supervise/control", 0600); mkfifo("log/supervise/control", 0600);
svd[1].fdcontrol = xopen("log/supervise/control", O_RDONLY|O_NDELAY); svd[1].fdcontrol = xopen("log/supervise/control", O_RDONLY|O_NDELAY);
coe(svd[1].fdcontrol); close_on_exec_on(svd[1].fdcontrol);
svd[1].fdcontrolwrite = xopen("log/supervise/control", O_WRONLY|O_NDELAY); svd[1].fdcontrolwrite = xopen("log/supervise/control", O_WRONLY|O_NDELAY);
coe(svd[1].fdcontrolwrite); close_on_exec_on(svd[1].fdcontrolwrite);
update_status(&svd[1]); update_status(&svd[1]);
} }
mkfifo("log/supervise/ok"+4, 0600); mkfifo("log/supervise/ok"+4, 0600);
fd = xopen("log/supervise/ok"+4, O_RDONLY|O_NDELAY); fd = xopen("log/supervise/ok"+4, O_RDONLY|O_NDELAY);
coe(fd); close_on_exec_on(fd);
if (haslog) { if (haslog) {
mkfifo("log/supervise/ok", 0600); mkfifo("log/supervise/ok", 0600);
fd = xopen("log/supervise/ok", O_RDONLY|O_NDELAY); fd = xopen("log/supervise/ok", O_RDONLY|O_NDELAY);
coe(fd); close_on_exec_on(fd);
} }
for (;;) { for (;;) {
struct pollfd x[3]; struct pollfd x[3];

View File

@ -190,8 +190,8 @@ static int setup_log(void)
warnx("cannot create pipe for log"); warnx("cannot create pipe for log");
return -1; return -1;
} }
coe(logpipe[1]); close_on_exec_on(logpipe[1]);
coe(logpipe[0]); close_on_exec_on(logpipe[0]);
ndelay_on(logpipe[0]); ndelay_on(logpipe[0]);
ndelay_on(logpipe[1]); ndelay_on(logpipe[1]);
if (dup2(logpipe[1], 2) == -1) { if (dup2(logpipe[1], 2) == -1) {
@ -245,7 +245,7 @@ int runsvdir_main(int argc, char **argv)
curdir = open_read("."); curdir = open_read(".");
if (curdir == -1) if (curdir == -1)
fatal2_cannot("open current directory", ""); fatal2_cannot("open current directory", "");
coe(curdir); close_on_exec_on(curdir);
stampcheck = monotonic_sec(); stampcheck = monotonic_sec();

View File

@ -361,7 +361,7 @@ static unsigned rotate(struct logdir *ld)
/* we presume this cannot fail */ /* we presume this cannot fail */
ld->filecur = fdopen(ld->fdcur, "a"); //// ld->filecur = fdopen(ld->fdcur, "a"); ////
setvbuf(ld->filecur, NULL, _IOFBF, linelen); //// setvbuf(ld->filecur, NULL, _IOFBF, linelen); ////
coe(ld->fdcur); close_on_exec_on(ld->fdcur);
ld->size = 0; ld->size = 0;
while (fchmod(ld->fdcur, 0644) == -1) while (fchmod(ld->fdcur, 0644) == -1)
pause2cannot("set mode of current", ld->name); pause2cannot("set mode of current", ld->name);
@ -482,7 +482,7 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
warn2("cannot open log directory", (char*)fn); warn2("cannot open log directory", (char*)fn);
return 0; return 0;
} }
coe(ld->fddir); close_on_exec_on(ld->fddir);
if (fchdir(ld->fddir) == -1) { if (fchdir(ld->fddir) == -1) {
logdir_close(ld); logdir_close(ld);
warn2("cannot change directory", (char*)fn); warn2("cannot change directory", (char*)fn);
@ -498,7 +498,7 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
pause1cannot("change to initial working directory"); pause1cannot("change to initial working directory");
return 0; return 0;
} }
coe(ld->fdlock); close_on_exec_on(ld->fdlock);
ld->size = 0; ld->size = 0;
ld->sizemax = 1000000; ld->sizemax = 1000000;
@ -624,7 +624,7 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
ld->filecur = fdopen(ld->fdcur, "a"); //// ld->filecur = fdopen(ld->fdcur, "a"); ////
setvbuf(ld->filecur, NULL, _IOFBF, linelen); //// setvbuf(ld->filecur, NULL, _IOFBF, linelen); ////
coe(ld->fdcur); close_on_exec_on(ld->fdcur);
while (fchmod(ld->fdcur, 0644) == -1) while (fchmod(ld->fdcur, 0644) == -1)
pause2cannot("set mode of current", ld->name); pause2cannot("set mode of current", ld->name);
@ -851,7 +851,7 @@ int svlogd_main(int argc, char **argv)
if (dirn <= 0) usage(); if (dirn <= 0) usage();
////if (buflen <= linemax) usage(); ////if (buflen <= linemax) usage();
fdwdir = xopen(".", O_RDONLY|O_NDELAY); fdwdir = xopen(".", O_RDONLY|O_NDELAY);
coe(fdwdir); close_on_exec_on(fdwdir);
dir = xzalloc(dirn * sizeof(struct logdir)); dir = xzalloc(dirn * sizeof(struct logdir));
for (i = 0; i < dirn; ++i) { for (i = 0; i < dirn; ++i) {
dir[i].fddir = -1; dir[i].fddir = -1;

View File

@ -3469,7 +3469,7 @@ setjobctl(int on)
close(ofd); close(ofd);
if (fd < 0) if (fd < 0)
goto out; goto out;
fcntl(fd, F_SETFD, FD_CLOEXEC); close_on_exec_on(fd);
do { /* while we are in the background */ do { /* while we are in the background */
pgrp = tcgetpgrp(fd); pgrp = tcgetpgrp(fd);
if (pgrp < 0) { if (pgrp < 0) {
@ -8830,7 +8830,7 @@ closescript(void)
static void static void
setinputfd(int fd, int push) setinputfd(int fd, int push)
{ {
fcntl(fd, F_SETFD, FD_CLOEXEC); close_on_exec_on(fd);
if (push) { if (push) {
pushfile(); pushfile();
parsefile->buf = 0; parsefile->buf = 0;

View File

@ -760,9 +760,11 @@ static int builtin_eval(char **argv)
static int builtin_cd(char **argv) static int builtin_cd(char **argv)
{ {
const char *newdir; const char *newdir;
if (argv[1] == NULL) if (argv[1] == NULL) {
// bash does nothing (exitcode 0) if HOME is ""; if it's unset,
// bash says "bash: cd: HOME not set" and does nothing (exitcode 1)
newdir = getenv("HOME") ? : "/"; newdir = getenv("HOME") ? : "/";
else } else
newdir = argv[1]; newdir = argv[1];
if (chdir(newdir)) { if (chdir(newdir)) {
printf("cd: %s: %s\n", newdir, strerror(errno)); printf("cd: %s: %s\n", newdir, strerror(errno));
@ -3629,7 +3631,7 @@ static void setup_job_control(void)
saved_task_pgrp = shell_pgrp = getpgrp(); saved_task_pgrp = shell_pgrp = getpgrp();
debug_printf_jobs("saved_task_pgrp=%d\n", saved_task_pgrp); debug_printf_jobs("saved_task_pgrp=%d\n", saved_task_pgrp);
fcntl(interactive_fd, F_SETFD, FD_CLOEXEC); close_on_exec_on(interactive_fd);
/* If we were ran as 'hush &', /* If we were ran as 'hush &',
* sleep until we are in the foreground. */ * sleep until we are in the foreground. */

View File

@ -576,7 +576,7 @@ static int setup_redirects(struct child_prog *prog, int squirrel[])
if (openfd != redir->fd) { if (openfd != redir->fd) {
if (squirrel && redir->fd < 3) { if (squirrel && redir->fd < 3) {
squirrel[redir->fd] = dup(redir->fd); squirrel[redir->fd] = dup(redir->fd);
fcntl(squirrel[redir->fd], F_SETFD, FD_CLOEXEC); close_on_exec_on(squirrel[redir->fd]);
} }
dup2(openfd, redir->fd); dup2(openfd, redir->fd);
close(openfd); close(openfd);