diff options
author | Denis Vlasenko | 2008-09-21 15:29:29 +0000 |
---|---|---|
committer | Denis Vlasenko | 2008-09-21 15:29:29 +0000 |
commit | 30cfdf90ceecad82a378396fad517cb4d3fe7b30 (patch) | |
tree | 419fcca48293f604278c31b65f3d5fe07c967e20 /miscutils | |
parent | 006e8628fc0a25c08df99f3b86d0c47f44aacc2b (diff) | |
download | busybox-30cfdf90ceecad82a378396fad517cb4d3fe7b30.zip busybox-30cfdf90ceecad82a378396fad517cb4d3fe7b30.tar.gz |
crontab: do not destroy STDIN_FILENO, editor may need it (crontab -e)
vi: deal with EOF/error on stdin and with input NULs
function old new delta
crontab_main 623 642 +19
edit_file 901 906 +5
readit 331 318 -13
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/crontab.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/miscutils/crontab.c b/miscutils/crontab.c index ef6d943..673b558 100644 --- a/miscutils/crontab.c +++ b/miscutils/crontab.c @@ -93,6 +93,7 @@ int crontab_main(int argc UNUSED_PARAM, char **argv) char *new_fname; char *user_name; /* -u USER */ int fd; + int src_fd; int opt_ler; /* file [opts] Replace crontab from file @@ -144,15 +145,15 @@ int crontab_main(int argc UNUSED_PARAM, char **argv) bb_show_usage(); /* Read replacement file under user's UID/GID/group vector */ + src_fd = STDIN_FILENO; if (!opt_ler) { /* Replace? */ if (!argv[0]) bb_show_usage(); if (NOT_LONE_DASH(argv[0])) { - fd = open_as_user(pas, argv[0]); - if (fd < 0) + src_fd = open_as_user(pas, argv[0]); + if (src_fd < 0) bb_error_msg_and_die("user %s cannot read %s", pas->pw_name, argv[0]); - xmove_fd(fd, STDIN_FILENO); } } @@ -180,23 +181,23 @@ int crontab_main(int argc UNUSED_PARAM, char **argv) tmp_fname = xasprintf("%s.%u", crontab_dir, (unsigned)getpid()); /* No O_EXCL: we don't want to be stuck if earlier crontabs * were killed, leaving stale temp file behind */ - fd = xopen3(tmp_fname, O_RDWR|O_CREAT|O_TRUNC, 0600); - xmove_fd(fd, STDIN_FILENO); - fchown(STDIN_FILENO, pas->pw_uid, pas->pw_gid); + src_fd = xopen3(tmp_fname, O_RDWR|O_CREAT|O_TRUNC, 0600); + fchown(src_fd, pas->pw_uid, pas->pw_gid); fd = open(pas->pw_name, O_RDONLY); if (fd >= 0) { - bb_copyfd_eof(fd, STDIN_FILENO); + bb_copyfd_eof(fd, src_fd); close(fd); + xlseek(src_fd, 0, SEEK_SET); } + close_on_exec_on(src_fd); /* don't want editor to see this fd */ edit_file(pas, tmp_fname); - xlseek(STDIN_FILENO, 0, SEEK_SET); /* fall through */ case 0: /* Replace (no -l, -e, or -r were given) */ new_fname = xasprintf("%s.new", pas->pw_name); fd = open(new_fname, O_WRONLY|O_CREAT|O_TRUNC|O_APPEND, 0600); if (fd >= 0) { - bb_copyfd_eof(STDIN_FILENO, fd); + bb_copyfd_eof(src_fd, fd); close(fd); xrename(new_fname, pas->pw_name); } else { |