view src/lib/fd-close-on-exec.c @ 1741:9df02b1533b3 HEAD

Removed most of the license comments from src/lib/*.c. It's just fine to keep them in a single COPYING.MIT file. Changed a few other comments as well.
author Timo Sirainen <tss@iki.fi>
date Wed, 27 Aug 2003 00:18:16 +0300
parents 8c28289a15a1
children 1b0153eb3fa5
line wrap: on
line source

/* Copyright (c) 2002-2003 Timo Sirainen */

#include "lib.h"
#include "network.h"
#include "fd-close-on-exec.h"

#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/un.h>

void fd_close_on_exec(int fd, int set)
{
	int flags;

	flags = fcntl(fd, F_GETFD, 0);
	if (flags < 0)
		i_fatal("fcntl(F_GETFD, %d) failed: %m", fd);

	flags = set ? (flags | FD_CLOEXEC) : (flags & ~FD_CLOEXEC);
	if (fcntl(fd, F_SETFD, flags) < 0)
		i_fatal("fcntl(F_SETFD, %d) failed: %m", fd);
}

void fd_debug_verify_leaks(int first_fd, int last_fd)
{
	struct ip_addr addr;
	unsigned int port;
	struct stat st;

	while (first_fd < last_fd) {
		if (fcntl(first_fd, F_GETFD, 0) != -1 || errno != EBADF) {
			int old_errno = errno;

			if (net_getsockname(first_fd, &addr, &port) == 0) {
				if (addr.family == AF_UNIX) {
					struct sockaddr_un sa;
					socklen_t socklen = sizeof(sa);

					if (getsockname(first_fd,
							(struct sockaddr *) &sa,
							&socklen) < 0)
						sa.sun_path[0] = '\0';

					i_panic("Leaked UNIX socket fd %d: %s",
						first_fd, sa.sun_path);
				}

				i_panic("Leaked socket fd %d: %s:%u",
					first_fd, net_ip2addr(&addr), port);
			}

			if (fstat(first_fd, &st) == 0) {
#ifdef HAVE_SYS_SYSMACROS_H
				i_panic("Leaked file fd %d: dev %s.%s inode %s", first_fd,
					dec2str(major(st.st_dev)),
					dec2str(minor(st.st_dev)),
					dec2str(st.st_ino));
#else
				i_panic("Leaked file fd %d: dev %s inode %s",
					first_fd, dec2str(st.st_dev),
					dec2str(st.st_ino));
#endif
			}

			i_panic("Leaked unknown fd %d (errno = %s)",
				first_fd, strerror(old_errno));
		}
		first_fd++;
	}
}