Merge branch 't/makefile_cleanups'
[paraslash.git] / audioc.c
index fa1768b52f26eb69b6806f18c42d098a0267259e..6b1a64f978c9dadf38cd6cf46c4070e74f384510 100644 (file)
--- a/audioc.c
+++ b/audioc.c
@@ -1,14 +1,13 @@
 /*
- * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
-/** \file audioc.c the client program used to connect to para_audiod */
+/** \file audioc.c The client program used to connect to para_audiod. */
 
 #include <regex.h>
 #include <sys/types.h>
-#include <dirent.h>
 
 #include "audioc.cmdline.h"
 #include "para.h"
@@ -16,6 +15,7 @@
 #include "net.h"
 #include "string.h"
 #include "fd.h"
+#include "version.h"
 
 INIT_AUDIOC_ERRLISTS;
 
@@ -27,7 +27,9 @@ INIT_STDERR_LOGGING(loglevel);
 
 static char *concat_args(unsigned argc, char * const *argv)
 {
-       int i; char *buf = NULL;
+       int i;
+       char *buf = NULL;
+
        for (i = 0; i < argc; i++) {
                buf = para_strcat(buf, argv[i]);
                if (i != argc - 1)
@@ -41,7 +43,6 @@ static char *configfile_exists(void)
        static char *config_file;
        struct stat statbuf;
 
-
        if (!config_file) {
                char *home = para_homedir();
                config_file = make_message("%s/.paraslash/audioc.conf", home);
@@ -53,17 +54,17 @@ static char *configfile_exists(void)
 }
 
 /**
- * the client program to connect to para_audiod
+ * The client program to connect to para_audiod.
  *
- * \param argc usual argument count
- * \param argv usual argument vector
+ * \param argc Usual argument count.
+ * \param argv Usual argument vector.
  *
  * It creates a temporary local socket in order to communicate with para_audiod.
  * Authentication consists in sending a ucred buffer that contains the user id.
  *
  * Any output received through the local socket is sent to stdout.
  *
- * \return EXIT_SUCCESS or EXIT_FAILURE
+ * \return EXIT_SUCCESS or EXIT_FAILURE.
  *
  * \sa send_cred_buffer(), para_audioc(1), para_audiod(1).
  */
@@ -71,7 +72,7 @@ int main(int argc, char *argv[])
 {
        int ret = -E_AUDIOC_SYNTAX, fd;
        char *cf, *buf = NULL, *args;
-       size_t bufsize, loaded = 0;
+       size_t bufsize;
 
        if (audioc_cmdline_parser(argc, argv, &conf))
                goto out;
@@ -93,72 +94,33 @@ int main(int argc, char *argv[])
        args = conf.inputs_num?
                concat_args(conf.inputs_num, conf.inputs) :
                para_strdup("stat");
-       bufsize = conf.bufsize_arg;
-       buf = para_malloc(bufsize);
-
-       if (conf.socket_given) {
-               ret = create_remote_socket(conf.socket_arg);
-       } else {
-               char *hn = para_hostname(),
-                    *socket_name = make_message("/var/paraslash/audiod_socket.%s", hn);
 
-               ret = create_remote_socket(socket_name);
+       if (conf.socket_given)
+               ret = connect_local_socket(conf.socket_arg);
+       else {
+               char *hn = para_hostname(), *socket_name = make_message(
+                       "/var/paraslash/audiod_socket.%s", hn);
+               ret = connect_local_socket(socket_name);
                free(hn);
                free(socket_name);
        }
-       if (ret < 0)
+       if (ret < 0) {
+               PARA_EMERG_LOG("failed to connect to local socket\n");
                goto out;
+       }
        fd = ret;
-       ret = mark_fd_nonblocking(fd);
-       if (ret < 0)
-               goto out;
-       ret = mark_fd_nonblocking(STDOUT_FILENO);
-       if (ret < 0)
-               goto out;
        ret = send_cred_buffer(fd, args);
        if (ret < 0)
                goto out;
-       for (;;) {
-               int max_fileno = -1, check_write = 0;
-               ssize_t len;
-               fd_set rfd, wfd;
-               FD_ZERO(&rfd);
-               FD_ZERO(&wfd);
-               if (loaded < bufsize)
-                       para_fd_set(fd, &rfd, &max_fileno);
-               if (loaded > 0) {
-                       para_fd_set(STDOUT_FILENO, &wfd, &max_fileno);
-                       check_write = 1;
-               }
-               ret = -E_AUDIOC_OVERRUN;
-               if (max_fileno < 0)
-                       goto out;
-               ret = para_select(max_fileno + 1, &rfd, &wfd, NULL);
-               if (ret < 0)
-                       goto out;
-               if (loaded < bufsize && FD_ISSET(fd, &rfd)) {
-                       len = recv_bin_buffer(fd, buf + loaded,
-                               bufsize - loaded);
-                       if (len <= 0) {
-                               ret = len < 0? -E_AUDIOC_READ : 0;
-                               goto out;
-                       }
-                       loaded += len;
-               }
-               if (check_write && FD_ISSET(STDOUT_FILENO, &wfd)) {
-                       ret = write(STDOUT_FILENO, buf, loaded);
-                       if (ret < 0) {
-                               ret = -E_AUDIOC_WRITE;
-                               goto out;
-                       }
-                       loaded -= ret;
-                       if (loaded && ret)
-                               memmove(buf, buf + ret, loaded);
-               }
-       }
+       bufsize = conf.bufsize_arg;
+       buf = para_malloc(bufsize);
+       do {
+               size_t n = ret = recv_bin_buffer(fd, buf, bufsize);
+               if (ret <= 0)
+                       break;
+               ret = write_all(STDOUT_FILENO, buf, &n);
+       } while (ret >= 0);
 out:
-       if (!ret && loaded && buf)
-               ret = write(STDOUT_FILENO, buf, loaded);
        if (ret < 0)
                PARA_ERROR_LOG("%s\n", para_strerror(-ret));
        return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;