1%%	options
2
3copyright owner	=	Dirk Krause
4copyright year	=	2015-xxxx
5SPDX-License-Identifier:	BSD-3-Clause
6
7
8
9%%	module
10
11#include "dk4conf.h"
12#include <libdk4sock/dk4sock.h>
13
14#include <stdio.h>
15
16#if DK4_HAVE_ERRNO_H
17#ifndef ERRNO_H_INCLUDED
18#include <errno.h>
19#define	ERRNO_H_INCLUDED 1
20#endif
21#endif
22
23#if DK4_HAVE_FCNTL_H
24#ifndef FCNTL_H_INCLUDED
25#include <fcntl.h>
26#define	FCNTL_H_INCLUDED 1
27#endif
28#endif
29
30#if DK4_HAVE_UNISTD_H
31#ifndef	UNISTD_H_INCLUDED
32#include <unistd.h>
33#define	UNISTD_H_INCLUDED 1
34#endif
35#endif
36
37#if DK4_HAVE_IO_H
38#ifndef	IO_H_INCLUDED
39#include <io.h>
40#define	IO_H_INCLUDED 1
41#endif
42#endif
43
44#if DK4_HAVE_ASSERT_H
45#ifndef	ASSERT_H_INCLUDED
46#include <assert.h>
47#define	ASSERT_H_INCLUDED 1
48#endif
49#endif
50
51
52$!trace-include
53
54
55
56int
57dk4socket_option_set_nonblock(
58  dk4_socket_t	 sock,
59  int		 val,
60  dk4_er_t	*erp
61)
62{
63#if DK4_ON_WINDOWS
64  unsigned long	 xv	= 0UL;
65  int		 back	= DK4_SOCKET_RESULT_FAILED;
66#if	DK4_USE_ASSERT
67  assert(INVALID_SOCKET != sock);
68#endif
69  if (INVALID_SOCKET != sock) {
70    if (0 != val) { xv = 0x11111111UL; }
71    WSASetLastError(0);
72    if (0 == ioctlsocket(sock, FIONBIO, &xv)) {
73      back = DK4_SOCKET_RESULT_SUCCESS;
74    } else {
75      dk4error_set_idetails(erp, DK4_E_SOCKET_IOCTLSOCKET, WSAGetLastError());
76    }
77  } else {
78    dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
79  }
80  return back;
81#else
82  int		 back = DK4_SOCKET_RESULT_FAILED;
83  int		 om;
84#if	DK4_USE_ASSERT
85  assert(INVALID_SOCKET != sock);
86#endif
87  if (INVALID_SOCKET != sock) {
88    om = fcntl(sock, F_GETFL);
89    if (0 != val) {
90      if (0 != (om & O_NONBLOCK)) {
91        back = DK4_SOCKET_RESULT_SUCCESS;
92      } else {
93        om |= O_NONBLOCK;
94	errno = 0;
95	if (-1 != fcntl(sock, F_SETFL, om)) {
96	  back = DK4_SOCKET_RESULT_SUCCESS;
97	} else {
98	  dk4error_set_idetails(erp, DK4_E_SOCKET_FCNTL, errno);
99	}
100      }
101    } else {
102      if (0 == (om & O_NONBLOCK)) {
103        back = DK4_SOCKET_RESULT_SUCCESS;
104      } else {
105        om &= (~(O_NONBLOCK));
106	errno = 0;
107	if (-1 != fcntl(sock, F_SETFL, om)) {
108	  back = DK4_SOCKET_RESULT_SUCCESS;
109	} else {
110	  dk4error_set_idetails(erp, DK4_E_SOCKET_FCNTL, errno);
111	}
112      }
113    }
114  } else {
115    dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
116  }
117  return back;
118#endif
119}
120
121