165 lines · 2.4 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h>#include <mouse.h>#include "a.h" void*emalloc(ulong n){	void *p;		p = malloc(n);	if(p==nil)		sysfatal("malloc: %r");	return p;} void*erealloc(void *p, ulong n){	void *q;		q = realloc(p, n);	if(q==nil)		sysfatal("realloc: %r");	return q;} Image*eallocimage(int w, int h, ulong chan, int repl, ulong col){	Image *i;		i = allocimage(display, Rect(0, 0, w, h), chan, repl, col);	if(i==nil)		sysfatal("allocimage: %r");	return i;} uchar*readfile(char *f, int *len){	uchar *buf;	int fd, n, s, r;		fd = open(f, OREAD);	if(fd<0)		sysfatal("open: %r");	n = 0;	s = 4096;	buf = emalloc(s);	for(;;){		r = read(fd, buf + n, s - n);		if(r<0)			sysfatal("read: %r");		if(r==0)			break;		n += r;		if(n==s){			s *= 1.5;			buf = erealloc(buf, s);		}	}	buf[n] = 0;	close(fd);	*len = n;	return buf;} intwritefile(char *filename, char *data, int ndata){	int fd; 	fd = create(filename, OWRITE|OEXCL, 0600);	if(fd < 0)		return -1;	if(write(fd, data, ndata) != ndata)		return -1;	close(fd);	return 0;} intfileformat(char *filename){	static struct {		char *k;		int	v;	} mimes[] = {	"text/html",	SVG,	"image/jpeg",	JPEG,	"image/gif",	GIF,	"image/png",	PNG,	"image/bmp",	BMP,	"image/p9bit",	NINE,	};		int fd[2], n, i;	char s[32]; 	if(pipe(fd) < 0)		return -1;	switch(rfork(RFFDG|RFPROC|RFNOWAIT)){	case -1:		close(fd[0]);		close(fd[1]);		return -1;	case 0:		dup(fd[1], 1);		close(fd[1]);		close(fd[0]);		execl("/bin/file", "file", "-m", filename, nil);		_exits("execl");	}	if((n = read(fd[0], s, sizeof s)) <= 0)		return -1;	s[n-1] = 0; /* remove newline */	close(fd[1]);	close(fd[0]);	for(i=0; i<nelem(mimes); i++){		if(strncmp(s, mimes[i].k, strlen(mimes[i].k)) == 0)			return mimes[i].v;	}	werrstr("unknown image type %s", s);	return -1;} Image*ipipeto(Image *in, char *cmd){	Image *out;	int ifd[2], ofd[2];	char *argv[4] = { "rc", "-c", cmd, nil }; 	out = nil;	if(pipe(ifd) < 0)		return nil;	if(pipe(ofd) < 0){		close(ifd[0]);		close(ifd[1]);		return nil;	}	switch(rfork(RFFDG|RFPROC|RFNOWAIT)){	case -1:		goto Err;	case 0:		dup(ifd[1], 0);		dup(ofd[1], 1);		close(ifd[1]);		close(ifd[0]);		close(ofd[1]);		close(ofd[0]);		exec("/bin/rc", argv);		_exits("exec");	}	if(writeimage(ifd[0], in, 1) < 0)		goto Err;	out = readimage(display, ofd[0], 1);Err:	close(ifd[0]);	close(ifd[1]);	close(ofd[0]);	close(ofd[1]);	return out;}