virNetServerNew;
virNetServerQuit;
virNetServerRun;
-virNetServerServiceNewTCP;
-virNetServerServiceNewUNIX;
virNetServerSetTLSContext;
virNetServerUpdateServices;
# virnetserverservice.h
virNetServerServiceClose;
virNetServerServiceGetAuth;
+virNetServerServiceGetMaxRequests;
virNetServerServiceGetPort;
+virNetServerServiceGetTLSContext;
virNetServerServiceIsReadonly;
virNetServerServiceNewTCP;
virNetServerServiceNewUNIX;
}
-static int virNetServerDispatchNewClient(virNetServerServicePtr svc ATTRIBUTE_UNUSED,
- virNetServerClientPtr client,
+static int virNetServerDispatchNewClient(virNetServerServicePtr svc,
+ virNetSocketPtr clientsock,
void *opaque)
{
virNetServerPtr srv = opaque;
+ virNetServerClientPtr client = NULL;
virNetServerLock(srv);
goto error;
}
+ if (!(client = virNetServerClientNew(clientsock,
+ virNetServerServiceGetAuth(svc),
+ virNetServerServiceIsReadonly(svc),
+ virNetServerServiceGetMaxRequests(svc),
+ virNetServerServiceGetTLSContext(svc))))
+ goto error;
+
if (virNetServerClientInit(client) < 0)
goto error;
return 0;
error:
+ virNetServerClientClose(client);
+ virObjectUnref(client);
virNetServerUnlock(srv);
return -1;
}
return NULL;
}
- client->sock = sock;
+ client->sock = virObjectRef(sock);
client->auth = auth;
client->readonly = readonly;
client->tlsCtxt = virObjectRef(tls);
return client;
error:
- /* XXX ref counting is better than this */
- client->sock = NULL; /* Caller owns 'sock' upon failure */
virObjectUnref(client);
return NULL;
}
void *opaque)
{
virNetServerServicePtr svc = opaque;
- virNetServerClientPtr client = NULL;
virNetSocketPtr clientsock = NULL;
if (virNetSocketAccept(sock, &clientsock) < 0)
- goto error;
+ goto cleanup;
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);
+ goto cleanup;
- virObjectUnref(client);
+ svc->dispatchFunc(svc, clientsock, svc->dispatchOpaque);
cleanup:
- return;
-
-error:
- if (client) {
- virNetServerClientClose(client);
- virObjectUnref(client);
- } else {
- virObjectUnref(clientsock);
- }
+ virObjectUnref(clientsock);
}
}
+size_t virNetServerServiceGetMaxRequests(virNetServerServicePtr svc)
+{
+ return svc->nrequests_client_max;
+}
+
+virNetTLSContextPtr virNetServerServiceGetTLSContext(virNetServerServicePtr svc)
+{
+ return svc->tls;
+}
+
+
void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
virNetServerServiceDispatchFunc func,
void *opaque)
};
typedef int (*virNetServerServiceDispatchFunc)(virNetServerServicePtr svc,
- virNetServerClientPtr client,
+ virNetSocketPtr sock,
void *opaque);
virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
int virNetServerServiceGetAuth(virNetServerServicePtr svc);
bool virNetServerServiceIsReadonly(virNetServerServicePtr svc);
+size_t virNetServerServiceGetMaxRequests(virNetServerServicePtr svc);
+virNetTLSContextPtr virNetServerServiceGetTLSContext(virNetServerServicePtr svc);
void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
virNetServerServiceDispatchFunc func,