summaryrefslogtreecommitdiffstats
path: root/cpukit/shttpd/compat_unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/shttpd/compat_unix.c')
-rw-r--r--cpukit/shttpd/compat_unix.c123
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 */