plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

util.c (1958B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <draw.h>
      4 #include <thread.h>
      5 #include <bio.h>
      6 #include <cursor.h>
      7 #include "page.h"
      8 
      9 void*
     10 emalloc(int sz)
     11 {
     12 	void *v;
     13 	v = malloc(sz);
     14 	if(v == nil) {
     15 		fprint(2, "out of memory allocating %d\n", sz);
     16 		wexits("mem");
     17 	}
     18 	memset(v, 0, sz);
     19 	return v;
     20 }
     21 
     22 void*
     23 erealloc(void *v, int sz)
     24 {
     25 	v = realloc(v, sz);
     26 	if(v == nil) {
     27 		fprint(2, "out of memory allocating %d\n", sz);
     28 		wexits("mem");
     29 	}
     30 	return v;
     31 }
     32 
     33 char*
     34 estrdup(char *s)
     35 {
     36 	char *t;
     37 	if((t = strdup(s)) == nil) {
     38 		fprint(2, "out of memory in strdup(%.10s)\n", s);
     39 		wexits("mem");
     40 	}
     41 	return t;
     42 }
     43 
     44 /*
     45  * spool standard input to /tmp.
     46  * we've already read the initial in bytes into ibuf.
     47  */
     48 int
     49 spooltodisk(uchar *ibuf, int in, char **name)
     50 {
     51 	uchar buf[8192];
     52 	int fd, n;
     53 
     54 	strcpy(tempfile, "/tmp/pagespoolXXXXXXXXX");
     55 	fd = opentemp(tempfile, ORDWR);
     56 	if(name)
     57 		*name = estrdup(tempfile);
     58 
     59 	if(write(fd, ibuf, in) != in){
     60 		fprint(2, "error writing temporary file\n");
     61 		wexits("write temp");
     62 	}
     63 
     64 	while((n = read(stdinfd, buf, sizeof buf)) > 0){
     65 		if(write(fd, buf, n) != n){
     66 			fprint(2, "error writing temporary file\n");
     67 			wexits("write temp0");
     68 		}
     69 	}
     70 	seek(fd, 0, 0);
     71 	return fd;
     72 }
     73 
     74 typedef struct StdinArg StdinArg;
     75 
     76 struct StdinArg {
     77 	Channel *cp;
     78 	uchar	*ibuf;
     79 	int	in;
     80 };
     81 
     82 /*
     83  * spool standard input into a pipe.
     84  * we've already ready the first in bytes into ibuf
     85  */
     86 static void
     87 _stdinpipe(void *a)
     88 {
     89 	uchar buf[8192];
     90 	StdinArg *arg;
     91 	int p[2];
     92 	int n;
     93 
     94 	arg = a;
     95 
     96 	if(pipe(p) < 0){
     97 		fprint(2, "pipe fails: %r\n");
     98 		wexits("pipe");
     99 	}
    100 
    101 	send(arg->cp, &p[0]);
    102 
    103 	write(p[1], arg->ibuf, arg->in);
    104 	while((n = read(stdinfd, buf, sizeof buf)) > 0)
    105 		write(p[1], buf, n);
    106 
    107 	close(p[1]);
    108 	threadexits(0);
    109 }
    110 
    111 int
    112 stdinpipe(uchar *ibuf, int in) {
    113 	StdinArg arg;
    114 	int fd;
    115 
    116 	arg.ibuf = ibuf;
    117 	arg.in = in;
    118 	arg.cp = chancreate(sizeof(int), 0);
    119 	proccreate(_stdinpipe, &arg, mainstacksize);
    120 	recv(arg.cp, &fd);
    121 	chanfree(arg.cp);
    122 
    123 	return fd;
    124 }