audioc: Switch to blocking file descriptors.
authorAndre Noll <maan@systemlinux.org>
Mon, 12 Apr 2010 17:07:51 +0000 (19:07 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 25 Apr 2010 18:17:31 +0000 (20:17 +0200)
There is no point in playing games with select() and non-blocking
file descriptors if all we need is a simple loop that dumps the fd
to stdout.

This patch also adds an error message for the case the setup of the
remote socket fails.

audioc.c

index 3134faa..f91f41f 100644 (file)
--- a/audioc.c
+++ b/audioc.c
@@ -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) {
+       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);
-
+       else {
+               char *hn = para_hostname(), *socket_name = make_message(
+                       "/var/paraslash/audiod_socket.%s", hn);
                ret = create_remote_socket(socket_name);
                free(hn);
                free(socket_name);
        }
-       if (ret < 0)
+       if (ret < 0) {
+               PARA_EMERG_LOG("failed to create remote 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;