<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br>On Jan 26, 2012, at 5:57 PM, Daniel P. Berrange wrote:<br><br><blockquote type="cite">On Fri, Jan 20, 2012 at 03:56:26PM +0100, D. Herrendoerfer wrote:<br></blockquote><blockquote type="cite"><blockquote type="cite">From: "D. Herrendoerfer" <<a href="mailto:d.herrendoerfer@herrendoerfer.name">d.herrendoerfer@herrendoerfer.name</a>><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">This code adds an event service for netlink messages addressed<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">to libvirt and passes the message to registered callback handlers.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Itself, it makes use of the polling file event service and follows<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">a similar design.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Signed-off-by: D. Herrendoerfer <<a href="mailto:d.herrendoerfer@herrendoerfer.name">d.herrendoerfer@herrendoerfer.name</a>><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">---<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">daemon/Makefile.am       |    3 +-<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">daemon/libvirtd.c        |    7 +<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">src/Makefile.am          |    1 +<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">src/libvirt_private.syms |    7 +<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">src/util/netlink-event.c |  363 ++++++++++++++++++++++++++++++++++++++++++++++<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">src/util/netlink-event.h |   63 ++++++++<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Our current practice is to use a 'vir' prefix on the files,<br></blockquote><blockquote type="cite">so I'd just use  'virnetlink.[ch]' for this code.<br></blockquote><blockquote type="cite"><br></blockquote><br>virnetlink.[ch]. ok.<br><br><blockquote type="cite"><blockquote type="cite">diff --git a/daemon/Makefile.am b/daemon/Makefile.am<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">index 73a6e1f..d027ff6 100644<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">--- a/daemon/Makefile.am<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+++ b/daemon/Makefile.am<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">@@ -114,7 +114,8 @@ libvirtd_LDADD += ../src/probes.o<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">endif<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">libvirtd_LDADD += \<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">-<span class="Apple-tab-span" style="white-space: pre; ">      </span>../src/libvirt-qemu.la<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">  </span>../src/libvirt-qemu.la<span class="Apple-tab-span" style="white-space: pre; ">   </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span>\<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">       </span>../src/libvirt_util.la<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Don't do this. This is a sign that you need to add some<br></blockquote><blockquote type="cite">APIs in src/libvirt_private.syms instead.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">if ! WITH_DRIVER_MODULES<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">if WITH_QEMU<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">index d7a03d7..b118fd0 100644<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">--- a/daemon/libvirtd.c<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+++ b/daemon/libvirtd.c<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">@@ -1577,6 +1579,11 @@ int main(int argc, char **argv) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">       goto cleanup;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">   }<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    /* Register the netlink event service */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    if (netlinkEventServiceStart() < 0) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    <span class="Apple-tab-span" style="white-space: pre; ">   </span>VIR_WARN("Netlink service did not start. Netlink events are not available.");<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    }<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Looking at the code I think it is reasonable to treat this<br></blockquote><blockquote type="cite">failure as a hard fail. On linux this should always succeed.<br></blockquote><blockquote type="cite">On non-Linux we should be compiling to a no-op variant.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">   /* Run event loop. */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">   virNetServerRun(srv);<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Probably need to call the Stop method too somewhere....<br></blockquote><blockquote type="cite"><br></blockquote><br>Yes -<br><br><blockquote type="cite"><blockquote type="cite">diff --git a/src/util/netlink-event.c b/src/util/netlink-event.c<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">new file mode 100644<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">index 0000000..7c6746d<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">--- /dev/null<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+++ b/src/util/netlink-event.c<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">@@ -0,0 +1,363 @@<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+/*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * lldpad-event.c: event loop for monitoring netlink messages<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ *<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Copyright (C) 2011,2012 IBM Corporation.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Copyright (C) 2011,2012 Dirk Herrendoerfer<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">s/2011,2012/2011-2012/<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+#define EVENT_DEBUG(fmt, ...) VIR_DEBUG(fmt, __VA_ARGS__)<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Don't do this - just use VIR_DEBUG directly.<br></blockquote><blockquote type="cite"><br></blockquote><br>Agreed, (all of the above)<br><br><blockquote type="cite"><blockquote type="cite">+/* State for a single netlink event handle */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+struct netlinkEventHandle {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">       </span>int watch;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    netlinkEventHandleCallback cb;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    void *opaque;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    unsigned char macaddr[6];<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    int deleted;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+};<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+/* State for the main netlink event loop */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+struct netlinkEventLoop {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">    </span>virMutex lock;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    int handeled;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    size_t handlesCount;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    size_t handlesAlloc;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    struct netlinkEventHandle *handles;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+};<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+/* Only have one event loop */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+static struct netlinkEventLoop eventLoop;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+/* Unique ID for the next netlink watch to be registered */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+static int nextWatch = 1;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+/* Allocate extra slots for virEventPollHandle/virEventPollTimeout<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+   records in this multiple */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+#define NETLINK_EVENT_ALLOC_EXTENT 10<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+static netlinkEventSrvPrivatePtr server = 0;<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I'm not really seeing the point in having two global structs,<br></blockquote><blockquote type="cite">both with their own lock.  I'd say we should just have one<br></blockquote><blockquote type="cite">struct with all neccessary state in it.<br></blockquote><blockquote type="cite"><br></blockquote><br>There are three, One is for the event_poll handler, the second<br>for the Service loop, and the third holds the clients data.<br>IMHO it is more complicated to merge them.<br><br><blockquote type="cite"><blockquote type="cite">+    for (i = 0 ; i < eventLoop.handlesCount ; i++) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        if (eventLoop.handles[i].deleted) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            continue;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        }<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        VIR_INFO("dispatching client %d.",i);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        netlinkEventHandleCallback cb = eventLoop.handles[i].cb;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        void *cpopaque = eventLoop.handles[i].opaque;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        (cb)( msg, length, &peer, &handeled, cpopaque);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    }<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    virMutexUnlock(&eventLoop.lock);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    if (handeled == 0) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    <span class="Apple-tab-span" style="white-space: pre; ">     </span>VIR_INFO("nobody cared.");<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    }<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    free(msg);<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">s/free/VIR_FREE/<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+int<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+netlinkEventServiceStop(void) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">        </span>netlinkEventSrvPrivatePtr srv = server;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">        </span>VIR_INFO("stopping netlink event service");<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">  </span>if (server) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">   </span><span class="Apple-tab-span" style="white-space: pre; "> </span>errno = EINVAL;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span>return -1;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">      </span>}<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">IMHO just return 0 here and skip errno.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">        </span>netlinkEventServerLock(srv);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">   </span>nl_close(srv->netlinknh);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">    </span>nl_handle_destroy(srv->netlinknh);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">  </span>virEventRemoveHandle(srv->eventwatch);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">       </span>server=0;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    netlinkEventServerUnlock(srv);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    return 0;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+}<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+int<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+netlinkEventAddClient(netlinkEventHandleCallback cb,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">    </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span>  void *opaque,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">       </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span><span class="Apple-tab-span" style="white-space: pre; "> </span>  const unsigned char *macaddr) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<span class="Apple-tab-span" style="white-space: pre; ">     </span>int i;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    virMutexLock(&eventLoop.lock);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    VIR_INFO("adding client: %d.",nextWatch);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    /* first try to re-use deleted free slots */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    for (i = 0 ; i < eventLoop.handlesCount ; i++) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+        if (eventLoop.handles[i].deleted == 2) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            eventLoop.handles[i].watch = nextWatch;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            eventLoop.handles[i].cb = cb;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            eventLoop.handles[i].opaque = opaque;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            eventLoop.handles[i].deleted = 0;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            if (!macaddr)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+            <span class="Apple-tab-span" style="white-space: pre; "> </span>memcpy(eventLoop.handles[i].macaddr, macaddr,6);<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">s/6/VIR_MAC_BUFLEN/<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+    <span class="Apple-tab-span" style="white-space: pre; ">   </span>memcpy(eventLoop.handles[i].macaddr, macaddr,6);<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">And again.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    VIR_INFO("added client to loop slot: %d.",(int)eventLoop.handlesCount);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    eventLoop.handlesCount++;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+cleanup:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    virMutexUnlock(&eventLoop.lock);<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    return nextWatch++;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+}<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+int<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+netlinkEventRemoveClient(int watch, const unsigned char *macaddr) {<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">+        if (watch == 0 && memcmp(macaddr, eventLoop.handles[i].macaddr, 6)) {<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">And here, etc<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">diff --git a/src/util/netlink-event.h b/src/util/netlink-event.h<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">new file mode 100644<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">index 0000000..da97395<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">--- /dev/null<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+++ b/src/util/netlink-event.h<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">@@ -0,0 +1,63 @@<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+/*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * lldpad-event.h: event loop for monitoring netlink messages<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Wrong filename<br></blockquote><blockquote type="cite"><br></blockquote><br>All agreed,<br><br><blockquote type="cite"><blockquote type="cite">+ *<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Copyright (C) 2011,2012 IBM Corporation.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Copyright (C) 2011,2012 Dirk Herrendoerfer<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ *<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * This library is free software; you can redistribute it and/or<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * modify it under the terms of the GNU Lesser General Public<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * License as published by the Free Software Foundation; either<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * version 2.1 of the License, or (at your option) any later version.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ *<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * This library is distributed in the hope that it will be useful,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Lesser General Public License for more details.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ *<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * You should have received a copy of the GNU Lesser General Public<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * License along with this library; if not, write to the Free Software<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ *<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ * Author: Dirk Herrendoerfer <herrend[at]de[dot]ibm[dot]com><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+ */<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+#ifndef NETLINK_EVENT_CONF_H<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+# define NETLINK_EVENT_CONF_H<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+#include <netlink/netlink.h><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+#include "internal.h"<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+#include "threads.h"<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+typedef struct _netlinkEventSrvPrivate netlinkEventSrvPrivate;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+typedef netlinkEventSrvPrivate *netlinkEventSrvPrivatePtr;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+struct _netlinkEventSrvPrivate {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    virMutex lock;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    int eventwatch;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    int netlinkfd;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+    struct nl_handle *netlinknh;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">+};<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">This shouldn't be made public, and can be merged into the other<br></blockquote><blockquote type="cite">global state struct.<br></blockquote><blockquote type="cite"><br></blockquote><br>I agree that it should not be public but I still want to keep them separate.<br><br>DirkH<br><br><blockquote type="cite">Daniel<br></blockquote><blockquote type="cite">-- <br></blockquote><blockquote type="cite">|: <a href="http://berrange.com/">http://berrange.com</a>      -o-    <a href="http://www.flickr.com/photos/dberrange/">http://www.flickr.com/photos/dberrange/</a> :|<br></blockquote><blockquote type="cite">|: <a href="http://libvirt.org/">http://libvirt.org</a>              -o-             <a href="http://virt-manager.org/">http://virt-manager.org</a> :|<br></blockquote><blockquote type="cite">|: <a href="http://autobuild.org/">http://autobuild.org</a>       -o-         <a href="http://search.cpan.org/~danberr/">http://search.cpan.org/~danberr/</a> :|<br></blockquote><blockquote type="cite">|: <a href="http://entangle-photo.org/">http://entangle-photo.org</a>       -o-       <a href="http://live.gnome.org/gtk-vnc">http://live.gnome.org/gtk-vnc</a> :|<br></blockquote><div><br></div></body></html>