summaryrefslogtreecommitdiff
path: root/src/rpc/virnetserverservice.c
diff options
context:
space:
mode:
authorMartin Kletzander <mkletzan@redhat.com>2014-07-15 14:37:14 +0200
committerMartin Kletzander <mkletzan@redhat.com>2014-08-22 09:12:13 +0200
commit9805256d535c5474d8b7dad81c9f22a698dfb6ee (patch)
treefc40581ba3d162567d105c7f19070f9c83f23375 /src/rpc/virnetserverservice.c
parent8989597cd94b0b00602fb62f11f89089b99bed9c (diff)
downloadlibvirt-9805256d535c5474d8b7dad81c9f22a698dfb6ee.tar.gz
remote: create virNetServerServiceNewFDOrUNIX() wrapper
It's just a wrapper around NewFD and NewUNIX that selects the right option and increments the number of used FDs. Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Diffstat (limited to 'src/rpc/virnetserverservice.c')
-rw-r--r--src/rpc/virnetserverservice.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
index 320a02c8f2..e85889b78f 100644
--- a/src/rpc/virnetserverservice.c
+++ b/src/rpc/virnetserverservice.c
@@ -1,7 +1,7 @@
/*
* virnetserverservice.c: generic network RPC server service
*
- * Copyright (C) 2006-2012 Red Hat, Inc.
+ * Copyright (C) 2006-2012, 2014 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -25,6 +25,8 @@
#include "virnetserverservice.h"
+#include <unistd.h>
+
#include "viralloc.h"
#include "virerror.h"
#include "virthread.h"
@@ -90,6 +92,52 @@ static void virNetServerServiceAccept(virNetSocketPtr sock,
}
+virNetServerServicePtr
+virNetServerServiceNewFDOrUNIX(const char *path,
+ mode_t mask,
+ gid_t grp,
+ int auth,
+#if WITH_GNUTLS
+ virNetTLSContextPtr tls,
+#endif
+ bool readonly,
+ size_t max_queued_clients,
+ size_t nrequests_client_max,
+ unsigned int nfds,
+ unsigned int *cur_fd)
+{
+ if (*cur_fd - STDERR_FILENO > nfds) {
+ /*
+ * There are no more file descriptors to use, so we have to
+ * fallback to UNIX socket.
+ */
+ return virNetServerServiceNewUNIX(path,
+ mask,
+ grp,
+ auth,
+#if WITH_GNUTLS
+ tls,
+#endif
+ readonly,
+ max_queued_clients,
+ nrequests_client_max);
+
+ } else {
+ /*
+ * There's still enough file descriptors. In this case we'll
+ * use the current one and increment it afterwards.
+ */
+ return virNetServerServiceNewFD(*cur_fd++,
+ auth,
+#if WITH_GNUTLS
+ tls,
+#endif
+ readonly,
+ nrequests_client_max);
+ }
+}
+
+
virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
const char *service,
int auth,