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

« back to all changes in this revision

Viewing changes to srclib/apr/include/apr_file_info.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
#ifndef APR_FILE_INFO_H
 
18
#define APR_FILE_INFO_H
 
19
 
 
20
/**
 
21
 * @file apr_file_info.h
 
22
 * @brief APR File Information
 
23
 */
 
24
 
 
25
#include "apr.h"
 
26
#include "apr_user.h"
 
27
#include "apr_pools.h"
 
28
#include "apr_tables.h"
 
29
#include "apr_time.h"
 
30
#include "apr_errno.h"
 
31
 
 
32
#if APR_HAVE_SYS_UIO_H
 
33
#include <sys/uio.h>
 
34
#endif
 
35
 
 
36
#ifdef __cplusplus
 
37
extern "C" {
 
38
#endif /* __cplusplus */
 
39
 
 
40
/**
 
41
 * @defgroup apr_file_info File Information
 
42
 * @ingroup APR 
 
43
 * @{
 
44
 */
 
45
 
 
46
/* Many applications use the type member to determine the
 
47
 * existance of a file or initialization of the file info,
 
48
 * so the APR_NOFILE value must be distinct from APR_UNKFILE.
 
49
 */
 
50
 
 
51
/** apr_filetype_e values for the filetype member of the 
 
52
 * apr_file_info_t structure
 
53
 * @warning: Not all of the filetypes below can be determined.
 
54
 * For example, a given platform might not correctly report 
 
55
 * a socket descriptor as APR_SOCK if that type isn't 
 
56
 * well-identified on that platform.  In such cases where
 
57
 * a filetype exists but cannot be described by the recognized
 
58
 * flags below, the filetype will be APR_UNKFILE.  If the
 
59
 * filetype member is not determined, the type will be APR_NOFILE.
 
60
 */
 
61
 
 
62
typedef enum {
 
63
    APR_NOFILE = 0,     /**< no file type determined */
 
64
    APR_REG,            /**< a regular file */
 
65
    APR_DIR,            /**< a directory */
 
66
    APR_CHR,            /**< a character device */
 
67
    APR_BLK,            /**< a block device */
 
68
    APR_PIPE,           /**< a FIFO / pipe */
 
69
    APR_LNK,            /**< a symbolic link */
 
70
    APR_SOCK,           /**< a [unix domain] socket */
 
71
    APR_UNKFILE = 127   /**< a file of some other unknown type */
 
72
} apr_filetype_e; 
 
73
 
 
74
/**
 
75
 * @defgroup apr_file_permissions File Permissions flags 
 
76
 * @{
 
77
 */
 
78
 
 
79
#define APR_FPROT_USETID      0x8000 /**< Set user id */
 
80
#define APR_FPROT_UREAD       0x0400 /**< Read by user */
 
81
#define APR_FPROT_UWRITE      0x0200 /**< Write by user */
 
82
#define APR_FPROT_UEXECUTE    0x0100 /**< Execute by user */
 
83
 
 
84
#define APR_FPROT_GSETID      0x4000 /**< Set group id */
 
85
#define APR_FPROT_GREAD       0x0040 /**< Read by group */
 
86
#define APR_FPROT_GWRITE      0x0020 /**< Write by group */
 
87
#define APR_FPROT_GEXECUTE    0x0010 /**< Execute by group */
 
88
 
 
89
#define APR_FPROT_WSTICKY     0x2000 /**< Sticky bit */
 
90
#define APR_FPROT_WREAD       0x0004 /**< Read by others */
 
91
#define APR_FPROT_WWRITE      0x0002 /**< Write by others */
 
92
#define APR_FPROT_WEXECUTE    0x0001 /**< Execute by others */
 
93
 
 
94
#define APR_FPROT_OS_DEFAULT  0x0FFF /**< use OS's default permissions */
 
95
 
 
96
/* additional permission flags for apr_file_copy  and apr_file_append */
 
97
#define APR_FPROT_FILE_SOURCE_PERMS 0x1000 /**< Copy source file's permissions */
 
98
    
 
99
/* backcompat */
 
100
#define APR_USETID     APR_FPROT_USETID     /**< @deprecated @see APR_FPROT_USETID     */
 
101
#define APR_UREAD      APR_FPROT_UREAD      /**< @deprecated @see APR_FPROT_UREAD      */
 
102
#define APR_UWRITE     APR_FPROT_UWRITE     /**< @deprecated @see APR_FPROT_UWRITE     */
 
103
#define APR_UEXECUTE   APR_FPROT_UEXECUTE   /**< @deprecated @see APR_FPROT_UEXECUTE   */
 
104
#define APR_GSETID     APR_FPROT_GSETID     /**< @deprecated @see APR_FPROT_GSETID     */
 
105
#define APR_GREAD      APR_FPROT_GREAD      /**< @deprecated @see APR_FPROT_GREAD      */
 
106
#define APR_GWRITE     APR_FPROT_GWRITE     /**< @deprecated @see APR_FPROT_GWRITE     */
 
107
#define APR_GEXECUTE   APR_FPROT_GEXECUTE   /**< @deprecated @see APR_FPROT_GEXECUTE   */
 
108
#define APR_WSTICKY    APR_FPROT_WSTICKY    /**< @deprecated @see APR_FPROT_WSTICKY    */
 
109
#define APR_WREAD      APR_FPROT_WREAD      /**< @deprecated @see APR_FPROT_WREAD      */
 
110
#define APR_WWRITE     APR_FPROT_WWRITE     /**< @deprecated @see APR_FPROT_WWRITE     */
 
111
#define APR_WEXECUTE   APR_FPROT_WEXECUTE   /**< @deprecated @see APR_FPROT_WEXECUTE   */
 
112
#define APR_OS_DEFAULT APR_FPROT_OS_DEFAULT /**< @deprecated @see APR_FPROT_OS_DEFAULT */
 
113
#define APR_FILE_SOURCE_PERMS APR_FPROT_FILE_SOURCE_PERMS /**< @deprecated @see APR_FPROT_FILE_SOURCE_PERMS */
 
114
    
 
115
/** @} */
 
116
 
 
117
 
 
118
/**
 
119
 * Structure for referencing directories.
 
120
 */
 
121
typedef struct apr_dir_t          apr_dir_t;
 
122
/**
 
123
 * Structure for determining file permissions.
 
124
 */
 
125
typedef apr_int32_t               apr_fileperms_t;
 
126
#if (defined WIN32) || (defined NETWARE)
 
127
/**
 
128
 * Structure for determining the inode of the file.
 
129
 */
 
130
typedef apr_uint64_t              apr_ino_t;
 
131
/**
 
132
 * Structure for determining the device the file is on.
 
133
 */
 
134
typedef apr_uint32_t              apr_dev_t;
 
135
#else
 
136
/** The inode of the file. */
 
137
typedef ino_t                     apr_ino_t;
 
138
/**
 
139
 * Structure for determining the device the file is on.
 
140
 */
 
141
typedef dev_t                     apr_dev_t;
 
142
#endif
 
143
 
 
144
/**
 
145
 * @defgroup apr_file_stat Stat Functions
 
146
 * @{
 
147
 */
 
148
/** file info structure */
 
149
typedef struct apr_finfo_t        apr_finfo_t;
 
150
 
 
151
#define APR_FINFO_LINK   0x00000001 /**< Stat the link not the file itself if it is a link */
 
152
#define APR_FINFO_MTIME  0x00000010 /**< Modification Time */
 
153
#define APR_FINFO_CTIME  0x00000020 /**< Creation or inode-changed time */
 
154
#define APR_FINFO_ATIME  0x00000040 /**< Access Time */
 
155
#define APR_FINFO_SIZE   0x00000100 /**< Size of the file */
 
156
#define APR_FINFO_CSIZE  0x00000200 /**< Storage size consumed by the file */
 
157
#define APR_FINFO_DEV    0x00001000 /**< Device */
 
158
#define APR_FINFO_INODE  0x00002000 /**< Inode */
 
159
#define APR_FINFO_NLINK  0x00004000 /**< Number of links */
 
160
#define APR_FINFO_TYPE   0x00008000 /**< Type */
 
161
#define APR_FINFO_USER   0x00010000 /**< User */
 
162
#define APR_FINFO_GROUP  0x00020000 /**< Group */
 
163
#define APR_FINFO_UPROT  0x00100000 /**< User protection bits */
 
164
#define APR_FINFO_GPROT  0x00200000 /**< Group protection bits */
 
165
#define APR_FINFO_WPROT  0x00400000 /**< World protection bits */
 
166
#define APR_FINFO_ICASE  0x01000000 /**< if dev is case insensitive */
 
167
#define APR_FINFO_NAME   0x02000000 /**< ->name in proper case */
 
168
 
 
169
#define APR_FINFO_MIN    0x00008170 /**< type, mtime, ctime, atime, size */
 
170
#define APR_FINFO_IDENT  0x00003000 /**< dev and inode */
 
171
#define APR_FINFO_OWNER  0x00030000 /**< user and group */
 
172
#define APR_FINFO_PROT   0x00700000 /**<  all protections */
 
173
#define APR_FINFO_NORM   0x0073b170 /**<  an atomic unix apr_stat() */
 
174
#define APR_FINFO_DIRENT 0x02000000 /**<  an atomic unix apr_dir_read() */
 
175
 
 
176
/**
 
177
 * The file information structure.  This is analogous to the POSIX
 
178
 * stat structure.
 
179
 */
 
180
struct apr_finfo_t {
 
181
    /** Allocates memory and closes lingering handles in the specified pool */
 
182
    apr_pool_t *pool;
 
183
    /** The bitmask describing valid fields of this apr_finfo_t structure 
 
184
     *  including all available 'wanted' fields and potentially more */
 
185
    apr_int32_t valid;
 
186
    /** The access permissions of the file.  Mimics Unix access rights. */
 
187
    apr_fileperms_t protection;
 
188
    /** The type of file.  One of APR_REG, APR_DIR, APR_CHR, APR_BLK, APR_PIPE, 
 
189
     * APR_LNK or APR_SOCK.  If the type is undetermined, the value is APR_NOFILE.
 
190
     * If the type cannot be determined, the value is APR_UNKFILE.
 
191
     */
 
192
    apr_filetype_e filetype;
 
193
    /** The user id that owns the file */
 
194
    apr_uid_t user;
 
195
    /** The group id that owns the file */
 
196
    apr_gid_t group;
 
197
    /** The inode of the file. */
 
198
    apr_ino_t inode;
 
199
    /** The id of the device the file is on. */
 
200
    apr_dev_t device;
 
201
    /** The number of hard links to the file. */
 
202
    apr_int32_t nlink;
 
203
    /** The size of the file */
 
204
    apr_off_t size;
 
205
    /** The storage size consumed by the file */
 
206
    apr_off_t csize;
 
207
    /** The time the file was last accessed */
 
208
    apr_time_t atime;
 
209
    /** The time the file was last modified */
 
210
    apr_time_t mtime;
 
211
    /** The time the file was created, or the inode was last changed */
 
212
    apr_time_t ctime;
 
213
    /** The pathname of the file (possibly unrooted) */
 
214
    const char *fname;
 
215
    /** The file's name (no path) in filesystem case */
 
216
    const char *name;
 
217
    /** The file's handle, if accessed (can be submitted to apr_duphandle) */
 
218
    struct apr_file_t *filehand;
 
219
};
 
220
 
 
221
/**
 
222
 * get the specified file's stats.  The file is specified by filename, 
 
223
 * instead of using a pre-opened file.
 
224
 * @param finfo Where to store the information about the file, which is
 
225
 * never touched if the call fails.
 
226
 * @param fname The name of the file to stat.
 
227
 * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_
 
228
                 values 
 
229
 * @param pool the pool to use to allocate the new file. 
 
230
 *
 
231
 * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may
 
232
 *       not be filled in, and you need to check the @c finfo->valid bitmask
 
233
 *       to verify that what you're looking for is there.
 
234
 */ 
 
235
APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, const char *fname,
 
236
                                   apr_int32_t wanted, apr_pool_t *pool);
 
237
 
 
238
/** @} */
 
239
/**
 
240
 * @defgroup apr_dir Directory Manipulation Functions
 
241
 * @{
 
242
 */
 
243
 
 
244
/**
 
245
 * Open the specified directory.
 
246
 * @param new_dir The opened directory descriptor.
 
247
 * @param dirname The full path to the directory (use / on all systems)
 
248
 * @param pool The pool to use.
 
249
 */                        
 
250
APR_DECLARE(apr_status_t) apr_dir_open(apr_dir_t **new_dir, 
 
251
                                       const char *dirname, 
 
252
                                       apr_pool_t *pool);
 
253
 
 
254
/**
 
255
 * close the specified directory. 
 
256
 * @param thedir the directory descriptor to close.
 
257
 */                        
 
258
APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *thedir);
 
259
 
 
260
/**
 
261
 * Read the next entry from the specified directory. 
 
262
 * @param finfo the file info structure and filled in by apr_dir_read
 
263
 * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_
 
264
                 values 
 
265
 * @param thedir the directory descriptor returned from apr_dir_open
 
266
 * @remark No ordering is guaranteed for the entries read.
 
267
 *
 
268
 * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may
 
269
 *       not be filled in, and you need to check the @c finfo->valid bitmask
 
270
 *       to verify that what you're looking for is there.
 
271
 */                        
 
272
APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted,
 
273
                                       apr_dir_t *thedir);
 
274
 
 
275
/**
 
276
 * Rewind the directory to the first entry.
 
277
 * @param thedir the directory descriptor to rewind.
 
278
 */                        
 
279
APR_DECLARE(apr_status_t) apr_dir_rewind(apr_dir_t *thedir);
 
280
/** @} */
 
281
 
 
282
/**
 
283
 * @defgroup apr_filepath Filepath Manipulation Functions
 
284
 * @{
 
285
 */
 
286
 
 
287
/** Cause apr_filepath_merge to fail if addpath is above rootpath */
 
288
#define APR_FILEPATH_NOTABOVEROOT   0x01
 
289
 
 
290
/** internal: Only meaningful with APR_FILEPATH_NOTABOVEROOT */
 
291
#define APR_FILEPATH_SECUREROOTTEST 0x02
 
292
 
 
293
/** Cause apr_filepath_merge to fail if addpath is above rootpath,
 
294
 * even given a rootpath /foo/bar and an addpath ../bar/bash
 
295
 */
 
296
#define APR_FILEPATH_SECUREROOT     0x03
 
297
 
 
298
/** Fail apr_filepath_merge if the merged path is relative */
 
299
#define APR_FILEPATH_NOTRELATIVE    0x04
 
300
 
 
301
/** Fail apr_filepath_merge if the merged path is absolute */
 
302
#define APR_FILEPATH_NOTABSOLUTE    0x08
 
303
 
 
304
/** Return the file system's native path format (e.g. path delimiters
 
305
 * of ':' on MacOS9, '\' on Win32, etc.) */
 
306
#define APR_FILEPATH_NATIVE         0x10
 
307
 
 
308
/** Resolve the true case of existing directories and file elements
 
309
 * of addpath, (resolving any aliases on Win32) and append a proper 
 
310
 * trailing slash if a directory
 
311
 */
 
312
#define APR_FILEPATH_TRUENAME       0x20
 
313
 
 
314
/**
 
315
 * Extract the rootpath from the given filepath
 
316
 * @param rootpath the root file path returned with APR_SUCCESS or APR_EINCOMPLETE
 
317
 * @param filepath the pathname to parse for its root component
 
318
 * @param flags the desired rules to apply, from
 
319
 * <PRE>
 
320
 *      APR_FILEPATH_NATIVE    Use native path seperators (e.g. '\' on Win32)
 
321
 *      APR_FILEPATH_TRUENAME  Tests that the root exists, and makes it proper
 
322
 * </PRE>
 
323
 * @param p the pool to allocate the new path string from
 
324
 * @remark on return, filepath points to the first non-root character in the
 
325
 * given filepath.  In the simplest example, given a filepath of "/foo", 
 
326
 * returns the rootpath of "/" and filepath points at "foo".  This is far 
 
327
 * more complex on other platforms, which will canonicalize the root form
 
328
 * to a consistant format, given the APR_FILEPATH_TRUENAME flag, and also
 
329
 * test for the validity of that root (e.g., that a drive d:/ or network 
 
330
 * share //machine/foovol/). 
 
331
 * The function returns APR_ERELATIVE if filepath isn't rooted (an
 
332
 * error), APR_EINCOMPLETE if the root path is ambigious (but potentially
 
333
 * legitimate, e.g. "/" on Windows is incomplete because it doesn't specify
 
334
 * the drive letter), or APR_EBADPATH if the root is simply invalid.
 
335
 * APR_SUCCESS is returned if filepath is an absolute path.
 
336
 */
 
337
APR_DECLARE(apr_status_t) apr_filepath_root(const char **rootpath, 
 
338
                                            const char **filepath, 
 
339
                                            apr_int32_t flags,
 
340
                                            apr_pool_t *p);
 
341
 
 
342
/**
 
343
 * Merge additional file path onto the previously processed rootpath
 
344
 * @param newpath the merged paths returned
 
345
 * @param rootpath the root file path (NULL uses the current working path)
 
346
 * @param addpath the path to add to the root path
 
347
 * @param flags the desired APR_FILEPATH_ rules to apply when merging
 
348
 * @param p the pool to allocate the new path string from
 
349
 * @remark if the flag APR_FILEPATH_TRUENAME is given, and the addpath 
 
350
 * contains wildcard characters ('*', '?') on platforms that don't support 
 
351
 * such characters within filenames, the paths will be merged, but the 
 
352
 * result code will be APR_EPATHWILD, and all further segments will not
 
353
 * reflect the true filenames including the wildcard and following segments.
 
354
 */                        
 
355
APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, 
 
356
                                             const char *rootpath,
 
357
                                             const char *addpath, 
 
358
                                             apr_int32_t flags,
 
359
                                             apr_pool_t *p);
 
360
 
 
361
/**
 
362
 * Split a search path into separate components
 
363
 * @param pathelts the returned components of the search path
 
364
 * @param liststr the search path (e.g., <tt>getenv("PATH")</tt>)
 
365
 * @param p the pool to allocate the array and path components from
 
366
 * @remark empty path componenta do not become part of @a pathelts.
 
367
 * @remark the path separator in @a liststr is system specific;
 
368
 * e.g., ':' on Unix, ';' on Windows, etc.
 
369
 */
 
370
APR_DECLARE(apr_status_t) apr_filepath_list_split(apr_array_header_t **pathelts,
 
371
                                                  const char *liststr,
 
372
                                                  apr_pool_t *p);
 
373
 
 
374
/**
 
375
 * Merge a list of search path components into a single search path
 
376
 * @param liststr the returned search path; may be NULL if @a pathelts is empty
 
377
 * @param pathelts the components of the search path
 
378
 * @param p the pool to allocate the search path from
 
379
 * @remark emtpy strings in the source array are ignored.
 
380
 * @remark the path separator in @a liststr is system specific;
 
381
 * e.g., ':' on Unix, ';' on Windows, etc.
 
382
 */
 
383
APR_DECLARE(apr_status_t) apr_filepath_list_merge(char **liststr,
 
384
                                                  apr_array_header_t *pathelts,
 
385
                                                  apr_pool_t *p);
 
386
 
 
387
/**
 
388
 * Return the default file path (for relative file names)
 
389
 * @param path the default path string returned
 
390
 * @param flags optional flag APR_FILEPATH_NATIVE to retrieve the
 
391
 *              default file path in os-native format.
 
392
 * @param p the pool to allocate the default path string from
 
393
 */
 
394
APR_DECLARE(apr_status_t) apr_filepath_get(char **path, apr_int32_t flags,
 
395
                                           apr_pool_t *p);
 
396
 
 
397
/**
 
398
 * Set the default file path (for relative file names)
 
399
 * @param path the default path returned
 
400
 * @param p the pool to allocate any working storage
 
401
 */
 
402
APR_DECLARE(apr_status_t) apr_filepath_set(const char *path, apr_pool_t *p);
 
403
 
 
404
/** The FilePath character encoding is unknown */
 
405
#define APR_FILEPATH_ENCODING_UNKNOWN  0
 
406
 
 
407
/** The FilePath character encoding is locale-dependent */
 
408
#define APR_FILEPATH_ENCODING_LOCALE   1
 
409
 
 
410
/** The FilePath character encoding is UTF-8 */
 
411
#define APR_FILEPATH_ENCODING_UTF8     2
 
412
 
 
413
/**
 
414
 * Determine the encoding used internally by the FilePath functions
 
415
 * @param style points to a variable which receives the encoding style flag
 
416
 * @param p the pool to allocate any working storage
 
417
 * @remark Use @c apr_os_locale_encoding and/or @c apr_os_default_encoding
 
418
 * to get the name of the path encoding if it's not UTF-8.
 
419
 */
 
420
APR_DECLARE(apr_status_t) apr_filepath_encoding(int *style, apr_pool_t *p);
 
421
/** @} */
 
422
 
 
423
/** @} */
 
424
 
 
425
#ifdef __cplusplus
 
426
}
 
427
#endif
 
428
 
 
429
#endif  /* ! APR_FILE_INFO_H */