/*
- * 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"
#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"
extern int mmd_mutex;
extern struct misc_meta_data *mmd;
extern struct sender senders[];
+int send_afs_status(struct rc4_context *rc4c, int parser_friendly);
+
+const char *status_item_list[] = {STATUS_ITEM_ARRAY};
static void dummy(__a_unused int s)
{
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);
}
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();
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) {
{
int i, ret;
char *ut;
- char *sender_info = NULL, *sender_list = NULL;
+ char *sender_info = NULL;
if (argc != 1)
return -E_COMMAND_SYNTAX;
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"
"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(),
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;
}
parser_friendly = 1;
continue;
}
+ return -E_COMMAND_SYNTAX;
}
if (i != argc)
return -E_COMMAND_SYNTAX;
}
/* 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"
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)
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;
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);
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++;