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