Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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