found in chiark:/usr/local/src/davenant
[userv-utils] / www-cgi / ucgi.c~
CommitLineData
6c8e44a5 1/*
2 * Usage: as CGI script
3 */
4
5#include "ucgi.h"
6
7int main(int argc, const char **argv) {
8 char *defarg;
9 const char *slash2, *pathi, *ev, *en, *av;
10 const char *const *ep;
11 const char **arguments;
12 size_t usernamelen;
13
14 pathi= getenv("PATH_INFO");
15 if (pathi[0] != '/' || pathi[1] != '~') error("PATH_INFO must start with /~");
16 slash2= strchr(pathi,'/'); if (!slash2) error("PATH_INFO must have more than one /");
17 usernamelen= slash2-(pathi+2);
18 if (usernamelen > MAX_USERNAME_LEN) error("PATH_INFO username too long");
19 username= xmalloc(usernamelen+1); memcpy(username,pathi+2); username[usernamelen]= 0;
20 if (!isalpha(username[0])) error("username 1st character is not alphabetic");
21 if (setenv("PATH_INFO",slash2,1)) syserror("setenv PATH_INFO");
22
23 arguments= xmalloc(sizeof(const char*)*(nenvok+argc+10));
24 nargs= 0;
25 arguments[0]= "userv";
26 for (ep= envok; (en= *ep); ep++) {
27 ev= getenv(en); if (!ev) continue;
28 l= strlen(ev); if (l > MAX_ENVVAR_VALUE) error("environment variable too long");
29 defarg= xmalloc(strlen(en)+l+5);
30 sprintf(defarg,"-D%s=%s",en,ev);
31 arguments[nargs++]= defarg;
32 }
33 arguments[nargs++]= username;
34 arguments[nargs++]= "www-cgi";
35 while ((av= (*++argv))) arguments[nargs++]= av;
36 arguments[nargs++]= 0;
37}