make another function of command.c static
[paraslash.git] / command.c
index 52d56c9..7bde617 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
 /** \file command.c does client authentication and executes server commands */
 
 #include <sys/time.h> /* gettimeofday */
-#include "crypt.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>
@@ -31,6 +30,9 @@
 #include "net.h"
 #include "daemon.h"
 #include "string.h"
+#include "fd.h"
+#include "user_list.h"
+#include "server_command_list.h"
 
 static RC4_KEY rc4_recv_key;
 static RC4_KEY rc4_send_key;
@@ -43,265 +45,6 @@ extern struct sender senders[];
 extern char *user_list;
 struct sockaddr_in *in_addr;
 
-static int com_si(int, int, char **);
-static int com_version(int, int, char **);
-static int com_sb(int, int, char **);
-static int com_sc(int, int, char **);
-static int com_stat(int, int, char **);
-static int com_help(int, int, char **);
-static int com_hup(int, int, char **);
-static int com_term(int, int, char **);
-static int com_play(int, int, char **);
-static int com_stop(int, int, char **);
-static int com_pause(int, int, char **);
-static int com_next(int, int, char **);
-static int com_nomore(int, int, char **);
-static int com_chs(int, int, char **);
-static int com_ff(int, int, char **);
-static int com_jmp(int, int, char **);
-static int com_sender(int, int, char **);
-
-
-/* commands that are handled by the server itself */
-static struct server_command cmd_struct[] = {
-{
-.name = "chs",
-.handler = com_chs,
-.perms = DB_READ | DB_WRITE,
-.description = "change the current audio file selector",
-.synopsis = "chs [new_selector]",
-.help =
-"Shutdown the current selector and activate new_selector. If no\n"
-"argument was given, print the name of the current selector.\n"
-},
-
-{
-.name = "ff",
-.handler = com_ff,
-.perms = AFS_READ | AFS_WRITE,
-.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"
-"\tand enqueue a request to jump n seconds forwards or backwards\n"
-"\tin the current audio file.\n"
-"\n"
-"EXAMPLE\n"
-"\n"
-"\t\tff 30-\n"
-"\n"
-"\tjumps 30 seconds backwards.\n"
-
-},
-
-{
-.name = "help",
-.handler = com_help,
-.perms = 0,
-.description = "print help text",
-.synopsis = "help [command]",
-.help =
-
-"Without any arguments, help prints a list of availible commands. When\n"
-"issued with a command name as first argument, print out a description\n"
-"for that command.\n"
-
-},
-
-{
-.name = "hup",
-.handler = com_hup,
-.perms = AFS_WRITE,
-.description = "force reload of config file and log file",
-.synopsis = "hup",
-.help =
-
-"After rereading the config file, a signal is sent to all children\n"
-"which forces them to close/reopen the log file.\n"
-
-},
-
-{
-.name = "jmp",
-.handler = com_jmp,
-.perms = AFS_READ | AFS_WRITE,
-.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"
-"\tand enqueue a request to jump to n% of the current audio file,\n"
-"\twhere 0 <= n <= 100.\n"
-
-},
-
-{
-.name = "next",
-.handler = com_next,
-.perms = AFS_READ | AFS_WRITE,
-.description = "skip rest of current audio file",
-.synopsis = "next",
-.help =
-
-"\tSet the 'N' (next audio file) bit of the afs status flags. When\n"
-"\tplaying, change audio file immediately. Equivalent to stop\n"
-"\tif paused, NOP if stopped.\n"
-
-
-},
-
-{
-.name = "nomore",
-.handler = com_nomore,
-.perms = AFS_READ | AFS_WRITE,
-.description = "stop playing after current audio file",
-.synopsis = "nomore",
-.help =
-
-"Set the 'O' (no more) bit of the afs 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"
-"Use this command instead of stop if you don't like\n"
-"sudden endings.\n"
-
-},
-
-{
-.name ="pause",
-.handler = com_pause,
-.perms = AFS_READ | AFS_WRITE,
-.description = "pause current audio file",
-.synopsis = "pause",
-.help =
-
-"\tClear the 'P' (playing) bit of the afs status flags.\n"
-
-},
-
-{
-.name = "play",
-.handler = com_play,
-.perms = AFS_READ | AFS_WRITE,
-.description = "start playing or resume playing when paused",
-.synopsis = "play",
-.help =
-
-"\tSet the 'P' (playing) bit of the afs status flags. This\n"
-"\tresults in starting/continuing to stream.\n"
-
-},
-
-{
-.name = "sb",
-.handler = com_sb,
-.perms = AFS_READ,
-.description = "print status bar for current audio file",
-.synopsis = "sb [n]",
-.help =
-
-"Without any arguments, sb continuously prints a status bar of the form\n"
-"\n"
-"      12:34 [56:12] (56%) filename\n"
-"\n"
-"indicating playing time, remaining time, percentage and the name of\n"
-"the file beeing streamed. Use the optional number n to let stat exit\n"
-"after having displayed the status bar n times.\n"
-
-},
-{
-.name = "sc",
-.handler = com_sc,
-.perms = AFS_READ,
-.description = "print name of audio file whenever it changes",
-.synopsis = "sc [n]",
-.help =
-
-"\tsc prints exactly one line (the filename of the audio file\n"
-"\tbeing played) whenever the audio file changes. Stops after\n"
-"\tn iterations, or never if n is not specified.\n"
-
-},
-{
-.name = "sender",
-.handler = com_sender,
-.perms = AFS_READ | AFS_WRITE,
-.description = "control paraslash internal senders",
-.synopsis = "sender [s cmd [arguments]]",
-.help =
-
-"send command cmd to sender s. cmd may be one of the following:\n"
-"help, on, off, add, delete, allow, or deny. Note that not all senders\n"
-"support each command. Try e.g. 'para_client sender http help' for\n"
-"more information about the http sender. If no argument is given,\n"
-"print out a list of all senders that are compiled in.\n"
-
-},
-{
-.name = "si",
-.handler = com_si,
-.perms = 0,
-.description = "print server info",
-.synopsis = "si",
-.help =
-"Print server uptime and other information.\n"
-},
-
-{
-.name = "stat",
-.handler = com_stat,
-.perms = AFS_READ,
-.description = "print status info for current audio file",
-.synopsis = "stat [n]",
-.help =
-
-"\tWithout any arguments, stat continuously prints status messages\n"
-"\tof the audio file being streamed. Use the optional number n\n"
-"\tto let stat exit after having displayed status n times.\n"
-
-},
-
-{
-.name = "stop",
-.handler = com_stop,
-.perms = AFS_READ | AFS_WRITE,
-.description = "stop playing",
-.synopsis = "stop",
-.help =
-
-"\tClear the 'P' (play) bit and set the 'N' bit of the afs status\n"
-"\tflags.\n"
-
-},
-{
-.name = "term",
-.handler = com_term,
-.perms = AFS_READ | AFS_WRITE,
-.description = "terminate para_server",
-.synopsis = "term",
-.help =
-
-"Shuts down the server. Instead of this command, you can also send\n"
-"SIGINT or SIGTERM. It should never be necessary to send SIGKILL.\n"
-
-},
-{
-.name = "version",
-.handler = com_version,
-.perms = 0,
-.description = "print server's version",
-.synopsis = "version",
-.help =
-"Show version and other info\n"
-},
-/* this indicates the end of the list. Do not touch. */
-{
-.name = NULL,
-}
-};
-
 static void dummy(__a_unused int s)
 {}
 
@@ -314,13 +57,13 @@ static void mmd_dup(struct misc_meta_data *new_mmd)
 
 /*
  * 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");
-       else if (flags & AFS_NEXT)
+       else if (flags & VSS_NEXT)
                return para_strdup("stopped");
        else
                return para_strdup("paused");
@@ -329,14 +72,14 @@ static char *afs_status_tohuman(unsigned int flags)
 /*
  * return human readable permission string. Never returns NULL.
  */
-char *cmd_perms_itohuman(unsigned int perms)
+static char *cmd_perms_itohuman(unsigned int perms)
 {
-       char *msg = para_malloc(7 * sizeof(char));
+       char *msg = para_malloc(5 * sizeof(char));
 
-       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[0] = perms & DB_READ? 'a' : '-';
+       msg[1] = perms & DB_WRITE? 'A' : '-';
+       msg[2] = perms & VSS_READ? 'v' : '-';
+       msg[3] = perms & VSS_WRITE? 'V' : '-';
        msg[4] = '\0';
        return msg;
 }
@@ -344,14 +87,14 @@ char *cmd_perms_itohuman(unsigned int perms)
 /*
  * 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));
 
-       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;
 }
@@ -359,7 +102,7 @@ static char *afs_get_status_flags(unsigned int flags)
 /*
  * compute status bar string. Never returns NULL
  */
-char *get_sb_string(struct misc_meta_data *nmmd)
+static char *get_sb_string(struct misc_meta_data *nmmd)
 {
        char *base, *ret;
        long long unsigned secs = 0, rsecs = 0, percent = 0;
@@ -391,7 +134,7 @@ char *get_sb_string(struct misc_meta_data *nmmd)
 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;
@@ -402,8 +145,8 @@ static char *get_status(struct misc_meta_data *nmmd)
                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(
@@ -508,7 +251,7 @@ static int check_sender_args(int argc, char **argv, struct sender_command_data *
        return 1;
 }
 
-static int com_sender(int fd, int argc, char **argv)
+int com_sender(int fd, int argc, char **argv)
 {
        int i, ret;
        struct sender_command_data scd;
@@ -550,7 +293,7 @@ static int com_sender(int fd, int argc, char **argv)
 }
 
 /* server info */
-static int com_si(int fd, int argc, __a_unused char **argv)
+int com_si(int fd, int argc, __a_unused char **argv)
 {
        int i, ret;
        char *ut;
@@ -599,7 +342,7 @@ static int com_si(int fd, int argc, __a_unused char **argv)
 }
 
 /* version */
-static int com_version(int socket_fd, int argc, __a_unused char **argv)
+int com_version(int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
@@ -612,7 +355,7 @@ static int com_version(int socket_fd, int argc, __a_unused char **argv)
 }
 
 /* sc */
-static int com_sc(int socket_fd, int argc, char **argv)
+int com_sc(int socket_fd, int argc, char **argv)
 {
        char *name = NULL;
        int ret, old = 0, count = -1; /* print af change forever */
@@ -640,7 +383,7 @@ repeat:
 }
 
 /* sb */
-static int com_sb(int socket_fd, int argc, char **argv)
+int com_sb(int socket_fd, int argc, char **argv)
 {
        char *sb;
        int ret, nr = -1;       /* status bar will be printed that many
@@ -667,7 +410,7 @@ static int com_sb(int socket_fd, int argc, char **argv)
 }
 
 /* stat */
-static int com_stat(int socket_fd, int argc, char **argv)
+int com_stat(int socket_fd, int argc, char **argv)
 {
        int ret, num = 0;/* status will be printed that many
                          * times. num <= 0 means: print forever
@@ -690,17 +433,20 @@ static int com_stat(int socket_fd, int argc, char **argv)
                ret = 1;
                if (num == 1)
                        goto out;
-               usleep(500000 * 100);
+               sleep(50);
+               if (getppid() == 1)
+                       return -E_SERVER_CRASH;
        }
 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;
 
-       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,
@@ -716,9 +462,9 @@ static int send_description(int fd, struct server_command *cmd, const char *hand
 /* 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;
+       struct server_command *cmd;
 
-       for (cmd = cmd_struct; cmd->name; cmd++)
+       for (cmd = server_cmds; cmd->name; cmd++)
                if (!strcmp(cmd->name, name)) {
                        if (handler)
                                *handler = para_strdup("para_server"); /* server commands */
@@ -738,7 +484,7 @@ static struct server_command *get_cmd_ptr(char *name, char **handler)
 }
 
 /* help */
-static int com_help(int fd, int argc, char **argv)
+int com_help(int fd, int argc, char **argv)
 {
        struct server_command *cmd;
        char *perms, *handler;
@@ -746,13 +492,13 @@ static int com_help(int fd, int argc, char **argv)
 
        if (argc < 2) {
                /* no argument given, print list of commands */
-               if ((ret = send_description(fd, cmd_struct, "server", 0)) < 0)
+               if ((ret = send_list_of_commands(fd, server_cmds, "server")) < 0)
                        return ret;
                mmd_lock();
                handler = para_strdup(selectors[mmd->selector_num].name);
                cmd = selectors[mmd->selector_num].cmd_list;
                mmd_unlock();
-               ret = send_description(fd, cmd, handler, 0);
+               ret = send_list_of_commands(fd, cmd, handler);
                free(handler);
                return ret;
        }
@@ -764,20 +510,17 @@ static int com_help(int fd, int argc, char **argv)
        }
        perms = cmd_perms_itohuman(cmd->perms);
        ret = send_va_buffer(fd,
-               "NAME\n\t%s - %s\n"
-               "SYNOPSIS\n\t para_client %s\n"
-               "DESCRIPTION\n%s\n"
-               "HANDLER\n"
-               "This command is handled by %s.\n\n"
-               "PERMISSIONS\n"
-               "Needed privileges for %s: %s\n",
+               "%s - %s\n\n"
+               "handler: %s\n"
+               "permissions: %s\n"
+               "usage: %s\n\n"
+               "%s\n",
                argv[1],
                cmd->description,
-               cmd->synopsis,
-               cmd->help,
                handler,
-               argv[1],
-               perms
+               perms,
+               cmd->usage,
+               cmd->help
        );
        free(perms);
        free(handler);
@@ -785,7 +528,7 @@ static int com_help(int fd, int argc, char **argv)
 }
 
 /* hup */
-static int com_hup(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_hup(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
@@ -794,7 +537,7 @@ static int com_hup(__a_unused int socket_fd, int argc, __a_unused char **argv)
 }
 
 /* term */
-static int com_term(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_term(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
@@ -802,46 +545,46 @@ static int com_term(__a_unused int socket_fd, int argc, __a_unused char **argv)
        return 1;
 }
 
-static int com_play(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_play(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                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 */
-static int com_stop(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_stop(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                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 */
-static int com_pause(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_pause(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
-       if (!afs_paused())
+       if (!vss_paused())
                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;
 }
 
-static int com_chs(int fd, int argc, char **argv)
+int com_chs(int fd, int argc, char **argv)
 {
        int i, ret;
 
@@ -867,31 +610,31 @@ static int com_chs(int fd, int argc, char **argv)
 }
 
 /* next */
-static int com_next(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_next(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
        mmd_lock();
        mmd->events++;
-       mmd->new_afs_status_flags |= AFS_NEXT;
+       mmd->new_vss_status_flags |= VSS_NEXT;
        mmd_unlock();
        return 1;
 }
 
 /* nomore */
-static int com_nomore(__a_unused int socket_fd, int argc, __a_unused char **argv)
+int com_nomore(__a_unused int socket_fd, int argc, __a_unused char **argv)
 {
        if (argc != 1)
                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 */
-static int com_ff(__a_unused int socket_fd, int argc, char **argv)
+int com_ff(__a_unused int socket_fd, int argc, char **argv)
 {
        long promille;
        int ret, backwards = 0;
@@ -916,12 +659,12 @@ static int com_ff(__a_unused int socket_fd, int argc, char **argv)
        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;
-       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:
@@ -930,7 +673,7 @@ out:
 }
 
 /* jmp */
-static int com_jmp(__a_unused int socket_fd, int argc, char **argv)
+int com_jmp(__a_unused int socket_fd, int argc, char **argv)
 {
        long unsigned int i;
        int ret;
@@ -949,8 +692,8 @@ static int com_jmp(__a_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->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:
@@ -984,78 +727,11 @@ static struct server_command *parse_cmd(const char *cmdstr)
        return get_cmd_ptr(buf, NULL);
 }
 
-long int para_rand(long unsigned max)
+static long int para_rand(long unsigned max)
 {
        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;
@@ -1119,23 +795,16 @@ int handle_connect(int fd, struct sockaddr_in *addr)
                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 {
-               strcpy(u.name, buf + 9); /* client version >= 0.2.6 */
+               u.name = para_strdup(buf + 9); /* client version >= 0.2.6 */
                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);
-       /* lookup user in list file */
-       if ((ret = get_user(&u)) < 0)
+       if ((ret = lookup_user(&u)) < 0)
                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;
@@ -1160,7 +829,7 @@ int handle_connect(int fd, struct sockaddr_in *addr)
        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;