- Start rosapps rearrange and cleanup process.
[reactos.git] / rosapps / applications / net / ncftp / sio / SocketUtil.c
1 #include "syshdrs.h"
2
3 #ifndef SO_RCVBUF
4 int
5 GetSocketBufSize(int UNUSED(sockfd), size_t *const rsize, size_t *const ssize)
6 {
7 LIBSIO_USE_VAR(sockfd);
8 if (ssize != NULL)
9 *ssize = 0;
10 if (rsize != NULL)
11 *rsize = 0;
12 return (-1);
13 } /* GetSocketBufSize */
14 #else
15 int
16 GetSocketBufSize(int sockfd, size_t *const rsize, size_t *const ssize)
17 {
18 int rc = -1;
19 int opt;
20 int optsize;
21
22 if (ssize != NULL) {
23 opt = 0;
24 optsize = sizeof(opt);
25 rc = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, &optsize);
26 if (rc == 0)
27 *ssize = (size_t) opt;
28 else
29 *ssize = 0;
30 }
31 if (rsize != NULL) {
32 opt = 0;
33 optsize = sizeof(opt);
34 rc = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &opt, &optsize);
35 if (rc == 0)
36 *rsize = (size_t) opt;
37 else
38 *rsize = 0;
39 }
40 return (rc);
41 } /* GetSocketBufSize */
42 #endif
43
44
45
46
47 #ifndef SO_RCVBUF
48 int
49 SetSocketBufSize(int UNUSED(sockfd), size_t UNUSED(rsize), size_t UNUSED(ssize))
50 {
51 LIBSIO_USE_VAR(sockfd);
52 LIBSIO_USE_VAR(rsize);
53 LIBSIO_USE_VAR(ssize);
54 return (-1);
55 } /* SetSocketBufSize */
56 #else
57 int
58 SetSocketBufSize(int sockfd, size_t rsize, size_t ssize)
59 {
60 int rc = -1;
61 int opt;
62 int optsize;
63
64 if (ssize > 0) {
65 opt = (int) ssize;
66 optsize = sizeof(opt);
67 rc = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char *) &opt, optsize);
68 if (rc < 0)
69 return (rc);
70 }
71 if (rsize > 0) {
72 opt = (int) rsize;
73 optsize = sizeof(opt);
74 rc = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char *) &opt, optsize);
75 if (rc < 0)
76 return (rc);
77 }
78 return (0);
79 } /* SetSocketBufSize */
80 #endif
81
82
83
84
85 #ifndef TCP_NODELAY
86 int
87 GetSocketNagleAlgorithm(const int UNUSED(fd))
88 {
89 LIBSIO_USE_VAR(fd);
90 return (-1);
91 } /* GetSocketNagleAlgorithm */
92 #else
93 int
94 GetSocketNagleAlgorithm(const int fd)
95 {
96 int optsize;
97 int opt;
98
99 opt = -2;
100 optsize = (int) sizeof(opt);
101 if (getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &opt, &optsize) < 0)
102 return (-1);
103 return (opt);
104 } /* GetSocketNagleAlgorithm */
105 #endif /* TCP_NODELAY */
106
107
108
109
110
111 #ifndef TCP_NODELAY
112 int
113 SetSocketNagleAlgorithm(const int UNUSED(fd), const int UNUSED(onoff))
114 {
115 LIBSIO_USE_VAR(fd);
116 LIBSIO_USE_VAR(onoff);
117 return (-1);
118 } /* SetSocketNagleAlgorithm */
119 #else
120 int
121 SetSocketNagleAlgorithm(const int fd, const int onoff)
122 {
123 int optsize;
124 int opt;
125
126 opt = onoff;
127 optsize = (int) sizeof(opt);
128 return (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &opt, optsize));
129 } /* SetSocketNagleAlgorithm */
130 #endif /* TCP_NODELAY */
131
132
133
134 #ifndef SO_LINGER
135 int
136 GetSocketLinger(const int UNUSED(fd), int *const UNUSED(lingertime))
137 {
138 LIBSIO_USE_VAR(fd);
139 LIBSIO_USE_VAR(lingertime);
140 return (-1);
141 } /* GetSocketLinger */
142 #else
143 int
144 GetSocketLinger(const int fd, int *const lingertime)
145 {
146 int optsize;
147 struct linger opt;
148
149 optsize = (int) sizeof(opt);
150 opt.l_onoff = 0;
151 opt.l_linger = 0;
152 if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &opt, &optsize) < 0)
153 return (-1);
154 if (lingertime != NULL)
155 *lingertime = opt.l_linger;
156 return (opt.l_onoff);
157 } /* GetSocketLinger */
158 #endif /* SO_LINGER */
159
160
161
162 #ifndef SO_LINGER
163 int
164 SetSocketLinger(const int UNUSED(fd), const int UNUSED(l_onoff), const int UNUSED(l_linger))
165 {
166 LIBSIO_USE_VAR(fd);
167 LIBSIO_USE_VAR(l_onoff);
168 LIBSIO_USE_VAR(l_linger);
169 return (-1);
170 } /* SetSocketLinger */
171 #else
172 int
173 SetSocketLinger(const int fd, const int l_onoff, const int l_linger)
174 {
175 struct linger opt;
176 int optsize;
177 /*
178 * From hpux:
179 *
180 * Structure used for manipulating linger option.
181 *
182 * if l_onoff == 0:
183 * close(2) returns immediately; any buffered data is sent later
184 * (default)
185 *
186 * if l_onoff != 0:
187 * if l_linger == 0, close(2) returns after discarding any unsent data
188 * if l_linger != 0, close(2) does not return until buffered data is sent
189 */
190 #if 0
191 struct linger {
192 int l_onoff; /* 0 = do not wait to send data */
193 /* non-0 = see l_linger */
194 int l_linger; /* 0 = discard unsent data */
195 /* non-0 = wait to send data */
196 };
197 #endif
198 opt.l_onoff = l_onoff;
199 opt.l_linger = l_linger;
200 optsize = (int) sizeof(opt);
201 return (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &opt, optsize));
202 } /* SetSocketLinger */
203 #endif /* SO_LINGER */