Make afs commands work.
authorAndre Noll <maan@systemlinux.org>
Sat, 8 Sep 2007 23:17:50 +0000 (01:17 +0200)
committerAndre Noll <maan@systemlinux.org>
Sat, 8 Sep 2007 23:17:50 +0000 (01:17 +0200)
This required a rewrite of send_callback_request().

The patch also includes the rename of get_socket() to get_stream_socket()
which takes the new domain parameter, so that it may be used for both
AF_INET and AF_UNIX sockets.

afs.c
aft.c
attribute.c
audioc.c
blob.c
client_common.c
http_recv.c
net.c
net.h
server.c
server.ggo

diff --git a/afs.c b/afs.c
index 0a3d103..364eb7f 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -1,11 +1,19 @@
+/*
+ * Copyright (C) 1997-2007 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
+/** \file afs.c Paraslash's audio file selector. */
+
+#include "server.cmdline.h"
 #include "para.h"
 #include "afh.h"
+#include "server.h"
 #include "error.h"
 #include <dirent.h> /* readdir() */
 #include <sys/mman.h>
 #include <sys/time.h>
-//#include <inttypes.h>
-
 #include "net.h"
 #include "afs.h"
 #include "ipc.h"
@@ -15,7 +23,7 @@
 #include "signal.h"
 #include "fd.h"
 
-/** \file afs.c Paraslash's audio file selector. */
+extern uint32_t afs_socket_cookie;
 
 /**
  * Compare two osl objects of string type.
@@ -169,89 +177,92 @@ static int result_mutex;
  * \param result Callback result will be stored here.
  *
  * This function creates a shared memory area, copies the buffer pointed to by
- * \a buf to that area and notifies the parent process that  \a f should be
- * called ASAP. It provides proper locking via semaphores to protect against
- * concurent access to the shared memory area and against concurrent access by
- * another child process that asks to call the same function.
+ * \a buf to that area and notifies the afs process that \a f should be
+ * called ASAP.
  *
- * \return Negative, if the shared memory area could not be set up. The return
- * value of the callback function otherwise.
+ * \return Negative, on errors, the return value of the callback function
+ * otherwise.
  *
- * \sa shm_new(), shm_attach(), shm_detach(), mutex_lock(), mutex_unlock(),
- * shm_destroy(), struct callback_data, send_option_arg_callback_request(),
- * send_standard_callback_request().
+ * \sa send_option_arg_callback_request(), send_standard_callback_request().
  */
 int send_callback_request(callback_function *f, struct osl_object *query,
                struct osl_object *result)
 {
-       struct callback_data cbd = {.handler = f};
-       int ret;
-       void *query_sma;
+       struct callback_query *cq;
+       struct callback_result *cr;
+       int ret, fd = -1, query_shmid, result_shmid;
+       void *query_shm, *result_shm;
+       char buf[sizeof(afs_socket_cookie) + sizeof(int)];
+//     char *tmpsocket_name;
+       struct sockaddr_un unix_addr;
 
        assert(query->data && query->size);
-       ret = shm_new(query->size);
+       ret = shm_new(query->size + sizeof(*cq));
        if (ret < 0)
                return ret;
-       cbd.query_shmid = ret;
-       cbd.query_size = query->size;
-       ret = shm_attach(cbd.query_shmid, ATTACH_RW, &query_sma);
+       query_shmid = ret;
+       ret = shm_attach(query_shmid, ATTACH_RW, &query_shm);
+       if (ret < 0)
+               goto out;
+       cq = query_shm;
+       cq->handler = f;
+       cq->query_size = query->size;
+
+       memcpy(query_shm + sizeof(*cq), query->data, query->size);
+       ret = shm_detach(query_shm);
        if (ret < 0)
                goto out;
-       memcpy(query_sma, query->data, query->size);
-       ret = shm_detach(query_sma);
+
+       *(uint32_t *) buf = afs_socket_cookie;
+       *(int *) (buf + sizeof(afs_socket_cookie)) = query_shmid;
+
+       ret = get_stream_socket(PF_UNIX);
        if (ret < 0)
                goto out;
-       /* prevent other children from interacting */
-       mutex_lock(child_mutex);
-       /* prevent parent from messing with shm_callback_data. */
-       mutex_lock(callback_mutex);
-       /* all three mutexes are locked, set parameters for callback */
-       *shm_callback_data = cbd;
-       /* unblock parent */
-       mutex_unlock(callback_mutex);
-       kill(getppid(), SIGUSR1); /* wake up parent */
-       /*
-        * At this time only the parent can run. It will execute our callback
-        * and unlock the result_mutex when ready to indicate that the child
-        * may use the result. So let's sleep on this mutex.
-        */
-       mutex_lock(result_mutex);
-       /* No need to aquire the callback mutex again */
-       ret = shm_callback_data->sma_ret;
-       if (ret < 0) /* sma problem, callback might not have been executed */
-               goto unlock_child_mutex;
-       if (shm_callback_data->result_shmid >= 0) { /* parent provided a result */
-               void *sma;
-               ret = shm_attach(shm_callback_data->result_shmid, ATTACH_RO,
-                       &sma);
-               if (ret >= 0) {
-                       if (result) { /* copy result */
-                               result->size = shm_callback_data->result_size;
-                               result->data = para_malloc(result->size);
-                               memcpy(result->data, sma, result->size);
-                               ret = shm_detach(sma);
-                               if (ret < 0)
-                                       PARA_ERROR_LOG("can not detach result\n");
-                       } else
-                               PARA_WARNING_LOG("no result pointer\n");
-               } else
-                       PARA_ERROR_LOG("attach result failed: %d\n", ret);
-               if (shm_destroy(shm_callback_data->result_shmid) < 0)
-                       PARA_ERROR_LOG("destroy result failed\n");
-       } else { /* no result from callback */
-               if (result) {
-                       PARA_WARNING_LOG("callback has no result\n");
-                       result->data = NULL;
-                       result->size = 0;
-               }
+       fd = ret;
+       ret = init_unix_addr(&unix_addr, conf.afs_socket_arg);
+       if (ret < 0)
+               goto out;
+       ret = -E_CONNECT;
+       if (connect(fd, (struct sockaddr *)&unix_addr, sizeof(unix_addr)) < 0) /* FIXME: Use para_connect() */
+               goto out;
+       ret = send_bin_buffer(fd, buf, sizeof(buf));
+       PARA_NOTICE_LOG("bin buffer ret: %d\n", ret);
+       if (ret < 0)
+               goto out;
+       ret = recv_bin_buffer(fd, buf, sizeof(buf));
+       PARA_NOTICE_LOG("ret: %d\n", ret);
+       if (ret < 0)
+               goto out;
+       if (ret != sizeof(int)) {
+               ret = -E_RECV;
+               goto out;
        }
-       ret = shm_callback_data->callback_ret;
-unlock_child_mutex:
-       /* give other children a chance */
-       mutex_unlock(child_mutex);
+       ret = *(int *) buf;
+       PARA_NOTICE_LOG("result_shmid: %d\n", ret);
+       if (ret <= 0)
+               goto out;
+       result_shmid = ret;
+       ret = shm_attach(result_shmid, ATTACH_RO, &result_shm);
+       if (ret >= 0) {
+               assert(result);
+               cr = result_shm;
+               result->size = cr->result_size;
+               result->data = para_malloc(result->size);
+               memcpy(result->data, result_shm + sizeof(*cr), result->size);
+               ret = shm_detach(result_shm);
+               if (ret < 0)
+                       PARA_ERROR_LOG("can not detach result\n");
+       } else
+               PARA_ERROR_LOG("attach result failed: %d\n", ret);
+       if (shm_destroy(result_shmid) < 0)
+               PARA_ERROR_LOG("destroy result failed\n");
+       ret = 1;
 out:
-       if (shm_destroy(cbd.query_shmid) < 0)
+       if (shm_destroy(query_shmid) < 0)
                PARA_ERROR_LOG("%s\n", "shm destroy error");
+       if (fd >= 0)
+               close(fd);
        PARA_DEBUG_LOG("callback_ret: %d\n", ret);
        return ret;
 }
@@ -488,7 +499,7 @@ static enum play_mode init_admissible_files(void)
 static int setup_command_socket_or_die(void)
 {
        int ret;
-       char *socket_name = "/tmp/afs_command_socket";
+       char *socket_name = conf.afs_socket_arg;
        struct sockaddr_un unix_addr;
 
        unlink(socket_name);
@@ -586,7 +597,7 @@ static int call_callback(int fd, int query_shmid)
        struct osl_object query, result = {.data = NULL};
        int result_shmid = -1, ret, ret2;
 
-       ret = shm_attach(query_shmid, ATTACH_RO, &query_shm);
+       ret = shm_attach(query_shmid, ATTACH_RW, &query_shm);
        if (ret < 0)
                goto out;
        cq = query_shm;
@@ -617,7 +628,7 @@ static int call_callback(int fd, int query_shmid)
        ret = result_shmid;
 out:
        free(result.data);
-       ret2 = send_bin_buffer(fd, (char *)ret, sizeof(int));
+       ret2 = send_bin_buffer(fd, (char *)&ret, sizeof(int));
        if (ret < 0 || ret2 < 0) {
                if (result_shmid >= 0)
                        if (shm_destroy(result_shmid) < 0)
@@ -648,9 +659,10 @@ static void command_post_select(struct sched *s, struct task *t)
         * and para_server.
         */
        fd = t->ret;
-       t->ret = recv_bin_buffer(ct->fd, buf, sizeof(buf));
+       /* FIXME: This is easily dosable (peer doesn't send data) */
+       t->ret = recv_bin_buffer(fd, buf, sizeof(buf));
        if (t->ret < 0) {
-               PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret));
+               PARA_NOTICE_LOG("%s (%d)\n", PARA_STRERROR(-t->ret), t->ret);
                t->ret = 1;
                goto out;
        }
@@ -823,249 +835,3 @@ int com_init(__a_unused int fd, int argc, const char **argv)
        }
        return 1;
 }
-
-#if 0
-/** Describes a command of para_server. */
-struct command {
-       /** The name of the command. */
-       const char *name;
-       /** The handler function. */
-       int (*handler)(int fd, int argc, const char **argv);
-};
-
-static struct command afs_cmds[] = {
-{
-       .name = "add",
-       .handler = com_add,
-},
-{
-       .name = "addlyr",
-       .handler = com_addlyr,
-},
-{
-       .name = "addimg",
-       .handler = com_addimg,
-},
-{
-       .name = "addmood",
-       .handler = com_addmood,
-},
-{
-       .name = "addpl",
-       .handler = com_addpl,
-},
-{
-       .name = "catlyr",
-       .handler = com_catlyr,
-},
-{
-       .name = "catimg",
-       .handler = com_catimg,
-},
-{
-       .name = "mvimg",
-       .handler = com_mvimg,
-},
-{
-       .name = "mvlyr",
-       .handler = com_mvlyr,
-},
-{
-       .name = "mvmood",
-       .handler = com_mvmood,
-},
-{
-       .name = "mvpl",
-       .handler = com_mvpl,
-},
-{
-       .name = "catmood",
-       .handler = com_catmood,
-},
-{
-       .name = "catpl",
-       .handler = com_catpl,
-},
-{
-       .name = "rmatt",
-       .handler = com_rmatt,
-},
-{
-       .name = "init",
-       .handler = com_init,
-},
-{
-       .name = "lsatt",
-       .handler = com_lsatt,
-},
-{
-       .name = "ls",
-       .handler = com_afs_ls,
-},
-{
-       .name = "lslyr",
-       .handler = com_lslyr,
-},
-{
-       .name = "lsimg",
-       .handler = com_lsimg,
-},
-{
-       .name = "lsmood",
-       .handler = com_lsmood,
-},
-{
-       .name = "lspl",
-       .handler = com_lspl,
-},
-{
-       .name = "setatt",
-       .handler = com_setatt,
-},
-{
-       .name = "addatt",
-       .handler = com_addatt,
-},
-{
-       .name = "rm",
-       .handler = com_afs_rm,
-},
-{
-       .name = "rmlyr",
-       .handler = com_rmlyr,
-},
-{
-       .name = "rmimg",
-       .handler = com_rmimg,
-},
-{
-       .name = "rmmood",
-       .handler = com_rmmood,
-},
-{
-       .name = "rmpl",
-       .handler = com_rmpl,
-},
-{
-       .name = "touch",
-       .handler = com_touch,
-},
-{
-       .name = NULL,
-}
-};
-
-static void call_callback(void)
-{
-       struct osl_object query, result = {.data = NULL};
-       int ret, ret2;
-
-       shm_callback_data->result_shmid = -1; /* no result */
-       ret = shm_attach(shm_callback_data->query_shmid, ATTACH_RW,
-               &query.data);
-       if (ret < 0)
-               goto out;
-       query.size = shm_callback_data->query_size;
-       shm_callback_data->callback_ret = shm_callback_data->handler(&query,
-               &result);
-       if (result.data && result.size) {
-               void *sma;
-               ret = shm_new(result.size);
-               if (ret < 0)
-                       goto detach_query;
-               shm_callback_data->result_shmid = ret;
-               shm_callback_data->result_size = result.size;
-               ret = shm_attach(shm_callback_data->result_shmid, ATTACH_RW, &sma);
-               if (ret < 0)
-                       goto destroy_result;
-               memcpy(sma, result.data, result.size);
-               ret = shm_detach(sma);
-               if (ret < 0) {
-                       PARA_ERROR_LOG("detach result failed\n");
-                       goto destroy_result;
-               }
-       }
-       ret = 1;
-       goto detach_query;
-destroy_result:
-       if (shm_destroy(shm_callback_data->result_shmid) < 0)
-               PARA_ERROR_LOG("destroy result failed\n");
-       shm_callback_data->result_shmid = -1;
-detach_query:
-       free(result.data);
-       ret2 = shm_detach(query.data);
-       if (ret2 < 0) {
-               PARA_ERROR_LOG("detach query failed\n");
-               if (ret >= 0)
-                       ret = ret2;
-       }
-out:
-       if (ret < 0)
-               PARA_ERROR_LOG("sma error %d\n", ret);
-       shm_callback_data->sma_ret = ret;
-       shm_callback_data->handler = NULL;
-       mutex_unlock(result_mutex); /* wake up child */
-}
-
-static int got_sigchld;
-static void server_loop(int child_pid)
-{
-//     int status;
-
-       PARA_DEBUG_LOG("server pid: %d, child pid: %d\n",
-               getpid(), child_pid);
-       for (;;)  {
-               mutex_lock(callback_mutex);
-               if (shm_callback_data->handler)
-                       call_callback();
-               mutex_unlock(callback_mutex);
-               usleep(100);
-               if (!got_sigchld)
-                       continue;
-               mutex_destroy(result_mutex);
-               mutex_destroy(callback_mutex);
-               mutex_destroy(child_mutex);
-               afs_shutdown(OSL_MARK_CLEAN);
-               exit(EXIT_SUCCESS);
-       }
-}
-
-int main(int argc, const char **argv)
-{
-       int i, ret = -E_AFS_SYNTAX;
-
-       signal(SIGUSR1, dummy);
-       signal(SIGCHLD, sigchld_handler);
-       if (argc < 2)
-               goto out;
-       ret = setup();
-//     ret = afs_init();
-       if (ret < 0) {
-               PARA_EMERG_LOG("afs_init returned %d\n", ret);
-               exit(EXIT_FAILURE);
-       }
-       ret = fork();
-       if (ret < 0) {
-               ret = -E_FORK;
-               goto out;
-       }
-       if (ret)
-               server_loop(ret);
-       for (i = 0; cmd[i].name; i++) {
-               if (strcmp(cmd[i].name, argv[1]))
-                       continue;
-               ret = cmd[i].handler(1, argc - 1 , argv + 1);
-               goto out;
-
-       }
-       PARA_ERROR_LOG("unknown command: %s\n", argv[1]);
-       ret = -1;
-out:
-       if (ret < 0)
-               PARA_ERROR_LOG("error %d\n", ret);
-       else
-               PARA_DEBUG_LOG("%s", "success\n");
-       afs_shutdown(0);
-       return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;
-}
-#endif
diff --git a/aft.c b/aft.c
index 06ff805..e682c20 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -4,6 +4,7 @@
 #include <fnmatch.h>
 #include "afh.h"
 #include "afs.h"
+#include "net.h"
 #include "string.h"
 
 int mp3_get_file_info(char *map, size_t numbytes,
@@ -1029,7 +1030,7 @@ out:
  * full list: list everything, including afsi, afhi, atts as clear text
  *
  * */
-int com_afs_ls(__a_unused int fd, int argc, const char **argv)
+int com_afs_ls(int fd, int argc, const char **argv)
 {
        int i, ret;
        unsigned flags = 0;
@@ -1135,7 +1136,7 @@ int com_afs_ls(__a_unused int fd, int argc, const char **argv)
        ret = send_option_arg_callback_request(&query, opts.num_patterns,
                argv + i, com_ls_callback, &ls_output);
        if (ret >= 0 && ls_output.data) {
-               printf("%s\n", (char *)ls_output.data);
+               send_buffer(fd, (char *)ls_output.data);
                free(ls_output.data);
        }
        return ret;
index d4a0bfa..86fc36d 100644 (file)
@@ -3,6 +3,7 @@
 #include "afh.h"
 #include "afs.h"
 #include "string.h"
+#include "net.h"
 
 static void *attribute_table;
 static int greatest_att_bitnum;
@@ -94,17 +95,18 @@ static int log_attribute(struct osl_row *row, void *private_data)
        if (ret < 0)
                return ret;
        if (!(pld->flags & LAA_FLAG_LONG)) {
-               printf("%s\n", (char *)name_obj.data);
+               send_buffer(pld->fd, (char *)name_obj.data);
                return 1;
        }
        ret = osl_get_object(attribute_table, row, ATTCOL_BITNUM, &bitnum_obj);
        if (ret < 0)
                return ret;
-       printf("%u\t%s\n", *(unsigned char*)bitnum_obj.data,
+       send_va_buffer(pld->fd, "%u\t%s\n", *(unsigned char*)bitnum_obj.data,
                (char *)name_obj.data);
        return 1;
 }
 
+/* FIXME: Need callback */
 int com_lsatt(int fd, int argc, const char **argv)
 {
        struct private_laa_data pld = {.fd = fd, .flags = 0};
index 42372ca..d98ab46 100644 (file)
--- a/audioc.c
+++ b/audioc.c
@@ -105,6 +105,7 @@ int main(int argc, char *argv[])
 
        ret = create_local_socket(tmpsocket_name, &unix_addr, S_IRUSR | S_IWUSR);
        unlink(tmpsocket_name);
+       free(tmpsocket_name);
        if (ret < 0)
                goto out;
        fd = ret;
@@ -112,7 +113,7 @@ int main(int argc, char *argv[])
        if (init_unix_addr(&unix_addr, socket_name) < 0)
                goto out;
        ret = -E_AUDIOC_CONNECT;
-       if (connect(fd, (struct sockaddr *)&unix_addr, UNIX_PATH_MAX) < 0)
+       if (connect(fd, (struct sockaddr *)&unix_addr, UNIX_PATH_MAX) < 0) /* FIXME: Use para_connect() */
                goto out;
        ret = send_cred_buffer(fd, args);
        if (ret < 0)
diff --git a/blob.c b/blob.c
index b970ab6..eca3c56 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -3,6 +3,7 @@
 #include "afh.h"
 #include "afs.h"
 #include "string.h"
+#include "net.h"
 
 /** \file blob.c Macros and functions for blob handling. */
 
@@ -105,7 +106,7 @@ int com_lsblob_callback(struct osl_table *table,
        return ret;
 }
 
-static int com_lsblob(callback_function *f, __a_unused int fd, int argc, const char **argv)
+static int com_lsblob(callback_function *f, int fd, int argc, const char **argv)
 {
        struct com_lsblob_options clbo = {.flags = 0};
        struct osl_object query = {.data = &clbo, .size = sizeof(clbo)},
@@ -138,7 +139,7 @@ static int com_lsblob(callback_function *f, __a_unused int fd, int argc, const c
        ret = send_option_arg_callback_request(&query, argc - i,
                argv + i, f, &ls_output);
        if (ret >= 0 && ls_output.data)
-               printf("%s\n", (char *)ls_output.data);
+               send_buffer(fd, (char *)ls_output.data);
        free(ls_output.data);
        return ret;
 }
@@ -161,7 +162,7 @@ static int com_catblob_callback(struct osl_table *table,
        memcpy(output->data, obj.data, obj.size);
        return osl_close_disk_object(&obj);
 }
-static int com_catblob(callback_function *f, __a_unused int fd, int argc,
+static int com_catblob(callback_function *f, int fd, int argc,
                const char **argv)
 {
        struct osl_object cat_output = {.data = NULL};
@@ -173,7 +174,7 @@ static int com_catblob(callback_function *f, __a_unused int fd, int argc,
                return -E_BLOB_SYNTAX;
        ret = send_standard_callback_request(1, argv + 1, f, &cat_output);
        if (ret >= 0 && cat_output.data)
-               printf("%s\n", (char *)cat_output.data);
+               ret = send_buffer(fd, (char *)cat_output.data);
        free(cat_output.data);
        return ret;
 
index 1b53f70..5a55546 100644 (file)
@@ -84,7 +84,7 @@ static int client_connect(struct private_client_data *pcd)
        if (ret < 0)
                return ret;
        /* get new socket */
-       ret = get_socket();
+       ret = get_stream_socket(AF_INET);
        if (ret < 0)
                return ret;
        pcd->fd = ret;
index 56783b7..05f452e 100644 (file)
@@ -175,8 +175,7 @@ static int http_recv_open(struct receiver_node *rn)
        ret = get_host_info(conf->host_arg, &he);
        if (ret < 0)
                goto err_out;
-       /* get new socket */
-       ret = get_socket();
+       ret = get_stream_socket(AF_INET);
        if (ret < 0)
                goto err_out;
        phd->fd = ret;
diff --git a/net.c b/net.c
index bc7d234..c5f33c8 100644 (file)
--- a/net.c
+++ b/net.c
@@ -292,11 +292,11 @@ int get_host_info(char *host, struct hostent **ret)
  *
  * \sa socket(2)
  */
-int get_socket(void)
+int get_stream_socket(int domain)
 {
        int socket_fd;
 
-       if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+       if ((socket_fd = socket(domain, SOCK_STREAM, 0)) == -1)
                return -E_SOCKET;
        return socket_fd;
 }
@@ -542,7 +542,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size)
  * \return The file descriptor of the created socket, negative
  * on errors.
  *
- * \sa get_socket()
+ * \sa get_stream_socket()
  * \sa setsockopt(2)
  * \sa bind(2)
  * \sa listen(2)
@@ -550,7 +550,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size)
 int init_tcp_socket(int port)
 {
        struct sockaddr_in my_addr;
-       int fd, ret = get_socket();
+       int fd, ret = get_stream_socket(AF_INET);
 
        if (ret < 0)
                return ret;
diff --git a/net.h b/net.h
index 1695504..ddc2509 100644 (file)
--- a/net.h
+++ b/net.h
@@ -22,9 +22,9 @@ typedef void crypt_function(unsigned long len,
 
 #include <netdb.h> /* hostent */
 int get_host_info(char *host, struct hostent **ret);
-int get_socket(void);
+int get_stream_socket(int domain);
 void init_sockaddr(struct sockaddr_in*, int, const struct hostent*);
-int para_connect(int, struct sockaddr_in *);
+int para_connect(int fd, struct sockaddr_in *their_addr);
 int send_buffer(int, const char *);
 int send_bin_buffer(int, const char *, size_t);
 __printf_2_3 int send_va_buffer(int fd, const char *fmt, ...);
index a63aeef..90f8cd5 100644 (file)
--- a/server.c
+++ b/server.c
@@ -348,7 +348,7 @@ out:
        exit(EXIT_FAILURE);
 }
 
-static uint32_t afs_socket_cookie;
+uint32_t afs_socket_cookie;
 static int afs_socket;
 pid_t afs_pid;
 
index 4f6e05b..dedb0e8 100644 (file)
@@ -133,6 +133,14 @@ option "selector" S
        optional
 
 
+option "afs_socket" s
+#~~~~~~~~~~~~~~~~~~~~
+
+"Command socket for the audio file selector"
+
+       string typestr="path"
+       default="/var/paraslash/afs_command_socket"
+       optional
 
 section "mysql selector"
 #~~~~~~~~~~~~~~~~~~~~~~~