]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - command.c
command.c: simplify handle_connect()
[paraslash.git] / command.c
index d317c345314908b4629d7452e2f5fec4cb172f67..474e1bba3edff564dea3c8eb50ded5dc9eff88be 100644 (file)
--- a/command.c
+++ b/command.c
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 1997-2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2007 Andre Noll <maan@systemlinux.org>
  *
  *     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
  *
  *     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
 
 /** \file command.c does client authentication and executes server commands */
 
 
 /** \file command.c does client authentication and executes server commands */
 
-#include <malloc.h> /* mallinfo */
 #include <sys/time.h> /* gettimeofday */
 #include <sys/time.h> /* gettimeofday */
-#include "crypt.h"
 #include "server.cmdline.h"
 #include "db.h"
 #include "server.h"
 #include "server.cmdline.h"
 #include "db.h"
 #include "server.h"
-#include "afs.h"
+#include "vss.h"
 #include "send.h"
 #include "rc4.h"
 #include <openssl/rc4.h>
 #include "send.h"
 #include "rc4.h"
 #include <openssl/rc4.h>
 #include "net.h"
 #include "daemon.h"
 #include "string.h"
 #include "net.h"
 #include "daemon.h"
 #include "string.h"
+#include "fd.h"
+#include "user_list.h"
 
 
-void (*crypt_function_recv)(unsigned long len, const unsigned char *indata,
-       unsigned char *outdata) = NULL;
-void (*crypt_function_send)(unsigned long len, const unsigned char *indata,
-       unsigned char *outdata) = NULL;
 static RC4_KEY rc4_recv_key;
 static RC4_KEY rc4_send_key;
 static unsigned char rc4_buf[2 * RC4_KEY_LEN];
 
 extern const char *status_item_list[NUM_STAT_ITEMS];
 extern struct misc_meta_data *mmd;
 static RC4_KEY rc4_recv_key;
 static RC4_KEY rc4_send_key;
 static unsigned char rc4_buf[2 * RC4_KEY_LEN];
 
 extern const char *status_item_list[NUM_STAT_ITEMS];
 extern struct misc_meta_data *mmd;
-extern struct gengetopt_args_info conf;
-extern struct audio_file_selector dblist[];
-extern struct audio_format afl[];
+extern struct audio_file_selector selectors[];
 extern struct sender senders[];
 extern char *user_list;
 struct sockaddr_in *in_addr;
 extern struct sender senders[];
 extern char *user_list;
 struct sockaddr_in *in_addr;
@@ -85,13 +79,13 @@ static struct server_command cmd_struct[] = {
 {
 .name = "ff",
 .handler = com_ff,
 {
 .name = "ff",
 .handler = com_ff,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "jmp amount of time forwards or backwards "
        "in current audio file",
 .synopsis = "ff n[-]",
 .help =
 
 .description = "jmp amount of time forwards or backwards "
        "in current audio file",
 .synopsis = "ff n[-]",
 .help =
 
-"\tSet the 'R' (reposition request) bit of the afs status flags\n"
+"\tSet the 'R' (reposition request) bit of the vss status flags\n"
 "\tand enqueue a request to jump n seconds forwards or backwards\n"
 "\tin the current audio file.\n"
 "\n"
 "\tand enqueue a request to jump n seconds forwards or backwards\n"
 "\tin the current audio file.\n"
 "\n"
@@ -120,7 +114,7 @@ static struct server_command cmd_struct[] = {
 {
 .name = "hup",
 .handler = com_hup,
 {
 .name = "hup",
 .handler = com_hup,
-.perms = AFS_WRITE,
+.perms = VSS_WRITE,
 .description = "force reload of config file and log file",
 .synopsis = "hup",
 .help =
 .description = "force reload of config file and log file",
 .synopsis = "hup",
 .help =
@@ -133,12 +127,12 @@ static struct server_command cmd_struct[] = {
 {
 .name = "jmp",
 .handler = com_jmp,
 {
 .name = "jmp",
 .handler = com_jmp,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "jmp to given position in current audio file",
 .synopsis = "jmp [n]",
 .help =
 
 .description = "jmp to given position in current audio file",
 .synopsis = "jmp [n]",
 .help =
 
-"\tSet the 'R' (reposition request) bit of the afs status flags\n"
+"\tSet the 'R' (reposition request) bit of the vss status flags\n"
 "\tand enqueue a request to jump to n% of the current audio file,\n"
 "\twhere 0 <= n <= 100.\n"
 
 "\tand enqueue a request to jump to n% of the current audio file,\n"
 "\twhere 0 <= n <= 100.\n"
 
@@ -147,12 +141,12 @@ static struct server_command cmd_struct[] = {
 {
 .name = "next",
 .handler = com_next,
 {
 .name = "next",
 .handler = com_next,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "skip rest of current audio file",
 .synopsis = "next",
 .help =
 
 .description = "skip rest of current audio file",
 .synopsis = "next",
 .help =
 
-"\tSet the 'N' (next audio file) bit of the afs status flags. When\n"
+"\tSet the 'N' (next audio file) bit of the vss status flags. When\n"
 "\tplaying, change audio file immediately. Equivalent to stop\n"
 "\tif paused, NOP if stopped.\n"
 
 "\tplaying, change audio file immediately. Equivalent to stop\n"
 "\tif paused, NOP if stopped.\n"
 
@@ -162,12 +156,12 @@ static struct server_command cmd_struct[] = {
 {
 .name = "nomore",
 .handler = com_nomore,
 {
 .name = "nomore",
 .handler = com_nomore,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "stop playing after current audio file",
 .synopsis = "nomore",
 .help =
 
 .description = "stop playing after current audio file",
 .synopsis = "nomore",
 .help =
 
-"Set the 'O' (no more) bit of the afs status flags. This instructs\n"
+"Set the 'O' (no more) bit of the vss status flags. This instructs\n"
 "para_server to clear the 'P' (playing) bit as soon as it encounters\n"
 "the 'N' (next audio file) bit being set.\n"
 "\n"
 "para_server to clear the 'P' (playing) bit as soon as it encounters\n"
 "the 'N' (next audio file) bit being set.\n"
 "\n"
@@ -179,24 +173,24 @@ static struct server_command cmd_struct[] = {
 {
 .name ="pause",
 .handler = com_pause,
 {
 .name ="pause",
 .handler = com_pause,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "pause current audio file",
 .synopsis = "pause",
 .help =
 
 .description = "pause current audio file",
 .synopsis = "pause",
 .help =
 
-"\tClear the 'P' (playing) bit of the afs status flags.\n"
+"\tClear the 'P' (playing) bit of the vss status flags.\n"
 
 },
 
 {
 .name = "play",
 .handler = com_play,
 
 },
 
 {
 .name = "play",
 .handler = com_play,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "start playing or resume playing when paused",
 .synopsis = "play",
 .help =
 
 .description = "start playing or resume playing when paused",
 .synopsis = "play",
 .help =
 
-"\tSet the 'P' (playing) bit of the afs status flags. This\n"
+"\tSet the 'P' (playing) bit of the vss status flags. This\n"
 "\tresults in starting/continuing to stream.\n"
 
 },
 "\tresults in starting/continuing to stream.\n"
 
 },
@@ -204,7 +198,7 @@ static struct server_command cmd_struct[] = {
 {
 .name = "sb",
 .handler = com_sb,
 {
 .name = "sb",
 .handler = com_sb,
-.perms = AFS_READ,
+.perms = VSS_READ,
 .description = "print status bar for current audio file",
 .synopsis = "sb [n]",
 .help =
 .description = "print status bar for current audio file",
 .synopsis = "sb [n]",
 .help =
@@ -221,7 +215,7 @@ static struct server_command cmd_struct[] = {
 {
 .name = "sc",
 .handler = com_sc,
 {
 .name = "sc",
 .handler = com_sc,
-.perms = AFS_READ,
+.perms = VSS_READ,
 .description = "print name of audio file whenever it changes",
 .synopsis = "sc [n]",
 .help =
 .description = "print name of audio file whenever it changes",
 .synopsis = "sc [n]",
 .help =
@@ -234,7 +228,7 @@ static struct server_command cmd_struct[] = {
 {
 .name = "sender",
 .handler = com_sender,
 {
 .name = "sender",
 .handler = com_sender,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "control paraslash internal senders",
 .synopsis = "sender [s cmd [arguments]]",
 .help =
 .description = "control paraslash internal senders",
 .synopsis = "sender [s cmd [arguments]]",
 .help =
@@ -259,7 +253,7 @@ static struct server_command cmd_struct[] = {
 {
 .name = "stat",
 .handler = com_stat,
 {
 .name = "stat",
 .handler = com_stat,
-.perms = AFS_READ,
+.perms = VSS_READ,
 .description = "print status info for current audio file",
 .synopsis = "stat [n]",
 .help =
 .description = "print status info for current audio file",
 .synopsis = "stat [n]",
 .help =
@@ -273,19 +267,19 @@ static struct server_command cmd_struct[] = {
 {
 .name = "stop",
 .handler = com_stop,
 {
 .name = "stop",
 .handler = com_stop,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "stop playing",
 .synopsis = "stop",
 .help =
 
 .description = "stop playing",
 .synopsis = "stop",
 .help =
 
-"\tClear the 'P' (play) bit and set the 'N' bit of the afs status\n"
+"\tClear the 'P' (play) bit and set the 'N' bit of the vss status\n"
 "\tflags.\n"
 
 },
 {
 .name = "term",
 .handler = com_term,
 "\tflags.\n"
 
 },
 {
 .name = "term",
 .handler = com_term,
-.perms = AFS_READ | AFS_WRITE,
+.perms = VSS_READ | VSS_WRITE,
 .description = "terminate para_server",
 .synopsis = "term",
 .help =
 .description = "terminate para_server",
 .synopsis = "term",
 .help =
@@ -309,7 +303,7 @@ static struct server_command cmd_struct[] = {
 }
 };
 
 }
 };
 
-static void dummy(__unused int s)
+static void dummy(__a_unused int s)
 {}
 
 static void mmd_dup(struct misc_meta_data *new_mmd)
 {}
 
 static void mmd_dup(struct misc_meta_data *new_mmd)
@@ -321,13 +315,13 @@ static void mmd_dup(struct misc_meta_data *new_mmd)
 
 /*
  * compute human readable string containing
 
 /*
  * compute human readable string containing
- * afs_status for given integer value
+ * vss status for given integer value
  */
  */
-static char *afs_status_tohuman(unsigned int flags)
+static char *vss_status_tohuman(unsigned int flags)
 {
 {
-       if (flags & AFS_PLAYING)
+       if (flags & VSS_PLAYING)
                return para_strdup("playing");
                return para_strdup("playing");
-       else if (flags & AFS_NEXT)
+       else if (flags & VSS_NEXT)
                return para_strdup("stopped");
        else
                return para_strdup("paused");
                return para_strdup("stopped");
        else
                return para_strdup("paused");
@@ -342,8 +336,8 @@ char *cmd_perms_itohuman(unsigned int perms)
 
        msg[0] = perms & DB_READ? 'd' : '-';
        msg[1] = perms & DB_WRITE? 'D' : '-';
 
        msg[0] = perms & DB_READ? 'd' : '-';
        msg[1] = perms & DB_WRITE? 'D' : '-';
-       msg[2] = perms & AFS_READ? 'a' : '-';
-       msg[3] = perms & AFS_WRITE? 'A' : '-';
+       msg[2] = perms & VSS_READ? 'a' : '-';
+       msg[3] = perms & VSS_WRITE? 'A' : '-';
        msg[4] = '\0';
        return msg;
 }
        msg[4] = '\0';
        return msg;
 }
@@ -351,14 +345,14 @@ char *cmd_perms_itohuman(unsigned int perms)
 /*
  * Never returns NULL.
  */
 /*
  * Never returns NULL.
  */
-static char *afs_get_status_flags(unsigned int flags)
+static char *vss_get_status_flags(unsigned int flags)
 {
        char *msg = para_malloc(5 * sizeof(char));
 
 {
        char *msg = para_malloc(5 * sizeof(char));
 
-       msg[0] = (flags & AFS_PLAYING)? 'P' : '_';
-       msg[1] = (flags & AFS_NOMORE)? 'O' : '_';
-       msg[2] = (flags & AFS_NEXT)? 'N' : '_';
-       msg[3] = (flags & AFS_REPOS)? 'R' : '_';
+       msg[0] = (flags & VSS_PLAYING)? 'P' : '_';
+       msg[1] = (flags & VSS_NOMORE)? 'O' : '_';
+       msg[2] = (flags & VSS_NEXT)? 'N' : '_';
+       msg[3] = (flags & VSS_REPOS)? 'R' : '_';
        msg[4] = '\0';
        return msg;
 }
        msg[4] = '\0';
        return msg;
 }
@@ -398,7 +392,7 @@ char *get_sb_string(struct misc_meta_data *nmmd)
 static char *get_status(struct misc_meta_data *nmmd)
 {
        char *bar, *ret, mtime[30] = "";
 static char *get_status(struct misc_meta_data *nmmd)
 {
        char *bar, *ret, mtime[30] = "";
-       char *status, *flags; /* afs status info */
+       char *status, *flags; /* vss status info */
        char *ut = uptime_str();
        long offset = (nmmd->offset + 500) / 1000;
        struct timeval now;
        char *ut = uptime_str();
        long offset = (nmmd->offset + 500) / 1000;
        struct timeval now;
@@ -409,8 +403,8 @@ static char *get_status(struct misc_meta_data *nmmd)
                strftime(mtime, 29, "%a %b %d %Y", &mtime_tm);
        }
        /* report real status */
                strftime(mtime, 29, "%a %b %d %Y", &mtime_tm);
        }
        /* report real status */
-       status = afs_status_tohuman(nmmd->afs_status_flags);
-       flags = afs_get_status_flags(nmmd->afs_status_flags);
+       status = vss_status_tohuman(nmmd->vss_status_flags);
+       flags = vss_get_status_flags(nmmd->vss_status_flags);
        bar = para_basename(nmmd->filename);
        gettimeofday(&now, NULL);
        ret = make_message(
        bar = para_basename(nmmd->filename);
        gettimeofday(&now, NULL);
        ret = make_message(
@@ -426,7 +420,7 @@ static char *get_status(struct misc_meta_data *nmmd)
                status_item_list[SI_STATUS_BAR], bar ? bar : "(none)",
                status_item_list[SI_STATUS], status,
                status_item_list[SI_STATUS_FLAGS], flags,
                status_item_list[SI_STATUS_BAR], bar ? bar : "(none)",
                status_item_list[SI_STATUS], status,
                status_item_list[SI_STATUS_FLAGS], flags,
-               status_item_list[SI_SELECTOR], dblist[nmmd->selector_num].name,
+               status_item_list[SI_SELECTOR], selectors[nmmd->selector_num].name,
 
                status_item_list[SI_OFFSET], offset,
                status_item_list[SI_FORMAT], audio_format_name(nmmd->audio_format),
 
                status_item_list[SI_OFFSET], offset,
                status_item_list[SI_FORMAT], audio_format_name(nmmd->audio_format),
@@ -434,9 +428,12 @@ static char *get_status(struct misc_meta_data *nmmd)
                nmmd->audio_file_info,
 
                status_item_list[SI_UPTIME], ut,
                nmmd->audio_file_info,
 
                status_item_list[SI_UPTIME], ut,
-               status_item_list[SI_STREAM_START], nmmd->stream_start.tv_sec,
-                       nmmd->stream_start.tv_usec,
-               status_item_list[SI_CURRENT_TIME], now.tv_sec, now.tv_usec
+               status_item_list[SI_STREAM_START],
+                       (long unsigned)nmmd->stream_start.tv_sec,
+                       (long unsigned)nmmd->stream_start.tv_usec,
+               status_item_list[SI_CURRENT_TIME],
+                       (long unsigned)now.tv_sec,
+                       (long unsigned)now.tv_usec
 
        );
        free(bar);
 
        );
        free(bar);
@@ -453,22 +450,21 @@ static int check_sender_args(int argc, char **argv, struct sender_command_data *
        const char *subcmds[] = {"add", "delete", "allow", "deny", "on", "off", NULL};
 
        scd->sender_num = -1;
        const char *subcmds[] = {"add", "delete", "allow", "deny", "on", "off", NULL};
 
        scd->sender_num = -1;
-       if (argc < 0)
+       if (argc < 2)
                return -E_COMMAND_SYNTAX;
        for (i = 0; senders[i].name; i++)
                return -E_COMMAND_SYNTAX;
        for (i = 0; senders[i].name; i++)
-               if (!strcmp(senders[i].name, argv[0]))
+               if (!strcmp(senders[i].name, argv[1]))
                        break;
                        break;
-//     PARA_DEBUG_LOG("%d:%s\n", argc, argv[0]);
+       PARA_DEBUG_LOG("%d:%s\n", argc, argv[1]);
        if (!senders[i].name)
                return -E_COMMAND_SYNTAX;
        scd->sender_num = i;
        for (i = 0; subcmds[i]; i++)
        if (!senders[i].name)
                return -E_COMMAND_SYNTAX;
        scd->sender_num = i;
        for (i = 0; subcmds[i]; i++)
-               if (!strcmp(subcmds[i], argv[1]))
+               if (!strcmp(subcmds[i], argv[2]))
                        break;
        if (!subcmds[i])
                return -E_COMMAND_SYNTAX;
        scd->cmd_num = i;
                        break;
        if (!subcmds[i])
                return -E_COMMAND_SYNTAX;
        scd->cmd_num = i;
-//     scd->self = *in_addr;
        mmd_lock();
        if (!senders[scd->sender_num].client_cmds[scd->cmd_num]) {
                mmd_unlock();
        mmd_lock();
        if (!senders[scd->sender_num].client_cmds[scd->cmd_num]) {
                mmd_unlock();
@@ -478,31 +474,31 @@ static int check_sender_args(int argc, char **argv, struct sender_command_data *
        switch (scd->cmd_num) {
        case SENDER_ON:
        case SENDER_OFF:
        switch (scd->cmd_num) {
        case SENDER_ON:
        case SENDER_OFF:
-               if (argc != 1)
+               if (argc != 3)
                        return -E_COMMAND_SYNTAX;
                break;
        case SENDER_DENY:
        case SENDER_ALLOW:
                        return -E_COMMAND_SYNTAX;
                break;
        case SENDER_DENY:
        case SENDER_ALLOW:
-               if (argc != 2 && argc != 3)
+               if (argc != 4 && argc != 5)
                        return -E_COMMAND_SYNTAX;
                        return -E_COMMAND_SYNTAX;
-               if (!inet_aton(argv[2], &scd->addr))
+               if (!inet_aton(argv[3], &scd->addr))
                        return -E_COMMAND_SYNTAX;
                scd->netmask = 32;
                        return -E_COMMAND_SYNTAX;
                scd->netmask = 32;
-               if (argc == 3) {
-                       scd->netmask = atoi(argv[3]);
+               if (argc == 5) {
+                       scd->netmask = atoi(argv[4]);
                        if (scd->netmask < 0 || scd->netmask > 32)
                                return -E_COMMAND_SYNTAX;
                }
                break;
        case SENDER_ADD:
        case SENDER_DELETE:
                        if (scd->netmask < 0 || scd->netmask > 32)
                                return -E_COMMAND_SYNTAX;
                }
                break;
        case SENDER_ADD:
        case SENDER_DELETE:
-               if (argc != 2 && argc != 3)
+               if (argc != 4 && argc != 5)
                        return -E_COMMAND_SYNTAX;
                        return -E_COMMAND_SYNTAX;
-               if (!inet_aton(argv[2], &scd->addr))
+               if (!inet_aton(argv[3], &scd->addr))
                        return -E_COMMAND_SYNTAX;
                scd->port = -1;
                        return -E_COMMAND_SYNTAX;
                scd->port = -1;
-               if (argc == 3) {
-                       scd->port = atoi(argv[3]);
+               if (argc == 5) {
+                       scd->port = atoi(argv[4]);
                        if (scd->port < 0 || scd->port > 65535)
                                return -E_COMMAND_SYNTAX;
                }
                        if (scd->port < 0 || scd->port > 65535)
                                return -E_COMMAND_SYNTAX;
                }
@@ -518,7 +514,7 @@ static int com_sender(int fd, int argc, char **argv)
        int i, ret;
        struct sender_command_data scd;
 
        int i, ret;
        struct sender_command_data scd;
 
-       if (!argc) {
+       if (argc < 2) {
                char *msg = NULL;
                for (i = 0; senders[i].name; i++) {
                        char *tmp = make_message("%s%s\n",
                char *msg = NULL;
                for (i = 0; senders[i].name; i++) {
                        char *tmp = make_message("%s%s\n",
@@ -530,7 +526,7 @@ static int com_sender(int fd, int argc, char **argv)
                free(msg);
                return ret;
        }
                free(msg);
                return ret;
        }
-       ret = check_sender_args(argc - 1, argv + 1, &scd);
+       ret = check_sender_args(argc, argv, &scd);
        if (ret < 0) {
                char *msg;
                if (scd.sender_num < 0)
        if (ret < 0) {
                char *msg;
                if (scd.sender_num < 0)
@@ -555,19 +551,18 @@ static int com_sender(int fd, int argc, char **argv)
 }
 
 /* server info */
 }
 
 /* server info */
-static int com_si(int fd, int argc, __unused char **argv)
+static int com_si(int fd, int argc, __a_unused char **argv)
 {
        int i, ret;
        char *ut;
 {
        int i, ret;
        char *ut;
-       char *selectors = NULL, *sender_info = NULL, *sender_list = NULL;
-       struct mallinfo mi = mallinfo();
+       char *selector_string = NULL, *sender_info = NULL, *sender_list = NULL;
 
 
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       for (i = 0; dblist[i].name; i++) {
-               selectors = para_strcat(selectors, dblist[i].name);
-               selectors = para_strcat(selectors, " ");
+       for (i = 0; selectors[i].name; i++) {
+               selector_string = para_strcat(selector_string, selectors[i].name);
+               selector_string = para_strcat(selector_string, " ");
        }
        for (i = 0; senders[i].name; i++) {
                char *info = senders[i].info();
        }
        for (i = 0; senders[i].name; i++) {
                char *info = senders[i].info();
@@ -579,7 +574,6 @@ static int com_si(int fd, int argc, __unused char **argv)
        ut = uptime_str();
        ret = send_va_buffer(fd, "up: %s\nplayed: %u\n"
                "pid: %d\n"
        ut = uptime_str();
        ret = send_va_buffer(fd, "up: %s\nplayed: %u\n"
                "pid: %d\n"
-               "mallinfo: %d\n"
                "connections (active/accepted/total): %u/%u/%u\n"
                "current loglevel: %i\n"
                "supported audio file selectors: %s\n"
                "connections (active/accepted/total): %u/%u/%u\n"
                "current loglevel: %i\n"
                "supported audio file selectors: %s\n"
@@ -588,30 +582,30 @@ static int com_si(int fd, int argc, __unused char **argv)
                "%s",
                ut, mmd->num_played,
                getppid(),
                "%s",
                ut, mmd->num_played,
                getppid(),
-               mi.arena / 1024,
                mmd->active_connections,
                mmd->num_commands,
                mmd->num_connects,
                conf.loglevel_arg,
                mmd->active_connections,
                mmd->num_commands,
                mmd->num_connects,
                conf.loglevel_arg,
-               selectors,
-               SUPPORTED_AUDIO_FORMATS,
+               selector_string,
+               supported_audio_formats(),
                sender_list,
                sender_info
        );
        mmd_unlock();
        free(ut);
                sender_list,
                sender_info
        );
        mmd_unlock();
        free(ut);
-       free(selectors);
+       free(selector_string);
        free(sender_list);
        free(sender_info);
        return ret;
 }
 
 /* version */
        free(sender_list);
        free(sender_info);
        return ret;
 }
 
 /* version */
-static int com_version(int socket_fd, int argc, __unused char **argv)
+static int com_version(int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
                return -E_COMMAND_SYNTAX;
-       return send_buffer(socket_fd, "para_server-" VERSION ", \"" CODENAME "\"\n"
+       return send_buffer(socket_fd, "para_server-" PACKAGE_VERSION ", \""
+                       CODENAME "\"\n"
                        COPYRIGHT "\n"
                        "built: " BUILD_DATE "\n"
                        SYSTEM ", " CC_VERSION "\n"
                        COPYRIGHT "\n"
                        "built: " BUILD_DATE "\n"
                        SYSTEM ", " CC_VERSION "\n"
@@ -624,7 +618,7 @@ static int com_sc(int socket_fd, int argc, char **argv)
        char *name = NULL;
        int ret, old = 0, count = -1; /* print af change forever */
 
        char *name = NULL;
        int ret, old = 0, count = -1; /* print af change forever */
 
-       if (argc)
+       if (argc > 1)
                count = atoi(argv[1]);
 repeat:
        mmd_lock();
                count = atoi(argv[1]);
 repeat:
        mmd_lock();
@@ -639,7 +633,7 @@ repeat:
                name = NULL;
                if (ret < 0)
                        return ret;
                name = NULL;
                if (ret < 0)
                        return ret;
-               if (argc && !--count)
+               if (argc > 1 && !--count)
                        return 1;
        }
        usleep(500000);
                        return 1;
        }
        usleep(500000);
@@ -654,7 +648,7 @@ static int com_sb(int socket_fd, int argc, char **argv)
                                 * times. Negative value means: print
                                 * forever
                                 */
                                 * times. Negative value means: print
                                 * forever
                                 */
-       if (argc)
+       if (argc > 1)
                nr = atoi(argv[1]);
        while (nr) {
                mmd_lock();
                nr = atoi(argv[1]);
        while (nr) {
                mmd_lock();
@@ -684,7 +678,7 @@ static int com_stat(int socket_fd, int argc, char **argv)
 
        signal(SIGUSR1, dummy);
 
 
        signal(SIGUSR1, dummy);
 
-       if (argc)
+       if (argc > 1)
                num = atoi(argv[1]);
        for (;;) {
 
                num = atoi(argv[1]);
        for (;;) {
 
@@ -697,17 +691,20 @@ static int com_stat(int socket_fd, int argc, char **argv)
                ret = 1;
                if (num == 1)
                        goto out;
                ret = 1;
                if (num == 1)
                        goto out;
-               usleep(500000 * 100);
+               sleep(50);
+               if (getppid() == 1)
+                       return -E_SERVER_CRASH;
        }
 out:
        return ret;
 }
 
        }
 out:
        return ret;
 }
 
-static int send_description(int fd, struct server_command *cmd, const char *handler, int num)
+static int send_list_of_commands(int fd, struct server_command *cmd,
+               const char *handler)
 {
        int ret, i;
 
 {
        int ret, i;
 
-       for (i = 1; cmd->name && (!num || i <= num); cmd++, i++) {
+       for (i = 1; cmd->name; cmd++, i++) {
                char *perms = cmd_perms_itohuman(cmd->perms);
                ret = send_va_buffer(fd, "%s\t%s\t%s\t%s\n", cmd->name,
                        handler,
                char *perms = cmd_perms_itohuman(cmd->perms);
                ret = send_va_buffer(fd, "%s\t%s\t%s\t%s\n", cmd->name,
                        handler,
@@ -720,7 +717,7 @@ static int send_description(int fd, struct server_command *cmd, const char *hand
        return 1;
 }
 
        return 1;
 }
 
-/* always returns string that must be freed by the caller in handeler */
+/* always returns string that must be freed by the caller in handler */
 static struct server_command *get_cmd_ptr(char *name, char **handler)
 {
        struct server_command *cmd = cmd_struct;
 static struct server_command *get_cmd_ptr(char *name, char **handler)
 {
        struct server_command *cmd = cmd_struct;
@@ -735,8 +732,8 @@ static struct server_command *get_cmd_ptr(char *name, char **handler)
        mmd_lock();
        if (handler)
                *handler = make_message("the %s selector",
        mmd_lock();
        if (handler)
                *handler = make_message("the %s selector",
-                       dblist[mmd->selector_num].name);
-       cmd = dblist[mmd->selector_num].cmd_list;
+                       selectors[mmd->selector_num].name);
+       cmd = selectors[mmd->selector_num].cmd_list;
        mmd_unlock();
        for (; cmd->name; cmd++)
                if (!strcmp(cmd->name, name))
        mmd_unlock();
        for (; cmd->name; cmd++)
                if (!strcmp(cmd->name, name))
@@ -751,15 +748,15 @@ static int com_help(int fd, int argc, char **argv)
        char *perms, *handler;
        int ret;
 
        char *perms, *handler;
        int ret;
 
-       if (!argc) {
+       if (argc < 2) {
                /* no argument given, print list of commands */
                /* no argument given, print list of commands */
-               if ((ret = send_description(fd, cmd_struct, "server", 0)) < 0)
+               if ((ret = send_list_of_commands(fd, cmd_struct, "server")) < 0)
                        return ret;
                mmd_lock();
                        return ret;
                mmd_lock();
-               handler = para_strdup(dblist[mmd->selector_num].name);
-               cmd = dblist[mmd->selector_num].cmd_list;
+               handler = para_strdup(selectors[mmd->selector_num].name);
+               cmd = selectors[mmd->selector_num].cmd_list;
                mmd_unlock();
                mmd_unlock();
-               ret = send_description(fd, cmd, handler, 0);
+               ret = send_list_of_commands(fd, cmd, handler);
                free(handler);
                return ret;
        }
                free(handler);
                return ret;
        }
@@ -792,58 +789,58 @@ static int com_help(int fd, int argc, char **argv)
 }
 
 /* hup */
 }
 
 /* hup */
-static int com_hup(__unused int socket_fd, int argc, __unused char **argv)
+static int com_hup(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        kill(getppid(), SIGHUP);
        return 1;
 }
 
 /* term */
                return -E_COMMAND_SYNTAX;
        kill(getppid(), SIGHUP);
        return 1;
 }
 
 /* term */
-static int com_term(__unused int socket_fd, int argc, __unused char **argv)
+static int com_term(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        kill(getppid(), SIGTERM);
        return 1;
 }
 
                return -E_COMMAND_SYNTAX;
        kill(getppid(), SIGTERM);
        return 1;
 }
 
-static int com_play(__unused int socket_fd, int argc, __unused char **argv)
+static int com_play(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       mmd->new_afs_status_flags |= AFS_PLAYING;
-       mmd->new_afs_status_flags &= ~AFS_NOMORE;
+       mmd->new_vss_status_flags |= VSS_PLAYING;
+       mmd->new_vss_status_flags &= ~VSS_NOMORE;
        mmd_unlock();
        return 1;
 
 }
 
 /* stop */
        mmd_unlock();
        return 1;
 
 }
 
 /* stop */
-static int com_stop(__unused int socket_fd, int argc, __unused char **argv)
+static int com_stop(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       mmd->new_afs_status_flags &= ~AFS_PLAYING;
-       mmd->new_afs_status_flags &= ~AFS_REPOS;
-       mmd->new_afs_status_flags |= AFS_NEXT;
+       mmd->new_vss_status_flags &= ~VSS_PLAYING;
+       mmd->new_vss_status_flags &= ~VSS_REPOS;
+       mmd->new_vss_status_flags |= VSS_NEXT;
        mmd_unlock();
        return 1;
 }
 
 /* pause */
        mmd_unlock();
        return 1;
 }
 
 /* pause */
-static int com_pause(__unused int socket_fd, int argc, __unused char **argv)
+static int com_pause(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       if (!afs_paused())
+       if (!vss_paused())
                mmd->events++;
                mmd->events++;
-       mmd->new_afs_status_flags &= ~AFS_PLAYING;
-       mmd->new_afs_status_flags &= ~AFS_NEXT;
+       mmd->new_vss_status_flags &= ~VSS_PLAYING;
+       mmd->new_vss_status_flags &= ~VSS_NEXT;
        mmd_unlock();
        return 1;
 }
        mmd_unlock();
        return 1;
 }
@@ -852,17 +849,17 @@ static int com_chs(int fd, int argc, char **argv)
 {
        int i, ret;
 
 {
        int i, ret;
 
-       if (!argc) {
+       if (argc == 1) {
                char *selector;
                mmd_lock();
                char *selector;
                mmd_lock();
-               selector = para_strdup(dblist[mmd->selector_num].name);
+               selector = para_strdup(selectors[mmd->selector_num].name);
                mmd_unlock();
                ret = send_va_buffer(fd, "%s\n", selector);
                free(selector);
                return ret;
        }
                mmd_unlock();
                ret = send_va_buffer(fd, "%s\n", selector);
                free(selector);
                return ret;
        }
-       for (i = 0; dblist[i].name; i++) {
-               if (strcmp(dblist[i].name, argv[1]))
+       for (i = 0; selectors[i].name; i++) {
+               if (strcmp(selectors[i].name, argv[1]))
                        continue;
                mmd_lock();
                mmd->selector_change = i;
                        continue;
                mmd_lock();
                mmd->selector_change = i;
@@ -874,37 +871,38 @@ static int com_chs(int fd, int argc, char **argv)
 }
 
 /* next */
 }
 
 /* next */
-static int com_next(__unused int socket_fd, int argc, __unused char **argv)
+static int com_next(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       mmd->new_afs_status_flags |= AFS_NEXT;
+       mmd->events++;
+       mmd->new_vss_status_flags |= VSS_NEXT;
        mmd_unlock();
        return 1;
 }
 
 /* nomore */
        mmd_unlock();
        return 1;
 }
 
 /* nomore */
-static int com_nomore(__unused int socket_fd, int argc, __unused char **argv)
+static int com_nomore(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
 {
-       if (argc)
+       if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       if (afs_playing() || afs_paused())
-               mmd->new_afs_status_flags |= AFS_NOMORE;
+       if (vss_playing() || vss_paused())
+               mmd->new_vss_status_flags |= VSS_NOMORE;
        mmd_unlock();
        return 1;
 }
 
 /* ff */
        mmd_unlock();
        return 1;
 }
 
 /* ff */
-static int com_ff(__unused int socket_fd, int argc, char **argv)
+static int com_ff(__a_unused int socket_fd, int argc, char **argv)
 {
        long promille;
        int ret, backwards = 0;
        unsigned i;
        char c;
 
 {
        long promille;
        int ret, backwards = 0;
        unsigned i;
        char c;
 
-       if (!argc)
+       if (argc != 2)
                return -E_COMMAND_SYNTAX;
        if (!(ret = sscanf(argv[1], "%u%c", &i, &c)))
                return -E_COMMAND_SYNTAX;
                return -E_COMMAND_SYNTAX;
        if (!(ret = sscanf(argv[1], "%u%c", &i, &c)))
                return -E_COMMAND_SYNTAX;
@@ -922,12 +920,12 @@ static int com_ff(__unused int socket_fd, int argc, char **argv)
        if (promille < 0)
                promille = 0;
        if (promille >  1000) {
        if (promille < 0)
                promille = 0;
        if (promille >  1000) {
-               mmd->new_afs_status_flags |= AFS_NEXT;
+               mmd->new_vss_status_flags |= VSS_NEXT;
                goto out;
        }
        mmd->repos_request = (mmd->chunks_total * promille) / 1000;
                goto out;
        }
        mmd->repos_request = (mmd->chunks_total * promille) / 1000;
-       mmd->new_afs_status_flags |= AFS_REPOS;
-       mmd->new_afs_status_flags &= ~AFS_NEXT;
+       mmd->new_vss_status_flags |= VSS_REPOS;
+       mmd->new_vss_status_flags &= ~VSS_NEXT;
        mmd->events++;
        ret = 1;
 out:
        mmd->events++;
        ret = 1;
 out:
@@ -936,12 +934,12 @@ out:
 }
 
 /* jmp */
 }
 
 /* jmp */
-static int com_jmp(__unused int socket_fd, int argc, char **argv)
+static int com_jmp(__a_unused int socket_fd, int argc, char **argv)
 {
        long unsigned int i;
        int ret;
 
 {
        long unsigned int i;
        int ret;
 
-       if (!argc)
+       if (argc != 2)
                return -E_COMMAND_SYNTAX;
        if (sscanf(argv[1], "%lu", &i) <= 0)
                return -E_COMMAND_SYNTAX;
                return -E_COMMAND_SYNTAX;
        if (sscanf(argv[1], "%lu", &i) <= 0)
                return -E_COMMAND_SYNTAX;
@@ -955,8 +953,8 @@ static int com_jmp(__unused int socket_fd, int argc, char **argv)
        mmd->repos_request = (mmd->chunks_total * i + 50)/ 100;
        PARA_INFO_LOG("sent: %lu,  offset before jmp: %lu\n",
                mmd->chunks_sent, mmd->offset);
        mmd->repos_request = (mmd->chunks_total * i + 50)/ 100;
        PARA_INFO_LOG("sent: %lu,  offset before jmp: %lu\n",
                mmd->chunks_sent, mmd->offset);
-       mmd->new_afs_status_flags |= AFS_REPOS;
-       mmd->new_afs_status_flags &= ~AFS_NEXT;
+       mmd->new_vss_status_flags |= VSS_REPOS;
+       mmd->new_vss_status_flags &= ~VSS_NEXT;
        ret = 1;
        mmd->events++;
 out:
        ret = 1;
        mmd->events++;
 out:
@@ -995,73 +993,6 @@ long int para_rand(long unsigned max)
        return (long int) ((max + 0.0) * (random() / (RAND_MAX + 1.0)));
 }
 
        return (long int) ((max + 0.0) * (random() / (RAND_MAX + 1.0)));
 }
 
-/* Open user_list file, returns pointer to opened file on success,
- * NULL on errors
- */
-static FILE *open_user_list(char *file)
-{
-       PARA_DEBUG_LOG("opening user list %s\n", file);
-       return fopen(file, "r");
-}
-
-/*
- * lookup user in user_list file. Fills in a user struct containing
- * filename of the user's public key as well as the permissions of that user.
- * Returns 1 on success, 0 if user does not exist and < 0 on errors.
- */
-static int get_user(struct user *user) {
-       FILE *file_ptr;
-       char *char_ptr;
-       char line[MAXLINE];
-       /* keyword, user, key, perms */
-       char w[MAXLINE], n[MAXLINE], k[MAXLINE], p[MAXLINE], tmp[4][MAXLINE];
-       int num;
-
-       file_ptr = open_user_list(user_list);
-       if (!file_ptr)
-               return -E_USERLIST;
-       while (fgets(line, MAXLINE, file_ptr)) {
-//             PARA_DEBUG_LOG("%s: Read line (%i bytes) "
-//                     "from config file\n", __func__, strlen(line));
-               if (sscanf(line,"%200s %200s %200s %200s", w, n, k, p) < 3)
-                       continue;
-               if (!strcmp(w, "user") && !strcmp(user->name, n)) {
-                       PARA_DEBUG_LOG("found entry for %s\n", n);
-                       strcpy(user->name, n);
-                       strcpy(user->pubkey_file, k);
-                       user->perms = 0;
-                       char_ptr = p;
-                       num = sscanf(char_ptr, "%200[A-Z_],%200[A-Z_],%200[A-Z_],%200[A-Z_]",
-                               tmp[0], tmp[1], tmp[2], tmp[3]);
-                       PARA_DEBUG_LOG("found %i perm entries\n",
-                               num);
-                       user->perms = 0;
-                       while (num > 0) {
-                               num--;
-                               //PARA_DEBUG_LOG("%s: tmp[%i]=%s\n", __func__,
-                               //      num, tmp[num]);
-                               if (!strcmp(tmp[num], "AFS_READ"))
-                                       user->perms =
-                                               user->perms | AFS_READ;
-                               else if (!strcmp(tmp[num], "AFS_WRITE"))
-                                       user->perms =
-                                               user->perms | AFS_WRITE;
-                               else if (!strcmp(tmp[num], "DB_READ"))
-                                       user->perms = user->perms | DB_READ;
-                               else if (!strcmp(tmp[num], "DB_WRITE"))
-                                       user->perms = user->perms | DB_WRITE;
-                               else /* unknown permission */
-                                       PARA_WARNING_LOG("unknown permission:"
-                                               "%s\n", tmp[num]);
-                       }
-                       fclose(file_ptr);
-                       return 1;
-               }
-       }
-       fclose(file_ptr);
-       return 0;
-}
-
 static void init_rc4_keys(void)
 {
        int i;
 static void init_rc4_keys(void)
 {
        int i;
@@ -1075,12 +1006,14 @@ static void init_rc4_keys(void)
        RC4_set_key(&rc4_send_key, RC4_KEY_LEN, rc4_buf + RC4_KEY_LEN);
 }
 
        RC4_set_key(&rc4_send_key, RC4_KEY_LEN, rc4_buf + RC4_KEY_LEN);
 }
 
-static void rc4_recv(unsigned long len, const unsigned char *indata, unsigned char *outdata)
+static void rc4_recv(unsigned long len, const unsigned char *indata,
+               unsigned char *outdata, __a_unused void *private_data)
 {
        RC4(&rc4_recv_key, len, indata, outdata);
 }
 
 {
        RC4(&rc4_recv_key, len, indata, outdata);
 }
 
-static void rc4_send(unsigned long len, const unsigned char *indata, unsigned char *outdata)
+static void rc4_send(unsigned long len, const unsigned char *indata,
+               unsigned char *outdata, __a_unused void *private_data)
 {
        RC4(&rc4_send_key, len, indata, outdata);
 }
 {
        RC4(&rc4_send_key, len, indata, outdata);
 }
@@ -1105,7 +1038,8 @@ int handle_connect(int fd, struct sockaddr_in *addr)
        in_addr = addr;
        challenge_nr = random();
        /* send Welcome message */
        in_addr = addr;
        challenge_nr = random();
        /* send Welcome message */
-       ret = send_va_buffer(fd, "This is para_server, version " VERSION  ".\n" );
+       ret = send_va_buffer(fd, "This is para_server, version "
+               PACKAGE_VERSION  ".\n" );
        if (ret < 0)
                goto err_out;
        /* recv auth request line */
        if (ret < 0)
                goto err_out;
        /* recv auth request line */
@@ -1122,23 +1056,16 @@ int handle_connect(int fd, struct sockaddr_in *addr)
                goto err_out;
 
        if (numbytes < 9 || strncmp(buf, "auth rc4 ", 9))
                goto err_out;
 
        if (numbytes < 9 || strncmp(buf, "auth rc4 ", 9))
-               strcpy(u.name, buf + 5); /* client version < 0.2.6 */
+               u.name = para_strdup(buf + 5); /* client version < 0.2.6 */
        else {
        else {
-               strcpy(u.name, buf + 9); /* client version >= 0.2.6 */
+               u.name = para_strdup(buf + 9); /* client version >= 0.2.6 */
                use_rc4 = 1;
        }
                use_rc4 = 1;
        }
-//     strcpy(u.name, buf + 5); /* ok, but ugly */
        PARA_DEBUG_LOG("received %s request for user %s\n",
                use_rc4? "rc4" : "auth", u.name);
        PARA_DEBUG_LOG("received %s request for user %s\n",
                use_rc4? "rc4" : "auth", u.name);
-       /* lookup user in list file */
-       if ((ret = get_user(&u)) < 0)
+       if ((ret = lookup_user(&u)) < 0)
                goto err_out;
                goto err_out;
-       if (!ret) { /* user not found */
-               PARA_WARNING_LOG("auth request for unknown user %s\n", u.name);
-               ret = -E_BAD_USER;
-               goto err_out;
-       }
-       ret = para_encrypt_challenge(u.pubkey_file, challenge_nr, crypt_buf);
+       ret = para_encrypt_challenge(u.rsa, challenge_nr, crypt_buf);
        if (ret <= 0)
                goto err_out;
        numbytes = ret;
        if (ret <= 0)
                goto err_out;
        numbytes = ret;
@@ -1163,7 +1090,7 @@ int handle_connect(int fd, struct sockaddr_in *addr)
        sprintf(buf, "%s", PROCEED_MSG);
        if (use_rc4) {
                init_rc4_keys();
        sprintf(buf, "%s", PROCEED_MSG);
        if (use_rc4) {
                init_rc4_keys();
-               ret = para_encrypt_buffer(u.pubkey_file, rc4_buf, 2 * RC4_KEY_LEN,
+               ret = para_encrypt_buffer(u.rsa, rc4_buf, 2 * RC4_KEY_LEN,
                        (unsigned char *)buf + PROCEED_MSG_LEN + 1);
                if (ret <= 0)
                        goto err_out;
                        (unsigned char *)buf + PROCEED_MSG_LEN + 1);
                if (ret <= 0)
                        goto err_out;
@@ -1173,11 +1100,8 @@ int handle_connect(int fd, struct sockaddr_in *addr)
        ret = send_bin_buffer(fd, buf, numbytes);
        if (ret < 0)
                goto err_out;
        ret = send_bin_buffer(fd, buf, numbytes);
        if (ret < 0)
                goto err_out;
-       if (use_rc4) {
-               crypt_function_recv = rc4_recv;
-               crypt_function_send = rc4_send;
-               PARA_INFO_LOG("%s", "rc4 encrytion activated\n");
-       }
+       if (use_rc4)
+               enable_crypt(fd, rc4_recv, rc4_send, NULL);
        /* read command */
        while ((numbytes = recv_buffer(fd, buf, sizeof(buf))) > 0) {
 //             PARA_INFO_LOG("recvd: %s (%d)\n", buf, numbytes);
        /* read command */
        while ((numbytes = recv_buffer(fd, buf, sizeof(buf))) > 0) {
 //             PARA_INFO_LOG("recvd: %s (%d)\n", buf, numbytes);
@@ -1203,8 +1127,7 @@ int handle_connect(int fd, struct sockaddr_in *addr)
                goto err_out;
        /* valid command and sufficient perms */
        alarm(0);
                goto err_out;
        /* valid command and sufficient perms */
        alarm(0);
-       argc = split_args(command, &argv, '\n');
-       argv[0] = cmd->name;
+       argc = split_args(command, &argv, "\n");
        mmd_lock();
        mmd->num_commands++;
        mmd_unlock();
        mmd_lock();
        mmd->num_commands++;
        mmd_unlock();