summaryrefslogtreecommitdiff
path: root/threadproc/os2
diff options
context:
space:
mode:
Diffstat (limited to 'threadproc/os2')
-rw-r--r--threadproc/os2/Makefile.in71
-rw-r--r--threadproc/os2/proc.c321
-rw-r--r--threadproc/os2/signals.c82
-rw-r--r--threadproc/os2/thread.c178
-rw-r--r--threadproc/os2/threadcancel.c86
-rw-r--r--threadproc/os2/threadpriv.c92
-rw-r--r--threadproc/os2/threadproc.h108
7 files changed, 938 insertions, 0 deletions
diff --git a/threadproc/os2/Makefile.in b/threadproc/os2/Makefile.in
new file mode 100644
index 000000000..91d4249c2
--- /dev/null
+++ b/threadproc/os2/Makefile.in
@@ -0,0 +1,71 @@
+#CFLAGS=$(OPTIM) $(CFLAGS1) $(EXTRA_CFLAGS)
+#LIBS=$(EXTRA_LIBS) $(LIBS1)
+#INCLUDES=$(INCLUDES1) $(INCLUDES0) $(EXTRA_INCLUDES)
+#LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS)
+
+CC=@CC@
+RANLIB=@RANLIB@
+CFLAGS=@CFLAGS@ @OPTIM@
+LIBS=@LIBS@
+LDFLAGS=@LDFLAGS@ $(LIBS)
+INCDIR=../../inc
+INCDIR1=../../include
+INCDIR2=../../file_io/os2
+INCLUDES=-I$(INCDIR) -I$(INCDIR1) -I$(INCDIR2) -I.
+
+LIB=../threadproc.a
+
+OBJS=proc.o \
+ thread.o \
+ threadcancel.o \
+ threadpriv.o \
+ signals.o
+
+.c.o:
+ $(CC) $(CFLAGS) -c $(INCLUDES) $<
+
+all: $(LIB)
+
+clean:
+ $(RM) -f *.o *.a *.so
+
+distclean: clean
+ -$(RM) -f Makefile
+
+$(OBJS): Makefile
+
+$(LIB): $(OBJS)
+ $(RM) -f $@
+ $(AR) cr $@ $(OBJS)
+ $(RANLIB) $@
+
+#
+# We really don't expect end users to use this rule. It works only with
+# gcc, and rebuilds Makefile.tmpl. You have to re-run Configure after
+# using it.
+#
+depend:
+ cp Makefile.in Makefile.in.bak \
+ && sed -ne '1,/^# DO NOT REMOVE/p' Makefile.in > Makefile.new \
+ && gcc -MM $(INCLUDES) $(CFLAGS) *.c >> Makefile.new \
+ && sed -e '1,$$s: $(INCDIR)/: $$(INCDIR)/:g' \
+ -e '1,$$s: $(OSDIR)/: $$(OSDIR)/:g' Makefile.new \
+ > Makefile.in \
+ && rm Makefile.new
+
+# DO NOT REMOVE
+proc.o: proc.c threadproc.h ../../include/apr_thread_proc.h \
+ ../../include/apr_file_io.h ../../include/apr_general.h \
+ ../../include/apr_errno.h ../../file_io/unix/fileio.h
+signals.o: signals.c threadproc.h ../../include/apr_thread_proc.h \
+ ../../include/apr_file_io.h ../../include/apr_general.h \
+ ../../include/apr_errno.h ../../file_io/unix/fileio.h
+thread.o: thread.c threadproc.h ../../include/apr_thread_proc.h \
+ ../../include/apr_file_io.h ../../include/apr_general.h \
+ ../../include/apr_errno.h
+threadcancel.o: threadcancel.c threadproc.h \
+ ../../include/apr_thread_proc.h ../../include/apr_file_io.h \
+ ../../include/apr_general.h ../../include/apr_errno.h
+threadpriv.o: threadpriv.c threadproc.h \
+ ../../include/apr_thread_proc.h ../../include/apr_file_io.h \
+ ../../include/apr_general.h ../../include/apr_errno.h
diff --git a/threadproc/os2/proc.c b/threadproc/os2/proc.c
new file mode 100644
index 000000000..5767d898c
--- /dev/null
+++ b/threadproc/os2/proc.c
@@ -0,0 +1,321 @@
+/* ====================================================================
+ * Copyright (c) 1999 The Apache Group. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * 4. The names "Apache Server" and "Apache Group" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Group.
+ * For more information on the Apache Group and the Apache HTTP server
+ * project, please see <http://www.apache.org/>.
+ *
+ */
+
+#include "threadproc.h"
+#include "fileio.h"
+
+#include "apr_thread_proc.h"
+#include "apr_file_io.h"
+#include "apr_general.h"
+#include "apr_lib.h"
+#include <signal.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#define INCL_DOS
+#include <os2.h>
+
+ap_status_t ap_createprocattr_init(ap_context_t *cont, struct procattr_t **new)
+{
+ (*new) = (struct procattr_t *)ap_palloc(cont,
+ sizeof(struct procattr_t));
+
+ if ((*new) == NULL) {
+ return APR_ENOMEM;
+ }
+ (*new)->cntxt = cont;
+ (*new)->parent_in = NULL;
+ (*new)->child_in = NULL;
+ (*new)->parent_out = NULL;
+ (*new)->child_out = NULL;
+ (*new)->parent_err = NULL;
+ (*new)->child_err = NULL;
+ (*new)->currdir = NULL;
+ (*new)->cmdtype = APR_PROGRAM;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_setprocattr_io(struct procattr_t *attr, ap_int32_t in,
+ ap_int32_t out, ap_int32_t err)
+{
+ ap_status_t stat;
+ if (in) {
+ if ((stat = ap_create_pipe(attr->cntxt, &attr->child_in,
+ &attr->parent_in)) != APR_SUCCESS) {
+ return stat;
+ }
+ }
+ if (out) {
+ if ((stat = ap_create_pipe(attr->cntxt, &attr->parent_out,
+ &attr->child_out)) != APR_SUCCESS) {
+ return stat;
+ }
+ }
+ if (err) {
+ if ((stat = ap_create_pipe(attr->cntxt, &attr->parent_err,
+ &attr->child_err)) != APR_SUCCESS) {
+ return stat;
+ }
+ }
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_setprocattr_dir(struct procattr_t *attr,
+ char *dir)
+{
+ attr->currdir = ap_pstrdup(attr->cntxt, dir);
+ if (attr->currdir) {
+ return APR_SUCCESS;
+ }
+ return APR_ENOMEM;
+}
+
+ap_status_t ap_setprocattr_cmdtype(struct procattr_t *attr,
+ ap_cmdtype_e cmd)
+{
+ attr->cmdtype = cmd;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_fork(ap_context_t *cont, struct proc_t **proc)
+{
+ int pid;
+
+ (*proc) = ap_palloc(cont, sizeof(struct proc_t));
+
+ if ((pid = fork()) < 0) {
+ return errno;
+ } else if (pid == 0) {
+ (*proc)->pid = pid;
+ (*proc)->attr = NULL;
+ (*proc)->running = TRUE;
+ return APR_INCHILD;
+ }
+
+ (*proc)->pid = pid;
+ (*proc)->attr = NULL;
+ (*proc)->running = TRUE;
+ return APR_INPARENT;
+}
+
+ap_status_t ap_create_process(ap_context_t *cont, char *progname,
+ char *const args[], char **env,
+ struct procattr_t *attr, struct proc_t **new)
+{
+ int i;
+ ap_status_t stat;
+ char **newargs;
+ char savedir[300];
+ HFILE save_in, save_out, save_err, dup;
+ int criticalsection = FALSE;
+
+ (*new) = (struct proc_t *)ap_palloc(cont, sizeof(struct proc_t));
+
+ if ((*new) == NULL) {
+ return APR_ENOMEM;
+ }
+
+ (*new)->cntxt = cont;
+ (*new)->running = FALSE;
+
+/* Prevent other threads from running while these process-wide resources are modified */
+ if (attr->child_in || attr->child_out || attr->child_err || attr->currdir) {
+ criticalsection = TRUE;
+ DosEnterCritSec();
+ }
+
+ if (attr->child_in) {
+ save_in = -1;
+ DosDupHandle(STDIN_FILENO, &save_in);
+ dup = STDIN_FILENO;
+ DosDupHandle(attr->child_in->filedes, &dup);
+ DosSetFHState(attr->parent_in->filedes, OPEN_FLAGS_NOINHERIT);
+ }
+
+ if (attr->child_out) {
+ save_out = -1;
+ DosDupHandle(STDOUT_FILENO, &save_out);
+ dup = STDOUT_FILENO;
+ DosDupHandle(attr->child_out->filedes, &dup);
+ DosSetFHState(attr->parent_out->filedes, OPEN_FLAGS_NOINHERIT);
+ }
+
+ if (attr->child_err) {
+ save_err = -1;
+ DosDupHandle(STDERR_FILENO, &save_err);
+ dup = STDERR_FILENO;
+ DosDupHandle(attr->child_err->filedes, &dup);
+ DosSetFHState(attr->parent_err->filedes, OPEN_FLAGS_NOINHERIT);
+ }
+
+ signal(SIGCHLD, SIG_DFL); /*not sure if this is needed or not */
+
+ if (attr->currdir != NULL) {
+ _getcwd2(savedir, sizeof(savedir));
+
+ if (_chdir2(attr->currdir) < 0) {
+ if (criticalsection)
+ DosExitCritSec();
+ return errno;
+ }
+ }
+
+ if (attr->cmdtype == APR_SHELLCMD) {
+ i = 0;
+ while (args[i]) {
+ i++;
+ }
+ newargs = (char **)ap_palloc(cont, sizeof (char *) * (i + 3));
+ newargs[0] = ap_pstrdup(cont, SHELL_PATH);
+ newargs[1] = ap_pstrdup(cont, "/c");
+ i = 0;
+
+ while (args[i]) {
+ newargs[i + 2] = ap_pstrdup(cont, args[i]);
+ i++;
+ }
+
+ newargs[i + 3] = NULL;
+ (*new)->pid = spawnve(P_NOWAIT, SHELL_PATH, newargs, env);
+ } else {
+ (*new)->pid = spawnve(P_NOWAIT, progname, args, env);
+ }
+
+ stat = (*new)->pid < 0 ? errno : APR_SUCCESS;
+
+ if (attr->currdir != NULL) {
+ chdir(savedir);
+ }
+
+ if (attr->child_in) {
+ ap_close(attr->child_in);
+ dup = STDIN_FILENO;
+ DosDupHandle(save_in, &dup);
+ DosClose(save_in);
+ }
+
+ if (attr->child_out) {
+ ap_close(attr->child_out);
+ dup = STDOUT_FILENO;
+ DosDupHandle(save_out, &dup);
+ DosClose(save_out);
+ }
+
+ if (attr->child_err) {
+ ap_close(attr->child_err);
+ dup = STDERR_FILENO;
+ DosDupHandle(save_err, &dup);
+ DosClose(save_err);
+ }
+
+ if (criticalsection)
+ DosExitCritSec();
+
+ (*new)->attr = attr;
+ (*new)->running = stat == APR_SUCCESS;
+ return stat;
+}
+
+
+
+ap_status_t ap_get_childin(struct proc_t *proc, ap_file_t **new)
+{
+ (*new) = proc->attr->parent_in;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_get_childout(struct proc_t *proc, ap_file_t **new)
+{
+ (*new) = proc->attr->parent_out;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_get_childerr(struct proc_t *proc, ap_file_t **new)
+{
+ (*new) = proc->attr->parent_err;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_wait_proc(struct proc_t *proc,
+ ap_wait_how_e wait)
+{
+ pid_t stat;
+
+ if (!proc)
+ return APR_ENOPROC;
+
+ if (!proc->running)
+ return APR_CHILD_DONE;
+
+ if (wait == APR_WAIT) {
+ if ((stat = waitpid(proc->pid, NULL, WUNTRACED)) > 0) {
+ proc->running = FALSE;
+ return APR_CHILD_DONE;
+ } else if (stat == 0) {
+ return APR_CHILD_NOTDONE;
+ }
+ return errno;
+ }
+
+ if ((stat = waitpid(proc->pid, NULL, WUNTRACED | WNOHANG)) > 0) {
+ proc->running = FALSE;
+ return APR_CHILD_DONE;
+ } else if (stat == 0) {
+ return APR_CHILD_NOTDONE;
+ }
+
+ return errno;
+}
+
diff --git a/threadproc/os2/signals.c b/threadproc/os2/signals.c
new file mode 100644
index 000000000..d0014f695
--- /dev/null
+++ b/threadproc/os2/signals.c
@@ -0,0 +1,82 @@
+/* ====================================================================
+ * Copyright (c) 1999 The Apache Group. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * 4. The names "Apache Server" and "Apache Group" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Group.
+ * For more information on the Apache Group and the Apache HTTP server
+ * project, please see <http://www.apache.org/>.
+ *
+ */
+
+#include "threadproc.h"
+#include "fileio.h"
+#include "apr_thread_proc.h"
+#include "apr_file_io.h"
+#include "apr_general.h"
+#include <signal.h>
+#include <string.h>
+#include <sys/wait.h>
+#define INCL_DOS
+#include <os2.h>
+
+ap_status_t ap_kill(struct proc_t *proc, int signal)
+{
+/* SIGTERM's don't work too well in OS/2 (only affects other EMX programs).
+ CGIs may not be, esp. REXX scripts, so use a native call instead */
+
+ ap_status_t rc;
+
+ if ( signal == SIGTERM ) {
+ rc = os2errno(DosSendSignalException(proc->pid, XCPT_SIGNAL_BREAK));
+ } else {
+ rc = kill(proc->pid, signal) < 0 ? errno : APR_SUCCESS;
+ }
+
+ return rc;
+}
+
diff --git a/threadproc/os2/thread.c b/threadproc/os2/thread.c
new file mode 100644
index 000000000..14cf980c5
--- /dev/null
+++ b/threadproc/os2/thread.c
@@ -0,0 +1,178 @@
+/* ====================================================================
+ * Copyright (c) 1999 The Apache Group. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * 4. The names "Apache Server" and "Apache Group" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Group.
+ * For more information on the Apache Group and the Apache HTTP server
+ * project, please see <http://www.apache.org/>.
+ *
+ */
+
+#include "threadproc.h"
+#include "apr_thread_proc.h"
+#include "apr_general.h"
+#include "apr_lib.h"
+#include "fileio.h"
+#define INCL_DOS
+#include <os2.h>
+
+ap_status_t ap_create_threadattr(ap_context_t *cont, struct threadattr_t **new)
+{
+ (*new) = (struct threadattr_t *)ap_palloc(cont, sizeof(struct threadattr_t));
+
+ if ((*new) == NULL) {
+ return APR_ENOMEM;
+ }
+
+ (*new)->cntxt = cont;
+ (*new)->attr = 0;
+ return APR_SUCCESS;
+}
+
+
+
+ap_status_t ap_setthreadattr_detach(struct threadattr_t *attr, ap_int32_t on)
+{
+ attr->attr |= APR_THREADATTR_DETACHED;
+ return APR_SUCCESS;
+}
+
+
+
+ap_status_t ap_getthreadattr_detach(struct threadattr_t *attr)
+{
+ return (attr->attr & APR_THREADATTR_DETACHED) ? APR_DETACH : APR_NOTDETACH;
+}
+
+
+
+static void ap_thread_begin(void *arg)
+{
+ struct thread_t *thread = (struct thread_t *)arg;
+ thread->rv = thread->func(thread->data);
+}
+
+
+
+ap_status_t ap_create_thread(ap_context_t *cont, struct threadattr_t *attr,
+ ap_thread_start_t func, void *data,
+ struct thread_t **new)
+{
+ ap_status_t stat;
+ ap_thread_t *thread;
+
+ thread = (struct thread_t *)ap_palloc(cont, sizeof(struct thread_t));
+ *new = thread;
+
+ if (thread == NULL) {
+ return APR_ENOMEM;
+ }
+
+ thread->cntxt = cont;
+ thread->attr = attr;
+ thread->func = func;
+ thread->data = data;
+ stat = ap_create_context(cont, NULL, &thread->cntxt);
+
+ if (stat != APR_SUCCESS) {
+ return stat;
+ }
+
+ if (attr == NULL) {
+ stat = ap_create_threadattr(thread->cntxt, &thread->attr);
+
+ if (stat != APR_SUCCESS) {
+ return stat;
+ }
+ }
+
+ if (thread->attr->attr & APR_THREADATTR_DETACHED)
+ thread->tid = _beginthread((os2_thread_start_t)func, NULL, APR_THREAD_STACKSIZE, data);
+ else
+ thread->tid = _beginthread(ap_thread_begin, NULL, APR_THREAD_STACKSIZE, thread);
+
+ if (thread->tid < 0) {
+ return errno;
+ }
+
+ return APR_SUCCESS;
+}
+
+
+
+ap_status_t ap_thread_exit(ap_thread_t *thd, ap_status_t *retval)
+{
+ thd->rv = retval;
+ _endthread();
+ return -1; /* If we get here something's wrong */
+}
+
+
+
+ap_status_t ap_thread_join(struct thread_t *thd, ap_status_t *retval)
+{
+ ULONG rc;
+ TID waittid = thd->tid;
+
+ if (thd->attr->attr & APR_THREADATTR_DETACHED)
+ return APR_ENOSTAT;
+
+ rc = DosWaitThread(&waittid, DCWW_WAIT);
+ *retval = (ap_status_t)thd->rv;
+ return os2errno(rc);
+}
+
+
+
+ap_status_t ap_thread_detach(struct thread_t *thd)
+{
+ thd->attr->attr |= APR_THREADATTR_DETACHED;
+ return APR_SUCCESS;
+}
+
+
diff --git a/threadproc/os2/threadcancel.c b/threadproc/os2/threadcancel.c
new file mode 100644
index 000000000..5f4766bc5
--- /dev/null
+++ b/threadproc/os2/threadcancel.c
@@ -0,0 +1,86 @@
+/* ====================================================================
+ * Copyright (c) 1999 The Apache Group. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * 4. The names "Apache Server" and "Apache Group" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Group.
+ * For more information on the Apache Group and the Apache HTTP server
+ * project, please see <http://www.apache.org/>.
+ *
+ */
+
+#include "threadproc.h"
+#include "apr_thread_proc.h"
+#include "apr_general.h"
+#include "fileio.h"
+
+ap_status_t ap_cancel_thread(struct thread_t *thd)
+{
+ return os2errno(DosKillThread(thd->tid));
+}
+
+
+
+ap_status_t ap_setcanceltype(ap_context_t *cont, ap_int32_t type)
+{
+ ULONG rc, nesting;
+
+ if (type == APR_CANCEL_DEFER)
+ rc = DosEnterMustComplete(&nesting);
+ else
+ rc = DosExitMustComplete(&nesting);
+
+ return os2errno(rc);
+}
+
+
+
+ap_status_t ap_setcancelstate(ap_context_t *cont, ap_int32_t type)
+{
+/* There's no way to ignore thread kills altogether in OS/2 (that I know of) */
+ return -1;
+}
diff --git a/threadproc/os2/threadpriv.c b/threadproc/os2/threadpriv.c
new file mode 100644
index 000000000..049f93896
--- /dev/null
+++ b/threadproc/os2/threadpriv.c
@@ -0,0 +1,92 @@
+/* ====================================================================
+ * Copyright (c) 1999 The Apache Group. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * 4. The names "Apache Server" and "Apache Group" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Group.
+ * For more information on the Apache Group and the Apache HTTP server
+ * project, please see <http://www.apache.org/>.
+ *
+ */
+
+#include "threadproc.h"
+#include "apr_thread_proc.h"
+#include "apr_general.h"
+#include "apr_errno.h"
+#include "apr_lib.h"
+#include "fileio.h"
+
+ap_status_t ap_create_thread_private(ap_context_t *cont, void (*dest)(void *),
+ struct threadkey_t **key)
+{
+ (*key) = (struct threadkey_t *)ap_palloc(cont, sizeof(struct threadkey_t));
+
+ if ((*key) == NULL) {
+ return APR_ENOMEM;
+ }
+
+ (*key)->cntxt = cont;
+ return os2errno(DosAllocThreadLocalMemory(1, &((*key)->key)));
+}
+
+ap_status_t ap_get_thread_private(struct threadkey_t *key, void **new)
+{
+ (*new) = (void *)*(key->key);
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_set_thread_private(struct threadkey_t *key, void *priv)
+{
+ *(key->key) = (ULONG)priv;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_delete_thread_private(struct threadkey_t *key)
+{
+ return os2errno(DosFreeThreadLocalMemory(key->key));
+}
+
diff --git a/threadproc/os2/threadproc.h b/threadproc/os2/threadproc.h
new file mode 100644
index 000000000..215a7f9fd
--- /dev/null
+++ b/threadproc/os2/threadproc.h
@@ -0,0 +1,108 @@
+/* ====================================================================
+ * Copyright (c) 1999 The Apache Group. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * 4. The names "Apache Server" and "Apache Group" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the Apache Group
+ * for use in the Apache HTTP server project (http://www.apache.org/)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Group.
+ * For more information on the Apache Group and the Apache HTTP server
+ * project, please see <http://www.apache.org/>.
+ *
+ */
+
+#include "apr_thread_proc.h"
+#include "apr_file_io.h"
+
+#ifndef THREAD_PROC_H
+#define THREAD_PROC_H
+
+#define APR_THREADATTR_DETACHED 1
+
+#define SHELL_PATH "cmd.exe"
+#define APR_THREAD_STACKSIZE 65536
+
+struct threadattr_t {
+ ap_context_t *cntxt;
+ unsigned long attr;
+};
+
+struct thread_t {
+ ap_context_t *cntxt;
+ struct threadattr_t *attr;
+ unsigned long tid;
+ ap_thread_start_t func;
+ void *data;
+ void *rv;
+};
+
+struct threadkey_t {
+ ap_context_t *cntxt;
+ unsigned long *key;
+};
+
+struct procattr_t {
+ ap_context_t *cntxt;
+ ap_file_t *parent_in;
+ ap_file_t *child_in;
+ ap_file_t *parent_out;
+ ap_file_t *child_out;
+ ap_file_t *parent_err;
+ ap_file_t *child_err;
+ char *currdir;
+ ap_int32_t cmdtype;
+};
+
+struct proc_t {
+ ap_context_t *cntxt;
+ pid_t pid;
+ struct procattr_t *attr;
+ int running;
+};
+
+typedef void (*os2_thread_start_t)(void *);
+
+#endif /* ! THREAD_PROC_H */
+