From e8ec7aa8e38a93f5b034ac74cebce5de23710317 Mon Sep 17 00:00:00 2001 From: hongbotian Date: Mon, 30 Nov 2015 01:45:08 -0500 Subject: upload http JIRA: BOTTLENECK-10 Change-Id: I7598427ff904df438ce77c2819ee48ac75ffa8da Signed-off-by: hongbotian --- .../srclib/apr/threadproc/beos/apr_proc_stub.c | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c (limited to 'rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c') diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c new file mode 100644 index 00000000..011d793e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c @@ -0,0 +1,76 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +struct pipefd { + int in; + int out; + int err; +}; + +int main(int argc, char *argv[]) { +/* we expect the following... + * + * argv[0] = this stub + * argv[1] = directory to run in... + * argv[2] = progname to execute + * rest of arguments to be passed to program + */ + char *progname = argv[2]; + char *directory = argv[1]; + struct pipefd *pfd; + thread_id sender; + void *buffer; + char ** newargs; + int i = 0; + + newargs = (char**)malloc(sizeof(char*) * (argc - 1)); + + buffer = (void*)malloc(sizeof(struct pipefd)); + /* this will block until we get the data */ + receive_data(&sender, buffer, sizeof(struct pipefd)); + pfd = (struct pipefd*)buffer; + + if (pfd->in > STDERR_FILENO) { + if (dup2(pfd->in, STDIN_FILENO) != STDIN_FILENO) return (-1); + close (pfd->in); + } + if (pfd->out > STDERR_FILENO) { + if (dup2(pfd->out, STDOUT_FILENO) != STDOUT_FILENO) return (-1); + close (pfd->out); + } + if (pfd->err > STDERR_FILENO) { + if (dup2(pfd->err, STDERR_FILENO) != STDERR_FILENO) return (-1); + close (pfd->err); + } + + for (i=3;i<=argc;i++){ + newargs[i-3] = argv[i]; + } + + /* tell the caller we're OK to start */ + send_data(sender,1,NULL,0); + + if (directory != NULL) + chdir(directory); + execve (progname, newargs, environ); + + return (-1); +} -- cgit 1.2.3-korg