/* * Usage: as CGI script */ #include "ucgi.h" int main(int argc, const char **argv) { char *defarg; const char *slash2, *pathi, *ev, *en, *av; const char *const *ep; const char **arguments; size_t usernamelen; pathi= getenv("PATH_INFO"); if (pathi[0] != '/' || pathi[1] != '~') error("PATH_INFO must start with /~"); slash2= strchr(pathi,'/'); if (!slash2) error("PATH_INFO must have more than one /"); usernamelen= slash2-(pathi+2); if (usernamelen > MAX_USERNAME_LEN) error("PATH_INFO username too long"); username= xmalloc(usernamelen+1); memcpy(username,pathi+2); username[usernamelen]= 0; if (!isalpha(username[0])) error("username 1st character is not alphabetic"); if (setenv("PATH_INFO",slash2,1)) syserror("setenv PATH_INFO"); arguments= xmalloc(sizeof(const char*)*(nenvok+argc+10)); nargs= 0; arguments[0]= "userv"; for (ep= envok; (en= *ep); ep++) { ev= getenv(en); if (!ev) continue; l= strlen(ev); if (l > MAX_ENVVAR_VALUE) error("environment variable too long"); defarg= xmalloc(strlen(en)+l+5); sprintf(defarg,"-D%s=%s",en,ev); arguments[nargs++]= defarg; } arguments[nargs++]= username; arguments[nargs++]= "www-cgi"; while ((av= (*++argv))) arguments[nargs++]= av; arguments[nargs++]= 0; }