1 /* vdagent.c xorg-client to vdagentd (daemon).
3 Copyright 2010 Red Hat, Inc.
6 Hans de Goede <hdegoede@redhat.com>
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
28 #include <sys/select.h>
30 #include <spice/vd_agent.h>
33 #include "vdagentd-proto.h"
34 #include "vdagentd-proto-strings.h"
35 #include "vdagent-x11.h"
37 static int verbose
= 0;
38 static struct vdagent_x11
*x11
= NULL
;
39 static FILE *logfile
= NULL
;
41 void daemon_read_complete(struct udscs_connection
**connp
,
42 struct udscs_message_header
*header
, const uint8_t *data
)
44 switch (header
->type
) {
45 case VDAGENTD_MONITORS_CONFIG
:
46 vdagent_x11_set_monitor_config(x11
, (VDAgentMonitorsConfig
*)data
);
48 case VDAGENTD_CLIPBOARD_REQUEST
:
49 vdagent_x11_clipboard_request(x11
, header
->opaque
);
51 case VDAGENTD_CLIPBOARD_GRAB
:
52 vdagent_x11_clipboard_grab(x11
, (uint32_t *)data
,
53 header
->size
/ sizeof(uint32_t));
55 case VDAGENTD_CLIPBOARD_DATA
:
56 vdagent_x11_clipboard_data(x11
, header
->opaque
, data
, header
->size
);
58 case VDAGENTD_CLIPBOARD_RELEASE
:
59 vdagent_x11_clipboard_release(x11
);
63 fprintf(logfile
, "Unknown message from vdagentd type: %d\n",
68 static void usage(FILE *fp
)
71 "vdagent -- spice agent xorg client\n"
73 " -h print this text\n"
74 " -d log debug messages\n");
77 int main(int argc
, char *argv
[])
79 struct udscs_connection
*client
= NULL
;
80 fd_set readfds
, writefds
;
81 int c
, n
, nfds
, x11_fd
, retval
= 0;
82 char *home
, filename
[1024];
85 if (-1 == (c
= getopt(argc
, argv
, "-dh")))
100 home
= getenv("HOME");
102 snprintf(filename
, sizeof(filename
), "%s/.spice-agent", home
);
103 n
= mkdir(filename
, 0755);
104 snprintf(filename
, sizeof(filename
), "%s/.spice-agent/log", home
);
105 logfile
= fopen(filename
, "w");
107 fprintf(stderr
, "Error opening %s: %s\n", filename
,
112 fprintf(stderr
, "Could not get home directory, logging to stderr\n");
116 client
= udscs_connect(VDAGENTD_SOCKET
, daemon_read_complete
, NULL
,
117 vdagentd_messages
, VDAGENTD_NO_MESSAGES
,
118 verbose
? logfile
:NULL
, logfile
);
122 x11
= vdagent_x11_create(client
, logfile
, verbose
);
124 udscs_destroy_connection(&client
);
132 nfds
= udscs_client_fill_fds(client
, &readfds
, &writefds
);
133 x11_fd
= vdagent_x11_get_fd(x11
);
134 FD_SET(x11_fd
, &readfds
);
138 n
= select(nfds
, &readfds
, &writefds
, NULL
, NULL
);
142 fprintf(logfile
, "Fatal error select: %s\n", strerror(errno
));
147 if (FD_ISSET(x11_fd
, &readfds
))
148 vdagent_x11_do_read(x11
);
149 udscs_client_handle_fds(&client
, &readfds
, &writefds
);
153 vdagent_x11_destroy(x11
);
154 udscs_destroy_connection(&client
);