]> xenbits.xensource.com Git - libvirt.git/commitdiff
daemon: Unlink unix socket paths on shutdown
authorOsier Yang <jyang@redhat.com>
Thu, 4 Aug 2011 08:54:58 +0000 (16:54 +0800)
committerOsier Yang <jyang@redhat.com>
Thu, 4 Aug 2011 08:54:58 +0000 (16:54 +0800)
This patch introduces a internal RPC API "virNetServerClose", which
is standalone with "virNetServerFree".  it closes all the socket fds,
and unlinks the unix socket paths, regardless of whether the socket
is still referenced or not.

This is to address regression bug:
https://bugzilla.redhat.com/show_bug.cgi?id=725702

daemon/libvirtd.c
src/rpc/virnetserver.c
src/rpc/virnetserver.h
src/rpc/virnetserverservice.c
src/rpc/virnetserverservice.h
src/rpc/virnetsocket.c
src/rpc/virnetsocket.h

index 9e044e2cc905be3bf9a3a88d61c48367fc45c5fe..53f1002b87e2912ebba0b37fd487e784a2d7ce56 100644 (file)
@@ -1558,6 +1558,7 @@ int main(int argc, char **argv) {
 cleanup:
     virNetServerProgramFree(remoteProgram);
     virNetServerProgramFree(qemuProgram);
+    virNetServerClose(srv);
     virNetServerFree(srv);
     if (statuswrite != -1) {
         if (ret != 0) {
index 5e4826bc3e8440ac230aae5c550a8a0863b45371..1a49dbbd8ae34fd55dbb0f2c0e861b105332f478 100644 (file)
@@ -798,3 +798,19 @@ void virNetServerFree(virNetServerPtr srv)
     virMutexDestroy(&srv->lock);
     VIR_FREE(srv);
 }
+
+void virNetServerClose(virNetServerPtr srv)
+{
+    int i;
+
+    if (!srv)
+        return;
+
+    virNetServerLock(srv);
+
+    for (i = 0; i < srv->nservices; i++) {
+        virNetServerServiceClose(srv->services[i]);
+    }
+
+    virNetServerUnlock(srv);
+}
index 810d8a3a96c1c60446076a4b2075b94ad2bb6836..324cfb7186725db16b90e5b8af54eb9e24a42ba9 100644 (file)
@@ -85,5 +85,6 @@ void virNetServerQuit(virNetServerPtr srv);
 
 void virNetServerFree(virNetServerPtr srv);
 
+void virNetServerClose(virNetServerPtr srv);
 
 #endif
index d5648dc81faf7adca9a31a46bb7bf8e66cb8e1cb..8c9ed1eb55f30dc92736a10fe252e91e427c2ec3 100644 (file)
@@ -280,3 +280,15 @@ void virNetServerServiceToggle(virNetServerServicePtr svc,
                                      VIR_EVENT_HANDLE_READABLE :
                                      0);
 }
+
+void virNetServerServiceClose(virNetServerServicePtr svc)
+{
+    int i;
+
+    if (!svc)
+        return;
+
+    for (i = 0; i < svc->nsocks; i++) {
+        virNetSocketClose(svc->socks[i]);
+    }
+}
index 935759821b24d7d3d882c7f48f2c58be5281490a..8540bd9356df15b1a62eccb9b99a70bb021e7221 100644 (file)
@@ -66,4 +66,6 @@ void virNetServerServiceFree(virNetServerServicePtr svc);
 void virNetServerServiceToggle(virNetServerServicePtr svc,
                                bool enabled);
 
+void virNetServerServiceClose(virNetServerServicePtr svc);
+
 #endif
index 41b691a6aad18bee5daf1f63f3597adc4476bf9e..992e33aa204a4aaccd4ab5cf5598235767aef996 100644 (file)
@@ -1222,3 +1222,25 @@ void virNetSocketRemoveIOCallback(virNetSocketPtr sock)
 
     virMutexUnlock(&sock->lock);
 }
+
+void virNetSocketClose(virNetSocketPtr sock)
+{
+    if (!sock)
+        return;
+
+    virMutexLock(&sock->lock);
+
+    VIR_FORCE_CLOSE(sock->fd);
+
+#ifdef HAVE_SYS_UN_H
+    /* If a server socket, then unlink UNIX path */
+    if (!sock->client &&
+        sock->localAddr.data.sa.sa_family == AF_UNIX &&
+        sock->localAddr.data.un.sun_path[0] != '\0') {
+        if (unlink(sock->localAddr.data.un.sun_path) == 0)
+            sock->localAddr.data.un.sun_path[0] = '\0';
+    }
+#endif
+
+    virMutexUnlock(&sock->lock);
+}
index dfb3c5d031ef7ff91c77d592bc0db4869df40d24..1e1c63c6e534a72d5961fac0e186ddd14a844c3c 100644 (file)
@@ -118,6 +118,7 @@ void virNetSocketUpdateIOCallback(virNetSocketPtr sock,
 
 void virNetSocketRemoveIOCallback(virNetSocketPtr sock);
 
+void virNetSocketClose(virNetSocketPtr sock);
 
 
 #endif /* __VIR_NET_SOCKET_H__ */