X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=command.c;h=5217f9b487cd260aebe5d5a986f4fd8e957b0270;hp=f8b5e4ee50f47af295c2e4d2689d30fc031eb44f;hb=a22e734cd89015a71d0dd7cf895799c440805847;hpb=afb43ec103ea5c0e194451c1289c514faee3b2e5 diff --git a/command.c b/command.c index f8b5e4ee..5217f9b4 100644 --- a/command.c +++ b/command.c @@ -1,17 +1,19 @@ /* - * Copyright (C) 1997-2009 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file command.c Client authentication and server commands. */ +#include #include #include #include #include #include #include +#include #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,17 +253,15 @@ 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" + ret = rc4_send_va_buffer(rc4c, "version: " GIT_VERSION "\n" + "up: %s\nplayed: %u\n" "server_pid: %d\n" "afs_pid: %d\n" "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 +270,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; } @@ -367,6 +374,7 @@ int com_stat(struct rc4_context *rc4c, int argc, char * const * argv) parser_friendly = 1; continue; } + return -E_COMMAND_SYNTAX; } if (i != argc) return -E_COMMAND_SYNTAX; @@ -451,10 +459,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" @@ -738,24 +744,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; @@ -765,7 +771,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 { /* @@ -776,7 +782,7 @@ __noreturn void handle_connect(int fd, const char *peername) numbytes = 256; get_random_bytes_or_die((unsigned char *)buf, numbytes); } - PARA_DEBUG_LOG("sending %zu byte challenge + rc4 keys (%u bytes)\n", + PARA_DEBUG_LOG("sending %u byte challenge + rc4 keys (%zu bytes)\n", CHALLENGE_SIZE, numbytes); ret = send_bin_buffer(fd, buf, numbytes); if (ret < 0) @@ -786,7 +792,7 @@ __noreturn void handle_connect(int fd, const char *peername) if (ret < 0) goto net_err; numbytes = ret; - PARA_DEBUG_LOG("received %zu bytes challenge response\n", ret); + PARA_DEBUG_LOG("received %d bytes challenge response\n", ret); ret = -E_BAD_USER; if (!u) goto net_err; @@ -824,10 +830,14 @@ __noreturn void handle_connect(int fd, const char *peername) if (ret < 0) goto err_out; /* valid command and sufficient perms */ - argc = split_args(command, &argv, "\n"); + ret = create_argv(command, "\n", &argv); + if (ret < 0) + goto err_out; + argc = ret; PARA_NOTICE_LOG("calling com_%s() for %s@%s\n", cmd->name, u->name, peername); ret = cmd->handler(&rc4c, argc, argv); + free_argv(argv); mutex_lock(mmd_mutex); mmd->num_commands++; mutex_unlock(mmd_mutex); @@ -839,7 +849,6 @@ net_err: PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); out: free(command); - free(argv); mutex_lock(mmd_mutex); if (cmd && (cmd->perms & AFS_WRITE) && ret >= 0) mmd->events++;