/* * Requires fd to be open and need_fd to be closed. * If possible, need_fd will be open afterwards and refer to * the object originally reffered by fd. fd will be closed then. * Works just like ``fcntl(fd, DUPFD, need_fd); close(fd);'' * * need_fd is returned on success, else -1 is returned. */ int lf_move_fd(int fd, int need_fd) { int r = -1; if (fd == need_fd) return fd; if (fd >= 0 && fd < need_fd) r = lf_move_fd(dup(fd), need_fd); close(fd); return r; }
static int logfile_reopen(char *name, int wantfd, Log *l) { int got_fd; close(wantfd); if (((got_fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666)) < 0) || lf_move_fd(got_fd, wantfd) < 0) { logfclose(l); return -1; } changed_logfile(l); l->st->st_ino = l->st->st_dev = 0; return 0; }
static int logfile_reopen(char *name, int wantfd, struct logfile *l) { int got_fd; close(wantfd); if (((got_fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666)) < 0) || lf_move_fd(got_fd, wantfd) < 0) { logfclose(l); debug("logfile_reopen: failed for %s\n", name); return -1; } changed_logfile(l); l->st->st_ino = l->st->st_dev = 0; debug("logfile_reopen: %d = %s\n", wantfd, name); return 0; }