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 int
61 _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;
101 if(c == '\001')
102 break;
104 return p[0];