xref: /plan9/sys/src/cmd/page/util.c (revision ad6ca847b1a6a504acb0003cd6c5c6d92687369b)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <event.h>
57dd7cddfSDavid du Colombier #include <bio.h>
67dd7cddfSDavid du Colombier #include "page.h"
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier void*
emalloc(int sz)97dd7cddfSDavid du Colombier emalloc(int sz)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier 	void *v;
127dd7cddfSDavid du Colombier 	v = malloc(sz);
137dd7cddfSDavid du Colombier 	if(v == nil) {
147dd7cddfSDavid du Colombier 		fprint(2, "out of memory allocating %d\n", sz);
157dd7cddfSDavid du Colombier 		wexits("mem");
167dd7cddfSDavid du Colombier 	}
177dd7cddfSDavid du Colombier 	memset(v, 0, sz);
187dd7cddfSDavid du Colombier 	return v;
197dd7cddfSDavid du Colombier }
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier void*
erealloc(void * v,int sz)227dd7cddfSDavid du Colombier erealloc(void *v, int sz)
237dd7cddfSDavid du Colombier {
247dd7cddfSDavid du Colombier 	v = realloc(v, sz);
257dd7cddfSDavid du Colombier 	if(v == nil) {
267dd7cddfSDavid du Colombier 		fprint(2, "out of memory allocating %d\n", sz);
277dd7cddfSDavid du Colombier 		wexits("mem");
287dd7cddfSDavid du Colombier 	}
297dd7cddfSDavid du Colombier 	return v;
307dd7cddfSDavid du Colombier }
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier char*
estrdup(char * s)337dd7cddfSDavid du Colombier estrdup(char *s)
347dd7cddfSDavid du Colombier {
357dd7cddfSDavid du Colombier 	char *t;
367dd7cddfSDavid du Colombier 	if((t = strdup(s)) == nil) {
377dd7cddfSDavid du Colombier 		fprint(2, "out of memory in strdup(%.10s)\n", s);
387dd7cddfSDavid du Colombier 		wexits("mem");
397dd7cddfSDavid du Colombier 	}
407dd7cddfSDavid du Colombier 	return t;
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier int
opentemp(char * template)447dd7cddfSDavid du Colombier opentemp(char *template)
457dd7cddfSDavid du Colombier {
467dd7cddfSDavid du Colombier 	int fd, i;
477dd7cddfSDavid du Colombier 	char *p;
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier 	p = estrdup(template);
507dd7cddfSDavid du Colombier 	fd = -1;
517dd7cddfSDavid du Colombier 	for(i=0; i<10; i++){
527dd7cddfSDavid du Colombier 		mktemp(p);
537dd7cddfSDavid du Colombier 		if(access(p, 0) < 0 && (fd=create(p, ORDWR|ORCLOSE, 0400)) >= 0)
547dd7cddfSDavid du Colombier 			break;
557dd7cddfSDavid du Colombier 		strcpy(p, template);
567dd7cddfSDavid du Colombier 	}
577dd7cddfSDavid du Colombier 	if(fd < 0){
587dd7cddfSDavid du Colombier 		fprint(2, "couldn't make temporary file\n");
597dd7cddfSDavid du Colombier 		wexits("Ecreat");
607dd7cddfSDavid du Colombier 	}
617dd7cddfSDavid du Colombier 	strcpy(template, p);
627dd7cddfSDavid du Colombier 	free(p);
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier 	return fd;
657dd7cddfSDavid du Colombier }
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier /*
687dd7cddfSDavid du Colombier  * spool standard input to /tmp.
697dd7cddfSDavid du Colombier  * we've already read the initial in bytes into ibuf.
707dd7cddfSDavid du Colombier  */
717dd7cddfSDavid du Colombier int
spooltodisk(uchar * ibuf,int in,char ** name)727dd7cddfSDavid du Colombier spooltodisk(uchar *ibuf, int in, char **name)
737dd7cddfSDavid du Colombier {
747dd7cddfSDavid du Colombier 	uchar buf[8192];
757dd7cddfSDavid du Colombier 	int fd, n;
767dd7cddfSDavid du Colombier 	char temp[40];
777dd7cddfSDavid du Colombier 
787dd7cddfSDavid du Colombier 	strcpy(temp, "/tmp/pagespoolXXXXXXXXX");
797dd7cddfSDavid du Colombier 	fd = opentemp(temp);
807dd7cddfSDavid du Colombier 	if(name)
817dd7cddfSDavid du Colombier 		*name = estrdup(temp);
827dd7cddfSDavid du Colombier 
837dd7cddfSDavid du Colombier 	if(write(fd, ibuf, in) != in){
847dd7cddfSDavid du Colombier 		fprint(2, "error writing temporary file\n");
857dd7cddfSDavid du Colombier 		wexits("write temp");
867dd7cddfSDavid du Colombier 	}
877dd7cddfSDavid du Colombier 
887dd7cddfSDavid du Colombier 	while((n = read(stdinfd, buf, sizeof buf)) > 0){
897dd7cddfSDavid du Colombier 		if(write(fd, buf, n) != n){
907dd7cddfSDavid du Colombier 			fprint(2, "error writing temporary file\n");
917dd7cddfSDavid du Colombier 			wexits("write temp0");
927dd7cddfSDavid du Colombier 		}
937dd7cddfSDavid du Colombier 	}
947dd7cddfSDavid du Colombier 	seek(fd, 0, 0);
957dd7cddfSDavid du Colombier 	return fd;
967dd7cddfSDavid du Colombier }
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier /*
997dd7cddfSDavid du Colombier  * spool standard input into a pipe.
1007dd7cddfSDavid du Colombier  * we've already ready the first in bytes into ibuf
1017dd7cddfSDavid du Colombier  */
1027dd7cddfSDavid du Colombier int
stdinpipe(uchar * ibuf,int in)1037dd7cddfSDavid du Colombier stdinpipe(uchar *ibuf, int in)
1047dd7cddfSDavid du Colombier {
1057dd7cddfSDavid du Colombier 	uchar buf[8192];
1067dd7cddfSDavid du Colombier 	int n;
1077dd7cddfSDavid du Colombier 	int p[2];
1087dd7cddfSDavid du Colombier 	if(pipe(p) < 0){
1097dd7cddfSDavid du Colombier 		fprint(2, "pipe fails: %r\n");
1107dd7cddfSDavid du Colombier 		wexits("pipe");
1117dd7cddfSDavid du Colombier 	}
1127dd7cddfSDavid du Colombier 
1137dd7cddfSDavid du Colombier 	switch(rfork(RFMEM|RFPROC|RFFDG)){
1147dd7cddfSDavid du Colombier 	case -1:
1157dd7cddfSDavid du Colombier 		fprint(2, "fork fails: %r\n");
1167dd7cddfSDavid du Colombier 		wexits("fork");
1177dd7cddfSDavid du Colombier 	default:
1187dd7cddfSDavid du Colombier 		close(p[1]);
1197dd7cddfSDavid du Colombier 		return p[0];
1207dd7cddfSDavid du Colombier 	case 0:
1217dd7cddfSDavid du Colombier 		break;
1227dd7cddfSDavid du Colombier 	}
1237dd7cddfSDavid du Colombier 
1247dd7cddfSDavid du Colombier 	close(p[0]);
1257dd7cddfSDavid du Colombier 	write(p[1], ibuf, in);
1267dd7cddfSDavid du Colombier 	while((n = read(stdinfd, buf, sizeof buf)) > 0)
1277dd7cddfSDavid du Colombier 		write(p[1], buf, n);
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier 	_exits(0);
1307dd7cddfSDavid du Colombier 	return -1;	/* not reached */
1317dd7cddfSDavid du Colombier }
132*ad6ca847SDavid du Colombier 
133*ad6ca847SDavid du Colombier /* try to update the label, but don't fail on any errors */
134*ad6ca847SDavid du Colombier void
setlabel(char * label)135*ad6ca847SDavid du Colombier setlabel(char *label)
136*ad6ca847SDavid du Colombier {
137*ad6ca847SDavid du Colombier 	char *s;
138*ad6ca847SDavid du Colombier 	int fd;
139*ad6ca847SDavid du Colombier 
140*ad6ca847SDavid du Colombier 	s = smprint("%s/label", display->windir);
141*ad6ca847SDavid du Colombier 	if (s == nil)
142*ad6ca847SDavid du Colombier 		return;
143*ad6ca847SDavid du Colombier 	fd = open(s, OWRITE);
144*ad6ca847SDavid du Colombier 	free(s);
145*ad6ca847SDavid du Colombier 	if(fd >= 0){
146*ad6ca847SDavid du Colombier 		write(fd, label, strlen(label));
147*ad6ca847SDavid du Colombier 		close(fd);
148*ad6ca847SDavid du Colombier 	}
149*ad6ca847SDavid du Colombier 	werrstr("");
150*ad6ca847SDavid du Colombier }
151