From a292e665e7aa78cc8a9ad3569328e06917639c22 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Thu, 26 Mar 2009 17:30:49 +0000 Subject: Support for building on Solaris. --- ChangeLog | 1 + acsite.m4 | 2 +- common/compat.c | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++ common/compat.h | 24 ++++++ common/tpool.c | 8 +- configure.in | 5 +- daemon/httpauthd.c | 1 - daemon/misc.c | 1 - tools/mkha1.c | 1 - 9 files changed, 250 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index c3aa96b..fe57923 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 0.9.5 - Build fixes for MAC OS 10.4 and 10.5 + - Build fixes for Solaris 0.9.4 [30-07-2008] - Rework event handling system so we don't use a full thread per diff --git a/acsite.m4 b/acsite.m4 index 98318d3..3ec8f73 100644 --- a/acsite.m4 +++ b/acsite.m4 @@ -72,7 +72,7 @@ case "${host_cpu}-${host_os}" in # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: - acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + acx_pthread_flags="-pthreads -pthread pthread -mt $acx_pthread_flags" ;; esac diff --git a/common/compat.c b/common/compat.c index 3ab7ae2..02e3df6 100644 --- a/common/compat.c +++ b/common/compat.c @@ -72,3 +72,217 @@ char* strupr(char* s) return s; } #endif + + +#ifndef HAVE_DAEMON + +#include +#include +#include +#include +#include + +int daemon(int nochdir, int noclose) +{ + struct sigaction osa, sa; + int oerrno, fd, osa_ok; + pid_t newgrp; + + /* A SIGHUP may be thrown when the parent exits below. */ + sigemptyset(&sa.sa_mask); + sa.sa_handler = SIG_IGN; + sa.sa_flags = 0; + osa_ok = sigaction(SIGHUP, &sa, &osa); + + switch(fork()) + { + case -1: + return -1; + case 0: + break; + default: + _exit(0); + } + + newgrp = setsid(); + oerrno = errno; + if(osa_ok != -1) + sigaction(SIGHUP, &osa, NULL); + if(newgrp == -1) + { + errno = oerrno; + return -1; + } + if(!nochdir) + chdir("/"); + if(!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) + { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if(fd > 2) + close(fd); + } + return 0; + +} + +#endif + + +#ifndef HAVE_ERR_H + +#include +#include +#include +#include + +extern char** __argv; + +static const char* calc_prog_name() +{ + static char prognamebuf[256]; + static int prepared = 0; + + if(!prepared) + { + const char* beg = strrchr(__argv[0], '\\'); + const char* temp = strrchr(__argv[0], '/'); + beg = (beg > temp) ? beg : temp; + beg = (beg) ? beg + 1 : __argv[0]; + + temp = strrchr(__argv[0], '.'); + temp = (temp > beg) ? temp : __argv[0] + strlen(__argv[0]); + + if((temp - beg) > 255) + temp = beg + 255; + + strncpy(prognamebuf, beg, temp - beg); + prognamebuf[temp - beg] = 0; + prepared = 1; + } + + return prognamebuf; +} + +static FILE* err_file; /* file to use for error output */ + +/* + * This is declared to take a `void *' so that the caller is not required + * to include first. However, it is really a `FILE *', and the + * manual page documents it as such. + */ +void err_set_file(void *fp) +{ + if (fp) + err_file = fp; + else + err_file = stderr; +} + +void err(int eval, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrc(eval, errno, fmt, ap); + va_end(ap); +} + +void verr(int eval, const char *fmt, va_list ap) +{ + verrc(eval, errno, fmt, ap); +} + +void errc(int eval, int code, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrc(eval, code, fmt, ap); + va_end(ap); +} + +void verrc(int eval, int code, const char *fmt, va_list ap) +{ + if (err_file == 0) + err_set_file((FILE *)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if (fmt != NULL) { + vfprintf(err_file, fmt, ap); + fprintf(err_file, ": "); + } + fprintf(err_file, "%s\n", strerror(code)); + exit(eval); +} + +void errx(int eval, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrx(eval, fmt, ap); + va_end(ap); +} + +void verrx(int eval, const char *fmt, va_list ap) +{ + if (err_file == 0) + err_set_file((FILE *)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if (fmt != NULL) + vfprintf(err_file, fmt, ap); + fprintf(err_file, "\n"); + exit(eval); +} + +void warn(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnc(errno, fmt, ap); + va_end(ap); +} + +void vwarn(const char *fmt, va_list ap) +{ + vwarnc(errno, fmt, ap); +} + +void warnc(int code, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnc(code, fmt, ap); + va_end(ap); +} + +void vwarnc(int code, const char *fmt, va_list ap) +{ + if (err_file == 0) + err_set_file((FILE *)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if (fmt != NULL) + { + vfprintf(err_file, fmt, ap); + fprintf(err_file, ": "); + } + fprintf(err_file, "%s\n", strerror(code)); +} + +void warnx(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnx(fmt, ap); + va_end(ap); +} + +void vwarnx(const char *fmt, va_list ap) +{ + if(err_file == 0) + err_set_file((FILE*)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if(fmt != NULL) + vfprintf(err_file, fmt, ap); + fprintf(err_file, "\n"); +} + +#endif diff --git a/common/compat.h b/common/compat.h index 712f385..0f58931 100644 --- a/common/compat.h +++ b/common/compat.h @@ -78,4 +78,28 @@ char* strlwr(char* s); char* strupr(char* s); #endif +#ifndef HAVE_DAEMON +int daemon(int nochdir, int noclose); +#endif + +#ifdef HAVE_ERR_H +#include +#else +#include +void err_set_file(void *fp); +void err_set_exit(void (*ef)(int)); +void err(int eval, const char *fmt, ...); +void verr(int eval, const char *fmt, va_list ap); +void errc(int eval, int code, const char *fmt, ...); +void verrc(int eval, int code, const char *fmt, va_list ap); +void errx(int eval, const char *fmt, ...); +void verrx(int eval, const char *fmt, va_list ap); +void warn(const char *fmt, ...); +void vwarn(const char *fmt, va_list ap); +void warnc(int code, const char *fmt, ...); +void vwarnc(int code, const char *fmt, va_list ap); +void warnx(const char *fmt, ...); +void vwarnx(const char *fmt, va_list ap); +#endif + #endif /* _COMPAT_H_ */ diff --git a/common/tpool.c b/common/tpool.c index f980b86..ff868de 100644 --- a/common/tpool.c +++ b/common/tpool.c @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -43,6 +42,7 @@ #define __USE_GNU #include +#include "compat.h" #include "tpool.h" typedef struct _tpool_work { @@ -319,7 +319,13 @@ tpool_add_work (void (*routine)(void*), void *arg) */ if (tpool_max_queue_size > 0 && tpool_cur_queue_size >= tpool_max_queue_size) { PTHREQ (pthread_mutex_unlock (&tpool_queue_lock)); +#if defined(HAVE_THR_YIELD) + thr_yield(); +#elif defined(HAVE_PTHREAD_YIELD) pthread_yield(); +#elif defined(HAVE_SCHED_YIELD) + sched_yield(); +#endif PTHREQ (pthread_mutex_lock (&tpool_queue_lock)); } diff --git a/configure.in b/configure.in index 516d69a..f239273 100644 --- a/configure.in +++ b/configure.in @@ -72,8 +72,9 @@ AC_CHECK_LIB([c], [crypt], , [ # Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADERS([unistd.h stdio.h stddef.h fcntl.h stdlib.h assert.h errno.h stdarg.h err.h string.h], , +AC_CHECK_HEADERS([unistd.h stdio.h stddef.h fcntl.h stdlib.h assert.h errno.h stdarg.h string.h], , [echo "ERROR: Required C header missing"; exit 1]) +AC_CHECK_HEADERS([err.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST @@ -87,7 +88,7 @@ AC_CHECK_DECL(PTHREAD_MUTEX_ERRORCHECK_NP, [AC_DEFINE(HAVE_ERR_MUTEX, 1, "Error # Required Functions AC_CHECK_FUNCS([memset strerror malloc realloc getopt strchr tolower getaddrinfo], , [echo "ERROR: Required function missing"; exit 1]) -AC_CHECK_FUNCS([strlwr]) +AC_CHECK_FUNCS([strlwr thr_yield sched_yield pthread_yield daemon]) # LDAP support AM_CONDITIONAL(WITH_LDAP, test -n "$with_ldap") diff --git a/daemon/httpauthd.c b/daemon/httpauthd.c index b8f5e1b..3de597c 100644 --- a/daemon/httpauthd.c +++ b/daemon/httpauthd.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include diff --git a/daemon/misc.c b/daemon/misc.c index 36af7aa..b2da085 100644 --- a/daemon/misc.c +++ b/daemon/misc.c @@ -24,7 +24,6 @@ #include "md5.h" #include -#include #include #include #include diff --git a/tools/mkha1.c b/tools/mkha1.c index c61c725..af8d538 100644 --- a/tools/mkha1.c +++ b/tools/mkha1.c @@ -41,7 +41,6 @@ #include #include #include -#include #include "compat.h" #include "buffer.h" -- cgit v1.2.3