Blob
1 #include <u.h>2 #include <libc.h>3 #include <draw.h>5 extern vlong _drawflength(int);6 int _fontpipe(char*);8 Font*9 openfont(Display *d, char *name)10 {11 Font *fnt;12 int fd, i, n;13 char *buf, *nambuf;15 nambuf = 0;16 fd = open(name, OREAD);18 if(fd < 0 && strncmp(name, "/lib/font/bit/", 14) == 0){19 nambuf = smprint("#9/font/%s", name+14);20 if(nambuf == nil)21 return 0;22 nambuf = unsharp(nambuf);23 if(nambuf == nil)24 return 0;25 if((fd = open(nambuf, OREAD)) < 0){26 free(nambuf);27 return 0;28 }29 name = nambuf;30 }31 if(fd >= 0)32 n = _drawflength(fd);33 if(fd < 0 && strncmp(name, "/mnt/font/", 10) == 0) {34 fd = _fontpipe(name+10);35 n = 8192;36 }37 if(fd < 0)38 return 0;40 buf = malloc(n+1);41 if(buf == 0){42 close(fd);43 free(nambuf);44 return 0;45 }46 i = readn(fd, buf, n);47 close(fd);48 if(i <= 0){49 free(buf);50 free(nambuf);51 return 0;52 }53 buf[i] = 0;54 fnt = buildfont(d, buf, name);55 free(buf);56 free(nambuf);57 return fnt;58 }60 int61 _fontpipe(char *name)62 {63 int p[2];64 char c;65 char buf[1024], *argv[10];66 int nbuf, pid;68 if(pipe(p) < 0)69 return -1;70 pid = rfork(RFNOWAIT|RFFDG|RFPROC);71 if(pid < 0) {72 close(p[0]);73 close(p[1]);74 return -1;75 }76 if(pid == 0) {77 close(p[0]);78 dup(p[1], 1);79 dup(p[1], 2);80 if(p[1] > 2)81 close(p[1]);82 argv[0] = "fontsrv";83 argv[1] = "-pp";84 argv[2] = name;85 argv[3] = nil;86 execvp("fontsrv", argv);87 print("exec fontsrv: %r\n");88 _exit(0);89 }90 close(p[1]);92 // success marked with leading \001.93 // otherwise an error happened.94 for(nbuf=0; nbuf<sizeof buf-1; nbuf++) {95 if(read(p[0], &c, 1) < 1 || c == '\n') {96 buf[nbuf] = '\0';97 werrstr(buf);98 close(p[0]);99 return -1;100 }101 if(c == '\001')102 break;103 }104 return p[0];105 }