WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Add support in libxenstore for using the xenbus_dev stor

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Add support in libxenstore for using the xenbus_dev store connection.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 03 Sep 2005 17:02:22 +0000
Delivery-date: Sat, 03 Sep 2005 17:00:56 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 8a228cbb69feb6c4f79c1525bfd3872301ff175c
# Parent  87ea297c1d3adeaa277cdef44bc03d399cf90a86
Add support in libxenstore for using the xenbus_dev store connection.
Also add simple read/write/rm clients for command line access to the
store (using the xenbus_dev store connection).
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r 87ea297c1d3a -r 8a228cbb69fe .hgignore
--- a/.hgignore Sat Sep  3 16:52:12 2005
+++ b/.hgignore Sat Sep  3 16:54:38 2005
@@ -153,8 +153,12 @@
 ^tools/xenstat/xentop/xentop$
 ^tools/xenstore/testsuite/tmp/.*$
 ^tools/xenstore/xen$
+^tools/xenstore/xenbus_dev.h$
 ^tools/xenstore/xenstored$
 ^tools/xenstore/xenstored_test$
+^tools/xenstore/xenstore-read$
+^tools/xenstore/xenstore-rm$
+^tools/xenstore/xenstore-write$
 ^tools/xenstore/xs_dom0_test$
 ^tools/xenstore/xs_random$
 ^tools/xenstore/xs_stress$
diff -r 87ea297c1d3a -r 8a228cbb69fe tools/xenstore/Makefile
--- a/tools/xenstore/Makefile   Sat Sep  3 16:52:12 2005
+++ b/tools/xenstore/Makefile   Sat Sep  3 16:54:38 2005
@@ -24,15 +24,27 @@
 TESTFLAGS= -DTESTING
 TESTENV  = XENSTORED_ROOTDIR=$(TESTDIR) XENSTORED_RUNDIR=$(TESTDIR)
 
-all: xen xenstored libxenstore.so
+CLIENTS := xenstore-read xenstore-rm xenstore-write
+CLIENTS_OBJS := $(patsubst xenstore-%,xenstore_%.o,$(CLIENTS))
+
+all: xen xenbus_dev.h libxenstore.so xenstored $(CLIENTS)
 
 testcode: xen xs_test xenstored_test xs_random xs_dom0_test
 
 xen:
        ln -sf $(XEN_ROOT)/xen/include/public $@
 
+xenbus_dev.h:
+       ln -sf 
$(XEN_ROOT)/linux-2.6-xen-sparse/include/asm-xen/linux-public/xenbus_dev.h $@
+
 xenstored: xenstored_core.o xenstored_watch.o xenstored_domain.o 
xenstored_transaction.o xs_lib.o talloc.o utils.o
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -lxenctrl -o $@
+
+$(CLIENTS): xenstore-%: xenstore_%.o
+       $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -lxenctrl -L. -lxenstore -o $@
+
+$(CLIENTS_OBJS): xenstore_%.o: xenstore_client.c
+       $(COMPILE.c) -DCLIENT_$(*F) -o $@ $<
 
 xenstored_test: xenstored_core_test.o xenstored_watch_test.o 
xenstored_domain_test.o xenstored_transaction_test.o xs_lib.o talloc_test.o 
fake_libxc.o utils.o
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
@@ -111,12 +123,13 @@
 tarball: clean
        cd .. && tar -c -j -v -h -f xenstore.tar.bz2 xenstore/
 
-install: xenstored libxenstore.so
+install: libxenstore.so xenstored $(CLIENTS)
        $(INSTALL_DIR) -p $(DESTDIR)/var/run/xenstored
        $(INSTALL_DIR) -p $(DESTDIR)/var/lib/xenstored
        $(INSTALL_DIR) -p $(DESTDIR)/usr/sbin
        $(INSTALL_DIR) -p $(DESTDIR)/usr/include
        $(INSTALL_PROG) xenstored $(DESTDIR)/usr/sbin
+       $(INSTALL_PROG) $(CLIENTS) $(DESTDIR)/usr/bin
        $(INSTALL_DIR) -p $(DESTDIR)/usr/$(LIBDIR)
        $(INSTALL_DATA) libxenstore.so $(DESTDIR)/usr/$(LIBDIR)
        $(INSTALL_DATA) xs.h $(DESTDIR)/usr/include
diff -r 87ea297c1d3a -r 8a228cbb69fe tools/xenstore/xs.c
--- a/tools/xenstore/xs.c       Sat Sep  3 16:52:12 2005
+++ b/tools/xenstore/xs.c       Sat Sep  3 16:54:38 2005
@@ -31,14 +31,17 @@
 #include <signal.h>
 #include <stdint.h>
 #include <errno.h>
+#include <sys/ioctl.h>
 #include "xs.h"
 #include "xenstored.h"
 #include "xs_lib.h"
 #include "utils.h"
+#include "xenbus_dev.h"
 
 struct xs_handle
 {
        int fd;
+       enum { SOCK, DEV } type;
 };
 
 /* Get the socket from the store daemon handle.
@@ -65,17 +68,39 @@
                h = malloc(sizeof(*h));
                if (h) {
                        h->fd = sock;
+                       h->type = SOCK;
                        return h;
                }
        }
 
        saved_errno = errno;
        close(sock);
-       free(h);
        errno = saved_errno;
        return NULL;
 }
 
+static struct xs_handle *get_dev(const char *connect_to)
+{
+       int fd, saved_errno;
+       struct xs_handle *h = NULL;
+
+       fd = open(connect_to, O_RDONLY);
+       if (fd < 0)
+               return NULL;
+
+       h = malloc(sizeof(*h));
+       if (h) {
+               h->fd = fd;
+               h->type = DEV;
+               return h;
+       }
+
+       saved_errno = errno;
+       close(fd);
+       errno = saved_errno;
+       return NULL;
+}
+
 struct xs_handle *xs_daemon_open(void)
 {
        return get_socket(xs_daemon_socket());
@@ -84,6 +109,11 @@
 struct xs_handle *xs_daemon_open_readonly(void)
 {
        return get_socket(xs_daemon_socket_ro());
+}
+
+struct xs_handle *xs_domain_open(void)
+{
+       return get_dev(xs_domain_dev());
 }
 
 void xs_daemon_close(struct xs_handle *h)
@@ -160,9 +190,9 @@
 }
 
 /* Send message to xs, get malloc'ed reply.  NULL and set errno on error. */
-static void *xs_talkv(struct xs_handle *h, enum xsd_sockmsg_type type,
-                     const struct iovec *iovec, unsigned int num_vecs,
-                     unsigned int *len)
+static void *xs_talkv_sock(struct xs_handle *h, enum xsd_sockmsg_type type,
+                          const struct iovec *iovec, unsigned int num_vecs,
+                          unsigned int *len)
 {
        struct xsd_sockmsg msg;
        void *ret = NULL;
@@ -220,6 +250,54 @@
        close(h->fd);
        h->fd = -1;
        errno = saved_errno;
+       return NULL;
+}
+
+/* Send message to xs, get malloc'ed reply.  NULL and set errno on error. */
+static void *xs_talkv_dev(struct xs_handle *h, enum xsd_sockmsg_type type,
+                         const struct iovec *iovec, unsigned int num_vecs,
+                         unsigned int *len)
+{
+       struct xenbus_dev_talkv dt;
+       char *buf;
+       int err, buflen = 1024;
+
+ again:
+       buf = malloc(buflen);
+       if (buf == NULL) {
+               errno = ENOMEM;
+               return NULL;
+       }
+       dt.type = type;
+       dt.iovec = (struct kvec *)iovec;
+       dt.num_vecs = num_vecs;
+       dt.buf = buf;
+       dt.len = buflen;
+       err = ioctl(h->fd, IOCTL_XENBUS_DEV_TALKV, &dt);
+       if (err < 0) {
+               free(buf);
+               errno = err;
+               return NULL;
+       }
+       if (err > buflen) {
+               free(buf);
+               buflen = err;
+               goto again;
+       }
+       if (len)
+               *len = err;
+       return buf;
+}
+
+/* Send message to xs, get malloc'ed reply.  NULL and set errno on error. */
+static void *xs_talkv(struct xs_handle *h, enum xsd_sockmsg_type type,
+                     const struct iovec *iovec, unsigned int num_vecs,
+                     unsigned int *len)
+{
+       if (h->type == SOCK)
+               return xs_talkv_sock(h, type, iovec, num_vecs, len);
+       if (h->type == DEV)
+               return xs_talkv_dev(h, type, iovec, num_vecs, len);
        return NULL;
 }
 
diff -r 87ea297c1d3a -r 8a228cbb69fe tools/xenstore/xs.h
--- a/tools/xenstore/xs.h       Sat Sep  3 16:52:12 2005
+++ b/tools/xenstore/xs.h       Sat Sep  3 16:54:38 2005
@@ -30,6 +30,7 @@
  * Returns a handle or NULL.
  */
 struct xs_handle *xs_daemon_open(void);
+struct xs_handle *xs_domain_open(void);
 
 /* Connect to the xs daemon (readonly for non-root clients).
  * Returns a handle or NULL.
diff -r 87ea297c1d3a -r 8a228cbb69fe tools/xenstore/xs_lib.c
--- a/tools/xenstore/xs_lib.c   Sat Sep  3 16:52:12 2005
+++ b/tools/xenstore/xs_lib.c   Sat Sep  3 16:54:38 2005
@@ -64,6 +64,12 @@
        static char buf[PATH_MAX];
        sprintf(buf, "%s/transactions", xs_daemon_rootdir());
        return buf;
+}
+
+const char *xs_domain_dev(void)
+{
+       char *s = getenv("XENSTORED_DOMAIN_DEV");
+       return (s ? s : "/proc/xen/xenbus");
 }
 
 /* Simple routines for writing to sockets, etc. */
diff -r 87ea297c1d3a -r 8a228cbb69fe tools/xenstore/xs_lib.h
--- a/tools/xenstore/xs_lib.h   Sat Sep  3 16:52:12 2005
+++ b/tools/xenstore/xs_lib.h   Sat Sep  3 16:54:38 2005
@@ -48,6 +48,7 @@
 const char *xs_daemon_socket_ro(void);
 const char *xs_daemon_store(void);
 const char *xs_daemon_transactions(void);
+const char *xs_domain_dev(void);
 
 /* Simple write function: loops for you. */
 bool xs_write_all(int fd, const void *data, unsigned int len);
diff -r 87ea297c1d3a -r 8a228cbb69fe tools/xenstore/xenstore_client.c
--- /dev/null   Sat Sep  3 16:52:12 2005
+++ b/tools/xenstore/xenstore_client.c  Sat Sep  3 16:54:38 2005
@@ -0,0 +1,130 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License.  See the file "COPYING" in the main directory of
+ * this archive for more details.
+ *
+ * Copyright (C) 2005 by Christian Limpach
+ *
+ */
+
+#include <err.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xs.h>
+
+static void
+usage(const char *progname)
+{
+#if defined(CLIENT_read)
+    errx(1, "Usage: %s [-h] [-p] key [...]", progname);
+#elif defined(CLIENT_write)
+    errx(1, "Usage: %s [-h] key value [...]", progname);
+#elif defined(CLIENT_rm)
+    errx(1, "Usage: %s [-h] key [...]", progname);
+#endif
+}
+
+int
+main(int argc, char **argv)
+{
+    struct xs_handle *xsh;
+    bool success;
+    int ret = 0;
+#if defined(CLIENT_read)
+    char *val;
+    int prefix = 0;
+#endif
+
+    xsh = xs_domain_open();
+    if (xsh == NULL)
+       err(1, "xs_domain_open");
+
+    while (1) {
+       int c, index = 0;
+       static struct option long_options[] = {
+           {"help", 0, 0, 'h'},
+#if defined(CLIENT_read)
+           {"prefix", 0, 0, 'p'},
+#endif
+           {0, 0, 0, 0}
+       };
+
+       c = getopt_long(argc, argv, "h"
+#if defined(CLIENT_read)
+                       "p"
+#endif
+                       , long_options, &index);
+       if (c == -1)
+           break;
+
+       switch (c) {
+       case 'h':
+           usage(argv[0]);
+           /* NOTREACHED */
+#if defined(CLIENT_read)
+       case 'p':
+           prefix = 1;
+           break;
+#endif
+       }
+    }
+
+    if (optind == argc) {
+       usage(argv[0]);
+       /* NOTREACHED */
+    }
+#if defined(CLIENT_write)
+    if ((argc - optind) % 1) {
+       usage(argv[0]);
+       /* NOTREACHED */
+    }
+#endif
+
+    /* XXX maybe find longest common prefix */
+    success = xs_transaction_start(xsh, "/");
+    if (!success)
+       errx(1, "couldn't start transaction");
+
+    while (optind < argc) {
+#if defined(CLIENT_read)
+       val = xs_read(xsh, argv[optind], NULL);
+       if (val == NULL) {
+           warnx("couldn't read path %s", argv[optind]);
+           ret = 1;
+           goto out;
+       }
+       if (prefix)
+           printf("%s: ", argv[optind]);
+       printf("%s\n", val);
+       free(val);
+       optind++;
+#elif defined(CLIENT_write)
+       success = xs_write(xsh, argv[optind], argv[optind + 1],
+                          strlen(argv[optind + 1]), O_CREAT);
+       if (!success) {
+           warnx("could not write path %s", argv[optind]);
+           ret = 1;
+           goto out;
+       }
+       optind += 2;
+#elif defined(CLIENT_rm)
+       success = xs_rm(xsh, argv[optind]);
+       if (!success) {
+           warnx("could not remove path %s", argv[optind]);
+           ret = 1;
+           goto out;
+       }
+       optind++;
+#endif
+    }
+
+ out:
+    success = xs_transaction_end(xsh, ret ? true : false);
+    if (!success)
+       errx(1, "couldn't end transaction");
+
+    return ret;
+}

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Add support in libxenstore for using the xenbus_dev store connection., Xen patchbot -unstable <=