diff options
author | Stefano Stabellini <sstabellini@xensource.com> | 2010-12-13 17:15:31 +0000 |
---|---|---|
committer | Stefano Stabellini <sstabellini@xensource.com> | 2010-12-13 17:15:31 +0000 |
commit | 999241f7aa459cfa20c6b122374eb4c62c10c5a9 (patch) | |
tree | 3b27625788039716621ee426c912d916cebabd60 /tools/xenstore/xs.c | |
parent | 2610f0b28d31a6fd19c271f229189c68d14ad54f (diff) | |
download | xen-999241f7aa459cfa20c6b122374eb4c62c10c5a9.tar.gz xen-999241f7aa459cfa20c6b122374eb4c62c10c5a9.tar.bz2 xen-999241f7aa459cfa20c6b122374eb4c62c10c5a9.zip |
Adds an open xenstore connection function which tries to use the xenbus
interface (xs_domain_open) when the socket interface (xs_daemon_opn)
fails.
Signed-off-by: Mihir Nanavati <mihirn@cs.ubc.ca>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
committer: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'tools/xenstore/xs.c')
-rw-r--r-- | tools/xenstore/xs.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c index 112feec8a5..f3532b03c1 100644 --- a/tools/xenstore/xs.c +++ b/tools/xenstore/xs.c @@ -182,12 +182,15 @@ error: return -1; } -static int get_dev(const char *connect_to) +static int get_dev(const char *connect_to, unsigned long flags) { - return open(connect_to, O_RDWR); + if (flags & XS_OPEN_READONLY) + return open(connect_to, O_RDONLY); + else + return open(connect_to, O_RDWR); } -static struct xs_handle *get_handle(const char *connect_to) +static struct xs_handle *get_handle(const char *connect_to, unsigned long flags) { struct stat buf; struct xs_handle *h = NULL; @@ -199,7 +202,7 @@ static struct xs_handle *get_handle(const char *connect_to) if (S_ISSOCK(buf.st_mode)) fd = get_socket(connect_to); else - fd = get_dev(connect_to); + fd = get_dev(connect_to, flags); if (fd == -1) return NULL; @@ -237,17 +240,32 @@ static struct xs_handle *get_handle(const char *connect_to) struct xs_handle *xs_daemon_open(void) { - return get_handle(xs_daemon_socket()); + return xs_open(0); } struct xs_handle *xs_daemon_open_readonly(void) { - return get_handle(xs_daemon_socket_ro()); + return xs_open(XS_OPEN_READONLY); } struct xs_handle *xs_domain_open(void) { - return get_handle(xs_domain_dev()); + return xs_open(0); +} + +struct xs_handle *xs_open(unsigned long flags) +{ + struct xs_handle *xsh = NULL; + + if (flags & XS_OPEN_READONLY) + xsh = get_handle(xs_daemon_socket_ro(), flags); + else + xsh = get_handle(xs_daemon_socket(), flags); + + if (!xsh) + xsh = get_handle(xs_domain_dev(), flags); + + return xsh; } static void close_free_msgs(struct xs_handle *h) { @@ -303,6 +321,12 @@ void xs_daemon_close(struct xs_handle *h) close_fds_free(h); } +void xs_close(struct xs_handle* xsh) +{ + if (xsh) + xs_daemon_close(xsh); +} + static bool read_all(int fd, void *data, unsigned int len) { while (len) { |