dreid 99/10/22 04:25:42
Modified: src/os/beos beosd.c iol_socket.c Log: This brings BeOS back up to date with the recent changes. Revision Changes Path 1.4 +4 -4 apache-2.0/src/os/beos/beosd.c Index: beosd.c =================================================================== RCS file: /home/cvs/apache-2.0/src/os/beos/beosd.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- beosd.c 1999/09/07 22:30:59 1.3 +++ beosd.c 1999/10/22 11:25:41 1.4 @@ -131,7 +131,7 @@ uid_t uid = atoi(&beosd_config.user_name[1]); if ((ent = getpwuid(uid)) == NULL) { - ap_log_error(APLOG_MARK, APLOG_ALERT, NULL, + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, "getpwuid: couldn't determine user name from uid %u, " "you probably need to modify the User directive", (unsigned)uid); @@ -144,7 +144,7 @@ name = beosd_config.user_name; if (setgid(beosd_config.group_id) == -1) { - ap_log_error(APLOG_MARK, APLOG_ALERT, NULL, + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, "setgid: unable to set group id to Group %u", (unsigned)beosd_config.group_id); return -1; @@ -153,7 +153,7 @@ /* Reset `groups' attributes. */ if (initgroups(name, beosd_config.group_id) == -1) { - ap_log_error(APLOG_MARK, APLOG_ALERT, NULL, + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, "initgroups: unable to set groups for User %s " "and Group %u", name, (unsigned)beosd_config.group_id); return -1; @@ -172,7 +172,7 @@ /* Only try to switch if we're running as root */ if (!geteuid() && ( setuid(beosd_config.user_id) == -1)) { - ap_log_error(APLOG_MARK, APLOG_ALERT, NULL, + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, "setuid: unable to change uid"); return -1; } 1.2 +55 -36 apache-2.0/src/os/beos/iol_socket.c Index: iol_socket.c =================================================================== RCS file: /home/cvs/apache-2.0/src/os/beos/iol_socket.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- iol_socket.c 1999/07/12 22:51:14 1.1 +++ iol_socket.c 1999/10/22 11:25:42 1.2 @@ -58,6 +58,7 @@ #include "httpd.h" #include "ap_iol.h" +#include "iol_socket.h" #include <errno.h> #include <sys/types.h> @@ -72,7 +73,8 @@ int timeout; } iol_socket; -static int beos_setopt(ap_iol *viol, ap_iol_option opt, const void *value) +static ap_status_t beos_setopt(ap_iol *viol, ap_iol_option opt, + const void *value) { iol_socket *iol = (iol_socket *)viol; @@ -81,13 +83,12 @@ iol->timeout = *(const int *)value; break; default: - errno = EINVAL; - return -1; + return APR_EINVAL; } - return 0; + return APR_SUCCESS; } -static int beos_getopt(ap_iol *viol, ap_iol_option opt, void *value) +static ap_status_t beos_getopt(ap_iol *viol, ap_iol_option opt, void *value) { iol_socket *iol = (iol_socket *)viol; @@ -96,16 +97,20 @@ *(int *)value = iol->timeout; break; default: - errno = EINVAL; - return -1; + return APR_EINVAL; } - return 0; + return APR_SUCCESS; } -static int set_nonblock(int fd) +static ap_status_t set_nonblock(int fd) { int on = 1; - return setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(on)); + int rv; + rv = setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)); + + if (rv == 0) + return APR_SUCCESS; + return errno; } /* the timeout code is a separate routine because it requires @@ -115,7 +120,7 @@ /* this macro expands into the four basic i/o methods */ #define method(name, args, syscall, selread, selwrite) \ - static int beos_##name##_timeout args \ + static ap_status_t beos_##name##_timeout args \ { \ iol_socket *iol = (iol_socket *)viol; \ fd_set fdset; \ @@ -130,27 +135,38 @@ rv = select(iol->fd + 1, selread, selwrite, NULL, iol->timeout < 0 ? NULL : &tv); \ } while (rv == -1 && errno == EINTR); \ if (!FD_ISSET(iol->fd, &fdset)) { \ - errno = ETIMEDOUT; \ - return -1; \ + return APR_ETIMEDOUT; \ } \ do { \ rv = syscall(iol->fd, arg1, arg2, 0); \ } while (rv == -1 && errno == EINTR); \ - return rv; \ + if (rv >= 0) { \ + *nbytes = rv; \ + return APR_SUCCESS; \ + } \ + return errno; \ + \ } \ \ - static int beos_##name args \ + static ap_status_t beos_##name args \ { \ iol_socket *iol = (iol_socket *)viol; \ int rv; \ \ + /* Present to zero until some bytes are actually written */ \ + *nbytes = 0; \ if (!(iol->flags & FD_NONBLOCKING_SET)) { \ if (iol->timeout < 0) { \ - return syscall(iol->fd, arg1, arg2, 0); \ + rv = syscall(iol->fd, arg1, arg2, 0); \ + if (rv >= 0) { \ + *nbytes = rv; \ + return APR_SUCCESS; \ + } \ + return errno; \ } \ /* must shift descriptor to blocking mode now */ \ - if (set_nonblock(iol->fd)) { \ - return -1; \ + if ((rv = set_nonblock(iol->fd)) != APR_SUCCESS) { \ + return rv; \ } \ iol->flags |= FD_NONBLOCKING_SET; \ } \ @@ -160,19 +176,25 @@ do { \ rv = syscall(iol->fd, arg1, arg2, 0); \ } while (rv == -1 && errno == EINTR); \ - if (rv >= 0) { \ - return rv; \ + if ((errno == EWOULDBLOCK || errno == EAGAIN) && iol->timeout != 0) { \ + return beos_##name##_timeout(viol, arg1, arg2, nbytes); \ } \ - if (errno == EWOULDBLOCK && iol->timeout != 0) { \ - return beos_##name##_timeout(viol, arg1, arg2); \ + if (rv >= 0) { \ + *nbytes = rv; \ + return APR_SUCCESS; \ } \ - return -1; \ - } \ + return errno; \ + } + +method(write, (ap_iol *viol, const char *arg1, ap_size_t arg2, ap_ssize_t *nbytes), send, NULL, &fdset) +method(read, (ap_iol *viol, char *arg1, ap_size_t arg2, ap_ssize_t *nbytes), recv, &fdset, NULL) -method(write, (ap_iol *viol, const char *arg1, int arg2), send, NULL, &fdset) -method(read, (ap_iol *viol, char *arg1, int arg2), recv, &fdset, NULL) +static ap_status_t beos_writev(ap_iol *viol, const struct iovec *vec, int arg2, ap_ssize_t *nbytes) +{ + return beos_write(viol, vec[0].iov_base, vec[0].iov_len, nbytes); +} -static int beos_close(ap_iol *viol) +static ap_status_t beos_close(ap_iol *viol) { iol_socket *iol = (iol_socket *)viol; int rv; @@ -181,16 +203,13 @@ rv = closesocket(iol->fd); saved_errno = errno; free(iol); - errno = saved_errno; - return rv; -} - -static int beos_writev(ap_iol *viol, const struct iovec *vec, int nvec) -{ -return beos_write(viol,vec[0].iov_base,vec[0].iov_len); + if (rv == 0) { + return APR_SUCCESS; + } + return saved_errno; } -static const ap_iol_methods beos_methods = { +static const ap_iol_methods socket_methods = { beos_close, beos_write, beos_writev, @@ -208,7 +227,7 @@ return NULL; } iol = malloc(sizeof(iol_socket)); - iol->iol.methods = &beos_methods; + iol->iol.methods = &socket_methods; iol->fd = fd; iol->timeout = -1; iol->flags = 0;