diff options
Diffstat (limited to 'cpukit/shttpd/compat_unix.c')
-rw-r--r-- | cpukit/shttpd/compat_unix.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/cpukit/shttpd/compat_unix.c b/cpukit/shttpd/compat_unix.c new file mode 100644 index 0000000000..649d0c8f21 --- /dev/null +++ b/cpukit/shttpd/compat_unix.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2004-2005 Sergey Lyubka <valenok@gmail.com> + * All rights reserved + * + * "THE BEER-WARE LICENSE" (Revision 42): + * Sergey Lyubka wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. + */ + +#include "defs.h" + +void +set_close_on_exec(int fd) +{ + (void) fcntl(fd, F_SETFD, FD_CLOEXEC); +} + +int +my_stat(const char *path, struct stat *stp) +{ + return (stat(path, stp)); +} + +int +my_open(const char *path, int flags, int mode) +{ + return (open(path, flags, mode)); +} + +int +my_remove(const char *path) +{ + return (remove(path)); +} + +int +my_rename(const char *path1, const char *path2) +{ + return (rename(path1, path2)); +} + +int +my_mkdir(const char *path, int mode) +{ + return (mkdir(path, mode)); +} + +char * +my_getcwd(char *buffer, int maxlen) +{ + return (getcwd(buffer, maxlen)); +} + +int +set_non_blocking_mode(int fd) +{ + int ret = -1; + int flags; + + if ((flags = fcntl(fd, F_GETFL, 0)) == -1) { + DBG(("nonblock: fcntl(F_GETFL): %d", ERRNO)); + } else if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { + DBG(("nonblock: fcntl(F_SETFL): %d", ERRNO)); + } else { + ret = 0; /* Success */ + } + + return (ret); +} + +#ifndef NO_CGI +int +spawn_process(struct conn *c, const char *prog, char *envblk, + char *envp[], int sock, const char *dir) +{ + int ret; + pid_t pid; + + envblk = NULL; /* unused */ + + if ((pid = vfork()) == -1) { + + ret = -1; + elog(E_LOG, c, "redirect: fork: %s", strerror(errno)); + + } else if (pid == 0) { + + /* Child */ + (void) chdir(dir); + (void) dup2(sock, 0); + (void) dup2(sock, 1); + (void) closesocket(sock); + + /* If error file is specified, send errors there */ + if (c->ctx->error_log) + (void) dup2(fileno(c->ctx->error_log), 2); + + /* Execute CGI program */ + if (c->ctx->cgi_interpreter == NULL) { + (void) execle(prog, prog, NULL, envp); + elog(E_FATAL, c, "redirect: exec(%s)", prog); + } else { + (void) execle(c->ctx->cgi_interpreter, + c->ctx->cgi_interpreter, prog, NULL, envp); + elog(E_FATAL, c, "redirect: exec(%s %s)", + c->ctx->cgi_interpreter, prog); + } + + /* UNREACHED */ + ret = -1; + exit(EXIT_FAILURE); + + } else { + + /* Parent */ + ret = 0; + (void) closesocket(sock); + } + + return (ret); +} +#endif /* !NO_CGI */ |