示例#1
0
/*
 * 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;
}
示例#2
0
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;
}
示例#3
0
文件: logfile.c 项目: cuidi/screen
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;
}