~ubuntu-branches/ubuntu/feisty/apache2/feisty

« back to all changes in this revision

Viewing changes to srclib/apr/include/apr_portable.h

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Barth
  • Date: 2006-12-09 21:05:45 UTC
  • mfrom: (0.6.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20061209210545-h70s0xaqc2v8vqr2
Tags: 2.2.3-3.2
* Non-maintainer upload.
* 043_ajp_connection_reuse: Patch from upstream Bugzilla, fixing a critical
  issue with regard to connection reuse in mod_proxy_ajp.
  Closes: #396265

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
 
2
 * applicable.
 
3
 *
 
4
 * Licensed under the Apache License, Version 2.0 (the "License");
 
5
 * you may not use this file except in compliance with the License.
 
6
 * You may obtain a copy of the License at
 
7
 *
 
8
 *     http://www.apache.org/licenses/LICENSE-2.0
 
9
 *
 
10
 * Unless required by applicable law or agreed to in writing, software
 
11
 * distributed under the License is distributed on an "AS IS" BASIS,
 
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
13
 * See the License for the specific language governing permissions and
 
14
 * limitations under the License.
 
15
 */
 
16
 
 
17
/* This header file is where you should put ANY platform specific information.
 
18
 * This should be the only header file that programs need to include that 
 
19
 * actually has platform dependant code which refers to the .
 
20
 */
 
21
#ifndef APR_PORTABLE_H
 
22
#define APR_PORTABLE_H
 
23
/**
 
24
 * @file apr_portable.h
 
25
 * @brief APR Portability Routines
 
26
 */
 
27
 
 
28
#include "apr.h"
 
29
#include "apr_pools.h"
 
30
#include "apr_thread_proc.h"
 
31
#include "apr_file_io.h"
 
32
#include "apr_network_io.h"
 
33
#include "apr_errno.h"
 
34
#include "apr_global_mutex.h"
 
35
#include "apr_proc_mutex.h"
 
36
#include "apr_time.h"
 
37
#include "apr_dso.h"
 
38
#include "apr_shm.h"
 
39
 
 
40
#if APR_HAVE_DIRENT_H
 
41
#include <dirent.h>
 
42
#endif
 
43
#if APR_HAVE_FCNTL_H
 
44
#include <fcntl.h>
 
45
#endif
 
46
#if APR_HAVE_PTHREAD_H
 
47
#include <pthread.h>
 
48
#endif
 
49
 
 
50
#ifdef __cplusplus
 
51
extern "C" {
 
52
#endif /* __cplusplus */
 
53
 
 
54
/**
 
55
 * @defgroup apr_portabile Portability Routines
 
56
 * @ingroup APR 
 
57
 * @{
 
58
 */
 
59
 
 
60
#ifdef WIN32
 
61
/* The primitives for Windows types */
 
62
typedef HANDLE                apr_os_file_t;
 
63
typedef HANDLE                apr_os_dir_t;
 
64
typedef SOCKET                apr_os_sock_t;
 
65
typedef HANDLE                apr_os_proc_mutex_t;
 
66
typedef HANDLE                apr_os_thread_t;
 
67
typedef HANDLE                apr_os_proc_t;
 
68
typedef DWORD                 apr_os_threadkey_t; 
 
69
typedef FILETIME              apr_os_imp_time_t;
 
70
typedef SYSTEMTIME            apr_os_exp_time_t;
 
71
typedef HANDLE                apr_os_dso_handle_t;
 
72
typedef HANDLE                apr_os_shm_t;
 
73
 
 
74
#elif defined(OS2)
 
75
typedef HFILE                 apr_os_file_t;
 
76
typedef HDIR                  apr_os_dir_t;
 
77
typedef int                   apr_os_sock_t;
 
78
typedef HMTX                  apr_os_proc_mutex_t;
 
79
typedef TID                   apr_os_thread_t;
 
80
typedef PID                   apr_os_proc_t;
 
81
typedef PULONG                apr_os_threadkey_t; 
 
82
typedef struct timeval        apr_os_imp_time_t;
 
83
typedef struct tm             apr_os_exp_time_t;
 
84
typedef HMODULE               apr_os_dso_handle_t;
 
85
typedef void*                 apr_os_shm_t;
 
86
 
 
87
#elif defined(__BEOS__)
 
88
#include <kernel/OS.h>
 
89
#include <kernel/image.h>
 
90
 
 
91
struct apr_os_proc_mutex_t {
 
92
        sem_id sem;
 
93
        int32  ben;
 
94
};
 
95
 
 
96
typedef int                   apr_os_file_t;
 
97
typedef DIR                   apr_os_dir_t;
 
98
typedef int                   apr_os_sock_t;
 
99
typedef struct apr_os_proc_mutex_t  apr_os_proc_mutex_t;
 
100
typedef thread_id             apr_os_thread_t;
 
101
typedef thread_id             apr_os_proc_t;
 
102
typedef int                   apr_os_threadkey_t;
 
103
typedef struct timeval        apr_os_imp_time_t;
 
104
typedef struct tm             apr_os_exp_time_t;
 
105
typedef image_id              apr_os_dso_handle_t;
 
106
typedef void*                 apr_os_shm_t;
 
107
 
 
108
#elif defined(NETWARE)
 
109
typedef int                   apr_os_file_t;
 
110
typedef DIR                   apr_os_dir_t;
 
111
typedef int                   apr_os_sock_t;
 
112
typedef NXMutex_t             apr_os_proc_mutex_t;
 
113
typedef NXThreadId_t          apr_os_thread_t;
 
114
typedef long                  apr_os_proc_t;
 
115
typedef NXKey_t               apr_os_threadkey_t; 
 
116
typedef struct timeval        apr_os_imp_time_t;
 
117
typedef struct tm             apr_os_exp_time_t;
 
118
typedef void *                apr_os_dso_handle_t;
 
119
typedef void*                 apr_os_shm_t;
 
120
 
 
121
#else
 
122
/* Any other OS should go above this one.  This is the lowest common
 
123
 * denominator typedefs for  all UNIX-like systems.  :)
 
124
 */
 
125
 
 
126
/** Basic OS process mutex structure. */
 
127
struct apr_os_proc_mutex_t {
 
128
#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE
 
129
    /** Value used for SYS V Semaphore, FCNTL and FLOCK serialization */
 
130
    int crossproc;
 
131
#endif
 
132
#if APR_HAS_PROC_PTHREAD_SERIALIZE
 
133
    /** Value used for PTHREAD serialization */
 
134
    pthread_mutex_t *pthread_interproc;
 
135
#endif
 
136
#if APR_HAS_THREADS
 
137
    /* If no threads, no need for thread locks */
 
138
#if APR_USE_PTHREAD_SERIALIZE
 
139
    /** This value is currently unused within APR and Apache */ 
 
140
    pthread_mutex_t *intraproc;
 
141
#endif
 
142
#endif
 
143
};
 
144
 
 
145
typedef int                   apr_os_file_t;        /**< native file */
 
146
typedef DIR                   apr_os_dir_t;         /**< native dir */
 
147
typedef int                   apr_os_sock_t;        /**< native dir */
 
148
typedef struct apr_os_proc_mutex_t  apr_os_proc_mutex_t; /**< native proces
 
149
                                                          *   mutex
 
150
                                                          */
 
151
#if APR_HAS_THREADS && APR_HAVE_PTHREAD_H 
 
152
typedef pthread_t             apr_os_thread_t;      /**< native thread */
 
153
typedef pthread_key_t         apr_os_threadkey_t;   /**< native thread address
 
154
                                                     *   space */
 
155
#endif
 
156
typedef pid_t                 apr_os_proc_t;        /**< native pid */
 
157
typedef struct timeval        apr_os_imp_time_t;    /**< native timeval */
 
158
typedef struct tm             apr_os_exp_time_t;    /**< native tm */
 
159
/** @var apr_os_dso_handle_t
 
160
 * native dso types
 
161
 */
 
162
#if defined(HPUX) || defined(HPUX10) || defined(HPUX11)
 
163
#include <dl.h>
 
164
typedef shl_t                 apr_os_dso_handle_t;
 
165
#elif defined(DARWIN)
 
166
#include <mach-o/dyld.h>
 
167
typedef NSModule              apr_os_dso_handle_t;
 
168
#else
 
169
typedef void *                apr_os_dso_handle_t;
 
170
#endif
 
171
typedef void*                 apr_os_shm_t;         /**< native SHM */
 
172
 
 
173
#endif
 
174
 
 
175
/**
 
176
 * @typedef apr_os_sock_info_t
 
177
 * @brief alias for local OS socket
 
178
 */
 
179
/**
 
180
 * everything APR needs to know about an active socket to construct
 
181
 * an APR socket from it; currently, this is platform-independent
 
182
 */
 
183
struct apr_os_sock_info_t {
 
184
    apr_os_sock_t *os_sock; /**< always required */
 
185
    struct sockaddr *local; /**< NULL if not yet bound */
 
186
    struct sockaddr *remote; /**< NULL if not connected */
 
187
    int family;             /**< always required (APR_INET, APR_INET6, etc.) */
 
188
    int type;               /**< always required (SOCK_STREAM, SOCK_DGRAM, etc.) */
 
189
    int protocol;           /**< 0 or actual protocol (APR_PROTO_SCTP, APR_PROTO_TCP, etc.) */
 
190
};
 
191
 
 
192
typedef struct apr_os_sock_info_t apr_os_sock_info_t;
 
193
 
 
194
#if APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN)
 
195
/** Opaque global mutex type */
 
196
#define apr_os_global_mutex_t apr_os_proc_mutex_t
 
197
/** @return apr_os_global_mutex */
 
198
#define apr_os_global_mutex_get apr_os_proc_mutex_get
 
199
#else
 
200
    /** Thread and process mutex for those platforms where process mutexes
 
201
     *  are not held in threads.
 
202
     */
 
203
    struct apr_os_global_mutex_t {
 
204
        apr_pool_t *pool;
 
205
        apr_proc_mutex_t *proc_mutex;
 
206
#if APR_HAS_THREADS
 
207
        apr_thread_mutex_t *thread_mutex;
 
208
#endif /* APR_HAS_THREADS */
 
209
    };
 
210
    typedef struct apr_os_global_mutex_t apr_os_global_mutex_t;
 
211
 
 
212
APR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex, 
 
213
                                                apr_global_mutex_t *pmutex);
 
214
#endif
 
215
 
 
216
 
 
217
/**
 
218
 * convert the file from apr type to os specific type.
 
219
 * @param thefile The os specific file we are converting to
 
220
 * @param file The apr file to convert.
 
221
 * @remark On Unix, it is only possible to get a file descriptor from 
 
222
 *         an apr file type.
 
223
 */
 
224
APR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile,
 
225
                                          apr_file_t *file);
 
226
 
 
227
/**
 
228
 * convert the dir from apr type to os specific type.
 
229
 * @param thedir The os specific dir we are converting to
 
230
 * @param dir The apr dir to convert.
 
231
 */   
 
232
APR_DECLARE(apr_status_t) apr_os_dir_get(apr_os_dir_t **thedir, 
 
233
                                         apr_dir_t *dir);
 
234
 
 
235
/**
 
236
 * Convert the socket from an apr type to an OS specific socket
 
237
 * @param thesock The socket to convert.
 
238
 * @param sock The os specifc equivelant of the apr socket..
 
239
 */
 
240
APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock,
 
241
                                          apr_socket_t *sock);
 
242
 
 
243
/**
 
244
 * Convert the proc mutex from os specific type to apr type
 
245
 * @param ospmutex The os specific proc mutex we are converting to.
 
246
 * @param pmutex The apr proc mutex to convert.
 
247
 */
 
248
APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, 
 
249
                                                apr_proc_mutex_t *pmutex);
 
250
 
 
251
/**
 
252
 * Get the exploded time in the platforms native format.
 
253
 * @param ostime the native time format
 
254
 * @param aprtime the time to convert
 
255
 */
 
256
APR_DECLARE(apr_status_t) apr_os_exp_time_get(apr_os_exp_time_t **ostime,
 
257
                                 apr_time_exp_t *aprtime);
 
258
 
 
259
/**
 
260
 * Get the imploded time in the platforms native format.
 
261
 * @param ostime  the native time format
 
262
 * @param aprtime the time to convert
 
263
 */
 
264
APR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, 
 
265
                                              apr_time_t *aprtime);
 
266
 
 
267
/**
 
268
 * convert the shm from apr type to os specific type.
 
269
 * @param osshm The os specific shm representation
 
270
 * @param shm The apr shm to convert.
 
271
 */   
 
272
APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm,
 
273
                                         apr_shm_t *shm);
 
274
 
 
275
#if APR_HAS_THREADS || defined(DOXYGEN)
 
276
/** 
 
277
 * @defgroup apr_os_thread Thread portability Routines
 
278
 * @{ 
 
279
 */
 
280
/**
 
281
 * convert the thread to os specific type from apr type.
 
282
 * @param thethd The apr thread to convert
 
283
 * @param thd The os specific thread we are converting to
 
284
 */
 
285
APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, 
 
286
                                            apr_thread_t *thd);
 
287
 
 
288
/**
 
289
 * convert the thread private memory key to os specific type from an apr type.
 
290
 * @param thekey The apr handle we are converting from.
 
291
 * @param key The os specific handle we are converting to.
 
292
 */
 
293
APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey,
 
294
                                               apr_threadkey_t *key);
 
295
 
 
296
/**
 
297
 * convert the thread from os specific type to apr type.
 
298
 * @param thd The apr thread we are converting to.
 
299
 * @param thethd The os specific thread to convert
 
300
 * @param cont The pool to use if it is needed.
 
301
 */
 
302
APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd,
 
303
                                            apr_os_thread_t *thethd,
 
304
                                            apr_pool_t *cont);
 
305
 
 
306
/**
 
307
 * convert the thread private memory key from os specific type to apr type.
 
308
 * @param key The apr handle we are converting to.
 
309
 * @param thekey The os specific handle to convert
 
310
 * @param cont The pool to use if it is needed.
 
311
 */
 
312
APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key,
 
313
                                               apr_os_threadkey_t *thekey,
 
314
                                               apr_pool_t *cont);
 
315
/**
 
316
 * Get the thread ID
 
317
 */
 
318
APR_DECLARE(apr_os_thread_t) apr_os_thread_current(void);
 
319
 
 
320
/**
 
321
 * Compare two thread id's
 
322
 * @param tid1 1st Thread ID to compare
 
323
 * @param tid2 2nd Thread ID to compare
 
324
 */ 
 
325
APR_DECLARE(int) apr_os_thread_equal(apr_os_thread_t tid1, 
 
326
                                     apr_os_thread_t tid2);
 
327
 
 
328
/** @} */
 
329
#endif /* APR_HAS_THREADS */
 
330
 
 
331
/**
 
332
 * convert the file from os specific type to apr type.
 
333
 * @param file The apr file we are converting to.
 
334
 * @param thefile The os specific file to convert
 
335
 * @param flags The flags that were used to open this file.
 
336
 * @param cont The pool to use if it is needed.
 
337
 * @remark On Unix, it is only possible to put a file descriptor into
 
338
 *         an apr file type.
 
339
 */
 
340
APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file,
 
341
                                          apr_os_file_t *thefile,
 
342
                                          apr_int32_t flags, apr_pool_t *cont); 
 
343
 
 
344
/**
 
345
 * convert the file from os specific type to apr type.
 
346
 * @param file The apr file we are converting to.
 
347
 * @param thefile The os specific pipe to convert
 
348
 * @param cont The pool to use if it is needed.
 
349
 * @remark On Unix, it is only possible to put a file descriptor into
 
350
 *         an apr file type.
 
351
 */
 
352
APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file,
 
353
                                          apr_os_file_t *thefile,
 
354
                                          apr_pool_t *cont);
 
355
 
 
356
/**
 
357
 * convert the file from os specific type to apr type.
 
358
 * @param file The apr file we are converting to.
 
359
 * @param thefile The os specific pipe to convert
 
360
 * @param register_cleanup A cleanup will be registered on the apr_file_t
 
361
 *   to issue apr_file_close().
 
362
 * @param cont The pool to use if it is needed.
 
363
 * @remark On Unix, it is only possible to put a file descriptor into
 
364
 *         an apr file type.
 
365
 */
 
366
APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file,
 
367
                                             apr_os_file_t *thefile,
 
368
                                             int register_cleanup,
 
369
                                             apr_pool_t *cont);
 
370
 
 
371
/**
 
372
 * convert the dir from os specific type to apr type.
 
373
 * @param dir The apr dir we are converting to.
 
374
 * @param thedir The os specific dir to convert
 
375
 * @param cont The pool to use when creating to apr directory.
 
376
 */
 
377
APR_DECLARE(apr_status_t) apr_os_dir_put(apr_dir_t **dir,
 
378
                                         apr_os_dir_t *thedir,
 
379
                                         apr_pool_t *cont); 
 
380
 
 
381
/**
 
382
 * Convert a socket from the os specific type to the apr type
 
383
 * @param sock The pool to use.
 
384
 * @param thesock The socket to convert to.
 
385
 * @param cont The socket we are converting to an apr type.
 
386
 * @remark If it is a true socket, it is best to call apr_os_sock_make()
 
387
 *         and provide APR with more information about the socket.
 
388
 */
 
389
APR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock, 
 
390
                                          apr_os_sock_t *thesock, 
 
391
                                          apr_pool_t *cont);
 
392
 
 
393
/**
 
394
 * Create a socket from an existing descriptor and local and remote
 
395
 * socket addresses.
 
396
 * @param apr_sock The new socket that has been set up
 
397
 * @param os_sock_info The os representation of the socket handle and
 
398
 *        other characteristics of the socket
 
399
 * @param cont The pool to use
 
400
 * @remark If you only know the descriptor/handle or if it isn't really
 
401
 *         a true socket, use apr_os_sock_put() instead.
 
402
 */
 
403
APR_DECLARE(apr_status_t) apr_os_sock_make(apr_socket_t **apr_sock,
 
404
                                           apr_os_sock_info_t *os_sock_info,
 
405
                                           apr_pool_t *cont);
 
406
 
 
407
/**
 
408
 * Convert the proc mutex from os specific type to apr type
 
409
 * @param pmutex The apr proc mutex we are converting to.
 
410
 * @param ospmutex The os specific proc mutex to convert.
 
411
 * @param cont The pool to use if it is needed.
 
412
 */
 
413
APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex,
 
414
                                                apr_os_proc_mutex_t *ospmutex,
 
415
                                                apr_pool_t *cont); 
 
416
 
 
417
/**
 
418
 * Put the imploded time in the APR format.
 
419
 * @param aprtime the APR time format
 
420
 * @param ostime the time to convert
 
421
 * @param cont the pool to use if necessary
 
422
 */
 
423
APR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime,
 
424
                                              apr_os_imp_time_t **ostime,
 
425
                                              apr_pool_t *cont); 
 
426
 
 
427
/**
 
428
 * Put the exploded time in the APR format.
 
429
 * @param aprtime the APR time format
 
430
 * @param ostime the time to convert
 
431
 * @param cont the pool to use if necessary
 
432
 */
 
433
APR_DECLARE(apr_status_t) apr_os_exp_time_put(apr_time_exp_t *aprtime,
 
434
                                              apr_os_exp_time_t **ostime,
 
435
                                              apr_pool_t *cont); 
 
436
 
 
437
/**
 
438
 * convert the shared memory from os specific type to apr type.
 
439
 * @param shm The apr shm representation of osshm
 
440
 * @param osshm The os specific shm identity
 
441
 * @param cont The pool to use if it is needed.
 
442
 * @remark On fork()ed architectures, this is typically nothing more than
 
443
 * the memory block mapped.  On non-fork architectures, this is typically
 
444
 * some internal handle to pass the mapping from process to process.
 
445
 */
 
446
APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **shm,
 
447
                                         apr_os_shm_t *osshm,
 
448
                                         apr_pool_t *cont); 
 
449
 
 
450
 
 
451
#if APR_HAS_DSO || defined(DOXYGEN)
 
452
/** 
 
453
 * @defgroup apr_os_dso DSO (Dynamic Loading) Portabiliity Routines
 
454
 * @{
 
455
 */
 
456
/**
 
457
 * convert the dso handle from os specific to apr
 
458
 * @param dso The apr handle we are converting to
 
459
 * @param thedso the os specific handle to convert
 
460
 * @param pool the pool to use if it is needed
 
461
 */
 
462
APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **dso,
 
463
                                                apr_os_dso_handle_t thedso,
 
464
                                                apr_pool_t *pool);
 
465
 
 
466
/**
 
467
 * convert the apr dso handle into an os specific one
 
468
 * @param aprdso The apr dso handle to convert
 
469
 * @param dso The os specific dso to return
 
470
 */
 
471
APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *dso,
 
472
                                                apr_dso_handle_t *aprdso);
 
473
 
 
474
#if APR_HAS_OS_UUID
 
475
/**
 
476
 * Private: apr-util's apr_uuid module when supported by the platform
 
477
 */
 
478
APR_DECLARE(apr_status_t) apr_os_uuid_get(unsigned char *uuid_data);
 
479
#endif
 
480
 
 
481
/** @} */
 
482
#endif /* APR_HAS_DSO */
 
483
 
 
484
 
 
485
/**
 
486
 * Get the name of the system default characer set.
 
487
 * @param pool the pool to allocate the name from, if needed
 
488
 */
 
489
APR_DECLARE(const char*) apr_os_default_encoding(apr_pool_t *pool);
 
490
 
 
491
 
 
492
/**
 
493
 * Get the name of the current locale character set.
 
494
 * @param pool the pool to allocate the name from, if needed
 
495
 * @remark Defers to apr_os_default_encoding if the current locale's
 
496
 * data can't be retreved on this system.
 
497
 */
 
498
APR_DECLARE(const char*) apr_os_locale_encoding(apr_pool_t *pool);
 
499
 
 
500
/** @} */
 
501
 
 
502
#ifdef __cplusplus
 
503
}
 
504
#endif
 
505
 
 
506
#endif  /* ! APR_PORTABLE_H */