aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/Makefile.am2
-rw-r--r--src/include/platform_interface.h142
-rw-r--r--src/include/w32functions.h191
3 files changed, 334 insertions, 1 deletions
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 66761396..728bee83 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -6,4 +6,4 @@ endif
6 6
7include_HEADERS = microhttpd.h $(microspdy) 7include_HEADERS = microhttpd.h $(microspdy)
8 8
9EXTRA_DIST = platform.h 9EXTRA_DIST = platform.h platform_interface.h w32functions.h
diff --git a/src/include/platform_interface.h b/src/include/platform_interface.h
new file mode 100644
index 00000000..22f78166
--- /dev/null
+++ b/src/include/platform_interface.h
@@ -0,0 +1,142 @@
1/*
2 This file is part of libmicrohttpd
3 (C) 2014 Karlson2k (Evgeny Grin)
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library.
17 If not, see <http://www.gnu.org/licenses/>.
18*/
19
20/**
21 * @file platform/platfrom_interface.h
22 * @brief internal platform abstraction functions
23 * @author Karlson2k (Evgeny Grin)
24 */
25
26#ifndef MHD_PLATFORM_INTERFACE_H
27#define MHD_PLATFORM_INTERFACE_H
28
29#include "platform.h"
30#if defined(_WIN32) && !defined(__CYGWIN__)
31#include "w32functions.h"
32#endif
33
34/* MHD_socket_close_(fd) close any FDs (non-W32) / close only socket FDs (W32) */
35#if !defined(_WIN32) || defined(__CYGWIN__)
36#define MHD_socket_close_(fd) close((fd))
37#else
38#define MHD_socket_close_(fd) closesocket((fd))
39#endif
40
41/* MHD_socket_errno_ is errno of last function (non-W32) / errno of last socket function (W32) */
42#if !defined(_WIN32) || defined(__CYGWIN__)
43#define MHD_socket_errno_ errno
44#else
45#define MHD_socket_errno_ MHD_W32_errno_from_winsock_()
46#endif
47
48/* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
49 * description string of last socket error (W32) */
50#if !defined(_WIN32) || defined(__CYGWIN__)
51#define MHD_socket_last_strerr_() strerror(errno)
52#else
53#define MHD_socket_last_strerr_() MHD_W32_strerror_last_winsock_()
54#endif
55
56/* MHD_strerror_ is strerror (both non-W32/W32) */
57#if !defined(_WIN32) || defined(__CYGWIN__)
58#define MHD_strerror_(errnum) strerror((errnum))
59#else
60#define MHD_strerror_(errnum) MHD_W32_strerror_((errnum))
61#endif
62
63/* MHD_set_socket_errno_ set errno to errnum (non-W32) / set socket last error to errnum (W32) */
64#if !defined(_WIN32) || defined(__CYGWIN__)
65#define MHD_set_socket_errno_(errnum) errno=(errnum)
66#else
67#define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum))
68#endif
69
70/* MHD_SYS_select_ is wrapper macro for system select() function */
71#if !defined(MHD_WINSOCK_SOCKETS)
72#define MHD_SYS_select_(n,r,w,e,t) select((n),(r),(w),(e),(t))
73#else
74#define MHD_SYS_select_(n,r,w,e,t) select((int)0,(r),(w),(e),(t))
75#endif
76
77/* MHD_pipe_ create pipe (!MHD_DONT_USE_PIPES) /
78 * create two connected sockets (MHD_DONT_USE_PIPES) */
79#ifndef MHD_DONT_USE_PIPES
80#define MHD_pipe_(fdarr) pipe((fdarr))
81#else /* MHD_DONT_USE_PIPES */
82#if !defined(_WIN32) || defined(__CYGWIN__)
83#define MHD_pipe_(fdarr) socketpair(AF_LOCAL, SOCK_STREAM, 0, (fdarr))
84#else /* !defined(_WIN32) || defined(__CYGWIN__) */
85#define MHD_pipe_(fdarr) MHD_W32_pair_of_sockets_((fdarr))
86#endif /* !defined(_WIN32) || defined(__CYGWIN__) */
87#endif /* MHD_DONT_USE_PIPES */
88
89/* MHD_pipe_errno_ is errno of last function (!MHD_DONT_USE_PIPES) /
90 * errno of last emulated pipe function (MHD_DONT_USE_PIPES) */
91#ifndef MHD_DONT_USE_PIPES
92#define MHD_pipe_errno_ errno
93#else
94#define MHD_pipe_errno_ MHD_socket_errno_
95#endif
96
97/* MHD_pipe_last_strerror_ is description string of last errno (!MHD_DONT_USE_PIPES) /
98 * description string of last pipe error (MHD_DONT_USE_PIPES) */
99#ifndef MHD_DONT_USE_PIPES
100#define MHD_pipe_last_strerror_() strerror(errno)
101#else
102#define MHD_pipe_last_strerror_() MHD_socket_last_strerr_()
103#endif
104
105/* MHD_pipe_write_ write data to real pipe (!MHD_DONT_USE_PIPES) /
106 * write data to emulated pipe (MHD_DONT_USE_PIPES) */
107#ifndef MHD_DONT_USE_PIPES
108#define MHD_pipe_write_(fd, ptr, sz) write((fd), (const void*)(ptr), (sz))
109#else
110#define MHD_pipe_write_(fd, ptr, sz) send((fd), (const char*)(ptr), (sz), 0)
111#endif
112
113/* MHD_pipe_read_ read data from real pipe (!MHD_DONT_USE_PIPES) /
114 * read data from emulated pipe (MHD_DONT_USE_PIPES) */
115#ifndef MHD_DONT_USE_PIPES
116#define MHD_pipe_read_(fd, ptr, sz) read((fd), (void*)(ptr), (sz))
117#else
118#define MHD_pipe_read_(fd, ptr, sz) recv((fd), (char*)(ptr), (sz), 0)
119#endif
120
121/* MHD_pipe_close_(fd) close any FDs (non-W32) /
122 * close emulated pipe FDs (W32) */
123#ifndef MHD_DONT_USE_PIPES
124#define MHD_pipe_close_(fd) close((fd))
125#else
126#define MHD_pipe_close_(fd) MHD_socket_close_((fd))
127#endif
128
129/* MHD_INVALID_PIPE_ is a value of bad pipe FD */
130#ifndef MHD_DONT_USE_PIPES
131#define MHD_INVALID_PIPE_ (-1)
132#else
133#define MHD_INVALID_PIPE_ MHD_INVALID_SOCKET
134#endif
135
136#if !defined(_WIN32) || defined(__CYGWIN__)
137#define MHD_random_() random()
138#else
139#define MHD_random_() MHD_W32_random()
140#endif
141
142#endif // MHD_PLATFORM_INTERFACE_H
diff --git a/src/include/w32functions.h b/src/include/w32functions.h
new file mode 100644
index 00000000..7a25803b
--- /dev/null
+++ b/src/include/w32functions.h
@@ -0,0 +1,191 @@
1/*
2 This file is part of libmicrohttpd
3 (C) 2014 Karlson2k (Evgeny Grin)
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library.
17 If not, see <http://www.gnu.org/licenses/>.
18*/
19
20/**
21 * @file platform/w32functions.h
22 * @brief internal functions for W32 systems
23 * @author Karlson2k (Evgeny Grin)
24 */
25
26#ifndef MHD_W32FUNCTIONS_H
27#define MHD_W32FUNCTIONS_H
28#ifndef _WIN32
29#error w32functions.h is designed only for W32 systems
30#endif
31
32#include <errno.h>
33#include <winsock2.h>
34#include "platform.h"
35#include "platform_interface.h"
36
37#ifdef __cplusplus
38extern "C"
39{
40#endif
41
42#define MHDW32ERRBASE 3300
43
44#ifndef EWOULDBLOCK
45#define EWOULDBLOCK (MHDW32ERRBASE+1)
46#endif
47#ifndef EINPROGRESS
48#define EINPROGRESS (MHDW32ERRBASE+2)
49#endif
50#ifndef EALREADY
51#define EALREADY (MHDW32ERRBASE+3)
52#endif
53#ifndef ENOTSOCK
54#define ENOTSOCK (MHDW32ERRBASE+4)
55#endif
56#ifndef EDESTADDRREQ
57#define EDESTADDRREQ (MHDW32ERRBASE+5)
58#endif
59#ifndef EMSGSIZE
60#define EMSGSIZE (MHDW32ERRBASE+6)
61#endif
62#ifndef EPROTOTYPE
63#define EPROTOTYPE (MHDW32ERRBASE+7)
64#endif
65#ifndef ENOPROTOOPT
66#define ENOPROTOOPT (MHDW32ERRBASE+8)
67#endif
68#ifndef EPROTONOSUPPORT
69#define EPROTONOSUPPORT (MHDW32ERRBASE+9)
70#endif
71#ifndef EOPNOTSUPP
72#define EOPNOTSUPP (MHDW32ERRBASE+10)
73#endif
74#ifndef EAFNOSUPPORT
75#define EAFNOSUPPORT (MHDW32ERRBASE+11)
76#endif
77#ifndef EADDRINUSE
78#define EADDRINUSE (MHDW32ERRBASE+12)
79#endif
80#ifndef EADDRNOTAVAIL
81#define EADDRNOTAVAIL (MHDW32ERRBASE+13)
82#endif
83#ifndef ENETDOWN
84#define ENETDOWN (MHDW32ERRBASE+14)
85#endif
86#ifndef ENETUNREACH
87#define ENETUNREACH (MHDW32ERRBASE+15)
88#endif
89#ifndef ENETRESET
90#define ENETRESET (MHDW32ERRBASE+16)
91#endif
92#ifndef ECONNABORTED
93#define ECONNABORTED (MHDW32ERRBASE+17)
94#endif
95#ifndef ECONNRESET
96#define ECONNRESET (MHDW32ERRBASE+18)
97#endif
98#ifndef ENOBUFS
99#define ENOBUFS (MHDW32ERRBASE+19)
100#endif
101#ifndef EISCONN
102#define EISCONN (MHDW32ERRBASE+20)
103#endif
104#ifndef ENOTCONN
105#define ENOTCONN (MHDW32ERRBASE+21)
106#endif
107#ifndef ETOOMANYREFS
108#define ETOOMANYREFS (MHDW32ERRBASE+22)
109#endif
110#ifndef ECONNREFUSED
111#define ECONNREFUSED (MHDW32ERRBASE+23)
112#endif
113#ifndef ELOOP
114#define ELOOP (MHDW32ERRBASE+24)
115#endif
116#ifndef EHOSTDOWN
117#define EHOSTDOWN (MHDW32ERRBASE+25)
118#endif
119#ifndef EHOSTUNREACH
120#define EHOSTUNREACH (MHDW32ERRBASE+26)
121#endif
122#ifndef EPROCLIM
123#define EPROCLIM (MHDW32ERRBASE+27)
124#endif
125#ifndef EUSERS
126#define EUSERS (MHDW32ERRBASE+28)
127#endif
128#ifndef EDQUOT
129#define EDQUOT (MHDW32ERRBASE+29)
130#endif
131#ifndef ESTALE
132#define ESTALE (MHDW32ERRBASE+30)
133#endif
134#ifndef EREMOTE
135#define EREMOTE (MHDW32ERRBASE+31)
136#endif
137#ifndef ESOCKTNOSUPPORT
138#define ESOCKTNOSUPPORT (MHDW32ERRBASE+32)
139#endif
140#ifndef EPFNOSUPPORT
141#define EPFNOSUPPORT (MHDW32ERRBASE+33)
142#endif
143#ifndef ESHUTDOWN
144#define ESHUTDOWN (MHDW32ERRBASE+34)
145#endif
146#ifndef ENODATA
147#define ENODATA (MHDW32ERRBASE+35)
148#endif
149
150/**
151 * Return errno equivalent of last winsock error
152 * @return errno equivalent of last winsock error
153 */
154int MHD_W32_errno_from_winsock_(void);
155/**
156 * Return pointer to string description of errnum error
157 * Works fine with both standard errno errnums
158 * and errnums from MHD_W32_errno_from_winsock_
159 * @param errnum the errno or value from MHD_W32_errno_from_winsock_()
160 * @return pointer to string description of error
161 */
162const char* MHD_W32_strerror_(int errnum);
163/**
164 * Return pointer to string description of last winsock error
165 * @return pointer to string description of last winsock error
166 */
167const char* MHD_W32_strerror_last_winsock_(void);
168/**
169 * Set last winsock error to equivalent of given errno value
170 * @param errnum the errno value to set
171 */
172void MHD_W32_set_last_winsock_error_(int errnum);
173
174/**
175 * Create pair of mutually connected TCP/IP sockets on loopback address
176 * @param sockets_pair array to receive resulted sockets
177 * @return zero on success, -1 otherwise
178 */
179int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]);
180/**
181 * Generate 31-bit pseudo random number.
182 * Function initialize itself at first call to current time.
183 * @return 31-bit pseudo random number.
184 */
185_MHD_EXTERN int MHD_W32_random(void); /* must be exported for "make check" tests */
186 /* TODO: exclude from exports */
187
188#ifdef __cplusplus
189}
190#endif
191#endif //MHD_W32FUNCTIONS_H