{
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;
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;