From a4f75cecaaee538edb7aae3f0ff19168a1dab59d Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@systemlinux.org>
Date: Mon, 12 Apr 2010 19:07:51 +0200
Subject: [PATCH] audioc: Switch to blocking file descriptors.

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 | 71 +++++++++++++-------------------------------------------
 1 file changed, 16 insertions(+), 55 deletions(-)

diff --git a/audioc.c b/audioc.c
index 3134faa1..f91f41ff 100644
--- 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;
-- 
2.39.5