plan9fox/sys/src/cmd/mothra/snoop.c
2012-07-12 18:40:02 +02:00

123 lines
2 KiB
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;
}