1 /* ====================================================================
2 * The Apache Software License, Version 1.1
4 * Copyright (c) 2000 The Apache Software Foundation. All rights
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
19 * 3. The end-user documentation included with the redistribution,
20 * if any, must include the following acknowledgment:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowledgment may appear in the software itself,
24 * if and wherever such third-party acknowledgments normally appear.
26 * 4. The names "Apache" and "Apache Software Foundation" must
27 * not be used to endorse or promote products derived from this
28 * software without prior written permission. For written
29 * permission, please contact apache@apache.org.
31 * 5. Products derived from this software may not be called "Apache",
32 * nor may "Apache" appear in their name, without prior written
33 * permission of the Apache Software Foundation.
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47 * ====================================================================
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
54 * Portions of this software are based upon public domain software
55 * originally written at the National Center for Supercomputing Applications,
56 * University of Illinois, Urbana-Champaign.
60 #define INCL_DOSERRORS
62 #include "ap_config.h"
67 #include <sys/signal.h>
72 AP_DECLARE(char *)ap_os_case_canonical_filename(apr_pool_t *pPool, const char *szFile)
74 char buf[HUGE_STRING_LEN];
75 char buf2[HUGE_STRING_LEN];
79 /* Remove trailing slash unless it's a root directory */
83 if (len > 3 && buf[len-1] == '/')
86 rc = DosQueryPathInfo(buf, FIL_QUERYFULLNAME, buf2, HUGE_STRING_LEN);
89 if (rc != ERROR_INVALID_NAME) {
90 ap_log_error(APLOG_MARK, APLOG_ERR, APR_OS2_STATUS(rc), NULL, "for file [%s]", szFile);
92 apr_cpystrn(buf2, buf, sizeof(buf2));
95 /* Switch backslashes to forward */
96 for (pos=buf2; *pos; pos++)
100 return apr_pstrdup(pPool, buf2);
105 static void fix_component(char *path, char *lastcomp)
108 HDIR hDir = HDIR_CREATE;
110 ULONG rc = DosFindFirst( (UCHAR *)path, &hDir, FILE_NORMAL|FILE_DIRECTORY, &fb3, sizeof(fb3), &numNames, FIL_STANDARD );
113 strcpy(lastcomp, fb3.achName);
120 char *ap_os_systemcase_canonical_filename(apr_pool_t *pPool, const char *szFile)
122 char *szCanonicalFile = ap_os_case_canonical_filename(pPool, szFile);
123 int startslash = 2, slashnum=0;
124 char *pos, *prevslash = NULL;
126 if (szCanonicalFile[0] == '/' && szCanonicalFile[1] == '/') /* a UNC name */
129 for (pos = szCanonicalFile; *pos; pos++) {
132 if (slashnum >= startslash) {
134 fix_component(szCanonicalFile, prevslash+1);
141 if (slashnum >= startslash) {
142 fix_component(szCanonicalFile, prevslash+1);
145 return szCanonicalFile;
150 char *ap_os_canonical_filename(apr_pool_t *pPool, const char *szFile)
152 char *szCanonicalFile;
153 const unsigned char *pos = szFile;
155 /* Find any 8 bit characters */
156 while (*pos && *pos < 128) {
160 /* Only use the very expensive ap_os_systemcase_canonical_filename() if
161 * the file name contains non-english characters as they are the only type
162 * that can't be made canonical with a simple strlwr()
165 szCanonicalFile = ap_os_case_canonical_filename(pPool, szFile);
167 szCanonicalFile = ap_os_systemcase_canonical_filename(pPool, szFile);
170 strlwr(szCanonicalFile);
171 return szCanonicalFile;
174 AP_DECLARE(apr_status_t) ap_os_create_privileged_process(
175 const request_rec *r,
176 apr_proc_t *newproc, const char *progname,
177 const char * const *args,
178 const char * const *env,
179 apr_procattr_t *attr, apr_pool_t *p)
181 return apr_create_process(newproc, progname, args, env, attr, p);