[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] Virtual frame buffer: user space backend
Straightforward conversion to Xenstore. Applies to hg repository at http://hg.codemonkey.ws/vncfb Signed-off-by: Markus Armbruster <armbru@xxxxxxxxxx> diff -r f67e0a168879 Makefile --- a/Makefile Tue Jan 24 16:14:00 2006 -0500 +++ b/Makefile Mon Jun 26 09:20:04 2006 +0200 @@ -2,7 +2,7 @@ CFLAGS += -g -Wall ifneq ($(XENDIR),) CFLAGS += -I$(XENDIR)/tools/libxc -I$(XENDIR)/linux-2.6.12-xenU/include -LDFLAGS += -L$(XENDIR)/tools/libxc +LDFLAGS += -L$(XENDIR)/tools/libxc -L$(XENDIR)/tools/xenstore endif all: vncfb sdlfb @@ -13,7 +13,7 @@ sdlfb: sdlfb.o xenfb.o sdlfb: sdlfb.o xenfb.o sdlfb.o: CFLAGS += $(shell sdl-config --cflags) -sdlfb: LDLIBS += $(shell sdl-config --libs) -lxenctrl +sdlfb: LDLIBS += $(shell sdl-config --libs) -lxenctrl -lxenstore clean: $(RM) *.o *~ vncfb @@ -22,4 +22,4 @@ keymapping.o: CFLAGS += $(shell pkg-conf vncfb: vncfb.o xenfb.o keymapping.o vncfb.o: CFLAGS += $(shell libvncserver-config --cflags) -vncfb: LDLIBS += $(shell libvncserver-config --libs) -lxenctrl +vncfb: LDLIBS += $(shell libvncserver-config --libs) -lxenctrl -lxenstore diff -r f67e0a168879 xenfb.c --- a/xenfb.c Tue Jan 24 16:14:00 2006 -0500 +++ b/xenfb.c Mon Jun 26 09:20:04 2006 +0200 @@ -16,6 +16,7 @@ #include <stdio.h> #include <string.h> #include <time.h> +#include <xs.h> #include "xenfb.h" @@ -140,13 +141,46 @@ static int xenfb_kbd_event(struct xenfb_ return -1; } +static char *xenfb_path_in_dom(struct xs_handle *h, + unsigned domid, const char *path, + char *buffer, size_t size) +{ + char *domp = xs_get_domain_path(h, domid); + int n = snprintf(buffer, size, "%s/%s", domp, path); + free(domp); + if (n >= size) + return NULL; + return buffer; +} + +static int xenfb_xs_scanf1(struct xs_handle *xsh, unsigned domid, + const char *path, const char *fmt, + void *dest) +{ + char buffer[1024]; + char *p; + int ret; + + p = xenfb_path_in_dom(xsh, domid, path, buffer, sizeof(buffer)); + p = xs_read(xsh, XBT_NULL, p, NULL); + if (!p) + return -ENOENT; + ret = sscanf(p, fmt, dest); + free(p); + if (ret != 1) + return -EDOM; + return 0; +} + bool xenfb_set_domid(struct xenfb *xenfb_pub, int domid) { struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub; char buffer[1024]; - FILE *f; + struct xs_handle *xsh; + unsigned dummy; + int ret; + char *p, **vec; struct ioctl_evtchn_bind_interdomain bind; - time_t timeout; if (xenfb->domid != -1) { xenfb_unset_domid(xenfb); @@ -154,47 +188,53 @@ bool xenfb_set_domid(struct xenfb *xenfb return true; } - printf("%d\n", __LINE__); - - snprintf(buffer, sizeof(buffer), "/var/run/xenfb/%d.mfn", domid); - timeout = time(0); - do { - f = fopen(buffer, "r"); - if (!f) { - struct timeval tv = { 0, 500 }; - select(0, NULL, NULL, NULL, &tv); - } - } while (f == NULL && (timeout + 10) > time(0)); - - if (!f || fscanf(f, "%lu", &xenfb->fbdev_mfn) != 1) + xsh = xs_daemon_open_readonly(); + if (!xsh) + goto error; + + p = xenfb_path_in_dom(xsh, domid, "vfb", buffer, sizeof(buffer)); + if (!xs_watch(xsh, p, "")) goto error; - fclose(f); f = NULL; - - printf("%d\n", __LINE__); - - snprintf(buffer, sizeof(buffer), "/var/run/xenfb/%d.evtchn", domid); - f = fopen(buffer, "r"); - if (!f || fscanf(f, "%d", &xenfb->fbdev_evtchn) != 1) + p = xenfb_path_in_dom(xsh, domid, "vkbd", buffer, sizeof(buffer)); + if (!xs_watch(xsh, p, "")) goto error; - fclose(f); f = NULL; - - printf("%d\n", __LINE__); - - snprintf(buffer, sizeof(buffer), "/var/run/xenkbd/%d.mfn", domid); - f = fopen(buffer, "r"); - if (!f || fscanf(f, "%lu", &xenfb->kbd_mfn) != 1) - goto error; - fclose(f); f = NULL; - - printf("%d\n", __LINE__); - - snprintf(buffer, sizeof(buffer), "/var/run/xenkbd/%d.evtchn", domid); - f = fopen(buffer, "r"); - if (!f || fscanf(f, "%d", &xenfb->kbd_evtchn) != 1) - goto error; - fclose(f); f = NULL; - - printf("%d\n", __LINE__); + + for (;;) { + ret = xenfb_xs_scanf1(xsh, domid, "vfb/page-ref", "%lu", + &xenfb->fbdev_mfn); + if (ret == -ENOENT) + goto wait; + if (ret < 0) + goto error; + ret = xenfb_xs_scanf1(xsh, domid, "vfb/event-channel", "%u", + &xenfb->fbdev_evtchn); + if (ret == -ENOENT) + goto wait; + if (ret < 0) + goto error; + ret = xenfb_xs_scanf1(xsh, domid, "vkbd/page-ref", "%lu", + &xenfb->kbd_mfn); + if (ret == -ENOENT) + goto wait; + if (ret < 0) + goto error; + ret = xenfb_xs_scanf1(xsh, domid, "vkbd/event-channel", "%u", + &xenfb->kbd_evtchn); + if (ret == -ENOENT) + goto wait; + if (ret < 0) + goto error; + break; + + wait: + printf("Waiting...\n"); + vec = xs_read_watch(xsh, &dummy); + if (!vec) + goto error; + free(vec); + } + xs_daemon_close(xsh); + xsh = NULL; printf("%d, %d, %d\n", xenfb->fd, xenfb->fbdev_evtchn, domid); @@ -312,9 +352,9 @@ bool xenfb_set_domid(struct xenfb *xenfb } error: printf("%d\n", __LINE__); - if (f) { - int serrno = errno; - fclose(f); + if (xsh) { + int serrno = errno; + xs_daemon_close(xsh); errno = serrno; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |