Add finer-grained configure options for ogg/vorbis/speex.
[paraslash.git] / command.c
index a9eb03f17e32e35d361baa68db1f532872b35be6..f9ef6cd75ab8733408d3c2542230ae806281bf85 100644 (file)
--- a/command.c
+++ b/command.c
@@ -1,17 +1,19 @@
 /*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file command.c Client authentication and server commands. */
 
+#include <regex.h>
 #include <signal.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <dirent.h>
 #include <openssl/rc4.h>
 #include <osl.h>
+#include <stdbool.h>
 
 #include "para.h"
 #include "error.h"
@@ -22,9 +24,9 @@
 #include "afh.h"
 #include "afs.h"
 #include "server.h"
-#include "vss.h"
 #include "list.h"
 #include "send.h"
+#include "vss.h"
 #include "rc4.h"
 #include "net.h"
 #include "daemon.h"
@@ -190,10 +192,10 @@ static int check_sender_args(int argc, char * const * argv, struct sender_comman
 int com_sender(struct rc4_context *rc4c, int argc, char * const * argv)
 {
        int i, ret;
+       char *msg = NULL;
        struct sender_command_data scd;
 
        if (argc < 2) {
-               char *msg = NULL;
                for (i = 0; senders[i].name; i++) {
                        char *tmp = make_message("%s%s\n",
                                msg? msg : "", senders[i].name);
@@ -206,7 +208,6 @@ int com_sender(struct rc4_context *rc4c, int argc, char * const * argv)
        }
        ret = check_sender_args(argc, argv, &scd);
        if (ret < 0) {
-               char *msg;
                if (scd.sender_num < 0)
                        return ret;
                msg = senders[scd.sender_num].help();
@@ -214,6 +215,16 @@ int com_sender(struct rc4_context *rc4c, int argc, char * const * argv)
                free(msg);
                return ret;
        }
+
+       switch (scd.cmd_num) {
+       case SENDER_ADD:
+       case SENDER_DELETE:
+               assert(senders[scd.sender_num].resolve_target);
+               ret = senders[scd.sender_num].resolve_target(argv[3], &scd);
+               if (ret < 0)
+                       return ret;
+       }
+
        for (i = 0; i < 10; i++) {
                mutex_lock(mmd_mutex);
                if (mmd->sender_cmd_data.cmd_num >= 0) {
@@ -233,7 +244,7 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
 {
        int i, ret;
        char *ut;
-       char *sender_info = NULL, *sender_list = NULL;
+       char *sender_info = NULL;
 
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
@@ -242,8 +253,6 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
                char *info = senders[i].info();
                sender_info = para_strcat(sender_info, info);
                free(info);
-               sender_list = para_strcat(sender_list, senders[i].name);
-               sender_list = para_strcat(sender_list, " ");
        }
        ut = uptime_str();
        ret = rc4_send_va_buffer(rc4c, "up: %s\nplayed: %u\n"
@@ -252,7 +261,6 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
                "connections (active/accepted/total): %u/%u/%u\n"
                "current loglevel: %s\n"
                "supported audio formats: %s\n"
-               "supported senders: %s\n"
                "%s",
                ut, mmd->num_played,
                (int)getppid(),
@@ -261,13 +269,11 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
                mmd->num_commands,
                mmd->num_connects,
                conf.loglevel_arg,
-               supported_audio_formats(),
-               sender_list,
+               SERVER_AUDIO_FORMATS,
                sender_info
        );
        mutex_unlock(mmd_mutex);
        free(ut);
-       free(sender_list);
        free(sender_info);
        return ret;
 }
@@ -452,10 +458,8 @@ int com_help(struct rc4_context *rc4c, int argc, char * const * argv)
        }
        /* argument given for help */
        cmd = get_cmd_ptr(argv[1], &handler);
-       if (!cmd) {
-               free(handler);
+       if (!cmd)
                return -E_BAD_CMD;
-       }
        perms = cmd_perms_itohuman(cmd->perms);
        ret = rc4_send_va_buffer(rc4c,
                "%s - %s\n\n"
@@ -739,24 +743,24 @@ __noreturn void handle_connect(int fd, const char *peername)
        /* we need a blocking fd here as recv() might return EAGAIN otherwise. */
        ret = mark_fd_blocking(fd);
        if (ret < 0)
-               goto err_out;
+               goto net_err;
        /* send Welcome message */
        ret = send_va_buffer(fd, "This is para_server, version "
                PACKAGE_VERSION  ".\n" );
        if (ret < 0)
-               goto err_out;
+               goto net_err;
        /* recv auth request line */
        ret = recv_buffer(fd, buf, sizeof(buf));
        if (ret < 0)
-               goto err_out;
+               goto net_err;
        if (ret < 10) {
                ret = -E_AUTH_REQUEST;
-               goto err_out;
+               goto net_err;
        }
        numbytes = ret;
        ret = -E_AUTH_REQUEST;
        if (strncmp(buf, AUTH_REQUEST_MSG, strlen(AUTH_REQUEST_MSG)))
-               goto err_out;
+               goto net_err;
        p = buf + strlen(AUTH_REQUEST_MSG);
        PARA_DEBUG_LOG("received auth request for user %s\n", p);
        ret = -E_BAD_USER;
@@ -766,7 +770,7 @@ __noreturn void handle_connect(int fd, const char *peername)
                ret = para_encrypt_buffer(u->rsa, rand_buf, sizeof(rand_buf),
                        (unsigned char *)buf);
                if (ret < 0)
-                       goto err_out;
+                       goto net_err;
                numbytes = ret;
        } else {
                /*