Files
xen/extras/mini-os/lib/xs.c
T
Ian Campbell debddaa56c nstore: rename public xenstore headers
The xenstore header xs.h is producing conflicts with other software[1].

xs is a too short identifier and does not matche the library. Renaming
the headers to xenstore.h and xenstore_lib.h is the easiest way to make
them easy recognizable and prevent furthe problems.

[1]: http://bugs.debian.org/668550

[ Also update QEMU_TAG, to bring in corresponding change to
qemu-xen-traditional. -iwj ]

Signed-off-by: Bastian Blank <waldi@debian.org>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

--HG--
rename : tools/xenstore/xs.h => tools/xenstore/xenstore.h
rename : tools/xenstore/xs_lib.h => tools/xenstore/xenstore_lib.h
2012-05-14 17:15:36 +01:00

190 lines
4.0 KiB
C

/*
* libxs-compatible layer
*
* Samuel Thibault <Samuel.Thibault@eu.citrix.net>, 2007-2008
*
* Mere wrapper around xenbus_*
*/
#ifdef HAVE_LIBC
#include <os.h>
#include <lib.h>
#include <xenstore.h>
#include <xenbus.h>
#include <stdlib.h>
#include <unistd.h>
static inline int _xs_fileno(struct xs_handle *h) {
return (intptr_t) h;
}
struct xs_handle *xs_daemon_open()
{
int fd = alloc_fd(FTYPE_XENBUS);
files[fd].xenbus.events = NULL;
printk("xs_daemon_open -> %d, %p\n", fd, &files[fd].xenbus.events);
return (void*)(intptr_t) fd;
}
void xs_daemon_close(struct xs_handle *h)
{
int fd = _xs_fileno(h);
struct xenbus_event *event;
for (event = files[fd].xenbus.events; event; event = event->next)
free(event);
files[fd].type = FTYPE_NONE;
}
int xs_fileno(struct xs_handle *h)
{
return _xs_fileno(h);
}
void *xs_read(struct xs_handle *h, xs_transaction_t t,
const char *path, unsigned int *len)
{
char *value;
char *msg;
msg = xenbus_read(t, path, &value);
if (msg) {
printk("xs_read(%s): %s\n", path, msg);
free(msg);
return NULL;
}
if (len)
*len = strlen(value);
return value;
}
bool xs_write(struct xs_handle *h, xs_transaction_t t,
const char *path, const void *data, unsigned int len)
{
char value[len + 1];
char *msg;
memcpy(value, data, len);
value[len] = 0;
msg = xenbus_write(t, path, value);
if (msg) {
printk("xs_write(%s): %s\n", path, msg);
free(msg);
return false;
}
return true;
}
static bool xs_bool(char *reply)
{
if (!reply)
return true;
free(reply);
return false;
}
bool xs_rm(struct xs_handle *h, xs_transaction_t t, const char *path)
{
return xs_bool(xenbus_rm(t, path));
}
static void *xs_talkv(struct xs_handle *h, xs_transaction_t t,
enum xsd_sockmsg_type type,
struct write_req *iovec,
unsigned int num_vecs,
unsigned int *len)
{
struct xsd_sockmsg *msg;
void *ret;
msg = xenbus_msg_reply(type, t, iovec, num_vecs);
ret = malloc(msg->len);
memcpy(ret, (char*) msg + sizeof(*msg), msg->len);
if (len)
*len = msg->len - 1;
free(msg);
return ret;
}
static void *xs_single(struct xs_handle *h, xs_transaction_t t,
enum xsd_sockmsg_type type,
const char *string,
unsigned int *len)
{
struct write_req iovec;
iovec.data = (void *)string;
iovec.len = strlen(string) + 1;
return xs_talkv(h, t, type, &iovec, 1, len);
}
char *xs_get_domain_path(struct xs_handle *h, unsigned int domid)
{
char domid_str[MAX_STRLEN(domid)];
sprintf(domid_str, "%u", domid);
return xs_single(h, XBT_NULL, XS_GET_DOMAIN_PATH, domid_str, NULL);
}
char **xs_directory(struct xs_handle *h, xs_transaction_t t,
const char *path, unsigned int *num)
{
char *msg;
char **entries, **res;
char *entry;
int i, n;
int size;
msg = xenbus_ls(t, path, &res);
if (msg) {
printk("xs_directory(%s): %s\n", path, msg);
return NULL;
}
size = 0;
for (n = 0; res[n]; n++)
size += strlen(res[n]) + 1;
entries = malloc(n * sizeof(char *) + size);
entry = (char *) (&entries[n]);
for (i = 0; i < n; i++) {
int l = strlen(res[i]) + 1;
memcpy(entry, res[i], l);
free(res[i]);
entries[i] = entry;
entry += l;
}
*num = n;
return entries;
}
bool xs_watch(struct xs_handle *h, const char *path, const char *token)
{
int fd = _xs_fileno(h);
printk("xs_watch(%s, %s)\n", path, token);
return xs_bool(xenbus_watch_path_token(XBT_NULL, path, token, &files[fd].xenbus.events));
}
char **xs_read_watch(struct xs_handle *h, unsigned int *num)
{
int fd = _xs_fileno(h);
struct xenbus_event *event;
event = files[fd].xenbus.events;
files[fd].xenbus.events = event->next;
printk("xs_read_watch() -> %s %s\n", event->path, event->token);
*num = 2;
return (char **) &event->path;
}
bool xs_unwatch(struct xs_handle *h, const char *path, const char *token)
{
printk("xs_unwatch(%s, %s)\n", path, token);
return xs_bool(xenbus_unwatch_path_token(XBT_NULL, path, token));
}
#endif