6c8e44a5 |
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 | } |