int hsettype(HConnect *c, char *type) { Hio *hout; int r; r = preq(c); if(r < 0) return r; hout = &c->hout; if(c->req.vermaj){ hokheaders(c); hprint(hout, "Content-type: %s\r\n", type); if(http11(c)) hprint(hout, "Transfer-Encoding: chunked\r\n"); hprint(hout, "\r\n"); } if(http11(c)) hxferenc(hout, 1); else c->head.closeit = 1; return 0; }
void manindex(int sect, int vermaj) { int i; if(vermaj){ hokheaders(connect); hprint(hout, "Content-type: text/html\r\n"); hprint(hout, "\r\n"); } hprint(hout, "<head><title>plan 9 section index"); if(sect) hprint(hout, "(%d)\n", sect); hprint(hout, "</title></head><body>\n"); hprint(hout, "<H6>Section Index"); if(sect) hprint(hout, "(%d)\n", sect); hprint(hout, "</H6>\n"); if(sect) hprint(hout, "<p><a href=\"/plan9/man%d.html\">/plan9/man%d.html</a>\n", sect, sect); else for(i = 1; i < 10; i++) hprint(hout, "<p><a href=\"/plan9/man%d.html\">/plan9/man%d.html</a>\n", i, i); hprint(hout, "</body>\n"); }
void man(char *o, int sect, int vermaj) { int i; Hit *list; list = nil; if(*o == 0){ manindex(sect, vermaj); return; } if(sect > 0 && sect < 10) lookup(o, sect, &list); else for(i = 1; i < 9; i++) lookup(o, i, &list); if(list != nil && list->next == nil){ doconvert(list->file, vermaj); return; } if(vermaj){ hokheaders(connect); hprint(hout, "Content-type: text/html\r\n"); hprint(hout, "\r\n"); } hprint(hout, "<head><title>plan 9 man %H", o); if(sect) hprint(hout, "(%d)\n", sect); hprint(hout, "</title></head><body>\n"); hprint(hout, "<H6>Search for %H", o); if(sect) hprint(hout, "(%d)\n", sect); hprint(hout, "</H6>\n"); for(; list; list = list->next) hprint(hout, "<p><a href=\"/magic/man2html%U\">/magic/man2html%H</a>\n", list->file, list->file); hprint(hout, "</body>\n"); }
/* * find man pages mentioning the search string */ void dosearch(int vermaj, char *search) { int sect; char *p; if(strncmp(search, "man=", 4) == 0){ sect = 0; search = hurlunesc(connect, search+4); p = strchr(search, '&'); if(p != nil){ *p++ = 0; if(strncmp(p, "sect=", 5) == 0) sect = atoi(p+5); } man(search, sect, vermaj); return; } if(vermaj){ hokheaders(connect); hprint(hout, "Content-type: text/html\r\n"); hprint(hout, "\r\n"); } if(strncmp(search, "pat=", 4) == 0){ search = hurlunesc(connect, search+4); search = hlower(search); searchfor(search); return; } hprint(hout, "<head><title>illegal search</title></head>\n"); hprint(hout, "<body><p>Illegally formatted Plan 9 man page search</p>\n"); search = hurlunesc(connect, search); hprint(hout, "<body><p>%H</p>\n", search); hprint(hout, "</body>"); }
static void dols(char *dir) { Dir *d; char *f, *p,*nm; long i, n; int fd; cleanname(dir); // expands "" to "."; ``dir+1'' access below depends on that if (!allowed(dir)) { error("Permission denied", "<p>Cannot list directory %s: Access prohibited</p>", dir); return; } fd = open(dir, OREAD); if (fd < 0) { error("Cannot read directory", "<p>Cannot read directory %s: %r</p>", dir); return; } if (vermaj) { hokheaders(connect); hprint(hout, "Content-type: text/html\r\n"); hprint(hout, "\r\n"); } doctype(); hprint(hout, "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"); hprint(hout, "<head><title>Index of %s</title></head>\n", dir); hprint(hout, "<body>\n"); hprint(hout, "<h1>Index of "); nm = dir; while((p = strchr(nm, '/')) != nil){ *p = '\0'; f = (*dir == '\0') ? "/" : dir; if (!(*dir == '\0' && *(dir+1) == '\0') && allowed(f)) hprint(hout, "<a href=\"/magic/webls?dir=%H\">%s/</a>", f, nm); else hprint(hout, "%s/", nm); *p = '/'; nm = p+1; } hprint(hout, "%s</h1>\n", nm); n = dirreadall(fd, &d); close(fd); maxwidths(d, n); qsort(d, n, sizeof(Dir), (int (*)(void *, void *))compar); hprint(hout, "<pre>\n"); for (i = 0; i < n; i++) { f = smprint("%s/%s", dir, d[i].name); cleanname(f); if (d[i].mode & DMDIR) { p = smprint("/magic/webls?dir=%H", f); free(f); f = p; } hprint(hout, "%M %C %*ud %-*s %-*s %*lld %s <a href=\"%s\">%s</a>\n", d[i].mode, d[i].type, devwidth, d[i].dev, uidwidth, d[i].uid, gidwidth, d[i].gid, lenwidth, d[i].length, asciitime(d[i].mtime), f, d[i].name); free(f); } f = smprint("%s/..", dir); cleanname(f); if (strcmp(f, dir) != 0 && allowed(f)) hprint(hout, "\nGo to <a href=\"/magic/webls?dir=%H\">parent</a> directory\n", f); else hprint(hout, "\nEnd of directory listing\n"); free(f); hprint(hout, "</pre>\n</body>\n</html>\n"); hflush(hout); free(d); }
/* * convert a man page to html and output */ void doconvert(char *uri, int vermaj) { char *p; char file[256]; char title[256]; char err[ERRMAX]; int pfd[2]; Dir *d; Waitmsg *w; int x; if(strstr(uri, "..")) error("bad URI", "man page URI cannot contain .."); p = strstr(uri, "/intro"); if(p == nil){ while(*uri == '/') uri++; /* redirect section requests */ snprint(file, sizeof(file), "/sys/man/%s", uri); d = dirstat(file); if(d == nil){ strlwr(file); if(dirstat(file) != nil){ snprint(file, sizeof(file), "/magic/man2html/%s", uri); strlwr(file); redirectto(file); } error(uri, "man page not found"); } x = d->qid.type; free(d); if(x & QTDIR){ if(*uri == 0 || strcmp(uri, "/") == 0) redirectto("/sys/man/index.html"); else { snprint(file, sizeof(file), "/sys/man/%s/INDEX.html", uri+1); redirectto(file); } return; } } else { /* rewrite the name intro */ *p = 0; snprint(file, sizeof(file), "/sys/man/%s/0intro", uri); d = dirstat(file); free(d); if(d == nil) error(uri, "man page not found"); } if(vermaj){ hokheaders(connect); hprint(hout, "Content-type: text/html\r\n"); hprint(hout, "\r\n"); } hflush(hout); if(pipe(pfd) < 0) error("out of resources", "pipe failed"); /* troff -manhtml <file> | troff2html -t '' */ switch(fork()){ case -1: error("out of resources", "fork failed"); case 0: snprint(title, sizeof(title), "Plan 9 %s", file); close(0); dup(pfd[0], 0); close(pfd[0]); close(pfd[1]); execl("/bin/troff2html", "troff2html", "-t", title, nil); errstr(err, sizeof err); exits(err); } switch(fork()){ case -1: error("out of resources", "fork failed"); case 0: snprint(title, sizeof(title), "Plan 9 %s", file); close(0); close(1); dup(pfd[1], 1); close(pfd[0]); close(pfd[1]); execl("/bin/troff", "troff", "-manhtml", file, nil); errstr(err, sizeof err); exits(err); } close(pfd[0]); close(pfd[1]); /* wait for completion */ for(;;){ w = wait(); if(w == nil) break; if(w->msg[0] != 0) print("whoops %s\n", w->msg); free(w); } }