]>
code.delx.au - pulseaudio/blob - src/utils/pacmd.c
2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of the License,
9 or (at your option) any later version.
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
28 #include <sys/socket.h>
35 #include <pulse/util.h>
36 #include <pulse/xmalloc.h>
38 #include <pulsecore/i18n.h>
39 #include <pulsecore/poll.h>
40 #include <pulsecore/macro.h>
41 #include <pulsecore/core-util.h>
42 #include <pulsecore/log.h>
43 #include <pulsecore/pid.h>
45 int main(int argc
, char*argv
[]) {
49 struct sockaddr_un sa
;
52 size_t buf_size
, ibuf_size
, ibuf_index
, ibuf_length
, obuf_size
, obuf_index
, obuf_length
;
54 pa_bool_t ibuf_eof
, obuf_eof
, ibuf_closed
, obuf_closed
;
55 struct pollfd pollfd
[3];
56 struct pollfd
*watch_socket
, *watch_stdin
, *watch_stdout
;
58 int stdin_type
= 0, stdout_type
= 0, fd_type
= 0;
60 setlocale(LC_ALL
, "");
62 bindtextdomain(GETTEXT_PACKAGE
, PULSE_LOCALEDIR
);
65 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0) {
66 pa_log(_("No PulseAudio daemon running, or not running as session daemon."));
70 if ((fd
= pa_socket_cloexec(PF_UNIX
, SOCK_STREAM
, 0)) < 0) {
71 pa_log(_("socket(PF_UNIX, SOCK_STREAM, 0): %s"), strerror(errno
));
76 sa
.sun_family
= AF_UNIX
;
78 if (!(cli
= pa_runtime_path("cli")))
81 pa_strlcpy(sa
.sun_path
, cli
, sizeof(sa
.sun_path
));
84 for (i
= 0; i
< 5; i
++) {
87 if ((r
= connect(fd
, (struct sockaddr
*) &sa
, sizeof(sa
))) < 0 && (errno
!= ECONNREFUSED
&& errno
!= ENOENT
)) {
88 pa_log(_("connect(): %s"), strerror(errno
));
95 if (pa_pid_file_kill(SIGUSR2
, NULL
, "pulseaudio") < 0) {
96 pa_log(_("Failed to kill PulseAudio daemon."));
104 pa_log(_("Daemon not responding."));
108 buf_size
= pa_pipe_buf(fd
);
109 ibuf_size
= PA_MIN(buf_size
, pa_pipe_buf(STDIN_FILENO
));
110 ibuf
= pa_xmalloc(ibuf_size
);
111 obuf_size
= PA_MIN(buf_size
, pa_pipe_buf(STDOUT_FILENO
));
112 obuf
= pa_xmalloc(obuf_size
);
113 ibuf_index
= ibuf_length
= obuf_index
= obuf_length
= 0;
114 ibuf_eof
= obuf_eof
= ibuf_closed
= obuf_closed
= FALSE
;
117 for (i
= 1; i
< argc
; i
++) {
120 k
= PA_MIN(ibuf_size
- ibuf_length
, strlen(argv
[i
]));
121 memcpy(ibuf
+ ibuf_length
, argv
[i
], k
);
124 if (ibuf_length
< ibuf_size
) {
125 ibuf
[ibuf_length
] = i
< argc
-1 ? ' ' : '\n';
142 if (ibuf_length
<= 0 && ibuf_eof
&& !ibuf_closed
) {
143 shutdown(fd
, SHUT_WR
);
147 if (obuf_length
<= 0 && obuf_eof
&& !obuf_closed
) {
148 shutdown(fd
, SHUT_RD
);
156 if (ibuf_length
> 0 || (!obuf_eof
&& obuf_length
<= 0)) {
158 watch_socket
->fd
= fd
;
159 watch_socket
->events
=
160 (ibuf_length
> 0 ? POLLOUT
: 0) |
161 (!obuf_eof
&& obuf_length
<= 0 ? POLLIN
: 0);
165 if (!ibuf_eof
&& ibuf_length
<= 0) {
167 watch_stdin
->fd
= STDIN_FILENO
;
168 watch_stdin
->events
= POLLIN
;
172 if (obuf_length
> 0) {
174 watch_stdout
->fd
= STDOUT_FILENO
;
175 watch_stdout
->events
= POLLOUT
;
179 if (pa_poll(pollfd
, p
-pollfd
, -1) < 0) {
184 pa_log(_("poll(): %s"), strerror(errno
));
189 if (watch_stdin
->revents
& POLLIN
) {
191 pa_assert(ibuf_length
<= 0);
193 if ((r
= pa_read(STDIN_FILENO
, ibuf
, ibuf_size
, &stdin_type
)) <= 0) {
195 pa_log(_("read(): %s"), strerror(errno
));
201 ibuf_length
= (size_t) r
;
204 } else if (watch_stdin
->revents
& POLLHUP
)
209 if (watch_socket
->revents
& POLLIN
) {
211 pa_assert(obuf_length
<= 0);
213 if ((r
= pa_read(fd
, obuf
, obuf_size
, &fd_type
)) <= 0) {
215 pa_log(_("read(): %s"), strerror(errno
));
221 obuf_length
= (size_t) r
;
224 } else if (watch_socket
->revents
& POLLHUP
)
229 if (watch_stdout
->revents
& POLLHUP
) {
232 } else if (watch_stdout
->revents
& POLLOUT
) {
234 pa_assert(obuf_length
> 0);
236 if ((r
= pa_write(STDOUT_FILENO
, obuf
+ obuf_index
, obuf_length
, &stdout_type
)) < 0) {
237 pa_log(_("write(): %s"), strerror(errno
));
241 obuf_length
-= (size_t) r
;
242 obuf_index
+= obuf_index
;
247 if (watch_socket
->revents
& POLLHUP
) {
250 } if (watch_socket
->revents
& POLLOUT
) {
252 pa_assert(ibuf_length
> 0);
254 if ((r
= pa_write(fd
, ibuf
+ ibuf_index
, ibuf_length
, &fd_type
)) < 0) {
255 pa_log(_("write(): %s"), strerror(errno
));
259 ibuf_length
-= (size_t) r
;
260 ibuf_index
+= obuf_index
;