X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=command.c;h=7dba2f90b8e4ff1e6fca0352d31b79d24b41e9af;hp=2bd101919eafa22136926ff244d12d13866fabac;hb=08a1de75a3a83c728d97a3c4ff182553adbda8cc;hpb=ae0e4594c6a0312c5b4b4c0bde86f9c12253d11b diff --git a/command.c b/command.c index 2bd10191..7dba2f90 100644 --- a/command.c +++ b/command.c @@ -1,41 +1,38 @@ /* * Copyright (C) 1997-2007 Andre Noll * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file command.c does client authentication and executes server commands */ -#include /* gettimeofday */ +#include +#include +#include +#include +#include + +#include "para.h" +#include "error.h" #include "server.cmdline.h" +#include "afs_common.h" +#include "string.h" +#include "afh.h" #include "afs.h" #include "server.h" #include "vss.h" #include "send.h" #include "rc4.h" -#include -#include "error.h" #include "net.h" #include "daemon.h" -#include "string.h" #include "fd.h" +#include "list.h" #include "user_list.h" #include "server_command_list.h" +#include "afs_command_list.h" /** commands including options must be shorter than this */ -#define MAX_COMMAND_LEN 4096 +#define MAX_COMMAND_LEN 32768 static RC4_KEY rc4_recv_key; static RC4_KEY rc4_send_key; @@ -43,7 +40,6 @@ 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 audio_file_selector selectors[]; extern struct sender senders[]; static void dummy(__a_unused int s) @@ -153,7 +149,7 @@ static char *get_status(struct misc_meta_data *nmmd) ret = make_message( "%s:%zu\n" "%s:%s\n" "%s:%lu\n" "%s:%u\n" "%s:%s\n" "%s:%s\n" "%s:%s\n" "%s:%s\n" - "%s:%li\n" "%s:%s\n" "%s" "%s" + "%s:%li\n" "%s:%s\n" "%s" "%s:%s\n" "%s:%lu.%lu\n" "%s:%lu.%lu\n", status_item_list[SI_FILE_SIZE], nmmd->size / 1024, status_item_list[SI_MTIME], mtime, @@ -163,11 +159,10 @@ 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_SELECTOR], selectors[nmmd->selector_num].name, + status_item_list[SI_SELECTOR], "FIXME", status_item_list[SI_OFFSET], offset, status_item_list[SI_FORMAT], audio_format_name(nmmd->audio_format), - nmmd->selector_info, nmmd->afi.info_string, status_item_list[SI_UPTIME], ut, @@ -186,7 +181,7 @@ static char *get_status(struct misc_meta_data *nmmd) return ret; } -static int check_sender_args(int argc, char **argv, struct sender_command_data *scd) +static int check_sender_args(int argc, char * const * argv, struct sender_command_data *scd) { int i; /* this has to match sender.h */ @@ -224,7 +219,7 @@ static int check_sender_args(int argc, char **argv, struct sender_command_data * case SENDER_ALLOW: if (argc != 4 && argc != 5) return -E_COMMAND_SYNTAX; - if (!inet_aton(argv[3], &scd->addr)) + if (!inet_pton(AF_INET, argv[3], &scd->addr)) return -E_COMMAND_SYNTAX; scd->netmask = 32; if (argc == 5) { @@ -237,7 +232,7 @@ static int check_sender_args(int argc, char **argv, struct sender_command_data * case SENDER_DELETE: if (argc != 4 && argc != 5) return -E_COMMAND_SYNTAX; - if (!inet_aton(argv[3], &scd->addr)) + if (!inet_pton(AF_INET, argv[3], &scd->addr)) return -E_COMMAND_SYNTAX; scd->port = -1; if (argc == 5) { @@ -252,7 +247,7 @@ static int check_sender_args(int argc, char **argv, struct sender_command_data * return 1; } -int com_sender(int fd, int argc, char **argv) +int com_sender(int fd, int argc, char * const * argv) { int i, ret; struct sender_command_data scd; @@ -294,19 +289,15 @@ int com_sender(int fd, int argc, char **argv) } /* server info */ -int com_si(int fd, int argc, __a_unused char **argv) +int com_si(int fd, int argc, __a_unused char * const * argv) { int i, ret; char *ut; - char *selector_string = NULL, *sender_info = NULL, *sender_list = NULL; + char *sender_info = NULL, *sender_list = NULL; if (argc != 1) return -E_COMMAND_SYNTAX; mmd_lock(); - 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(); sender_info = para_strcat(sender_info, info); @@ -319,7 +310,6 @@ int com_si(int fd, int argc, __a_unused char **argv) "pid: %d\n" "connections (active/accepted/total): %u/%u/%u\n" "current loglevel: %i\n" - "supported audio file selectors: %s\n" "supported audio formats: %s\n" "supported senders: %s\n" "%s", @@ -329,21 +319,19 @@ int com_si(int fd, int argc, __a_unused char **argv) mmd->num_commands, mmd->num_connects, conf.loglevel_arg, - selector_string, supported_audio_formats(), sender_list, sender_info ); mmd_unlock(); free(ut); - free(selector_string); free(sender_list); free(sender_info); return ret; } /* version */ -int com_version(int fd, int argc, __a_unused char **argv) +int com_version(int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -354,7 +342,7 @@ int com_version(int fd, int argc, __a_unused char **argv) } /* sc */ -int com_sc(int fd, int argc, char **argv) +int com_sc(int fd, int argc, char * const * argv) { char *name = NULL; int ret, old = 0, count = -1; /* print af change forever */ @@ -382,7 +370,7 @@ repeat: } /* sb */ -int com_sb(int fd, int argc, char **argv) +int com_sb(int fd, int argc, char * const * argv) { char *sb; int ret, nr = -1; /* status bar will be printed that many @@ -409,7 +397,7 @@ int com_sb(int fd, int argc, char **argv) } /* stat */ -int com_stat(int fd, int argc, char **argv) +int com_stat(int fd, int argc, char * const * argv) { int ret, num = 0;/* status will be printed that many * times. num <= 0 means: print forever @@ -459,7 +447,7 @@ static int send_list_of_commands(int fd, struct server_command *cmd, } /* always returns string that must be freed by the caller in handler */ -static struct server_command *get_cmd_ptr(char *name, char **handler) +static struct server_command *get_cmd_ptr(const char *name, char **handler) { struct server_command *cmd; @@ -469,21 +457,15 @@ static struct server_command *get_cmd_ptr(char *name, char **handler) *handler = para_strdup("para_server"); /* server commands */ return cmd; } - /* not found, look for commands supported by the current selector */ - mmd_lock(); - if (handler) - *handler = make_message("the %s selector", - selectors[mmd->selector_num].name); - cmd = selectors[mmd->selector_num].cmd_list; - mmd_unlock(); - for (; cmd->name; cmd++) + /* not found, look for commands supported by afs */ + for (cmd = afs_cmds; cmd->name; cmd++) if (!strcmp(cmd->name, name)) return cmd; return NULL; } /* help */ -int com_help(int fd, int argc, char **argv) +int com_help(int fd, int argc, char * const * argv) { struct server_command *cmd; char *perms, *handler; @@ -493,13 +475,7 @@ int com_help(int fd, int argc, char **argv) /* no argument given, print list of commands */ 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_list_of_commands(fd, cmd, handler); - free(handler); - return ret; + return send_list_of_commands(fd, afs_cmds, "afs"); } /* argument given for help */ cmd = get_cmd_ptr(argv[1], &handler); @@ -527,7 +503,7 @@ int com_help(int fd, int argc, char **argv) } /* hup */ -int com_hup(__a_unused int fd, int argc, __a_unused char **argv) +int com_hup(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -536,7 +512,7 @@ int com_hup(__a_unused int fd, int argc, __a_unused char **argv) } /* term */ -int com_term(__a_unused int fd, int argc, __a_unused char **argv) +int com_term(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -544,7 +520,7 @@ int com_term(__a_unused int fd, int argc, __a_unused char **argv) return 1; } -int com_play(__a_unused int fd, int argc, __a_unused char **argv) +int com_play(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -557,7 +533,7 @@ int com_play(__a_unused int fd, int argc, __a_unused char **argv) } /* stop */ -int com_stop(__a_unused int fd, int argc, __a_unused char **argv) +int com_stop(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -570,7 +546,7 @@ int com_stop(__a_unused int fd, int argc, __a_unused char **argv) } /* pause */ -int com_pause(__a_unused int fd, int argc, __a_unused char **argv) +int com_pause(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -583,33 +559,8 @@ int com_pause(__a_unused int fd, int argc, __a_unused char **argv) return 1; } -int com_chs(int fd, int argc, char **argv) -{ - int i, ret; - - if (argc == 1) { - char *selector; - mmd_lock(); - selector = para_strdup(selectors[mmd->selector_num].name); - mmd_unlock(); - ret = send_va_buffer(fd, "%s\n", selector); - free(selector); - return ret; - } - for (i = 0; selectors[i].name; i++) { - if (strcmp(selectors[i].name, argv[1])) - continue; - mmd_lock(); - mmd->selector_change = i; - mmd->events++; - mmd_unlock(); - return 1; - } - return -E_BAD_SELECTOR; -} - /* next */ -int com_next(__a_unused int fd, int argc, __a_unused char **argv) +int com_next(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -621,7 +572,7 @@ int com_next(__a_unused int fd, int argc, __a_unused char **argv) } /* nomore */ -int com_nomore(__a_unused int fd, int argc, __a_unused char **argv) +int com_nomore(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; @@ -633,7 +584,7 @@ int com_nomore(__a_unused int fd, int argc, __a_unused char **argv) } /* ff */ -int com_ff(__a_unused int fd, int argc, char **argv) +int com_ff(__a_unused int fd, int argc, char * const * argv) { long promille; int ret, backwards = 0; @@ -672,7 +623,7 @@ out: } /* jmp */ -int com_jmp(__a_unused int fd, int argc, char **argv) +int com_jmp(__a_unused int fd, int argc, char * const * argv) { long unsigned int i; int ret; @@ -810,12 +761,10 @@ out: * encrypted with its RSA public key. From this point on, * all transfers are crypted with this session key. * - * Next it is checked if the peer supplied a valid server - * command or a command for the audio file selector currently - * in use. If yes, and if the user has sufficient - * permissions to execute that command, the function calls - * the corresponding command handler which does argument - * checking and further processing. + * Next it is checked if the peer supplied a valid server command or a command + * for the audio file selector. If yes, and if the user has sufficient + * permissions to execute that command, the function calls the corresponding + * command handler which does argument checking and further processing. * * In order to cope with a DOS attacks, a timeout is set up * which terminates the function if the connection was not @@ -876,7 +825,7 @@ int handle_connect(int fd, struct sockaddr_in *addr) if (ret <= 0) goto err_out; numbytes = ret; - PARA_DEBUG_LOG("sending %d byte challenge\n", numbytes); + PARA_DEBUG_LOG("sending %zu byte challenge\n", numbytes); /* We can't use send_buffer here since buf may contain null bytes */ ret = send_bin_buffer(fd,(char *) crypt_buf, numbytes); if (ret < 0)