ref: 19d6a98038953b27f539e1fd2187b7cfec9b108d
dir: /sys/src/cmd/mothra/snoop.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <event.h> #include <panel.h> #include <ctype.h> #include "mothra.h" int filetype(int fd, char *typ, int ntyp) { int ifd[2], ofd[2], xfd[2], n; char *argv[3], buf[4096]; typ[0] = 0; if((n = readn(fd, buf, sizeof(buf))) < 0) return -1; if(n == 0) return 0; if(pipe(ifd) < 0) return -1; if(pipe(ofd) < 0){ Err1: close(ifd[0]); close(ifd[1]); return -1; } switch(rfork(RFFDG|RFPROC|RFNOWAIT)){ case -1: close(ofd[0]); close(ofd[1]); goto Err1; case 0: dup(ifd[1], 0); dup(ofd[1], 1); close(ifd[1]); close(ifd[0]); close(ofd[1]); close(ofd[0]); close(fd); argv[0] = "file"; argv[1] = "-m"; argv[2] = 0; exec("/bin/file", argv); } close(ifd[1]); close(ofd[1]); if(rfork(RFFDG|RFPROC|RFNOWAIT) == 0){ close(fd); close(ofd[0]); write(ifd[0], buf, n); exits(nil); } close(ifd[0]); if(pipe(xfd) < 0){ close(ofd[0]); return -1; } switch(rfork(RFFDG|RFPROC|RFNOWAIT)){ case -1: break; case 0: close(ofd[0]); close(xfd[0]); do { if(write(xfd[1], buf, n) != n) break; } while((n = read(fd, buf, sizeof(buf))) > 0); exits(nil); default: dup(xfd[0], fd); } close(xfd[0]); close(xfd[1]); if((n = readn(ofd[0], typ, ntyp-1)) < 0) n = 0; close(ofd[0]); while(n > 0 && typ[n-1] == '\n') n--; typ[n] = 0; return 0; } int snooptype(int fd) { static struct { char *typ; int val; } tab[] = { "text/plain", PLAIN, "text/html", HTML, "image/jpeg", JPEG, "image/gif", GIF, "image/png", PNG, "image/bmp", BMP, "image/x-icon", ICO, "application/pdf", PAGE, "application/postscript", PAGE, "application/ghostscript", PAGE, "application/troff", PAGE, "image/", PAGE, "text/", PLAIN, "message/rfc822", PLAIN, }; char buf[128]; int i; if(filetype(fd, buf, sizeof(buf)) < 0) return -1; for(i=0; i<nelem(tab); i++) if(strncmp(buf, tab[i].typ, strlen(tab[i].typ)) == 0) return tab[i].val; return -1; }