This patch does the bulk of the work for thread support in the daemon The first part deals with the event loop, making all its functions thread-safe by adding mutex locking in appropriate places. There's a interesting problem in that one thread may want to add/remove FDs to the event loop, while another thread is sleeping in poll(). Thus we utilize the self-pipe trick, adding the 'read' end of the pipe to the FDs that are monitored. When one thread needs to break another out of the poll() wait, it writes a single byte to the pipe. The second part deals with the RPC call dispatch process. THe model is that one thread is responsible for all network I/O, accepting new clients, doing the poll(), and reading/writing the data for the RPC messages. When a complete message has been read off the wire, the correspondig struct qemud_client is marked as having a pending RPC call to dispatch. A pool of worker threads wait on a condition variable for available RPC calls to dispatch. We avoid a fixed 1-to-1 worker to client model since that's needlessly wasteful of resources when most clients are idle most of the time. This patch hardcodes the worker pool size to 10, but the next patch makes it configurable. When a worker thread has finished dispatching a RPC call, the reply data is placed in the client outbound buffer, and its marked ready for transmit, at which point the main thread performs the I/O op. There is also one final round of tweaking the contract of the RPC handler methods. We explicitly pass in the virConnectPtr object to the RPC handlers. This means that 99% of them never need directly access the 'struct qemud_client' object, and thus the client object can be left unlocked for the duration of the libvirt API call. This is an important point for getting good parallelization. NB, yes there are lots of fprintf() calls in this patch still. They will be removed next time I post it when we're in a position to actually commit. THREADING.txt | 63 ++ event.c | 147 ++++- event.h | 15 qemud.c | 227 ++++++-- qemud.h | 25 remote.c | 1148 ++++++++++++++++++++++--------------------- remote_dispatch_prototypes.h | 832 +++++++++++++++++++++++++++---- remote_generate_stubs.pl | 8 8 files changed, 1746 insertions(+), 719 deletions(-) Daniel diff --git a/qemud/THREADING.txt b/qemud/THREADING.txt new file mode 100644 --- /dev/null +++ b/qemud/THREADING.txt @@ -0,0 +1,63 @@ + + Threading: the RULES. + ==================== + +If you don't understand this, don't touch the code. Ask for +further advice / explanation on the mailing list first. + + - the top level lock is on 'struct qemud_server'. This must be + held before acquiring any other lock + + - Each 'struct qemud_client' object has a lock. The server lock + must be held before acquiring it. Once the client lock is acquired + the server lock can (optionally) be dropped. + + - The event loop has its own self-contained lock. You can ignore + this as a caller of virEvent APIs. + + +The server lock is only needed / used once the daemon has entered +its main loop, which is the qemudRunLoop() . The initial thread +acquires the lock upon entering this method. + +It immediatelty spawns 'n' worker threads, whose main loop is +the qemudWorker() method. The workers will immediately try to +acquire the server lock, and thus block since its held by the +initial thread. + +When the initial thread enters the poll() call, it drops the +server lock. The worker locks now each wakeup, acquire the +server lock and go into a condition wait on the 'job' condition +variable. The workers are now all 'primed' for incoming RPC +calls. + + + +A file descriptor event now occurrs, causing the initial thread +to exit poll(). It invokes the registered callback associated +with the file descriptors on which the event occurrs. The callbacks +are required to immediately acquire the server lock. + +If the callback is dealing with a client event, it will then +acquire the client lock, and drop the server lock. + +The callback will now handle the I/O event, reading or writing +a RPC message. Once a complete RPC message has been read the +client is marked as being in state QEMUD_MODE_WAIT_DISPATCH, +and the 'job' condition variable is signaled. The callback +now drops the client lock and goes back into the poll() loop +waiting for more I/O events. + +Meanwhile one of the worker threads wakes up from its condition +variable sleep, holding the server lock. It now searches for a +client in state QEMUD_MODE_WAIT_DISPATCH. If it doesn't find +one, it goes back to sleep. If it does find one, then it calls +into the remoteDispatchClientRequest() method de-serialize the +incoming message into an XDR object and invoke the helper method +for the associated RPC call. + +While the helper method is executing, no locks are held on either +the client or server, but the ref count on the 'struct qemud_client' +object is incremented to ensure its not deleted. The helper can +now safely invoke the neccessary libvirt API call. + diff --git a/qemud/event.c b/qemud/event.c --- a/qemud/event.c +++ b/qemud/event.c @@ -28,12 +28,16 @@ #include <poll.h> #include <sys/time.h> #include <errno.h> +#include <unistd.h> #include "qemud.h" #include "event.h" #include "memory.h" +#include "util-lib.h" #define EVENT_DEBUG(fmt, ...) qemudDebug("EVENT: " fmt, __VA_ARGS__) + +static int virEventInterruptLocked(void); /* State for a single file handle being monitored */ struct virEventHandle { @@ -60,6 +64,9 @@ struct virEventTimeout { /* State for the main event loop */ struct virEventLoop { + pthread_mutex_t lock; + pthread_t leader; + int wakeupfd[2]; int handlesCount; int handlesAlloc; struct virEventHandle *handles; @@ -68,6 +75,12 @@ struct virEventLoop { struct virEventTimeout *timeouts; }; +#define EVENT_LOCK(ret) do { if (pthread_mutex_lock(&eventLoop.lock) != 0) return (ret); } while (0) +#define EVENT_UNLOCK(ret) do { if (pthread_mutex_unlock(&eventLoop.lock) != 0) return (ret); } while (0) + +#define EVENT_LOCK0() do { if (pthread_mutex_lock(&eventLoop.lock) != 0) return; } while (0) +#define EVENT_UNLOCK0() do { if (pthread_mutex_unlock(&eventLoop.lock) != 0) return; } while (0) + /* Only have one event loop */ static struct virEventLoop eventLoop; @@ -82,12 +95,15 @@ static int nextTimer = 0; */ int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, void *opaque) { EVENT_DEBUG("Add handle %d %d %p %p", fd, events, cb, opaque); + EVENT_LOCK(-1); if (eventLoop.handlesCount == eventLoop.handlesAlloc) { EVENT_DEBUG("Used %d handle slots, adding %d more", eventLoop.handlesAlloc, EVENT_ALLOC_EXTENT); if (VIR_REALLOC_N(eventLoop.handles, - (eventLoop.handlesAlloc + EVENT_ALLOC_EXTENT)) < 0) + (eventLoop.handlesAlloc + EVENT_ALLOC_EXTENT)) < 0) { + EVENT_UNLOCK(-1); return -1; + } eventLoop.handlesAlloc += EVENT_ALLOC_EXTENT; } @@ -99,17 +115,22 @@ int virEventAddHandleImpl(int fd, int ev eventLoop.handlesCount++; + virEventInterruptLocked(); + EVENT_UNLOCK(-1); return 0; } void virEventUpdateHandleImpl(int fd, int events) { int i; + EVENT_LOCK0(); for (i = 0 ; i < eventLoop.handlesCount ; i++) { if (eventLoop.handles[i].fd == fd) { eventLoop.handles[i].events = events; break; } } + virEventInterruptLocked(); + EVENT_UNLOCK0(); } /* @@ -121,6 +142,7 @@ int virEventRemoveHandleImpl(int fd) { int virEventRemoveHandleImpl(int fd) { int i; EVENT_DEBUG("Remove handle %d", fd); + EVENT_LOCK(-1); for (i = 0 ; i < eventLoop.handlesCount ; i++) { if (eventLoop.handles[i].deleted) continue; @@ -128,9 +150,12 @@ int virEventRemoveHandleImpl(int fd) { if (eventLoop.handles[i].fd == fd) { EVENT_DEBUG("mark delete %d", i); eventLoop.handles[i].deleted = 1; + EVENT_UNLOCK(-1); return 0; } } + virEventInterruptLocked(); + EVENT_UNLOCK(-1); return -1; } @@ -142,17 +167,21 @@ int virEventRemoveHandleImpl(int fd) { */ int virEventAddTimeoutImpl(int frequency, virEventTimeoutCallback cb, void *opaque) { struct timeval now; + int ret; EVENT_DEBUG("Adding timer %d with %d ms freq", nextTimer, frequency); if (gettimeofday(&now, NULL) < 0) { return -1; } + EVENT_LOCK(-1); if (eventLoop.timeoutsCount == eventLoop.timeoutsAlloc) { EVENT_DEBUG("Used %d timeout slots, adding %d more", eventLoop.timeoutsAlloc, EVENT_ALLOC_EXTENT); if (VIR_REALLOC_N(eventLoop.timeouts, - (eventLoop.timeoutsAlloc + EVENT_ALLOC_EXTENT)) < 0) + (eventLoop.timeoutsAlloc + EVENT_ALLOC_EXTENT)) < 0) { + EVENT_UNLOCK(-1); return -1; + } eventLoop.timeoutsAlloc += EVENT_ALLOC_EXTENT; } @@ -167,8 +196,10 @@ int virEventAddTimeoutImpl(int frequency (((unsigned long long)now.tv_usec)/1000) : 0; eventLoop.timeoutsCount++; - - return nextTimer-1; + ret = nextTimer-1; + virEventInterruptLocked(); + EVENT_UNLOCK(-1); + return ret; } void virEventUpdateTimeoutImpl(int timer, int frequency) { @@ -179,6 +210,7 @@ void virEventUpdateTimeoutImpl(int timer return; } + EVENT_LOCK0(); for (i = 0 ; i < eventLoop.timeoutsCount ; i++) { if (eventLoop.timeouts[i].timer == timer) { eventLoop.timeouts[i].frequency = frequency; @@ -189,6 +221,8 @@ void virEventUpdateTimeoutImpl(int timer break; } } + virEventInterruptLocked(); + EVENT_UNLOCK0(); } /* @@ -200,15 +234,19 @@ int virEventRemoveTimeoutImpl(int timer) int virEventRemoveTimeoutImpl(int timer) { int i; EVENT_DEBUG("Remove timer %d", timer); + EVENT_LOCK(-1); for (i = 0 ; i < eventLoop.timeoutsCount ; i++) { if (eventLoop.timeouts[i].deleted) continue; if (eventLoop.timeouts[i].timer == timer) { eventLoop.timeouts[i].deleted = 1; + EVENT_UNLOCK(-1); return 0; } } + virEventInterruptLocked(); + EVENT_UNLOCK(-1); return -1; } @@ -276,7 +314,8 @@ static int virEventMakePollFDs(struct po return -1; for (i = 0, nfds = 0 ; i < eventLoop.handlesCount ; i++) { - if (eventLoop.handles[i].deleted) + if (eventLoop.handles[i].deleted || + !eventLoop.handles[i].events) continue; fds[nfds].fd = eventLoop.handles[i].fd; fds[nfds].events = eventLoop.handles[i].events; @@ -320,10 +359,15 @@ static int virEventDispatchTimeouts(void continue; if (eventLoop.timeouts[i].expiresAt <= now) { - (eventLoop.timeouts[i].cb)(eventLoop.timeouts[i].timer, - eventLoop.timeouts[i].opaque); + virEventTimeoutCallback cb = eventLoop.timeouts[i].cb; + int timer = eventLoop.timeouts[i].timer; + void *opaque = eventLoop.timeouts[i].opaque; eventLoop.timeouts[i].expiresAt = now + eventLoop.timeouts[i].frequency; + + EVENT_UNLOCK(-1); + (cb)(timer, opaque); + EVENT_LOCK(-1); } } return 0; @@ -340,21 +384,23 @@ static int virEventDispatchTimeouts(void * * Returns 0 upon success, -1 if an error occurred */ -static int virEventDispatchHandles(struct pollfd *fds) { +static int virEventDispatchHandles(int nfds, struct pollfd *fds) { int i; - /* Save this now - it may be changed during dispatch */ - int nhandles = eventLoop.handlesCount; - for (i = 0 ; i < nhandles ; i++) { + for (i = 0 ; i < nfds ; i++) { if (eventLoop.handles[i].deleted) { EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd); continue; } if (fds[i].revents) { - EVENT_DEBUG("Dispatch %d %d %p", fds[i].fd, fds[i].revents, eventLoop.handles[i].opaque); - (eventLoop.handles[i].cb)(fds[i].fd, fds[i].revents, - eventLoop.handles[i].opaque); + virEventHandleCallback cb = eventLoop.handles[i].cb; + void *opaque = eventLoop.handles[i].opaque; + EVENT_DEBUG("Dispatch %d %d %p", fds[i].fd, + fds[i].revents, eventLoop.handles[i].opaque); + EVENT_UNLOCK(-1); + (cb)(fds[i].fd, fds[i].revents, opaque); + EVENT_LOCK(-1); } } @@ -443,13 +489,20 @@ int virEventRunOnce(void) { struct pollfd *fds; int ret, timeout, nfds; - if ((nfds = virEventMakePollFDs(&fds)) < 0) + EVENT_LOCK(-1); + eventLoop.leader = pthread_self(); + if ((nfds = virEventMakePollFDs(&fds)) < 0) { + EVENT_UNLOCK(-1); return -1; + } if (virEventCalculateTimeout(&timeout) < 0) { VIR_FREE(fds); + EVENT_UNLOCK(-1); return -1; } + + EVENT_UNLOCK(-1); retry: EVENT_DEBUG("Poll on %d handles %p timeout %d", nfds, fds, timeout); @@ -462,23 +515,81 @@ int virEventRunOnce(void) { VIR_FREE(fds); return -1; } + + EVENT_LOCK(-1); if (virEventDispatchTimeouts() < 0) { VIR_FREE(fds); + EVENT_UNLOCK(-1); return -1; } if (ret > 0 && - virEventDispatchHandles(fds) < 0) { + virEventDispatchHandles(nfds, fds) < 0) { VIR_FREE(fds); + EVENT_UNLOCK(-1); return -1; } VIR_FREE(fds); - if (virEventCleanupTimeouts() < 0) + if (virEventCleanupTimeouts() < 0) { + EVENT_UNLOCK(-1); + return -1; + } + + if (virEventCleanupHandles() < 0) { + EVENT_UNLOCK(-1); + return -1; + } + + eventLoop.leader = 0; + EVENT_UNLOCK(-1); + return 0; +} + +static void virEventHandleWakeup(int fd, + int events ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) +{ + char c; + EVENT_LOCK0(); + saferead(fd, &c, sizeof(c)); + EVENT_UNLOCK0(); +} + +int virEventInit(void) +{ + if (pthread_mutex_init(&eventLoop.lock, NULL) != 0) return -1; - if (virEventCleanupHandles() < 0) + if (pipe(eventLoop.wakeupfd) < 0 || + qemudSetNonBlock(eventLoop.wakeupfd[0]) < 0 || + qemudSetNonBlock(eventLoop.wakeupfd[1]) < 0 || + qemudSetCloseExec(eventLoop.wakeupfd[0]) < 0 || + qemudSetCloseExec(eventLoop.wakeupfd[1]) < 0) + return -1; + + if (virEventAddHandleImpl(eventLoop.wakeupfd[0], POLLIN, virEventHandleWakeup, NULL) < 0) return -1; return 0; } + +static int virEventInterruptLocked(void) +{ + char c = '\0'; + if (pthread_self() == eventLoop.leader) + return 0; + + if (safewrite(eventLoop.wakeupfd[1], &c, sizeof(c)) != sizeof(c)) + return -1; + return 0; +} + +int virEventInterrupt(void) +{ + int ret; + EVENT_LOCK(-1); + ret = virEventInterruptLocked(); + EVENT_UNLOCK(-1); + return ret; +} diff --git a/qemud/event.h b/qemud/event.h --- a/qemud/event.h +++ b/qemud/event.h @@ -95,6 +95,13 @@ int virEventRemoveTimeoutImpl(int timer) int virEventRemoveTimeoutImpl(int timer); /** + * virEventInit: Initialize the event loop + * + * returns -1 if initialization failed + */ +int virEventInit(void); + +/** * virEventRunOnce: run a single iteration of the event loop. * * Blocks the caller until at least one file handle has an @@ -104,4 +111,12 @@ int virEventRemoveTimeoutImpl(int timer) */ int virEventRunOnce(void); + +/** + * virEventInterrupt: wakeup any thread waiting in poll() + * + * return -1 if wakup failed + */ +int virEventInterrupt(void); + #endif /* __VIRTD_EVENT_H__ */ diff --git a/qemud/qemud.c b/qemud/qemud.c --- a/qemud/qemud.c +++ b/qemud/qemud.c @@ -237,9 +237,12 @@ static void qemudDispatchSignalEvent(int siginfo_t siginfo; int ret; + pthread_mutex_lock(&server->lock); + if (saferead(server->sigread, &siginfo, sizeof(siginfo)) != sizeof(siginfo)) { qemudLog(QEMUD_ERR, _("Failed to read from signal pipe: %s"), strerror(errno)); + pthread_mutex_unlock(&server->lock); return; } @@ -269,9 +272,11 @@ static void qemudDispatchSignalEvent(int if (ret != 0) server->shutdown = 1; + + pthread_mutex_unlock(&server->lock); } -static int qemudSetCloseExec(int fd) { +int qemudSetCloseExec(int fd) { int flags; if ((flags = fcntl(fd, F_GETFD)) < 0) goto error; @@ -286,7 +291,7 @@ static int qemudSetCloseExec(int fd) { } -static int qemudSetNonBlock(int fd) { +int qemudSetNonBlock(int fd) { int flags; if ((flags = fcntl(fd, F_GETFL)) < 0) goto error; @@ -721,7 +726,18 @@ static struct qemud_server *qemudInitial return NULL; } + if (pthread_mutex_init(&server->lock, NULL) != 0) { + VIR_FREE(server); + return NULL; + } + server->sigread = sigread; + + if (virEventInit() < 0) { + qemudLog(QEMUD_ERR, "%s", _("Failed to initialize event system")); + VIR_FREE(server); + return NULL; + } __virEventRegisterImpl(virEventAddHandleImpl, virEventUpdateHandleImpl, @@ -1085,7 +1101,7 @@ static int qemudDispatchServer(struct qe qemudLog(QEMUD_ERR, _("Failed to accept connection: %s"), strerror(errno)); return -1; } - + fprintf(stderr, "New client %d\n", fd); if (VIR_REALLOC_N(server->clients, server->nclients+1) < 0) { qemudLog(QEMUD_ERR, "%s", _("Out of memory allocating clients")); close(fd); @@ -1104,6 +1120,9 @@ static int qemudDispatchServer(struct qe if (VIR_ALLOC(client) < 0) goto cleanup; + if (pthread_mutex_init(&client->lock, NULL) != 0) + goto cleanup; + client->magic = QEMUD_CLIENT_MAGIC; client->fd = fd; client->readonly = sock->readonly; @@ -1176,35 +1195,18 @@ static int qemudDispatchServer(struct qe return 0; cleanup: - if (client->tlssession) gnutls_deinit (client->tlssession); + if (client && + client->tlssession) gnutls_deinit (client->tlssession); close (fd); free (client); return -1; } - - -static void qemudDispatchClientFailure(struct qemud_server *server, struct qemud_client *client) { - int i, n = -1; - for (i = 0 ; i < server->nclients ; i++) { - if (server->clients[i] == client) { - n = i; - break; - } - } - if (n != -1) { - if (n < (server->nclients-1)) - memmove(server->clients + n, - server->clients + n + 1, - server->nclients - (n + 1)); - server->nclients--; - } - +/* You must hold lock for at least the client */ +static void qemudDispatchClientFailure(struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client) { virEventRemoveHandleImpl(client->fd); - - if (client->conn) - virConnectClose(client->conn); #if HAVE_SASL if (client->saslconn) sasl_dispose(&client->saslconn); @@ -1212,9 +1214,59 @@ static void qemudDispatchClientFailure(s #endif if (client->tlssession) gnutls_deinit (client->tlssession); close(client->fd); - free(client); + client->fd = -1; } + +/* Caller must hold server lock */ +static struct qemud_client *qemudPendingJob(struct qemud_server *server) +{ + int i; + for (i = 0 ; i < server->nclients ; i++) { + pthread_mutex_lock(&server->clients[i]->lock); + if (server->clients[i]->mode == QEMUD_MODE_WAIT_DISPATCH) { + /* Delibrately don't unlock client - caller wants the lock */ + return server->clients[i]; + } + pthread_mutex_unlock(&server->clients[i]->lock); + } + return NULL; +} + +static void *qemudWorker(void *data) +{ + struct qemud_server *server = data; + fprintf(stderr, "Hello from worker %d\n", (int)pthread_self()); + while (1) { + struct qemud_client *client; + int len; + pthread_mutex_lock(&server->lock); + while ((client = qemudPendingJob(server)) == NULL) + pthread_cond_wait(&server->job, &server->lock); + pthread_mutex_unlock(&server->lock); + + /* We own a locked client now... */ + client->mode = QEMUD_MODE_IN_DISPATCH; + client->refs++; + fprintf(stderr, "Worker %d got a job %p %d\n", (int)pthread_self(), client, client->fd); + + if ((len = remoteDispatchClientRequest (server, client)) == 0) + qemudDispatchClientFailure(server, client); + + fprintf(stderr, "Worker %d finished job %p %d\n", (int)pthread_self(), client, client->fd); + /* Set up the output buffer. */ + client->mode = QEMUD_MODE_TX_PACKET; + client->bufferLength = len; + client->bufferOffset = 0; + + if (qemudRegisterClientEvent(server, client, 0) < 0) + qemudDispatchClientFailure(server, client); + + client->refs--; + pthread_mutex_unlock(&client->lock); + pthread_mutex_unlock(&server->lock); + } +} static int qemudClientReadBuf(struct qemud_server *server, @@ -1380,16 +1432,12 @@ static void qemudDispatchClientRead(stru if (client->bufferOffset < client->bufferLength) return; /* Not read enough */ - if ((len = remoteDispatchClientRequest (server, client)) == 0) + client->mode = QEMUD_MODE_WAIT_DISPATCH; + if (qemudRegisterClientEvent(server, client, 1) < 0) qemudDispatchClientFailure(server, client); - /* Set up the output buffer. */ - client->mode = QEMUD_MODE_TX_PACKET; - client->bufferLength = len; - client->bufferOffset = 0; - - if (qemudRegisterClientEvent(server, client, 1) < 0) - qemudDispatchClientFailure(server, client); + fprintf(stderr, "Waking up a worker for queued job %p\n", client); + pthread_cond_signal(&server->job); break; } @@ -1520,13 +1568,17 @@ static void qemudDispatchClientWrite(str return; if (client->bufferOffset == client->bufferLength) { - /* Done writing, switch back to receive */ - client->mode = QEMUD_MODE_RX_HEADER; - client->bufferLength = REMOTE_MESSAGE_HEADER_XDR_LEN; - client->bufferOffset = 0; + if (client->closing) { + qemudDispatchClientFailure (server, client); + } else { + /* Done writing, switch back to receive */ + client->mode = QEMUD_MODE_RX_HEADER; + client->bufferLength = REMOTE_MESSAGE_HEADER_XDR_LEN; + client->bufferOffset = 0; - if (qemudRegisterClientEvent (server, client, 1) < 0) - qemudDispatchClientFailure (server, client); + if (qemudRegisterClientEvent (server, client, 1) < 0) + qemudDispatchClientFailure (server, client); + } } /* Still writing */ break; @@ -1567,6 +1619,8 @@ static void qemudDispatchClientEvent(int struct qemud_client *client = NULL; int i; + pthread_mutex_lock(&server->lock); + for (i = 0 ; i < server->nclients ; i++) { if (server->clients[i]->fd == fd) { client = server->clients[i]; @@ -1574,8 +1628,13 @@ static void qemudDispatchClientEvent(int } } - if (!client) + if (!client) { + pthread_mutex_unlock(&server->lock); return; + } + + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); if (events == POLLOUT) qemudDispatchClientWrite(server, client); @@ -1583,6 +1642,7 @@ static void qemudDispatchClientEvent(int qemudDispatchClientRead(server, client); else qemudDispatchClientFailure(server, client); + pthread_mutex_unlock(&client->lock); } static int qemudRegisterClientEvent(struct qemud_server *server, @@ -1606,6 +1666,10 @@ static int qemudRegisterClientEvent(stru mode = POLLOUT; break; + case QEMUD_MODE_WAIT_DISPATCH: + mode = 0; + break; + default: return -1; } @@ -1614,18 +1678,24 @@ static int qemudRegisterClientEvent(stru if (virEventRemoveHandleImpl(client->fd) < 0) return -1; - if (virEventAddHandleImpl(client->fd, - mode | POLLERR | POLLHUP, - qemudDispatchClientEvent, - server) < 0) + if (mode) { + if (virEventAddHandleImpl(client->fd, + mode | POLLERR | POLLHUP, + qemudDispatchClientEvent, + server) < 0) return -1; + } return 0; } static void qemudDispatchServerEvent(int fd, int events, void *opaque) { struct qemud_server *server = (struct qemud_server *)opaque; - struct qemud_socket *sock = server->sockets; + struct qemud_socket *sock; + + pthread_mutex_lock(&server->lock); + + sock = server->sockets; while (sock) { if (sock->fd == fd) @@ -1634,11 +1704,10 @@ static void qemudDispatchServerEvent(int sock = sock->next; } - if (!sock) - return; + if (sock && events) + qemudDispatchServer(server, sock); - if (events) - qemudDispatchServer(server, sock); + pthread_mutex_unlock(&server->lock); } @@ -1672,6 +1741,26 @@ static void qemudInactiveTimer(int timer static int qemudRunLoop(struct qemud_server *server) { int timerid = -1; + int ret = -1, i; + + pthread_mutex_lock(&server->lock); + + server->nworkers = 10; + if (VIR_ALLOC_N(server->workers, server->nworkers) < 0) { + qemudLog(QEMUD_ERR, "%s", _("Failed to allocate workers")); + return -1; + } + + for (i = 0 ; i < server->nworkers ; i++) { + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, 1); + + pthread_create(&server->workers[i], + &attr, + qemudWorker, + server); + } for (;;) { /* A shutdown timeout is specified, so check @@ -1683,8 +1772,30 @@ static int qemudRunLoop(struct qemud_ser qemudDebug("Scheduling shutdown timer %d", timerid); } + pthread_mutex_unlock(&server->lock); if (qemudOneLoop() < 0) break; + pthread_mutex_lock(&server->lock); + + reprocess: + for (i = 0 ; i < server->nclients ; i++) { + int inactive; + pthread_mutex_lock(&server->clients[i]->lock); + inactive = server->clients[i]->fd == -1; + pthread_mutex_unlock(&server->clients[i]->lock); + if (inactive) { + if (server->clients[i]->conn) + virConnectClose(server->clients[i]->conn); + VIR_FREE(server->clients[i]); + server->nclients--; + if (i < server->nclients) { + memmove(server->clients + i, + server->clients + i + 1, + server->nclients - i); + goto reprocess; + } + } + } /* Unregister any timeout that's active, since we * just had an event processed @@ -1695,11 +1806,21 @@ static int qemudRunLoop(struct qemud_ser timerid = -1; } - if (server->shutdown) - return 0; + if (server->shutdown) { + ret = 0; + break; + } } - return -1; + for (i = 0 ; i < server->nworkers ; i++) { + pthread_t thread = server->workers[i]; + pthread_mutex_unlock(&server->lock); + pthread_join(thread, NULL); + pthread_mutex_lock(&server->lock); + } + + pthread_mutex_unlock(&server->lock); + return ret; } static void qemudCleanup(struct qemud_server *server) { diff --git a/qemud/qemud.h b/qemud/qemud.h --- a/qemud/qemud.h +++ b/qemud/qemud.h @@ -74,10 +74,12 @@ typedef enum { enum qemud_mode { - QEMUD_MODE_RX_HEADER, - QEMUD_MODE_RX_PAYLOAD, - QEMUD_MODE_TX_PACKET, - QEMUD_MODE_TLS_HANDSHAKE, + QEMUD_MODE_RX_HEADER, /* Receiving the fixed length RPC header data */ + QEMUD_MODE_RX_PAYLOAD, /* Receiving the variable length RPC payload data */ + QEMUD_MODE_WAIT_DISPATCH, /* Message received, waiting for worker to process */ + QEMUD_MODE_IN_DISPATCH, /* RPC call being processed */ + QEMUD_MODE_TX_PACKET, /* Transmitting reply to RPC call */ + QEMUD_MODE_TLS_HANDSHAKE, /* Performing TLS handshake */ }; /* Whether we're passing reads & writes through a sasl SSF */ @@ -95,10 +97,13 @@ enum qemud_sock_type { /* Stores the per-client connection state */ struct qemud_client { + pthread_mutex_t lock; /* You must own qemud_server's lock before acquiring this */ + int magic; int fd; - int readonly; + int readonly:1; + int closing:1; enum qemud_mode mode; struct sockaddr_storage addr; @@ -131,6 +136,7 @@ struct qemud_client { * called, it will be set back to NULL if that succeeds. */ virConnectPtr conn; + int refs; }; #define QEMUD_CLIENT_MAGIC 0x7788aaee @@ -147,10 +153,16 @@ struct qemud_socket { /* Main server state */ struct qemud_server { + pthread_mutex_t lock; + pthread_cond_t job; + + int nworkers; + pthread_t *workers; int nsockets; struct qemud_socket *sockets; int nclients; struct qemud_client **clients; + int sigread; char logDir[PATH_MAX]; unsigned int shutdown : 1; @@ -174,6 +186,9 @@ void qemudLog(int priority, const char * #define qemudDebug(fmt, ...) do {} while(0) #endif +int qemudSetCloseExec(int fd); +int qemudSetNonBlock(int fd); + unsigned int remoteDispatchClientRequest (struct qemud_server *server, struct qemud_client *client); diff --git a/qemud/remote.c b/qemud/remote.c --- a/qemud/remote.c +++ b/qemud/remote.c @@ -77,8 +77,22 @@ typedef union { } dispatch_ret; +/** + * When the RPC handler is called: + * + * - Server object is unlocked + * - Client object is unlocked + * + * Both must be locked before use. Server lock must + * be held before attempting to lock client. + * + * Without any locking, it is safe to use: + * + * 'conn', 'rerr', 'args and 'ret' + */ typedef int (*dispatch_fn) (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn, remote_error *err, dispatch_args *args, dispatch_ret *ret); @@ -193,6 +207,9 @@ remoteDispatchConnError (remote_error *r /* This function gets called from qemud when it detects an incoming * remote protocol message. At this point, client->buffer contains * the full call message (including length word which we skip). + * + * Server object is unlocked + * Client object is locked */ unsigned int remoteDispatchClientRequest (struct qemud_server *server, @@ -205,6 +222,7 @@ remoteDispatchClientRequest (struct qemu dispatch_ret ret; const dispatch_data *data = NULL; int rv = -1, len; + virConnectPtr conn = NULL; memset(&args, 0, sizeof args); memset(&ret, 0, sizeof ret); @@ -274,7 +292,25 @@ remoteDispatchClientRequest (struct qemu } /* Call function. */ - rv = (data->fn)(server, client, &rerr, &args, &ret); + conn = client->conn; + pthread_mutex_unlock(&client->lock); + + /* + * When the RPC handler is called: + * + * - Server object is unlocked + * - Client object is unlocked + * + * Without locking, it is safe to use: + * + * 'conn', 'rerr', 'args and 'ret' + */ + rv = (data->fn)(server, client, conn, &rerr, &args, &ret); + + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); + xdr_free (data->args_filter, (char*)&args); rpc_error: @@ -338,19 +374,24 @@ fatal_error: /*----- Functions. -----*/ static int -remoteDispatchOpen (struct qemud_server *server ATTRIBUTE_UNUSED, +remoteDispatchOpen (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn, remote_error *rerr, struct remote_open_args *args, void *ret ATTRIBUTE_UNUSED) { const char *name; - int flags; + int flags, rc; /* Already opened? */ - if (client->conn) { + if (conn) { remoteDispatchFormatError (rerr, "%s", _("connection already open")); return -1; } + + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); name = args->name ? *args->name : NULL; @@ -365,49 +406,42 @@ remoteDispatchOpen (struct qemud_server ? virConnectOpenReadOnly (name) : virConnectOpen (name); - if (client->conn == NULL) { + if (client->conn == NULL) remoteDispatchConnError(rerr, NULL); - return -1; - } + rc = client->conn ? 0 : -1; + pthread_mutex_unlock(&client->lock); + return rc; +} + +static int +remoteDispatchClose (struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn ATTRIBUTE_UNUSED, + remote_error *rerr ATTRIBUTE_UNUSED, + void *args ATTRIBUTE_UNUSED, void *ret ATTRIBUTE_UNUSED) +{ + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); + + client->closing = 1; + + pthread_mutex_unlock(&client->lock); return 0; } -#define CHECK_CONN(client) \ - if (!client->conn) { \ - remoteDispatchFormatError (rerr, "%s", _("connection not open")); \ - return -1; \ - } - -static int -remoteDispatchClose (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, - remote_error *rerr, - void *args ATTRIBUTE_UNUSED, void *ret ATTRIBUTE_UNUSED) -{ - CHECK_CONN(client); - - if (virConnectClose (client->conn) < 0) { - remoteDispatchConnError(rerr, NULL); - return -1; - } - - client->conn = NULL; - - return 0; -} static int remoteDispatchSupportsFeature (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_supports_feature_args *args, remote_supports_feature_ret *ret) { - CHECK_CONN(client); - - ret->supported = __virDrvSupportsFeature (client->conn, args->feature); + ret->supported = __virDrvSupportsFeature (conn, args->feature); if (ret->supported == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -416,16 +450,16 @@ remoteDispatchSupportsFeature (struct qe static int remoteDispatchGetType (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_get_type_ret *ret) { const char *type; - CHECK_CONN(client); - type = virConnectGetType (client->conn); + type = virConnectGetType (conn); if (type == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -443,16 +477,16 @@ remoteDispatchGetType (struct qemud_serv static int remoteDispatchGetVersion (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_get_version_ret *ret) { unsigned long hvVer; - CHECK_CONN(client); - if (virConnectGetVersion (client->conn, &hvVer) == -1) { - remoteDispatchConnError(rerr, client->conn); + if (virConnectGetVersion (conn, &hvVer) == -1) { + remoteDispatchConnError(rerr, conn); return -1; } @@ -462,17 +496,17 @@ remoteDispatchGetVersion (struct qemud_s static int remoteDispatchGetHostname (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_get_hostname_ret *ret) { char *hostname; - CHECK_CONN(client); - hostname = virConnectGetHostname (client->conn); + hostname = virConnectGetHostname (conn); if (hostname == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -482,18 +516,18 @@ remoteDispatchGetHostname (struct qemud_ static int remoteDispatchGetMaxVcpus (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_get_max_vcpus_args *args, remote_get_max_vcpus_ret *ret) { char *type; - CHECK_CONN(client); type = args->type ? *args->type : NULL; - ret->max_vcpus = virConnectGetMaxVcpus (client->conn, type); + ret->max_vcpus = virConnectGetMaxVcpus (conn, type); if (ret->max_vcpus == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -502,16 +536,16 @@ remoteDispatchGetMaxVcpus (struct qemud_ static int remoteDispatchNodeGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_node_get_info_ret *ret) { virNodeInfo info; - CHECK_CONN(client); - if (virNodeGetInfo (client->conn, &info) == -1) { - remoteDispatchConnError(rerr, client->conn); + if (virNodeGetInfo (conn, &info) == -1) { + remoteDispatchConnError(rerr, conn); return -1; } @@ -529,17 +563,17 @@ remoteDispatchNodeGetInfo (struct qemud_ static int remoteDispatchGetCapabilities (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_get_capabilities_ret *ret) { char *caps; - CHECK_CONN(client); - caps = virConnectGetCapabilities (client->conn); + caps = virConnectGetCapabilities (conn); if (caps == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -549,12 +583,12 @@ remoteDispatchGetCapabilities (struct qe static int remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_node_get_cells_free_memory_args *args, remote_node_get_cells_free_memory_ret *ret) { - CHECK_CONN(client); if (args->maxCells > REMOTE_NODE_MAX_CELLS) { remoteDispatchFormatError (rerr, @@ -568,13 +602,13 @@ remoteDispatchNodeGetCellsFreeMemory (st return -1; } - ret->freeMems.freeMems_len = virNodeGetCellsFreeMemory(client->conn, + ret->freeMems.freeMems_len = virNodeGetCellsFreeMemory(conn, (unsigned long long *)ret->freeMems.freeMems_val, args->startCell, args->maxCells); if (ret->freeMems.freeMems_len == 0) { VIR_FREE(ret->freeMems.freeMems_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -584,17 +618,17 @@ remoteDispatchNodeGetCellsFreeMemory (st static int remoteDispatchNodeGetFreeMemory (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_node_get_free_memory_ret *ret) { unsigned long long freeMem; - CHECK_CONN(client); - freeMem = virNodeGetFreeMemory(client->conn); + freeMem = virNodeGetFreeMemory(conn); if (freeMem == 0) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } ret->freeMem = freeMem; @@ -604,7 +638,8 @@ remoteDispatchNodeGetFreeMemory (struct static int remoteDispatchDomainGetSchedulerType (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_scheduler_type_args *args, remote_domain_get_scheduler_type_ret *ret) @@ -612,18 +647,17 @@ remoteDispatchDomainGetSchedulerType (st virDomainPtr dom; char *type; int nparams; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } type = virDomainGetSchedulerType (dom, &nparams); if (type == NULL) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -635,7 +669,8 @@ remoteDispatchDomainGetSchedulerType (st static int remoteDispatchDomainGetSchedulerParameters (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_scheduler_parameters_args *args, remote_domain_get_scheduler_parameters_ret *ret) @@ -643,7 +678,6 @@ remoteDispatchDomainGetSchedulerParamete virDomainPtr dom; virSchedParameterPtr params; int i, r, nparams; - CHECK_CONN(client); nparams = args->nparams; @@ -656,10 +690,10 @@ remoteDispatchDomainGetSchedulerParamete return -1; } - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { VIR_FREE(params); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -667,7 +701,7 @@ remoteDispatchDomainGetSchedulerParamete if (r == -1) { virDomainFree(dom); VIR_FREE(params); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -718,7 +752,8 @@ cleanup: static int remoteDispatchDomainSetSchedulerParameters (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_set_scheduler_parameters_args *args, void *ret ATTRIBUTE_UNUSED) @@ -726,7 +761,6 @@ remoteDispatchDomainSetSchedulerParamete virDomainPtr dom; int i, r, nparams; virSchedParameterPtr params; - CHECK_CONN(client); nparams = args->params.params_len; @@ -761,10 +795,10 @@ remoteDispatchDomainSetSchedulerParamete } } - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { VIR_FREE(params); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -772,7 +806,7 @@ remoteDispatchDomainSetSchedulerParamete virDomainFree(dom); VIR_FREE(params); if (r == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -781,7 +815,8 @@ remoteDispatchDomainSetSchedulerParamete static int remoteDispatchDomainBlockStats (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_block_stats_args *args, remote_domain_block_stats_ret *ret) @@ -789,18 +824,17 @@ remoteDispatchDomainBlockStats (struct q virDomainPtr dom; char *path; struct _virDomainBlockStats stats; - CHECK_CONN (client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } path = args->path; if (virDomainBlockStats (dom, path, &stats, sizeof stats) == -1) { virDomainFree (dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree (dom); @@ -816,7 +850,8 @@ remoteDispatchDomainBlockStats (struct q static int remoteDispatchDomainInterfaceStats (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_interface_stats_args *args, remote_domain_interface_stats_ret *ret) @@ -824,18 +859,17 @@ remoteDispatchDomainInterfaceStats (stru virDomainPtr dom; char *path; struct _virDomainInterfaceStats stats; - CHECK_CONN (client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } path = args->path; if (virDomainInterfaceStats (dom, path, &stats, sizeof stats) == -1) { virDomainFree (dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree (dom); @@ -854,7 +888,8 @@ remoteDispatchDomainInterfaceStats (stru static int remoteDispatchDomainBlockPeek (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_block_peek_args *args, remote_domain_block_peek_ret *ret) @@ -864,11 +899,10 @@ remoteDispatchDomainBlockPeek (struct qe unsigned long long offset; size_t size; unsigned int flags; - CHECK_CONN (client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } path = args->path; @@ -894,7 +928,7 @@ remoteDispatchDomainBlockPeek (struct qe ret->buffer.buffer_val, flags) == -1) { /* free (ret->buffer.buffer_val); - caller frees */ virDomainFree (dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree (dom); @@ -904,7 +938,8 @@ remoteDispatchDomainBlockPeek (struct qe static int remoteDispatchDomainMemoryPeek (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_memory_peek_args *args, remote_domain_memory_peek_ret *ret) @@ -913,11 +948,10 @@ remoteDispatchDomainMemoryPeek (struct q unsigned long long offset; size_t size; unsigned int flags; - CHECK_CONN (client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } offset = args->offset; @@ -942,7 +976,7 @@ remoteDispatchDomainMemoryPeek (struct q ret->buffer.buffer_val, flags) == -1) { /* free (ret->buffer.buffer_val); - caller frees */ virDomainFree (dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree (dom); @@ -952,23 +986,23 @@ remoteDispatchDomainMemoryPeek (struct q static int remoteDispatchDomainAttachDevice (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_attach_device_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainAttachDevice (dom, args->xml) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -977,23 +1011,23 @@ remoteDispatchDomainAttachDevice (struct static int remoteDispatchDomainCreate (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_create_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainCreate (dom) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1002,17 +1036,17 @@ remoteDispatchDomainCreate (struct qemud static int remoteDispatchDomainCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, - remote_error *rerr, - remote_domain_create_xml_args *args, - remote_domain_create_xml_ret *ret) + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, + remote_error *rerr, + remote_domain_create_xml_args *args, + remote_domain_create_xml_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = virDomainCreateXML (client->conn, args->xml_desc, args->flags); + dom = virDomainCreateXML (conn, args->xml_desc, args->flags); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1024,17 +1058,17 @@ remoteDispatchDomainCreateXml (struct qe static int remoteDispatchDomainDefineXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_define_xml_args *args, remote_domain_define_xml_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = virDomainDefineXML (client->conn, args->xml); + dom = virDomainDefineXML (conn, args->xml); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1046,23 +1080,23 @@ remoteDispatchDomainDefineXml (struct qe static int remoteDispatchDomainDestroy (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_destroy_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainDestroy (dom) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1071,23 +1105,23 @@ remoteDispatchDomainDestroy (struct qemu static int remoteDispatchDomainDetachDevice (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_detach_device_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainDetachDevice (dom, args->xml) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1097,17 +1131,17 @@ remoteDispatchDomainDetachDevice (struct static int remoteDispatchDomainDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_dump_xml_args *args, remote_domain_dump_xml_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1115,7 +1149,7 @@ remoteDispatchDomainDumpXml (struct qemu ret->xml = virDomainGetXMLDesc (dom, args->flags); if (!ret->xml) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1124,23 +1158,23 @@ remoteDispatchDomainDumpXml (struct qemu static int remoteDispatchDomainGetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_autostart_args *args, remote_domain_get_autostart_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainGetAutostart (dom, &ret->autostart) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1149,24 +1183,24 @@ remoteDispatchDomainGetAutostart (struct static int remoteDispatchDomainGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_info_args *args, remote_domain_get_info_ret *ret) { virDomainPtr dom; virDomainInfo info; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainGetInfo (dom, &info) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1183,24 +1217,24 @@ remoteDispatchDomainGetInfo (struct qemu static int remoteDispatchDomainGetMaxMemory (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_max_memory_args *args, remote_domain_get_max_memory_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } ret->memory = virDomainGetMaxMemory (dom); if (ret->memory == 0) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1209,24 +1243,24 @@ remoteDispatchDomainGetMaxMemory (struct static int remoteDispatchDomainGetMaxVcpus (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_max_vcpus_args *args, remote_domain_get_max_vcpus_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } ret->num = virDomainGetMaxVcpus (dom); if (ret->num == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1235,17 +1269,17 @@ remoteDispatchDomainGetMaxVcpus (struct static int remoteDispatchDomainGetOsType (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_os_type_args *args, remote_domain_get_os_type_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1253,7 +1287,7 @@ remoteDispatchDomainGetOsType (struct qe ret->type = virDomainGetOSType (dom); if (ret->type == NULL) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1262,7 +1296,8 @@ remoteDispatchDomainGetOsType (struct qe static int remoteDispatchDomainGetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_get_vcpus_args *args, remote_domain_get_vcpus_ret *ret) @@ -1271,11 +1306,10 @@ remoteDispatchDomainGetVcpus (struct qem virVcpuInfoPtr info = NULL; unsigned char *cpumaps = NULL; int info_len, i; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1304,7 +1338,7 @@ remoteDispatchDomainGetVcpus (struct qem VIR_FREE(info); VIR_FREE(cpumaps); virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1341,7 +1375,8 @@ oom: static int remoteDispatchDomainMigratePrepare (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_migrate_prepare_args *args, remote_domain_migrate_prepare_ret *ret) @@ -1352,7 +1387,6 @@ remoteDispatchDomainMigratePrepare (stru char *uri_in; char **uri_out; char *dname; - CHECK_CONN (client); uri_in = args->uri_in == NULL ? NULL : *args->uri_in; dname = args->dname == NULL ? NULL : *args->dname; @@ -1363,12 +1397,12 @@ remoteDispatchDomainMigratePrepare (stru return -1; } - r = __virDomainMigratePrepare (client->conn, &cookie, &cookielen, + r = __virDomainMigratePrepare (conn, &cookie, &cookielen, uri_in, uri_out, args->flags, dname, args->resource); if (r == -1) { VIR_FREE(uri_out); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1389,7 +1423,8 @@ remoteDispatchDomainMigratePrepare (stru static int remoteDispatchDomainMigratePerform (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_migrate_perform_args *args, void *ret ATTRIBUTE_UNUSED) @@ -1397,11 +1432,10 @@ remoteDispatchDomainMigratePerform (stru int r; virDomainPtr dom; char *dname; - CHECK_CONN (client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1414,7 +1448,7 @@ remoteDispatchDomainMigratePerform (stru args->flags, dname, args->resource); virDomainFree (dom); if (r == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1423,21 +1457,21 @@ remoteDispatchDomainMigratePerform (stru static int remoteDispatchDomainMigrateFinish (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_migrate_finish_args *args, remote_domain_migrate_finish_ret *ret) { virDomainPtr ddom; - CHECK_CONN (client); - ddom = __virDomainMigrateFinish (client->conn, args->dname, + ddom = __virDomainMigrateFinish (conn, args->dname, args->cookie.cookie_val, args->cookie.cookie_len, args->uri, args->flags); if (ddom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1448,12 +1482,12 @@ remoteDispatchDomainMigrateFinish (struc static int remoteDispatchListDefinedDomains (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_list_defined_domains_args *args, remote_list_defined_domains_ret *ret) { - CHECK_CONN(client); if (args->maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -1468,11 +1502,11 @@ remoteDispatchListDefinedDomains (struct } ret->names.names_len = - virConnectListDefinedDomains (client->conn, + virConnectListDefinedDomains (conn, ret->names.names_val, args->maxnames); if (ret->names.names_len == -1) { VIR_FREE(ret->names.names_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1481,17 +1515,17 @@ remoteDispatchListDefinedDomains (struct static int remoteDispatchDomainLookupById (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_lookup_by_id_args *args, remote_domain_lookup_by_id_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = virDomainLookupByID (client->conn, args->id); + dom = virDomainLookupByID (conn, args->id); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1502,17 +1536,17 @@ remoteDispatchDomainLookupById (struct q static int remoteDispatchDomainLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_lookup_by_name_args *args, remote_domain_lookup_by_name_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = virDomainLookupByName (client->conn, args->name); + dom = virDomainLookupByName (conn, args->name); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1523,17 +1557,17 @@ remoteDispatchDomainLookupByName (struct static int remoteDispatchDomainLookupByUuid (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_lookup_by_uuid_args *args, remote_domain_lookup_by_uuid_ret *ret) { virDomainPtr dom; - CHECK_CONN(client); - dom = virDomainLookupByUUID (client->conn, (unsigned char *) args->uuid); + dom = virDomainLookupByUUID (conn, (unsigned char *) args->uuid); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1544,16 +1578,16 @@ remoteDispatchDomainLookupByUuid (struct static int remoteDispatchNumOfDefinedDomains (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_num_of_defined_domains_ret *ret) { - CHECK_CONN(client); - ret->num = virConnectNumOfDefinedDomains (client->conn); + ret->num = virConnectNumOfDefinedDomains (conn); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1562,18 +1596,18 @@ remoteDispatchNumOfDefinedDomains (struc static int remoteDispatchDomainPinVcpu (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_pin_vcpu_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; int rv; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1588,7 +1622,7 @@ remoteDispatchDomainPinVcpu (struct qemu args->cpumap.cpumap_len); if (rv == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1597,23 +1631,23 @@ remoteDispatchDomainPinVcpu (struct qemu static int remoteDispatchDomainReboot (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_reboot_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainReboot (dom, args->flags) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1622,15 +1656,15 @@ remoteDispatchDomainReboot (struct qemud static int remoteDispatchDomainRestore (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_restore_args *args, void *ret ATTRIBUTE_UNUSED) { - CHECK_CONN(client); - if (virDomainRestore (client->conn, args->from) == -1) { - remoteDispatchConnError(rerr, client->conn); + if (virDomainRestore (conn, args->from) == -1) { + remoteDispatchConnError(rerr, conn); return -1; } @@ -1639,23 +1673,23 @@ remoteDispatchDomainRestore (struct qemu static int remoteDispatchDomainResume (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_resume_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainResume (dom) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1664,23 +1698,23 @@ remoteDispatchDomainResume (struct qemud static int remoteDispatchDomainSave (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_save_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainSave (dom, args->to) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1689,23 +1723,23 @@ remoteDispatchDomainSave (struct qemud_s static int remoteDispatchDomainCoreDump (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_core_dump_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainCoreDump (dom, args->to, args->flags) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1714,23 +1748,23 @@ remoteDispatchDomainCoreDump (struct qem static int remoteDispatchDomainSetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_set_autostart_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainSetAutostart (dom, args->autostart) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1739,23 +1773,23 @@ remoteDispatchDomainSetAutostart (struct static int remoteDispatchDomainSetMaxMemory (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_set_max_memory_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainSetMaxMemory (dom, args->memory) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1764,23 +1798,23 @@ remoteDispatchDomainSetMaxMemory (struct static int remoteDispatchDomainSetMemory (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_set_memory_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainSetMemory (dom, args->memory) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1789,23 +1823,23 @@ remoteDispatchDomainSetMemory (struct qe static int remoteDispatchDomainSetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_set_vcpus_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainSetVcpus (dom, args->nvcpus) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1814,23 +1848,23 @@ remoteDispatchDomainSetVcpus (struct qem static int remoteDispatchDomainShutdown (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_shutdown_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainShutdown (dom) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1839,23 +1873,23 @@ remoteDispatchDomainShutdown (struct qem static int remoteDispatchDomainSuspend (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_suspend_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainSuspend (dom) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1864,23 +1898,23 @@ remoteDispatchDomainSuspend (struct qemu static int remoteDispatchDomainUndefine (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_domain_undefine_args *args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom; - CHECK_CONN(client); - dom = get_nonnull_domain (client->conn, args->dom); + dom = get_nonnull_domain (conn, args->dom); if (dom == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virDomainUndefine (dom) == -1) { virDomainFree(dom); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virDomainFree(dom); @@ -1889,12 +1923,12 @@ remoteDispatchDomainUndefine (struct qem static int remoteDispatchListDefinedNetworks (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_list_defined_networks_args *args, remote_list_defined_networks_ret *ret) { - CHECK_CONN(client); if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -1909,11 +1943,11 @@ remoteDispatchListDefinedNetworks (struc } ret->names.names_len = - virConnectListDefinedNetworks (client->conn, + virConnectListDefinedNetworks (conn, ret->names.names_val, args->maxnames); if (ret->names.names_len == -1) { VIR_FREE(ret->names.names_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1922,12 +1956,12 @@ remoteDispatchListDefinedNetworks (struc static int remoteDispatchListDomains (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_list_domains_args *args, remote_list_domains_ret *ret) { - CHECK_CONN(client); if (args->maxids > REMOTE_DOMAIN_ID_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -1941,11 +1975,11 @@ remoteDispatchListDomains (struct qemud_ return -1; } - ret->ids.ids_len = virConnectListDomains (client->conn, + ret->ids.ids_len = virConnectListDomains (conn, ret->ids.ids_val, args->maxids); if (ret->ids.ids_len == -1) { VIR_FREE(ret->ids.ids_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1954,12 +1988,12 @@ remoteDispatchListDomains (struct qemud_ static int remoteDispatchListNetworks (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_list_networks_args *args, remote_list_networks_ret *ret) { - CHECK_CONN(client); if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -1974,11 +2008,11 @@ remoteDispatchListNetworks (struct qemud } ret->names.names_len = - virConnectListNetworks (client->conn, + virConnectListNetworks (conn, ret->names.names_val, args->maxnames); if (ret->names.names_len == -1) { VIR_FREE(ret->names.names_len); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -1987,23 +2021,23 @@ remoteDispatchListNetworks (struct qemud static int remoteDispatchNetworkCreate (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_create_args *args, void *ret ATTRIBUTE_UNUSED) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virNetworkCreate (net) == -1) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2012,17 +2046,17 @@ remoteDispatchNetworkCreate (struct qemu static int remoteDispatchNetworkCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_create_xml_args *args, remote_network_create_xml_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = virNetworkCreateXML (client->conn, args->xml); + net = virNetworkCreateXML (conn, args->xml); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2033,17 +2067,17 @@ remoteDispatchNetworkCreateXml (struct q static int remoteDispatchNetworkDefineXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_define_xml_args *args, remote_network_define_xml_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = virNetworkDefineXML (client->conn, args->xml); + net = virNetworkDefineXML (conn, args->xml); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2054,23 +2088,23 @@ remoteDispatchNetworkDefineXml (struct q static int remoteDispatchNetworkDestroy (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_destroy_args *args, void *ret ATTRIBUTE_UNUSED) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virNetworkDestroy (net) == -1) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2079,17 +2113,17 @@ remoteDispatchNetworkDestroy (struct qem static int remoteDispatchNetworkDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_dump_xml_args *args, remote_network_dump_xml_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2097,7 +2131,7 @@ remoteDispatchNetworkDumpXml (struct qem ret->xml = virNetworkGetXMLDesc (net, args->flags); if (!ret->xml) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2106,23 +2140,23 @@ remoteDispatchNetworkDumpXml (struct qem static int remoteDispatchNetworkGetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_get_autostart_args *args, remote_network_get_autostart_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virNetworkGetAutostart (net, &ret->autostart) == -1) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2131,17 +2165,17 @@ remoteDispatchNetworkGetAutostart (struc static int remoteDispatchNetworkGetBridgeName (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_get_bridge_name_args *args, remote_network_get_bridge_name_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2149,7 +2183,7 @@ remoteDispatchNetworkGetBridgeName (stru ret->name = virNetworkGetBridgeName (net); if (!ret->name) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2158,17 +2192,17 @@ remoteDispatchNetworkGetBridgeName (stru static int remoteDispatchNetworkLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_lookup_by_name_args *args, remote_network_lookup_by_name_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = virNetworkLookupByName (client->conn, args->name); + net = virNetworkLookupByName (conn, args->name); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2179,17 +2213,17 @@ remoteDispatchNetworkLookupByName (struc static int remoteDispatchNetworkLookupByUuid (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_lookup_by_uuid_args *args, remote_network_lookup_by_uuid_ret *ret) { virNetworkPtr net; - CHECK_CONN(client); - net = virNetworkLookupByUUID (client->conn, (unsigned char *) args->uuid); + net = virNetworkLookupByUUID (conn, (unsigned char *) args->uuid); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2200,23 +2234,23 @@ remoteDispatchNetworkLookupByUuid (struc static int remoteDispatchNetworkSetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_set_autostart_args *args, void *ret ATTRIBUTE_UNUSED) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virNetworkSetAutostart (net, args->autostart) == -1) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2225,23 +2259,23 @@ remoteDispatchNetworkSetAutostart (struc static int remoteDispatchNetworkUndefine (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_network_undefine_args *args, void *ret ATTRIBUTE_UNUSED) { virNetworkPtr net; - CHECK_CONN(client); - net = get_nonnull_network (client->conn, args->net); + net = get_nonnull_network (conn, args->net); if (net == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virNetworkUndefine (net) == -1) { virNetworkFree(net); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virNetworkFree(net); @@ -2250,16 +2284,16 @@ remoteDispatchNetworkUndefine (struct qe static int remoteDispatchNumOfDefinedNetworks (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_num_of_defined_networks_ret *ret) { - CHECK_CONN(client); - ret->num = virConnectNumOfDefinedNetworks (client->conn); + ret->num = virConnectNumOfDefinedNetworks (conn); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2268,16 +2302,16 @@ remoteDispatchNumOfDefinedNetworks (stru static int remoteDispatchNumOfDomains (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_num_of_domains_ret *ret) { - CHECK_CONN(client); - ret->num = virConnectNumOfDomains (client->conn); + ret->num = virConnectNumOfDomains (conn); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2286,16 +2320,16 @@ remoteDispatchNumOfDomains (struct qemud static int remoteDispatchNumOfNetworks (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_num_of_networks_ret *ret) { - CHECK_CONN(client); - ret->num = virConnectNumOfNetworks (client->conn); + ret->num = virConnectNumOfNetworks (conn); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2304,8 +2338,9 @@ remoteDispatchNumOfNetworks (struct qemu static int -remoteDispatchAuthList (struct qemud_server *server ATTRIBUTE_UNUSED, +remoteDispatchAuthList (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_auth_list_ret *ret) @@ -2315,7 +2350,12 @@ remoteDispatchAuthList (struct qemud_ser remoteDispatchOOMError(rerr); return -1; } + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); ret->types.types_val[0] = client->auth; + pthread_mutex_unlock(&client->lock); + return 0; } @@ -2359,8 +2399,9 @@ static char *addrToString(remote_error * * XXX callbacks for stuff like password verification ? */ static int -remoteDispatchAuthSaslInit (struct qemud_server *server ATTRIBUTE_UNUSED, +remoteDispatchAuthSaslInit (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_auth_sasl_init_ret *ret) @@ -2372,12 +2413,15 @@ remoteDispatchAuthSaslInit (struct qemud socklen_t salen; char *localAddr, *remoteAddr; + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); + REMOTE_DEBUG("Initialize SASL auth %d", client->fd); if (client->auth != REMOTE_AUTH_SASL || client->saslconn != NULL) { qemudLog(QEMUD_ERR, "%s", _("client tried invalid SASL init request")); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } /* Get local address in form IPADDR:PORT */ @@ -2386,10 +2430,10 @@ remoteDispatchAuthSaslInit (struct qemud remoteDispatchFormatError(rerr, _("failed to get sock address %d (%s)"), errno, strerror(errno)); - return -1; + goto error; } if ((localAddr = addrToString(rerr, &sa, salen)) == NULL) { - return -1; + goto error; } /* Get remote address in form IPADDR:PORT */ @@ -2398,11 +2442,11 @@ remoteDispatchAuthSaslInit (struct qemud remoteDispatchFormatError(rerr, _("failed to get peer address %d (%s)"), errno, strerror(errno)); VIR_FREE(localAddr); - return -1; + goto error; } if ((remoteAddr = addrToString(rerr, &sa, salen)) == NULL) { VIR_FREE(localAddr); - return -1; + goto error; } err = sasl_server_new("libvirt", @@ -2418,9 +2462,8 @@ remoteDispatchAuthSaslInit (struct qemud if (err != SASL_OK) { qemudLog(QEMUD_ERR, _("sasl context setup failed %d (%s)"), err, sasl_errstring(err, NULL, NULL)); - remoteDispatchAuthError(rerr); client->saslconn = NULL; - return -1; + goto authfail; } /* Inform SASL that we've got an external SSF layer from TLS */ @@ -2431,10 +2474,9 @@ remoteDispatchAuthSaslInit (struct qemud cipher = gnutls_cipher_get(client->tlssession); if (!(ssf = (sasl_ssf_t)gnutls_cipher_get_key_size(cipher))) { qemudLog(QEMUD_ERR, "%s", _("cannot TLS get cipher size")); - remoteDispatchAuthError(rerr); sasl_dispose(&client->saslconn); client->saslconn = NULL; - return -1; + goto authfail; } ssf *= 8; /* tls key size is bytes, sasl wants bits */ @@ -2442,10 +2484,9 @@ remoteDispatchAuthSaslInit (struct qemud if (err != SASL_OK) { qemudLog(QEMUD_ERR, _("cannot set SASL external SSF %d (%s)"), err, sasl_errstring(err, NULL, NULL)); - remoteDispatchAuthError(rerr); sasl_dispose(&client->saslconn); client->saslconn = NULL; - return -1; + goto authfail; } } @@ -2471,10 +2512,9 @@ remoteDispatchAuthSaslInit (struct qemud if (err != SASL_OK) { qemudLog(QEMUD_ERR, _("cannot set SASL security props %d (%s)"), err, sasl_errstring(err, NULL, NULL)); - remoteDispatchAuthError(rerr); sasl_dispose(&client->saslconn); client->saslconn = NULL; - return -1; + goto authfail; } err = sasl_listmech(client->saslconn, @@ -2488,22 +2528,27 @@ remoteDispatchAuthSaslInit (struct qemud if (err != SASL_OK) { qemudLog(QEMUD_ERR, _("cannot list SASL mechanisms %d (%s)"), err, sasl_errdetail(client->saslconn)); - remoteDispatchAuthError(rerr); sasl_dispose(&client->saslconn); client->saslconn = NULL; - return -1; + goto authfail; } REMOTE_DEBUG("Available mechanisms for client: '%s'", mechlist); ret->mechlist = strdup(mechlist); if (!ret->mechlist) { qemudLog(QEMUD_ERR, "%s", _("cannot allocate mechlist")); - remoteDispatchAuthError(rerr); sasl_dispose(&client->saslconn); client->saslconn = NULL; - return -1; + goto authfail; } + pthread_mutex_unlock(&client->lock); return 0; + +authfail: + remoteDispatchAuthError(rerr); +error: + pthread_mutex_unlock(&client->lock); + return -1; } @@ -2613,6 +2658,7 @@ static int static int remoteDispatchAuthSaslStart (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, remote_auth_sasl_start_args *args, remote_auth_sasl_start_ret *ret) @@ -2621,12 +2667,15 @@ remoteDispatchAuthSaslStart (struct qemu unsigned int serveroutlen; int err; + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); + REMOTE_DEBUG("Start SASL auth %d", client->fd); if (client->auth != REMOTE_AUTH_SASL || client->saslconn == NULL) { qemudLog(QEMUD_ERR, "%s", _("client tried invalid SASL start request")); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } REMOTE_DEBUG("Using SASL mechanism %s. Data %d bytes, nil: %d", @@ -2644,23 +2693,21 @@ remoteDispatchAuthSaslStart (struct qemu err, sasl_errdetail(client->saslconn)); sasl_dispose(&client->saslconn); client->saslconn = NULL; - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } if (serveroutlen > REMOTE_AUTH_SASL_DATA_MAX) { qemudLog(QEMUD_ERR, _("sasl start reply data too long %d"), serveroutlen); sasl_dispose(&client->saslconn); client->saslconn = NULL; - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } /* NB, distinction of NULL vs "" is *critical* in SASL */ if (serverout) { if (VIR_ALLOC_N(ret->data.data_val, serveroutlen) < 0) { remoteDispatchOOMError(rerr); - return -1; + goto error; } memcpy(ret->data.data_val, serverout, serveroutlen); } else { @@ -2674,24 +2721,32 @@ remoteDispatchAuthSaslStart (struct qemu ret->complete = 0; } else { if (remoteSASLCheckSSF(client, rerr) < 0) - return -1; + goto error; /* Check username whitelist ACL */ if (remoteSASLCheckAccess(server, client, rerr) < 0) - return -1; + goto error; REMOTE_DEBUG("Authentication successful %d", client->fd); ret->complete = 1; client->auth = REMOTE_AUTH_NONE; } + pthread_mutex_unlock(&client->lock); return 0; + +authfail: + remoteDispatchAuthError(rerr); +error: + pthread_mutex_unlock(&client->lock); + return -1; } static int remoteDispatchAuthSaslStep (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, remote_auth_sasl_step_args *args, remote_auth_sasl_step_ret *ret) @@ -2700,12 +2755,15 @@ remoteDispatchAuthSaslStep (struct qemud unsigned int serveroutlen; int err; + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); + REMOTE_DEBUG("Step SASL auth %d", client->fd); if (client->auth != REMOTE_AUTH_SASL || client->saslconn == NULL) { qemudLog(QEMUD_ERR, "%s", _("client tried invalid SASL start request")); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } REMOTE_DEBUG("Using SASL Data %d bytes, nil: %d", @@ -2722,8 +2780,7 @@ remoteDispatchAuthSaslStep (struct qemud err, sasl_errdetail(client->saslconn)); sasl_dispose(&client->saslconn); client->saslconn = NULL; - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } if (serveroutlen > REMOTE_AUTH_SASL_DATA_MAX) { @@ -2731,15 +2788,14 @@ remoteDispatchAuthSaslStep (struct qemud serveroutlen); sasl_dispose(&client->saslconn); client->saslconn = NULL; - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } /* NB, distinction of NULL vs "" is *critical* in SASL */ if (serverout) { if (VIR_ALLOC_N(ret->data.data_val, serveroutlen) < 0) { remoteDispatchOOMError(rerr); - return -1; + goto error; } memcpy(ret->data.data_val, serverout, serveroutlen); } else { @@ -2753,25 +2809,33 @@ remoteDispatchAuthSaslStep (struct qemud ret->complete = 0; } else { if (remoteSASLCheckSSF(client, rerr) < 0) - return -1; + goto error; /* Check username whitelist ACL */ if (remoteSASLCheckAccess(server, client, rerr) < 0) - return -1; + goto error; REMOTE_DEBUG("Authentication successful %d", client->fd); ret->complete = 1; client->auth = REMOTE_AUTH_NONE; } + pthread_mutex_unlock(&client->lock); return 0; + +authfail: + remoteDispatchAuthError(rerr); +error: + pthread_mutex_unlock(&client->lock); + return -1; } #else /* HAVE_SASL */ static int remoteDispatchAuthSaslInit (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_auth_sasl_init_ret *ret ATTRIBUTE_UNUSED) @@ -2783,7 +2847,8 @@ remoteDispatchAuthSaslInit (struct qemud static int remoteDispatchAuthSaslStart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, remote_auth_sasl_start_args *args ATTRIBUTE_UNUSED, remote_auth_sasl_start_ret *ret ATTRIBUTE_UNUSED) @@ -2795,7 +2860,8 @@ remoteDispatchAuthSaslStart (struct qemu static int remoteDispatchAuthSaslStep (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, remote_auth_sasl_step_args *args ATTRIBUTE_UNUSED, remote_auth_sasl_step_ret *ret ATTRIBUTE_UNUSED) @@ -2809,8 +2875,9 @@ remoteDispatchAuthSaslStep (struct qemud #if HAVE_POLKIT static int -remoteDispatchAuthPolkit (struct qemud_server *server ATTRIBUTE_UNUSED, +remoteDispatchAuthPolkit (struct qemud_server *server, struct qemud_client *client, + virConnectPtr conn ATTRIBUTE_UNUSED, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_auth_polkit_ret *ret) @@ -2823,7 +2890,13 @@ remoteDispatchAuthPolkit (struct qemud_s PolKitError *pkerr = NULL; PolKitResult pkresult; DBusError err; - const char *action = client->readonly ? + const char *action; + + pthread_mutex_lock(&server->lock); + pthread_mutex_lock(&client->lock); + pthread_mutex_unlock(&server->lock); + + action = client->readonly ? "org.libvirt.unix.monitor" : "org.libvirt.unix.manage"; @@ -2831,14 +2904,12 @@ remoteDispatchAuthPolkit (struct qemud_s if (client->auth != REMOTE_AUTH_POLKIT) { qemudLog(QEMUD_ERR, "%s", _("client tried invalid PolicyKit init request")); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } if (qemudGetSocketIdentity(client->fd, &callerUid, &callerPid) < 0) { qemudLog(QEMUD_ERR, "%s", _("cannot get peer socket identity")); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } qemudLog(QEMUD_INFO, _("Checking PID %d running as %d"), @@ -2849,16 +2920,14 @@ remoteDispatchAuthPolkit (struct qemud_s qemudLog(QEMUD_ERR, _("Failed to lookup policy kit caller: %s"), err.message); dbus_error_free(&err); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } if (!(pkaction = polkit_action_new())) { qemudLog(QEMUD_ERR, _("Failed to create polkit action %s\n"), strerror(errno)); polkit_caller_unref(pkcaller); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } polkit_action_set_action_id(pkaction, action); @@ -2872,8 +2941,7 @@ remoteDispatchAuthPolkit (struct qemud_s polkit_caller_unref(pkcaller); polkit_action_unref(pkaction); dbus_error_free(&err); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } #if HAVE_POLKIT_CONTEXT_IS_CALLER_AUTHORIZED @@ -2887,8 +2955,7 @@ remoteDispatchAuthPolkit (struct qemud_s _("Policy kit failed to check authorization %d %s"), polkit_error_get_error_code(pkerr), polkit_error_get_error_message(pkerr)); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } #else pkresult = polkit_context_can_caller_do_action(pkcontext, @@ -2904,8 +2971,7 @@ remoteDispatchAuthPolkit (struct qemud_s " result: %s\n"), action, callerPid, callerUid, polkit_result_to_string_representation(pkresult)); - remoteDispatchAuthError(rerr); - return -1; + goto authfail; } qemudLog(QEMUD_INFO, _("Policy allowed action %s from pid %d, uid %d, result %s"), @@ -2914,14 +2980,21 @@ remoteDispatchAuthPolkit (struct qemud_s ret->complete = 1; client->auth = REMOTE_AUTH_NONE; + pthread_mutex_unlock(&client->lock); return 0; + +authfail: + remoteDispatchAuthError(rerr); + pthread_mutex_unlock(&client->lock); + return -1; } #else /* HAVE_POLKIT */ static int remoteDispatchAuthPolkit (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_auth_polkit_ret *ret ATTRIBUTE_UNUSED) @@ -2941,12 +3014,12 @@ remoteDispatchAuthPolkit (struct qemud_s static int remoteDispatchListDefinedStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_list_defined_storage_pools_args *args, remote_list_defined_storage_pools_ret *ret) { - CHECK_CONN(client); if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -2961,11 +3034,11 @@ remoteDispatchListDefinedStoragePools (s } ret->names.names_len = - virConnectListDefinedStoragePools (client->conn, + virConnectListDefinedStoragePools (conn, ret->names.names_val, args->maxnames); if (ret->names.names_len == -1) { VIR_FREE(ret->names.names_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -2974,12 +3047,12 @@ remoteDispatchListDefinedStoragePools (s static int remoteDispatchListStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_list_storage_pools_args *args, remote_list_storage_pools_ret *ret) { - CHECK_CONN(client); if (args->maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -2994,11 +3067,11 @@ remoteDispatchListStoragePools (struct q } ret->names.names_len = - virConnectListStoragePools (client->conn, + virConnectListStoragePools (conn, ret->names.names_val, args->maxnames); if (ret->names.names_len == -1) { VIR_FREE(ret->names.names_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3007,20 +3080,19 @@ remoteDispatchListStoragePools (struct q static int remoteDispatchFindStoragePoolSources (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_find_storage_pool_sources_args *args, remote_find_storage_pool_sources_ret *ret) { - CHECK_CONN(client); - ret->xml = - virConnectFindStoragePoolSources (client->conn, + virConnectFindStoragePoolSources (conn, args->type, args->srcSpec ? *args->srcSpec : NULL, args->flags); if (ret->xml == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3030,23 +3102,23 @@ remoteDispatchFindStoragePoolSources (st static int remoteDispatchStoragePoolCreate (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_create_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolCreate (pool, args->flags) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3055,17 +3127,17 @@ remoteDispatchStoragePoolCreate (struct static int remoteDispatchStoragePoolCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_create_xml_args *args, remote_storage_pool_create_xml_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = virStoragePoolCreateXML (client->conn, args->xml, args->flags); + pool = virStoragePoolCreateXML (conn, args->xml, args->flags); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3076,17 +3148,17 @@ remoteDispatchStoragePoolCreateXml (stru static int remoteDispatchStoragePoolDefineXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_define_xml_args *args, remote_storage_pool_define_xml_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = virStoragePoolDefineXML (client->conn, args->xml, args->flags); + pool = virStoragePoolDefineXML (conn, args->xml, args->flags); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3097,23 +3169,23 @@ remoteDispatchStoragePoolDefineXml (stru static int remoteDispatchStoragePoolBuild (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_build_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolBuild (pool, args->flags) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3123,23 +3195,23 @@ remoteDispatchStoragePoolBuild (struct q static int remoteDispatchStoragePoolDestroy (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_destroy_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolDestroy (pool) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3148,23 +3220,23 @@ remoteDispatchStoragePoolDestroy (struct static int remoteDispatchStoragePoolDelete (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_delete_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolDelete (pool, args->flags) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3173,23 +3245,23 @@ remoteDispatchStoragePoolDelete (struct static int remoteDispatchStoragePoolRefresh (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_refresh_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolRefresh (pool, args->flags) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3198,24 +3270,24 @@ remoteDispatchStoragePoolRefresh (struct static int remoteDispatchStoragePoolGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_get_info_args *args, remote_storage_pool_get_info_ret *ret) { virStoragePoolPtr pool; virStoragePoolInfo info; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolGetInfo (pool, &info) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3231,17 +3303,17 @@ remoteDispatchStoragePoolGetInfo (struct static int remoteDispatchStoragePoolDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_dump_xml_args *args, remote_storage_pool_dump_xml_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3249,7 +3321,7 @@ remoteDispatchStoragePoolDumpXml (struct ret->xml = virStoragePoolGetXMLDesc (pool, args->flags); if (!ret->xml) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3258,23 +3330,23 @@ remoteDispatchStoragePoolDumpXml (struct static int remoteDispatchStoragePoolGetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_get_autostart_args *args, remote_storage_pool_get_autostart_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolGetAutostart (pool, &ret->autostart) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3284,17 +3356,17 @@ remoteDispatchStoragePoolGetAutostart (s static int remoteDispatchStoragePoolLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_lookup_by_name_args *args, remote_storage_pool_lookup_by_name_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = virStoragePoolLookupByName (client->conn, args->name); + pool = virStoragePoolLookupByName (conn, args->name); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3305,17 +3377,17 @@ remoteDispatchStoragePoolLookupByName (s static int remoteDispatchStoragePoolLookupByUuid (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_lookup_by_uuid_args *args, remote_storage_pool_lookup_by_uuid_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = virStoragePoolLookupByUUID (client->conn, (unsigned char *) args->uuid); + pool = virStoragePoolLookupByUUID (conn, (unsigned char *) args->uuid); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3326,25 +3398,25 @@ remoteDispatchStoragePoolLookupByUuid (s static int remoteDispatchStoragePoolLookupByVolume (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_lookup_by_volume_args *args, remote_storage_pool_lookup_by_volume_ret *ret) { virStoragePoolPtr pool; virStorageVolPtr vol; - CHECK_CONN(client); - vol = get_nonnull_storage_vol (client->conn, args->vol); + vol = get_nonnull_storage_vol (conn, args->vol); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } pool = virStoragePoolLookupByVolume (vol); virStorageVolFree(vol); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3355,23 +3427,23 @@ remoteDispatchStoragePoolLookupByVolume static int remoteDispatchStoragePoolSetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_set_autostart_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolSetAutostart (pool, args->autostart) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3380,23 +3452,23 @@ remoteDispatchStoragePoolSetAutostart (s static int remoteDispatchStoragePoolUndefine (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_undefine_args *args, void *ret ATTRIBUTE_UNUSED) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStoragePoolUndefine (pool) == -1) { virStoragePoolFree(pool); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStoragePoolFree(pool); @@ -3405,16 +3477,16 @@ remoteDispatchStoragePoolUndefine (struc static int remoteDispatchNumOfStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_num_of_storage_pools_ret *ret) { - CHECK_CONN(client); - ret->num = virConnectNumOfStoragePools (client->conn); + ret->num = virConnectNumOfStoragePools (conn); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3423,16 +3495,16 @@ remoteDispatchNumOfStoragePools (struct static int remoteDispatchNumOfDefinedStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, void *args ATTRIBUTE_UNUSED, remote_num_of_defined_storage_pools_ret *ret) { - CHECK_CONN(client); - ret->num = virConnectNumOfDefinedStoragePools (client->conn); + ret->num = virConnectNumOfDefinedStoragePools (conn); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3441,13 +3513,13 @@ remoteDispatchNumOfDefinedStoragePools ( static int remoteDispatchStoragePoolListVolumes (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_list_volumes_args *args, remote_storage_pool_list_volumes_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); if (args->maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) { remoteDispatchFormatError (rerr, @@ -3455,9 +3527,9 @@ remoteDispatchStoragePoolListVolumes (st return -1; } - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3474,7 +3546,7 @@ remoteDispatchStoragePoolListVolumes (st virStoragePoolFree(pool); if (ret->names.names_len == -1) { VIR_FREE(ret->names.names_val); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3484,24 +3556,24 @@ remoteDispatchStoragePoolListVolumes (st static int remoteDispatchStoragePoolNumOfVolumes (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_pool_num_of_volumes_args *args, remote_storage_pool_num_of_volumes_ret *ret) { virStoragePoolPtr pool; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } ret->num = virStoragePoolNumOfVolumes (pool); virStoragePoolFree(pool); if (ret->num == -1) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3517,25 +3589,25 @@ remoteDispatchStoragePoolNumOfVolumes (s static int remoteDispatchStorageVolCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_create_xml_args *args, remote_storage_vol_create_xml_ret *ret) { virStoragePoolPtr pool; virStorageVolPtr vol; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } vol = virStorageVolCreateXML (pool, args->xml, args->flags); virStoragePoolFree(pool); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3547,23 +3619,23 @@ remoteDispatchStorageVolCreateXml (struc static int remoteDispatchStorageVolDelete (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_delete_args *args, void *ret ATTRIBUTE_UNUSED) { virStorageVolPtr vol; - CHECK_CONN(client); - vol = get_nonnull_storage_vol (client->conn, args->vol); + vol = get_nonnull_storage_vol (conn, args->vol); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStorageVolDelete (vol, args->flags) == -1) { virStorageVolFree(vol); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStorageVolFree(vol); @@ -3572,24 +3644,24 @@ remoteDispatchStorageVolDelete (struct q static int remoteDispatchStorageVolGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_get_info_args *args, remote_storage_vol_get_info_ret *ret) { virStorageVolPtr vol; virStorageVolInfo info; - CHECK_CONN(client); - vol = get_nonnull_storage_vol (client->conn, args->vol); + vol = get_nonnull_storage_vol (conn, args->vol); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } if (virStorageVolGetInfo (vol, &info) == -1) { virStorageVolFree(vol); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3604,17 +3676,17 @@ remoteDispatchStorageVolGetInfo (struct static int remoteDispatchStorageVolDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_dump_xml_args *args, remote_storage_vol_dump_xml_ret *ret) { virStorageVolPtr vol; - CHECK_CONN(client); - vol = get_nonnull_storage_vol (client->conn, args->vol); + vol = get_nonnull_storage_vol (conn, args->vol); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3622,7 +3694,7 @@ remoteDispatchStorageVolDumpXml (struct ret->xml = virStorageVolGetXMLDesc (vol, args->flags); if (!ret->xml) { virStorageVolFree(vol); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStorageVolFree(vol); @@ -3632,17 +3704,17 @@ remoteDispatchStorageVolDumpXml (struct static int remoteDispatchStorageVolGetPath (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_get_path_args *args, remote_storage_vol_get_path_ret *ret) { virStorageVolPtr vol; - CHECK_CONN(client); - vol = get_nonnull_storage_vol (client->conn, args->vol); + vol = get_nonnull_storage_vol (conn, args->vol); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3650,7 +3722,7 @@ remoteDispatchStorageVolGetPath (struct ret->name = virStorageVolGetPath (vol); if (!ret->name) { virStorageVolFree(vol); - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } virStorageVolFree(vol); @@ -3660,25 +3732,25 @@ remoteDispatchStorageVolGetPath (struct static int remoteDispatchStorageVolLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_lookup_by_name_args *args, remote_storage_vol_lookup_by_name_ret *ret) { virStoragePoolPtr pool; virStorageVolPtr vol; - CHECK_CONN(client); - pool = get_nonnull_storage_pool (client->conn, args->pool); + pool = get_nonnull_storage_pool (conn, args->pool); if (pool == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } vol = virStorageVolLookupByName (pool, args->name); virStoragePoolFree(pool); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3689,17 +3761,17 @@ remoteDispatchStorageVolLookupByName (st static int remoteDispatchStorageVolLookupByKey (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_lookup_by_key_args *args, remote_storage_vol_lookup_by_key_ret *ret) { virStorageVolPtr vol; - CHECK_CONN(client); - vol = virStorageVolLookupByKey (client->conn, args->key); + vol = virStorageVolLookupByKey (conn, args->key); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } @@ -3711,17 +3783,17 @@ remoteDispatchStorageVolLookupByKey (str static int remoteDispatchStorageVolLookupByPath (struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, remote_error *rerr, remote_storage_vol_lookup_by_path_args *args, remote_storage_vol_lookup_by_path_ret *ret) { virStorageVolPtr vol; - CHECK_CONN(client); - vol = virStorageVolLookupByPath (client->conn, args->path); + vol = virStorageVolLookupByPath (conn, args->path); if (vol == NULL) { - remoteDispatchConnError(rerr, client->conn); + remoteDispatchConnError(rerr, conn); return -1; } diff --git a/qemud/remote_dispatch_prototypes.h b/qemud/remote_dispatch_prototypes.h --- a/qemud/remote_dispatch_prototypes.h +++ b/qemud/remote_dispatch_prototypes.h @@ -2,107 +2,731 @@ * Do not edit this file. Any changes you make will be lost. */ -static int remoteDispatchAuthList (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_auth_list_ret *ret); -static int remoteDispatchAuthPolkit (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_auth_polkit_ret *ret); -static int remoteDispatchAuthSaslInit (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_auth_sasl_init_ret *ret); -static int remoteDispatchAuthSaslStart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_auth_sasl_start_args *args, remote_auth_sasl_start_ret *ret); -static int remoteDispatchAuthSaslStep (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_auth_sasl_step_args *args, remote_auth_sasl_step_ret *ret); -static int remoteDispatchClose (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, void *ret); -static int remoteDispatchDomainAttachDevice (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_attach_device_args *args, void *ret); -static int remoteDispatchDomainBlockPeek (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_block_peek_args *args, remote_domain_block_peek_ret *ret); -static int remoteDispatchDomainBlockStats (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_block_stats_args *args, remote_domain_block_stats_ret *ret); -static int remoteDispatchDomainCoreDump (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_core_dump_args *args, void *ret); -static int remoteDispatchDomainCreate (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_create_args *args, void *ret); -static int remoteDispatchDomainCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_create_xml_args *args, remote_domain_create_xml_ret *ret); -static int remoteDispatchDomainDefineXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_define_xml_args *args, remote_domain_define_xml_ret *ret); -static int remoteDispatchDomainDestroy (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_destroy_args *args, void *ret); -static int remoteDispatchDomainDetachDevice (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_detach_device_args *args, void *ret); -static int remoteDispatchDomainDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_dump_xml_args *args, remote_domain_dump_xml_ret *ret); -static int remoteDispatchDomainGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_autostart_args *args, remote_domain_get_autostart_ret *ret); -static int remoteDispatchDomainGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_info_args *args, remote_domain_get_info_ret *ret); -static int remoteDispatchDomainGetMaxMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_max_memory_args *args, remote_domain_get_max_memory_ret *ret); -static int remoteDispatchDomainGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_max_vcpus_args *args, remote_domain_get_max_vcpus_ret *ret); -static int remoteDispatchDomainGetOsType (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_os_type_args *args, remote_domain_get_os_type_ret *ret); -static int remoteDispatchDomainGetSchedulerParameters (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_scheduler_parameters_args *args, remote_domain_get_scheduler_parameters_ret *ret); -static int remoteDispatchDomainGetSchedulerType (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_scheduler_type_args *args, remote_domain_get_scheduler_type_ret *ret); -static int remoteDispatchDomainGetVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_vcpus_args *args, remote_domain_get_vcpus_ret *ret); -static int remoteDispatchDomainInterfaceStats (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_interface_stats_args *args, remote_domain_interface_stats_ret *ret); -static int remoteDispatchDomainLookupById (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_lookup_by_id_args *args, remote_domain_lookup_by_id_ret *ret); -static int remoteDispatchDomainLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_lookup_by_name_args *args, remote_domain_lookup_by_name_ret *ret); -static int remoteDispatchDomainLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_lookup_by_uuid_args *args, remote_domain_lookup_by_uuid_ret *ret); -static int remoteDispatchDomainMemoryPeek (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_memory_peek_args *args, remote_domain_memory_peek_ret *ret); -static int remoteDispatchDomainMigrateFinish (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_migrate_finish_args *args, remote_domain_migrate_finish_ret *ret); -static int remoteDispatchDomainMigratePerform (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_migrate_perform_args *args, void *ret); -static int remoteDispatchDomainMigratePrepare (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_migrate_prepare_args *args, remote_domain_migrate_prepare_ret *ret); -static int remoteDispatchDomainPinVcpu (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_pin_vcpu_args *args, void *ret); -static int remoteDispatchDomainReboot (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_reboot_args *args, void *ret); -static int remoteDispatchDomainRestore (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_restore_args *args, void *ret); -static int remoteDispatchDomainResume (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_resume_args *args, void *ret); -static int remoteDispatchDomainSave (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_save_args *args, void *ret); -static int remoteDispatchDomainSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_autostart_args *args, void *ret); -static int remoteDispatchDomainSetMaxMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_max_memory_args *args, void *ret); -static int remoteDispatchDomainSetMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_memory_args *args, void *ret); -static int remoteDispatchDomainSetSchedulerParameters (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_scheduler_parameters_args *args, void *ret); -static int remoteDispatchDomainSetVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_vcpus_args *args, void *ret); -static int remoteDispatchDomainShutdown (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_shutdown_args *args, void *ret); -static int remoteDispatchDomainSuspend (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_suspend_args *args, void *ret); -static int remoteDispatchDomainUndefine (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_undefine_args *args, void *ret); -static int remoteDispatchFindStoragePoolSources (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_find_storage_pool_sources_args *args, remote_find_storage_pool_sources_ret *ret); -static int remoteDispatchGetCapabilities (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_capabilities_ret *ret); -static int remoteDispatchGetHostname (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_hostname_ret *ret); -static int remoteDispatchGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_get_max_vcpus_args *args, remote_get_max_vcpus_ret *ret); -static int remoteDispatchGetType (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_type_ret *ret); -static int remoteDispatchGetVersion (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_version_ret *ret); -static int remoteDispatchListDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_defined_domains_args *args, remote_list_defined_domains_ret *ret); -static int remoteDispatchListDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_defined_networks_args *args, remote_list_defined_networks_ret *ret); -static int remoteDispatchListDefinedStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_defined_storage_pools_args *args, remote_list_defined_storage_pools_ret *ret); -static int remoteDispatchListDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_domains_args *args, remote_list_domains_ret *ret); -static int remoteDispatchListNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_networks_args *args, remote_list_networks_ret *ret); -static int remoteDispatchListStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_storage_pools_args *args, remote_list_storage_pools_ret *ret); -static int remoteDispatchNetworkCreate (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_create_args *args, void *ret); -static int remoteDispatchNetworkCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_create_xml_args *args, remote_network_create_xml_ret *ret); -static int remoteDispatchNetworkDefineXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_define_xml_args *args, remote_network_define_xml_ret *ret); -static int remoteDispatchNetworkDestroy (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_destroy_args *args, void *ret); -static int remoteDispatchNetworkDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_dump_xml_args *args, remote_network_dump_xml_ret *ret); -static int remoteDispatchNetworkGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_get_autostart_args *args, remote_network_get_autostart_ret *ret); -static int remoteDispatchNetworkGetBridgeName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_get_bridge_name_args *args, remote_network_get_bridge_name_ret *ret); -static int remoteDispatchNetworkLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_lookup_by_name_args *args, remote_network_lookup_by_name_ret *ret); -static int remoteDispatchNetworkLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_lookup_by_uuid_args *args, remote_network_lookup_by_uuid_ret *ret); -static int remoteDispatchNetworkSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_set_autostart_args *args, void *ret); -static int remoteDispatchNetworkUndefine (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_undefine_args *args, void *ret); -static int remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_node_get_cells_free_memory_args *args, remote_node_get_cells_free_memory_ret *ret); -static int remoteDispatchNodeGetFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_node_get_free_memory_ret *ret); -static int remoteDispatchNodeGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_node_get_info_ret *ret); -static int remoteDispatchNumOfDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_defined_domains_ret *ret); -static int remoteDispatchNumOfDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_defined_networks_ret *ret); -static int remoteDispatchNumOfDefinedStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_defined_storage_pools_ret *ret); -static int remoteDispatchNumOfDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_domains_ret *ret); -static int remoteDispatchNumOfNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_networks_ret *ret); -static int remoteDispatchNumOfStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_storage_pools_ret *ret); -static int remoteDispatchOpen (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_open_args *args, void *ret); -static int remoteDispatchStoragePoolBuild (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_build_args *args, void *ret); -static int remoteDispatchStoragePoolCreate (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_create_args *args, void *ret); -static int remoteDispatchStoragePoolCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_create_xml_args *args, remote_storage_pool_create_xml_ret *ret); -static int remoteDispatchStoragePoolDefineXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_define_xml_args *args, remote_storage_pool_define_xml_ret *ret); -static int remoteDispatchStoragePoolDelete (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_delete_args *args, void *ret); -static int remoteDispatchStoragePoolDestroy (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_destroy_args *args, void *ret); -static int remoteDispatchStoragePoolDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_dump_xml_args *args, remote_storage_pool_dump_xml_ret *ret); -static int remoteDispatchStoragePoolGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_get_autostart_args *args, remote_storage_pool_get_autostart_ret *ret); -static int remoteDispatchStoragePoolGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_get_info_args *args, remote_storage_pool_get_info_ret *ret); -static int remoteDispatchStoragePoolListVolumes (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_list_volumes_args *args, remote_storage_pool_list_volumes_ret *ret); -static int remoteDispatchStoragePoolLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_lookup_by_name_args *args, remote_storage_pool_lookup_by_name_ret *ret); -static int remoteDispatchStoragePoolLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_lookup_by_uuid_args *args, remote_storage_pool_lookup_by_uuid_ret *ret); -static int remoteDispatchStoragePoolLookupByVolume (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_lookup_by_volume_args *args, remote_storage_pool_lookup_by_volume_ret *ret); -static int remoteDispatchStoragePoolNumOfVolumes (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_num_of_volumes_args *args, remote_storage_pool_num_of_volumes_ret *ret); -static int remoteDispatchStoragePoolRefresh (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_refresh_args *args, void *ret); -static int remoteDispatchStoragePoolSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_set_autostart_args *args, void *ret); -static int remoteDispatchStoragePoolUndefine (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_undefine_args *args, void *ret); -static int remoteDispatchStorageVolCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_create_xml_args *args, remote_storage_vol_create_xml_ret *ret); -static int remoteDispatchStorageVolDelete (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_delete_args *args, void *ret); -static int remoteDispatchStorageVolDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_dump_xml_args *args, remote_storage_vol_dump_xml_ret *ret); -static int remoteDispatchStorageVolGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_get_info_args *args, remote_storage_vol_get_info_ret *ret); -static int remoteDispatchStorageVolGetPath (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_get_path_args *args, remote_storage_vol_get_path_ret *ret); -static int remoteDispatchStorageVolLookupByKey (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_lookup_by_key_args *args, remote_storage_vol_lookup_by_key_ret *ret); -static int remoteDispatchStorageVolLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_lookup_by_name_args *args, remote_storage_vol_lookup_by_name_ret *ret); -static int remoteDispatchStorageVolLookupByPath (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_lookup_by_path_args *args, remote_storage_vol_lookup_by_path_ret *ret); -static int remoteDispatchSupportsFeature (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_supports_feature_args *args, remote_supports_feature_ret *ret); +static int remoteDispatchAuthList( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_auth_list_ret *ret); +static int remoteDispatchAuthPolkit( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_auth_polkit_ret *ret); +static int remoteDispatchAuthSaslInit( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_auth_sasl_init_ret *ret); +static int remoteDispatchAuthSaslStart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_auth_sasl_start_args *args, + remote_auth_sasl_start_ret *ret); +static int remoteDispatchAuthSaslStep( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_auth_sasl_step_args *args, + remote_auth_sasl_step_ret *ret); +static int remoteDispatchClose( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + void *ret); +static int remoteDispatchDomainAttachDevice( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_attach_device_args *args, + void *ret); +static int remoteDispatchDomainBlockPeek( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_block_peek_args *args, + remote_domain_block_peek_ret *ret); +static int remoteDispatchDomainBlockStats( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_block_stats_args *args, + remote_domain_block_stats_ret *ret); +static int remoteDispatchDomainCoreDump( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_core_dump_args *args, + void *ret); +static int remoteDispatchDomainCreate( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_create_args *args, + void *ret); +static int remoteDispatchDomainCreateXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_create_xml_args *args, + remote_domain_create_xml_ret *ret); +static int remoteDispatchDomainDefineXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_define_xml_args *args, + remote_domain_define_xml_ret *ret); +static int remoteDispatchDomainDestroy( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_destroy_args *args, + void *ret); +static int remoteDispatchDomainDetachDevice( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_detach_device_args *args, + void *ret); +static int remoteDispatchDomainDumpXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_dump_xml_args *args, + remote_domain_dump_xml_ret *ret); +static int remoteDispatchDomainGetAutostart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_autostart_args *args, + remote_domain_get_autostart_ret *ret); +static int remoteDispatchDomainGetInfo( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_info_args *args, + remote_domain_get_info_ret *ret); +static int remoteDispatchDomainGetMaxMemory( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_max_memory_args *args, + remote_domain_get_max_memory_ret *ret); +static int remoteDispatchDomainGetMaxVcpus( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_max_vcpus_args *args, + remote_domain_get_max_vcpus_ret *ret); +static int remoteDispatchDomainGetOsType( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_os_type_args *args, + remote_domain_get_os_type_ret *ret); +static int remoteDispatchDomainGetSchedulerParameters( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_scheduler_parameters_args *args, + remote_domain_get_scheduler_parameters_ret *ret); +static int remoteDispatchDomainGetSchedulerType( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_scheduler_type_args *args, + remote_domain_get_scheduler_type_ret *ret); +static int remoteDispatchDomainGetVcpus( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_get_vcpus_args *args, + remote_domain_get_vcpus_ret *ret); +static int remoteDispatchDomainInterfaceStats( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_interface_stats_args *args, + remote_domain_interface_stats_ret *ret); +static int remoteDispatchDomainLookupById( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_lookup_by_id_args *args, + remote_domain_lookup_by_id_ret *ret); +static int remoteDispatchDomainLookupByName( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_lookup_by_name_args *args, + remote_domain_lookup_by_name_ret *ret); +static int remoteDispatchDomainLookupByUuid( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_lookup_by_uuid_args *args, + remote_domain_lookup_by_uuid_ret *ret); +static int remoteDispatchDomainMemoryPeek( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_memory_peek_args *args, + remote_domain_memory_peek_ret *ret); +static int remoteDispatchDomainMigrateFinish( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_migrate_finish_args *args, + remote_domain_migrate_finish_ret *ret); +static int remoteDispatchDomainMigratePerform( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_migrate_perform_args *args, + void *ret); +static int remoteDispatchDomainMigratePrepare( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_migrate_prepare_args *args, + remote_domain_migrate_prepare_ret *ret); +static int remoteDispatchDomainPinVcpu( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_pin_vcpu_args *args, + void *ret); +static int remoteDispatchDomainReboot( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_reboot_args *args, + void *ret); +static int remoteDispatchDomainRestore( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_restore_args *args, + void *ret); +static int remoteDispatchDomainResume( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_resume_args *args, + void *ret); +static int remoteDispatchDomainSave( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_save_args *args, + void *ret); +static int remoteDispatchDomainSetAutostart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_set_autostart_args *args, + void *ret); +static int remoteDispatchDomainSetMaxMemory( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_set_max_memory_args *args, + void *ret); +static int remoteDispatchDomainSetMemory( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_set_memory_args *args, + void *ret); +static int remoteDispatchDomainSetSchedulerParameters( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_set_scheduler_parameters_args *args, + void *ret); +static int remoteDispatchDomainSetVcpus( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_set_vcpus_args *args, + void *ret); +static int remoteDispatchDomainShutdown( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_shutdown_args *args, + void *ret); +static int remoteDispatchDomainSuspend( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_suspend_args *args, + void *ret); +static int remoteDispatchDomainUndefine( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_domain_undefine_args *args, + void *ret); +static int remoteDispatchFindStoragePoolSources( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_find_storage_pool_sources_args *args, + remote_find_storage_pool_sources_ret *ret); +static int remoteDispatchGetCapabilities( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_get_capabilities_ret *ret); +static int remoteDispatchGetHostname( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_get_hostname_ret *ret); +static int remoteDispatchGetMaxVcpus( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_get_max_vcpus_args *args, + remote_get_max_vcpus_ret *ret); +static int remoteDispatchGetType( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_get_type_ret *ret); +static int remoteDispatchGetVersion( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_get_version_ret *ret); +static int remoteDispatchListDefinedDomains( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_list_defined_domains_args *args, + remote_list_defined_domains_ret *ret); +static int remoteDispatchListDefinedNetworks( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_list_defined_networks_args *args, + remote_list_defined_networks_ret *ret); +static int remoteDispatchListDefinedStoragePools( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_list_defined_storage_pools_args *args, + remote_list_defined_storage_pools_ret *ret); +static int remoteDispatchListDomains( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_list_domains_args *args, + remote_list_domains_ret *ret); +static int remoteDispatchListNetworks( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_list_networks_args *args, + remote_list_networks_ret *ret); +static int remoteDispatchListStoragePools( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_list_storage_pools_args *args, + remote_list_storage_pools_ret *ret); +static int remoteDispatchNetworkCreate( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_create_args *args, + void *ret); +static int remoteDispatchNetworkCreateXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_create_xml_args *args, + remote_network_create_xml_ret *ret); +static int remoteDispatchNetworkDefineXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_define_xml_args *args, + remote_network_define_xml_ret *ret); +static int remoteDispatchNetworkDestroy( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_destroy_args *args, + void *ret); +static int remoteDispatchNetworkDumpXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_dump_xml_args *args, + remote_network_dump_xml_ret *ret); +static int remoteDispatchNetworkGetAutostart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_get_autostart_args *args, + remote_network_get_autostart_ret *ret); +static int remoteDispatchNetworkGetBridgeName( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_get_bridge_name_args *args, + remote_network_get_bridge_name_ret *ret); +static int remoteDispatchNetworkLookupByName( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_lookup_by_name_args *args, + remote_network_lookup_by_name_ret *ret); +static int remoteDispatchNetworkLookupByUuid( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_lookup_by_uuid_args *args, + remote_network_lookup_by_uuid_ret *ret); +static int remoteDispatchNetworkSetAutostart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_set_autostart_args *args, + void *ret); +static int remoteDispatchNetworkUndefine( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_network_undefine_args *args, + void *ret); +static int remoteDispatchNodeGetCellsFreeMemory( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_node_get_cells_free_memory_args *args, + remote_node_get_cells_free_memory_ret *ret); +static int remoteDispatchNodeGetFreeMemory( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_node_get_free_memory_ret *ret); +static int remoteDispatchNodeGetInfo( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_node_get_info_ret *ret); +static int remoteDispatchNumOfDefinedDomains( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_num_of_defined_domains_ret *ret); +static int remoteDispatchNumOfDefinedNetworks( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_num_of_defined_networks_ret *ret); +static int remoteDispatchNumOfDefinedStoragePools( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_num_of_defined_storage_pools_ret *ret); +static int remoteDispatchNumOfDomains( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_num_of_domains_ret *ret); +static int remoteDispatchNumOfNetworks( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_num_of_networks_ret *ret); +static int remoteDispatchNumOfStoragePools( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + void *args, + remote_num_of_storage_pools_ret *ret); +static int remoteDispatchOpen( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_open_args *args, + void *ret); +static int remoteDispatchStoragePoolBuild( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_build_args *args, + void *ret); +static int remoteDispatchStoragePoolCreate( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_create_args *args, + void *ret); +static int remoteDispatchStoragePoolCreateXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_create_xml_args *args, + remote_storage_pool_create_xml_ret *ret); +static int remoteDispatchStoragePoolDefineXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_define_xml_args *args, + remote_storage_pool_define_xml_ret *ret); +static int remoteDispatchStoragePoolDelete( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_delete_args *args, + void *ret); +static int remoteDispatchStoragePoolDestroy( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_destroy_args *args, + void *ret); +static int remoteDispatchStoragePoolDumpXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_dump_xml_args *args, + remote_storage_pool_dump_xml_ret *ret); +static int remoteDispatchStoragePoolGetAutostart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_get_autostart_args *args, + remote_storage_pool_get_autostart_ret *ret); +static int remoteDispatchStoragePoolGetInfo( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_get_info_args *args, + remote_storage_pool_get_info_ret *ret); +static int remoteDispatchStoragePoolListVolumes( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_list_volumes_args *args, + remote_storage_pool_list_volumes_ret *ret); +static int remoteDispatchStoragePoolLookupByName( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_lookup_by_name_args *args, + remote_storage_pool_lookup_by_name_ret *ret); +static int remoteDispatchStoragePoolLookupByUuid( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_lookup_by_uuid_args *args, + remote_storage_pool_lookup_by_uuid_ret *ret); +static int remoteDispatchStoragePoolLookupByVolume( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_lookup_by_volume_args *args, + remote_storage_pool_lookup_by_volume_ret *ret); +static int remoteDispatchStoragePoolNumOfVolumes( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_num_of_volumes_args *args, + remote_storage_pool_num_of_volumes_ret *ret); +static int remoteDispatchStoragePoolRefresh( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_refresh_args *args, + void *ret); +static int remoteDispatchStoragePoolSetAutostart( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_set_autostart_args *args, + void *ret); +static int remoteDispatchStoragePoolUndefine( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_pool_undefine_args *args, + void *ret); +static int remoteDispatchStorageVolCreateXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_create_xml_args *args, + remote_storage_vol_create_xml_ret *ret); +static int remoteDispatchStorageVolDelete( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_delete_args *args, + void *ret); +static int remoteDispatchStorageVolDumpXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_dump_xml_args *args, + remote_storage_vol_dump_xml_ret *ret); +static int remoteDispatchStorageVolGetInfo( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_get_info_args *args, + remote_storage_vol_get_info_ret *ret); +static int remoteDispatchStorageVolGetPath( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_get_path_args *args, + remote_storage_vol_get_path_ret *ret); +static int remoteDispatchStorageVolLookupByKey( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_lookup_by_key_args *args, + remote_storage_vol_lookup_by_key_ret *ret); +static int remoteDispatchStorageVolLookupByName( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_lookup_by_name_args *args, + remote_storage_vol_lookup_by_name_ret *ret); +static int remoteDispatchStorageVolLookupByPath( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_storage_vol_lookup_by_path_args *args, + remote_storage_vol_lookup_by_path_ret *ret); +static int remoteDispatchSupportsFeature( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_supports_feature_args *args, + remote_supports_feature_ret *ret); diff --git a/qemud/remote_generate_stubs.pl b/qemud/remote_generate_stubs.pl --- a/qemud/remote_generate_stubs.pl +++ b/qemud/remote_generate_stubs.pl @@ -100,7 +100,13 @@ elsif ($opt_p) { elsif ($opt_p) { my @keys = sort (keys %calls); foreach (@keys) { - print "static int remoteDispatch$calls{$_}->{ProcName} (struct qemud_server *server, struct qemud_client *client, remote_error *err, $calls{$_}->{args} *args, $calls{$_}->{ret} *ret);\n"; + print "static int remoteDispatch$calls{$_}->{ProcName}(\n"; + print " struct qemud_server *server, \n"; + print " struct qemud_client *client, \n"; + print " virConnectPtr conn, \n"; + print " remote_error *err, \n"; + print " $calls{$_}->{args} *args,\n"; + print " $calls{$_}->{ret} *ret);\n"; } } -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list