$NetBSD: patch-ac,v 1.3 2005/07/13 01:28:37 grant Exp $

--- python/xen/lowlevel/xu/xu.c.orig	2005-08-03 23:57:58.000000000 +0000
+++ python/xen/lowlevel/xu/xu.c
@@ -15,7 +15,9 @@
 #include <sys/socket.h>
 #include <sys/mman.h>
 #include <sys/poll.h>
+#ifndef __NetBSD__
 #include <sys/sysmacros.h>
+#endif
 #include <netinet/in.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -25,7 +27,11 @@
 
 #include <xen/xen.h>
 #include <xen/io/domain_controller.h>
+#ifdef __NetBSD__
+#include <xen/NetBSD/xenio.h>
+#else
 #include <xen/linux/privcmd.h>
+#endif
 
 #define XENPKG "xen.lowlevel.xu"
 
@@ -35,6 +41,9 @@
 #endif
 
 /* NB. The following should be kept in sync with the kernel's evtchn driver. */
+#ifdef __NetBSD__
+#define EVTCHN_DEV_NAME  "/dev/xenevt"
+#else
 #define EVTCHN_DEV_NAME  "/dev/xen/evtchn"
 #define EVTCHN_DEV_MAJOR 10
 #define EVTCHN_DEV_MINOR 201
@@ -45,6 +54,7 @@
 #define EVTCHN_BIND   _IO('E', 2)
 /* EVTCHN_UNBIND: Unbind from the specified event-channel port. */
 #define EVTCHN_UNBIND _IO('E', 3)
+#endif
 
 /* Size of a machine page frame. */
 #define PAGE_SIZE 4096
@@ -130,7 +140,11 @@ static PyObject *xu_notifier_bind(PyObje
     if ( !PyArg_ParseTuple(args, "i", &idx) )
         return NULL;
 
+#ifdef __NetBSD__
+    if ( ioctl(xun->evtchn_fd, EVTCHN_BIND, &idx) != 0 )
+#else
     if ( ioctl(xun->evtchn_fd, EVTCHN_BIND, idx) != 0 )
+#endif
         return PyErr_SetFromErrno(PyExc_IOError);
 
     Py_INCREF(Py_None);
@@ -145,7 +159,11 @@ static PyObject *xu_notifier_unbind(PyOb
     if ( !PyArg_ParseTuple(args, "i", &idx) )
         return NULL;
 
+#ifdef __NetBSD__
+    if ( ioctl(xun->evtchn_fd, EVTCHN_UNBIND, &idx) != 0 )
+#else
     if ( ioctl(xun->evtchn_fd, EVTCHN_UNBIND, idx) != 0 )
+#endif
         return PyErr_SetFromErrno(PyExc_IOError);
 
     Py_INCREF(Py_None);
@@ -192,13 +210,16 @@ staticforward PyTypeObject xu_notifier_t
 static PyObject *xu_notifier_new(PyObject *self, PyObject *args)
 {
     xu_notifier_object *xun;
+#ifndef __NetBSD__
     struct stat st;
+#endif
 
     if ( !PyArg_ParseTuple(args, "") )
         return NULL;
 
     xun = PyObject_New(xu_notifier_object, &xu_notifier_type);
 
+#ifndef __NetBSD__
     /* Make sure any existing device file links to correct device. */
     if ( (lstat(EVTCHN_DEV_NAME, &st) != 0) ||
          !S_ISCHR(st.st_mode) ||
@@ -206,14 +227,17 @@ static PyObject *xu_notifier_new(PyObjec
         (void)unlink(EVTCHN_DEV_NAME);
 
  reopen:
+#endif
     xun->evtchn_fd = open(EVTCHN_DEV_NAME, O_NONBLOCK|O_RDWR);
     if ( xun->evtchn_fd == -1 )
     {
+#ifndef __NetBSD__
         if ( (errno == ENOENT) &&
              ((mkdir("/dev/xen", 0755) == 0) || (errno == EEXIST)) &&
              (mknod(EVTCHN_DEV_NAME, S_IFCHR|0600, 
                     makedev(EVTCHN_DEV_MAJOR,EVTCHN_DEV_MINOR)) == 0) )
             goto reopen;
+#endif
         PyObject_Del((PyObject *)xun);
         return PyErr_SetFromErrno(PyExc_IOError);
     }
@@ -508,7 +532,7 @@ static PyObject *xu_message_get_payload(
         return dict;
     }
 
-    return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length);
+    return PyString_FromStringAndSize((char *)xum->msg.msg, xum->msg.length);
 }
 
 static PyObject *xu_message_get_header(PyObject *self, PyObject *args)
@@ -1110,7 +1134,8 @@ static PyObject *xu_port_new(PyObject *s
          * The control-interface event channel for DOM0 is already set up.
          * We use an ioctl to discover the port at our end of the channel.
          */
-        port1 = ioctl(xup->xc_handle, IOCTL_PRIVCMD_INITDOMAIN_EVTCHN, NULL);
+        if (ioctl(xup->xc_handle, IOCTL_PRIVCMD_INITDOMAIN_EVTCHN, &port1))
+            port1 = -1;
         port2 = -1; /* We don't need the remote end of the DOM0 link. */
         if ( port1 < 0 )
         {
