version 0.1.6
[fms.git] / libs / shttpd / compat_unix.c
diff --git a/libs/shttpd/compat_unix.c b/libs/shttpd/compat_unix.c
new file mode 100644 (file)
index 0000000..649d0c8
--- /dev/null
@@ -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 */