2 * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
4 * Licensed under the GPL v2. For licencing details see COPYING.
7 /** \file audioc.c The client program used to connect to para_audiod. */
10 #include <sys/types.h>
12 #include "audioc.cmdline.h"
22 /** The gengetopt structure containing command line args. */
23 static struct audioc_args_info conf
;
26 INIT_STDERR_LOGGING(loglevel
);
28 static char *concat_args(unsigned argc
, char * const *argv
)
33 for (i
= 0; i
< argc
; i
++) {
34 buf
= para_strcat(buf
, argv
[i
]);
36 buf
= para_strcat(buf
, "\n");
41 static char *configfile_exists(void)
43 static char *config_file
;
47 char *home
= para_homedir();
48 config_file
= make_message("%s/.paraslash/audioc.conf", home
);
51 if (!stat(config_file
, &statbuf
))
57 * The client program to connect to para_audiod.
59 * \param argc Usual argument count.
60 * \param argv Usual argument vector.
62 * It creates a temporary local socket in order to communicate with para_audiod.
63 * Authentication consists in sending a ucred buffer that contains the user id.
65 * Any output received through the local socket is sent to stdout.
67 * \return EXIT_SUCCESS or EXIT_FAILURE.
69 * \sa send_cred_buffer(), para_audioc(1), para_audiod(1).
71 int main(int argc
, char *argv
[])
73 int ret
= -E_AUDIOC_SYNTAX
, fd
;
74 char *cf
, *buf
= NULL
, *args
;
77 if (audioc_cmdline_parser(argc
, argv
, &conf
))
79 HANDLE_VERSION_FLAG("audioc", conf
);
80 cf
= configfile_exists();
82 struct audioc_cmdline_parser_params params
= {
88 if (audioc_cmdline_parser_config_file(cf
, &conf
, ¶ms
)) {
89 fprintf(stderr
, "parse error in config file\n");
93 loglevel
= get_loglevel_by_name(conf
.loglevel_arg
);
94 args
= conf
.inputs_num
?
95 concat_args(conf
.inputs_num
, conf
.inputs
) :
98 if (conf
.socket_given
)
99 ret
= connect_local_socket(conf
.socket_arg
);
101 char *hn
= para_hostname(), *socket_name
= make_message(
102 "/var/paraslash/audiod_socket.%s", hn
);
103 ret
= connect_local_socket(socket_name
);
108 PARA_EMERG_LOG("failed to connect to local socket\n");
112 ret
= send_cred_buffer(fd
, args
);
115 bufsize
= conf
.bufsize_arg
;
116 buf
= para_malloc(bufsize
);
118 size_t n
= ret
= recv_bin_buffer(fd
, buf
, bufsize
);
121 ret
= write_all(STDOUT_FILENO
, buf
, &n
);
125 PARA_ERROR_LOG("%s\n", para_strerror(-ret
));
126 return ret
< 0? EXIT_FAILURE
: EXIT_SUCCESS
;