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