bottleneck testcase based on rubbos
[bottlenecks.git] / rubbos / app / httpd-2.0.64 / os / beos / beosd.c
1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2  * contributor license agreements.  See the NOTICE file distributed with
3  * this work for additional information regarding copyright ownership.
4  * The ASF licenses this file to You under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with
6  * the License.  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 #include <unistd.h>
18 #include "httpd.h"
19 #include "http_config.h"
20 #include "http_main.h"
21 #include "http_log.h"
22 #include "beosd.h"
23 #include "mpm_common.h"
24
25 beosd_config_rec beosd_config;
26
27 /* Set group privileges.
28  *
29  * Note that until we get the multi-user situation sorted on beos,
30  * this is just a no-op to allow common configuration files!
31  */
32
33 #if B_BEOS_VERSION < 0x0460
34 static int set_group_privs(void)
35 {
36     /* no-op */
37     return 0;
38 }
39 #endif
40
41
42 int beosd_setup_child(void)
43 {
44     /* TODO: revisit the whole issue of users/groups for BeOS as
45      * R5 and below doesn't really have much concept of them.
46      */
47
48     return 0;
49 }
50
51
52 AP_DECLARE(const char *) beosd_set_user(cmd_parms *cmd, 
53                                         void *dummy, const char *arg)
54 {
55     /* no-op */
56     return NULL;
57 }
58
59 AP_DECLARE(const char *) beosd_set_group(cmd_parms *cmd, 
60                                          void *dummy, const char *arg)
61 {
62     /* no-op */
63     return NULL;
64 }
65
66 void beosd_pre_config(void)
67 {
68     /* Until the multi-user situation on BeOS is fixed,
69        simply have a no-op here to allow for common conf files
70      */
71 }
72
73 AP_DECLARE(apr_status_t) beosd_accept(void **accepted, ap_listen_rec *lr,
74                                       apr_pool_t *ptrans)
75 {
76     apr_socket_t *csd;
77     apr_status_t status;
78     int sockdes;
79
80     status = apr_accept(&csd, lr->sd, ptrans);
81     if (status == APR_SUCCESS) { 
82         *accepted = csd;
83         apr_os_sock_get(&sockdes, csd);
84         if (sockdes >= FD_SETSIZE) {
85             ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL,
86                          "new file descriptor %d is too large; you probably need "
87                          "to rebuild Apache with a larger FD_SETSIZE "
88                          "(currently %d)",
89                          sockdes, FD_SETSIZE);
90             apr_socket_close(csd);
91             return APR_EINTR;
92         } 
93         return status;
94     }
95
96     if (APR_STATUS_IS_EINTR(status)) {
97         return status;
98     }
99     /* Our old behaviour here was to continue after accept()
100      * errors.  But this leads us into lots of troubles
101      * because most of the errors are quite fatal.  For
102      * example, EMFILE can be caused by slow descriptor
103      * leaks (say in a 3rd party module, or libc).  It's
104      * foolish for us to continue after an EMFILE.  We also
105      * seem to tickle kernel bugs on some platforms which
106      * lead to never-ending loops here.  So it seems best
107      * to just exit in most cases.
108      */
109     switch (status) {
110 #ifdef EPROTO
111         /* EPROTO on certain older kernels really means
112          * ECONNABORTED, so we need to ignore it for them.
113          * See discussion in new-httpd archives nh.9701
114          * search for EPROTO.
115          *
116          * Also see nh.9603, search for EPROTO:
117          * There is potentially a bug in Solaris 2.x x<6,
118          * and other boxes that implement tcp sockets in
119          * userland (i.e. on top of STREAMS).  On these
120          * systems, EPROTO can actually result in a fatal
121          * loop.  See PR#981 for example.  It's hard to
122          * handle both uses of EPROTO.
123          */
124         case EPROTO:
125 #endif
126 #ifdef ECONNABORTED
127         case ECONNABORTED:
128 #endif
129 #ifdef ETIMEDOUT
130         case ETIMEDOUT:
131 #endif
132 #ifdef EHOSTUNREACH
133         case EHOSTUNREACH:
134 #endif
135 #ifdef ENETUNREACH
136         case ENETUNREACH:
137 #endif
138             break;
139 #ifdef ENETDOWN
140         case ENETDOWN:
141             /*
142              * When the network layer has been shut down, there
143              * is not much use in simply exiting: the parent
144              * would simply re-create us (and we'd fail again).
145              * Use the CHILDFATAL code to tear the server down.
146              * @@@ Martin's idea for possible improvement:
147              * A different approach would be to define
148              * a new APEXIT_NETDOWN exit code, the reception
149              * of which would make the parent shutdown all
150              * children, then idle-loop until it detected that
151              * the network is up again, and restart the children.
152              * Ben Hyde noted that temporary ENETDOWN situations
153              * occur in mobile IP.
154              */
155             ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf,
156                          "apr_accept: giving up.");
157             return APR_EGENERAL;
158 #endif /*ENETDOWN*/
159
160         default:
161             ap_log_error(APLOG_MARK, APLOG_ERR, status, ap_server_conf,
162                          "apr_accept: (client socket)");
163             return APR_EGENERAL;
164     }
165     return status;
166 }