summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2009-03-26 17:30:49 +0000
committerStef Walter <stef@memberwebs.com>2009-03-26 17:30:49 +0000
commita292e665e7aa78cc8a9ad3569328e06917639c22 (patch)
treed72c357dd22926e9d8876f20ff1f16cacd281399
parent9e1de4e71db2c5b32bb8349584bafc22d6e29752 (diff)
Support for building on Solaris.
-rw-r--r--ChangeLog1
-rw-r--r--acsite.m42
-rw-r--r--common/compat.c214
-rw-r--r--common/compat.h24
-rw-r--r--common/tpool.c8
-rw-r--r--configure.in5
-rw-r--r--daemon/httpauthd.c1
-rw-r--r--daemon/misc.c1
-rw-r--r--tools/mkha1.c1
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 <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <fcntl.h>
+
+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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+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 <stdio.h> 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 <err.h>
+#else
+#include <stdarg.h>
+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 <stdio.h>
#include <stdlib.h>
#include <errno.h>
-#include <err.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
@@ -43,6 +42,7 @@
#define __USE_GNU
#include <pthread.h>
+#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 <syslog.h>
#include <pthread.h>
#include <fcntl.h>
-#include <err.h>
#include <ctype.h>
#include <signal.h>
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 <syslog.h>
-#include <err.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
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 <stdio.h>
#include <unistd.h>
#include <string.h>
-#include <err.h>
#include "compat.h"
#include "buffer.h"