1 /* ====================================================================
2 * The Apache Software License, Version 1.1
4 * Copyright (c) 2000-2003 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 * This file will include OS specific functions which are not inlineable.
61 * Any inlineable functions should be defined in os-inline.c instead.
69 #include "http_config.h"
77 bs2_unknown, /* not initialized yet. */
78 bs2_noFORK, /* no fork() because -X flag was specified */
79 bs2_FORK, /* only fork() because uid != 0 */
80 bs2_UFORK /* Normally, ufork() is used to switch identities. */
83 static bs2_ForkType forktype = bs2_unknown;
86 static void ap_str_toupper(char *str)
89 *str = apr_toupper(*str);
94 /* Determine the method for forking off a child in such a way as to
95 * set both the POSIX and BS2000 user id's to the unprivileged user.
97 static bs2_ForkType os_forktype(int one_process)
99 /* have we checked the OS version before? If yes return the previous
100 * result - the OS release isn't going to change suddenly!
102 if (forktype == bs2_unknown) {
103 /* not initialized yet */
105 /* No fork if the one_process option was set */
107 forktype = bs2_noFORK;
109 /* If the user is unprivileged, use the normal fork() only. */
110 else if (getuid() != 0) {
114 forktype = bs2_UFORK;
121 /* This routine complements the setuid() call: it causes the BS2000 job
122 * environment to be switched to the target user's user id.
123 * That is important if CGI scripts try to execute native BS2000 commands.
125 int os_init_job_environment(server_rec *server, const char *user_name, int one_process)
127 bs2_ForkType type = os_forktype(one_process);
129 /* We can be sure that no change to uid==0 is possible because of
130 * the checks in http_core.c:set_user()
135 type = forktype = bs2_noFORK;
137 ap_log_error(APLOG_MARK, APLOG_ERR, 0, server,
138 "The debug mode of Apache should only "
139 "be started by an unprivileged user!");
146 /* BS2000 requires a "special" version of fork() before a setuid() call */
147 pid_t os_fork(const char *user)
150 char username[USER_LEN+1];
152 switch (os_forktype(0)) {
159 apr_cpystrn(username, user, sizeof username);
161 /* Make user name all upper case - for some versions of ufork() */
162 ap_str_toupper(username);
164 pid = ufork(username);
165 if (pid == -1 && errno == EPERM) {
166 ap_log_error(APLOG_MARK, APLOG_EMERG, errno,
167 NULL, "ufork: Possible mis-configuration "
168 "for user %s - Aborting.", user);
181 #else /* _OSD_POSIX */
182 void bs2000_os_is_not_here()
185 #endif /* _OSD_POSIX */