diff options
Diffstat (limited to 'local.c')
-rw-r--r-- | local.c | 211 |
1 files changed, 108 insertions, 103 deletions
@@ -1,4 +1,4 @@ -/* $Id: local.c,v 1.8 2001/11/21 18:51:48 ukai Exp $ */ +/* $Id: local.c,v 1.9 2001/11/24 02:01:26 ukai Exp $ */ #include "fm.h" #include <string.h> #include <stdio.h> @@ -10,8 +10,8 @@ #include <unistd.h> #endif /* HAVE_READLINK */ #ifdef __EMX__ -#include <limits.h> /* _MAX_PATH ? */ -#endif /* __EMX__ */ +#include <limits.h> /* _MAX_PATH ? */ +#endif /* __EMX__ */ #include "local.h" #define CGIFN_NORMAL 0 @@ -27,9 +27,9 @@ setLocalCookie() { Str buf; char hostname[256]; - gethostname(hostname,256); + gethostname(hostname, 256); - buf = Sprintf("%d.%ld@%s",getpid(),lrand48(),hostname); + buf = Sprintf("%d.%ld@%s", getpid(), lrand48(), hostname); Local_cookie = buf->ptr; } @@ -57,7 +57,10 @@ dirBuffer(char *dname) return NULL; dirname = Strnew_charp(dname); qdir = html_quote(Str_conv_from_system(dirname)->ptr); - tmp = Sprintf("<title>Directory list of %s</title><h1>Directory list of %s</h1>\n", qdir, qdir); + tmp = + Sprintf + ("<title>Directory list of %s</title><h1>Directory list of %s</h1>\n", + qdir, qdir); flist = New_N(char *, nfile_max); nfile = 0; while ((dir = readdir(d)) != NULL) { @@ -82,7 +85,7 @@ dirBuffer(char *dname) n = 1; Strcat_charp(tmp, "<TABLE CELLPADDING=0><TR VALIGN=TOP>\n"); } - qsort((void *) flist, nfile, sizeof(char *), strCmp); + qsort((void *)flist, nfile, sizeof(char *), strCmp); for (i = 0; i < nfile; i++) { p = flist[i]; if (strcmp(p, ".") == 0) @@ -91,7 +94,7 @@ dirBuffer(char *dname) if (Strlastchar(fbuf) != '/') Strcat_char(fbuf, '/'); Strcat_charp(fbuf, p); -#ifdef HAVE_READLINK /* readlink == lstat() ? (ukai) */ +#ifdef HAVE_READLINK /* readlink == lstat() ? (ukai) */ if (lstat(fbuf->ptr, &lst) < 0) continue; #endif /* READLINK */ @@ -132,7 +135,8 @@ dirBuffer(char *dname) if (S_ISLNK(lst.st_mode)) { if ((l = readlink(fbuf->ptr, lbuf, sizeof(lbuf))) > 0) { lbuf[l] = '\0'; - Strcat_m_charp(tmp, " -> ", html_quote(conv_from_system(lbuf)), NULL); + Strcat_m_charp(tmp, " -> ", + html_quote(conv_from_system(lbuf)), NULL); if (S_ISDIR(st.st_mode)) Strcat_char(tmp, '/'); } @@ -160,46 +164,43 @@ check_local_cgi(char *file, int status) if (status & CGIFN_CONTAIN_SLASH) { /* local CGI file must be just under /cgi-bin/ - or /$LIB/ - */ + * or /$LIB/ + */ return -1; } #ifdef __EMX__ if (CGIFN_MODE(status) != CGIFN_CGIBIN) { char tmp[_MAX_PATH]; - int len; + int len; - _abspath(tmp, w3m_lib_dir(), _MAX_PATH); /* Translate '\\' to '/' - * - */ - len = strlen(tmp); - while (len > 1 && tmp[len-1] == '/') - len--; - if (strnicmp(file, tmp, len) || /* and ignore case */ - (file[len] != '/')) + _abspath(tmp, w3m_lib_dir(), _MAX_PATH); /* Translate '\\' to '/' + * + */ + len = strlen(tmp); + while (len > 1 && tmp[len - 1] == '/') + len--; + if (strnicmp(file, tmp, len) || /* and ignore case */ + (file[len] != '/')) return -1; } #else /* not __EMX__ */ if (CGIFN_MODE(status) != CGIFN_CGIBIN) { - char *tmp = Strnew_charp(w3m_lib_dir())->ptr; - int len = strlen(tmp); + char *tmp = Strnew_charp(w3m_lib_dir())->ptr; + int len = strlen(tmp); - while (len > 1 && tmp[len-1] == '/') - len--; - if (strncmp(file, tmp, len) || - (file[len] != '/')) - /* - * a local-CGI script should be located on either - * /cgi-bin/ directory or LIB_DIR (typically /usr/local/lib/w3m). - */ - return -1; + while (len > 1 && tmp[len - 1] == '/') + len--; + if (strncmp(file, tmp, len) || (file[len] != '/')) + /* + * a local-CGI script should be located on either + * /cgi-bin/ directory or LIB_DIR (typically /usr/local/lib/w3m). + */ + return -1; } #endif /* not __EMX__ */ if (stat(file, &st) < 0) return -1; - if ((st.st_uid == geteuid() && (st.st_mode & S_IXUSR)) || - (st.st_gid == getegid() && (st.st_mode & S_IXGRP)) || - (st.st_mode & S_IXOTH)) { /* executable */ + if ((st.st_uid == geteuid() && (st.st_mode & S_IXUSR)) || (st.st_gid == getegid() && (st.st_mode & S_IXGRP)) || (st.st_mode & S_IXOTH)) { /* executable */ return 0; } return -1; @@ -209,8 +210,8 @@ void set_environ(char *var, char *value) { #ifdef HAVE_SETENV - if ( var != NULL && value != NULL ) - setenv(var, value, 1); + if (var != NULL && value != NULL) + setenv(var, value, 1); #else /* not HAVE_SETENV */ #ifdef HAVE_PUTENV Str tmp = Strnew_m_charp(var, "=", value, NULL); @@ -241,10 +242,10 @@ set_environ(char *var, char *value) } } } - newenv = (char **) GC_malloc((i + 2) * sizeof(char *)); + newenv = (char **)GC_malloc((i + 2) * sizeof(char *)); if (newenv == NULL) return; - for (e = environ, ne = newenv; *e != NULL; *(ne++) = *(e++)); + for (e = environ, ne = newenv; *e != NULL; *(ne++) = *(e++)) ; *(ne++) = p; *ne = NULL; environ = newenv; @@ -266,7 +267,7 @@ set_cgi_environ(char *name, char *fn, char *req_uri) set_environ("SCRIPT_NAME", name); set_environ("SCRIPT_FILENAME", fn); set_environ("REQUEST_URI", req_uri); - set_environ("LOCAL_COOKIE",Local_cookie); + set_environ("LOCAL_COOKIE", Local_cookie); } static Str @@ -296,7 +297,7 @@ cgi_filename(char *fn, int *status) struct stat st; if (cgi_bin != NULL && strncmp(fn, "/cgi-bin/", 9) == 0) { *status = CGIFN_CGIBIN; - if (strchr(fn+9,'/')) + if (strchr(fn + 9, '/')) *status |= CGIFN_CONTAIN_SLASH; tmp = checkPath(fn + 9, cgi_bin); if (tmp == NULL) @@ -307,7 +308,7 @@ cgi_filename(char *fn, int *status) *status = CGIFN_NORMAL; tmp = Strnew_charp(w3m_lib_dir()); fn += 5; - if (strchr(fn+1,'/')) + if (strchr(fn + 1, '/')) *status |= CGIFN_CONTAIN_SLASH; if (Strlastchar(tmp) == '/') fn++; @@ -316,7 +317,7 @@ cgi_filename(char *fn, int *status) } if (*fn == '/' && document_root != NULL && stat(fn, &st) < 0) { *status = CGIFN_DROOT; - if (strchr(fn+1,'/')) + if (strchr(fn + 1, '/')) *status |= CGIFN_CONTAIN_SLASH; tmp = Strnew_charp(document_root); if (Strlastchar(tmp) != '/') @@ -329,55 +330,57 @@ cgi_filename(char *fn, int *status) } static pid_t -localcgi_popen_r(FILE **p_fp) +localcgi_popen_r(FILE ** p_fp) { - int fd[2]; - FILE *fp; - pid_t pid; - Str emsg; - - if (pipe(fd) < 0) { - emsg = Sprintf("localcgi_popen_r: pipe: %s", strerror(errno)); - disp_err_message(emsg->ptr, FALSE); - return (pid_t)-1; - } + int fd[2]; + FILE *fp; + pid_t pid; + Str emsg; - flush_tty(); - if ((pid = fork()) < 0) { - emsg = Sprintf("localcgi_popen_r: fork: %s", strerror(errno)); - disp_err_message(emsg->ptr, FALSE); - close(fd[0]); - close(fd[1]); - return (pid_t)-1; - } - else if (!pid) { - close_tty(); - dup2(fd[1], 1); + if (pipe(fd) < 0) { + emsg = Sprintf("localcgi_popen_r: pipe: %s", strerror(errno)); + disp_err_message(emsg->ptr, FALSE); + return (pid_t) - 1; + } - if (fd[1] > 1) - close(fd[1]); + flush_tty(); + if ((pid = fork()) < 0) { + emsg = Sprintf("localcgi_popen_r: fork: %s", strerror(errno)); + disp_err_message(emsg->ptr, FALSE); + close(fd[0]); + close(fd[1]); + return (pid_t) - 1; + } + else if (!pid) { + close_tty(); + dup2(fd[1], 1); - close(fd[0]); - } - else { - close(fd[1]); + if (fd[1] > 1) + close(fd[1]); - if (!(fp = fdopen(fd[0], "r"))) { - emsg = Sprintf("localcgi_popen_r: fdopen(%d, \"r\"): %s", fd[0], strerror(errno)); - disp_err_message(emsg->ptr, FALSE); - kill(pid, SIGTERM); - close(fd[0]); - return (pid_t)-1; + close(fd[0]); } + else { + close(fd[1]); + + if (!(fp = fdopen(fd[0], "r"))) { + emsg = + Sprintf("localcgi_popen_r: fdopen(%d, \"r\"): %s", fd[0], + strerror(errno)); + disp_err_message(emsg->ptr, FALSE); + kill(pid, SIGTERM); + close(fd[0]); + return (pid_t) - 1; + } - *p_fp = fp; - } + *p_fp = fp; + } - return pid; + return pid; } FILE * -localcgi_post(char *uri, char *qstr, FormList * request, char *referer) +localcgi_post(char *uri, char *qstr, FormList *request, char *referer) { FILE *f, *f1; Str tmp1; @@ -391,27 +394,28 @@ localcgi_post(char *uri, char *qstr, FormList * request, char *referer) tmp1 = tmpfname(TMPF_DFL, NULL); f1 = fopen(tmp1->ptr, "w"); if (f1 == NULL) - return NULL; + return NULL; pushText(fileToDelete, tmp1->ptr); if ((pid = localcgi_popen_r(&f))) { - fclose(f1); - return pid > 0 ? f : NULL; + fclose(f1); + return pid > 0 ? f : NULL; } if (qstr == NULL) { - set_cgi_environ(uri, file, uri); - } else { - set_cgi_environ(uri, file, - Strnew_m_charp(uri, "?", qstr, NULL)->ptr); + set_cgi_environ(uri, file, uri); + } + else { + set_cgi_environ(uri, file, Strnew_m_charp(uri, "?", qstr, NULL)->ptr); } set_environ("REQUEST_METHOD", "POST"); if (qstr) - set_environ("QUERY_STRING", qstr); + set_environ("QUERY_STRING", qstr); set_environ("CONTENT_LENGTH", Sprintf("%d", request->length)->ptr); if (referer && referer != NO_REFERER) - set_environ("HTTP_REFERER",referer); + set_environ("HTTP_REFERER", referer); if (request->enctype == FORM_ENCTYPE_MULTIPART) { set_environ("CONTENT_TYPE", - Sprintf("multipart/form-data; boundary=%s", request->boundary)->ptr); + Sprintf("multipart/form-data; boundary=%s", + request->boundary)->ptr); } else { set_environ("CONTENT_TYPE", "application/x-www-form-urlencoded"); @@ -430,13 +434,13 @@ localcgi_post(char *uri, char *qstr, FormList * request, char *referer) fputs(request->body, f1); } fclose(f1); - freopen( tmp1->ptr, "r", stdin); -#ifdef HAVE_CHDIR /* ifndef __EMX__ ? */ + freopen(tmp1->ptr, "r", stdin); +#ifdef HAVE_CHDIR /* ifndef __EMX__ ? */ chdir(mydirname(file)); #endif execl(file, mybasename(file), NULL); fprintf(stderr, "execl(\"%s\", \"%s\", NULL): %s\n", - file, mybasename(file), strerror(errno)); + file, mybasename(file), strerror(errno)); exit(1); return NULL; } @@ -448,31 +452,32 @@ localcgi_get(char *uri, char *request, char *referer) int status; pid_t pid; char *file; - + file = cgi_filename(uri, &status); if (check_local_cgi(file, status) < 0) return NULL; if ((pid = localcgi_popen_r(&f)) < 0) - return NULL; + return NULL; else if (pid) - return f; + return f; if (!strcmp(request, "")) { - set_cgi_environ(Strnew_charp(uri)->ptr, file, Strnew_charp(uri)->ptr); - } else { - set_cgi_environ(Strnew_charp(uri)->ptr, file, - Strnew_m_charp(uri, "?", request, NULL)->ptr); + set_cgi_environ(Strnew_charp(uri)->ptr, file, Strnew_charp(uri)->ptr); + } + else { + set_cgi_environ(Strnew_charp(uri)->ptr, file, + Strnew_m_charp(uri, "?", request, NULL)->ptr); } if (referer && referer != NO_REFERER) - set_environ("HTTP_REFERER",referer); + set_environ("HTTP_REFERER", referer); set_environ("REQUEST_METHOD", "GET"); set_environ("QUERY_STRING", request); freopen(DEV_NULL_PATH, "r", stdin); -#ifdef HAVE_CHDIR /* ifndef __EMX__? */ +#ifdef HAVE_CHDIR /* ifndef __EMX__? */ chdir(mydirname(file)); #endif execl(file, mybasename(file), NULL); fprintf(stderr, "execl(\"%s\", \"%s\", NULL): %s\n", - file, mybasename(file), strerror(errno)); + file, mybasename(file), strerror(errno)); exit(1); return NULL; } |