void requestServeDynamic(int fd, char *filename, char *cgiargs, request* req) { char buf[MAXLINE], *emptylist[] = {NULL}; /* The server does only a little bit of the header. */ /* The CGI script has to finish writing out the header. */ sprintf(buf, "HTTP/1.0 200 OK\r\n"); sprintf(buf, "%s Server: Tiny Web Server\r\n", buf); /* CS537: Your statistics go here -- fill in the 0's with something * useful! */ sprintf(buf, "%s Stat-req-arrival: %f\r\n", buf, toMS(req->req_arrival)); sprintf(buf, "%s Stat-req-dispatch: %f\r\n", buf, toMS(req->req_dispatch)); sprintf(buf, "%s Stat-thread-id: %d\r\n", buf, req->t_stats.thread_id); sprintf(buf, "%s Stat-thread-count: %d\r\n", buf, req->t_stats.thread_count); sprintf(buf, "%s Stat-thread-static: %d\r\n", buf, req->t_stats.thread_static); sprintf(buf, "%s Stat-thread-dynamic: %d\r\n", buf, req->t_stats.thread_dynamic); Rio_writen(fd, buf, strlen(buf)); if(Fork() == 0) { /* Child process */ Setenv("QUERY_STRING", cgiargs, 1); /* When the CGI process writes to stdout, it will instead go to * the socket */ Dup2(fd, STDOUT_FILENO); Execve(filename, emptylist, environ); } Wait(NULL); }
word pl_setenv(term_t var, term_t value) { char *n, *v; if ( PL_get_chars(var, &n, CVT_ALL|BUF_RING) && PL_get_chars(value, &v, CVT_ALL) ) { Setenv(n, v); succeed; } return warning("setenv/2: instantiation fault"); }
static void dset(Char *dp) { /* * Don't call set() directly cause if the directory contains ` or * other junk characters glob will fail. */ Char **vec = xreallocarray(NULL, 2, sizeof(*vec)); vec[0] = Strsave(dp); vec[1] = 0; setq(STRcwd, vec, &shvhed); Setenv(STRPWD, dp); }
static void dset(Char *dp) { /* * Don't call set() directly cause if the directory contains ` or * other junk characters glob will fail. */ Char **vec = (Char **) xmalloc((size_t) (2 * sizeof(Char **))); vec[0] = Strsave(dp); vec[1] = 0; setq(STRcwd, vec, &shvhed); Setenv(STRPWD, dp); }
// // name: 未知 // @param // @return // void serve_dynamic(int fd, char *filename, char *cgiargs) { char buf[MAXLINE], *emptylist[] = { NULL }; sprintf(buf, "HTTP/1.0 200 OK\r\n"); rio_writen(fd, buf, strlen(buf)); sprintf(buf, "Server: Tiny Web Server\r\n"); rio_writen(fd, buf, strlen(buf)); if(Fork() == 0) { Setenv("QUERY_STR", cgiargs, 0); Dup2(fd, STDOUT_FILENO); Execve(filename, emptylist, environ); } wait(NULL); }
void requestServeDynamic(int fd, char *filename, char *cgiargs) { char buf[MAXLINE], *emptylist[] = {NULL}; // The server does only a little bit of the header. // The CGI script has to finish writing out the header. sprintf(buf, "HTTP/1.0 200 OK\r\n"); sprintf(buf, "%sServer: CS537 Web Server\r\n", buf); Rio_writen(fd, buf, strlen(buf)); if (Fork() == 0) { /* Child process */ Setenv("QUERY_STRING", cgiargs, 1); /* When the CGI process writes to stdout, it will instead go to the socket */ Dup2(fd, STDOUT_FILENO); Execve(filename, emptylist, environ); } Wait(NULL); }
static void exportpath(Char **val) { Char exppath[BUFSIZ]; exppath[0] = 0; if (val) while (*val) { if (Strlen(*val) + Strlen(exppath) + 2 > BUFSIZ) { (void) fprintf(csherr, "Warning: ridiculously long PATH truncated\n"); break; } (void) Strlcat(exppath, *val++, sizeof exppath/sizeof(Char)); if (*val == 0 || eq(*val, STRRparen)) break; (void) Strlcat(exppath, STRcolon, sizeof exppath/sizeof(Char)); } Setenv(STRPATH, exppath); }
void /*ARGSUSED*/ doset(Char **v, struct command *t) { Char *p; Char *vp, op; Char **vecp; bool hadsub; int subscr; v++; p = *v++; if (p == 0) { prvars(); return; } do { hadsub = 0; vp = p; if (letter(*p)) for (; alnum(*p); p++) continue; if (vp == p || !letter(*vp)) stderror(ERR_NAME | ERR_VARBEGIN); if ((p - vp) > MAXVARLEN) { stderror(ERR_NAME | ERR_VARTOOLONG); return; } if (*p == '[') { hadsub++; p = getinx(p, &subscr); } if ((op = *p) != '\0') { *p++ = 0; if (*p == 0 && *v && **v == '(') p = *v++; } else if (*v && eq(*v, STRequal)) { op = '=', v++; if (*v) p = *v++; } if (op && op != '=') stderror(ERR_NAME | ERR_SYNTAX); if (eq(p, STRLparen)) { Char **e = v; if (hadsub) stderror(ERR_NAME | ERR_SYNTAX); for (;;) { if (!*e) stderror(ERR_NAME | ERR_MISSING, ')'); if (**e == ')') break; e++; } p = *e; *e = 0; vecp = saveblk(v); set1(vp, vecp, &shvhed); *e = p; v = e + 1; } else if (hadsub) asx(vp, subscr, Strsave(p)); else set(vp, Strsave(p)); if (eq(vp, STRpath)) { exportpath(adrof(STRpath)->vec); dohash(NULL, NULL); } else if (eq(vp, STRhistchars)) { Char *pn = value(STRhistchars); HIST = *pn++; HISTSUB = *pn; } else if (eq(vp, STRuser)) { Setenv(STRUSER, value(vp)); Setenv(STRLOGNAME, value(vp)); } else if (eq(vp, STRwordchars)) { word_chars = value(vp); } else if (eq(vp, STRterm)) Setenv(STRTERM, value(vp)); else if (eq(vp, STRhome)) { Char *cp; cp = Strsave(value(vp)); /* get the old value back */ /* * convert to canonical pathname (possibly resolving symlinks) */ cp = dcanon(cp, cp); set(vp, Strsave(cp)); /* have to save the new val */ /* and now mirror home with HOME */ Setenv(STRHOME, cp); /* fix directory stack for new tilde home */ dtilde(); free(cp); } else if (eq(vp, STRfilec)) filec = 1; } while ((p = *v++) != NULL); }