Blame


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