1/*	$NetBSD$	*/
2
3/*++
4/* NAME
5/*	close_on_exec 3
6/* SUMMARY
7/*	set/clear close-on-exec flag
8/* SYNOPSIS
9/*	#include <iostuff.h>
10/*
11/*	int	close_on_exec(int fd, int on)
12/* DESCRIPTION
13/*	the \fIclose_on_exec\fR() function manipulates the close-on-exec
14/*	flag for the specified open file, and returns the old setting.
15/*
16/*	Arguments:
17/* .IP fd
18/*	A file descriptor.
19/* .IP on
20/*	Use CLOSE_ON_EXEC or PASS_ON_EXEC.
21/* DIAGNOSTICS
22/*	All errors are fatal.
23/* LICENSE
24/* .ad
25/* .fi
26/*	The Secure Mailer license must be distributed with this software.
27/* AUTHOR(S)
28/*	Wietse Venema
29/*	IBM T.J. Watson Research
30/*	P.O. Box 704
31/*	Yorktown Heights, NY 10598, USA
32/*--*/
33
34/* System interfaces. */
35
36#include <sys_defs.h>
37#include <fcntl.h>
38
39/* Utility library. */
40
41#include "msg.h"
42
43/* Application-specific. */
44
45#include "iostuff.h"
46
47#define PATTERN	FD_CLOEXEC
48
49/* close_on_exec - set/clear close-on-exec flag */
50
51int     close_on_exec(fd, on)
52int     fd;
53int     on;
54{
55    int     flags;
56
57    if ((flags = fcntl(fd, F_GETFD, 0)) < 0)
58	msg_fatal("fcntl: get flags: %m");
59    if (fcntl(fd, F_SETFD, on ? flags | PATTERN : flags & ~PATTERN) < 0)
60	msg_fatal("fcntl: set close-on-exec flag %s: %m", on ? "on" : "off");
61    return ((flags & PATTERN) != 0);
62}
63