]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
* libvirt.spec.in: libvirt-devel depends on pkgconfig
authorDaniel Veillard <veillard@redhat.com>
Tue, 7 Nov 2006 16:28:16 +0000 (16:28 +0000)
committerDaniel Veillard <veillard@redhat.com>
Tue, 7 Nov 2006 16:28:16 +0000 (16:28 +0000)
* proxy/libvirt_proxy.c src/libvirt.c src/proxy_internal.[ch]
  src/xs_internal.[ch]: the virtGetOsType entry point was calling
  the xenstore directly instead of going though driver, refactored
  and implemented a specific new RPC with the proxy when this is
  called as non-root fixes rhbz#214264 .
Daniel

ChangeLog
libvirt.spec.in
po/en_GB.po
po/libvirt.pot
proxy/libvirt_proxy.c
src/libvirt.c
src/proxy_internal.c
src/proxy_internal.h
src/xs_internal.c
src/xs_internal.h

index db6b39ba6299bfce900bc2e623a66356f2790d67..a170060bb7627f8d67b1f8ede4d8e10b87862236 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Nov  7 16:33:43 CET 2006 Daniel Veillard <veillard@redhat.com>
+
+       * libvirt.spec.in: libvirt-devel depends on pkgconfig
+       * proxy/libvirt_proxy.c src/libvirt.c src/proxy_internal.[ch]
+         src/xs_internal.[ch]: the virtGetOsType entry point was calling
+         the xenstore directly instead of going though driver, refactored
+         and implemented a specific new RPC with the proxy when this is
+         called as non-root fixes rhbz#214264 .
+
 Tue Oct 31 10:31:34 CET 2006 Daniel Veillard <veillard@redhat.com>
 
        * src/xend_internal.c: when getting informations about a non
index 2361f90e3c7340acd6179de61cba48ff6d35e9d8..7eb8f0e3388f418eb4d83ff98a84c5165a6768dd 100644 (file)
@@ -30,6 +30,7 @@ and the virsh command line tool to control virtual domains.
 Summary: Libraries, includes, etc. to compile with the libvirt library
 Group: Development/Libraries
 Requires: libvirt = %{version}
+Requires: pkgconfig
 Obsoletes: libvir-devel
 
 %description devel
index 443524e149696e94e3d1d272491d782beae12ac2..d59e4b38275ef917f8b022f6d79092e01d5f0b23 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libvirt\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-10-16 17:09+0200\n"
+"POT-Creation-Date: 2006-11-07 16:20+0100\n"
 "PO-Revision-Date: 2006-09-20 10:20-0400\n"
 "Last-Translator: Daniel Berrange <berrange@redhat.com>\n"
 "Language-Team: English <en@li.org>\n"
@@ -369,9 +369,9 @@ msgid "allocate new context"
 msgstr ""
 
 #: src/hash.c:628 src/hash.c:634 src/test.c:725 src/test.c:750 src/test.c:773
-#: src/test.c:797 src/xend_internal.c:1911 src/xend_internal.c:2607
-#: src/xend_internal.c:2818 src/xs_internal.c:592 src/proxy_internal.c:790
-#: src/proxy_internal.c:837 src/proxy_internal.c:888
+#: src/test.c:797 src/xend_internal.c:1912 src/xend_internal.c:2608
+#: src/xend_internal.c:2819 src/xs_internal.c:594 src/proxy_internal.c:791
+#: src/proxy_internal.c:838 src/proxy_internal.c:889
 msgid "allocating domain"
 msgstr ""
 
@@ -491,7 +491,7 @@ msgstr ""
 msgid "growing buffer"
 msgstr ""
 
-#: src/xml.c:116 src/xend_internal.c:1602 src/xend_internal.c:1621
+#: src/xml.c:116 src/xend_internal.c:1603 src/xend_internal.c:1622
 msgid "allocate new buffer"
 msgstr ""
 
@@ -511,61 +511,61 @@ msgstr ""
 msgid "failed to read from Xen Daemon"
 msgstr ""
 
-#: src/xend_internal.c:1056
+#: src/xend_internal.c:1057
 msgid "failed to urlencode the create S-Expr"
 msgstr ""
 
-#: src/xend_internal.c:1097
+#: src/xend_internal.c:1098
 msgid "domain information incomplete, missing domid"
 msgstr ""
 
-#: src/xend_internal.c:1103
+#: src/xend_internal.c:1104
 msgid "domain information incorrect domid not numeric"
 msgstr ""
 
-#: src/xend_internal.c:1110 src/xend_internal.c:1159
+#: src/xend_internal.c:1111 src/xend_internal.c:1160
 msgid "domain information incomplete, missing uuid"
 msgstr ""
 
-#: src/xend_internal.c:1150 src/xend_internal.c:1491
+#: src/xend_internal.c:1151 src/xend_internal.c:1492
 msgid "domain information incomplete, missing name"
 msgstr ""
 
-#: src/xend_internal.c:1408 src/xend_internal.c:1433
+#: src/xend_internal.c:1409 src/xend_internal.c:1434
 msgid "domain information incomplete, missing kernel"
 msgstr ""
 
-#: src/xend_internal.c:1581
+#: src/xend_internal.c:1582
 msgid "domain information incomplete, vbd has no src"
 msgstr ""
 
-#: src/xend_internal.c:1587
+#: src/xend_internal.c:1588
 msgid "domain information incomplete, vbd has no dev"
 msgstr ""
 
-#: src/xend_internal.c:1595
+#: src/xend_internal.c:1596
 msgid "cannot parse vbd filename, missing driver name"
 msgstr ""
 
-#: src/xend_internal.c:1614
+#: src/xend_internal.c:1615
 msgid "cannot parse vbd filename, missing driver type"
 msgstr ""
 
-#: src/xend_internal.c:1922
+#: src/xend_internal.c:1923
 msgid "failed to parse Xend domain information"
 msgstr ""
 
-#: src/xend_internal.c:2882
+#: src/xend_internal.c:2883
 #, c-format
 msgid "Failed to create domain %s\n"
 msgstr ""
 
-#: src/xend_internal.c:2888
+#: src/xend_internal.c:2889
 #, c-format
 msgid "Failed to get devices for domain %s\n"
 msgstr ""
 
-#: src/xend_internal.c:2899
+#: src/xend_internal.c:2900
 #, c-format
 msgid "Failed to resume new domain %s\n"
 msgstr ""
@@ -1370,51 +1370,51 @@ msgstr ""
 msgid "failed to save content"
 msgstr ""
 
-#: src/xs_internal.c:318
+#: src/xs_internal.c:320
 msgid "failed to connect to Xen Store"
 msgstr ""
 
-#: src/proxy_internal.c:193
+#: src/proxy_internal.c:194
 #, c-format
 msgid "failed to exec %s\n"
 msgstr ""
 
-#: src/proxy_internal.c:287
+#: src/proxy_internal.c:288
 #, c-format
 msgid "Failed to close socket %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:320
+#: src/proxy_internal.c:321
 #, c-format
 msgid "Failed to read socket %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:354
+#: src/proxy_internal.c:355
 #, c-format
 msgid "Failed to write to socket %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:416 src/proxy_internal.c:437 src/proxy_internal.c:457
+#: src/proxy_internal.c:417 src/proxy_internal.c:438 src/proxy_internal.c:458
 #, c-format
 msgid "Communication error with proxy: got %d bytes of %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:424
+#: src/proxy_internal.c:425
 #, c-format
 msgid "Communication error with proxy: expected %d bytes got %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:446
+#: src/proxy_internal.c:447
 #, c-format
 msgid "Communication error with proxy: got %d bytes packet\n"
 msgstr ""
 
-#: src/proxy_internal.c:470
+#: src/proxy_internal.c:471
 #, c-format
 msgid "Communication error with proxy: malformed packet\n"
 msgstr ""
 
-#: src/proxy_internal.c:476
+#: src/proxy_internal.c:477
 #, c-format
 msgid "got asynchronous packet number %d\n"
 msgstr ""
index 8ac1c5c5e237a0b60c0ddffe4617f2b1c0e19094..beb3f74def6d0925071346dd4a3d69b8f7dd9ee0 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-10-16 17:09+0200\n"
+"POT-Creation-Date: 2006-11-07 16:20+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -369,9 +369,9 @@ msgid "allocate new context"
 msgstr ""
 
 #: src/hash.c:628 src/hash.c:634 src/test.c:725 src/test.c:750 src/test.c:773
-#: src/test.c:797 src/xend_internal.c:1911 src/xend_internal.c:2607
-#: src/xend_internal.c:2818 src/xs_internal.c:592 src/proxy_internal.c:790
-#: src/proxy_internal.c:837 src/proxy_internal.c:888
+#: src/test.c:797 src/xend_internal.c:1912 src/xend_internal.c:2608
+#: src/xend_internal.c:2819 src/xs_internal.c:594 src/proxy_internal.c:791
+#: src/proxy_internal.c:838 src/proxy_internal.c:889
 msgid "allocating domain"
 msgstr ""
 
@@ -491,7 +491,7 @@ msgstr ""
 msgid "growing buffer"
 msgstr ""
 
-#: src/xml.c:116 src/xend_internal.c:1602 src/xend_internal.c:1621
+#: src/xml.c:116 src/xend_internal.c:1603 src/xend_internal.c:1622
 msgid "allocate new buffer"
 msgstr ""
 
@@ -511,61 +511,61 @@ msgstr ""
 msgid "failed to read from Xen Daemon"
 msgstr ""
 
-#: src/xend_internal.c:1056
+#: src/xend_internal.c:1057
 msgid "failed to urlencode the create S-Expr"
 msgstr ""
 
-#: src/xend_internal.c:1097
+#: src/xend_internal.c:1098
 msgid "domain information incomplete, missing domid"
 msgstr ""
 
-#: src/xend_internal.c:1103
+#: src/xend_internal.c:1104
 msgid "domain information incorrect domid not numeric"
 msgstr ""
 
-#: src/xend_internal.c:1110 src/xend_internal.c:1159
+#: src/xend_internal.c:1111 src/xend_internal.c:1160
 msgid "domain information incomplete, missing uuid"
 msgstr ""
 
-#: src/xend_internal.c:1150 src/xend_internal.c:1491
+#: src/xend_internal.c:1151 src/xend_internal.c:1492
 msgid "domain information incomplete, missing name"
 msgstr ""
 
-#: src/xend_internal.c:1408 src/xend_internal.c:1433
+#: src/xend_internal.c:1409 src/xend_internal.c:1434
 msgid "domain information incomplete, missing kernel"
 msgstr ""
 
-#: src/xend_internal.c:1581
+#: src/xend_internal.c:1582
 msgid "domain information incomplete, vbd has no src"
 msgstr ""
 
-#: src/xend_internal.c:1587
+#: src/xend_internal.c:1588
 msgid "domain information incomplete, vbd has no dev"
 msgstr ""
 
-#: src/xend_internal.c:1595
+#: src/xend_internal.c:1596
 msgid "cannot parse vbd filename, missing driver name"
 msgstr ""
 
-#: src/xend_internal.c:1614
+#: src/xend_internal.c:1615
 msgid "cannot parse vbd filename, missing driver type"
 msgstr ""
 
-#: src/xend_internal.c:1922
+#: src/xend_internal.c:1923
 msgid "failed to parse Xend domain information"
 msgstr ""
 
-#: src/xend_internal.c:2882
+#: src/xend_internal.c:2883
 #, c-format
 msgid "Failed to create domain %s\n"
 msgstr ""
 
-#: src/xend_internal.c:2888
+#: src/xend_internal.c:2889
 #, c-format
 msgid "Failed to get devices for domain %s\n"
 msgstr ""
 
-#: src/xend_internal.c:2899
+#: src/xend_internal.c:2900
 #, c-format
 msgid "Failed to resume new domain %s\n"
 msgstr ""
@@ -1370,51 +1370,51 @@ msgstr ""
 msgid "failed to save content"
 msgstr ""
 
-#: src/xs_internal.c:318
+#: src/xs_internal.c:320
 msgid "failed to connect to Xen Store"
 msgstr ""
 
-#: src/proxy_internal.c:193
+#: src/proxy_internal.c:194
 #, c-format
 msgid "failed to exec %s\n"
 msgstr ""
 
-#: src/proxy_internal.c:287
+#: src/proxy_internal.c:288
 #, c-format
 msgid "Failed to close socket %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:320
+#: src/proxy_internal.c:321
 #, c-format
 msgid "Failed to read socket %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:354
+#: src/proxy_internal.c:355
 #, c-format
 msgid "Failed to write to socket %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:416 src/proxy_internal.c:437 src/proxy_internal.c:457
+#: src/proxy_internal.c:417 src/proxy_internal.c:438 src/proxy_internal.c:458
 #, c-format
 msgid "Communication error with proxy: got %d bytes of %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:424
+#: src/proxy_internal.c:425
 #, c-format
 msgid "Communication error with proxy: expected %d bytes got %d\n"
 msgstr ""
 
-#: src/proxy_internal.c:446
+#: src/proxy_internal.c:447
 #, c-format
 msgid "Communication error with proxy: got %d bytes packet\n"
 msgstr ""
 
-#: src/proxy_internal.c:470
+#: src/proxy_internal.c:471
 #, c-format
 msgid "Communication error with proxy: malformed packet\n"
 msgstr ""
 
-#: src/proxy_internal.c:476
+#: src/proxy_internal.c:477
 #, c-format
 msgid "got asynchronous packet number %d\n"
 msgstr ""
index 37f987b083cd8f8e7af458e745832060512cb57d..22b1ac08a98ca424f779e42b6f7087ed1ae7a673 100644 (file)
@@ -337,7 +337,7 @@ proxyReadClientSocket(int nr) {
     virProxyFullPacket request;
     virProxyPacketPtr req = (virProxyPacketPtr) &request;
     int ret;
-    char *xml;
+    char *xml, *ostype;
 
 retry:
     ret = read(pollInfos[nr].fd, req, sizeof(virProxyPacket));
@@ -587,6 +587,27 @@ retry2:
                 free(xml);
            }
            break;
+       case VIR_PROXY_DOMAIN_OSTYPE:
+           if (req->len != sizeof(virProxyPacket))
+               goto comm_error;
+
+           ostype = xenStoreDomainGetOSTypeID(conn, request.data.arg);
+            if (!ostype) {
+                req->data.arg = -1;
+                req->len = sizeof(virProxyPacket);
+           } else {
+                int ostypelen = strlen(ostype);
+                if (ostypelen > (int) sizeof(request.extra.str)) {
+                    req->data.arg = -2;
+                    req->len = sizeof(virProxyPacket);
+                } else {
+                    req->data.arg = 0;
+                    memmove(&request.extra.str[0], ostype, ostypelen);
+                    req->len = sizeof(virProxyPacket) + ostypelen;
+                }
+                free(ostype);
+           }
+           break;
        default:
            goto comm_error;
     }
index bedd4346a5ed97e183f967ee654e1c2c978602e4..bb4edb310ed329152cec74a71feb4a6c26b1639e 100644 (file)
@@ -1239,18 +1239,23 @@ virDomainGetID(virDomainPtr domain)
 char *
 virDomainGetOSType(virDomainPtr domain)
 {
-    char *vm, *str = NULL;
+    char *str = NULL;
+    int i;
 
     if (!VIR_IS_DOMAIN(domain)) {
         virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
         return (NULL);
     }
 
-    vm = virDomainGetVM(domain);
-    if (vm) {
-        str = virDomainGetVMInfo(domain, vm, "image/ostype");
-        free(vm);
+    for (i = 0;i < domain->conn->nb_drivers;i++) {
+       if ((domain->conn->drivers[i] != NULL) &&
+           (domain->conn->drivers[i]->domainGetOSType != NULL)) {
+           str = domain->conn->drivers[i]->domainGetOSType(domain);
+           if (str != NULL)
+               break;
+       }
     }
+
     if (str == NULL)
         str = strdup("linux");
 
index 7d3d8471f9a9a1f815d13c4effaf2d23c2bbbc14..8ef2511c3680a5c955079af0df42a5a2422e0ef6 100644 (file)
@@ -40,6 +40,7 @@ static virDomainPtr xenProxyDomainLookupByName(virConnectPtr conn,
 static unsigned long xenProxyDomainGetMaxMemory(virDomainPtr domain);
 static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
 static char *xenProxyDomainDumpXML(virDomainPtr domain, int flags);
+static char *xenProxyDomainGetOSType(virDomainPtr domain);
 
 static virDriver xenProxyDriver = {
     VIR_DRV_XEN_PROXY,
@@ -66,7 +67,7 @@ static virDriver xenProxyDriver = {
     NULL, /* domainGetName */
     NULL, /* domainGetID */
     NULL, /* domainGetUUID */
-    NULL, /* domainGetOSType */
+    xenProxyDomainGetOSType, /* domainGetOSType */
     xenProxyDomainGetMaxMemory, /* domainGetMaxMemory */
     NULL, /* domainSetMaxMemory */
     NULL, /* domainSetMemory */
@@ -974,10 +975,60 @@ xenProxyDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
     }
     xmllen = ans.len - sizeof(virProxyPacket);
     if (!(xml = malloc(xmllen+1))) {
-      return NULL;
+       virProxyError(domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
+        return NULL;
     }
     memmove(xml, &ans.extra.dinfo, xmllen);
     xml[xmllen] = '\0';
 
     return(xml);
 }
+
+/**
+ * xenProxyDomainGetOSType:
+ * @domain: a domain object
+ *
+ * Get the type of domain operation system.
+ *
+ * Returns the new string or NULL in case of error, the string must be
+ *         freed by the caller.
+ */
+static char *
+xenProxyDomainGetOSType(virDomainPtr domain)
+{
+    virProxyPacket req;
+    virProxyFullPacket ans;
+    int ret;
+    int oslen;
+    char *ostype;
+
+    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+       if (domain == NULL)
+           virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+       else
+           virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        return (NULL);
+    }
+    memset(&req, 0, sizeof(req));
+    req.command = VIR_PROXY_DOMAIN_OSTYPE;
+    req.data.arg = domain->handle;
+    req.len = sizeof(req);
+    ret = xenProxyCommand(domain->conn, &req, &ans, 0);
+    if (ret < 0) {
+        xenProxyClose(domain->conn);
+       return(NULL);
+    }
+    if (ans.len <= sizeof(virProxyPacket)) {
+        virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
+       return (NULL);
+    }
+    oslen = ans.len - sizeof(virProxyPacket);
+    if (!(ostype = malloc(oslen+1))) {
+       virProxyError(domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
+        return NULL;
+    }
+    memmove(ostype, &ans.extra.dinfo, oslen);
+    ostype[oslen] = '\0';
+
+    return(ostype);
+}
index 1e5940e259ae4d5688659686eec0d80269937362..936cfb6dc23c4e5712d575b1938aee9662d9ee92 100644 (file)
@@ -36,6 +36,7 @@ typedef enum {
        VIR_PROXY_MAX_MEMORY = 8,
        VIR_PROXY_DOMAIN_INFO = 9,
        VIR_PROXY_DOMAIN_XML = 10,
+       VIR_PROXY_DOMAIN_OSTYPE = 11
 } virProxyCommand;
 
 /*
index 3f4f7d89b6e7f85786169bffb8fc802ed544cf09..a687ea9a5badacf91e957fcd9b1d62316407d816 100644 (file)
@@ -32,6 +32,8 @@
 #define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
 
 #ifndef PROXY
+static char *xenStoreDomainGetOSType(virDomainPtr domain);
+
 static virDriver xenStoreDriver = {
     VIR_DRV_XEN_STORE,
     "XenStore",
@@ -59,7 +61,7 @@ static virDriver xenStoreDriver = {
     NULL, /* domainGetName */
     NULL, /* domainGetID */
     NULL, /* domainGetUUID */
-    NULL, /* domainGetOSType */
+    xenStoreDomainGetOSType, /* domainGetOSType */
     xenStoreDomainGetMaxMemory, /* domainGetMaxMemory */
     NULL, /* domainSetMaxMemory */
     xenStoreDomainSetMemory, /* domainSetMemory */
@@ -656,6 +658,34 @@ xenStoreDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED)
      */
     return(virDomainDoStoreWrite(domain, "control/shutdown", "reboot"));
 }
+
+/*
+ * xenStoreDomainGetOSType:
+ * @domain: a domain object
+ *
+ * Get the type of domain operation system.
+ *
+ * Returns the new string or NULL in case of error, the string must be
+ *         freed by the caller.
+ */
+static char *
+xenStoreDomainGetOSType(virDomainPtr domain) {
+    char *vm, *str = NULL;
+
+    if ((domain == NULL) || (domain->conn == NULL)) {
+        virXenStoreError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
+                        __FUNCTION__);
+        return(NULL);
+    }
+
+    vm = virDomainGetVM(domain);
+    if (vm) {
+        str = virDomainGetVMInfo(domain, vm, "image/ostype");
+        free(vm);
+    }
+
+    return (str);
+}
 #endif /* ! PROXY */
 
 /**
@@ -698,3 +728,42 @@ int             xenStoreDomainGetVNCPort(virConnectPtr conn, int domid) {
 char *          xenStoreDomainGetConsolePath(virConnectPtr conn, int domid) {
   return virDomainDoStoreQuery(conn, domid, "console/tty");
 }
+
+#ifdef PROXY
+/*
+ * xenStoreDomainGetOSTypeID:
+ * @conn: pointer to the connection.
+ * @id: the domain id
+ *
+ * Get the type of domain operation system.
+ *
+ * Returns the new string or NULL in case of error, the string must be
+ *         freed by the caller.
+ */
+char *
+xenStoreDomainGetOSTypeID(virConnectPtr conn, int id) {
+    char *vm, *str = NULL;
+    char query[200];
+    unsigned int len;
+
+    if (id < 0)
+        return(NULL);
+
+
+    if (conn->xshandle == NULL)
+        return (NULL);
+
+    snprintf(query, 199, "/local/domain/%d/vm", id);
+    query[199] = 0;
+
+    vm = xs_read(conn->xshandle, 0, &query[0], &len);
+
+    if (vm) {
+        snprintf(query, 199, "%s/image/ostype", vm);
+       str = xs_read(conn->xshandle, 0, &query[0], &len);
+        free(vm);
+    }
+
+    return (str);
+}
+#endif /* PROXY */
index ff33357c1c347bf4ec15039fdf008b67ed25d8d0..06e02338801e91ffab1500271c01b21258b2e1ad 100644 (file)
@@ -36,8 +36,13 @@ int          xenStoreDomainShutdown  (virDomainPtr domain);
 int            xenStoreDomainReboot    (virDomainPtr domain,
                                         unsigned int flags);
 
-int             xenStoreDomainGetVNCPort(virConnectPtr conn, int domid);
-char *          xenStoreDomainGetConsolePath(virConnectPtr conn, int domid);
+/* those are entry point for the proxy */
+int             xenStoreDomainGetVNCPort(virConnectPtr conn,
+                                        int domid);
+char *          xenStoreDomainGetConsolePath(virConnectPtr conn,
+                                        int domid);
+char *         xenStoreDomainGetOSTypeID(virConnectPtr conn,
+                                        int id);
 
 #ifdef __cplusplus
 }