All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: Ewan Mellor <ewan@xensource.com>
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Kaleb Pederson <kibab@icehouse.net>
Subject: [PATCH] Expose exception thrown by xen.lowlevel.xs (Was Re: [PATCH] Expose exception thrown by xen.lowlevel.xc)
Date: Fri, 19 May 2006 11:35:13 -0500	[thread overview]
Message-ID: <446DF3C1.90203@us.ibm.com> (raw)
In-Reply-To: <20060519163153.GA7805@leeni.uk.xensource.com>

[-- Attachment #1: Type: text/plain, Size: 1103 bytes --]

Ewan Mellor wrote:
> On Fri, May 19, 2006 at 11:16:41AM -0500, Anthony Liguori wrote:
>
>   
>> The attached patch exposes the exception thrown by xen.lowlevel.xc as 
>> the type xen.lowlevel.xc.Error which is an exception that inherits from 
>> RuntimeError.
>>
>> I only had a few minutes this morning so I didn't get to xen.lowlevel.xs 
>> but hopefully someone else can use this as a guide on what needs to be 
>> done.  If noone else gets to it, I'll be able to submit another one in 
>> about a week.
>>
>> I've only done very basic testing but I don't expect that this should 
>> break anything...
>>     
>
> Thanks Anthony -- applied.
>   

Got a little more time than I expected to.  This one's quite a bit more 
invasive but I think it's needed to at least be consistent with 
xen.lowlevel.xc.  I don't think we should be tossing an exception with 
different formats (sometimes we threw a RuntimeError with (errno, msg) 
and other times just a string--I've changed it to always be (errno, msg)).

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> Ewan.
>   


[-- Attachment #2: xs-lowlevel-exc.diff --]
[-- Type: text/plain, Size: 9352 bytes --]

# HG changeset patch
# User Anthony Liguori <anthony@codemonkey.ws>
# Node ID 6d7dee5a1f2b6552e41578e3a8fcf5eb804f66ab
# Parent  352f6cc97066af5a50906a2c4b47794434a7cc30
Expose the exception thrown by xen.lowlevel.xs.

diff -r 352f6cc97066 -r 6d7dee5a1f2b tools/python/xen/lowlevel/xs/xs.c
--- a/tools/python/xen/lowlevel/xs/xs.c	Fri May 19 11:13:28 2006 -0500
+++ b/tools/python/xen/lowlevel/xs/xs.c	Fri May 19 11:32:21 2006 -0500
@@ -28,6 +28,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <errno.h>
 
 #include <xenctrl.h>
 #include "xs.h"
@@ -43,6 +44,8 @@
 
 #define PKG "xen.lowlevel.xs"
 #define CLS "xs"
+
+static PyObject *xs_error;
 
 /** Python wrapper round an xs handle.
  */
@@ -52,11 +55,17 @@ typedef struct XsHandle {
     PyObject *watches;
 } XsHandle;
 
+static void xs_set_error(int value)
+{
+	errno = value;
+	PyErr_SetFromErrno(xs_error);
+}
+
 static inline struct xs_handle *xshandle(XsHandle *self)
 {
     struct xs_handle *xh = self->xh;
     if (!xh)
-        PyErr_SetString(PyExc_RuntimeError, "invalid xenstore daemon handle");
+	xs_set_error(EINVAL);
     return xh;
 }
 
@@ -77,7 +86,7 @@ static int parse_transaction_path(XsHand
 	"\n"                                            \
 	"Returns: [string] data read.\n"                \
 	"         None if key doesn't exist.\n"         \
-	"Raises RuntimeError on error.\n"               \
+	"Raises xen.lowlevel.xs.Error on error.\n"               \
 	"\n"
 
 static PyObject *xspy_read(XsHandle *self, PyObject *args)
@@ -113,7 +122,7 @@ static PyObject *xspy_read(XsHandle *sel
 	" data   [string] : data to write.\n"			\
 	"\n"							\
 	"Returns None on success.\n"				\
-	"Raises RuntimeError on error.\n"			\
+	"Raises xen.lowlevel.xs.Error on error.\n"			\
 	"\n"
 
 static PyObject *xspy_write(XsHandle *self, PyObject *args)
@@ -149,7 +158,7 @@ static PyObject *xspy_write(XsHandle *se
 	"\n"							\
 	"Returns: [string array] list of subdirectory names.\n"	\
 	"         None if key doesn't exist.\n"			\
-	"Raises RuntimeError on error.\n"			\
+	"Raises xen.lowlevel.xs.Error on error.\n"			\
 	"\n"
 
 static PyObject *xspy_ls(XsHandle *self, PyObject *args)
@@ -187,7 +196,7 @@ static PyObject *xspy_ls(XsHandle *self,
 	" path [string]: path to directory to create.\n"	\
 	"\n"							\
 	"Returns None on success.\n"				\
-	"Raises RuntimeError on error.\n"			\
+	"Raises xen.lowlevel.xs.Error on error.\n"			\
 	"\n"
 
 static PyObject *xspy_mkdir(XsHandle *self, PyObject *args)
@@ -215,7 +224,7 @@ static PyObject *xspy_mkdir(XsHandle *se
 	" path [string] : path to remove\n"             \
 	"\n"                                            \
 	"Returns None on success.\n"                    \
-	"Raises RuntimeError on error.\n"               \
+	"Raises xen.lowlevel.xs.Error on error.\n"               \
 	"\n"
 
 static PyObject *xspy_rm(XsHandle *self, PyObject *args)
@@ -243,7 +252,7 @@ static PyObject *xspy_rm(XsHandle *self,
 	" path [string]:        xenstore path.\n"       \
 	"\n"                                            \
 	"Returns: permissions array.\n"                 \
-	"Raises RuntimeError on error.\n"               \
+	"Raises xen.lowlevel.xs.Error on error.\n"               \
 	"\n"
 
 static PyObject *xspy_get_permissions(XsHandle *self, PyObject *args)
@@ -284,7 +293,7 @@ static PyObject *xspy_get_permissions(Xs
         return val;
     }
     else {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        PyErr_SetFromErrno(xs_error);
         return NULL;
     }
 }
@@ -296,7 +305,7 @@ static PyObject *xspy_get_permissions(Xs
 	" perms               : permissions.\n"         \
 	"\n"                                            \
 	"Returns None on success.\n"                    \
-	"Raises RuntimeError on error.\n"               \
+	"Raises xen.lowlevel.xs.Error on error.\n"               \
 	"\n"
 
 static PyObject *xspy_set_permissions(XsHandle *self, PyObject *args)
@@ -323,13 +332,13 @@ static PyObject *xspy_set_permissions(Xs
     th = strtoul(thstr, NULL, 16);
 
     if (!PyList_Check(perms)) {
-        PyErr_SetString(PyExc_RuntimeError, "perms must be a list");
+	xs_set_error(EINVAL);
         goto exit;
     }
     xsperms_n = PyList_Size(perms);
     xsperms = calloc(xsperms_n, sizeof(struct xs_permissions));
     if (!xsperms) {
-        PyErr_SetString(PyExc_RuntimeError, "out of memory");
+	xs_set_error(ENOMEM);
         goto exit;
     }
     tuple0 = PyTuple_New(0);
@@ -351,7 +360,7 @@ static PyObject *xspy_set_permissions(Xs
     result = xs_set_permissions(xh, th, path, xsperms, xsperms_n);
     Py_END_ALLOW_THREADS
     if (!result) {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        PyErr_SetFromErrno(xs_error);
         goto exit;
     }
 
@@ -370,7 +379,7 @@ static PyObject *xspy_set_permissions(Xs
 	" token    [string] : returned in watch notification.\n"	\
 	"\n"								\
 	"Returns None on success.\n"					\
-	"Raises RuntimeError on error.\n"				\
+	"Raises xen.lowlevel.xs.Error on error.\n"				\
 	"\n"
 
 /* Each 10 bits takes ~ 3 digits, plus one, plus one for nul terminator. */
@@ -420,7 +429,7 @@ static PyObject *xspy_watch(XsHandle *se
 	"Read a watch notification.\n"				\
 	"\n"							\
 	"Returns: [tuple] (path, token).\n"			\
-	"Raises RuntimeError on error.\n"			\
+	"Raises xen.lowlevel.xs.Error on error.\n"			\
 	"\n"
 
 static PyObject *xspy_read_watch(XsHandle *self, PyObject *args)
@@ -440,11 +449,11 @@ again:
     xsval = xs_read_watch(xh, &num);
     Py_END_ALLOW_THREADS
     if (!xsval) {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        PyErr_SetFromErrno(xs_error);
         goto exit;
     }
     if (sscanf(xsval[XS_WATCH_TOKEN], "%li", (unsigned long *)&token) != 1) {
-        PyErr_SetString(PyExc_RuntimeError, "invalid token");
+	xs_set_error(EINVAL);
         goto exit;
     }
     for (i = 0; i < PyList_Size(self->watches); i++) {
@@ -473,7 +482,7 @@ again:
 	" token [string] : token from the watch.\n"	\
 	"\n"						\
 	"Returns None on success.\n"			\
-	"Raises RuntimeError on error.\n"		\
+	"Raises xen.lowlevel.xs.Error on error.\n"		\
 	"\n"
 
 static PyObject *xspy_unwatch(XsHandle *self, PyObject *args)
@@ -503,7 +512,7 @@ static PyObject *xspy_unwatch(XsHandle *
 	"Start a transaction.\n"				\
 	"\n"							\
 	"Returns transaction handle on success.\n"		\
-	"Raises RuntimeError on error.\n"			\
+	"Raises xen.lowlevel.xs.Error on error.\n"			\
 	"\n"
 
 static PyObject *xspy_transaction_start(XsHandle *self)
@@ -520,7 +529,7 @@ static PyObject *xspy_transaction_start(
     Py_END_ALLOW_THREADS
 
     if (th == XBT_NULL) {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        PyErr_SetFromErrno(xs_error);
         return NULL;
     }
 
@@ -534,7 +543,7 @@ static PyObject *xspy_transaction_start(
 	" abort [int]: abort flag (default 0).\n"			\
 	"\n"								\
 	"Returns True on success, False if you need to try again.\n"	\
-	"Raises RuntimeError on error.\n"				\
+	"Raises xen.lowlevel.xs.Error on error.\n"				\
 	"\n"
 
 static PyObject *xspy_transaction_end(XsHandle *self, PyObject *args,
@@ -571,7 +580,7 @@ static PyObject *xspy_transaction_end(Xs
         return Py_False;
     }
     else {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        PyErr_SetFromErrno(xs_error);
         return NULL;
     }
 }
@@ -584,7 +593,7 @@ static PyObject *xspy_transaction_end(Xs
 	" port [int]   : port the domain is using for xenstore\n"	\
 	"\n"								\
 	"Returns None on success.\n"					\
-	"Raises RuntimeError on error.\n"				\
+	"Raises xen.lowlevel.xs.Error on error.\n"				\
 	"\n"
 
 static PyObject *xspy_introduce_domain(XsHandle *self, PyObject *args)
@@ -615,7 +624,7 @@ static PyObject *xspy_introduce_domain(X
 	" dom [int]: domain id\n"					\
 	"\n"								\
 	"Returns None on success.\n"					\
-	"Raises RuntimeError on error.\n"				\
+	"Raises xen.lowlevel.xs.Error on error.\n"				\
 	"\n"
 
 static PyObject *xspy_release_domain(XsHandle *self, PyObject *args)
@@ -642,7 +651,7 @@ static PyObject *xspy_release_domain(XsH
 	"Close the connection to xenstore.\n"	\
 	"\n"					\
 	"Returns None on success.\n"		\
-	"Raises RuntimeError on error.\n"	\
+	"Raises xen.lowlevel.xs.Error on error.\n"	\
 	"\n"
 
 static PyObject *xspy_close(XsHandle *self)
@@ -671,7 +680,7 @@ static PyObject *xspy_close(XsHandle *se
 	" domid [int]: domain id\n"			\
 	"\n"						\
 	"Returns: [string] domain store path.\n"	\
-	"Raises RuntimeError on error.\n"		\
+	"Raises xen.lowlevel.xs.Error on error.\n"		\
 	"\n"
 
 static PyObject *xspy_get_domain_path(XsHandle *self, PyObject *args)
@@ -753,7 +762,7 @@ static PyObject *none(bool result)
         return Py_None;
     }
     else {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        PyErr_SetFromErrno(xs_error);
         return NULL;
     }
 }
@@ -829,7 +838,7 @@ xshandle_init(XsHandle *self, PyObject *
     return 0;
 
  fail:
-    PyErr_SetFromErrno(PyExc_RuntimeError);
+    PyErr_SetFromErrno(xs_error);
     return -1;
 }
 
@@ -901,8 +910,13 @@ PyMODINIT_FUNC initxs(void)
     if (m == NULL)
       return;
 
+    xs_error = PyErr_NewException(PKG ".Error", PyExc_RuntimeError, NULL);
+
     Py_INCREF(&xshandle_type);
     PyModule_AddObject(m, CLS, (PyObject *)&xshandle_type);
+
+    Py_INCREF(xs_error);
+    PyModule_AddObject(m, "Error", xs_error);
 }
 
 

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

  reply	other threads:[~2006-05-19 16:35 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-19 16:16 [PATCH] Expose exception thrown by xen.lowlevel.xc Anthony Liguori
2006-05-19 16:31 ` Ewan Mellor
2006-05-19 16:35   ` Anthony Liguori [this message]
2006-05-19 19:44     ` [PATCH] Expose exception thrown by xen.lowlevel.xs (Was Re: [PATCH] Expose exception thrown by xen.lowlevel.xc) Kaleb Pederson
2006-06-01 11:13     ` Ewan Mellor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=446DF3C1.90203@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=ewan@xensource.com \
    --cc=kibab@icehouse.net \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.