static void virNetServerHandleJob(void *jobOpaque, void *opaque) { virNetServerPtr srv = opaque; virNetServerJobPtr job = jobOpaque; VIR_DEBUG("server=%p client=%p message=%p prog=%p", srv, job->client, job->msg, job->prog); if (!job->prog) { /* Only send back an error for type == CALL. Other * message types are not expecting replies, so we * must just log it & drop them */ if (job->msg->header.type == VIR_NET_CALL || job->msg->header.type == VIR_NET_CALL_WITH_FDS) { if (virNetServerProgramUnknownError(job->client, job->msg, &job->msg->header) < 0) goto error; } else { VIR_INFO("Dropping client mesage, unknown program %d version %d type %d proc %d", job->msg->header.prog, job->msg->header.vers, job->msg->header.type, job->msg->header.proc); /* Send a dummy reply to free up 'msg' & unblock client rx */ virNetMessageClear(job->msg); job->msg->header.type = VIR_NET_REPLY; if (virNetServerClientSendMessage(job->client, job->msg) < 0) goto error; } goto cleanup; } if (virNetServerProgramDispatch(job->prog, srv, job->client, job->msg) < 0) goto error; virNetServerLock(srv); virNetServerProgramFree(job->prog); virNetServerUnlock(srv); cleanup: virNetServerClientFree(job->client); VIR_FREE(job); return; error: virNetServerProgramFree(job->prog); virNetMessageFree(job->msg); virNetServerClientClose(job->client); virNetServerClientFree(job->client); VIR_FREE(job); }
static void virNetServerServiceAccept(virNetSocketPtr sock, int events ATTRIBUTE_UNUSED, void *opaque) { virNetServerServicePtr svc = opaque; virNetServerClientPtr client = NULL; virNetSocketPtr clientsock = NULL; if (virNetSocketAccept(sock, &clientsock) < 0) goto error; if (!clientsock) /* Connection already went away */ goto cleanup; if (!(client = virNetServerClientNew(clientsock, svc->auth, svc->readonly, svc->nrequests_client_max, svc->tls))) goto error; if (!svc->dispatchFunc) goto error; if (svc->dispatchFunc(svc, client, svc->dispatchOpaque) < 0) virNetServerClientClose(client); virNetServerClientFree(client); cleanup: return; error: if (client) { virNetServerClientClose(client); virNetServerClientFree(client); } else { virNetSocketFree(clientsock); } }