Subversion Repositories planix.SVN

Rev

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

#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, STACKSIZE, RFFDG);
        close(srvfd[0]);        /* don't deadlock if child fails */

        procrfork(volumeproc, nil, STACKSIZE, 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);
}