[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] Add an ioctl interface for simple xenstore access
This patch adds an ioctl interface to /proc/xen/xenbus to allow simple access to xenstore from domU. This patch introduces only xenbus_read() support, but write, remove, etc could be easily added. Also, this interface can be easily moved to /dev/xen/xenbus (or something similar) later. The following snippet of a C program provides easy access to xenstore nodes from inside a domU: #include <xen/io/xenbus.h> int main(int argc, char **argv) { int fd; int ret; struct xenbus_ioctl param; fd = open("/proc/xen/xenbus", O_RDWR); strcpy(param.path, argv[1]); ret = ioctl(fd, 0, ¶m); printf("%s\n", param.value); } Comments welcome, of course ;) # HG changeset patch # User Dan Smith <danms@xxxxxxxxxx> # Node ID c01070e1dbed9f19098431fd82120960695f5240 # Parent 96ba0a2bc9de7da1c70a2528481f7448f3a9524d Add a preliminary ioctl interface to xenbus. This patch adds an ioctl interface to /proc/xen/xenbus to allow simple access to xenstore from domU. This patch introduces only xenbus_read() support, but write, remove, etc could be easily added. Also, this interface can be easily moved to /dev/xen/xenbus (or something similar) later. Signed-off-by: Dan Smith <danms@xxxxxxxxxx> diff -r 96ba0a2bc9de -r c01070e1dbed linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Wed Mar 15 13:35:43 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Fri Mar 17 14:27:23 2006 -0800 @@ -208,11 +208,63 @@ static int xenbus_dev_release(struct ino return 0; } +static int xenbus_dev_ioctl(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + void *output; + struct xenbus_ioctl *param; + unsigned int len; + int ret = 0; + + if (!access_ok(VERIFY_WRITE, (void __user *)arg, sizeof(param))) + return -EACCES; + + param = kmalloc(sizeof(*param), GFP_KERNEL); + if (param == NULL) + return -ENOMEM; + + if (copy_from_user(param, (void *)arg, sizeof(*param))) { + ret = -EACCES; + goto out; + } + + param->path[XENBUS_IOCTL_ARG_LEN - 1] = '\0'; + + switch (cmd) { + case XEN_XENBUS_IOCTL_READ: + + output = (char *)xenbus_read(XBT_NULL, param->path, "", &len); + + if (IS_ERR(output)) { + ret = -EINVAL; + goto out; + } + + strncpy(param->value, output, XENBUS_IOCTL_ARG_LEN); + param->value_len = len; + break; + + default: + ret = -EINVAL; + goto out; + } + + if (copy_to_user((void*)arg, param, sizeof(*param))) { + ret = -EACCES; + goto out; + } + + out: + kfree(param); + return ret; +} + static struct file_operations xenbus_dev_file_ops = { .read = xenbus_dev_read, .write = xenbus_dev_write, .open = xenbus_dev_open, .release = xenbus_dev_release, + .ioctl = xenbus_dev_ioctl, }; static int __init diff -r 96ba0a2bc9de -r c01070e1dbed xen/include/public/io/xenbus.h --- a/xen/include/public/io/xenbus.h Wed Mar 15 13:35:43 2006 +0100 +++ b/xen/include/public/io/xenbus.h Fri Mar 17 14:27:23 2006 -0800 @@ -29,6 +29,18 @@ typedef enum } XenbusState; +/* + * XenBus ioctl support + */ +#define XENBUS_IOCTL_ARG_LEN 256 +struct xenbus_ioctl { + char path[XENBUS_IOCTL_ARG_LEN]; + char value[XENBUS_IOCTL_ARG_LEN]; + uint32_t value_len; +}; + +#define XEN_XENBUS_IOCTL_READ 0 + #endif /* _XEN_PUBLIC_IO_XENBUS_H */ /* -- Dan Smith IBM Linux Technology Center Open Hypervisor Team email: danms@xxxxxxxxxx Attachment:
pgpEpWcmLE_Bt.pgp _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |