1/*
2 *  OpenVPN -- An application to securely tunnel IP networks
3 *             over a single UDP port, with support for SSL/TLS-based
4 *             session authentication and key exchange,
5 *             packet encryption, packet authentication, and
6 *             packet compression.
7 *
8 *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
9 *
10 *  This program is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 2
12 *  as published by the Free Software Foundation.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program (see the file COPYING included with this
21 *  distribution); if not, write to the Free Software Foundation, Inc.,
22 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 */
24
25#ifdef HAVE_CONFIG_H
26#include "config.h"
27#elif defined(_MSC_VER)
28#include "config-msvc.h"
29#endif
30
31#include "syshead.h"
32
33#include "fdmisc.h"
34#include "error.h"
35
36#include "memdbg.h"
37
38/* Set a file descriptor to non-blocking */
39bool
40set_nonblock_action (int fd)
41{
42#ifdef WIN32
43  u_long arg = 1;
44  if (ioctlsocket (fd, FIONBIO, &arg))
45    return false;
46#else
47  if (fcntl (fd, F_SETFL, O_NONBLOCK) < 0)
48    return false;
49#endif
50  return true;
51}
52
53/* Set a file descriptor to not be passed across execs */
54bool
55set_cloexec_action (int fd)
56{
57#ifndef WIN32
58  if (fcntl (fd, F_SETFD, FD_CLOEXEC) < 0)
59    return false;
60#endif
61  return true;
62}
63
64/* Set a file descriptor to non-blocking */
65void
66set_nonblock (int fd)
67{
68  if (!set_nonblock_action (fd))
69    msg (M_ERR, "Set socket to non-blocking mode failed");
70}
71
72/* Set a file descriptor to not be passed across execs */
73void
74set_cloexec (int fd)
75{
76  if (!set_cloexec_action (fd))
77    msg (M_ERR, "Set FD_CLOEXEC flag on file descriptor failed");
78}
79