1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <libg.h> 5 #include "sky.h" 6 7 void 8 display(Picture *pic) 9 { 10 int p[2]; 11 int i, n; 12 uchar *a; 13 14 15 if(pipe(p) < 0){ 16 fprint(2, "pipe failed: %r\n"); 17 return; 18 } 19 switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){ 20 case -1: 21 fprint(2, "fork failed: %r\n"); 22 return; 23 24 case 0: 25 close(p[1]); 26 dup(p[0], 10); 27 close(p[0]); 28 execl("/bin/fb/9v", "9v", "/fd/10", 0); 29 fprint(2, "exec failed: %r\n"); 30 exits("exec"); 31 32 default: 33 close(p[0]); 34 fprint(p[1], "%11d %11d %11d %11d %11d ", 35 3, pic->minx, pic->miny, pic->maxx, pic->maxy); 36 n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny); 37 /* release the memory as we hand it off; this could be a big piece of data */ 38 a = pic->data; 39 while(n > 0){ 40 i = 8192 - (((int)a)&8191); 41 if(i > n) 42 i = n; 43 if(write(p[1], a, i)!=i) 44 fprint(2, "write error: %r\n"); 45 if(i == 8192) /* page aligned */ 46 segfree(a, i); 47 n -= i; 48 a += i; 49 } 50 free(pic->data); 51 free(pic); 52 close(p[1]); 53 break; 54 } 55 } 56