[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] g/c unused xu extension.



# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 4e4aac33809faf1344b897b517ae5cfc9f7883f7
# Parent  0e2b1e04d4cb536c7c24001e3a0127e05559e238
g/c unused xu extension.
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r 0e2b1e04d4cb -r 4e4aac33809f tools/python/setup.py
--- a/tools/python/setup.py     Wed Sep  7 18:28:04 2005
+++ b/tools/python/setup.py     Wed Sep  7 18:37:55 2005
@@ -7,10 +7,8 @@
 extra_compile_args  = [ "-fno-strict-aliasing", "-Wall", "-Werror" ]
 
 
-include_dirs = [ XEN_ROOT + "/tools/python/xen/lowlevel/xu",
-                 XEN_ROOT + "/tools/libxc",
+include_dirs = [ XEN_ROOT + "/tools/libxc",
                  XEN_ROOT + "/tools/xenstore",
-                 XEN_ROOT + "/tools/xcs",
                  ]
 
 library_dirs = [ XEN_ROOT + "/tools/libxc",
@@ -25,13 +23,6 @@
                library_dirs       = library_dirs,
                libraries          = libraries,
                sources            = [ "xen/lowlevel/xc/xc.c" ])
-
-xu = Extension("xu",
-               extra_compile_args = extra_compile_args,
-               include_dirs       = include_dirs + [ "xen/lowlevel/xu" ],
-               library_dirs       = library_dirs,
-               libraries          = libraries,
-               sources            = [ "xen/lowlevel/xu/xu.c" ])
 
 xs = Extension("xs",
                extra_compile_args = extra_compile_args,
@@ -51,10 +42,10 @@
                          'xen.xend.xenstore',
                          'xen.xm',
                          'xen.web',
-                                                'xen.sv'
+                         'xen.sv'
                          ],
       ext_package = "xen.lowlevel",
-      ext_modules = [ xc, xu, xs ]
+      ext_modules = [ xc, xs ]
       )
 
 os.chdir('logging')
diff -r 0e2b1e04d4cb -r 4e4aac33809f tools/python/xen/xend/server/channel.py
--- a/tools/python/xen/xend/server/channel.py   Wed Sep  7 18:28:04 2005
+++ b/tools/python/xen/xend/server/channel.py   Wed Sep  7 18:37:55 2005
@@ -19,7 +19,6 @@
 import select
 
 import xen.lowlevel.xc; xc = xen.lowlevel.xc.new()
-from xen.lowlevel import xu
 
 from xen.xend.XendLogging import log
 
diff -r 0e2b1e04d4cb -r 4e4aac33809f tools/python/xen/lowlevel/xu/xu.c
--- a/tools/python/xen/lowlevel/xu/xu.c Wed Sep  7 18:28:04 2005
+++ /dev/null   Wed Sep  7 18:37:55 2005
@@ -1,1781 +0,0 @@
-/******************************************************************************
- * utils.c
- * 
- * Copyright (c) 2004, K A Fraser
- */
-
-#include <Python.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/mman.h>
-#include <sys/poll.h>
-#include <sys/sysmacros.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <signal.h>
-#include <xenctrl.h>
-
-#include <xen/xen.h>
-#include <xen/io/domain_controller.h>
-#include <xen/linux/privcmd.h>
-
-#define XENPKG "xen.lowlevel.xu"
-
-/* Needed for Python versions earlier than 2.3. */
-#ifndef PyMODINIT_FUNC
-#define PyMODINIT_FUNC DL_EXPORT(void)
-#endif
-
-/* NB. The following should be kept in sync with the kernel's evtchn driver. */
-#define EVTCHN_DEV_NAME  "/dev/xen/evtchn"
-#define EVTCHN_DEV_MAJOR 10
-#define EVTCHN_DEV_MINOR 201
-/* /dev/xen/evtchn ioctls: */
-/* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */
-#define EVTCHN_RESET  _IO('E', 1)
-/* EVTCHN_BIND: Bind to teh specified event-channel port. */
-#define EVTCHN_BIND   _IO('E', 2)
-/* EVTCHN_UNBIND: Unbind from the specified event-channel port. */
-#define EVTCHN_UNBIND _IO('E', 3)
-
-/* Set the close-on-exec flag on a file descriptor.  Doesn't currently bother
- * to check for errors. */
-/*
-static void set_cloexec(int fd)
-{
-    int flags = fcntl(fd, F_GETFD, 0);
-
-    if ( flags < 0 )
-       return;
-
-    flags |= FD_CLOEXEC;
-    fcntl(fd, F_SETFD, flags);
-}
-*/
-/*
- * *********************** XCS INTERFACE ***********************
- */
-
-#include <arpa/inet.h>
-#include <xcs_proto.h>
-
-static int xcs_ctrl_fd = -1; /* control connection to the xcs server. */
-static int xcs_data_fd = -1; /*    data connection to the xcs server. */
-static unsigned long  xcs_session_id = 0;
-
-static int xcs_ctrl_send(xcs_msg_t *msg);
-static int xcs_ctrl_read(xcs_msg_t *msg);
-static int xcs_data_send(xcs_msg_t *msg);
-static int xcs_data_read(xcs_msg_t *msg);
-
-static int xcs_connect(char *path)
-{
-    struct sockaddr_un addr;
-    int ret, len, flags;
-    xcs_msg_t msg;
-
-    if (xcs_data_fd != -1) /* already connected */
-        return 0;
-    
-    xcs_ctrl_fd = socket(AF_UNIX, SOCK_STREAM, 0);
-    if (xcs_ctrl_fd < 0)
-    {
-        printf("error creating xcs socket!\n");
-        goto fail;
-    }
-    
-    addr.sun_family = AF_UNIX;
-    strcpy(addr.sun_path, path);
-    len = sizeof(addr.sun_family) + strlen(addr.sun_path) + 1;
-
-    ret = connect(xcs_ctrl_fd, (struct sockaddr *)&addr, len);
-    if (ret < 0) 
-    {
-        printf("error connecting to xcs(ctrl)! (%d)\n", errno);
-        goto ctrl_fd_fail;
-    }
-
-    /*set_cloexec(xcs_ctrl_fd);*/
-            
-    msg.type = XCS_CONNECT_CTRL;
-    msg.u.connect.session_id = xcs_session_id;
-    xcs_ctrl_send(&msg);
-    xcs_ctrl_read(&msg); /* TODO: timeout + error! */
-    
-    if (msg.result != XCS_RSLT_OK)
-    {
-        printf("error connecting xcs control channel!\n");
-        goto ctrl_fd_fail;
-    }
-    xcs_session_id = msg.u.connect.session_id;
-    
-    /* now the data connection. */
-    xcs_data_fd = socket(AF_UNIX, SOCK_STREAM, 0);
-    if (xcs_data_fd < 0)
-    {
-        printf("error creating xcs data socket!\n");
-        goto ctrl_fd_fail;
-    }
-    
-    addr.sun_family = AF_UNIX;
-    strcpy(addr.sun_path, path);
-    len = sizeof(addr.sun_family) + strlen(addr.sun_path) + 1;
-    
-    ret = connect(xcs_data_fd, (struct sockaddr *)&addr, len);
-    if (ret < 0) 
-    {
-        printf("error connecting to xcs(data)! (%d)\n", errno);
-        goto data_fd_fail;
-    }
-
-    //set_cloexec(xcs_data_fd);
-    msg.type = XCS_CONNECT_DATA;
-    msg.u.connect.session_id = xcs_session_id;
-    xcs_data_send(&msg);
-    xcs_data_read(&msg); /* TODO: timeout + error! */
-    
-    if (msg.result != XCS_RSLT_OK)
-    {
-        printf("error connecting xcs control channel!\n");
-        goto ctrl_fd_fail;
-    }
-    
-    if ( ((flags = fcntl(xcs_data_fd, F_GETFL, 0)) < 0) ||
-        (fcntl(xcs_data_fd, F_SETFL, flags | O_NONBLOCK) < 0) )
-    {
-        printf("Unable to set non-blocking status on data socket.");
-        goto data_fd_fail;
-    }
-    
-    return 0;
-
-data_fd_fail: 
-    close(xcs_data_fd);  
-    xcs_data_fd = -1;  
-    
-ctrl_fd_fail:
-    close(xcs_ctrl_fd);
-    xcs_ctrl_fd = -1; 
-     
-fail:
-    return -1;
-    
-}
-
-static void xcs_disconnect(void)
-{
-    close(xcs_data_fd);
-    xcs_data_fd = -1;
-    close(xcs_ctrl_fd);
-    xcs_ctrl_fd = -1;
-}
-
-static int xcs_ctrl_read(xcs_msg_t *msg)
-{
-    int ret;
-    
-    ret = read(xcs_ctrl_fd, msg, sizeof(xcs_msg_t));
-    return ret;
-}
-
-static int xcs_ctrl_send(xcs_msg_t *msg)
-{
-    int ret;
-    
-    ret = send(xcs_ctrl_fd, msg, sizeof(xcs_msg_t), 0);
-    return ret;
-}
-
-static int xcs_data_read(xcs_msg_t *msg)
-{
-    int ret;
-    
-    ret = read(xcs_data_fd, msg, sizeof(xcs_msg_t));
-    return ret;
-}
-
-static int xcs_data_send(xcs_msg_t *msg)
-{
-    int ret;
-    
-    ret = send(xcs_data_fd, msg, sizeof(xcs_msg_t), 0);
-    return ret;
-}
-
-
-typedef struct kme_st {
-    xcs_msg_t         msg;
-    struct kme_st    *next;
-} xcs_msg_ent_t;
-    
-
-#define XCS_RING_SIZE 64
-static xcs_msg_ent_t *req_ring[64];
-static unsigned req_prod = 0;
-static unsigned req_cons = 0;
-
-static xcs_msg_ent_t *rsp_ring[64];
-static unsigned rsp_prod = 0;
-static unsigned rsp_cons = 0;
-
-#define REQ_RING_ENT(_idx) (req_ring[(_idx) % XCS_RING_SIZE])
-#define RSP_RING_ENT(_idx) (rsp_ring[(_idx) % XCS_RING_SIZE]) 
-#define REQ_RING_FULL ( req_prod - req_cons == XCS_RING_SIZE )
-#define RSP_RING_FULL ( rsp_prod - rsp_cons == XCS_RING_SIZE )
-#define REQ_RING_EMPTY ( req_prod == req_cons )
-#define RSP_RING_EMPTY ( rsp_prod == rsp_cons )
-/*
- * *********************** NOTIFIER ***********************
- */
-
-typedef struct {
-    PyObject_HEAD;
-    int evtchn_fd;
-} xu_notifier_object;
-
-static PyObject *xu_notifier_read(PyObject *self, PyObject *args)
-{
-    xcs_msg_ent_t *ent;
-    int ret;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-         
-    while ((!REQ_RING_FULL) && (!RSP_RING_FULL))
-    {
-        ent = (xcs_msg_ent_t *)malloc(sizeof(xcs_msg_ent_t));
-        ret = xcs_data_read(&ent->msg);
-
-        if (ret == -1)
-        {
-            free(ent);
-            if ( errno == EINTR )
-                continue;
-            if ( errno == EAGAIN )
-                break;
-            return PyErr_SetFromErrno(PyExc_IOError);
-        }
-        
-        switch (ent->msg.type)
-        {
-        case XCS_REQUEST:
-            REQ_RING_ENT(req_prod) = ent;
-            req_prod++;
-            continue;
-
-        case XCS_RESPONSE:
-            RSP_RING_ENT(rsp_prod) = ent;
-            rsp_prod++;
-            continue;
-            
-        case XCS_VIRQ:
-            ret = ent->msg.u.control.local_port;
-            free(ent);
-            return PyInt_FromLong(ret);
-
-        default:
-            /*printf("Throwing away xcs msg type: %u\n", ent->msg.type);*/
-            free(ent);
-        }
-    }
-    
-    if (!REQ_RING_EMPTY) 
-    {
-        return 
PyInt_FromLong(REQ_RING_ENT(req_cons)->msg.u.control.local_port); 
-    }
-    
-    if (!RSP_RING_EMPTY) 
-    {
-        return 
PyInt_FromLong(RSP_RING_ENT(rsp_cons)->msg.u.control.local_port); 
-    }
-    
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *xu_notifier_bind_virq(PyObject *self, 
-            PyObject *args, PyObject *kwds)
-{
-    int virq;
-    xcs_msg_t kmsg;
-
-    static char *kwd_list[] = { "virq", NULL };
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &virq) )
-        return NULL;
-    
-    kmsg.type = XCS_VIRQ_BIND;
-    kmsg.u.virq.virq  = virq;
-    xcs_ctrl_send(&kmsg);
-    xcs_ctrl_read(&kmsg);
-    
-    if ( kmsg.result != XCS_RSLT_OK )
-    {  
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    
-    return PyInt_FromLong(kmsg.u.virq.port);
-}
-
-static PyObject *xu_notifier_virq_send(PyObject *self, 
-            PyObject *args, PyObject *kwds)
-{
-    int port;
-    xcs_msg_t kmsg;
-
-    static char *kwd_list[] = { "port", NULL };
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &port) )
-        return NULL;
-    
-    kmsg.type = XCS_VIRQ;
-    kmsg.u.control.local_port  = port;
-    xcs_ctrl_send(&kmsg);
-    xcs_ctrl_read(&kmsg);
-    
-    if ( kmsg.result != XCS_RSLT_OK )
-    {  
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    
-    return PyInt_FromLong(kmsg.u.virq.port);
-}
-
-static PyObject *xu_notifier_fileno(PyObject *self, PyObject *args)
-{
-    return PyInt_FromLong(xcs_data_fd);
-}
-
-static PyMethodDef xu_notifier_methods[] = {
-    { "read",
-      (PyCFunction)xu_notifier_read,
-      METH_VARARGS,
-      "Read a @port with pending notifications.\n" },
-
-    { "bind_virq",
-      (PyCFunction)xu_notifier_bind_virq,
-      METH_VARARGS | METH_KEYWORDS,
-      "Get notifications for a virq.\n" 
-      " virq [int]: VIRQ to bind.\n\n" },
-      
-    { "virq_send",
-      (PyCFunction)xu_notifier_virq_send,
-      METH_VARARGS | METH_KEYWORDS,
-      "Fire a virq notification.\n" 
-      " port [int]: port that VIRQ is bound to.\n\n" },
-
-    { "fileno", 
-      (PyCFunction)xu_notifier_fileno,
-      METH_VARARGS,
-      "Return the file descriptor for the notification channel.\n" },
-
-    { NULL, NULL, 0, NULL }
-};
-
-staticforward PyTypeObject xu_notifier_type;
-
-/* connect to xcs if we aren't already, and return a dummy object. */
-static PyObject *xu_notifier_new(PyObject *self, PyObject *args)
-{
-    xu_notifier_object *xun;
-    int i;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    xun = PyObject_New(xu_notifier_object, &xu_notifier_type);
-
-    for (i = 0; i < XCS_RING_SIZE; i++) 
-        REQ_RING_ENT(i) = RSP_RING_ENT(i) = NULL;
-    
-    (void)xcs_connect(XCS_SUN_PATH);
-    
-
-    return (PyObject *)xun;
-}
-
-static PyObject *xu_notifier_getattr(PyObject *obj, char *name)
-{
-    return Py_FindMethod(xu_notifier_methods, obj, name);
-}
-
-static void xu_notifier_dealloc(PyObject *self)
-{
-    xcs_disconnect();
-    PyObject_Del(self);
-}
-
-static PyTypeObject xu_notifier_type = {
-    PyObject_HEAD_INIT(&PyType_Type)
-    0,
-    "notifier",
-    sizeof(xu_notifier_object),
-    0,
-    xu_notifier_dealloc, /* tp_dealloc     */
-    NULL,                /* tp_print       */
-    xu_notifier_getattr, /* tp_getattr     */
-    NULL,                /* tp_setattr     */
-    NULL,                /* tp_compare     */
-    NULL,                /* tp_repr        */
-    NULL,                /* tp_as_number   */
-    NULL,                /* tp_as_sequence */
-    NULL,                /* tp_as_mapping  */
-    NULL                 /* tp_hash        */
-};
-
-
-
-/*
- * *********************** MESSAGE ***********************
- */
-
-#define TYPE(_x,_y) (((_x)<<8)|(_y))
-
-#define P2C(_struct, _field, _ctype)                                      \
-    do {                                                                  \
-        PyObject *obj;                                                    \
-        if ( (obj = PyDict_GetItemString(payload, #_field)) != NULL )     \
-        {                                                                 \
-            if ( PyInt_Check(obj) )                                       \
-            {                                                             \
-                ((_struct *)&xum->msg.msg[0])->_field =                   \
-                  (_ctype)PyInt_AsLong(obj);                              \
-                dict_items_parsed++;                                      \
-            }                                                             \
-            else if ( PyLong_Check(obj) )                                 \
-            {                                                             \
-                ((_struct *)&xum->msg.msg[0])->_field =                   \
-                  (_ctype)PyLong_AsUnsignedLongLong(obj);                 \
-                dict_items_parsed++;                                      \
-            }                                                             \
-        }                                                                 \
-        xum->msg.length = sizeof(_struct);                                \
-    } while ( 0 )
-
-/** Set a char[] field in a struct from a Python string.
- * Can't do this in P2C because of the typing.
- */
-#define P2CSTRING(_struct, _field)                                        \
-    do {                                                                  \
-        PyObject *obj;                                                    \
-        if ( (obj = PyDict_GetItemString(payload, #_field)) != NULL )     \
-        {                                                                 \
-            if ( PyString_Check(obj) )                                    \
-            {                                                             \
-                _struct * _cobj = (_struct *)&xum->msg.msg[0];            \
-                int _field_n = sizeof(_cobj->_field);                     \
-                memset(_cobj->_field, 0, _field_n);                       \
-                strncpy(_cobj->_field,                                    \
-                        PyString_AsString(obj),                           \
-                        _field_n - 1);                                    \
-                dict_items_parsed++;                                      \
-            }                                                             \
-        }                                                                 \
-        xum->msg.length = sizeof(_struct);                                \
-    } while ( 0 )
-
-#define C2P(_struct, _field, _pytype, _ctype)                             \
-    do {                                                                  \
-        PyObject *obj = Py ## _pytype ## _From ## _ctype                  \
-                        (((_struct *)&xum->msg.msg[0])->_field);          \
-        if ( dict == NULL ) dict = PyDict_New();                          \
-        PyDict_SetItemString(dict, #_field, obj);                         \
-    } while ( 0 )
-
-#define PSTR2CHAR(_struct, _field)                                        \
- do {                                                                     \
-     PyObject *obj;                                                       \
-        if ( (obj = PyDict_GetItemString(payload, #_field)) != NULL )     \
-        {                                                                 \
-            if ( PyString_Check(obj) )                                    \
-            {                                                             \
-                char *buffer = PyString_AsString(obj);                    \
-                                                                          \
-                strcpy(((_struct *)&xum->msg.msg[0])->_field,             \
-                        buffer);                                          \
-                /* Should complain about length - think later */          \
-                dict_items_parsed++;                                      \
-            }                                                             \
-        }                                                                 \
-        xum->msg.length = sizeof(_struct);                                \
- } while ( 0 )
-
-typedef struct {
-    PyObject_HEAD;
-    control_msg_t msg;
-} xu_message_object;
-
-static PyObject *xu_message_append_payload(PyObject *self, PyObject *args)
-{
-    xu_message_object *xum = (xu_message_object *)self;
-    char *str;
-    int len;
-
-    if ( !PyArg_ParseTuple(args, "s#", &str, &len) )
-        return NULL;
-
-    if ( (len + xum->msg.length) > sizeof(xum->msg.msg) )
-    {
-        PyErr_SetString(PyExc_RuntimeError, "out of space in control message");
-        return NULL;
-    }
-
-    memcpy(&xum->msg.msg[xum->msg.length], str, len);
-    xum->msg.length += len;
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *xu_message_set_response_fields(PyObject *self, PyObject *args)
-{
-    xu_message_object *xum = (xu_message_object *)self;
-    PyObject *payload;
-    int dict_items_parsed = 0;
-
-    if ( !PyArg_ParseTuple(args, "O", &payload) )
-        return NULL;
-
-    if ( !PyDict_Check(payload) )
-    {
-        PyErr_SetString(PyExc_TypeError, "payload is not a dictionary");
-        return NULL;
-    }
-
-    switch ( TYPE(xum->msg.type, xum->msg.subtype) )
-    {
-    case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS):
-        P2C(blkif_fe_driver_status_t, max_handle, u32);
-        break;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS):
-        P2C(netif_fe_driver_status_t, max_handle, u32);
-        break;
-    }
-
-    if ( dict_items_parsed != PyDict_Size(payload) )
-    {
-        PyErr_SetString(PyExc_TypeError, "payload contains bad items");
-        return NULL;
-    }
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *xu_message_get_payload(PyObject *self, PyObject *args)
-{
-    xu_message_object *xum = (xu_message_object *)self;
-    PyObject *dict = NULL;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    switch ( TYPE(xum->msg.type, xum->msg.subtype) )
-    {
-    case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_STATUS):
-        C2P(blkif_fe_interface_status_t, handle, Int, Long);
-        C2P(blkif_fe_interface_status_t, status, Int, Long);
-        C2P(blkif_fe_interface_status_t, evtchn, Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS):
-        C2P(blkif_fe_driver_status_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_CONNECT):
-        C2P(blkif_fe_interface_connect_t, handle,      Int, Long);
-        C2P(blkif_fe_interface_connect_t, shmem_frame, Int, Long);
-        C2P(blkif_fe_interface_connect_t, shmem_ref  , Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_DISCONNECT):
-        C2P(blkif_fe_interface_disconnect_t, handle, Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE):
-        C2P(blkif_be_create_t, domid,        Int, Long);
-        C2P(blkif_be_create_t, blkif_handle, Int, Long);
-        C2P(blkif_be_create_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY):
-        C2P(blkif_be_destroy_t, domid,        Int, Long);
-        C2P(blkif_be_destroy_t, blkif_handle, Int, Long);
-        C2P(blkif_be_destroy_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CONNECT):
-        C2P(blkif_be_connect_t, domid,        Int, Long);
-        C2P(blkif_be_connect_t, blkif_handle, Int, Long);
-        C2P(blkif_be_connect_t, shmem_frame,  Int, Long);
-        C2P(blkif_be_connect_t, shmem_ref,    Int, Long);
-        C2P(blkif_be_connect_t, evtchn,       Int, Long);
-        C2P(blkif_be_connect_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DISCONNECT):
-        C2P(blkif_be_disconnect_t, domid,        Int, Long);
-        C2P(blkif_be_disconnect_t, blkif_handle, Int, Long);
-        C2P(blkif_be_disconnect_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE):
-        C2P(blkif_be_vbd_create_t, domid,        Int, Long);
-        C2P(blkif_be_vbd_create_t, blkif_handle, Int, Long);
-        C2P(blkif_be_vbd_create_t, pdevice,      Int, Long);
-        C2P(blkif_be_vbd_create_t, dev_handle,   Int, Long);
-        C2P(blkif_be_vbd_create_t, vdevice,      Int, Long);
-        C2P(blkif_be_vbd_create_t, readonly,     Int, Long);
-        C2P(blkif_be_vbd_create_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_DESTROY):
-        C2P(blkif_be_vbd_destroy_t, domid,        Int, Long);
-        C2P(blkif_be_vbd_destroy_t, blkif_handle, Int, Long);
-        C2P(blkif_be_vbd_destroy_t, vdevice,      Int, Long);
-        C2P(blkif_be_vbd_destroy_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DRIVER_STATUS):
-        C2P(blkif_be_driver_status_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_STATUS):
-        C2P(netif_fe_interface_status_t, handle, Int, Long);
-        C2P(netif_fe_interface_status_t, status, Int, Long);
-        C2P(netif_fe_interface_status_t, evtchn, Int, Long);
-        C2P(netif_fe_interface_status_t, mac[0], Int, Long);
-        C2P(netif_fe_interface_status_t, mac[1], Int, Long);
-        C2P(netif_fe_interface_status_t, mac[2], Int, Long);
-        C2P(netif_fe_interface_status_t, mac[3], Int, Long);
-        C2P(netif_fe_interface_status_t, mac[4], Int, Long);
-        C2P(netif_fe_interface_status_t, mac[5], Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS):
-        C2P(netif_fe_driver_status_t, status,        Int, Long);
-        C2P(netif_fe_driver_status_t, max_handle,    Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_CONNECT):
-        C2P(netif_fe_interface_connect_t, handle,         Int, Long);
-        C2P(netif_fe_interface_connect_t, tx_shmem_frame, Int, Long);
-        C2P(netif_fe_interface_connect_t, tx_shmem_ref,   Int, Long);
-        C2P(netif_fe_interface_connect_t, rx_shmem_frame, Int, Long);
-        C2P(netif_fe_interface_connect_t, rx_shmem_ref,   Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_DISCONNECT):
-        C2P(netif_fe_interface_disconnect_t, handle, Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE):
-        C2P(netif_be_create_t, domid,        Int, Long);
-        C2P(netif_be_create_t, netif_handle, Int, Long);
-        C2P(netif_be_create_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY):
-        C2P(netif_be_destroy_t, domid,        Int, Long);
-        C2P(netif_be_destroy_t, netif_handle, Int, Long);
-        C2P(netif_be_destroy_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREDITLIMIT):
-        C2P(netif_be_creditlimit_t, domid,        Int, Long);
-        C2P(netif_be_creditlimit_t, netif_handle, Int, Long);
-        C2P(netif_be_creditlimit_t, credit_bytes, Int, Long);
-        C2P(netif_be_creditlimit_t, period_usec,  Int, Long);
-        C2P(netif_be_creditlimit_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CONNECT):
-        C2P(netif_be_connect_t, domid,          Int, Long);
-        C2P(netif_be_connect_t, netif_handle,   Int, Long);
-        C2P(netif_be_connect_t, tx_shmem_frame, Int, Long);
-        C2P(netif_be_connect_t, tx_shmem_ref,   Int, Long);
-        C2P(netif_be_connect_t, rx_shmem_frame, Int, Long);
-        C2P(netif_be_connect_t, rx_shmem_ref,   Int, Long);
-        C2P(netif_be_connect_t, evtchn,         Int, Long);
-        C2P(netif_be_connect_t, status,         Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT):
-        C2P(netif_be_disconnect_t, domid,        Int, Long);
-        C2P(netif_be_disconnect_t, netif_handle, Int, Long);
-        C2P(netif_be_disconnect_t, status,       Int, Long);
-        return dict;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS):
-        C2P(netif_be_driver_status_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED):
-        C2P(usbif_fe_interface_status_changed_t, status, Int, Long);
-        C2P(usbif_fe_interface_status_changed_t, evtchn, Int, Long);
-        C2P(usbif_fe_interface_status_changed_t, domid, Int, Long);
-        C2P(usbif_fe_interface_status_changed_t, bandwidth, Int, Long);
-       C2P(usbif_fe_interface_status_changed_t, num_ports, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_DRIVER_STATUS_CHANGED):
-        C2P(usbif_fe_driver_status_changed_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_CONNECT):
-        C2P(usbif_fe_interface_connect_t, shmem_frame, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_DISCONNECT):
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_CREATE):
-        C2P(usbif_be_create_t, domid, Int, Long);
-        C2P(usbif_be_create_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_DESTROY):
-        C2P(usbif_be_destroy_t, domid, Int, Long);
-        C2P(usbif_be_destroy_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_CONNECT):
-        C2P(usbif_be_connect_t, domid, Int, Long);
-        C2P(usbif_be_connect_t, shmem_frame, Int, Long);
-        C2P(usbif_be_connect_t, evtchn, Int, Long);
-        C2P(usbif_be_connect_t, bandwidth, Int, Long);
-        C2P(usbif_be_connect_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_DISCONNECT):
-        C2P(usbif_be_disconnect_t, domid, Int, Long);
-        C2P(usbif_be_disconnect_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_DRIVER_STATUS_CHANGED):
-        C2P(usbif_be_driver_status_changed_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_CLAIM_PORT):
-        C2P(usbif_be_claim_port_t, domid, Int, Long);
-        C2P(usbif_be_claim_port_t, usbif_port, Int, Long);
-        C2P(usbif_be_claim_port_t, status, Int, Long);
-        C2P(usbif_be_claim_port_t, path, String, String);
-        return dict;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_RELEASE_PORT):
-        C2P(usbif_be_release_port_t, path, String, String);
-        return dict;
-    case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
-        C2P(mem_request_t, target, Int, Long);
-        C2P(mem_request_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF):
-        C2P(vcpu_hotplug_t, vcpu, Int, Long);
-        C2P(vcpu_hotplug_t, status, Int, Long);
-        return dict;
-    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON):
-        C2P(vcpu_hotplug_t, vcpu, Int, Long);
-        C2P(vcpu_hotplug_t, status, Int, Long);
-        return dict;
-    }
-
-    return PyString_FromStringAndSize((char *)xum->msg.msg, xum->msg.length);
-}
-
-static PyObject *xu_message_get_header(PyObject *self, PyObject *args)
-{
-    xu_message_object *xum = (xu_message_object *)self;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    return Py_BuildValue("{s:i,s:i,s:i}",
-                         "type",    xum->msg.type,
-                         "subtype", xum->msg.subtype,
-                         "id",      xum->msg.id);
-}
-
-static PyMethodDef xu_message_methods[] = {
-    { "append_payload", 
-      (PyCFunction)xu_message_append_payload,
-      METH_VARARGS,
-      "Append @str to the message payload.\n" },
-
-    { "set_response_fields",
-      (PyCFunction)xu_message_set_response_fields,
-      METH_VARARGS,
-      "Fill in the response fields in a message that was passed to us.\n" },
-
-    { "get_payload",
-      (PyCFunction)xu_message_get_payload,
-      METH_VARARGS,
-      "Return the message payload in string form.\n" },
-
-    { "get_header",
-      (PyCFunction)xu_message_get_header,
-      METH_VARARGS,
-      "Returns a dictionary of values for @type, @subtype, and @id.\n" },
-
-    { NULL, NULL, 0, NULL }
-};
-
-staticforward PyTypeObject xu_message_type;
-
-static PyObject *xu_message_new(PyObject *self, PyObject *args)
-{
-    xu_message_object *xum;
-    int type, subtype, id, dict_items_parsed = 0;
-    PyObject *payload = NULL;
-
-    if ( !PyArg_ParseTuple(args, "iii|O", &type, &subtype, &id, &payload) )
-        return NULL;
-
-    xum = PyObject_New(xu_message_object, &xu_message_type);
-
-    xum->msg.type    = type;
-    xum->msg.subtype = subtype;
-    xum->msg.id      = id;
-    xum->msg.length  = 0;
-
-    if ( payload == NULL )
-        return (PyObject *)xum;
-
-    if ( !PyDict_Check(payload) )
-    {
-        PyErr_SetString(PyExc_TypeError, "payload is not a dictionary");
-        PyObject_Del((PyObject *)xum);
-        return NULL;
-    }
-
-    switch ( TYPE(type, subtype) )
-    {
-    case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_STATUS):
-        P2C(blkif_fe_interface_status_t, handle, u32);
-        P2C(blkif_fe_interface_status_t, status, u32);
-        P2C(blkif_fe_interface_status_t, evtchn, u16);
-        P2C(blkif_fe_interface_status_t, domid,  u16);
-        break;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE):
-        P2C(blkif_be_create_t, domid,        u32);
-        P2C(blkif_be_create_t, blkif_handle, u32);
-        break;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY):
-        P2C(blkif_be_destroy_t, domid,        u32);
-        P2C(blkif_be_destroy_t, blkif_handle, u32);
-        break;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CONNECT):
-        P2C(blkif_be_connect_t, domid,        u32);
-        P2C(blkif_be_connect_t, blkif_handle, u32);
-        P2C(blkif_be_connect_t, shmem_frame,  unsigned long);
-        P2C(blkif_be_connect_t, shmem_ref,    u32);
-        P2C(blkif_be_connect_t, evtchn,       u16);
-        break;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DISCONNECT):
-        P2C(blkif_be_disconnect_t, domid,        u32);
-        P2C(blkif_be_disconnect_t, blkif_handle, u32);
-        break;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE):
-        P2C(blkif_be_vbd_create_t, domid,        u32);
-        P2C(blkif_be_vbd_create_t, blkif_handle, u32);
-        P2C(blkif_be_vbd_create_t, pdevice,      blkif_pdev_t);
-        P2C(blkif_be_vbd_create_t, dev_handle,   u32);
-        P2C(blkif_be_vbd_create_t, vdevice,      blkif_vdev_t);
-        P2C(blkif_be_vbd_create_t, readonly,     u16);
-        break;
-    case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_DESTROY):
-        P2C(blkif_be_vbd_destroy_t, domid,        u32);
-        P2C(blkif_be_vbd_destroy_t, blkif_handle, u32);
-        P2C(blkif_be_vbd_destroy_t, vdevice,      blkif_vdev_t);
-        break;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_STATUS):
-        P2C(netif_fe_interface_status_t, handle, u32);
-        P2C(netif_fe_interface_status_t, status, u32);
-        P2C(netif_fe_interface_status_t, evtchn, u16);
-        P2C(netif_fe_interface_status_t, domid,  u16);
-        P2C(netif_fe_interface_status_t, mac[0], u8);
-        P2C(netif_fe_interface_status_t, mac[1], u8);
-        P2C(netif_fe_interface_status_t, mac[2], u8);
-        P2C(netif_fe_interface_status_t, mac[3], u8);
-        P2C(netif_fe_interface_status_t, mac[4], u8);
-        P2C(netif_fe_interface_status_t, mac[5], u8);
-        break;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE):
-        P2C(netif_be_create_t, domid,        u32);
-        P2C(netif_be_create_t, netif_handle, u32);
-        P2C(netif_be_create_t, mac[0],       u8);
-        P2C(netif_be_create_t, mac[1],       u8);
-        P2C(netif_be_create_t, mac[2],       u8);
-        P2C(netif_be_create_t, mac[3],       u8);
-        P2C(netif_be_create_t, mac[4],       u8);
-        P2C(netif_be_create_t, mac[5],       u8);
-        P2C(netif_be_create_t, be_mac[0],    u8);
-        P2C(netif_be_create_t, be_mac[1],    u8);
-        P2C(netif_be_create_t, be_mac[2],    u8);
-        P2C(netif_be_create_t, be_mac[3],    u8);
-        P2C(netif_be_create_t, be_mac[4],    u8);
-        P2C(netif_be_create_t, be_mac[5],    u8);
-        break;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY):
-        P2C(netif_be_destroy_t, domid,        u32);
-        P2C(netif_be_destroy_t, netif_handle, u32);
-        break;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREDITLIMIT):
-        P2C(netif_be_creditlimit_t, domid,        u32);
-        P2C(netif_be_creditlimit_t, netif_handle, u32);
-        P2C(netif_be_creditlimit_t, credit_bytes, u32);
-        P2C(netif_be_creditlimit_t, period_usec,  u32);
-        break;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CONNECT):
-        P2C(netif_be_connect_t, domid,          u32);
-        P2C(netif_be_connect_t, netif_handle,   u32);
-        P2C(netif_be_connect_t, tx_shmem_frame, unsigned long);
-        P2C(netif_be_connect_t, tx_shmem_ref,   u32); 
-        P2C(netif_be_connect_t, rx_shmem_frame, unsigned long);
-        P2C(netif_be_connect_t, rx_shmem_ref,   u32); 
-        P2C(netif_be_connect_t, evtchn,         u16); 
-        break;
-    case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT):
-        P2C(netif_be_disconnect_t, domid,        u32);
-        P2C(netif_be_disconnect_t, netif_handle, u32);
-        break;
-    case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS):
-        P2C(netif_fe_driver_status_t, status,        u32);
-        P2C(netif_fe_driver_status_t, max_handle,    u32);
-        break;
-    case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
-        P2C(mem_request_t, target, u32);
-        break;
-    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF):
-        P2C(vcpu_hotplug_t, vcpu, u32);
-        P2C(vcpu_hotplug_t, status, u32);
-        break;
-    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON):
-        P2C(vcpu_hotplug_t, vcpu, u32);
-        P2C(vcpu_hotplug_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED):
-        P2C(usbif_fe_interface_status_changed_t, status, u32);
-        P2C(usbif_fe_interface_status_changed_t, evtchn, u16);
-        P2C(usbif_fe_interface_status_changed_t, domid, domid_t);
-        P2C(usbif_fe_interface_status_changed_t, bandwidth, u32);
-       P2C(usbif_fe_interface_status_changed_t, num_ports, u32);
-        break;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_DRIVER_STATUS_CHANGED):
-        P2C(usbif_fe_driver_status_changed_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_CONNECT):
-        P2C(usbif_fe_interface_connect_t, shmem_frame, unsigned long);
-        break;
-    case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_DISCONNECT):
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_CREATE):
-        P2C(usbif_be_create_t, domid, domid_t);
-        P2C(usbif_be_create_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_DESTROY):
-        P2C(usbif_be_destroy_t, domid, domid_t);
-        P2C(usbif_be_destroy_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_CONNECT):
-        P2C(usbif_be_connect_t, domid, domid_t);
-        P2C(usbif_be_connect_t, shmem_frame, unsigned long);
-        P2C(usbif_be_connect_t, evtchn, u32);
-        P2C(usbif_be_connect_t, bandwidth, u32);
-        P2C(usbif_be_connect_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_DISCONNECT):
-        P2C(usbif_be_disconnect_t, domid, domid_t);
-        P2C(usbif_be_disconnect_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_DRIVER_STATUS_CHANGED):
-        P2C(usbif_be_driver_status_changed_t, status, u32);
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_CLAIM_PORT):
-        P2C(usbif_be_claim_port_t, domid, domid_t);
-        P2C(usbif_be_claim_port_t, usbif_port, u32);
-        P2C(usbif_be_claim_port_t, status, u32);
-        PSTR2CHAR(usbif_be_claim_port_t, path);
-        printf("dict items parsed = %d", dict_items_parsed);
-        break;
-    case TYPE(CMSG_USBIF_BE, CMSG_USBIF_BE_RELEASE_PORT):
-        PSTR2CHAR(usbif_be_release_port_t, path);
-        break;
-    case TYPE(CMSG_SHUTDOWN, CMSG_SHUTDOWN_SYSRQ):
-        P2C(shutdown_sysrq_t, key, char);
-        break;
-    }
-
-    if ( dict_items_parsed != PyDict_Size(payload) )
-    {
-        PyErr_SetString(PyExc_TypeError, "payload contains bad items");
-        PyObject_Del((PyObject *)xum);
-        return NULL;
-    }
-
-    return (PyObject *)xum;
-}
-
-static PyObject *xu_message_getattr(PyObject *obj, char *name)
-{
-    xu_message_object *xum;
-    if ( strcmp(name, "MAX_PAYLOAD") == 0 )
-        return PyInt_FromLong(sizeof(xum->msg.msg));
-    return Py_FindMethod(xu_message_methods, obj, name);
-}
-
-static void xu_message_dealloc(PyObject *self)
-{
-    PyObject_Del(self);
-}
-
-static PyTypeObject xu_message_type = {
-    PyObject_HEAD_INIT(&PyType_Type)
-    0,
-    "message",
-    sizeof(xu_message_object),
-    0,
-    xu_message_dealloc,   /* tp_dealloc     */
-    NULL,                /* tp_print       */
-    xu_message_getattr,   /* tp_getattr     */
-    NULL,                /* tp_setattr     */
-    NULL,                /* tp_compare     */
-    NULL,                /* tp_repr        */
-    NULL,                /* tp_as_number   */
-    NULL,                /* tp_as_sequence */
-    NULL,                /* tp_as_mapping  */
-    NULL                 /* tp_hash        */
-};
-
-
-
-/*
- * *********************** PORT ***********************
- */
-
-typedef struct xu_port_object {
-    PyObject_HEAD;
-    int xc_handle;
-    int connected;
-    u32 remote_dom;
-    int local_port, remote_port;
-    struct xu_port_object *fix_next;
-} xu_port_object;
-
-static PyObject *port_error;
-
-static PyObject *xu_port_read_request(PyObject *self, PyObject *args)
-{
-    xu_port_object    *xup = (xu_port_object *)self;
-    xu_message_object *xum;
-    control_msg_t     *cmsg;
-    unsigned          i;
-    xcs_msg_ent_t    *ent = NULL;
-    
-    for ( i = req_cons; (i != req_prod); i++ ) {
-        ent = REQ_RING_ENT(i);
-        if (ent == NULL) 
-            continue;
-        if (ent->msg.u.control.remote_dom == xup->remote_dom)
-            break;
-    }
-    
-    if ((ent == NULL) ||
-        (ent->msg.u.control.remote_dom != xup->remote_dom)) 
-        goto none;
-
-    cmsg = &ent->msg.u.control.msg;
-    xum = PyObject_New(xu_message_object, &xu_message_type);
-    memcpy(&xum->msg, cmsg, sizeof(*cmsg));
-    if ( xum->msg.length > sizeof(xum->msg.msg) )
-        xum->msg.length = sizeof(xum->msg.msg);
-    free(ent);
-    
-    /* remove the entry from the ring and advance the consumer if possible */
-    REQ_RING_ENT(i) = NULL;
-    while ( (REQ_RING_ENT(req_cons) == NULL) && (!REQ_RING_EMPTY) )
-        req_cons++;
-    
-    return (PyObject *)xum;
-    
-none:
-    Py_INCREF(Py_None);
-    return Py_None;
-    
-}
-
-static PyObject *xu_port_write_request(PyObject *self, PyObject *args)
-{
-    xu_port_object    *xup = (xu_port_object *)self;
-    xu_message_object *xum;
-    xcs_msg_t          kmsg;
-
-    if ( !PyArg_ParseTuple(args, "O", (PyObject **)&xum) )
-        return NULL;
-
-    if ( !PyObject_TypeCheck((PyObject *)xum, &xu_message_type) )
-    {
-        PyErr_SetString(PyExc_TypeError, "expected a " XENPKG ".message");
-        return NULL;        
-    }
-
-    kmsg.type = XCS_REQUEST;
-    kmsg.u.control.remote_dom = xup->remote_dom;
-    memcpy(&kmsg.u.control.msg, &xum->msg, sizeof(control_msg_t));
-    xcs_data_send(&kmsg);
-    
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *xu_port_read_response(PyObject *self, PyObject *args)
-{
-    xu_port_object    *xup = (xu_port_object *)self;
-    xu_message_object *xum;
-    control_msg_t     *cmsg;
-    unsigned          i;
-    xcs_msg_ent_t    *ent = NULL;
-    
-    for ( i = rsp_cons; (i != rsp_prod); i++ ) {
-        ent = RSP_RING_ENT(i);
-        if (ent == NULL) 
-            continue;
-        if (ent->msg.u.control.remote_dom == xup->remote_dom)
-            break;
-    }
-    
-    if ((ent == NULL) ||
-        (ent->msg.u.control.remote_dom != xup->remote_dom))
-         goto none;
-
-    cmsg = &ent->msg.u.control.msg;
-    xum = PyObject_New(xu_message_object, &xu_message_type);
-    memcpy(&xum->msg, cmsg, sizeof(*cmsg));
-    if ( xum->msg.length > sizeof(xum->msg.msg) )
-        xum->msg.length = sizeof(xum->msg.msg);
-    free(ent);
-    
-    /* remove the entry from the ring and advance the consumer if possible */
-    RSP_RING_ENT(i) = NULL;
-    while ( (RSP_RING_ENT(rsp_cons) == NULL) && (!RSP_RING_EMPTY) )
-        rsp_cons++;
-    
-    return (PyObject *)xum;
-    
-none:
-    Py_INCREF(Py_None);
-    return Py_None;
-    
-}
-
-static PyObject *xu_port_write_response(PyObject *self, PyObject *args)
-{
-    xu_port_object    *xup = (xu_port_object *)self;
-    xu_message_object *xum;
-    xcs_msg_t          kmsg;
-
-    if ( !PyArg_ParseTuple(args, "O", (PyObject **)&xum) )
-        return NULL;
-
-    if ( !PyObject_TypeCheck((PyObject *)xum, &xu_message_type) )
-    {
-        PyErr_SetString(PyExc_TypeError, "expected a " XENPKG ".message");
-        return NULL;        
-    }
-
-    kmsg.type = XCS_RESPONSE;
-    kmsg.u.control.remote_dom = xup->remote_dom;
-    memcpy(&kmsg.u.control.msg, &xum->msg, sizeof(control_msg_t));
-    xcs_data_send(&kmsg);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *xu_port_request_to_read(PyObject *self, PyObject *args)
-{
-    xu_port_object   *xup = (xu_port_object *)self;
-    xcs_msg_ent_t    *ent;
-    int               found = 0;
-    unsigned          i;
-  
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    for ( i = req_cons; (i != req_prod); i++ ) {
-        ent = REQ_RING_ENT(i);
-        if (ent == NULL) 
-            continue;
-        if (ent->msg.u.control.remote_dom == xup->remote_dom) {
-            found = 1;
-            break;
-        }
-    }
-    
-    return PyInt_FromLong(found);
-}
-
-static PyObject *xu_port_response_to_read(PyObject *self, PyObject *args)
-{
-    xu_port_object   *xup = (xu_port_object *)self;
-    xcs_msg_ent_t    *ent;
-    int               found = 0;
-    unsigned          i;
-  
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    for ( i = rsp_cons; (i != rsp_prod); i++ ) {
-        ent = RSP_RING_ENT(i);
-        if (ent == NULL) 
-            continue;
-        if (ent->msg.u.control.remote_dom == xup->remote_dom) {
-            found = 1;
-            break;
-        }
-    }
-    
-    return PyInt_FromLong(found);
-}
-
-static void _xu_port_close(xu_port_object *xup )
-{
-    if ( xup->connected && xup->remote_dom != 0 )
-    {  
-        xcs_msg_t kmsg;
-        kmsg.type = XCS_CIF_FREE_CC;
-        kmsg.u.interface.dom         = xup->remote_dom;
-        kmsg.u.interface.local_port  = xup->local_port; 
-        kmsg.u.interface.remote_port = xup->remote_port;
-        xcs_ctrl_send(&kmsg);
-        xcs_ctrl_read(&kmsg);
-        xup->connected = 0;
-    }
-}
-
-static PyObject *xu_port_close(PyObject *self, PyObject *args)
-{
-    xu_port_object *xup = (xu_port_object *)self;
-
-    _xu_port_close(xup);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *xu_port_register(PyObject *self, PyObject *args, 
-        PyObject *kwds)
-{
-    int type;
-    xcs_msg_t msg;
-    xu_port_object   *xup = (xu_port_object *)self;
-    static char *kwd_list[] = { "type", NULL };
-
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list,
-                                      &type) )
-        return NULL;
-    
-    if (!xup->connected)
-    {
-        return PyInt_FromLong(0);
-    }
-    
-    msg.type = XCS_MSG_BIND;
-    msg.u.bind.port = xup->local_port;
-    msg.u.bind.type = type;
-    xcs_ctrl_send(&msg);
-    xcs_ctrl_read(&msg);
-    
-    if (msg.result != XCS_RSLT_OK)
-    {
-        return PyInt_FromLong(0);
-    }
-    
-    return PyInt_FromLong(1);        
-}
-
-static PyObject *xu_port_deregister(PyObject *self, PyObject *args,
-        PyObject *kwds)
-{
-    int type;
-    xcs_msg_t msg;
-    xu_port_object   *xup = (xu_port_object *)self;
-    static char *kwd_list[] = { "type", NULL };
-
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list,
-                                      &type) )
-        return NULL;
-
-    if (!xup->connected)
-    {
-        return PyInt_FromLong(0);
-    }
-    
-    msg.type = XCS_MSG_UNBIND;
-    msg.u.bind.port = xup->local_port;
-    msg.u.bind.type = type;
-    xcs_ctrl_send(&msg);
-    xcs_ctrl_read(&msg);
-    
-    if (msg.result != XCS_RSLT_OK)
-    {
-        return PyInt_FromLong(0);
-    }
-    
-    return PyInt_FromLong(1);        
-}
-
-static PyMethodDef xu_port_methods[] = {
-
-    { "read_request",
-      (PyCFunction)xu_port_read_request,
-      METH_VARARGS,
-      "Read a request message from the control interface.\n" },
-
-    { "write_request",
-      (PyCFunction)xu_port_write_request,
-      METH_VARARGS,
-      "Write a request message to the control interface.\n" },
-
-    { "read_response",
-      (PyCFunction)xu_port_read_response,
-      METH_VARARGS,
-      "Read a response message from the control interface.\n" },
-
-    { "write_response",
-      (PyCFunction)xu_port_write_response,
-      METH_VARARGS,
-      "Write a response message to the control interface.\n" },
-
-    { "request_to_read",
-      (PyCFunction)xu_port_request_to_read,
-      METH_VARARGS,
-      "Returns TRUE if there is a request message to read.\n" },
-
-
-    { "response_to_read",
-      (PyCFunction)xu_port_response_to_read,
-      METH_VARARGS,
-      "Returns TRUE if there is a response message to read.\n" },
-
-    { "register",
-      (PyCFunction)xu_port_register,
-      METH_VARARGS | METH_KEYWORDS,
-      "Register to receive a type of message on this channel.\n" },
-      
-    { "deregister",
-      (PyCFunction)xu_port_deregister,
-      METH_VARARGS | METH_KEYWORDS,
-      "Stop receiving a type of message on this port.\n" },
-
-    { "close",
-      (PyCFunction)xu_port_close,
-      METH_VARARGS,
-      "Close the port.\n" },
-
-    { NULL, NULL, 0, NULL }
-};
-
-staticforward PyTypeObject xu_port_type;
-
-static PyObject *xu_port_new(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    xu_port_object *xup;
-    u32 dom;
-    int port1 = 0, port2 = 0;
-    xcs_msg_t kmsg;
-
-    static char *kwd_list[] = { "dom", "local_port", "remote_port", NULL };
-
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|ii", kwd_list,
-                                      &dom, &port1, &port2) )
-        return NULL;
-
-    xup = PyObject_New(xu_port_object, &xu_port_type);
-
-    xup->connected  = 0;
-    xup->remote_dom = dom;
-    
-    kmsg.type = XCS_CIF_NEW_CC;
-    kmsg.u.interface.dom         = xup->remote_dom;
-    kmsg.u.interface.local_port  = port1; 
-    kmsg.u.interface.remote_port = port2;
-    xcs_ctrl_send(&kmsg);
-    xcs_ctrl_read(&kmsg);
-    
-    if ( kmsg.result != XCS_RSLT_OK ) 
-        goto fail1;
-        
-    xup->local_port  = kmsg.u.interface.local_port;
-    xup->remote_port = kmsg.u.interface.remote_port;
-    xup->connected = 1;
-                
-    return (PyObject *)xup;
-
- fail1:
-    PyObject_Del((PyObject *)xup);
-    PyErr_SetString(PyExc_ValueError, "cannot create port");
-    return NULL;
-}
-
-static PyObject *xu_port_getattr(PyObject *obj, char *name)
-{
-    xu_port_object *xup = (xu_port_object *)obj;
-
-    if ( strcmp(name, "local_port") == 0 )
-    {
-        return PyInt_FromLong(xup->connected ? xup->local_port : -1);
-    }
-    if ( strcmp(name, "remote_port") == 0 )
-    {
-        return PyInt_FromLong(xup->connected ? xup->remote_port : -1);
-    }
-    if ( strcmp(name, "remote_dom") == 0 )
-    {
-        return PyInt_FromLong(xup->remote_dom);
-    }
-    if ( strcmp(name, "connected") == 0 )
-    {
-        return PyInt_FromLong(xup->connected);
-    }
-    return Py_FindMethod(xu_port_methods, obj, name);
-}
-
-static void xu_port_dealloc(PyObject *self)
-{
-    xu_port_object *xup = (xu_port_object *)self;
-
-    _xu_port_close(xup);
-
-    PyObject_Del(self);
-}
-
-static PyTypeObject xu_port_type = {
-    PyObject_HEAD_INIT(&PyType_Type)
-    0,
-    "port",
-    sizeof(xu_port_object),
-    0,
-    xu_port_dealloc,     /* tp_dealloc     */
-    NULL,                /* tp_print       */
-    xu_port_getattr,     /* tp_getattr     */
-    NULL,                /* tp_setattr     */
-    NULL,                /* tp_compare     */
-    NULL,                /* tp_repr        */
-    NULL,                /* tp_as_number   */
-    NULL,                /* tp_as_sequence */
-    NULL,                /* tp_as_mapping  */
-    NULL                 /* tp_hash        */
-};
-
-
-
-/*
- * *********************** BUFFER ***********************
- */
-
-#define BUFSZ 65536
-#define MASK_BUF_IDX(_i) ((_i)&(BUFSZ-1))
-typedef unsigned int BUF_IDX;
-
-typedef struct {
-    PyObject_HEAD;
-    char        *buf;
-    unsigned int prod, cons;
-} xu_buffer_object;
-
-static PyObject *__xu_buffer_peek(xu_buffer_object *xub, int max)
-{
-    PyObject *str1, *str2;
-    int len1, len2, c = MASK_BUF_IDX(xub->cons);
-
-    len1 = xub->prod - xub->cons;
-    if ( len1 > (BUFSZ - c) ) /* clip to ring wrap */
-        len1 = BUFSZ - c;
-    if ( len1 > max )         /* clip to specified maximum */
-        len1 = max;
-    if ( len1 < 0 )           /* sanity */
-        len1 = 0;
-
-    if ( (str1 = PyString_FromStringAndSize(&xub->buf[c], len1)) == NULL )
-        return NULL;
-
-    if ( (len1 < (xub->prod - xub->cons)) && (len1 < max) )
-    {
-        len2 = max - len1;
-        if ( len2 > MASK_BUF_IDX(xub->prod) )
-            len2 = MASK_BUF_IDX(xub->prod);
-        if ( len2 > 0 )
-        {
-            str2 = PyString_FromStringAndSize(&xub->buf[0], len2);
-            if ( str2 == NULL )
-                return NULL;
-            PyString_ConcatAndDel(&str1, str2);
-            if ( str1 == NULL )
-                return NULL;
-        }
-    }
-
-    return str1;
-}
-
-static PyObject *xu_buffer_peek(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-    int max = 1024;
-
-    if ( !PyArg_ParseTuple(args, "|i", &max) )
-        return NULL;
-    
-    return __xu_buffer_peek(xub, max);
-}
-
-static PyObject *xu_buffer_read(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-    PyObject *str;
-    int max = 1024;
-
-    if ( !PyArg_ParseTuple(args, "|i", &max) )
-        return NULL;
-
-    if ( (str = __xu_buffer_peek(xub, max)) != NULL )
-        xub->cons += PyString_Size(str);
-
-    return str;
-}
-
-static PyObject *xu_buffer_discard(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-    int max, len;
-
-    if ( !PyArg_ParseTuple(args, "i", &max) )
-        return NULL;
-
-    len = xub->prod - xub->cons;
-    if ( len > max )
-        len = max;
-    if ( len < 0 )
-        len = 0;
-
-    xub->cons += len;
-
-    return PyInt_FromLong(len);
-}
-
-static PyObject *xu_buffer_write(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-    char *str;
-    int len, len1, len2;
-
-    if ( !PyArg_ParseTuple(args, "s#", &str, &len) )
-        return NULL;
-
-    len1 = len;
-    if ( len1 > (BUFSZ - MASK_BUF_IDX(xub->prod)) )
-        len1 = BUFSZ - MASK_BUF_IDX(xub->prod);
-    if ( len1 > (BUFSZ - (xub->prod - xub->cons)) )
-        len1 = BUFSZ - (xub->prod - xub->cons);
-
-    if ( len1 == 0 )
-        return PyInt_FromLong(0);
-
-    memcpy(&xub->buf[MASK_BUF_IDX(xub->prod)], &str[0], len1);
-    xub->prod += len1;
-
-    if ( len1 < len )
-    {
-        len2 = len - len1;
-        if ( len2 > (BUFSZ - MASK_BUF_IDX(xub->prod)) )
-            len2 = BUFSZ - MASK_BUF_IDX(xub->prod);
-        if ( len2 > (BUFSZ - (xub->prod - xub->cons)) )
-            len2 = BUFSZ - (xub->prod - xub->cons);
-        if ( len2 != 0 )
-        {
-            memcpy(&xub->buf[MASK_BUF_IDX(xub->prod)], &str[len1], len2);
-            xub->prod += len2;
-            return PyInt_FromLong(len1 + len2);
-        }
-    }
-
-    return PyInt_FromLong(len1);
-}
-
-static PyObject *xu_buffer_empty(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    if ( xub->cons == xub->prod )
-        return PyInt_FromLong(1);
-
-    return PyInt_FromLong(0);
-}
-
-static PyObject *xu_buffer_full(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    if ( (xub->prod - xub->cons) == BUFSZ )
-        return PyInt_FromLong(1);
-
-    return PyInt_FromLong(0);
-}
-
-static PyObject *xu_buffer_size(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    return PyInt_FromLong(xub->prod - xub->cons);
-}
-
-static PyObject *xu_buffer_space(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    return PyInt_FromLong(BUFSZ - (xub->prod - xub->cons));
-}
-
-static PyMethodDef xu_buffer_methods[] = {
-    { "peek", 
-      (PyCFunction)xu_buffer_peek,
-      METH_VARARGS,
-      "Peek up to @max bytes from the buffer. Returns a string.\n" },
-
-    { "read", 
-      (PyCFunction)xu_buffer_read,
-      METH_VARARGS,
-      "Read up to @max bytes from the buffer. Returns a string.\n" },
-
-    { "discard", 
-      (PyCFunction)xu_buffer_discard,
-      METH_VARARGS,
-      "Discard up to @max bytes from the buffer. Returns number of bytes.\n" },
-
-    { "write", 
-      (PyCFunction)xu_buffer_write,
-      METH_VARARGS,
-      "Write @string into buffer. Return number of bytes written.\n" },
-
-    { "empty", 
-      (PyCFunction)xu_buffer_empty,
-      METH_VARARGS,
-      "Return TRUE if the buffer is empty.\n" },
-
-    { "full", 
-      (PyCFunction)xu_buffer_full,
-      METH_VARARGS,
-      "Return TRUE if the buffer is full.\n" },
-
-    { "size", 
-      (PyCFunction)xu_buffer_size,
-      METH_VARARGS,
-      "Return number of bytes in the buffer.\n" },
-
-    { "space", 
-      (PyCFunction)xu_buffer_space,
-      METH_VARARGS,
-      "Return space left in the buffer.\n" },
-
-    { NULL, NULL, 0, NULL }
-};
-
-staticforward PyTypeObject xu_buffer_type;
-
-static PyObject *xu_buffer_new(PyObject *self, PyObject *args)
-{
-    xu_buffer_object *xub;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    xub = PyObject_New(xu_buffer_object, &xu_buffer_type);
-
-    if ( (xub->buf = malloc(BUFSZ)) == NULL )
-    {
-        PyObject_Del((PyObject *)xub);
-        return NULL;
-    }
-
-    xub->prod = xub->cons = 0;
-
-    return (PyObject *)xub;
-}
-
-static PyObject *xu_buffer_getattr(PyObject *obj, char *name)
-{
-    return Py_FindMethod(xu_buffer_methods, obj, name);
-}
-
-static void xu_buffer_dealloc(PyObject *self)
-{
-    xu_buffer_object *xub = (xu_buffer_object *)self;
-    free(xub->buf);
-    PyObject_Del(self);
-}
-
-static PyTypeObject xu_buffer_type = {
-    PyObject_HEAD_INIT(&PyType_Type)
-    0,
-    "buffer",
-    sizeof(xu_buffer_object),
-    0,
-    xu_buffer_dealloc,   /* tp_dealloc     */
-    NULL,                /* tp_print       */
-    xu_buffer_getattr,   /* tp_getattr     */
-    NULL,                /* tp_setattr     */
-    NULL,                /* tp_compare     */
-    NULL,                /* tp_repr        */
-    NULL,                /* tp_as_number   */
-    NULL,                /* tp_as_sequence */
-    NULL,                /* tp_as_mapping  */
-    NULL                 /* tp_hash        */
-};
-
-
-
-/*
- * *********************** MODULE WRAPPER ***********************
- */
-
-static void handle_child_death(int dummy)
-{
-    while ( waitpid(-1, NULL, WNOHANG) > 0 )
-        continue;
-}
-
-static PyObject *xu_autoreap(PyObject *self, PyObject *args)
-{
-    struct sigaction sa;
-
-    if ( !PyArg_ParseTuple(args, "") )
-        return NULL;
-
-    memset(&sa, 0, sizeof(sa));
-    sa.sa_handler = handle_child_death;
-    sigemptyset(&sa.sa_mask);
-    sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
-    (void)sigaction(SIGCHLD, &sa, NULL);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyMethodDef xu_methods[] = {
-    { "notifier", xu_notifier_new, METH_VARARGS, 
-      "Create a new notifier." },
-    { "message", xu_message_new, METH_VARARGS, 
-      "Create a new communications message." },
-    { "port", (PyCFunction)xu_port_new, METH_VARARGS | METH_KEYWORDS, 
-      "Create a new communications port." },
-    { "buffer", xu_buffer_new, METH_VARARGS, 
-      "Create a new ring buffer." },
-    { "autoreap", xu_autoreap, METH_VARARGS,
-      "Ensure that zombie children are automatically reaped by the OS." },
-    { NULL, NULL, 0, NULL }
-};
-
-PyMODINIT_FUNC initxu(void)
-{
-    PyObject *m, *d;
-
-    m = Py_InitModule(XENPKG, xu_methods);
-
-    d = PyModule_GetDict(m);
-    port_error = PyErr_NewException(XENPKG ".PortError", NULL, NULL);
-    PyDict_SetItemString(d, "PortError", port_error);
-
-    /* KAF: This ensures that we get debug output in a timely manner. */
-    setbuf(stdout, NULL);
-    setbuf(stderr, NULL);
-}

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.