X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/2dc2f4788add40c2fe7c8fdede76189b54259155..ba70caca3f9debf14c9f551ff4dcaddd1eb07d3d:/server/server.c diff --git a/server/server.c b/server/server.c index 0b2458d..345c2ca 100644 --- a/server/server.c +++ b/server/server.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004-2008 Richard Kettlewell + * Copyright (C) 2004-2009 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -825,17 +825,18 @@ static int c_volume(struct conn *c, sink_writes(ev_writer_sink(c->w), "510 Prohibited\n"); return 1; } - if(mixer_control(-1/*as configured*/, &l, &r, set)) + if(!api || !api->set_volume) { sink_writes(ev_writer_sink(c->w), "550 error accessing mixer\n"); - else { - sink_printf(ev_writer_sink(c->w), "252 %d %d\n", l, r); - if(l != volume_left || r != volume_right) { - volume_left = l; - volume_right = r; - snprintf(lb, sizeof lb, "%d", l); - snprintf(rb, sizeof rb, "%d", r); - eventlog("volume", lb, rb, (char *)0); - } + return 1; + } + api->set_volume(&l, &r); + sink_printf(ev_writer_sink(c->w), "252 %d %d\n", l, r); + if(l != volume_left || r != volume_right) { + volume_left = l; + volume_right = r; + snprintf(lb, sizeof lb, "%d", l); + snprintf(rb, sizeof rb, "%d", r); + eventlog("volume", lb, rb, (char *)0); } return 1; } @@ -1098,7 +1099,7 @@ static int c_new(struct conn *c, static int c_rtp_address(struct conn *c, char attribute((unused)) **vec, int attribute((unused)) nvec) { - if(config->api == BACKEND_NETWORK) { + if(api == &uaudio_rtp) { sink_printf(ev_writer_sink(c->w), "252 %s %s\n", quoteutf8(config->broadcast.s[0]), quoteutf8(config->broadcast.s[1])); @@ -1573,6 +1574,31 @@ static int c_schedule_add(struct conn *c, return 1; } +static int c_adopt(struct conn *c, + char **vec, + int attribute((unused)) nvec) { + struct queue_entry *q; + + if(!c->who) { + sink_writes(ev_writer_sink(c->w), "550 no identity\n"); + return 1; + } + if(!(q = queue_find(vec[0]))) { + sink_writes(ev_writer_sink(c->w), "550 no such track on the queue\n"); + return 1; + } + if(q->origin != origin_random) { + sink_writes(ev_writer_sink(c->w), "550 not a random track\n"); + return 1; + } + q->origin = origin_adopted; + q->submitter = xstrdup(c->who); + eventlog("adopted", q->id, q->submitter, (char *)0); + queue_write(); + sink_writes(ev_writer_sink(c->w), "250 OK\n"); + return 1; +} + static const struct command { /** @brief Command name */ const char *name; @@ -1594,6 +1620,7 @@ static const struct command { rights_type rights; } commands[] = { { "adduser", 2, 3, c_adduser, RIGHT_ADMIN|RIGHT__LOCAL }, + { "adopt", 1, 1, c_adopt, RIGHT_PLAY }, { "allfiles", 0, 2, c_allfiles, RIGHT_READ }, { "confirm", 1, 1, c_confirm, 0 }, { "cookie", 1, 1, c_cookie, 0 }, @@ -1776,8 +1803,18 @@ static int listen_callback(ev_source *ev, c->ev = ev; c->w = ev_writer_new(ev, fd, writer_error, c, "client writer"); + if(!c->w) { + error(0, "ev_writer_new for file inbound connection (fd=%d) failed", + fd); + close(fd); + return 0; + } c->r = ev_reader_new(ev, fd, redirect_reader_callback, reader_error, c, "client reader"); + if(!c->r) + /* Main reason for failure is the FD is too big and that will already have + * been handled */ + fatal(0, "ev_reader_new for file inbound connection (fd=%d) failed", fd); ev_tie(c->r, c->w); c->fd = fd; c->reader = reader_callback;