Browse code

Moved branch into official BETA21 position.

git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@2959 e7ae566f-a301-0410-adde-c780ea21d3b5

james authored on 2008/05/13 05:31:43
Showing 91 changed files
... ...
@@ -3,6 +3,7 @@
3 3
 *.patch
4 4
 *.diff
5 5
 *.tmp
6
+*.html
6 7
 tmp*
7 8
 log*
8 9
 files
... ...
@@ -22,18 +22,55 @@
22 22
 #  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
 #
24 24
 
25
+LDADD = @LIBOBJS@
26
+.PHONY: plugin
27
+
25 28
 # This option prevents autoreconf from overriding our COPYING and
26 29
 # INSTALL targets:
27 30
 AUTOMAKE_OPTIONS = foreign
28 31
 
29
-sbin_PROGRAMS = openvpn
32
+MAINTAINERCLEANFILES = \
33
+	config.log config.status \
34
+	$(srcdir)/Makefile.in \
35
+	$(srcdir)/config.h.in $(srcdir)/config.h.in~ $(srcdir)/configure \
36
+	$(srcdir)/install-sh $(srcdir)/ltmain.sh $(srcdir)/missing \
37
+	$(srcdir)/depcomp $(srcdir)/aclocal.m4 \
38
+	$(srcdir)/config.guess $(srcdir)/config.sub \
39
+	$(srcdir)/config-win32.h $(srcdir)/openvpn.spec
40
+CLEANFILES = openvpn.8.html
30 41
 
31
-nodist_openvpn_SOURCES = config.h
42
+EXTRA_DIST = \
43
+	easy-rsa \
44
+	sample-config-files \
45
+	sample-keys \
46
+	sample-scripts \
47
+	suse \
48
+	tap-win32 \
49
+	contrib \
50
+	debug \
51
+	plugin
52
+
53
+SUBDIRS = \
54
+	images \
55
+	service-win32 \
56
+	install-win32
32 57
 
33 58
 TESTS = t_lpback.sh t_cltsrv.sh
34
-dist_noinst_SCRIPTS = $(TESTS)
59
+sbin_PROGRAMS = openvpn
35 60
 
36
-.PHONY: plugin
61
+dist_noinst_HEADERS = \
62
+	config-win32.h
63
+
64
+dist_noinst_SCRIPTS = \
65
+	$(TESTS) \
66
+	doclean \
67
+	domake-win
68
+
69
+dist_noinst_DATA = \
70
+	openvpn.spec \
71
+	COPYRIGHT.GPL \
72
+	PORTS \
73
+	INSTALL-win32.txt
37 74
 
38 75
 openvpn_SOURCES = \
39 76
         base64.c base64.h \
... ...
@@ -80,6 +117,7 @@ openvpn_SOURCES = \
80 80
 	pool.c pool.h \
81 81
 	proto.c proto.h \
82 82
 	proxy.c proxy.h \
83
+	ieproxy.h ieproxy.c \
83 84
         ps.c ps.h \
84 85
 	push.c push.h \
85 86
 	reliable.c reliable.h \
... ...
@@ -94,44 +132,19 @@ openvpn_SOURCES = \
94 94
 	status.c status.h \
95 95
 	syshead.h \
96 96
 	thread.c thread.h \
97
-	tun.c tun.h
98
-
99
-LDADD = @LIBOBJS@
100
-
101
-man_MANS = openvpn.8
97
+	tun.c tun.h \
98
+	win32.h win32.c \
99
+	cryptoapi.h cryptoapi.c
102 100
 
103
-EXTRA_DIST = \
104
-	doclean \
105
-	$(man_MANS) \
106
-	COPYRIGHT.GPL \
107
-	PORTS \
108
-	openvpn.spec \
109
-	easy-rsa \
110
-	sample-config-files \
111
-	sample-keys \
112
-	sample-scripts \
113
-	gentoo \
114
-	suse \
115
-	openvpn.spec.in \
116
-	config-win32.h \
117
-	win32.h \
118
-	win32.c \
119
-	cryptoapi.h \
120
-	cryptoapi.c \
121
-	makefile.w32 \
122
-        makefile.w32-vc \
123
-	INSTALL-win32.txt \
124
-	tap-win32 \
125
-	install-win32 \
126
-	service-win32 \
127
-	contrib \
128
-	debug \
129
-	plugin \
130
-        management \
131
-	images \
132
-	ieproxy.c \
133
-	ieproxy.h \
134
-	domake-win
135 101
 
136 102
 dist-hook:
137 103
 	cd $(distdir) && for i in $(EXTRA_DIST) ; do find $$i -name .svn -type d -prune -exec rm -rf '{}' ';' ; rm -f `find $$i -type f | grep -E '(^|\/)\.?\#|\~$$|\.s?o$$'` ; done
104
+
105
+if WIN32
106
+dist_noinst_DATA += openvpn.8
107
+nodist_html_DATA = openvpn.8.html
108
+openvpn.8.html: $(srcdir)/openvpn.8
109
+	$(MAN2HTML) < $(srcdir)/openvpn.8 > openvpn.8.html
110
+else
111
+dist_man_MANS = openvpn.8
112
+endif
... ...
@@ -96,10 +96,19 @@ AC_DEFUN([TYPE_SOCKLEN_T],
96 96
          for arg2 in "struct sockaddr" void; do
97 97
             for t in int size_t unsigned long "unsigned long"; do
98 98
                AC_TRY_COMPILE([
99
+                  #ifdef _WIN32
100
+                  #include <windows.h>
101
+                  #define PREFIX1 WINSOCK_API_LINKAGE
102
+                  #define PREFIX2 PASCAL
103
+                  #else
99 104
                   #include <sys/types.h>
100 105
                   #include <sys/socket.h>
106
+                  #define PREFIX1
107
+                  #define PREFIX2
108
+                  #define SOCKET int
109
+                  #endif
101 110
 
102
-                  int getpeername (int, $arg2 *, $t *);
111
+                  PREFIX1 int PREFIX2 getpeername (SOCKET, $arg2 *, $t *);
103 112
                ],[
104 113
                   $t len;
105 114
                   getpeername(0,0,&len);
... ...
@@ -31,15 +31,9 @@
31 31
  * SUCH DAMAGE.
32 32
  */
33 33
 
34
-#ifdef WIN32
35
-#include "config-win32.h"
36
-#else
37
-#include "config.h"
38
-#endif
39
-
40 34
 #include "syshead.h"
41 35
 
42
-#ifdef ENABLE_HTTP_PROXY
36
+#if defined(ENABLE_HTTP_PROXY) || defined(ENABLE_PKCS11)
43 37
 
44 38
 #include "base64.h"
45 39
 
... ...
@@ -143,7 +137,7 @@ base64_decode(const char *str, void *data)
143 143
     return q - (unsigned char *) data;
144 144
 }
145 145
 
146
-#endif /* NTLM */
146
+#endif /* NTLM, PKCS#11 */
147 147
 
148 148
 #else
149 149
 static void dummy(void) {}
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "common.h"
34 28
deleted file mode 100644
... ...
@@ -1,321 +0,0 @@
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-2005 OpenVPN Solutions LLC <info@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
-/*
26
- * Configuration header for Win32 using the mingw environment.
27
- * Manually edited based on linux version as generated by autoconf.
28
- *
29
- * config-win32.h is normally generated by copying
30
- * config-win32.h.in -> config-win32.h and replacing
31
- * [ampersand] VERSION [ampersand]
32
- * with the appropriate version #.  This is normally
33
- * done automatically by configure.ac
34
- */
35
-
36
-#include <windows.h>
37
-#include <winsock2.h>
38
-#include "autodefs/defs.h"
39
-
40
-#define sleep(x) Sleep((x)*1000)
41
-
42
-#define random rand
43
-#define srandom srand
44
-
45
-typedef unsigned long in_addr_t;
46
-
47
-#ifndef _SSIZE_T_
48
-#define _SSIZE_T_
49
- typedef unsigned int ssize_t;
50
-#endif
51
-
52
-/* Append a label to program startup title */
53
-/*#define DEBUG_LABEL "DEBUG1"*/
54
-
55
-/* Should we print debug info from driver? */
56
-#ifdef PRODUCT_TAP_DEBUG
57
-#define TAP_WIN32_DEBUG
58
-#endif
59
-
60
-/*
61
- * Minimum TAP-Win32 version number expected by userspace
62
- *
63
- * The TAP-Win32 version number is defined in tap-win32/SOURCES
64
- */
65
-#define TAP_WIN32_MIN_MAJOR 9
66
-#define TAP_WIN32_MIN_MINOR 1
67
-
68
-/* Enable client/server capability */
69
-#define ENABLE_CLIENT_SERVER 1
70
-
71
-/* Enable client capability only */
72
-/* #undef ENABLE_CLIENT_ONLY */
73
-
74
-/* Enable management server capability */
75
-#define ENABLE_MANAGEMENT 1
76
-
77
-/* Enable PKCS#11 support */
78
-#define USE_PKCS11 1
79
-
80
-/* Enable HTTP proxy support */
81
-#define ENABLE_HTTP_PROXY 1
82
-
83
-/* Enable Socks proxy support */
84
-#define ENABLE_SOCKS 1
85
-
86
-/* Enable internal fragmentation support */
87
-#define ENABLE_FRAGMENT 1
88
-
89
-/* Enable smaller executable size */
90
-/* #undef ENABLE_SMALL */
91
-
92
-/* Enable debugging support */
93
-#define ENABLE_DEBUG 1
94
-
95
-/* if defined, will allow usage of the --plugin directive */
96
-#define USE_LOAD_LIBRARY
97
-
98
-/* Dimension size to use for empty array declaration */
99
-#define EMPTY_ARRAY_SIZE 0
100
-
101
-/* Define to 1 if you have the `getsockname' function. */
102
-#define HAVE_GETSOCKNAME 1
103
-
104
-/* Define to 1 if you have the <openssl/engine.h> header file. */
105
-#define HAVE_OPENSSL_ENGINE_H 1
106
-
107
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
108
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
109
-
110
-/* Define to 1 if you have the `ENGINE_register_all_complete' function. */
111
-#define HAVE_ENGINE_REGISTER_ALL_COMPLETE 1
112
-
113
-/* Define to 1 if you have the `ENGINE_cleanup' function. */
114
-#define HAVE_ENGINE_CLEANUP 1
115
-
116
-/* gettimeofday() is implemented in otime.c for Windows */
117
-#define HAVE_GETTIMEOFDAY 1
118
-
119
-/* Define to 1 if you have the 'chsize' function. */
120
-#define HAVE_CHSIZE 1
121
-
122
-/* Define to 1 if you have the `chdir' function. */
123
-#define HAVE_CHDIR 1
124
-
125
-/* Define to 1 if your compiler supports GNU GCC-style variadic macros */
126
-#ifndef _MSC_VER /* Defines MSFT compiler version. Defined as 1200 for MSVC++ 6.0. */
127
-#define HAVE_CPP_VARARG_MACRO_GCC 1
128
-#endif
129
-
130
-/* Define to 1 if you have the <ctype.h> header file. */
131
-#define HAVE_CTYPE_H 1
132
-
133
-/* Define to 1 if you have the <errno.h> header file. */
134
-#define HAVE_ERRNO_H 1
135
-
136
-/* Define to 1 if you have the `EVP_CIPHER_CTX_set_key_length' function. */
137
-#define HAVE_EVP_CIPHER_CTX_SET_KEY_LENGTH 1
138
-
139
-/* Define to 1 if you have the <fcntl.h> header file. */
140
-#define HAVE_FCNTL_H 1
141
-
142
-/* Define to 1 if you have the `getsockopt' function. */
143
-#define HAVE_GETSOCKOPT 1
144
-
145
-/* Define to 1 if you have the `inet_ntoa' function. */
146
-#define HAVE_INET_NTOA 1
147
-
148
-/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
149
-   to 0 otherwise. */
150
-#define HAVE_MALLOC 1
151
-
152
-/* Define to 1 if you have the `memset' function. */
153
-#define HAVE_MEMSET 1
154
-
155
-/* Define to 1 if you have the `setsockopt' function. */
156
-#define HAVE_SETSOCKOPT 1
157
-
158
-/* Define to 1 if you have the `socket' function. */
159
-#define HAVE_SOCKET 1
160
-
161
-/* Define to 1 if you have the <stdarg.h> header file. */
162
-#define HAVE_STDARG_H 1
163
-
164
-/* Define to 1 if you have the <stdint.h> header file. */
165
-#ifndef _MSC_VER
166
-#define HAVE_STDINT_H 1
167
-#endif
168
-
169
-/* Define to 1 if you have the <stdio.h> header file. */
170
-#define HAVE_STDIO_H 1
171
-
172
-/* Define to 1 if you have the <stdlib.h> header file. */
173
-#define HAVE_STDLIB_H 1
174
-
175
-/* Define to 1 if you have the `strerror' function. */
176
-#define HAVE_STRERROR 1
177
-
178
-/* Define to 1 if you have the <strings.h> header file. */
179
-#define HAVE_STRINGS_H 1
180
-
181
-/* Define to 1 if you have the <string.h> header file. */
182
-#define HAVE_STRING_H 1
183
-
184
-/* Define to 1 if you have the `system' function. */
185
-#define HAVE_SYSTEM 1
186
-
187
-/* Define to 1 if you have the <sys/file.h> header file. */
188
-#ifndef _MSC_VER
189
-#define HAVE_SYS_FILE_H 1
190
-#endif
191
-
192
-/* Define to 1 if you have the <sys/stat.h> header file. */
193
-#define HAVE_SYS_STAT_H 1
194
-
195
-/* Define to 1 if you have the <sys/time.h> header file. */
196
-#ifndef _MSC_VER
197
-#define HAVE_SYS_TIME_H 1
198
-#endif
199
-
200
-/* Define to 1 if you have the <sys/types.h> header file. */
201
-#define HAVE_SYS_TYPES_H 1
202
-
203
-/* Define to 1 if you have the `time' function. */
204
-#define HAVE_TIME 1
205
-
206
-/* Define to 1 if you have the <unistd.h> header file. */
207
-#ifndef _MSC_VER
208
-#define HAVE_UNISTD_H 1
209
-#endif
210
-
211
-/* Define to 1 if you have the `vsnprintf' function. */
212
-#define HAVE_VSNPRINTF 1
213
-
214
-/* Special Windows version of getpass() defined in io.c */
215
-#define HAVE_GETPASS 1
216
-
217
-/* Name of package */
218
-#define PACKAGE PRODUCT_UNIX_NAME
219
-
220
-/* Define to the address where bug reports for this package should be sent. */
221
-//#define PACKAGE_BUGREPORT "openvpn-users@lists.sourceforge.net"
222
-
223
-/* Define to the full name of this package. */
224
-#define PACKAGE_NAME PRODUCT_NAME
225
-
226
-/* Define to the one symbol short name of this package. */
227
-#define PACKAGE_TARNAME PACKAGE
228
-
229
-/* Define to the version of this package. */
230
-#define PACKAGE_VERSION PRODUCT_VERSION
231
-
232
-/* Define to the full name and version of this package. */
233
-#ifdef DEBUG_LABEL
234
-#define PACKAGE_STRING PACKAGE_NAME " " PACKAGE_VERSION " " DEBUG_LABEL
235
-#else
236
-#define PACKAGE_STRING PACKAGE_NAME " " PACKAGE_VERSION
237
-#endif
238
-
239
-/* Define as the return type of signal handlers (`int' or `void'). */
240
-#define RETSIGTYPE void
241
-
242
-/* The size of a `unsigned int', as computed by sizeof. */
243
-#define SIZEOF_UNSIGNED_INT 4
244
-
245
-/* The size of a `unsigned long', as computed by sizeof. */
246
-#define SIZEOF_UNSIGNED_LONG 4
247
-
248
-/* Define to 1 if you have the ANSI C header files. */
249
-#define STDC_HEADERS 1
250
-
251
-/* A string representing our target */
252
-#ifdef _MSC_VER
253
-#define TARGET_ALIAS "Win32-MSVC++"
254
-#else
255
-#define TARGET_ALIAS "Win32-MinGW"
256
-#endif
257
-
258
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
259
-#ifndef _MSC_VER
260
-#define TIME_WITH_SYS_TIME 1
261
-#endif
262
-
263
-/* Use OpenSSL crypto library */
264
-#define USE_CRYPTO 1
265
-
266
-/* Use LZO compression library */
267
-#define USE_LZO 1
268
-
269
-/* LZO version number */
270
-#define LZO_VERSION_NUM "2"
271
-
272
-/* Use lzo/ directory prefix for LZO header files (for LZO 2.0) */
273
-#define LZO_HEADER_DIR 1
274
-
275
-/* Use OpenSSL SSL library */
276
-#define USE_SSL 1
277
-
278
-/* Version number of package */
279
-#define VERSION PACKAGE_VERSION
280
-
281
-/* Define as `__inline' if that's what the C compiler calls it, or to nothing
282
-   if it is not supported. */
283
-#define inline __inline
284
-
285
-/* type to use in place of socklen_t if not defined */
286
-#define socklen_t unsigned int
287
-
288
-/* 32-bit unsigned type */
289
-#define uint32_t unsigned int
290
-
291
-/* 16-bit unsigned type */
292
-#define uint16_t unsigned short
293
-
294
-/* 8-bit unsigned type */
295
-#define uint8_t unsigned char
296
-
297
-/* Route command */
298
-#define ROUTE_PATH "route"
299
-
300
-/* Windows doesn't support PTHREAD yet */
301
-#ifdef USE_PTHREAD
302
-#error The Windows version of OpenVPN does not support PTHREAD yet
303
-#endif
304
-
305
-#ifdef _MSC_VER
306
-/* MSVC++ hacks */
307
-#include <io.h>
308
-#include <direct.h>
309
-#define vsnprintf _vsnprintf
310
-#define vsnwprintf _vsnwprintf
311
-#define snwprintf _snwprintf
312
-#define write _write
313
-#define open _open
314
-#define read _read
315
-#define close _close
316
-#define chdir _chdir
317
-#define S_IRUSR 0
318
-#define S_IWUSR 0
319
-typedef int intptr_t;
320
-#undef S_NORMAL
321
-#endif
322 1
new file mode 100644
... ...
@@ -0,0 +1,326 @@
0
+/*
1
+ *  OpenVPN -- An application to securely tunnel IP networks
2
+ *             over a single UDP port, with support for SSL/TLS-based
3
+ *             session authentication and key exchange,
4
+ *             packet encryption, packet authentication, and
5
+ *             packet compression.
6
+ *
7
+ *  Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net>
8
+ *
9
+ *  This program is free software; you can redistribute it and/or modify
10
+ *  it under the terms of the GNU General Public License version 2
11
+ *  as published by the Free Software Foundation.
12
+ *
13
+ *  This program is distributed in the hope that it will be useful,
14
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ *  GNU General Public License for more details.
17
+ *
18
+ *  You should have received a copy of the GNU General Public License
19
+ *  along with this program (see the file COPYING included with this
20
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
21
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
+ */
23
+
24
+/*
25
+ * Configuration header for Win32 using the mingw environment.
26
+ * Manually edited based on linux version as generated by autoconf.
27
+ *
28
+ * config-win32.h is normally generated by copying
29
+ * config-win32.h.in -> config-win32.h and replacing
30
+ * [ampersand] VERSION [ampersand]
31
+ * with the appropriate version #.  This is normally
32
+ * done automatically by configure.ac
33
+ */
34
+
35
+#include <windows.h>
36
+#include <winsock2.h>
37
+#include "autodefs/defs.h"
38
+
39
+#define sleep(x) Sleep((x)*1000)
40
+
41
+#define random rand
42
+#define srandom srand
43
+
44
+typedef unsigned long in_addr_t;
45
+
46
+#ifndef _SSIZE_T_
47
+#define _SSIZE_T_
48
+ typedef unsigned int ssize_t;
49
+#endif
50
+
51
+/* Append a label to program startup title */
52
+/*#define DEBUG_LABEL "DEBUG1"*/
53
+
54
+/* Should we print debug info from driver? */
55
+#ifdef PRODUCT_TAP_DEBUG
56
+#define TAP_WIN32_DEBUG
57
+#endif
58
+
59
+/*
60
+ * Minimum TAP-Win32 version number expected by userspace
61
+ *
62
+ * The TAP-Win32 version number is defined in tap-win32/SOURCES
63
+ */
64
+#define TAP_ID @TAP_ID@
65
+#define TAP_WIN32_MIN_MAJOR @TAP_WIN32_MIN_MAJOR@
66
+#define TAP_WIN32_MIN_MINOR @TAP_WIN32_MIN_MINOR@
67
+
68
+/* Enable client/server capability */
69
+#define ENABLE_CLIENT_SERVER 1
70
+
71
+/* Enable client capability only */
72
+/* #undef ENABLE_CLIENT_ONLY */
73
+
74
+/* Enable management server capability */
75
+#define ENABLE_MANAGEMENT 1
76
+
77
+/* Enable PKCS#11 support */
78
+#define USE_PKCS11 1
79
+
80
+/* Enable HTTP proxy support */
81
+#define ENABLE_HTTP_PROXY 1
82
+
83
+/* Enable Socks proxy support */
84
+#define ENABLE_SOCKS 1
85
+
86
+/* Enable internal fragmentation support */
87
+#define ENABLE_FRAGMENT 1
88
+
89
+/* Enable smaller executable size */
90
+/* #undef ENABLE_SMALL */
91
+
92
+/* Enable debugging support */
93
+#define ENABLE_DEBUG 1
94
+
95
+/* if defined, will allow usage of the --plugin directive */
96
+#define USE_LOAD_LIBRARY
97
+
98
+/* Dimension size to use for empty array declaration */
99
+#define EMPTY_ARRAY_SIZE 0
100
+
101
+/* Define to 1 if you have the `getsockname' function. */
102
+#define HAVE_GETSOCKNAME 1
103
+
104
+/* Define to 1 if you have the <openssl/engine.h> header file. */
105
+#define HAVE_OPENSSL_ENGINE_H 1
106
+
107
+/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
108
+#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
109
+
110
+/* Define to 1 if you have the `ENGINE_register_all_complete' function. */
111
+#define HAVE_ENGINE_REGISTER_ALL_COMPLETE 1
112
+
113
+/* Define to 1 if you have the `ENGINE_cleanup' function. */
114
+#define HAVE_ENGINE_CLEANUP 1
115
+
116
+/* gettimeofday() is implemented in otime.c for Windows */
117
+#define HAVE_GETTIMEOFDAY 1
118
+
119
+/* Define to 1 if you have the 'chsize' function. */
120
+#define HAVE_CHSIZE 1
121
+
122
+/* Define to 1 if you have the `chdir' function. */
123
+#define HAVE_CHDIR 1
124
+
125
+/* Define to 1 if your compiler supports GNU GCC-style variadic macros */
126
+#ifndef _MSC_VER /* Defines MSFT compiler version. Defined as 1200 for MSVC++ 6.0. */
127
+#define HAVE_CPP_VARARG_MACRO_GCC 1
128
+#endif
129
+
130
+/* Define to 1 if you have the <ctype.h> header file. */
131
+#define HAVE_CTYPE_H 1
132
+
133
+/* Define to 1 if you have the <errno.h> header file. */
134
+#define HAVE_ERRNO_H 1
135
+
136
+/* Define to 1 if you have the `EVP_CIPHER_CTX_set_key_length' function. */
137
+#define HAVE_EVP_CIPHER_CTX_SET_KEY_LENGTH 1
138
+
139
+/* Define to 1 if you have the <fcntl.h> header file. */
140
+#define HAVE_FCNTL_H 1
141
+
142
+/* Define to 1 if you have the `getsockopt' function. */
143
+#define HAVE_GETSOCKOPT 1
144
+
145
+/* Define to 1 if you have the `inet_ntoa' function. */
146
+#define HAVE_INET_NTOA 1
147
+
148
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
149
+   to 0 otherwise. */
150
+#define HAVE_MALLOC 1
151
+
152
+/* Define to 1 if you have the `memset' function. */
153
+#define HAVE_MEMSET 1
154
+
155
+/* Define to 1 if you have the `setsockopt' function. */
156
+#define HAVE_SETSOCKOPT 1
157
+
158
+/* Define to 1 if you have the `socket' function. */
159
+#define HAVE_SOCKET 1
160
+
161
+/* Define to 1 if you have the <stdarg.h> header file. */
162
+#define HAVE_STDARG_H 1
163
+
164
+/* Define to 1 if you have the <stdint.h> header file. */
165
+#ifndef _MSC_VER
166
+#define HAVE_STDINT_H 1
167
+#endif
168
+
169
+/* Define to 1 if you have the <stdio.h> header file. */
170
+#define HAVE_STDIO_H 1
171
+
172
+/* Define to 1 if you have the <stdlib.h> header file. */
173
+#define HAVE_STDLIB_H 1
174
+
175
+/* Define to 1 if you have the `strerror' function. */
176
+#define HAVE_STRERROR 1
177
+
178
+/* Define to 1 if you have the <strings.h> header file. */
179
+#define HAVE_STRINGS_H 1
180
+
181
+/* Define to 1 if you have the <string.h> header file. */
182
+#define HAVE_STRING_H 1
183
+
184
+/* Define to 1 if you have the `system' function. */
185
+#define HAVE_SYSTEM 1
186
+
187
+/* Define to 1 if you have the <sys/file.h> header file. */
188
+#ifndef _MSC_VER
189
+#define HAVE_SYS_FILE_H 1
190
+#endif
191
+
192
+/* Define to 1 if you have the <sys/stat.h> header file. */
193
+#define HAVE_SYS_STAT_H 1
194
+
195
+/* Define to 1 if you have the <sys/time.h> header file. */
196
+#ifndef _MSC_VER
197
+#define HAVE_SYS_TIME_H 1
198
+#endif
199
+
200
+/* Define to 1 if you have the <sys/types.h> header file. */
201
+#define HAVE_SYS_TYPES_H 1
202
+
203
+/* Define to 1 if you have the `time' function. */
204
+#define HAVE_TIME 1
205
+
206
+/* Define to 1 if you have the <unistd.h> header file. */
207
+#ifndef _MSC_VER
208
+#define HAVE_UNISTD_H 1
209
+#endif
210
+
211
+/* Define to 1 if you have the `vsnprintf' function. */
212
+#define HAVE_VSNPRINTF 1
213
+
214
+/* Special Windows version of getpass() defined in io.c */
215
+#define HAVE_GETPASS 1
216
+
217
+/* Name of package */
218
+#define PACKAGE @PACKAGE@
219
+
220
+/* Define to the address where bug reports for this package should be sent. */
221
+//#define PACKAGE_BUGREPORT "openvpn-users@lists.sourceforge.net"
222
+
223
+/* Define to the full name of this package. */
224
+#define PACKAGE_NAME @PACKAGE_NAME@
225
+
226
+/* Define to the one symbol short name of this package. */
227
+#define PACKAGE_TARNAME @PACKAGE_TARNAME@
228
+
229
+/* Define to the version of this package. */
230
+#define PACKAGE_VERSION @PACKAGE_VERSION@
231
+
232
+/* Define to the full name and version of this package. */
233
+#ifdef DEBUG_LABEL
234
+#define PACKAGE_STRING PACKAGE_NAME " " PACKAGE_VERSION " " DEBUG_LABEL
235
+#else
236
+#define PACKAGE_STRING PACKAGE_NAME " " PACKAGE_VERSION
237
+#endif
238
+
239
+/* Define as the return type of signal handlers (`int' or `void'). */
240
+#define RETSIGTYPE void
241
+
242
+/* The size of a `unsigned int', as computed by sizeof. */
243
+#define SIZEOF_UNSIGNED_INT 4
244
+
245
+/* The size of a `unsigned long', as computed by sizeof. */
246
+#define SIZEOF_UNSIGNED_LONG 4
247
+
248
+/* Define to 1 if you have the ANSI C header files. */
249
+#define STDC_HEADERS 1
250
+
251
+/* A string representing our target */
252
+#ifdef _MSC_VER
253
+#define TARGET_ALIAS "Win32-MSVC++"
254
+#else
255
+#define TARGET_ALIAS "Win32-MinGW"
256
+#endif
257
+
258
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
259
+#ifndef _MSC_VER
260
+#define TIME_WITH_SYS_TIME 1
261
+#endif
262
+
263
+/* Use OpenSSL crypto library */
264
+#define USE_CRYPTO 1
265
+
266
+/* Use LZO compression library */
267
+#define USE_LZO 1
268
+
269
+/* LZO version number */
270
+#define LZO_VERSION_NUM "2"
271
+
272
+/* Use lzo/ directory prefix for LZO header files (for LZO 2.0) */
273
+#define LZO_HEADER_DIR 1
274
+
275
+/* Use OpenSSL SSL library */
276
+#define USE_SSL 1
277
+
278
+/* Version number of package */
279
+#define VERSION PACKAGE_VERSION
280
+
281
+/* Define as `__inline' if that's what the C compiler calls it, or to nothing
282
+   if it is not supported. */
283
+#define inline __inline
284
+
285
+/* type to use in place of socklen_t if not defined */
286
+#define socklen_t unsigned int
287
+
288
+/* 32-bit unsigned type */
289
+#define uint32_t unsigned int
290
+
291
+/* 16-bit unsigned type */
292
+#define uint16_t unsigned short
293
+
294
+/* 8-bit unsigned type */
295
+#define uint8_t unsigned char
296
+
297
+/* Route command */
298
+#define ROUTE_PATH "route"
299
+
300
+/* Windows doesn't support PTHREAD yet */
301
+#ifdef USE_PTHREAD
302
+#error The Windows version of OpenVPN does not support PTHREAD yet
303
+#endif
304
+
305
+#ifdef _MSC_VER
306
+/* MSVC++ hacks */
307
+#include <io.h>
308
+#include <direct.h>
309
+#define vsnprintf _vsnprintf
310
+#define vsnwprintf _vsnwprintf
311
+#define snwprintf _snwprintf
312
+#define write _write
313
+#define open _open
314
+#define read _read
315
+#define close _close
316
+#define chdir _chdir
317
+#define S_IRUSR 0
318
+#define S_IWUSR 0
319
+typedef int intptr_t;
320
+#undef S_NORMAL
321
+/* Visual Studio 2005 supports vararg macros */
322
+#if _MSC_VER >= 1400
323
+#define HAVE_CPP_VARARG_MACRO_ISO 1
324
+#endif
325
+#endif
... ...
@@ -30,6 +30,39 @@ AC_INIT([OpenVPN], [PRODUCT_VERSION], [openvpn-users@lists.sourceforge.net], [op
30 30
 AM_CONFIG_HEADER(config.h)
31 31
 AC_CONFIG_SRCDIR(syshead.h)
32 32
 
33
+dnl Guess host type.
34
+AC_CANONICAL_HOST
35
+AC_CANONICAL_SYSTEM
36
+AM_INIT_AUTOMAKE(openvpn, [$PACKAGE_VERSION])
37
+
38
+AC_ARG_WITH(cygwin-native,
39
+	[  --with-cygwin-native              Compile native win32],
40
+	[CYGWIN_NATIVE="${withval}"],
41
+	[CYGWIN_NATIVE="no"]
42
+)
43
+
44
+WIN32="no"
45
+CYGWIN="no"
46
+case "${host}" in
47
+	*-mingw32*)
48
+		WIN32="yes"
49
+		cross_compiling="yes"
50
+	;;
51
+	*-cygwin*)
52
+		AC_MSG_CHECKING([cygwin mode to use])
53
+		if test "${CYGWIN_NATIVE}" = "yes"; then
54
+			AC_MSG_RESULT([Using native win32])
55
+			CFLAGS="${CFLAGS} -mno-cygwin"
56
+			CYGWIN="yes"
57
+			WIN32="yes"
58
+		else
59
+			AC_MSG_RESULT([Using cygwin])
60
+		fi
61
+	;;
62
+	*)
63
+	;;
64
+esac
65
+
33 66
 AC_ARG_ENABLE(lzo,
34 67
    [  --disable-lzo           Disable LZO compression support],
35 68
    [LZO="$enableval"],
... ...
@@ -183,6 +216,17 @@ AC_ARG_WITH(lzo-lib,
183 183
    [LDFLAGS="$LDFLAGS -L$withval"] 
184 184
 )
185 185
 
186
+AC_ARG_WITH(pkcs11-helper-headers,
187
+   [  --with-pkcs11-helper-headers=DIR pkcs11-helper Include files location],
188
+   [PKCS11_HELPER_HDR_DIR="$withval"]
189
+   [CPPFLAGS="$CPPFLAGS -I$withval"] 
190
+)
191
+
192
+AC_ARG_WITH(pkcs11-helper-lib,
193
+   [  --with-pkcs11-helper-lib=DIR     pkcs11-helper Library location],
194
+   [LDFLAGS="$LDFLAGS -L$withval"] 
195
+)
196
+
186 197
 AC_ARG_WITH(ifconfig-path,
187 198
    [  --with-ifconfig-path=PATH   Path to ifconfig tool],
188 199
    [IFCONFIG="$withval"],
... ...
@@ -210,11 +254,6 @@ AC_ARG_WITH(mem-check,
210 210
    [MEMCHECK="$withval"]
211 211
 )
212 212
 
213
-dnl Guess host type.
214
-AC_CANONICAL_HOST
215
-AC_CANONICAL_SYSTEM
216
-AM_INIT_AUTOMAKE(openvpn, [$PACKAGE_VERSION])
217
-
218 213
 dnl fix search path, to allow compilers to find syshead.h
219 214
 CPPFLAGS="$CPPFLAGS -I${srcdir}"
220 215
 
... ...
@@ -250,10 +289,16 @@ case "$target" in
250 250
 	CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
251 251
 	;;
252 252
 *mingw*)
253
-	AC_MSG_RESULT([WARNING: configure support for mingw is incomplete])
254
-	AC_MSG_RESULT([WARNING: use makefile.w32 instead])
253
+	AC_DEFINE(TARGET_WIN32, 1, [Are we running WIN32?])
255 254
 	OPENVPN_ADD_LIBS(-lgdi32)
256
-	OPENVPN_ADD_LIBS(-lwsock32)
255
+	OPENVPN_ADD_LIBS(-lws2_32)
256
+	OPENVPN_ADD_LIBS(-lwininet)
257
+	OPENVPN_ADD_LIBS(-lcrypt32)
258
+	OPENVPN_ADD_LIBS(-liphlpapi)
259
+	OPENVPN_ADD_LIBS(-lwinmm)
260
+	;;
261
+*dragonfly*)
262
+	AC_DEFINE(TARGET_DRAGONFLY, 1, [Are we running on DragonFlyBSD?])
257 263
 	;;
258 264
 	
259 265
 esac
... ...
@@ -263,6 +308,12 @@ AC_PROG_CC
263 263
 AC_PROG_INSTALL
264 264
 AC_PROG_GCC_TRADITIONAL
265 265
 
266
+if test "${WIN32}" = "yes"; then
267
+	AC_ARG_VAR([MAN2HTML], [man2html utility])
268
+	AC_CHECK_PROGS([MAN2HTML], [man2html])
269
+	test -z "${MAN2HTML}" && AC_MSG_ERROR([man2html is required for win32])
270
+fi
271
+
266 272
 dnl Checks for header files.
267 273
 AC_HEADER_STDC
268 274
 
... ...
@@ -274,29 +325,36 @@ AC_TYPE_OFF_T
274 274
 AC_TYPE_PID_T
275 275
 AC_TYPE_SIZE_T
276 276
 AC_TYPE_UID_T
277
+TYPE_SOCKLEN_T
277 278
 AC_HEADER_TIME
278 279
 AX_CPP_VARARG_MACRO_ISO
279 280
 AX_CPP_VARARG_MACRO_GCC
280 281
 AX_EMPTY_ARRAY
281 282
 
282 283
 dnl Check for more header files.
283
-AC_HEADER_SYS_WAIT
284
-AC_CHECK_HEADERS(sys/time.h sys/socket.h sys/ioctl.h sys/stat.h dnl
284
+AC_CHECK_HEADERS(fcntl.h stdlib.h dnl
285
+		 stdarg.h stdio.h string.h dnl
286
+		 strings.h ctype.h errno.h dnl
287
+)
288
+
289
+if test "${WIN32}" != "yes"; then
290
+   AC_HEADER_SYS_WAIT
291
+   AC_CHECK_HEADERS(sys/time.h sys/socket.h sys/ioctl.h sys/stat.h dnl
285 292
 		 sys/mman.h fcntl.h sys/file.h stdlib.h stdint.h dnl
286 293
 		 stdarg.h unistd.h signal.h stdio.h string.h dnl
287 294
 		 strings.h ctype.h errno.h syslog.h pwd.h grp.h dnl
288
-		 net/if_tun.h stropts.h sys/sockio.h dnl
295
+		 net/if_tun.h net/tun/if_tun.h stropts.h sys/sockio.h dnl
289 296
 		 netinet/in.h netinet/in_systm.h dnl
290 297
 		 netinet/tcp.h arpa/inet.h dnl
291 298
 		 netdb.h sys/uio.h linux/if_tun.h linux/sockios.h dnl
292 299
 		 linux/types.h sys/poll.h sys/epoll.h err.h dnl
293
-)
294
-AC_CHECK_HEADERS(net/if.h,,,
300
+   )
301
+   AC_CHECK_HEADERS(net/if.h,,,
295 302
 		 [#ifdef HAVE_SYS_SOCKET_H 
296 303
 		  # include <sys/socket.h>
297 304
 		  #endif
298 305
 		 ])
299
-AC_CHECK_HEADERS(netinet/ip.h,,,
306
+   AC_CHECK_HEADERS(netinet/ip.h,,,
300 307
 		 [#ifdef HAVE_SYS_TYPES_H
301 308
 		  # include <sys/types.h>
302 309
 		  #endif
... ...
@@ -307,7 +365,7 @@ AC_CHECK_HEADERS(netinet/ip.h,,,
307 307
 		  # include <netinet/in_systm.h>
308 308
 		  #endif
309 309
 		 ])
310
-AC_CHECK_HEADERS(netinet/if_ether.h,,,
310
+   AC_CHECK_HEADERS(netinet/if_ether.h,,,
311 311
 		 [#ifdef HAVE_SYS_TYPES_H
312 312
 		  # include <sys/types.h>
313 313
 		  #endif
... ...
@@ -318,16 +376,18 @@ AC_CHECK_HEADERS(netinet/if_ether.h,,,
318 318
 		  # include <netinet/in.h>
319 319
 		  #endif
320 320
 		 ])
321
-AC_CHECK_HEADERS(resolv.h,,,
321
+   AC_CHECK_HEADERS(resolv.h,,,
322 322
 		 [#ifdef HAVE_NETINET_IN_H 
323 323
 		  # include <netinet/in.h>
324 324
 		  #endif
325 325
 		 ])
326
-AC_CHECK_HEADERS(linux/errqueue.h,,,
326
+   AC_CHECK_HEADERS(linux/errqueue.h,,,
327 327
 	[#ifdef HAVE_LINUX_TYPES_H
328 328
 	 # include <linux/types.h>
329 329
 	 #endif
330 330
 	])
331
+fi
332
+
331 333
 AC_CACHE_SAVE
332 334
 
333 335
 dnl check that in_addr_t is defined
... ...
@@ -398,35 +458,59 @@ AC_CHECK_SIZEOF(unsigned long)
398 398
 
399 399
 AC_CACHE_SAVE
400 400
 
401
-dnl check for other types
402
-TYPE_SOCKLEN_T
403
-AC_TYPE_SIGNAL
404
-
405
-dnl Check for libsocket
406
-AC_SEARCH_LIBS(socket, socket)
407
-
408
-dnl Check for libnsl
409
-AC_SEARCH_LIBS(inet_ntoa, nsl)
410
-
411
-dnl Check for libresolv
412
-AC_SEARCH_LIBS(gethostbyname, resolv nsl)
413
-
414
-dnl optional library functions
415
-AC_FUNC_FORK
416 401
 AC_CHECK_FUNCS(daemon chroot getpwnam setuid nice system getpid dup dup2 dnl
417 402
 	       getpass strerror syslog openlog mlockall getgrnam setgid dnl
418 403
 	       setgroups stat flock readv writev setsockopt getsockopt dnl
419
-	       setsid chdir gettimeofday putenv getpeername unlink dnl
420
-               poll chsize ftruncate sendmsg recvmsg getsockname)
404
+	       setsid chdir putenv getpeername unlink dnl
405
+	       poll chsize ftruncate sendmsg recvmsg getsockname)
421 406
 AC_CACHE_SAVE
422 407
 
408
+if test "${WIN32}" = "yes"; then
409
+
410
+	AC_DEFINE([HAVE_GETTIMEOFDAY], [1], [We fake gettimeofday for win32 at otime.c])
411
+
412
+else
413
+
414
+	dnl check for other types
415
+	AC_TYPE_SIGNAL
416
+
417
+	dnl Check for libsocket
418
+	AC_SEARCH_LIBS(socket, socket)
419
+
420
+	dnl Check for libnsl
421
+	AC_SEARCH_LIBS(inet_ntoa, nsl)
422
+
423
+	dnl Check for libresolv
424
+	AC_SEARCH_LIBS(gethostbyname, resolv nsl)
425
+
426
+	dnl optional library functions
427
+	AC_FUNC_FORK
428
+
429
+	AC_CHECK_FUNCS(gettimeofday)
430
+
431
+	AC_CHECK_FUNCS(socket recv recvfrom send sendto listen dnl
432
+		       accept connect bind select gethostbyname dnl
433
+		       inet_ntoa time ctime memset vsnprintf strdup, [],
434
+		       [AC_MSG_ERROR([Required library function not found])])
435
+
436
+fi
437
+
423 438
 dnl Required library functions
424 439
 AC_FUNC_MEMCMP
425 440
 
426
-AC_CHECK_FUNCS(socket recv recvfrom send sendto listen dnl
427
-	       accept connect bind select gethostbyname dnl
428
-               inet_ntoa time ctime memset vsnprintf strdup, [],
429
-	       [AC_MSG_ERROR([Required library function not found])])
441
+dnl
442
+dnl Check for res_init
443
+dnl
444
+AC_TRY_LINK([
445
+    #include <resolv.h>
446
+  ], [
447
+    res_init ();
448
+  ], [
449
+    AC_MSG_RESULT([res_init DEFINED])
450
+    AC_DEFINE([HAVE_RES_INIT], 1, [Indicates if res_init is available])
451
+  ], [
452
+    AC_MSG_RESULT([res_init UNDEFINED])
453
+  ])
430 454
 
431 455
 dnl
432 456
 dnl check libraries
... ...
@@ -505,21 +589,23 @@ fi
505 505
 dnl
506 506
 dnl Check for dlopen -- first try libc then libdl.
507 507
 dnl
508
-if test "$PLUGINS" = "yes"; then
509
-   AC_CHECKING([for libdl Library and Header files])
510
-   AC_CHECK_HEADER(dlfcn.h,
511
-        [AC_CHECK_FUNC(dlopen,
512
-            [AC_DEFINE(USE_LIBDL, 1, [Use libdl for dynamic library loading])],
513
-            [AC_CHECK_LIB(dl, dlopen,
514
-	        [
515
-                   OPENVPN_ADD_LIBS(-ldl)
516
-	           AC_DEFINE(USE_LIBDL, 1, [Use libdl for dynamic library loading])
517
-	        ],
518
-	        [AC_MSG_RESULT([libdl library not found.])]
519
-	    )],
520
-        )],
521
-        [AC_MSG_RESULT([libdl headers not found.])]
522
-   )
508
+if test "${WIN32}" != "yes"; then
509
+   if test "$PLUGINS" = "yes"; then
510
+      AC_CHECKING([for libdl Library and Header files])
511
+      AC_CHECK_HEADER(dlfcn.h,
512
+           [AC_CHECK_FUNC(dlopen,
513
+               [AC_DEFINE(USE_LIBDL, 1, [Use libdl for dynamic library loading])],
514
+               [AC_CHECK_LIB(dl, dlopen,
515
+	           [
516
+                      OPENVPN_ADD_LIBS(-ldl)
517
+	              AC_DEFINE(USE_LIBDL, 1, [Use libdl for dynamic library loading])
518
+	           ],
519
+	           [AC_MSG_RESULT([libdl library not found.])]
520
+	       )],
521
+           )],
522
+           [AC_MSG_RESULT([libdl headers not found.])]
523
+      )
524
+   fi
523 525
 fi
524 526
 
525 527
 dnl
... ...
@@ -572,7 +658,7 @@ if test "$CRYPTO" = "yes"; then
572 572
 		   AC_CHECKING([that OpenSSL Library is at least version 0.9.6])
573 573
 		   AC_EGREP_CPP(yes,
574 574
 		     [
575
-		       #include "openssl/evp.h"
575
+		       #include <openssl/evp.h>
576 576
 		       #if SSLEAY_VERSION_NUMBER >= 0x00906000L
577 577
 		         yes
578 578
 		       #endif
... ...
@@ -692,7 +778,7 @@ fi
692 692
 
693 693
 dnl enable strict compiler warnings
694 694
 if test "$STRICT" = "yes"; then
695
-   CFLAGS="$CFLAGS -Wall -Wpointer-arith -Wsign-compare -Wno-unused-parameter -Wno-unused-function"
695
+   CFLAGS="$CFLAGS -Wall -Wno-unused-parameter -Wno-unused-function"
696 696
 fi
697 697
 
698 698
 dnl enable pedantic compiler warnings
... ...
@@ -715,4 +801,37 @@ if test "$PASSWORD_SAVE" = "yes"; then
715 715
    AC_DEFINE(ENABLE_PASSWORD_SAVE, 1, [Allow --askpass and --auth-user-pass passwords to be read from a file])
716 716
 fi
717 717
 
718
-AC_OUTPUT(Makefile openvpn.spec)
718
+TAP_ID="PRODUCT_TAP_ID"
719
+TAP_WIN32_MIN_MAJOR="PRODUCT_TAP_WIN32_MIN_MAJOR"
720
+TAP_WIN32_MIN_MINOR="PRODUCT_TAP_WIN32_MIN_MINOR"
721
+AC_DEFINE_UNQUOTED(TAP_ID, "${TAP_ID}", [The TAP-Win32 id defined in tap-win32/SOURCES])
722
+AC_DEFINE_UNQUOTED(TAP_WIN32_MIN_MAJOR, ${TAP_WIN32_MIN_MAJOR}, [The TAP-Win32 version number is defined in tap-win32/SOURCES])
723
+AC_DEFINE_UNQUOTED(TAP_WIN32_MIN_MINOR, ${TAP_WIN32_MIN_MINOR}, [The TAP-Win32 version number is defined in tap-win32/SOURCES])
724
+AC_SUBST(TAP_ID)
725
+AC_SUBST(TAP_WIN32_MIN_MAJOR)
726
+AC_SUBST(TAP_WIN32_MIN_MINOR)
727
+
728
+win32datadir="\${datadir}/${PACKAGE}-win32"
729
+AC_SUBST(win32datadir)
730
+AM_CONDITIONAL(WIN32, test "${WIN32}" = "yes")
731
+
732
+# workaround for <autoconf-2.60
733
+if test -z "${docdir}"; then
734
+	docdir="\$(datarootdir)/doc/\$(PACKAGE_NAME)"
735
+	AC_SUBST([docdir])
736
+fi
737
+if test -z "${htmldir}"; then
738
+	htmldir="\$(docdir)"
739
+	AC_SUBST([htmldir])
740
+fi
741
+# end workaround
742
+
743
+AC_OUTPUT([
744
+	Makefile
745
+	openvpn.spec
746
+	config-win32.h
747
+	images/Makefile
748
+	service-win32/Makefile
749
+	install-win32/Makefile
750
+	install-win32/settings
751
+])
... ...
@@ -22,16 +22,10 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
25
+#include "syshead.h"
30 26
 
31 27
 #ifdef USE_CRYPTO
32 28
 
33
-#include "syshead.h"
34
-
35 29
 #include "crypto.h"
36 30
 #include "error.h"
37 31
 #include "misc.h"
... ...
@@ -27,13 +27,18 @@
27 27
  * LITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28 28
  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 29
  */
30
+
31
+#include "syshead.h"
32
+
33
+#ifdef WIN32
34
+
35
+#include <openssl/ssl.h>
36
+#include <openssl/err.h>
30 37
 #include <windows.h>
31 38
 #include <wincrypt.h>
32 39
 #include <stdio.h>
33 40
 #include <ctype.h>
34 41
 #include <assert.h>
35
-#include <openssl/ssl.h>
36
-#include <openssl/err.h>
37 42
 
38 43
 #ifdef __MINGW32_VERSION
39 44
 /* MinGW w32api is incomplete when it comes to CryptoAPI, as per version 3.1
... ...
@@ -461,3 +466,7 @@ int SSL_CTX_use_CryptoAPI_certificate(SSL_CTX *ssl_ctx, const char *cert_prop)
461 461
     }
462 462
     return 0;
463 463
 }
464
+
465
+#else
466
+static void dummy (void) {}
467
+#endif				/* WIN32 */
... ...
@@ -1,16 +1,71 @@
1 1
 #!/bin/sh
2 2
 
3
-# Let's have a fresh start.  Remove all files
4
-# which are not source files.
3
+# Let's have a fresh start.  Remove all
4
+# generated files.
5 5
 #
6 6
 # Run this script, then:
7
-#        touch *
8
-#        [apply any patches here]
9 7
 #        autoreconf -i -v
10 8
 #        ./configure
11 9
 #        make
12 10
 #        make install
13 11
 
14
-rm -f *.o openvpn config.cache configure Makefile Makefile.in stamp-h* config.guess config.sub depcomp missing mkinstalldirs config.log config.status config.h config.h.in aclocal.m4 openvpn.spec install-sh
12
+rm -f \
13
+    *.o \
14
+    service-win32/*.o \
15
+    service-win32/*.exe \
16
+    *.exe \
17
+    openvpn \
18
+    config.cache \
19
+    configure \
20
+    Makefile \
21
+    Makefile.in \
22
+    stamp-h* \
23
+    config.guess \
24
+    config.sub \
25
+    depcomp \
26
+    missing \
27
+    mkinstalldirs \
28
+    config.log \
29
+    config.status \
30
+    config.h \
31
+    config.h.in \
32
+    aclocal.m4 \
33
+    openvpn.spec \
34
+    install-sh \
35
+    openvpn.8.html \
36
+    config-win32.h \
37
+    install-win32/*.exe \
38
+    install-win32/makensis.log \
39
+    install-win32/settings \
40
+    install-win32/Makefile \
41
+    install-win32/Makefile.in \
42
+    images/Makefile \
43
+    images/Makefile.in \
44
+    service-win32/Makefile \
45
+    service-win32/Makefile.in
15 46
 
16
-rm -rf autom4te*.cache .deps
47
+rm -rf \
48
+    autom4te*.cache \
49
+    .deps \
50
+    */.deps \
51
+    windest \
52
+    autodefs \
53
+    gen \
54
+    tapinstall \
55
+    install-win32/tmp
56
+
57
+rm -rf \
58
+    tap-win32/objfre_w2k_x86 \
59
+    tap-win32/dist \
60
+    tap-win32/SOURCES \
61
+    tap-win32/tapdrvr.cod \
62
+    tap-win32/buildfre_wnet_amd64.wrn \
63
+    tap-win32/buildfre_w2k_x86.wrn \
64
+    tap-win32/objfre_wnet_amd64 \
65
+    tap-win32/buildfre_wnet_amd64.log \
66
+    tap-win32/buildfre_w2k_x86.log \
67
+    tap-win32/amd64 \
68
+    tap-win32/i386/tap0901.pdb \
69
+    tap-win32/i386/OemWin2k.inf \
70
+    tap-win32/i386/tap0901.map \
71
+    tap-win32/i386/tap0901.sys
... ...
@@ -6,8 +6,14 @@
6 6
 # 2000 and higher, and x64 on Windows 2003 and higher.
7 7
 # For quick start options, see pre-built notes below.
8 8
 #
9
+# Note that if you are only looking to build the
10
+# openvpn user-space binaries (openvpn.exe
11
+# and openvpnserv.exe) you can use the
12
+# provided autoconf/automake build environment.
13
+#
9 14
 # See top-level build configuration and settings in:
10 15
 #
16
+#   version.m4
11 17
 #   install-win32/settings.in
12 18
 #
13 19
 # Mandatory prerequisites:
... ...
@@ -105,12 +111,9 @@ install-win32/getprebuilt
105 105
 # The exception is the last script which gathers together all files from
106 106
 # GENOUT and builds the installer.
107 107
 
108
-# Make the OpenVPN user-space component (openvpn.exe)
108
+# Make the OpenVPN user-space components (OpenVPN and service)
109 109
 install-win32/makeopenvpn
110 110
 
111
-# Make the OpenVPN service
112
-install-win32/makeservice
113
-
114 111
 # Make the OpenVPN TAP driver
115 112
 install-win32/maketap
116 113
 
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "error.h"
... ...
@@ -30,7 +30,11 @@
30 30
 
31 31
 /* #define ABORT_ON_ERROR */
32 32
 
33
+#ifdef ENABLE_PKCS11
34
+#define ERR_BUF_SIZE 8192
35
+#else
33 36
 #define ERR_BUF_SIZE 1024
37
+#endif
34 38
 
35 39
 struct gc_arena;
36 40
 
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "buffer.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "fdmisc.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "forward.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #ifdef ENABLE_FRAGMENT
34 28
deleted file mode 100755
... ...
@@ -1,111 +0,0 @@
1
-#!/sbin/runscript
2
-
3
-# OpenVPN start/stop script
4
-# Adapted to Gentoo by James Yonan
5
-
6
-# Originally Contributed to the OpenVPN project by
7
-# Douglas Keller <doug@voidstar.dyndns.org>
8
-# 2002.05.15
9
-
10
-# This script does the following:
11
-#
12
-# - Starts an openvpn process for each .conf file it finds in
13
-#   /etc/openvpn.
14
-#
15
-# - If /etc/openvpn/xxx.sh exists for a xxx.conf file then it executes
16
-#   it before starting openvpn (useful for doing openvpn --mktun...).
17
-
18
-# - In addition to start/stop you can do:
19
-#
20
-#   service openvpn reload - SIGHUP
21
-#   service openvpn reopen - SIGUSR1
22
-#   service openvpn status - SIGUSR2
23
-
24
-# Location of openvpn binary
25
-openvpn=/usr/local/sbin/openvpn
26
-
27
-# PID directory
28
-piddir=/var/run/openvpn
29
-
30
-# Our working directory (.conf files should be here)
31
-work=/etc/openvpn
32
-
33
-# Our options
34
-opts="start stop restart condrestart"
35
-
36
-depend() {
37
-    need net
38
-    use dns
39
-}
40
-
41
-start() {
42
-    ebegin "Starting OpenVPN"
43
-
44
-    # Load the TUN/TAP module
45
-    /sbin/modprobe tun >/dev/null 2>&1
46
-
47
-    if [ ! -d  $piddir ]; then
48
-	mkdir $piddir
49
-    fi
50
-
51
-    cd $work
52
-
53
-    # Start every .conf in $work and run .sh if exists
54
-    local errors=0
55
-    local successes=0
56
-    local retstatus=0
57
-    for c in `/bin/ls *.conf 2>/dev/null`; do
58
-	bn=${c%%.conf}
59
-	if [ -f "$bn.sh" ]; then
60
-	    . $bn.sh
61
-	fi
62
-	rm -f $piddir/$bn.pid
63
-	$openvpn --daemon openvpn-$bn --writepid $piddir/$bn.pid --config $c --cd $work
64
-	if [ $? = 0 ]; then
65
-	    successes=1
66
-	else
67
-	    errors=1
68
-	fi
69
-    done
70
-
71
-    # Decide status based on errors/successes.
72
-    # If at least one tunnel succeeded, we return success.
73
-    # If some tunnels succeeded and some failed, we return
74
-    #   success but give a warning.
75
-    if [ $successes = 1 ]; then
76
-	if [ $errors = 1 ]; then
77
-	    ewarn "Note: At least one OpenVPN tunnel failed to start"
78
-	fi
79
-    else
80
-	retstatus=1
81
-	if [ $errors = 0 ]; then
82
-	    ewarn "Note: No OpenVPN configuration files were found in $work"
83
-	fi
84
-    fi
85
-    eend $retstatus "Error starting OpenVPN"
86
-}
87
-
88
-stop() {
89
-    ebegin "Stopping OpenVPN"
90
-    for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
91
-	if [ -s $pidf ]; then
92
-	    kill `cat $pidf` >/dev/null 2>&1
93
-	fi
94
-	rm -f $pidf
95
-    done
96
-    eend 0
97
-}
98
-
99
-# this should really be in runscript.sh
100
-started() {
101
-    if [ -L "${svcdir}/started/${myservice}" ]; then
102
-	return 1
103
-    else
104
-	return 0
105
-    fi
106
-}
107
-
108
-# attempt to restart ONLY if we are already started
109
-condrestart() {
110
-    started || restart
111
-}
... ...
@@ -27,12 +27,6 @@
27 27
  * network outages when the --gremlin option is used.
28 28
  */
29 29
 
30
-#ifdef WIN32
31
-#include "config-win32.h"
32
-#else
33
-#include "config.h"
34
-#endif
35
-
36 30
 #include "syshead.h"
37 31
 
38 32
 #ifdef ENABLE_DEBUG
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "forward.h"
... ...
@@ -17,7 +17,11 @@
17 17
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 18
  */
19 19
 
20
-#include <WinInet.h>
20
+#include "syshead.h"
21
+
22
+#ifdef WIN32
23
+
24
+#include <wininet.h>
21 25
 #include <malloc.h>
22 26
 
23 27
 LPCTSTR getIeHttpProxyError=NULL;
... ...
@@ -135,3 +139,7 @@ LPCTSTR getIeHttpProxy()
135 135
     return(NULL);
136 136
   }
137 137
 }
138
+
139
+#else
140
+static void dummy (void) {}
141
+#endif				/* WIN32 */
138 142
new file mode 100644
... ...
@@ -0,0 +1,2 @@
0
+Makefile
1
+Makefile.in
0 2
new file mode 100644
... ...
@@ -0,0 +1,41 @@
0
+#
1
+#  OpenVPN -- An application to securely tunnel IP networks
2
+#             over a single UDP port, with support for SSL/TLS-based
3
+#             session authentication and key exchange,
4
+#             packet encryption, packet authentication, and
5
+#             packet compression.
6
+#
7
+#  Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net>
8
+#
9
+#  This program is free software; you can redistribute it and/or modify
10
+#  it under the terms of the GNU General Public License version 2
11
+#  as published by the Free Software Foundation.
12
+#
13
+#  This program is distributed in the hope that it will be useful,
14
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+#  GNU General Public License for more details.
17
+#
18
+#  You should have received a copy of the GNU General Public License
19
+#  along with this program (see the file COPYING included with this
20
+#  distribution); if not, write to the Free Software Foundation, Inc.,
21
+#  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
+#
23
+
24
+MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
25
+
26
+images = \
27
+	install-whirl.bmp \
28
+	icon.ico
29
+
30
+if WIN32
31
+
32
+imagedir = $(win32datadir)/images
33
+dist_image_DATA = $(images)
34
+
35
+else
36
+
37
+dist_noinst_DATA = $(images)
38
+
39
+endif
40
+
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "win32.h"
... ...
@@ -1 +1,5 @@
1 1
 openvpn.nsi
2
+settings
3
+Makefile
4
+Makefile.in
5
+tmp
2 6
new file mode 100644
... ...
@@ -0,0 +1,74 @@
0
+#
1
+#  OpenVPN -- An application to securely tunnel IP networks
2
+#             over a single UDP port, with support for SSL/TLS-based
3
+#             session authentication and key exchange,
4
+#             packet encryption, packet authentication, and
5
+#             packet compression.
6
+#
7
+#  Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net>
8
+#
9
+#  This program is free software; you can redistribute it and/or modify
10
+#  it under the terms of the GNU General Public License version 2
11
+#  as published by the Free Software Foundation.
12
+#
13
+#  This program is distributed in the hope that it will be useful,
14
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+#  GNU General Public License for more details.
17
+#
18
+#  You should have received a copy of the GNU General Public License
19
+#  along with this program (see the file COPYING included with this
20
+#  distribution); if not, write to the Free Software Foundation, Inc.,
21
+#  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
+#
23
+
24
+MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
25
+
26
+dist_noinst_DATA = \
27
+	openvpn.nsi \
28
+	setpath.nsi
29
+
30
+if WIN32
31
+
32
+nodist_doc_DATA = tmp/license.txt
33
+
34
+confdir = $(win32datadir)/config
35
+nodist_conf_DATA = \
36
+	tmp/openssl.cnf.sample \
37
+	tmp/client.ovpn \
38
+	tmp/server.ovpn
39
+dist_conf_DATA = \
40
+	sample.ovpn
41
+
42
+easyrsadir = $(win32datadir)/easy-rsa/Windows
43
+nodist_easyrsa_DATA = \
44
+	$(top_srcdir)/easy-rsa/Windows/*
45
+
46
+keysdir = $(win32datadir)/sample-keys
47
+nodist_keys_DATA = \
48
+	$(top_srcdir)/sample-keys/*
49
+
50
+tmp:
51
+	mkdir tmp
52
+
53
+tmp/client.ovpn:	tmp $(top_srcdir)/sample-config-files/client.conf
54
+	cp $(top_srcdir)/sample-config-files/client.conf tmp/client.ovpn
55
+
56
+tmp/server.ovpn:	tmp $(top_srcdir)/sample-config-files/server.conf
57
+	cp $(top_srcdir)/sample-config-files/server.conf tmp/server.ovpn
58
+
59
+tmp/license.txt:	tmp $(top_srcdir)/COPYING $(top_srcdir)/COPYRIGHT.GPL
60
+	cat $(top_srcdir)/COPYING $(top_srcdir)/COPYRIGHT.GPL > tmp/license.txt
61
+
62
+tmp/openssl.cnf.sample:	tmp $(top_srcdir)/easy-rsa/2.0/openssl.cnf
63
+	cp $(top_srcdir)/easy-rsa/2.0/openssl.cnf tmp/openssl.cnf.sample
64
+
65
+clean-local:
66
+	-rm -fr tmp
67
+
68
+else
69
+
70
+dist_noinst_DATA += sample.ovpn
71
+
72
+endif
73
+
... ...
@@ -7,7 +7,7 @@
7 7
 if [ -d "$PKCS11_HELPER_DIR" ] ; then
8 8
     mkdir -p $GENOUT/lib &>/dev/null    
9 9
     for f in libpkcs11-helper-1.dll ; do
10
-	cp $PKCS11_HELPER_DIR/bin/$f $GENOUT/lib
10
+	cp $PKCS11_HELPER_DIR/usr/local/bin/$f $GENOUT/lib
11 11
         if [ -z "$NO_STRIP" ]; then
12 12
 	    strip $GENOUT/lib/$f
13 13
 	fi
... ...
@@ -1,19 +1,37 @@
1 1
 #!/bin/sh
2 2
 
3
+H=`pwd`
4
+
3 5
 # get version.nsi definitions
4 6
 . autodefs/defs.sh
5 7
 
6 8
 if gcc --version &>/dev/null && [ -d "$OPENSSL_DIR" ] && [ -d "$LZO_DIR" ] && [ -d "$PKCS11_HELPER_DIR" ]; then
7 9
     # build OpenVPN binary
8
-    [ "$CLEAN" = "yes" ] && make -f makefile.w32 clean
9
-    make -f makefile.w32 -j $MAKE_JOBS
10 10
 
11
-    # copy OpenVPN executable to GENOUT/bin
11
+    if ! [ -f Makefile ]; then
12
+	autoreconf -i -v \
13
+	&& ./configure \
14
+	    --enable-strict \
15
+	    --prefix=$H/windest \
16
+	    MAN2HTML=true \
17
+	    --with-ssl-headers=$H/$OPENSSL_DIR/include \
18
+	    --with-ssl-lib=$H/$OPENSSL_DIR/out \
19
+	    --with-lzo-headers=$H/$LZO_DIR/include \
20
+	    --with-lzo-lib=$H/$LZO_DIR \
21
+	    --with-pkcs11-helper-headers=$H/$PKCS11_HELPER_DIR/usr/local/include \
22
+	    --with-pkcs11-helper-lib=$H/$PKCS11_HELPER_DIR/usr/local/lib
23
+    fi
24
+
25
+    make -j $MAKE_JOBS && make install
26
+
27
+    # copy OpenVPN and service executables to GENOUT/bin
12 28
     mkdir -p $GENOUT/bin &>/dev/null
13
-    cp $PRODUCT_UNIX_NAME.exe $GENOUT/bin
29
+    cp windest/sbin/openvpn.exe $GENOUT/bin
30
+    cp windest/sbin/openvpnserv.exe $GENOUT/bin
14 31
     if [ -z "$NO_STRIP" ]; then
15
-	strip $GENOUT/bin/$PRODUCT_UNIX_NAME.exe
32
+	strip $GENOUT/bin/openvpn.exe
33
+	strip $GENOUT/bin/openvpnserv.exe
16 34
     fi
17 35
 else
18
-    echo DID NOT BUILD openvpn.exe because one or more of gcc, OPENSSL_DIR, LZO_DIR, or PKCS11_HELPER_DIR directories were missing
36
+    echo DID NOT BUILD openvpn.exe and openvpnserv.exe because one or more of gcc, OPENSSL_DIR, LZO_DIR, or PKCS11_HELPER_DIR directories were missing
19 37
 fi
20 38
deleted file mode 100644
... ...
@@ -1,32 +0,0 @@
1
-#!/bin/sh
2
-
3
-# get version.nsi definitions
4
-. autodefs/defs.sh
5
-
6
-# build OpenVPN service (openvpnserv.exe)
7
-if [ -d "$SVC_TEMPLATE" ] ; then
8
-    # silly vista security theatre
9
-    PATCH="/tmp/p.exe"
10
-    cp `which patch` $PATCH
11
-
12
-    # build service sources
13
-    cp $SVC_TEMPLATE/service.[ch] service-win32
14
-    cd service-win32
15
-    cp service.c service.c.orig
16
-    cp service.h service.h.orig
17
-    $PATCH <service.patch
18
-
19
-    # compile/link
20
-    [ "$CLEAN" = "yes" ] && make clean
21
-    make -j $MAKE_JOBS
22
-    cd ..
23
-
24
-    # copy service to GENOUT/bin
25
-    mkdir $GENOUT/bin &>/dev/null
26
-    cp service-win32/${PRODUCT_UNIX_NAME}serv.exe $GENOUT/bin
27
-    if [ -z "$NO_STRIP" ]; then
28
-	strip $GENOUT/bin/${PRODUCT_UNIX_NAME}serv.exe
29
-    fi
30
-else
31
-    echo OpenVPN service not built -- template directory $SVC_TEMPLATE NOT FOUND
32
-fi
... ...
@@ -19,12 +19,12 @@
19 19
 
20 20
 # Include the OpenVPN XML-based GUI exe in the installer.
21 21
 # May be undefined.
22
-!define OPENVPN_XGUI_DIR "../ovpnxml"
22
+;!define OPENVPN_XGUI_DIR "../ovpnxml"
23 23
 
24 24
 # Prebuilt libraries.  DMALLOC is optional.
25 25
 !define OPENSSL_DIR	  "../openssl-0.9.7m"
26 26
 !define LZO_DIR		  "../lzo-2.02"
27
-!define PKCS11_HELPER_DIR "../pkcs11-helper/usr/local"
27
+!define PKCS11_HELPER_DIR "../pkcs11-helper"
28 28
 !define DMALLOC_DIR	  "../dmalloc-5.4.2"
29 29
 
30 30
 # Optional directory of prebuilt OpenVPN binary components,
... ...
@@ -36,10 +36,10 @@
36 36
 # Not needed if DRVBINSRC is defined.
37 37
 !define TISRC	"../tapinstall"
38 38
 
39
-# TAP Adapter parameters.
39
+# TAP Adapter parameters.  Note that PRODUCT_TAP_ID is
40
+# defined in version.m4.
40 41
 !define PRODUCT_TAP_DEVICE_DESCRIPTION  "TAP-Win32 Adapter V9"
41 42
 !define PRODUCT_TAP_PROVIDER            "TAP-Win32 Provider V9"
42
-!define PRODUCT_TAP_ID		        "tap0901"
43 43
 !define PRODUCT_TAP_MAJOR_VER           9
44 44
 !define PRODUCT_TAP_MINOR_VER           4
45 45
 !define PRODUCT_TAP_RELDATE             "01/22/2008"
... ...
@@ -50,10 +50,6 @@
50 50
 # Build debugging version of TAP driver
51 51
 ;!define PRODUCT_TAP_DEBUG
52 52
 
53
-# Service template files service.[ch] (get from Platform SDK).
54
-# If undefined, don't build openvpnserv.exe
55
-!define SVC_TEMPLATE "../svc-template"
56
-
57 53
 # DDK Version.
58 54
 # DDK distribution is assumed to be in C:\WINDDK\${DDKVER}
59 55
 !define DDKVER	     6001.17121
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "interval.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP_SERVER
... ...
@@ -2,12 +2,6 @@
2 2
  * Support routine for configuring link layer address 
3 3
  */
4 4
 
5
-#ifdef WIN32
6
-#include "config-win32.h"
7
-#else
8
-#include "config.h"
9
-#endif
10
-
11 5
 #include "syshead.h"
12 6
 #include "error.h"
13 7
 #include "misc.h"
... ...
@@ -22,16 +22,10 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
25
+#include "syshead.h"
30 26
 
31 27
 #ifdef USE_LZO
32 28
 
33
-#include "syshead.h"
34
-
35 29
 #include "lzo.h"
36 30
 #include "error.h"
37 31
 #include "otime.h"
38 32
deleted file mode 100755
... ...
@@ -1,204 +0,0 @@
1
-# This Makefile builds the user-mode component
2
-# of OpenVPN for WIN32 in the MinGW environment.
3
-#
4
-# Build Dependencies:
5
-#	mingw		(GNU C compiler for windows)
6
-#	msys		(GNU utilities and shell for windows)
7
-#	OpenSSL		(SSL/TLS/crypto library)
8
-#	LZO		(real-time compression library)
9
-#       Dmalloc         (debugging only)
10
-#
11
-# Targets:
12
-#	static -- link statically with OpenSSL
13
-#       dynamic -- link dynamically with OpenSSL
14
-#       dmalloc -- enable memory debugging using the dmalloc library 
15
-#
16
-# Note that LZO is always linked statically.
17
-#
18
-# To build openssl-0.9.7d, remember to edit ms\mw.bat
19
-# adding '--win32' flag to make command:
20
-#
21
-#   make --win32 -f ms/mingw32.mak
22
-#
23
-# Now cd to top level openssl directory in a Windows
24
-# command-prompt window, and type:
25
-#
26
-#   ms\mw
27
-#
28
-# See additional .bat scripts in install-win32 for OpenSSL
29
-# build setup.
30
-#
31
-# If you are building with dmalloc debugging support
32
-# see windbg.h for additional dmalloc notes.
33
-
34
-#########################################################
35
-# Change these to point to your OpenSSL, LZO, and
36
-# (optionally) dmalloc top-level directories.
37
-# Normally set as environmental variables before calling
38
-# make.
39
-#
40
-#OPENSSL_DIR = 
41
-#LZO_DIR = 
42
-#DMALLOC_DIR = 
43
-#PKCS11_HELPER_DIR =
44
-
45
-#########################################################
46
-
47
-CC = gcc -g -O2 -Wall -Wno-unused-function -Wno-unused-variable -mno-cygwin
48
-
49
-CC_DMALLOC = gcc -g -O2 -Wall -Wno-unused-function -Wno-unused-variable -mno-cygwin -fno-inline -DDMALLOC
50
-
51
-INCLUDE_DIRS = -I${OPENSSL_DIR}/include -I${LZO_DIR}/include -I${PKCS11_HELPER_DIR}/include
52
-
53
-INCLUDE_DIRS_DMALLOC = ${INCLUDE_DIRS} -I${DMALLOC_DIR}
54
-
55
-LIBS = -llzo2 -lcrypt32 -lWinInet -lws2_32 -lgdi32 -liphlpapi -lwinmm -lpkcs11-helper
56
-
57
-LIBS_DMALLOC = ${LIBS} -ldmalloc
58
-
59
-LIB_DIRS = -L${OPENSSL_DIR}/out -L${LZO_DIR} -L${PKCS11_HELPER_DIR}/lib
60
-
61
-LIB_DIRS_DMALLOC = ${LIB_DIRS} -L${DMALLOC_DIR}
62
-
63
-EXE = ${PRODUCT_UNIX_NAME}.exe
64
-
65
-HEADERS = \
66
-	base64.h \
67
-	basic.h \
68
-	buffer.h \
69
-	circ_list.h \
70
-	common.h \
71
-	tap-win32/common.h \
72
-        config-win32.h \
73
-	crypto.h \
74
-	cryptoapi.h \
75
-	errlevel.h \
76
-	error.h \
77
-	event.h \
78
-        fdmisc.h \
79
-	forward-inline.h \
80
-	forward.h \
81
-	fragment.h \
82
-        gremlin.h \
83
-	helper.h \
84
-	init.h \
85
-	integer.h \
86
-	interval.h \
87
-	list.h \
88
-	lladdr.h \
89
-	lzo.h \
90
-	manage.h \
91
-	mbuf.h \
92
-	memdbg.h \
93
-	misc.h \
94
-	mroute.h \
95
-	mss.h \
96
-	mtcp.h \
97
-	mtu.h \
98
-	mudp.h \
99
-	multi.h \
100
-	ntlm.h \
101
-	occ-inline.h \
102
-	occ.h \
103
-	pkcs11.h \
104
-        openvpn.h \
105
-	openvpn-plugin.h \
106
-	options.h \
107
-	otime.h \
108
-	packet_id.h \
109
-	perf.h \
110
-	ping-inline.h \
111
-	ping.h \
112
-	plugin.h \
113
-	pool.h \
114
-        proto.h \
115
-	proxy.h \
116
-	push.h \
117
-	reliable.h \
118
-	route.h \
119
-	schedule.h \
120
-	session_id.h \
121
-        shaper.h \
122
-	sig.h \
123
-	socket.h \
124
-	socks.h \
125
-	ssl.h \
126
-        status.h \
127
-	syshead.h \
128
-        thread.h \
129
-	tun.h \
130
-	win32.h
131
-
132
-OBJS =  base64.o \
133
-	buffer.o \
134
-	crypto.o \
135
-	cryptoapi.o \
136
-	error.o \
137
-	event.o \
138
-	fdmisc.o \
139
-	forward.o \
140
-        fragment.o \
141
-	gremlin.o \
142
-	helper.o \
143
-	init.o \
144
-	interval.o \
145
-        list.o \
146
-	lladdr.o \
147
-	lzo.o \
148
-	manage.o \
149
-	mbuf.o \
150
-	misc.o \
151
-	mroute.o \
152
-	mss.o \
153
-	mtcp.o \
154
-	mtu.o \
155
-	mudp.o \
156
-	multi.o \
157
-	ntlm.o \
158
-	occ.o \
159
-	pkcs11.o \
160
-        openvpn.o \
161
-	options.o \
162
-	otime.o \
163
-	packet_id.o \
164
-	perf.o \
165
-	ping.o \
166
-	plugin.o \
167
-        pool.o \
168
-	proto.o \
169
-	proxy.o \
170
-	push.o \
171
-	reliable.o \
172
-        route.o \
173
-	schedule.o \
174
-	session_id.o \
175
-	shaper.o \
176
-	sig.o \
177
-	socket.o \
178
-        socks.o \
179
-	ssl.o \
180
-	status.o \
181
-	thread.o \
182
-	tun.o \
183
-	win32.o
184
-
185
-dynamic : MY_CC = ${CC}
186
-dynamic : MY_INCLUDE_DIRS = ${INCLUDE_DIRS}
187
-dynamic : ${OBJS}
188
-	${MY_CC} -o ${EXE} ${OBJS} ${LIB_DIRS} -lssl32 -leay32 ${LIBS}
189
-
190
-static : MY_CC = ${CC}
191
-static : MY_INCLUDE_DIRS = ${INCLUDE_DIRS}
192
-static : ${OBJS}
193
-	${CC} -o ${EXE} ${OBJS} ${LIB_DIRS} -lssl -lcrypto ${LIBS}
194
-
195
-dmalloc : MY_CC = ${CC_DMALLOC}
196
-dmalloc : MY_INCLUDE_DIRS = ${INCLUDE_DIRS_DMALLOC}
197
-dmalloc : ${OBJS}
198
-	${MY_CC} -o ${EXE} ${OBJS} ${LIB_DIRS_DMALLOC} -lssl32 -leay32 ${LIBS_DMALLOC}
199
-
200
-clean :
201
-	rm -f ${OBJS} ${EXE}
202
-
203
-%.o : %.c ${HEADERS}
204
-	${MY_CC} ${MY_INCLUDE_DIRS} -c $< -o $@
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #ifdef ENABLE_MANAGEMENT
... ...
@@ -45,6 +39,10 @@
45 45
 
46 46
 #include "memdbg.h"
47 47
 
48
+#ifdef ENABLE_PKCS11
49
+#include "pkcs11.h"
50
+#endif
51
+
48 52
 #define MANAGEMENT_ECHO_PULL_INFO 0
49 53
 
50 54
 #if MANAGEMENT_ECHO_PULL_INFO
... ...
@@ -82,8 +80,14 @@ man_help ()
82 82
   msg (M_CLIENT, "mute [n]               : Set log mute level to n, or show level if n is absent.");
83 83
   msg (M_CLIENT, "needok type action     : Enter confirmation for NEED-OK request of 'type',");
84 84
   msg (M_CLIENT, "                         where action = 'ok' or 'cancel'.");
85
+  msg (M_CLIENT, "needstr type action    : Enter confirmation for NEED-STR request of 'type',");
86
+  msg (M_CLIENT, "                         where action is reply string.");
85 87
   msg (M_CLIENT, "net                    : (Windows only) Show network info and routing table.");
86 88
   msg (M_CLIENT, "password type p        : Enter password p for a queried OpenVPN password.");
89
+#ifdef ENABLE_PKCS11
90
+  msg (M_CLIENT, "pkcs11-id-count        : Get number of available PKCS#11 identities.");
91
+  msg (M_CLIENT, "pkcs11-id-get index    : Get PKCS#11 identity at index.");
92
+#endif
87 93
   msg (M_CLIENT, "signal s               : Send signal s to daemon,");
88 94
   msg (M_CLIENT, "                         s = SIGHUP|SIGTERM|SIGUSR1|SIGUSR2.");
89 95
   msg (M_CLIENT, "state [on|off] [N|all] : Like log, but show state history.");
... ...
@@ -541,6 +545,10 @@ man_up_finalize (struct management *man)
541 541
       if (strlen (man->connection.up_query.password))
542 542
 	man->connection.up_query.defined = true;
543 543
       break;
544
+    case UP_QUERY_NEED_STR:
545
+      if (strlen (man->connection.up_query.password))
546
+	man->connection.up_query.defined = true;
547
+      break;
544 548
     default:
545 549
       ASSERT (0);
546 550
     }
... ...
@@ -604,6 +612,13 @@ man_query_need_ok (struct management *man, const char *type, const char *action)
604 604
 }
605 605
 
606 606
 static void
607
+man_query_need_str (struct management *man, const char *type, const char *action)
608
+{
609
+  const bool needed = ((man->connection.up_query_mode == UP_QUERY_NEED_STR) && man->connection.up_query_type);
610
+  man_query_user_pass (man, type, action, needed, "needstr-string", man->connection.up_query.password, USER_PASS_LEN);
611
+}
612
+
613
+static void
607 614
 man_forget_passwords (struct management *man)
608 615
 {
609 616
   ssl_purge_auth ();
... ...
@@ -623,6 +638,33 @@ man_net (struct management *man)
623 623
     }
624 624
 }
625 625
 
626
+#ifdef ENABLE_PKCS11
627
+
628
+static void
629
+man_pkcs11_id_count (struct management *man)
630
+{
631
+  msg (M_CLIENT, ">PKCS11ID-COUNT:%d", pkcs11_management_id_count ());
632
+}
633
+
634
+static void
635
+man_pkcs11_id_get (struct management *man, const int index)
636
+{
637
+  char *id = NULL;
638
+  char *base64 = NULL;
639
+
640
+  if (pkcs11_management_id_get (index, &id, &base64))
641
+    msg (M_CLIENT, ">PKCS11ID-ENTRY:'%d', ID:'%s', BLOB:'%s'", index, id, base64);
642
+  else
643
+    msg (M_CLIENT, ">PKCS11ID-ENTRY:'%d'", index);
644
+
645
+  if (id != NULL)
646
+    free (id);
647
+  if (base64 != NULL)
648
+    free (base64);
649
+}
650
+
651
+#endif
652
+
626 653
 static void
627 654
 man_hold (struct management *man, const char *cmd)
628 655
 {
... ...
@@ -807,6 +849,11 @@ man_dispatch_command (struct management *man, struct status_output *so, const ch
807 807
       if (man_need (man, p, 2, 0))
808 808
 	man_query_need_ok (man, p[1], p[2]);
809 809
     }
810
+  else if (streq (p[0], "needstr"))
811
+    {
812
+      if (man_need (man, p, 2, 0))
813
+	man_query_need_str (man, p[1], p[2]);
814
+    }
810 815
   else if (streq (p[0], "net"))
811 816
     {
812 817
       man_net (man);
... ...
@@ -820,6 +867,17 @@ man_dispatch_command (struct management *man, struct status_output *so, const ch
820 820
       if (man_need (man, p, 1, 0))
821 821
 	man_bytecount (man, atoi(p[1]));
822 822
     }
823
+#ifdef ENABLE_PKCS11
824
+  else if (streq (p[0], "pkcs11-id-count"))
825
+    {
826
+      man_pkcs11_id_count (man);
827
+    }
828
+  else if (streq (p[0], "pkcs11-id-get"))
829
+    {
830
+      if (man_need (man, p, 1, 0))
831
+	man_pkcs11_id_get (man, atoi(p[1]));
832
+    }
833
+#endif
823 834
 #if 1
824 835
   else if (streq (p[0], "test"))
825 836
     {
... ...
@@ -2037,6 +2095,12 @@ management_query_user_pass (struct management *man,
2037 2037
 	  prefix= "NEED-OK";
2038 2038
 	  alert_type = "confirmation";
2039 2039
 	}
2040
+      else if (flags & GET_USER_PASS_NEED_STR)
2041
+        {
2042
+	  up_query_mode = UP_QUERY_NEED_STR;
2043
+	  prefix= "NEED-STR";
2044
+	  alert_type = "string";
2045
+	}
2040 2046
       else if (flags & GET_USER_PASS_PASSWORD_ONLY)
2041 2047
 	{
2042 2048
 	  up_query_mode = UP_QUERY_PASS;
... ...
@@ -2054,7 +2118,7 @@ management_query_user_pass (struct management *man,
2054 2054
 		  type,
2055 2055
 		  alert_type);
2056 2056
 
2057
-      if (flags & GET_USER_PASS_NEED_OK)
2057
+      if (flags & (GET_USER_PASS_NEED_OK | GET_USER_PASS_NEED_STR))
2058 2058
 	buf_printf (&alert_msg, " MSG:%s", up->username);
2059 2059
 
2060 2060
       man_wait_for_client_connection (man, &signal_received, 0, MWCC_PASSWORD_WAIT);
... ...
@@ -222,6 +222,7 @@ struct man_settings {
222 222
 #define UP_QUERY_USER_PASS 1
223 223
 #define UP_QUERY_PASS      2
224 224
 #define UP_QUERY_NEED_OK   3
225
+#define UP_QUERY_NEED_STR  4
225 226
 
226 227
 /* states */
227 228
 #define MS_INITIAL          0  /* all sockets are closed */
... ...
@@ -382,7 +382,7 @@ Command examples:
382 382
                          Query for new input and retry.
383 383
 
384 384
 COMMAND -- needok  (OpenVPN 2.1 or higher)
385
+------------------------------------------
385 386
 
386 387
 Confirm a ">NEED-OK" real-time notification, normally used by
387 388
 OpenVPN to block while waiting for a specific user action.
... ...
@@ -403,6 +403,47 @@ Example:
403 403
   or
404 404
      needok token-insertion-request cancel
405 405
 
406
+COMMAND -- needstr  (OpenVPN 2.1 or higher)
407
+-------------------------------------------
408
+
409
+Confirm a ">NEED-STR" real-time notification, normally used by
410
+OpenVPN to block while waiting for a specific user input.
411
+
412
+Example:
413
+
414
+  OpenVPN needs the user to specify some input, so it sends a
415
+  real-time notification:
416
+
417
+    >NEED-STR:Need 'name' input MSG:Please specify your name
418
+
419
+  The management client, if it is a GUI, can flash a dialog
420
+  box containing the text after the "MSG:" marker to the user.
421
+  When the user acknowledges the dialog box,
422
+  the management client can issue this command:
423
+
424
+     needstr name "John"
425
+
426
+COMMAND -- pkcs11-id-count  (OpenVPN 2.1 or higher)
427
+---------------------------------------------------
428
+
429
+Retrieve available number of certificates.
430
+
431
+Example:
432
+
433
+     pkcs11-id-count
434
+     >PKCS11ID-COUNT:5
435
+
436
+COMMAND -- pkcs11-id-get  (OpenVPN 2.1 or higher)
437
+-------------------------------------------------
438
+
439
+Retrieve certificate by index, the ID string should be provided
440
+as PKCS#11 identity, the blob is BASE64 encoded certificate.
441
+
442
+Example:
443
+
444
+     pkcs11-id-get 1
445
+     PKCS11ID-ENTRY:'1', ID:'<snip>', BLOB:'<snip>'
446
+
406 447
 OUTPUT FORMAT
407 448
 -------------
408 449
 
... ...
@@ -445,6 +486,10 @@ NEED-OK  -- OpenVPN needs the end user to do something, such as
445 445
             insert a cryptographic token.  The "needok" command can
446 446
             be used to tell OpenVPN to continue.
447 447
 
448
+NEED-STR -- OpenVPN needs information from end, such as
449
+            a certificate to use.  The "needstr" command can
450
+            be used to tell OpenVPN to continue.
451
+
448 452
 PASSWORD -- Used to tell the management client that OpenVPN
449 453
             needs a password, also to indicate password
450 454
             verification failure.
... ...
@@ -460,11 +505,11 @@ as is used by the OpenVPN config file parser.
460 460
 
461 461
 Whitespace is a parameter separator.
462 462
 
463
-Double  quotation characters ("") can be used to enclose
464
-parameters containing whitespace.
463
+Double quotation or single quotation characters ("", '') can be used
464
+to enclose parameters containing whitespace.
465 465
 
466 466
 Backslash-based shell escaping is performed, using the following
467
-mappings:
467
+mappings, when not in single quotations:
468 468
 
469 469
 \\       Maps to a single backslash character (\).
470 470
 \"       Pass a literal doublequote character ("), don't
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "buffer.h"
... ...
@@ -206,7 +200,7 @@ run_up_down (const char *command,
206 206
       ASSERT (arg);
207 207
 
208 208
       buf_printf (&cmd,
209
-		  "%s %d %d %s %s %s",
209
+		  "\"%s\" %d %d %s %s %s",
210 210
 		  arg,
211 211
 		  tun_mtu, link_mtu,
212 212
 		  ifconfig_local, ifconfig_remote,
... ...
@@ -225,7 +219,7 @@ run_up_down (const char *command,
225 225
       setenv_str (es, "script_type", script_type);
226 226
 
227 227
       buf_printf (&cmd,
228
-		  "%s %s %d %d %s %s %s",
228
+		  "%s \"%s\" %d %d %s %s %s",
229 229
 		  command,
230 230
 		  arg,
231 231
 		  tun_mtu, link_mtu,
... ...
@@ -438,6 +432,7 @@ openvpn_system (const char *command, const struct env_set *es, unsigned int flag
438 438
 void
439 439
 warn_if_group_others_accessible (const char* filename)
440 440
 {
441
+#ifndef WIN32
441 442
 #ifdef HAVE_STAT
442 443
 #if ENABLE_INLINE_FILES
443 444
   if (strcmp (filename, INLINE_FILE_TAG))
... ...
@@ -455,6 +450,7 @@ warn_if_group_others_accessible (const char* filename)
455 455
 	}
456 456
     }
457 457
 #endif
458
+#endif
458 459
 }
459 460
 
460 461
 /*
... ...
@@ -1230,7 +1226,7 @@ get_user_pass (struct user_pass *up,
1230 1230
 	      if ((flags & GET_USER_PASS_NOFATAL) != 0)
1231 1231
 		return false;
1232 1232
 	      else
1233
-		msg (M_FATAL, "ERROR: could not read %s username/password/ok from management interface", prefix);
1233
+		msg (M_FATAL, "ERROR: could not read %s username/password/ok/string from management interface", prefix);
1234 1234
 	    }
1235 1235
 	}
1236 1236
       else
... ...
@@ -227,7 +227,11 @@ struct user_pass
227 227
   bool nocache;
228 228
 
229 229
 /* max length of username/password */
230
-# define USER_PASS_LEN 128
230
+# ifdef ENABLE_PKCS11
231
+#   define USER_PASS_LEN 4096
232
+# else
233
+#   define USER_PASS_LEN 128
234
+# endif
231 235
   char username[USER_PASS_LEN];
232 236
   char password[USER_PASS_LEN];
233 237
 };
... ...
@@ -242,6 +246,7 @@ bool get_console_input (const char *prompt, const bool echo, char *input, const
242 242
 #define GET_USER_PASS_PASSWORD_ONLY (1<<2)
243 243
 #define GET_USER_PASS_NEED_OK       (1<<3)
244 244
 #define GET_USER_PASS_NOFATAL       (1<<4)
245
+#define GET_USER_PASS_NEED_STR      (1<<5)
245 246
 
246 247
 bool get_user_pass (struct user_pass *up,
247 248
 		    const char *auth_file,
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP_SERVER
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 #include "error.h"
33 27
 #include "mss.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP_SERVER
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "common.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP_SERVER
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP_SERVER
... ...
@@ -3,6 +3,8 @@
3 3
  *
4 4
  *  Copyright (C) 2004 William Preston
5 5
  *
6
+ *  *NTLMv2 support and domain name parsing by Miroslav Zajic, Nextsoft s.r.o.*
7
+ *
6 8
  *  This program is free software; you can redistribute it and/or modify
7 9
  *  it under the terms of the GNU General Public License as published by
8 10
  *  the Free Software Foundation; either version 2 of the License, or
... ...
@@ -19,12 +21,6 @@
19 19
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 20
  */
21 21
 
22
-#ifdef WIN32
23
-#include "config-win32.h"
24
-#else
25
-#include "config.h"
26
-#endif
27
-
28 22
 #include "syshead.h"
29 23
 
30 24
 #if NTLM
... ...
@@ -41,6 +37,21 @@
41 41
 
42 42
 #include "memdbg.h"
43 43
 
44
+
45
+/* 64bit datatype macros */
46
+#ifdef _MSC_VER 
47
+	/* MS compilers */
48
+#	define UINTEGER64 __int64
49
+#	define UINT64(c) c ## Ui64
50
+#else 
51
+	/* Non MS compilers */
52
+#	define UINTEGER64 unsigned long long
53
+#	define UINT64(c) c ## LL
54
+#endif
55
+
56
+
57
+
58
+
44 59
 static void
45 60
 create_des_keys(const unsigned char *hash, unsigned char *key)
46 61
 {
... ...
@@ -70,6 +81,61 @@ gen_md4_hash (const char* data, int data_len, char *result)
70 70
   memcpy (result, md, 16);
71 71
 }
72 72
 
73
+static void
74
+gen_hmac_md5 (const char* data, int data_len, const char* key, int key_len,char *result)
75
+{
76
+	unsigned int len;
77
+
78
+	HMAC_CTX c;
79
+	HMAC_Init (&c, key, key_len, EVP_md5());
80
+	HMAC_Update (&c, data, data_len);
81
+	HMAC_Final (&c, result, &len);
82
+	HMAC_CTX_cleanup(&c);
83
+}
84
+
85
+static void
86
+gen_timestamp (unsigned char *timestamp)
87
+{ 
88
+	/* Copies 8 bytes long timestamp into "timestamp" buffer. 
89
+	 * Timestamp is Little-endian, 64-bit signed value representing the number of tenths of a microsecond since January 1, 1601.
90
+	 */
91
+
92
+	UINTEGER64 timestamp_ull;
93
+
94
+	timestamp_ull = openvpn_time(NULL);
95
+	timestamp_ull = (timestamp_ull + UINT64(11644473600)) * UINT64(10000000);
96
+
97
+	/* store little endian value */
98
+	timestamp[0]= timestamp_ull & UINT64(0xFF);
99
+	timestamp[1]= (timestamp_ull  >> 8)  & UINT64(0xFF);
100
+	timestamp[2]= (timestamp_ull  >> 16) & UINT64(0xFF);
101
+	timestamp[3]= (timestamp_ull  >> 24) & UINT64(0xFF);
102
+	timestamp[4]= (timestamp_ull  >> 32) & UINT64(0xFF);
103
+	timestamp[5]= (timestamp_ull  >> 40) & UINT64(0xFF);
104
+	timestamp[6]= (timestamp_ull  >> 48) & UINT64(0xFF);
105
+	timestamp[7]= (timestamp_ull  >> 56) & UINT64(0xFF);
106
+}
107
+
108
+static void
109
+gen_nonce (unsigned char *nonce)
110
+{ 
111
+	/* Generates 8 random bytes to be used as client nonce */
112
+	int i;
113
+
114
+	for(i=0;i<8;i++){
115
+		nonce[i] = (unsigned char)get_random();
116
+	}
117
+}
118
+
119
+unsigned char *my_strupr(unsigned char *str)
120
+{ 
121
+	/* converts string to uppercase in place */
122
+	unsigned char *tmp = str;;
123
+
124
+	do *str = toupper(*str); while (*(++str));
125
+	return tmp;
126
+}
127
+
73 128
 static int
74 129
 unicodize (char *dst, const char *src)
75 130
 {
... ...
@@ -85,6 +151,18 @@ unicodize (char *dst, const char *src)
85 85
   return i;
86 86
 }
87 87
 
88
+static void
89
+add_security_buffer(int sb_offset, void *data, int length, unsigned char *msg_buf, int *msg_bufpos)
90
+{
91
+	/* Adds security buffer data to a message and sets security buffer's offset and length */
92
+	msg_buf[sb_offset] = (unsigned char)length;
93
+	msg_buf[sb_offset + 2] = msg_buf[sb_offset];
94
+	msg_buf[sb_offset + 4] = (unsigned char)(*msg_bufpos & 0xff);
95
+	msg_buf[sb_offset + 5] = (unsigned char)((*msg_bufpos >> 8) & 0xff);
96
+	memcpy(&msg_buf[*msg_bufpos], data, msg_buf[sb_offset]);
97
+	*msg_bufpos += length;
98
+}
99
+
88 100
 const char *
89 101
 ntlm_phase_1 (const struct http_proxy_info *p, struct gc_arena *gc)
90 102
 {
... ...
@@ -105,23 +183,56 @@ ntlm_phase_1 (const struct http_proxy_info *p, struct gc_arena *gc)
105 105
 const char *
106 106
 ntlm_phase_3 (const struct http_proxy_info *p, const char *phase_2, struct gc_arena *gc)
107 107
 {
108
+	/* NTLM handshake
109
+	 *
110
+	 * http://davenport.sourceforge.net/ntlm.html
111
+	 *
112
+	 */
113
+	
108 114
   char pwbuf[sizeof (p->up.password) * 2]; /* for unicode password */
109 115
   char buf2[128]; /* decoded reply from proxy */
110
-  char phase3[146];
116
+  unsigned char phase3[464];
111 117
 
112 118
   char md4_hash[21];
113
-  char challenge[8], response[24];
114
-  int i, ret_val, buflen;
119
+  char challenge[8], ntlm_response[24];
120
+  int i, ret_val;
115 121
   des_cblock key1, key2, key3;
116 122
   des_key_schedule sched1, sched2, sched3;
117 123
 
118
-  /* try a minimal NTLM handshake
119
-   *
120
-   * http://davenport.sourceforge.net/ntlm.html
121
-   *
122
-   */
124
+	char ntlmv2_response[144];
125
+	char userdomain_u[256]; /* for uppercase unicode username and domain */
126
+	char userdomain[128];   /* the same as previous but ascii */
127
+	char ntlmv2_hash[16];
128
+	char ntlmv2_hmacmd5[16];
129
+	char *ntlmv2_blob = ntlmv2_response + 16; /* inside ntlmv2_response, length: 128 */
130
+	int ntlmv2_blob_size=0;
131
+	int phase3_bufpos = 0x40; /* offset to next security buffer data to be added */
132
+	int len;
133
+
134
+	char domain[128];
135
+	char username[128];
136
+	char *separator;
137
+
138
+	bool ntlmv2_enabled = (p->auth_method == HTTP_AUTH_NTLM2);
139
+
123 140
   ASSERT (strlen (p->up.username) > 0);
124 141
   ASSERT (strlen (p->up.password) > 0);
142
+	
143
+	/* username parsing */
144
+	separator = strchr(p->up.username, '\\');
145
+	if (separator == NULL) {
146
+		strncpy(username, p->up.username, sizeof(username)-1);
147
+		username[sizeof(username)-1]=0;
148
+		domain[0]=0;
149
+	} else {
150
+		strncpy(username, separator+1, sizeof(username)-1);
151
+		username[sizeof(username)-1]=0;
152
+		len = separator - p->up.username;
153
+		if (len > sizeof(domain) - 1) len = sizeof(domain) - 1;
154
+		strncpy(domain, p->up.username,  len);
155
+		domain[len]=0;
156
+	}
157
+
125 158
 
126 159
   /* fill 1st 16 bytes with md4 hash, disregard terminating null */
127 160
   gen_md4_hash (pwbuf, unicodize (pwbuf, p->up.password) - 2, md4_hash);
... ...
@@ -139,48 +250,95 @@ ntlm_phase_3 (const struct http_proxy_info *p, const char *phase_2, struct gc_ar
139 139
     challenge[i] = buf2[i+24];
140 140
   }
141 141
 
142
-  create_des_keys ((unsigned char *)md4_hash, key1);
143
-  des_set_key_unchecked ((des_cblock *)key1, sched1);
144
-  des_ecb_encrypt ((des_cblock *)challenge, (des_cblock *)response, sched1, DES_ENCRYPT);
145
-
146
-  create_des_keys ((unsigned char *)&(md4_hash[7]), key2);
147
-  des_set_key_unchecked ((des_cblock *)key2, sched2);
148
-  des_ecb_encrypt ((des_cblock *)challenge, (des_cblock *)&(response[8]), sched2, DES_ENCRYPT);
149
-
150
-  create_des_keys ((unsigned char *)&(md4_hash[14]), key3);
151
-  des_set_key_unchecked ((des_cblock *)key3, sched3);
152
-  des_ecb_encrypt ((des_cblock *)challenge, (des_cblock *)&(response[16]), sched3, DES_ENCRYPT);
153
-
154
-  /* clear reply */
155
-  memset (phase3, 0, sizeof (phase3));
156
-
157
-  strcpy (phase3, "NTLMSSP\0");
158
-  phase3[8] = 3; /* type 3 */
159
-
160
-  buflen = 0x58 + strlen (p->up.username);
161
-  if (buflen > (int) sizeof (phase3))
162
-    buflen = sizeof (phase3);
163
-
164
-  phase3[0x10] = buflen; /* lm not used */
165
-  phase3[0x20] = buflen; /* default domain (i.e. proxy's domain) */
166
-  phase3[0x30] = buflen; /* no workstation name supplied */
167
-  phase3[0x38] = buflen; /* no session key */
168
-
169
-  phase3[0x14] = 24; /* ntlm response is 24 bytes long */
170
-  phase3[0x16] = phase3[0x14];
171
-  phase3[0x18] = 0x40; /* ntlm offset */
172
-  memcpy (&(phase3[0x40]), response, 24);
173
-
174
-
175
-  phase3[0x24] = strlen (p->up.username); /* username in ascii */
176
-  phase3[0x26] = phase3[0x24];
177
-  phase3[0x28] = 0x58;
178
-  strncpy (&(phase3[0x58]), p->up.username, sizeof (phase3) - 0x58);
179
-
142
+	if (ntlmv2_enabled){ /* Generate NTLMv2 response */
143
+		
144
+		/* NTLMv2 hash */
145
+		my_strupr(strcpy(userdomain, username));
146
+		if (strlen(username) + strlen(domain) < sizeof(userdomain))
147
+			strcat(userdomain, domain);
148
+		else
149
+			msg (M_INFO, "Warning: Username or domain too long");
150
+		unicodize (userdomain_u, userdomain);
151
+		gen_hmac_md5(userdomain_u, 2 * strlen(userdomain), md4_hash, 16, ntlmv2_hash);
152
+
153
+		/* NTLMv2 Blob */
154
+		memset(ntlmv2_blob, 0, 128);                /* Clear blob buffer */ 
155
+		ntlmv2_blob[0x00]=1;                        /* Signature */
156
+		ntlmv2_blob[0x01]=1;                        /* Signature */
157
+		ntlmv2_blob[0x04]=0;                        /* Reserved */
158
+		gen_timestamp(&ntlmv2_blob[0x08]);          /* 64-bit Timestamp */
159
+		gen_nonce(&ntlmv2_blob[0x10]);              /* 64-bit Client Nonce */
160
+		ntlmv2_blob[0x18]=0;                        /* Unknown, zero should work */
161
+
162
+		/* Add target information block to the blob */
163
+		int tib_len;
164
+		if (( *((long *)&buf2[0x14]) & 0x00800000) == 0x00800000){ /* Check for Target Information block */
165
+			tib_len = buf2[0x28];/* Get Target Information block size */
166
+			if (tib_len > 96) tib_len = 96;
167
+			char *tib_ptr = buf2 + buf2[0x2c]; /* Get Target Information block pointer */
168
+			memcpy(&ntlmv2_blob[0x1c], tib_ptr, tib_len); /* Copy Target Information block into the blob */
169
+		} else {
170
+			tib_len = 0;
171
+		}
172
+
173
+		ntlmv2_blob[0x1c + tib_len] = 0;            /* Unknown, zero works */ 
174
+
175
+		/* Get blob length */
176
+		ntlmv2_blob_size = 0x20 + tib_len; 
177
+
178
+		/* Add challenge from message 2 */
179
+		memcpy(&ntlmv2_response[8], challenge, 8);
180
+
181
+		/* hmac-md5 */
182
+		gen_hmac_md5(&ntlmv2_response[8], ntlmv2_blob_size + 8, ntlmv2_hash, 16, ntlmv2_hmacmd5);
183
+		
184
+		/* Add hmac-md5 result to the blob */
185
+		memcpy(ntlmv2_response, ntlmv2_hmacmd5, 16); /* Note: This overwrites challenge previously written at ntlmv2_response[8..15] */
186
+	
187
+	} else { /* Generate NTLM response */
188
+
189
+		create_des_keys ((unsigned char *)md4_hash, key1);
190
+		des_set_key_unchecked ((des_cblock *)key1, sched1);
191
+		des_ecb_encrypt ((des_cblock *)challenge, (des_cblock *)ntlm_response, sched1, DES_ENCRYPT);
192
+
193
+		create_des_keys ((unsigned char *)&(md4_hash[7]), key2);
194
+		des_set_key_unchecked ((des_cblock *)key2, sched2);
195
+		des_ecb_encrypt ((des_cblock *)challenge, (des_cblock *)&(ntlm_response[8]), sched2, DES_ENCRYPT);
196
+
197
+		create_des_keys ((unsigned char *)&(md4_hash[14]), key3);
198
+		des_set_key_unchecked ((des_cblock *)key3, sched3);
199
+		des_ecb_encrypt ((des_cblock *)challenge, (des_cblock *)&(ntlm_response[16]), sched3, DES_ENCRYPT);
200
+	}
201
+	
202
+	
203
+	memset (phase3, 0, sizeof (phase3)); /* clear reply */
204
+
205
+	strcpy (phase3, "NTLMSSP\0"); /* signature */
206
+	phase3[8] = 3; /* type 3 */
207
+
208
+	if (ntlmv2_enabled){ /* NTLMv2 response */
209
+		add_security_buffer(0x14, ntlmv2_response, ntlmv2_blob_size + 16, phase3, &phase3_bufpos);
210
+	}else{ /* NTLM response */
211
+		add_security_buffer(0x14, ntlm_response, 24, phase3, &phase3_bufpos);
212
+	}
213
+	
214
+	/* username in ascii */
215
+	add_security_buffer(0x24, username, strlen (username), phase3, &phase3_bufpos);
216
+
217
+	/* Set domain. If <domain> is empty, default domain will be used (i.e. proxy's domain) */ 
218
+	add_security_buffer(0x1c, domain, strlen (domain), phase3, &phase3_bufpos);
219
+	
220
+
221
+	/* other security buffers will be empty */
222
+	phase3[0x10] = phase3_bufpos; /* lm not used */
223
+	phase3[0x30] = phase3_bufpos; /* no workstation name supplied */
224
+	phase3[0x38] = phase3_bufpos; /* no session key */
225
+	
226
+	/* flags */
180 227
   phase3[0x3c] = 0x02; /* negotiate oem */
181 228
   phase3[0x3d] = 0x02; /* negotiate ntlm */
182 229
 
183
-  return ((const char *)make_base64_string2 ((unsigned char *)phase3, buflen, gc));
230
+  return ((const char *)make_base64_string2 ((unsigned char *)phase3, phase3_bufpos, gc));
184 231
 }
185 232
 
186 233
 #else
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #ifdef ENABLE_OCC
... ...
@@ -213,6 +213,7 @@ openvpn \- secure IP tunnel daemon.
213 213
 [\ \fB\-\-ping\fR\ \fIn\fR\ ]
214 214
 [\ \fB\-\-pkcs11\-cert\-private\fR\ \fI[0|1]...\fR\ ]
215 215
 [\ \fB\-\-pkcs11\-id\fR\ \fIname\fR\ ]
216
+[\ \fB\-\-pkcs11\-id\-management\fR\ ]
216 217
 [\ \fB\-\-pkcs11\-pin\-cache\fR\ \fIseconds\fR\ ]
217 218
 [\ \fB\-\-pkcs11\-private\-mode\fR\ \fImode...\fR\ ]
218 219
 [\ \fB\-\-pkcs11\-protected\-authentication\fR\ \fI[0|1]...\fR\ ]
... ...
@@ -3691,6 +3692,13 @@ by the standalone
3691 3691
 option.
3692 3692
 .\"*********************************************************
3693 3693
 .TP
3694
+.B --pkcs11-id-management
3695
+Acquire PKCS#11 id from management interface. In this case a NEED-STR 'pkcs11-id-request'
3696
+real-time message will be triggered, application may use pkcs11-id-count command to
3697
+retrieve available number of certificates, and pkcs11-id-get command to retrieve certificate
3698
+id and certificate body.
3699
+.\"*********************************************************
3700
+.TP
3694 3701
 .B --pkcs11-pin-cache seconds
3695 3702
 Specify how many seconds the PIN can be cached, the default is until the token is removed.
3696 3703
 .\"*********************************************************
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "init.h"
... ...
@@ -27,12 +27,6 @@
27 27
  *   (Christof Meerwald, http://cmeerw.org)
28 28
  */
29 29
 
30
-#ifdef WIN32
31
-#include "config-win32.h"
32
-#else
33
-#include "config.h"
34
-#endif
35
-
36 30
 #include "syshead.h"
37 31
 
38 32
 #include "buffer.h"
... ...
@@ -516,10 +510,11 @@ static const char usage_message[] =
516 516
   "                              4       : Use Decrypt.\n"
517 517
   "                              8       : Use Unwrap.\n"
518 518
   "--pkcs11-cert-private [0|1] ... : Set if login should be performed before\n"
519
-  "                              certificate can be accessed. Set for each provider.\n"
520
-  "--pkcs11-pin-cache seconds  : Number of seconds to cache PIN. The default is -1\n"
521
-  "                              cache until token is removed.\n"
522
-  "--pkcs11-id serialized-id   : Identity to use, get using standalone --show-pkcs11-ids\n"
519
+  "                                  certificate can be accessed. Set for each provider.\n"
520
+  "--pkcs11-pin-cache seconds      : Number of seconds to cache PIN. The default is -1\n"
521
+  "                                  cache until token is removed.\n"
522
+  "--pkcs11-id-management          : Acquire identity from management interface.\n"
523
+  "--pkcs11-id serialized-id 'id'  : Identity to use, get using standalone --show-pkcs11-ids\n"
523 524
 #endif			/* ENABLE_PKCS11 */
524 525
  "\n"
525 526
   "SSL Library information:\n"
... ...
@@ -1293,6 +1288,7 @@ show_settings (const struct options *o)
1293 1293
   }
1294 1294
   SHOW_INT (pkcs11_pin_cache_period);
1295 1295
   SHOW_STR (pkcs11_id);
1296
+  SHOW_BOOL (pkcs11_id_management);
1296 1297
 #endif			/* ENABLE_PKCS11 */
1297 1298
 
1298 1299
 #if P2MP
... ...
@@ -1766,8 +1762,11 @@ options_postprocess (struct options *options, bool first_time)
1766 1766
       if (options->pkcs11_providers[0])
1767 1767
        {
1768 1768
         notnull (options->ca_file, "CA file (--ca)");
1769
-	notnull (options->pkcs11_id, "PKCS#11 id (--pkcs11-id)");
1770 1769
 
1770
+	if (options->pkcs11_id_management && options->pkcs11_id != NULL)
1771
+	  msg(M_USAGE, "Parameter --pkcs11-id cannot be used when --pkcs11-id-management is also specified.");
1772
+	if (!options->pkcs11_id_management && options->pkcs11_id == NULL)
1773
+	  msg(M_USAGE, "Parameter --pkcs11-id or --pkcs11-id-management should be specified.");
1771 1774
 	if (options->cert_file)
1772 1775
 	  msg(M_USAGE, "Parameter --cert cannot be used when --pkcs11-provider is also specified.");
1773 1776
 	if (options->priv_key_file)
... ...
@@ -1870,6 +1869,7 @@ options_postprocess (struct options *options, bool first_time)
1870 1870
       MUST_BE_UNDEF (pkcs11_providers[0]);
1871 1871
       MUST_BE_UNDEF (pkcs11_private_mode[0]);
1872 1872
       MUST_BE_UNDEF (pkcs11_id);
1873
+      MUST_BE_UNDEF (pkcs11_id_management);
1873 1874
 #endif
1874 1875
 
1875 1876
       if (pull)
... ...
@@ -5137,6 +5137,11 @@ add_option (struct options *options,
5137 5137
       VERIFY_PERMISSION (OPT_P_GENERAL);
5138 5138
       options->pkcs11_id = p[1];
5139 5139
     }
5140
+  else if (streq (p[0], "pkcs11-id-management"))
5141
+    {
5142
+      VERIFY_PERMISSION (OPT_P_GENERAL);
5143
+      options->pkcs11_id_management = true;
5144
+    }
5140 5145
 #endif
5141 5146
 #ifdef TUNSETPERSIST
5142 5147
   else if (streq (p[0], "rmtun"))
... ...
@@ -419,6 +419,7 @@ struct options
419 419
   bool pkcs11_cert_private[MAX_PARMS];
420 420
   int pkcs11_pin_cache_period;
421 421
   const char *pkcs11_id;
422
+  bool pkcs11_id_management;
422 423
 #endif
423 424
 
424 425
 #ifdef WIN32
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "otime.h"
... ...
@@ -31,16 +31,10 @@
31 31
  * to IPSec.
32 32
  */
33 33
 
34
-#ifdef WIN32
35
-#include "config-win32.h"
36
-#else
37
-#include "config.h"
38
-#endif
34
+#include "syshead.h"
39 35
 
40 36
 #ifdef USE_CRYPTO
41 37
 
42
-#include "syshead.h"
43
-
44 38
 #include "packet_id.h"
45 39
 #include "misc.h"
46 40
 #include "integer.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "perf.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "ping.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#if defined(WIN32)
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if defined(ENABLE_PKCS11)
... ...
@@ -37,6 +31,7 @@
37 37
 #include "basic.h"
38 38
 #include "error.h"
39 39
 #include "manage.h"
40
+#include "base64.h"
40 41
 #include "pkcs11.h"
41 42
 
42 43
 static
... ...
@@ -168,7 +163,7 @@ _pkcs11_openvpn_token_prompt (
168 168
 	const pkcs11h_token_id_t token,
169 169
 	const unsigned retry
170 170
 ) {
171
-	static struct user_pass token_resp;
171
+	struct user_pass token_resp;
172 172
 
173 173
 	(void)global_data;
174 174
 	(void)user_data;
... ...
@@ -211,7 +206,7 @@ _pkcs11_openvpn_pin_prompt (
211 211
 	char * const pin,
212 212
 	const size_t pin_max
213 213
 ) {
214
-	static struct user_pass token_pass;
214
+	struct user_pass token_pass;
215 215
 	char prompt[1024];
216 216
 
217 217
 	(void)global_data;
... ...
@@ -389,8 +384,224 @@ pkcs11_logout() {
389 389
 }
390 390
 
391 391
 int
392
+pkcs11_management_id_count () {
393
+	pkcs11h_certificate_id_list_t id_list = NULL;
394
+	pkcs11h_certificate_id_list_t t = NULL;
395
+	CK_RV rv = CKR_OK;
396
+	int count = 0;
397
+
398
+	dmsg (
399
+		D_PKCS11_DEBUG,
400
+		"PKCS#11: pkcs11_management_id_count - entered"
401
+	);
402
+
403
+	if (
404
+		(rv = pkcs11h_certificate_enumCertificateIds (
405
+			PKCS11H_ENUM_METHOD_CACHE_EXIST,
406
+			NULL,
407
+			PKCS11H_PROMPT_MASK_ALLOW_ALL,
408
+			NULL,
409
+			&id_list
410
+		)) != CKR_OK
411
+	) {
412
+		msg (M_WARN, "PKCS#11: Cannot get certificate list %ld-'%s'", rv, pkcs11h_getMessage (rv));
413
+		goto cleanup;
414
+	}
415
+
416
+	for (count = 0, t = id_list; t != NULL; t = t->next) {
417
+		count++;
418
+	}
419
+
420
+cleanup:
421
+
422
+	if (id_list != NULL) {
423
+		pkcs11h_certificate_freeCertificateIdList (id_list);
424
+		id_list = NULL;
425
+	}
426
+
427
+	dmsg (
428
+		D_PKCS11_DEBUG,
429
+		"PKCS#11: pkcs11_management_id_count - return count=%d",
430
+		count
431
+	);
432
+
433
+	return count;
434
+}
435
+
436
+bool
437
+pkcs11_management_id_get (
438
+	const int index,
439
+	char ** id,
440
+	char **base64
441
+) {
442
+	pkcs11h_certificate_id_list_t id_list = NULL;
443
+	pkcs11h_certificate_id_list_t entry = NULL;
444
+	pkcs11h_certificate_id_t certificate_id = NULL;
445
+	pkcs11h_certificate_t certificate = NULL;
446
+	CK_RV rv = CKR_OK;
447
+	char *certificate_blob = NULL;
448
+	size_t certificate_blob_size = 0;
449
+	size_t max;
450
+	char *internal_id = NULL;
451
+	char *internal_base64 = NULL;
452
+	int count = 0;
453
+	bool success = false;
454
+
455
+	ASSERT (id!=NULL);
456
+	ASSERT (base64!=NULL);
457
+
458
+	dmsg (
459
+		D_PKCS11_DEBUG,
460
+		"PKCS#11: pkcs11_management_id_get - entered index=%d",
461
+		index
462
+	);
463
+
464
+	*id = NULL;
465
+	*base64 = NULL;
466
+
467
+	if (
468
+		(rv = pkcs11h_certificate_enumCertificateIds (
469
+			PKCS11H_ENUM_METHOD_CACHE_EXIST,
470
+			NULL,
471
+			PKCS11H_PROMPT_MASK_ALLOW_ALL,
472
+			NULL,
473
+			&id_list
474
+		)) != CKR_OK
475
+	) {
476
+		msg (M_WARN, "PKCS#11: Cannot get certificate list %ld-'%s'", rv, pkcs11h_getMessage (rv));
477
+		goto cleanup;
478
+	}
479
+
480
+	entry = id_list;
481
+	count = 0;
482
+	while (entry != NULL && count != index) {
483
+		count++;
484
+		entry = entry->next;
485
+	}
486
+
487
+	if (entry == NULL) {
488
+		dmsg (
489
+			D_PKCS11_DEBUG,
490
+			"PKCS#11: pkcs11_management_id_get - no certificate at index=%d",
491
+			index
492
+		);
493
+		goto cleanup;
494
+	}
495
+
496
+	if (
497
+		(rv = pkcs11h_certificate_serializeCertificateId (
498
+			NULL,
499
+			&max,
500
+			entry->certificate_id
501
+		)) != CKR_OK
502
+	) {
503
+		msg (M_WARN, "PKCS#11: Cannot serialize certificate id %ld-'%s'", rv, pkcs11h_getMessage (rv));
504
+		goto cleanup;
505
+	}
506
+
507
+	if ((internal_id = (char *)malloc (max)) == NULL) {
508
+		msg (M_FATAL, "PKCS#11: Cannot allocate memory");
509
+		goto cleanup;
510
+	}
511
+
512
+	if (
513
+		(rv = pkcs11h_certificate_serializeCertificateId (
514
+			internal_id,
515
+			&max,
516
+			entry->certificate_id
517
+		)) != CKR_OK
518
+	) {
519
+		msg (M_WARN, "PKCS#11: Cannot serialize certificate id %ld-'%s'", rv, pkcs11h_getMessage (rv));
520
+		goto cleanup;
521
+	}
522
+
523
+	if (
524
+		(rv = pkcs11h_certificate_create (
525
+			entry->certificate_id,
526
+			NULL,
527
+			PKCS11H_PROMPT_MASK_ALLOW_ALL,
528
+			PKCS11H_PIN_CACHE_INFINITE,
529
+			&certificate
530
+		)) != CKR_OK
531
+	) {
532
+		msg (M_WARN, "PKCS#11: Cannot get certificate %ld-'%s'", rv, pkcs11h_getMessage (rv));
533
+		goto cleanup;
534
+	}
535
+
536
+	if (
537
+		(rv = pkcs11h_certificate_getCertificateBlob (
538
+			certificate,
539
+			NULL,
540
+			&certificate_blob_size
541
+		)) != CKR_OK
542
+	) {
543
+		msg (M_WARN, "PKCS#11: Cannot get certificate blob %ld-'%s'", rv, pkcs11h_getMessage (rv));
544
+		goto cleanup;
545
+	}
546
+
547
+	if ((certificate_blob = (char *)malloc (certificate_blob_size)) == NULL) {
548
+		msg (M_FATAL, "PKCS#11: Cannot allocate memory");
549
+		goto cleanup;
550
+	}
551
+
552
+	if (
553
+		(rv = pkcs11h_certificate_getCertificateBlob (
554
+			certificate,
555
+			certificate_blob,
556
+			&certificate_blob_size
557
+		)) != CKR_OK
558
+	) {
559
+		msg (M_WARN, "PKCS#11: Cannot get certificate blob %ld-'%s'", rv, pkcs11h_getMessage (rv));
560
+		goto cleanup;
561
+	}
562
+
563
+	if (base64_encode (certificate_blob, certificate_blob_size, &internal_base64) == -1) {
564
+		msg (M_WARN, "PKCS#11: Cannot encode certificate");
565
+		goto cleanup;
566
+	}
567
+
568
+	*id = internal_id;
569
+	internal_id = NULL;
570
+	*base64 = internal_base64;
571
+	internal_base64 = NULL;
572
+	success = true;
573
+	
574
+cleanup:
575
+
576
+	if (id_list != NULL) {
577
+		pkcs11h_certificate_freeCertificateIdList (id_list);
578
+		id_list = NULL;
579
+	}
580
+
581
+	if (internal_id != NULL) {
582
+		free (internal_id);
583
+		internal_id = NULL;
584
+	}
585
+
586
+	if (internal_base64 != NULL) {
587
+		free (internal_base64);
588
+		internal_base64 = NULL;
589
+	}
590
+
591
+	if (certificate_blob != NULL) {
592
+		free (certificate_blob);
593
+		certificate_blob = NULL;
594
+	}
595
+
596
+	dmsg (
597
+		D_PKCS11_DEBUG,
598
+		"PKCS#11: pkcs11_management_id_get - return success=%d, id='%s'",
599
+		success ? 1 : 0,
600
+		*id
601
+	);
602
+
603
+	return success;
604
+}
605
+
606
+int
392 607
 SSL_CTX_use_pkcs11 (
393 608
 	SSL_CTX * const ssl_ctx,
609
+	bool pkcs11_id_management,
394 610
 	const char * const pkcs11_id
395 611
 ) {
396 612
 	X509 *x509 = NULL;
... ...
@@ -403,23 +614,60 @@ SSL_CTX_use_pkcs11 (
403 403
 	bool ok = false;
404 404
 
405 405
 	ASSERT (ssl_ctx!=NULL);
406
-	ASSERT (pkcs11_id!=NULL);
406
+	ASSERT (pkcs11_id_management || pkcs11_id!=NULL);
407 407
 
408 408
 	dmsg (
409 409
 		D_PKCS11_DEBUG,
410
-		"PKCS#11: SSL_CTX_use_pkcs11 - entered - ssl_ctx=%p, pkcs11_id='%s'",
410
+		"PKCS#11: SSL_CTX_use_pkcs11 - entered - ssl_ctx=%p, pkcs11_id_management=%d, pkcs11_id='%s'",
411 411
 		(void *)ssl_ctx,
412
+		pkcs11_id_management ? 1 : 0,
412 413
 		pkcs11_id
413 414
 	);
414 415
 
415
-	if (
416
-		(rv = pkcs11h_certificate_deserializeCertificateId (
417
-			&certificate_id,
418
-			pkcs11_id
419
-		)) != CKR_OK
420
-	) {
421
-		msg (M_WARN, "PKCS#11: Cannot deserialize id %ld-'%s'", rv, pkcs11h_getMessage (rv));
422
-		goto cleanup;
416
+	if (pkcs11_id_management) {
417
+		struct user_pass id_resp;
418
+
419
+		CLEAR (id_resp);
420
+
421
+		id_resp.defined = false;
422
+		id_resp.nocache = true;
423
+		openvpn_snprintf (
424
+			id_resp.username,
425
+			sizeof (id_resp.username),
426
+			"Please specify PKCS#11 id to use"
427
+		);
428
+
429
+		if (
430
+			!get_user_pass (
431
+				&id_resp,
432
+				NULL,
433
+				"pkcs11-id-request",
434
+				GET_USER_PASS_MANAGEMENT|GET_USER_PASS_NEED_STR|GET_USER_PASS_NOFATAL
435
+			)
436
+		) {
437
+			goto cleanup;
438
+		}
439
+
440
+		if (
441
+			(rv = pkcs11h_certificate_deserializeCertificateId (
442
+				&certificate_id,
443
+				id_resp.password
444
+			)) != CKR_OK
445
+		) {
446
+			msg (M_WARN, "PKCS#11: Cannot deserialize id %ld-'%s'", rv, pkcs11h_getMessage (rv));
447
+			goto cleanup;
448
+		}
449
+	}
450
+	else {
451
+		if (
452
+			(rv = pkcs11h_certificate_deserializeCertificateId (
453
+				&certificate_id,
454
+				pkcs11_id
455
+			)) != CKR_OK
456
+		) {
457
+			msg (M_WARN, "PKCS#11: Cannot deserialize id %ld-'%s'", rv, pkcs11h_getMessage (rv));
458
+			goto cleanup;
459
+		}
423 460
 	}
424 461
 
425 462
 	if (
... ...
@@ -53,8 +53,19 @@ int
53 53
 pkcs11_logout();
54 54
 
55 55
 int
56
+pkcs11_management_id_count ();
57
+
58
+bool
59
+pkcs11_management_id_get (
60
+	const int index,
61
+	char ** id,
62
+	char **base64
63
+);
64
+
65
+int
56 66
 SSL_CTX_use_pkcs11 (
57 67
 	SSL_CTX * const ssl_ctx,
68
+	bool pkcs11_id_management,
58 69
 	const char * const pkcs11_id
59 70
 );
60 71
 
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #ifdef ENABLE_PLUGIN
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "pool.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "proto.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "common.h"
... ...
@@ -294,19 +288,21 @@ new_http_proxy (const struct http_proxy_options *o,
294 294
 	p->auth_method = HTTP_AUTH_BASIC;
295 295
       else if (!strcmp (o->auth_method_string, "ntlm"))
296 296
 	p->auth_method = HTTP_AUTH_NTLM;
297
+      else if (!strcmp (o->auth_method_string, "ntlm2"))
298
+	p->auth_method = HTTP_AUTH_NTLM2;
297 299
       else
298
-	msg (M_FATAL, "ERROR: unknown HTTP authentication method: '%s' -- only the 'none', 'basic', or 'ntlm' methods are currently supported",
300
+	msg (M_FATAL, "ERROR: unknown HTTP authentication method: '%s' -- only the 'none', 'basic', 'ntlm', or 'ntlm2' methods are currently supported",
299 301
 	     o->auth_method_string);
300 302
     }
301 303
 
302
-  /* only basic and NTLM authentication supported so far */
303
-  if (p->auth_method == HTTP_AUTH_BASIC || p->auth_method == HTTP_AUTH_NTLM)
304
+  /* only basic and NTLM/NTLMv2 authentication supported so far */
305
+  if (p->auth_method == HTTP_AUTH_BASIC || p->auth_method == HTTP_AUTH_NTLM || p->auth_method == HTTP_AUTH_NTLM2)
304 306
     {
305 307
       get_user_pass_http (p, true);
306 308
     }
307 309
 
308 310
 #if !NTLM
309
-  if (p->auth_method == HTTP_AUTH_NTLM)
311
+  if (p->auth_method == HTTP_AUTH_NTLM || p->auth_method == HTTP_AUTH_NTLM2)
310 312
     msg (M_FATAL, "Sorry, this version of " PACKAGE_NAME " was built without NTLM Proxy support.");
311 313
 #endif
312 314
 
... ...
@@ -374,6 +370,12 @@ establish_http_proxy_passthru (struct http_proxy_info *p,
374 374
 
375 375
 #if NTLM
376 376
     case HTTP_AUTH_NTLM:
377
+    case HTTP_AUTH_NTLM2:
378
+      /* keep-alive connection */
379
+      openvpn_snprintf (buf, sizeof(buf), "Proxy-Connection: Keep-Alive");
380
+      if (!send_line_crlf (sd, buf))
381
+	goto error;
382
+
377 383
       openvpn_snprintf (buf, sizeof(buf), "Proxy-Authorization: NTLM %s",
378 384
 			ntlm_phase_1 (p, &gc));
379 385
       msg (D_PROXY, "Attempting NTLM Proxy-Authorization phase 1");
... ...
@@ -411,7 +413,7 @@ establish_http_proxy_passthru (struct http_proxy_info *p,
411 411
       msg (D_PROXY, "Proxy requires authentication");
412 412
 
413 413
       /* check for NTLM */
414
-      if (p->auth_method == HTTP_AUTH_NTLM)
414
+      if (p->auth_method == HTTP_AUTH_NTLM || p->auth_method == HTTP_AUTH_NTLM2)
415 415
         {
416 416
 #if NTLM
417 417
           /* look for the phase 2 response */
... ...
@@ -456,6 +458,12 @@ establish_http_proxy_passthru (struct http_proxy_info *p,
456 456
           if (!send_line_crlf (sd, buf))
457 457
             goto error;
458 458
 
459
+          /* keep-alive connection */
460
+          openvpn_snprintf (buf, sizeof(buf), "Proxy-Connection: Keep-Alive");
461
+          if (!send_line_crlf (sd, buf))
462
+            goto error;
463
+
464
+          
459 465
           /* send HOST etc, */
460 466
           openvpn_sleep (1);
461 467
           openvpn_snprintf (buf, sizeof(buf), "Host: %s", host);
... ...
@@ -59,6 +59,7 @@ void show_win_proxy_settings (const int msglevel);
59 59
 #define HTTP_AUTH_BASIC 1
60 60
 #define HTTP_AUTH_NTLM  2
61 61
 #define HTTP_AUTH_N     3
62
+#define HTTP_AUTH_NTLM2 4
62 63
 
63 64
 struct http_proxy_options {
64 65
   const char *server;
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if PORT_SHARE
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "push.h"
... ...
@@ -27,16 +27,10 @@
27 27
  * so that SSL/TLS can be run over UDP.
28 28
  */
29 29
 
30
-#ifdef WIN32
31
-#include "config-win32.h"
32
-#else
33
-#include "config.h"
34
-#endif
30
+#include "syshead.h"
35 31
 
36 32
 #if defined(USE_CRYPTO) && defined(USE_SSL)
37 33
 
38
-#include "syshead.h"
39
-
40 34
 #include "buffer.h"
41 35
 #include "error.h"
42 36
 #include "common.h"
... ...
@@ -26,12 +26,6 @@
26 26
  * Support routines for adding/deleting network routes.
27 27
  */
28 28
 
29
-#ifdef WIN32
30
-#include "config-win32.h"
31
-#else
32
-#include "config.h"
33
-#endif
34
-
35 29
 #include "syshead.h"
36 30
 
37 31
 #include "common.h"
... ...
@@ -871,6 +865,23 @@ add_route (struct route *r, const struct tuntap *tt, unsigned int flags, const s
871 871
   msg (D_ROUTE, "%s", BSTR (&buf));
872 872
   status = system_check (BSTR (&buf), es, 0, "ERROR: FreeBSD route add command failed");
873 873
 
874
+#elif defined(TARGET_DRAGONFLY)
875
+
876
+  buf_printf (&buf, ROUTE_PATH " add");
877
+
878
+#if 0
879
+  if (r->metric_defined)
880
+    buf_printf (&buf, " -rtt %d", r->metric);
881
+#endif
882
+
883
+  buf_printf (&buf, " -net %s %s %s",
884
+	      network,
885
+	      gateway,
886
+	      netmask);
887
+
888
+  msg (D_ROUTE, "%s", BSTR (&buf));
889
+  status = system_check (BSTR (&buf), es, 0, "ERROR: DragonFly route add command failed");
890
+
874 891
 #elif defined(TARGET_DARWIN)
875 892
 
876 893
   buf_printf (&buf, ROUTE_PATH " add");
... ...
@@ -1007,6 +1018,16 @@ delete_route (const struct route *r, const struct tuntap *tt, unsigned int flags
1007 1007
   msg (D_ROUTE, "%s", BSTR (&buf));
1008 1008
   system_check (BSTR (&buf), es, 0, "ERROR: FreeBSD route delete command failed");
1009 1009
 
1010
+#elif defined(TARGET_DRAGONFLY)
1011
+
1012
+  buf_printf (&buf, ROUTE_PATH " delete -net %s %s %s",
1013
+	      network,
1014
+	      gateway,
1015
+	      netmask);
1016
+
1017
+  msg (D_ROUTE, "%s", BSTR (&buf));
1018
+  system_check (BSTR (&buf), es, 0, "ERROR: DragonFly route delete command failed");
1019
+
1010 1020
 #elif defined(TARGET_DARWIN)
1011 1021
 
1012 1022
   buf_printf (&buf, ROUTE_PATH " delete -net %s %s %s",
... ...
@@ -1462,7 +1483,7 @@ get_default_gateway (in_addr_t *gateway)
1462 1462
   return ret;
1463 1463
 }
1464 1464
 
1465
-#elif defined(TARGET_FREEBSD)
1465
+#elif defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY)
1466 1466
 
1467 1467
 #include <sys/types.h>
1468 1468
 #include <sys/socket.h>
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #if P2MP_SERVER
34 28
new file mode 100644
... ...
@@ -0,0 +1,8 @@
0
+*.exe
1
+*.obj
2
+*.o
3
+.deps
4
+Makefile.in
5
+Makefile
6
+service.h
7
+service.c
0 8
deleted file mode 100755
... ...
@@ -1,25 +0,0 @@
1
-# This makefile builds the OpenVPN win32 service
2
-# wrapper using the mingw environment.
3
-#
4
-# service.c and service.h should be generated by
5
-# applying service.patch to the Platform
6
-# SDK service sample.
7
-
8
-EXE = ${PRODUCT_UNIX_NAME}serv.exe
9
-
10
-HEADERS = service.h
11
-
12
-OBJS =	openvpnserv.o service.o
13
-
14
-INCLUDE_DIRS =
15
-
16
-CC = gcc -g -O2 -Wall -Wno-unused-function -Wno-unused-variable -mno-cygwin
17
-
18
-all : ${OBJS}
19
-	${CC} -o ${EXE} ${OBJS}
20
-
21
-clean :
22
-	rm -f ${OBJS} ${EXE}
23
-
24
-%.o : %.c ${HEADERS}
25
-	${CC} ${INCLUDE_DIRS} -c $< -o $@
26 1
new file mode 100644
... ...
@@ -0,0 +1,41 @@
0
+#
1
+#  OpenVPN -- An application to securely tunnel IP networks
2
+#             over a single UDP port, with support for SSL/TLS-based
3
+#             session authentication and key exchange,
4
+#             packet encryption, packet authentication, and
5
+#             packet compression.
6
+#
7
+#  Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net>
8
+#
9
+#  This program is free software; you can redistribute it and/or modify
10
+#  it under the terms of the GNU General Public License version 2
11
+#  as published by the Free Software Foundation.
12
+#
13
+#  This program is distributed in the hope that it will be useful,
14
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+#  GNU General Public License for more details.
17
+#
18
+#  You should have received a copy of the GNU General Public License
19
+#  along with this program (see the file COPYING included with this
20
+#  distribution); if not, write to the Free Software Foundation, Inc.,
21
+#  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
+#
23
+
24
+MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
25
+
26
+if WIN32
27
+
28
+sbin_PROGRAMS = openvpnserv
29
+
30
+openvpnserv_SOURCES = \
31
+	openvpnserv.c \
32
+	service.h service.c
33
+
34
+else
35
+
36
+dist_noinst_DATA = \
37
+	openvpnserv.c \
38
+	service.h service.c
39
+
40
+endif
0 41
deleted file mode 100755
... ...
@@ -1,4 +0,0 @@
1
-# build service.[ch] patch against original
2
-# SDK sample
3
-diff -ub service.c.orig service.c | u2d >service.patch
4
-diff -ub service.h.orig service.h | u2d >>service.patch
... ...
@@ -33,6 +33,11 @@
33 33
  * This code is designed to be built with the mingw compiler.
34 34
  */
35 35
 
36
+#ifdef _MSC_VER
37
+#include "config-win32.h"
38
+#else
39
+#include "config.h"
40
+#endif
36 41
 #include <windows.h>
37 42
 #include <stdlib.h>
38 43
 #include <stdio.h>
... ...
@@ -65,13 +70,13 @@ struct security_attributes
65 65
  * Control Manager which will cause an asynchronous call
66 66
  * of ServiceStop below.
67 67
  */
68
-#define EXIT_EVENT_NAME PRODUCT_UNIX_NAME "_exit_1"
68
+#define EXIT_EVENT_NAME PACKAGE "_exit_1"
69 69
 
70 70
 /*
71 71
  * Which registry key in HKLM should
72 72
  * we get config info from?
73 73
  */
74
-#define REG_KEY "SOFTWARE\\" PRODUCT_NAME
74
+#define REG_KEY "SOFTWARE\\" PACKAGE_NAME
75 75
 
76 76
 static HANDLE exit_event = NULL;
77 77
 
... ...
@@ -398,7 +403,7 @@ VOID ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
398 398
 	  mysnprintf (log_path, "%s\\%s", log_dir, log_file);
399 399
 
400 400
 	  /* construct command line */
401
-	  mysnprintf (command_line, PRODUCT_UNIX_NAME " --service %s 1 --config \"%s\"",
401
+	  mysnprintf (command_line, PACKAGE " --service %s 1 --config \"%s\"",
402 402
 		      EXIT_EVENT_NAME,
403 403
 		      find_obj.cFileName);
404 404
 
... ...
@@ -406,7 +411,7 @@ VOID ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
406 406
 	     be inherited. */
407 407
 	  if (!init_security_attributes_allow_all (&sa))
408 408
 	    {
409
-	      MSG (M_SYSERR, "InitializeSecurityDescriptor start_" PRODUCT_UNIX_NAME " failed");
409
+	      MSG (M_SYSERR, "InitializeSecurityDescriptor start_" PACKAGE " failed");
410 410
 	      goto finish;
411 411
 	    }
412 412
 
413 413
new file mode 100644
... ...
@@ -0,0 +1,693 @@
0
+/*---------------------------------------------------------------------------
1
+THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
2
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
3
+TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
4
+PARTICULAR PURPOSE.
5
+
6
+Copyright (C) 1993 - 2000.  Microsoft Corporation.  All rights reserved.
7
+
8
+MODULE:   service.c
9
+
10
+PURPOSE:  Implements functions required by all Windows NT services
11
+
12
+FUNCTIONS:
13
+  main(int argc, char **argv);
14
+  service_ctrl(DWORD dwCtrlCode);
15
+  service_main(DWORD dwArgc, LPTSTR *lpszArgv);
16
+  CmdInstallService();
17
+  CmdRemoveService();
18
+  CmdStartService();
19
+  CmdDebugService(int argc, char **argv);
20
+  ControlHandler ( DWORD dwCtrlType );
21
+  GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize );
22
+
23
+---------------------------------------------------------------------------*/
24
+
25
+#include <windows.h>
26
+#include <stdio.h>
27
+#include <stdlib.h>
28
+#include <process.h>
29
+#include <tchar.h>
30
+
31
+#include "service.h"
32
+
33
+// internal variables
34
+SERVICE_STATUS          ssStatus;       // current status of the service
35
+SERVICE_STATUS_HANDLE   sshStatusHandle;
36
+DWORD                   dwErr = 0;
37
+BOOL                    bDebug = FALSE;
38
+TCHAR                   szErr[256];
39
+
40
+// internal function prototypes
41
+VOID WINAPI service_ctrl(DWORD dwCtrlCode);
42
+VOID WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv);
43
+int CmdInstallService();
44
+int CmdRemoveService();
45
+int CmdStartService();
46
+VOID CmdDebugService(int argc, char **argv);
47
+BOOL WINAPI ControlHandler ( DWORD dwCtrlType );
48
+LPTSTR GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize );
49
+
50
+//
51
+//  FUNCTION: main
52
+//
53
+//  PURPOSE: entrypoint for service
54
+//
55
+//  PARAMETERS:
56
+//    argc - number of command line arguments
57
+//    argv - array of command line arguments
58
+//
59
+//  RETURN VALUE:
60
+//    none
61
+//
62
+//  COMMENTS:
63
+//    main() either performs the command line task, or
64
+//    call StartServiceCtrlDispatcher to register the
65
+//    main service thread.  When the this call returns,
66
+//    the service has stopped, so exit.
67
+//
68
+int __cdecl main(int argc, char **argv)
69
+{
70
+   SERVICE_TABLE_ENTRY dispatchTable[] =
71
+   {
72
+      { TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main},
73
+      { NULL, NULL}
74
+   };
75
+
76
+   if ( (argc > 1) &&
77
+        ((*argv[1] == '-') || (*argv[1] == '/')) )
78
+   {
79
+      if ( _stricmp( "install", argv[1]+1 ) == 0 )
80
+      {
81
+         return CmdInstallService();
82
+      }
83
+      else if ( _stricmp( "remove", argv[1]+1 ) == 0 )
84
+      {
85
+         return CmdRemoveService();
86
+      }
87
+	  else if ( _stricmp( "start", argv[1]+1 ) == 0)
88
+	  {
89
+		  return CmdStartService();
90
+      }
91
+      else if ( _stricmp( "debug", argv[1]+1 ) == 0 )
92
+      {
93
+         bDebug = TRUE;
94
+         CmdDebugService(argc, argv);
95
+      }
96
+      else
97
+      {
98
+         goto dispatch;
99
+      }
100
+      return 0;
101
+   }
102
+
103
+   // if it doesn't match any of the above parameters
104
+   // the service control manager may be starting the service
105
+   // so we must call StartServiceCtrlDispatcher
106
+   dispatch:
107
+   // this is just to be friendly
108
+   printf( "%s -install          to install the service\n", SZAPPNAME );
109
+   printf( "%s -start			 to start the service\n", SZAPPNAME );
110
+   printf( "%s -remove           to remove the service\n", SZAPPNAME );
111
+   printf( "%s -debug <params>   to run as a console app for debugging\n", SZAPPNAME );
112
+   printf( "\nStartServiceCtrlDispatcher being called.\n" );
113
+   printf( "This may take several seconds.  Please wait.\n" );
114
+
115
+   if (!StartServiceCtrlDispatcher(dispatchTable))
116
+      AddToMessageLog(MSG_FLAGS_ERROR, TEXT("StartServiceCtrlDispatcher failed."));
117
+
118
+   return 0;
119
+}
120
+
121
+
122
+
123
+//
124
+//  FUNCTION: service_main
125
+//
126
+//  PURPOSE: To perform actual initialization of the service
127
+//
128
+//  PARAMETERS:
129
+//    dwArgc   - number of command line arguments
130
+//    lpszArgv - array of command line arguments
131
+//
132
+//  RETURN VALUE:
133
+//    none
134
+//
135
+//  COMMENTS:
136
+//    This routine performs the service initialization and then calls
137
+//    the user defined ServiceStart() routine to perform majority
138
+//    of the work.
139
+//
140
+void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv)
141
+{
142
+
143
+   // register our service control handler:
144
+   //
145
+   sshStatusHandle = RegisterServiceCtrlHandler( TEXT(SZSERVICENAME), service_ctrl);
146
+
147
+   if (!sshStatusHandle)
148
+      goto cleanup;
149
+
150
+   // SERVICE_STATUS members that don't change in example
151
+   //
152
+   ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
153
+   ssStatus.dwServiceSpecificExitCode = 0;
154
+
155
+
156
+   // report the status to the service control manager.
157
+   //
158
+   if (!ReportStatusToSCMgr(
159
+                           SERVICE_START_PENDING, // service state
160
+                           NO_ERROR,              // exit code
161
+                           3000))                 // wait hint
162
+      goto cleanup;
163
+
164
+
165
+   ServiceStart( dwArgc, lpszArgv );
166
+
167
+   cleanup:
168
+
169
+   // try to report the stopped status to the service control manager.
170
+   //
171
+   if (sshStatusHandle)
172
+      (VOID)ReportStatusToSCMgr(
173
+                               SERVICE_STOPPED,
174
+                               dwErr,
175
+                               0);
176
+
177
+   return;
178
+}
179
+
180
+
181
+
182
+//
183
+//  FUNCTION: service_ctrl
184
+//
185
+//  PURPOSE: This function is called by the SCM whenever
186
+//           ControlService() is called on this service.
187
+//
188
+//  PARAMETERS:
189
+//    dwCtrlCode - type of control requested
190
+//
191
+//  RETURN VALUE:
192
+//    none
193
+//
194
+//  COMMENTS:
195
+//
196
+VOID WINAPI service_ctrl(DWORD dwCtrlCode)
197
+{
198
+   // Handle the requested control code.
199
+   //
200
+   switch (dwCtrlCode)
201
+   {
202
+   // Stop the service.
203
+   //
204
+   // SERVICE_STOP_PENDING should be reported before
205
+   // setting the Stop Event - hServerStopEvent - in
206
+   // ServiceStop().  This avoids a race condition
207
+   // which may result in a 1053 - The Service did not respond...
208
+   // error.
209
+   case SERVICE_CONTROL_STOP:
210
+      ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
211
+      ServiceStop();
212
+      return;
213
+
214
+      // Update the service status.
215
+      //
216
+   case SERVICE_CONTROL_INTERROGATE:
217
+      break;
218
+
219
+      // invalid control code
220
+      //
221
+   default:
222
+      break;
223
+
224
+   }
225
+
226
+   ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
227
+}
228
+
229
+
230
+
231
+//
232
+//  FUNCTION: ReportStatusToSCMgr()
233
+//
234
+//  PURPOSE: Sets the current status of the service and
235
+//           reports it to the Service Control Manager
236
+//
237
+//  PARAMETERS:
238
+//    dwCurrentState - the state of the service
239
+//    dwWin32ExitCode - error code to report
240
+//    dwWaitHint - worst case estimate to next checkpoint
241
+//
242
+//  RETURN VALUE:
243
+//    TRUE  - success
244
+//    FALSE - failure
245
+//
246
+//  COMMENTS:
247
+//
248
+BOOL ReportStatusToSCMgr(DWORD dwCurrentState,
249
+                         DWORD dwWin32ExitCode,
250
+                         DWORD dwWaitHint)
251
+{
252
+   static DWORD dwCheckPoint = 1;
253
+   BOOL fResult = TRUE;
254
+
255
+
256
+   if ( !bDebug ) // when debugging we don't report to the SCM
257
+   {
258
+      if (dwCurrentState == SERVICE_START_PENDING)
259
+         ssStatus.dwControlsAccepted = 0;
260
+      else
261
+         ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
262
+
263
+      ssStatus.dwCurrentState = dwCurrentState;
264
+      ssStatus.dwWin32ExitCode = dwWin32ExitCode;
265
+      ssStatus.dwWaitHint = dwWaitHint;
266
+
267
+      if ( ( dwCurrentState == SERVICE_RUNNING ) ||
268
+           ( dwCurrentState == SERVICE_STOPPED ) )
269
+         ssStatus.dwCheckPoint = 0;
270
+      else
271
+         ssStatus.dwCheckPoint = dwCheckPoint++;
272
+
273
+
274
+      // Report the status of the service to the service control manager.
275
+      //
276
+      if (!(fResult = SetServiceStatus( sshStatusHandle, &ssStatus)))
277
+      {
278
+         AddToMessageLog(MSG_FLAGS_ERROR, TEXT("SetServiceStatus"));
279
+      }
280
+   }
281
+   return fResult;
282
+}
283
+
284
+
285
+
286
+//
287
+//  FUNCTION: AddToMessageLog(LPTSTR lpszMsg)
288
+//
289
+//  PURPOSE: Allows any thread to log an error message
290
+//
291
+//  PARAMETERS:
292
+//    lpszMsg - text for message
293
+//
294
+//  RETURN VALUE:
295
+//    none
296
+//
297
+//  COMMENTS:
298
+//
299
+void AddToMessageLog(DWORD flags, LPTSTR lpszMsg)
300
+{
301
+   TCHAR szMsg [(sizeof(SZSERVICENAME) / sizeof(TCHAR)) + 100 ];
302
+   HANDLE  hEventSource;
303
+   LPCSTR  lpszStrings[2];
304
+
305
+   if ( !bDebug )
306
+   {
307
+     if (flags & MSG_FLAGS_SYS_CODE)
308
+      dwErr = GetLastError();
309
+     else
310
+       dwErr = 0;
311
+
312
+      // Use event logging to log the error.
313
+      //
314
+      hEventSource = RegisterEventSource(NULL, TEXT(SZSERVICENAME));
315
+
316
+      _stprintf(szMsg, TEXT("%s error: %d"), TEXT(SZSERVICENAME), (int)dwErr);
317
+      lpszStrings[0] = szMsg;
318
+      lpszStrings[1] = lpszMsg;
319
+
320
+      if (hEventSource != NULL)
321
+      {
322
+         ReportEvent(hEventSource, // handle of event source
323
+		     // event type
324
+                     (flags & MSG_FLAGS_ERROR)
325
+		       ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE,
326
+                     0,                    // event category
327
+                     0,                    // event ID
328
+                     NULL,                 // current user's SID
329
+                     2,                    // strings in lpszStrings
330
+                     0,                    // no bytes of raw data
331
+                     lpszStrings,          // array of error strings
332
+                     NULL);                // no raw data
333
+
334
+         (VOID) DeregisterEventSource(hEventSource);
335
+      }
336
+   }
337
+}
338
+
339
+void ResetError (void)
340
+{
341
+  dwErr = 0;
342
+}
343
+
344
+///////////////////////////////////////////////////////////////////
345
+//
346
+//  The following code handles service installation and removal
347
+//
348
+
349
+
350
+//
351
+//  FUNCTION: CmdInstallService()
352
+//
353
+//  PURPOSE: Installs the service
354
+//
355
+//  PARAMETERS:
356
+//    none
357
+//
358
+//  RETURN VALUE:
359
+//    0 if success
360
+//
361
+//  COMMENTS:
362
+//
363
+int CmdInstallService()
364
+{
365
+   SC_HANDLE   schService;
366
+   SC_HANDLE   schSCManager;
367
+
368
+   TCHAR szPath[512];
369
+
370
+   int ret = 0;
371
+
372
+   if ( GetModuleFileName( NULL, szPath, 512 ) == 0 )
373
+   {
374
+      _tprintf(TEXT("Unable to install %s - %s\n"), TEXT(SZSERVICEDISPLAYNAME), GetLastErrorText(szErr, 256));
375
+      return 1;
376
+   }
377
+
378
+   schSCManager = OpenSCManager(
379
+                               NULL,                   // machine (NULL == local)
380
+                               NULL,                   // database (NULL == default)
381
+                               SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE  // access required
382
+                               );
383
+   if ( schSCManager )
384
+   {
385
+      schService = CreateService(
386
+                                schSCManager,               // SCManager database
387
+                                TEXT(SZSERVICENAME),        // name of service
388
+                                TEXT(SZSERVICEDISPLAYNAME), // name to display
389
+                                SERVICE_QUERY_STATUS,         // desired access
390
+                                SERVICE_WIN32_OWN_PROCESS,  // service type
391
+				SERVICE_DEMAND_START,        // start type -- alternative: SERVICE_AUTO_START
392
+                                SERVICE_ERROR_NORMAL,       // error control type
393
+                                szPath,                     // service's binary
394
+                                NULL,                       // no load ordering group
395
+                                NULL,                       // no tag identifier
396
+                                TEXT(SZDEPENDENCIES),       // dependencies
397
+                                NULL,                       // LocalSystem account
398
+                                NULL);                      // no password
399
+
400
+      if ( schService )
401
+      {
402
+         _tprintf(TEXT("%s installed.\n"), TEXT(SZSERVICEDISPLAYNAME) );
403
+         CloseServiceHandle(schService);
404
+      }
405
+      else
406
+      {
407
+         _tprintf(TEXT("CreateService failed - %s\n"), GetLastErrorText(szErr, 256));
408
+	 ret = 1;
409
+      }
410
+
411
+      CloseServiceHandle(schSCManager);
412
+   }
413
+   else
414
+     {
415
+      _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
416
+       ret = 1;
417
+     }
418
+   return ret;
419
+}
420
+
421
+//
422
+//  FUNCTION: CmdStartService()
423
+//
424
+//  PURPOSE: Start the service
425
+//
426
+//  PARAMETERS:
427
+//    none
428
+//
429
+//  RETURN VALUE:
430
+//    0 if success
431
+//
432
+//  COMMENTS:
433
+
434
+int CmdStartService()
435
+{
436
+  int ret = 0;
437
+
438
+  SC_HANDLE schSCManager;
439
+  SC_HANDLE schService;
440
+
441
+
442
+    // Open a handle to the SC Manager database. 
443
+    schSCManager = OpenSCManager( 
444
+       NULL,                    // local machine 
445
+       NULL,                    // ServicesActive database 
446
+       SC_MANAGER_ALL_ACCESS);  // full access rights 
447
+   
448
+    if (NULL == schSCManager) {
449
+       _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
450
+       ret = 1;
451
+    }
452
+
453
+    schService = OpenService( 
454
+        schSCManager,          // SCM database 
455
+        SZSERVICENAME,         // service name
456
+        SERVICE_ALL_ACCESS); 
457
+
458
+    if (schService == NULL) {
459
+      _tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(szErr,256));
460
+       ret = 1;
461
+    }
462
+ 
463
+    if (!StartService(
464
+            schService,  // handle to service 
465
+            0,           // number of arguments 
466
+            NULL) )      // no arguments 
467
+    {
468
+      _tprintf(TEXT("StartService failed - %s\n"), GetLastErrorText(szErr,256));
469
+       ret = 1;
470
+    }
471
+    else
472
+	{
473
+		_tprintf(TEXT("Service Started\n"));
474
+       ret = 0;
475
+	}
476
+    CloseServiceHandle(schService); 
477
+    CloseServiceHandle(schSCManager);
478
+    return ret;
479
+}
480
+
481
+//
482
+//  FUNCTION: CmdRemoveService()
483
+//
484
+//  PURPOSE: Stops and removes the service
485
+//
486
+//  PARAMETERS:
487
+//    none
488
+//
489
+//  RETURN VALUE:
490
+//    0 if success
491
+//
492
+//  COMMENTS:
493
+//
494
+int CmdRemoveService()
495
+{
496
+   SC_HANDLE   schService;
497
+   SC_HANDLE   schSCManager;
498
+
499
+   int ret = 0;
500
+
501
+   schSCManager = OpenSCManager(
502
+                               NULL,                   // machine (NULL == local)
503
+                               NULL,                   // database (NULL == default)
504
+                               SC_MANAGER_CONNECT   // access required
505
+                               );
506
+   if ( schSCManager )
507
+   {
508
+      schService = OpenService(schSCManager, TEXT(SZSERVICENAME), DELETE | SERVICE_STOP | SERVICE_QUERY_STATUS);
509
+
510
+      if (schService)
511
+      {
512
+         // try to stop the service
513
+         if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) )
514
+         {
515
+            _tprintf(TEXT("Stopping %s."), TEXT(SZSERVICEDISPLAYNAME));
516
+            Sleep( 1000 );
517
+
518
+            while ( QueryServiceStatus( schService, &ssStatus ) )
519
+            {
520
+               if ( ssStatus.dwCurrentState == SERVICE_STOP_PENDING )
521
+               {
522
+                  _tprintf(TEXT("."));
523
+                  Sleep( 1000 );
524
+               }
525
+               else
526
+                  break;
527
+            }
528
+
529
+            if ( ssStatus.dwCurrentState == SERVICE_STOPPED )
530
+               _tprintf(TEXT("\n%s stopped.\n"), TEXT(SZSERVICEDISPLAYNAME) );
531
+            else
532
+	      {
533
+               _tprintf(TEXT("\n%s failed to stop.\n"), TEXT(SZSERVICEDISPLAYNAME) );
534
+		ret = 1;
535
+	      }
536
+
537
+         }
538
+
539
+         // now remove the service
540
+         if ( DeleteService(schService) )
541
+            _tprintf(TEXT("%s removed.\n"), TEXT(SZSERVICEDISPLAYNAME) );
542
+         else
543
+	   {
544
+            _tprintf(TEXT("DeleteService failed - %s\n"), GetLastErrorText(szErr,256));
545
+	     ret = 1;
546
+	   }
547
+
548
+
549
+         CloseServiceHandle(schService);
550
+      }
551
+      else
552
+	{
553
+         _tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(szErr,256));
554
+	  ret = 1;
555
+	}
556
+
557
+      CloseServiceHandle(schSCManager);
558
+   }
559
+   else
560
+     {
561
+      _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
562
+       ret = 1;
563
+     }
564
+   return ret;
565
+}
566
+
567
+
568
+
569
+
570
+///////////////////////////////////////////////////////////////////
571
+//
572
+//  The following code is for running the service as a console app
573
+//
574
+
575
+
576
+//
577
+//  FUNCTION: CmdDebugService(int argc, char ** argv)
578
+//
579
+//  PURPOSE: Runs the service as a console application
580
+//
581
+//  PARAMETERS:
582
+//    argc - number of command line arguments
583
+//    argv - array of command line arguments
584
+//
585
+//  RETURN VALUE:
586
+//    none
587
+//
588
+//  COMMENTS:
589
+//
590
+void CmdDebugService(int argc, char ** argv)
591
+{
592
+   DWORD dwArgc;
593
+   LPTSTR *lpszArgv;
594
+
595
+#ifdef UNICODE
596
+   lpszArgv = CommandLineToArgvW(GetCommandLineW(), &(dwArgc) );
597
+   if (NULL == lpszArgv)
598
+   {
599
+       // CommandLineToArvW failed!!
600
+       _tprintf(TEXT("CmdDebugService CommandLineToArgvW returned NULL\n"));
601
+       return;
602
+   }
603
+#else
604
+   dwArgc   = (DWORD) argc;
605
+   lpszArgv = argv;
606
+#endif
607
+
608
+   _tprintf(TEXT("Debugging %s.\n"), TEXT(SZSERVICEDISPLAYNAME));
609
+
610
+   SetConsoleCtrlHandler( ControlHandler, TRUE );
611
+
612
+   ServiceStart( dwArgc, lpszArgv );
613
+
614
+#ifdef UNICODE
615
+// Must free memory allocated for arguments
616
+
617
+   GlobalFree(lpszArgv);
618
+#endif // UNICODE
619
+
620
+}
621
+
622
+
623
+//
624
+//  FUNCTION: ControlHandler ( DWORD dwCtrlType )
625
+//
626
+//  PURPOSE: Handled console control events
627
+//
628
+//  PARAMETERS:
629
+//    dwCtrlType - type of control event
630
+//
631
+//  RETURN VALUE:
632
+//    True - handled
633
+//    False - unhandled
634
+//
635
+//  COMMENTS:
636
+//
637
+BOOL WINAPI ControlHandler ( DWORD dwCtrlType )
638
+{
639
+   switch ( dwCtrlType )
640
+   {
641
+   case CTRL_BREAK_EVENT:  // use Ctrl+C or Ctrl+Break to simulate
642
+   case CTRL_C_EVENT:      // SERVICE_CONTROL_STOP in debug mode
643
+      _tprintf(TEXT("Stopping %s.\n"), TEXT(SZSERVICEDISPLAYNAME));
644
+      ServiceStop();
645
+      return TRUE;
646
+      break;
647
+
648
+   }
649
+   return FALSE;
650
+}
651
+
652
+//
653
+//  FUNCTION: GetLastErrorText
654
+//
655
+//  PURPOSE: copies error message text to string
656
+//
657
+//  PARAMETERS:
658
+//    lpszBuf - destination buffer
659
+//    dwSize - size of buffer
660
+//
661
+//  RETURN VALUE:
662
+//    destination buffer
663
+//
664
+//  COMMENTS:
665
+//
666
+LPTSTR GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize )
667
+{
668
+   DWORD dwRet;
669
+   LPTSTR lpszTemp = NULL;
670
+
671
+   dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
672
+                          NULL,
673
+                          GetLastError(),
674
+                          LANG_NEUTRAL,
675
+                          (LPTSTR)&lpszTemp,
676
+                          0,
677
+                          NULL );
678
+
679
+   // supplied buffer is not long enough
680
+   if ( !dwRet || ( (long)dwSize < (long)dwRet+14 ) )
681
+      lpszBuf[0] = TEXT('\0');
682
+   else
683
+   {
684
+      lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0');  //remove cr and newline character
685
+      _stprintf( lpszBuf, TEXT("%s (0x%x)"), lpszTemp, (int)GetLastError() );
686
+   }
687
+
688
+   if ( lpszTemp )
689
+      LocalFree((HLOCAL) lpszTemp );
690
+
691
+   return lpszBuf;
692
+}
0 693
new file mode 100644
... ...
@@ -0,0 +1,141 @@
0
+/*---------------------------------------------------------------------------
1
+THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
2
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
3
+TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
4
+PARTICULAR PURPOSE.
5
+
6
+Copyright (C) 1993 - 2000.  Microsoft Corporation.  All rights reserved.
7
+
8
+ MODULE: service.h
9
+
10
+ Comments:  The use of this header file and the accompanying service.c
11
+ file simplifies the process of writting a service.  You as a developer
12
+ simply need to follow the TODO's outlined in this header file, and
13
+ implement the ServiceStart() and ServiceStop() functions.
14
+
15
+ There is no need to modify the code in service.c.  Just add service.c
16
+ to your project and link with the following libraries...
17
+
18
+ libcmt.lib kernel32.lib advapi.lib shell32.lib
19
+
20
+ This code also supports unicode.  Be sure to compile both service.c and
21
+ and code #include "service.h" with the same Unicode setting.
22
+
23
+ Upon completion, your code will have the following command line interface
24
+
25
+ <service exe> -?                to display this list
26
+ <service exe> -install          to install the service
27
+ <service exe> -remove           to remove the service
28
+ <service exe> -debug <params>   to run as a console app for debugging
29
+
30
+ Note: This code also implements Ctrl+C and Ctrl+Break handlers
31
+       when using the debug option.  These console events cause
32
+       your ServiceStop routine to be called
33
+
34
+       Also, this code only handles the OWN_SERVICE service type
35
+       running in the LOCAL_SYSTEM security context.
36
+
37
+       To control your service ( start, stop, etc ) you may use the
38
+       Services control panel applet or the NET.EXE program.
39
+
40
+       To aid in writing/debugging service, the
41
+       SDK contains a utility (MSTOOLS\BIN\SC.EXE) that
42
+       can be used to control, configure, or obtain service status.
43
+       SC displays complete status for any service/driver
44
+       in the service database, and allows any of the configuration
45
+       parameters to be easily changed at the command line.
46
+       For more information on SC.EXE, type SC at the command line.
47
+
48
+
49
+------------------------------------------------------------------------------*/
50
+
51
+#ifndef _SERVICE_H
52
+#define _SERVICE_H
53
+
54
+
55
+#ifdef __cplusplus
56
+extern "C" {
57
+#endif
58
+
59
+#include "config.h"
60
+
61
+//////////////////////////////////////////////////////////////////////////////
62
+//// todo: change to desired strings
63
+////
64
+// name of the executable
65
+#define SZAPPNAME            PACKAGE "serv"
66
+// internal name of the service
67
+#define SZSERVICENAME        PACKAGE_NAME "Service"
68
+// displayed name of the service
69
+#define SZSERVICEDISPLAYNAME PACKAGE_NAME " Service"
70
+// list of service dependencies - "dep1\0dep2\0\0"
71
+#define SZDEPENDENCIES       TAP_ID "\0Dhcp\0\0"
72
+//////////////////////////////////////////////////////////////////////////////
73
+
74
+
75
+
76
+//////////////////////////////////////////////////////////////////////////////
77
+//// todo: ServiceStart()must be defined by in your code.
78
+////       The service should use ReportStatusToSCMgr to indicate
79
+////       progress.  This routine must also be used by StartService()
80
+////       to report to the SCM when the service is running.
81
+////
82
+////       If a ServiceStop procedure is going to take longer than
83
+////       3 seconds to execute, it should spawn a thread to
84
+////       execute the stop code, and return.  Otherwise, the
85
+////       ServiceControlManager will believe that the service has
86
+////       stopped responding
87
+////
88
+   VOID ServiceStart(DWORD dwArgc, LPTSTR *lpszArgv);
89
+   VOID ServiceStop();
90
+//////////////////////////////////////////////////////////////////////////////
91
+
92
+
93
+
94
+//////////////////////////////////////////////////////////////////////////////
95
+//// The following are procedures which
96
+//// may be useful to call within the above procedures,
97
+//// but require no implementation by the user.
98
+//// They are implemented in service.c
99
+
100
+//
101
+//  FUNCTION: ReportStatusToSCMgr()
102
+//
103
+//  PURPOSE: Sets the current status of the service and
104
+//           reports it to the Service Control Manager
105
+//
106
+//  PARAMETERS:
107
+//    dwCurrentState - the state of the service
108
+//    dwWin32ExitCode - error code to report
109
+//    dwWaitHint - worst case estimate to next checkpoint
110
+//
111
+//  RETURN VALUE:
112
+//    TRUE  - success
113
+//    FALSE - failure
114
+//
115
+   BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint);
116
+
117
+
118
+//
119
+//  FUNCTION: AddToMessageLog(LPTSTR lpszMsg)
120
+//
121
+//  PURPOSE: Allows any thread to log an error message
122
+//
123
+//  PARAMETERS:
124
+//    lpszMsg - text for message
125
+//
126
+//  RETURN VALUE:
127
+//    none
128
+//
129
+#  define MSG_FLAGS_ERROR     (1<<0)
130
+#  define MSG_FLAGS_SYS_CODE  (1<<1)
131
+   void AddToMessageLog(DWORD flags, LPTSTR lpszMsg);
132
+   void ResetError (void);
133
+//////////////////////////////////////////////////////////////////////////////
134
+
135
+
136
+#ifdef __cplusplus
137
+}
138
+#endif
139
+
140
+#endif
0 141
deleted file mode 100755
... ...
@@ -1,359 +0,0 @@
1
-+++ service.c	Tue Apr 24 12:20:08 2007
2
-@@ -16,6 +16,7 @@
3
-   service_main(DWORD dwArgc, LPTSTR *lpszArgv);
4
-   CmdInstallService();
5
-   CmdRemoveService();
6
-+  CmdStartService();
7
-   CmdDebugService(int argc, char **argv);
8
-   ControlHandler ( DWORD dwCtrlType );
9
-   GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize );
10
-@@ -40,8 +41,9 @@
11
- // internal function prototypes
12
- VOID WINAPI service_ctrl(DWORD dwCtrlCode);
13
- VOID WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv);
14
--VOID CmdInstallService();
15
--VOID CmdRemoveService();
16
-+int CmdInstallService();
17
-+int CmdRemoveService();
18
-+int CmdStartService();
19
- VOID CmdDebugService(int argc, char **argv);
20
- BOOL WINAPI ControlHandler ( DWORD dwCtrlType );
21
- LPTSTR GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize );
22
-@@ -64,7 +66,7 @@
23
- //    main service thread.  When the this call returns,
24
- //    the service has stopped, so exit.
25
- //
26
--void __cdecl main(int argc, char **argv)
27
-+int __cdecl main(int argc, char **argv)
28
- {
29
-    SERVICE_TABLE_ENTRY dispatchTable[] =
30
-    {
31
-@@ -77,11 +79,15 @@
32
-    {
33
-       if ( _stricmp( "install", argv[1]+1 ) == 0 )
34
-       {
35
--         CmdInstallService();
36
-+         return CmdInstallService();
37
-       }
38
-       else if ( _stricmp( "remove", argv[1]+1 ) == 0 )
39
-       {
40
--         CmdRemoveService();
41
-+         return CmdRemoveService();
42
-+      }
43
-+	  else if ( _stricmp( "start", argv[1]+1 ) == 0)
44
-+	  {
45
-+		  return CmdStartService();
46
-       }
47
-       else if ( _stricmp( "debug", argv[1]+1 ) == 0 )
48
-       {
49
-@@ -92,7 +98,7 @@
50
-       {
51
-          goto dispatch;
52
-       }
53
--      exit(0);
54
-+      return 0;
55
-    }
56
- 
57
-    // if it doesn't match any of the above parameters
58
-@@ -101,13 +107,16 @@
59
-    dispatch:
60
-    // this is just to be friendly
61
-    printf( "%s -install          to install the service\n", SZAPPNAME );
62
-+   printf( "%s -start			 to start the service\n", SZAPPNAME );
63
-    printf( "%s -remove           to remove the service\n", SZAPPNAME );
64
-    printf( "%s -debug <params>   to run as a console app for debugging\n", SZAPPNAME );
65
-    printf( "\nStartServiceCtrlDispatcher being called.\n" );
66
-    printf( "This may take several seconds.  Please wait.\n" );
67
- 
68
-    if (!StartServiceCtrlDispatcher(dispatchTable))
69
--      AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
70
-+      AddToMessageLog(MSG_FLAGS_ERROR, TEXT("StartServiceCtrlDispatcher failed."));
71
-+
72
-+   return 0;
73
- }
74
- 
75
- 
76
-@@ -267,7 +276,7 @@
77
-       //
78
-       if (!(fResult = SetServiceStatus( sshStatusHandle, &ssStatus)))
79
-       {
80
--         AddToMessageLog(TEXT("SetServiceStatus"));
81
-+         AddToMessageLog(MSG_FLAGS_ERROR, TEXT("SetServiceStatus"));
82
-       }
83
-    }
84
-    return fResult;
85
-@@ -288,28 +297,33 @@
86
- //
87
- //  COMMENTS:
88
- //
89
--VOID AddToMessageLog(LPTSTR lpszMsg)
90
-+void AddToMessageLog(DWORD flags, LPTSTR lpszMsg)
91
- {
92
-    TCHAR szMsg [(sizeof(SZSERVICENAME) / sizeof(TCHAR)) + 100 ];
93
-    HANDLE  hEventSource;
94
--   LPTSTR  lpszStrings[2];
95
-+   LPCSTR  lpszStrings[2];
96
- 
97
-    if ( !bDebug )
98
-    {
99
-+     if (flags & MSG_FLAGS_SYS_CODE)
100
-       dwErr = GetLastError();
101
-+     else
102
-+       dwErr = 0;
103
- 
104
-       // Use event logging to log the error.
105
-       //
106
-       hEventSource = RegisterEventSource(NULL, TEXT(SZSERVICENAME));
107
- 
108
--      _stprintf(szMsg, TEXT("%s error: %d"), TEXT(SZSERVICENAME), dwErr);
109
-+      _stprintf(szMsg, TEXT("%s error: %d"), TEXT(SZSERVICENAME), (int)dwErr);
110
-       lpszStrings[0] = szMsg;
111
-       lpszStrings[1] = lpszMsg;
112
- 
113
-       if (hEventSource != NULL)
114
-       {
115
-          ReportEvent(hEventSource, // handle of event source
116
--                     EVENTLOG_ERROR_TYPE,  // event type
117
-+		     // event type
118
-+                     (flags & MSG_FLAGS_ERROR)
119
-+		       ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE,
120
-                      0,                    // event category
121
-                      0,                    // event ID
122
-                      NULL,                 // current user's SID
123
-@@ -323,8 +337,10 @@
124
-    }
125
- }
126
- 
127
--
128
--
129
-+void ResetError (void)
130
-+{
131
-+  dwErr = 0;
132
-+}
133
- 
134
- ///////////////////////////////////////////////////////////////////
135
- //
136
-@@ -341,21 +357,23 @@
137
- //    none
138
- //
139
- //  RETURN VALUE:
140
--//    none
141
-+//    0 if success
142
- //
143
- //  COMMENTS:
144
- //
145
--void CmdInstallService()
146
-+int CmdInstallService()
147
- {
148
-    SC_HANDLE   schService;
149
-    SC_HANDLE   schSCManager;
150
- 
151
-    TCHAR szPath[512];
152
- 
153
-+   int ret = 0;
154
-+
155
-    if ( GetModuleFileName( NULL, szPath, 512 ) == 0 )
156
-    {
157
-       _tprintf(TEXT("Unable to install %s - %s\n"), TEXT(SZSERVICEDISPLAYNAME), GetLastErrorText(szErr, 256));
158
--      return;
159
-+      return 1;
160
-    }
161
- 
162
-    schSCManager = OpenSCManager(
163
-@@ -371,7 +389,7 @@
164
-                                 TEXT(SZSERVICEDISPLAYNAME), // name to display
165
-                                 SERVICE_QUERY_STATUS,         // desired access
166
-                                 SERVICE_WIN32_OWN_PROCESS,  // service type
167
--                                SERVICE_DEMAND_START,       // start type
168
-+				SERVICE_DEMAND_START,        // start type -- alternative: SERVICE_AUTO_START
169
-                                 SERVICE_ERROR_NORMAL,       // error control type
170
-                                 szPath,                     // service's binary
171
-                                 NULL,                       // no load ordering group
172
-@@ -388,16 +406,79 @@
173
-       else
174
-       {
175
-          _tprintf(TEXT("CreateService failed - %s\n"), GetLastErrorText(szErr, 256));
176
-+	 ret = 1;
177
-       }
178
- 
179
-       CloseServiceHandle(schSCManager);
180
-    }
181
-    else
182
-+     {
183
-       _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
184
-+       ret = 1;
185
-+     }
186
-+   return ret;
187
- }
188
- 
189
-+//
190
-+//  FUNCTION: CmdStartService()
191
-+//
192
-+//  PURPOSE: Start the service
193
-+//
194
-+//  PARAMETERS:
195
-+//    none
196
-+//
197
-+//  RETURN VALUE:
198
-+//    0 if success
199
-+//
200
-+//  COMMENTS:
201
-+
202
-+int CmdStartService()
203
-+{
204
-+  int ret = 0;
205
-+
206
-+  SC_HANDLE schSCManager;
207
-+  SC_HANDLE schService;
208
- 
209
- 
210
-+    // Open a handle to the SC Manager database. 
211
-+    schSCManager = OpenSCManager( 
212
-+       NULL,                    // local machine 
213
-+       NULL,                    // ServicesActive database 
214
-+       SC_MANAGER_ALL_ACCESS);  // full access rights 
215
-+   
216
-+    if (NULL == schSCManager) {
217
-+       _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
218
-+       ret = 1;
219
-+    }
220
-+
221
-+    schService = OpenService( 
222
-+        schSCManager,          // SCM database 
223
-+        SZSERVICENAME,         // service name
224
-+        SERVICE_ALL_ACCESS); 
225
-+
226
-+    if (schService == NULL) {
227
-+      _tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(szErr,256));
228
-+       ret = 1;
229
-+    }
230
-+ 
231
-+    if (!StartService(
232
-+            schService,  // handle to service 
233
-+            0,           // number of arguments 
234
-+            NULL) )      // no arguments 
235
-+    {
236
-+      _tprintf(TEXT("StartService failed - %s\n"), GetLastErrorText(szErr,256));
237
-+       ret = 1;
238
-+    }
239
-+    else
240
-+	{
241
-+		_tprintf(TEXT("Service Started\n"));
242
-+       ret = 0;
243
-+	}
244
-+    CloseServiceHandle(schService); 
245
-+    CloseServiceHandle(schSCManager);
246
-+    return ret;
247
-+}
248
-+
249
- //
250
- //  FUNCTION: CmdRemoveService()
251
- //
252
-@@ -407,15 +488,17 @@
253
- //    none
254
- //
255
- //  RETURN VALUE:
256
--//    none
257
-+//    0 if success
258
- //
259
- //  COMMENTS:
260
- //
261
--void CmdRemoveService()
262
-+int CmdRemoveService()
263
- {
264
-    SC_HANDLE   schService;
265
-    SC_HANDLE   schSCManager;
266
- 
267
-+   int ret = 0;
268
-+
269
-    schSCManager = OpenSCManager(
270
-                                NULL,                   // machine (NULL == local)
271
-                                NULL,                   // database (NULL == default)
272
-@@ -447,7 +530,10 @@
273
-             if ( ssStatus.dwCurrentState == SERVICE_STOPPED )
274
-                _tprintf(TEXT("\n%s stopped.\n"), TEXT(SZSERVICEDISPLAYNAME) );
275
-             else
276
-+	      {
277
-                _tprintf(TEXT("\n%s failed to stop.\n"), TEXT(SZSERVICEDISPLAYNAME) );
278
-+		ret = 1;
279
-+	      }
280
- 
281
-          }
282
- 
283
-@@ -455,18 +541,28 @@
284
-          if ( DeleteService(schService) )
285
-             _tprintf(TEXT("%s removed.\n"), TEXT(SZSERVICEDISPLAYNAME) );
286
-          else
287
-+	   {
288
-             _tprintf(TEXT("DeleteService failed - %s\n"), GetLastErrorText(szErr,256));
289
-+	     ret = 1;
290
-+	   }
291
- 
292
- 
293
-          CloseServiceHandle(schService);
294
-       }
295
-       else
296
-+	{
297
-          _tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(szErr,256));
298
-+	  ret = 1;
299
-+	}
300
- 
301
-       CloseServiceHandle(schSCManager);
302
-    }
303
-    else
304
-+     {
305
-       _tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
306
-+       ret = 1;
307
-+     }
308
-+   return ret;
309
- }
310
- 
311
- 
312
-@@ -587,7 +683,7 @@
313
-    else
314
-    {
315
-       lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0');  //remove cr and newline character
316
--      _stprintf( lpszBuf, TEXT("%s (0x%x)"), lpszTemp, GetLastError() );
317
-+      _stprintf( lpszBuf, TEXT("%s (0x%x)"), lpszTemp, (int)GetLastError() );
318
-    }
319
- 
320
-    if ( lpszTemp )
321
-+++ service.h	Tue Apr 24 11:58:48 2007
322
-@@ -57,18 +57,19 @@
323
- extern "C" {
324
- #endif
325
- 
326
-+#include "../autodefs/defs.h"
327
- 
328
- //////////////////////////////////////////////////////////////////////////////
329
- //// todo: change to desired strings
330
- ////
331
- // name of the executable
332
--#define SZAPPNAME            "Simple"
333
-+#define SZAPPNAME            PRODUCT_UNIX_NAME "serv"
334
- // internal name of the service
335
--#define SZSERVICENAME        "SimpleService"
336
-+#define SZSERVICENAME        PRODUCT_NAME "Service"
337
- // displayed name of the service
338
--#define SZSERVICEDISPLAYNAME "Simple Service"
339
-+#define SZSERVICEDISPLAYNAME PRODUCT_NAME " Service"
340
- // list of service dependencies - "dep1\0dep2\0\0"
341
--#define SZDEPENDENCIES       ""
342
-+#define SZDEPENDENCIES       PRODUCT_TAP_ID "\0Dhcp\0\0"
343
- //////////////////////////////////////////////////////////////////////////////
344
- 
345
- 
346
-@@ -126,7 +127,10 @@
347
- //  RETURN VALUE:
348
- //    none
349
- //
350
--   void AddToMessageLog(LPTSTR lpszMsg);
351
-+#  define MSG_FLAGS_ERROR     (1<<0)
352
-+#  define MSG_FLAGS_SYS_CODE  (1<<1)
353
-+   void AddToMessageLog(DWORD flags, LPTSTR lpszMsg);
354
-+   void ResetError (void);
355
- //////////////////////////////////////////////////////////////////////////////
356
- 
357
- 
... ...
@@ -31,16 +31,10 @@
31 31
  * it is called the key_id and is currently 2 bits long.
32 32
  */
33 33
 
34
-#ifdef WIN32
35
-#include "config-win32.h"
36
-#else
37
-#include "config.h"
38
-#endif
34
+#include "syshead.h"
39 35
 
40 36
 #if defined(USE_CRYPTO) && defined(USE_SSL)
41 37
 
42
-#include "syshead.h"
43
-
44 38
 #include "error.h"
45 39
 #include "common.h"
46 40
 #include "crypto.h"
... ...
@@ -22,11 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30 25
 #include "syshead.h"
31 26
 #include "shaper.h"
32 27
 #include "memdbg.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "buffer.h"
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "socket.h"
... ...
@@ -138,6 +132,9 @@ getaddr (unsigned int flags,
138 138
       while (true)
139 139
 	{
140 140
 	  /* try hostname lookup */
141
+#if defined(HAVE_RES_INIT)
142
+	  res_init ();
143
+#endif
141 144
 	  h = gethostbyname (hostname);
142 145
 
143 146
 	  if (signal_received)
... ...
@@ -2121,11 +2118,13 @@ link_socket_read_tcp (struct link_socket *sock,
2121 2121
 
2122 2122
 #if ENABLE_IP_PKTINFO
2123 2123
 
2124
+#pragma pack(1) /* needed to keep structure size consistent for 32 vs. 64-bit architectures */
2124 2125
 struct openvpn_pktinfo
2125 2126
 {
2126 2127
   struct cmsghdr cmsghdr;
2127 2128
   struct in_pktinfo in_pktinfo;
2128 2129
 };
2130
+#pragma pack()
2129 2131
 
2130 2132
 static socklen_t
2131 2133
 link_socket_read_udp_posix_recvmsg (struct link_socket *sock,
... ...
@@ -29,16 +29,10 @@
29 29
  * see RFC 1928, only supports "no authentication"
30 30
  */
31 31
 
32
-#ifdef WIN32
33
-#include "config-win32.h"
34
-#else
35
-#include "config.h"
36
-#endif
32
+#include "syshead.h"
37 33
 
38 34
 #ifdef ENABLE_SOCKS
39 35
 
40
-#include "syshead.h"
41
-
42 36
 #include "common.h"
43 37
 #include "misc.h"
44 38
 #include "win32.h"
... ...
@@ -30,16 +30,10 @@
30 30
  * over the same TCP/UDP port.
31 31
  */
32 32
 
33
-#ifdef WIN32
34
-#include "config-win32.h"
35
-#else
36
-#include "config.h"
37
-#endif
33
+#include "syshead.h"
38 34
 
39 35
 #if defined(USE_CRYPTO) && defined(USE_SSL)
40 36
 
41
-#include "syshead.h"
42
-
43 37
 #include "ssl.h"
44 38
 #include "error.h"
45 39
 #include "common.h"
... ...
@@ -1210,7 +1204,7 @@ init_ssl (const struct options *options)
1210 1210
       if (options->pkcs11_providers[0])
1211 1211
         {
1212 1212
          /* Load Certificate and Private Key */
1213
-	 if (!SSL_CTX_use_pkcs11 (ctx, options->pkcs11_id))
1213
+	 if (!SSL_CTX_use_pkcs11 (ctx, options->pkcs11_id_management, options->pkcs11_id))
1214 1214
 	   {
1215 1215
 	     msg (M_WARN, "Cannot load certificate \"%s\" using PKCS#11 interface", options->pkcs11_id);
1216 1216
 	     goto err;
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #include "status.h"
... ...
@@ -25,6 +25,28 @@
25 25
 #ifndef SYSHEAD_H
26 26
 #define SYSHEAD_H
27 27
 
28
+/*
29
+ * Only include if not during configure
30
+ */
31
+#ifndef PACKAGE_NAME
32
+#ifdef _MSC_VER
33
+#include "config-win32.h"
34
+#else
35
+#include "config.h"
36
+#endif
37
+#endif
38
+
39
+#if defined(_WIN32) && !defined(WIN32)
40
+#define WIN32
41
+#endif
42
+
43
+#ifdef WIN32
44
+#include <windows.h>
45
+#define sleep(x) Sleep((x)*1000)
46
+#define random rand
47
+#define srandom srand
48
+#endif
49
+
28 50
 #ifdef HAVE_SYS_TYPES_H
29 51
 #include <sys/types.h>
30 52
 #endif
... ...
@@ -133,6 +155,10 @@
133 133
 #include <netinet/in.h>
134 134
 #endif
135 135
 
136
+#ifdef HAVE_RESOLV_H
137
+#include <resolv.h>
138
+#endif
139
+
136 140
 #ifdef HAVE_SYS_POLL_H
137 141
 #include <sys/poll.h>
138 142
 #endif
... ...
@@ -272,9 +298,29 @@
272 272
 
273 273
 #endif /* TARGET_NETBSD */
274 274
 
275
+#ifdef TARGET_DRAGONFLY
276
+
277
+#ifdef HAVE_SYS_UIO_H
278
+#include <sys/uio.h>
279
+#endif
280
+
281
+#ifdef HAVE_NETINET_IN_SYSTM_H
282
+#include <netinet/in_systm.h>
283
+#endif
284
+
285
+#ifdef HAVE_NETINET_IP_H
286
+#include <netinet/ip.h>
287
+#endif
288
+
289
+#ifdef HAVE_NET_TUN_IF_TUN_H
290
+#include <net/tun/if_tun.h>
291
+#endif
292
+
293
+#endif /* TARGET_DRAGONFLY */
294
+
275 295
 #ifdef WIN32
276 296
 #include <iphlpapi.h>
277
-#include <WinInet.h>
297
+#include <wininet.h>
278 298
 #endif
279 299
 
280 300
 #ifdef HAVE_SYS_MMAN_H
... ...
@@ -32,7 +32,15 @@
32 32
 // common to both.
33 33
 //===============================================
34 34
 
35
-#include "../autodefs/defs.h"
35
+#if defined(HAVE_CONFIG_H)
36
+#include "config.h"
37
+#else
38
+#if defined(_MSC_VER) && !defined(TAP_DRIVER_MAJOR_VERSION)
39
+#include "config-win32.h"
40
+#else
41
+#include "../config.h"
42
+#endif
43
+#endif
36 44
 
37 45
 //=============
38 46
 // TAP IOCTLs
... ...
@@ -81,4 +89,4 @@
81 81
 // simultaneously.
82 82
 //=========================================================
83 83
 
84
-#define TAP_COMPONENT_ID PRODUCT_TAP_ID
84
+#define TAP_COMPONENT_ID TAP_ID
... ...
@@ -22,12 +22,6 @@
22 22
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 23
  */
24 24
 
25
-#ifdef WIN32
26
-#include "config-win32.h"
27
-#else
28
-#include "config.h"
29
-#endif
30
-
31 25
 #include "syshead.h"
32 26
 
33 27
 #ifdef USE_PTHREAD
... ...
@@ -30,12 +30,6 @@
30 30
  * from VTun by Maxim Krasnyansky <max_mk@yahoo.com>.
31 31
  */
32 32
 
33
-#ifdef WIN32
34
-#include "config-win32.h"
35
-#else
36
-#include "config.h"
37
-#endif
38
-
39 33
 #include "syshead.h"
40 34
 
41 35
 #include "tun.h"
... ...
@@ -799,7 +793,7 @@ do_ifconfig (struct tuntap *tt,
799 799
 	  add_route (&r, tt, 0, es);
800 800
 	}
801 801
 
802
-#elif defined(TARGET_FREEBSD)
802
+#elif defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY)
803 803
 
804 804
       /* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask 255.255.255.255 up */
805 805
       if (tun)
... ...
@@ -1248,7 +1242,7 @@ close_tun (struct tuntap *tt)
1248 1248
 	      }
1249 1249
 #else
1250 1250
 	    openvpn_snprintf (command_line, sizeof (command_line),
1251
-			IFCONFIG_PATH "%s addr 0.0.0.0",
1251
+			IFCONFIG_PATH " %s 0.0.0.0",
1252 1252
 			tt->actual_name
1253 1253
 			);
1254 1254
 #endif
... ...
@@ -1753,6 +1747,89 @@ read_tun (struct tuntap* tt, uint8_t *buf, int len)
1753 1753
     return read (tt->fd, buf, len);
1754 1754
 }
1755 1755
 
1756
+#elif defined(TARGET_DRAGONFLY)
1757
+
1758
+static inline int
1759
+dragonfly_modify_read_write_return (int len)
1760
+{
1761
+  if (len > 0)
1762
+    return len > sizeof (u_int32_t) ? len - sizeof (u_int32_t) : 0;
1763
+  else
1764
+    return len;
1765
+}
1766
+
1767
+void
1768
+open_tun (const char *dev, const char *dev_type, const char *dev_node, bool ipv6, struct tuntap *tt)
1769
+{
1770
+  open_tun_generic (dev, dev_type, dev_node, ipv6, true, true, tt);
1771
+
1772
+  if (tt->fd >= 0)
1773
+    {
1774
+      int i = 0;
1775
+
1776
+      /* Disable extended modes */
1777
+      ioctl (tt->fd, TUNSLMODE, &i);
1778
+      i = 1;
1779
+      ioctl (tt->fd, TUNSIFHEAD, &i);
1780
+    }
1781
+}
1782
+
1783
+void
1784
+close_tun (struct tuntap *tt)
1785
+{
1786
+  if (tt)
1787
+    {
1788
+      close_tun_generic (tt);
1789
+      free (tt);
1790
+    }
1791
+}
1792
+
1793
+int
1794
+write_tun (struct tuntap* tt, uint8_t *buf, int len)
1795
+{
1796
+  if (tt->type == DEV_TYPE_TUN)
1797
+    {
1798
+      u_int32_t type;
1799
+      struct iovec iv[2];
1800
+      struct ip *iph;
1801
+
1802
+      iph = (struct ip *) buf;
1803
+
1804
+      if (tt->ipv6 && iph->ip_v == 6)
1805
+        type = htonl (AF_INET6);
1806
+      else 
1807
+        type = htonl (AF_INET);
1808
+
1809
+      iv[0].iov_base = (char *)&type;
1810
+      iv[0].iov_len = sizeof (type);
1811
+      iv[1].iov_base = buf;
1812
+      iv[1].iov_len = len;
1813
+
1814
+      return dragonfly_modify_read_write_return (writev (tt->fd, iv, 2));
1815
+    }
1816
+  else
1817
+    return write (tt->fd, buf, len);
1818
+}
1819
+
1820
+int
1821
+read_tun (struct tuntap* tt, uint8_t *buf, int len)
1822
+{
1823
+  if (tt->type == DEV_TYPE_TUN)
1824
+    {
1825
+      u_int32_t type;
1826
+      struct iovec iv[2];
1827
+
1828
+      iv[0].iov_base = (char *)&type;
1829
+      iv[0].iov_len = sizeof (type);
1830
+      iv[1].iov_base = buf;
1831
+      iv[1].iov_len = len;
1832
+
1833
+      return dragonfly_modify_read_write_return (readv (tt->fd, iv, 2));
1834
+    }
1835
+  else
1836
+    return read (tt->fd, buf, len);
1837
+}
1838
+
1756 1839
 #elif defined(WIN32)
1757 1840
 
1758 1841
 int
... ...
@@ -1,2 +1,6 @@
1 1
 dnl define the OpenVPN version
2
-define(PRODUCT_VERSION,[2.1_rc7b])
2
+define(PRODUCT_VERSION,[2.1_rc7c])
3
+dnl define the TAP version
4
+define(PRODUCT_TAP_ID,[tap0901])
5
+define(PRODUCT_TAP_WIN32_MIN_MAJOR,[9])
6
+define(PRODUCT_TAP_WIN32_MIN_MINOR,[1])
... ...
@@ -26,12 +26,10 @@
26 26
  * Win32-specific OpenVPN code, targetted at the mingw
27 27
  * development environment.
28 28
  */
29
+#include "syshead.h"
29 30
 
30 31
 #ifdef WIN32
31 32
 
32
-#include "config-win32.h"
33
-
34
-#include "syshead.h"
35 33
 #include "buffer.h"
36 34
 #include "error.h"
37 35
 #include "mtu.h"