!!config->keepalive_required,
config->mdns_adv ? config->mdns_name : NULL,
remoteClientInitHook,
+ remoteClientFreeFunc,
NULL))) {
ret = VIR_DAEMON_ERR_INIT;
goto cleanup;
* We keep the libvirt connection open until any async
* jobs have finished, then clean it up elsewhere
*/
-static void remoteClientFreeFunc(void *data)
+void remoteClientFreeFunc(void *data)
{
struct daemonClientPrivate *priv = data;
}
-int remoteClientInitHook(virNetServerPtr srv ATTRIBUTE_UNUSED,
- virNetServerClientPtr client,
- void *opaque ATTRIBUTE_UNUSED)
+void *remoteClientInitHook(virNetServerClientPtr client,
+ void *opaque ATTRIBUTE_UNUSED)
{
struct daemonClientPrivate *priv;
int i;
if (VIR_ALLOC(priv) < 0) {
virReportOOMError();
- return -1;
+ return NULL;
}
if (virMutexInit(&priv->lock) < 0) {
VIR_FREE(priv);
virReportOOMError();
- return -1;
+ return NULL;
}
for (i = 0 ; i < VIR_DOMAIN_EVENT_ID_LAST ; i++)
priv->domainEventCallbackID[i] = -1;
- virNetServerClientSetPrivateData(client, priv,
- remoteClientFreeFunc);
virNetServerClientSetCloseHook(client, remoteClientCloseFunc);
- return 0;
+ return priv;
}
/*----- Functions. -----*/
extern virNetServerProgramProc qemuProcs[];
extern size_t qemuNProcs;
-int remoteClientInitHook(virNetServerPtr srv,
- virNetServerClientPtr client,
- void *opaque);
+void remoteClientFreeFunc(void *data);
+void *remoteClientInitHook(virNetServerClientPtr client,
+ void *opaque);
#endif /* __LIBVIRTD_REMOTE_H__ */
virNetServerClientSetCloseHook;
virNetServerClientSetDispatcher;
virNetServerClientSetIdentity;
-virNetServerClientSetPrivateData;
virNetServerClientStartKeepAlive;
virNetServerClientWantClose;
}
}
-static int virLXCControllerClientHook(virNetServerPtr server ATTRIBUTE_UNUSED,
- virNetServerClientPtr client,
- void *opaque)
+static void virLXCControllerClientPrivateFree(void *data)
+{
+ VIR_FREE(data);
+}
+
+static void *virLXCControllerClientPrivateNew(virNetServerClientPtr client,
+ void *opaque)
{
virLXCControllerPtr ctrl = opaque;
- virNetServerClientSetPrivateData(client, ctrl, NULL);
+ int *dummy;
+
+ if (VIR_ALLOC(dummy) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
virNetServerClientSetCloseHook(client, virLXCControllerClientCloseHook);
VIR_DEBUG("Got new client %p", client);
ctrl->client = client;
- return 0;
+ return dummy;
}
if (!(ctrl->server = virNetServerNew(0, 0, 0, 1,
-1, 0, false,
NULL,
- virLXCControllerClientHook,
+ virLXCControllerClientPrivateNew,
+ virLXCControllerClientPrivateFree,
ctrl)))
goto error;
virNetServerAutoShutdownFunc autoShutdownFunc;
void *autoShutdownOpaque;
- virNetServerClientInitHook clientInitHook;
- void *clientInitOpaque;
+ virNetServerClientPrivNew clientPrivNew;
+ virFreeCallback clientPrivFree;
+ void *clientPrivOpaque;
};
virNetServerServiceGetAuth(svc),
virNetServerServiceIsReadonly(svc),
virNetServerServiceGetMaxRequests(svc),
- virNetServerServiceGetTLSContext(svc))))
+ virNetServerServiceGetTLSContext(svc),
+ srv->clientPrivNew,
+ srv->clientPrivFree,
+ srv->clientPrivOpaque)))
goto error;
if (virNetServerClientInit(client) < 0)
goto error;
- if (srv->clientInitHook &&
- srv->clientInitHook(srv, client, srv->clientInitOpaque) < 0)
- goto error;
-
if (VIR_EXPAND_N(srv->clients, srv->nclients, 1) < 0) {
virReportOOMError();
goto error;
unsigned int keepaliveCount,
bool keepaliveRequired,
const char *mdnsGroupName,
- virNetServerClientInitHook clientInitHook,
- void *opaque)
+ virNetServerClientPrivNew clientPrivNew,
+ virFreeCallback clientPrivFree,
+ void *clientPrivOpaque)
{
virNetServerPtr srv;
struct sigaction sig_action;
srv->keepaliveCount = keepaliveCount;
srv->keepaliveRequired = keepaliveRequired;
srv->sigwrite = srv->sigread = -1;
- srv->clientInitHook = clientInitHook;
- srv->clientInitOpaque = opaque;
+ srv->clientPrivNew = clientPrivNew;
+ srv->clientPrivFree = clientPrivFree;
+ srv->clientPrivOpaque = clientPrivOpaque;
srv->privileged = geteuid() == 0 ? true : false;
if (mdnsGroupName &&
# include "virnetserverservice.h"
# include "virobject.h"
-typedef int (*virNetServerClientInitHook)(virNetServerPtr srv,
- virNetServerClientPtr client,
- void *opaque);
-
virNetServerPtr virNetServerNew(size_t min_workers,
size_t max_workers,
size_t priority_workers,
unsigned int keepaliveCount,
bool keepaliveRequired,
const char *mdnsGroupName,
- virNetServerClientInitHook clientInitHook,
- void *opaque);
+ virNetServerClientPrivNew clientPrivNew,
+ virFreeCallback clientPrivFree,
+ void *clientPrivOpaque);
typedef int (*virNetServerAutoShutdownFunc)(virNetServerPtr srv, void *opaque);
void *dispatchOpaque;
void *privateData;
- virNetServerClientFreeFunc privateDataFreeFunc;
+ virFreeCallback privateDataFreeFunc;
virNetServerClientCloseFunc privateDataCloseFunc;
virKeepAlivePtr keepalive;
int auth,
bool readonly,
size_t nrequests_max,
- virNetTLSContextPtr tls)
+ virNetTLSContextPtr tls,
+ virNetServerClientPrivNew privNew,
+ virFreeCallback privFree,
+ void *privOpaque)
{
virNetServerClientPtr client;
}
client->nrequests = 1;
+ if (privNew) {
+ if (!(client->privateData = privNew(client, privOpaque))) {
+ virObjectUnref(client);
+ goto error;
+ }
+ client->privateDataFreeFunc = privFree;
+ }
+
PROBE(RPC_SERVER_CLIENT_NEW,
"client=%p sock=%p",
client, client->sock);
return identity;
}
-void virNetServerClientSetPrivateData(virNetServerClientPtr client,
- void *opaque,
- virNetServerClientFreeFunc ff)
-{
- virNetServerClientLock(client);
-
- if (client->privateData &&
- client->privateDataFreeFunc)
- client->privateDataFreeFunc(client->privateData);
-
- client->privateData = opaque;
- client->privateDataFreeFunc = ff;
-
- virNetServerClientUnlock(client);
-}
-
void *virNetServerClientGetPrivateData(virNetServerClientPtr client)
{
virNetMessagePtr msg,
void *opaque);
+typedef void *(*virNetServerClientPrivNew)(virNetServerClientPtr client,
+ void *opaque);
+
virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
int auth,
bool readonly,
size_t nrequests_max,
- virNetTLSContextPtr tls);
+ virNetTLSContextPtr tls,
+ virNetServerClientPrivNew privNew,
+ virFreeCallback privFree,
+ void *privOpaque);
int virNetServerClientAddFilter(virNetServerClientPtr client,
virNetServerClientFilterFunc func,
int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client,
uid_t *uid, gid_t *gid, pid_t *pid);
-typedef void (*virNetServerClientFreeFunc)(void *data);
-
-void virNetServerClientSetPrivateData(virNetServerClientPtr client,
- void *opaque,
- virNetServerClientFreeFunc ff);
void *virNetServerClientGetPrivateData(virNetServerClientPtr client);
typedef void (*virNetServerClientCloseFunc)(virNetServerClientPtr client);