para_write: Return proper error code.
[paraslash.git] / audioc.c
index fa1768b52f26eb69b6806f18c42d098a0267259e..74fb824cfff9d7193ebe42af9bfdc97ed5863fe0 100644 (file)
--- a/audioc.c
+++ b/audioc.c
@@ -1,5 +1,5 @@
 /*
- * 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.
  */
@@ -71,7 +71,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 +93,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;