chiark / gitweb /
found in davenant:/usr/local/src/misc
[userv-utils.git] / www-cgi / ucgi.c~
1 /*
2  * Usage: as CGI script
3  */
4
5 #include "ucgi.h"
6
7 int 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 }