1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <fcall.h>
#include "playlist.h"
int debug;
char *user;
int srvfd[2];
int aflag;
void
usage(void)
{
sysfatal("usage: %s [-d bitmask] [-s] [-m mountpoint]", argv0);
}
void
post(char *name, int sfd)
{
int fd;
char buf[32];
fd = create(name, OWRITE, 0666);
if(fd < 0)
return;
sprint(buf, "%d", sfd);
if(write(fd, buf, strlen(buf)) != strlen(buf))
sysfatal("srv write: %r");
close(fd);
}
void
threadmain(int argc, char *argv[])
{
char *srvfile;
char *srvpost;
char *mntpt;
int i;
mntpt = "/mnt";
srvpost = nil;
rfork(RFNOTEG);
ARGBEGIN{
case 'a':
aflag = 1;
break;
case 'm':
mntpt = ARGF();
break;
case 'd':
debug = strtoul(ARGF(), nil, 0);
break;
case 's':
srvpost = ARGF();
break;
default:
usage();
}ARGEND
user = strdup(getuser());
quotefmtinstall();
if(debug)
fmtinstall('F', fcallfmt);
volumechan = chancreate(sizeof(volume), 1);
playchan = chancreate(sizeof(Wmsg), 1);
playlistreq = chancreate(sizeof(Wmsg), 0); /* No storage! requires rendez-vous */
workers = chancreate(sizeof(Worker*), 256);
for(i = 1; i < Nqid; i++)
files[i].workers = chancreate(sizeof(Worker*), 256);
if(pipe(srvfd) < 0)
sysfatal("pipe failed: %r");
procrfork(srv, nil, 8192, RFFDG);
close(srvfd[0]); /* don't deadlock if child fails */
procrfork(volumeproc, nil, 8192, RFFDG);
playinit();
if(srvpost){
srvfile = smprint("/srv/playlist.%s", srvpost);
remove(srvfile);
post(srvfile, srvfd[1]);
free(srvfile);
}
if(mount(srvfd[1], -1, mntpt, MBEFORE, "") < 0)
sysfatal("mount failed: %r");
threadexits(nil);
}
|