merge
This commit is contained in:
commit
9b4a2324d3
13 changed files with 1140 additions and 7 deletions
|
|
@ -3,6 +3,7 @@
|
|||
#include <draw.h>
|
||||
|
||||
extern vlong _drawflength(int);
|
||||
int _fontpipe(char*);
|
||||
|
||||
Font*
|
||||
openfont(Display *d, char *name)
|
||||
|
|
@ -27,26 +28,78 @@ openfont(Display *d, char *name)
|
|||
}
|
||||
name = nambuf;
|
||||
}
|
||||
if(fd >= 0)
|
||||
n = _drawflength(fd);
|
||||
if(fd < 0 && strncmp(name, "/mnt/font/", 10) == 0) {
|
||||
fd = _fontpipe(name+10);
|
||||
n = 8192;
|
||||
}
|
||||
if(fd < 0)
|
||||
return 0;
|
||||
|
||||
n = _drawflength(fd);
|
||||
buf = malloc(n+1);
|
||||
if(buf == 0){
|
||||
close(fd);
|
||||
free(nambuf);
|
||||
return 0;
|
||||
}
|
||||
buf[n] = 0;
|
||||
i = read(fd, buf, n);
|
||||
i = readn(fd, buf, n);
|
||||
close(fd);
|
||||
if(i != n){
|
||||
if(i <= 0){
|
||||
free(buf);
|
||||
free(nambuf);
|
||||
return 0;
|
||||
}
|
||||
buf[i] = 0;
|
||||
fnt = buildfont(d, buf, name);
|
||||
free(buf);
|
||||
free(nambuf);
|
||||
return fnt;
|
||||
}
|
||||
|
||||
int
|
||||
_fontpipe(char *name)
|
||||
{
|
||||
int p[2];
|
||||
char c;
|
||||
char buf[1024], *argv[10];
|
||||
int nbuf, pid;
|
||||
|
||||
if(pipe(p) < 0)
|
||||
return -1;
|
||||
pid = rfork(RFNOWAIT|RFFDG|RFPROC);
|
||||
if(pid < 0) {
|
||||
close(p[0]);
|
||||
close(p[1]);
|
||||
return -1;
|
||||
}
|
||||
if(pid == 0) {
|
||||
close(p[0]);
|
||||
dup(p[1], 1);
|
||||
dup(p[1], 2);
|
||||
if(p[1] > 2)
|
||||
close(p[1]);
|
||||
argv[0] = "fontsrv";
|
||||
argv[1] = "-pp";
|
||||
argv[2] = name;
|
||||
argv[3] = nil;
|
||||
execvp("fontsrv", argv);
|
||||
print("exec fontsrv: %r\n");
|
||||
_exit(0);
|
||||
}
|
||||
close(p[1]);
|
||||
|
||||
// success marked with leading \001.
|
||||
// otherwise an error happened.
|
||||
for(nbuf=0; nbuf<sizeof buf-1; nbuf++) {
|
||||
if(read(p[0], &c, 1) < 1 || c == '\n') {
|
||||
buf[nbuf] = '\0';
|
||||
werrstr(buf);
|
||||
close(p[0]);
|
||||
return -1;
|
||||
}
|
||||
if(c == '\001')
|
||||
break;
|
||||
}
|
||||
return p[0];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue