Hi!
I found myself in need of rumpuser__errtrans_rump2host() to properly transmit
errors back to the host upper layer after it requested rump services through
rump_sys_* syscalls.
So I just implemented it. Here you are :-)
--
Robert Millan
diff --git a/lib/librumpuser/rumpuser_component.c b/lib/librumpuser/rumpuser_component.c
index 40b4da3..580072d 100644
--- a/lib/librumpuser/rumpuser_component.c
+++ b/lib/librumpuser/rumpuser_component.c
@@ -106,3 +106,10 @@ rumpuser_component_errtrans(int hosterr)
return rumpuser__errtrans(hosterr);
}
+
+int
+rumpuser_component_errtrans_rump2host(int rumperr)
+{
+
+ return rumpuser__errtrans_rump2host(rumperr);
+}
diff --git a/lib/librumpuser/rumpuser_component.h b/lib/librumpuser/rumpuser_component.h
index aeb768b..fffba0e 100644
--- a/lib/librumpuser/rumpuser_component.h
+++ b/lib/librumpuser/rumpuser_component.h
@@ -31,6 +31,7 @@
void * rumpuser_component_unschedule(void);
void rumpuser_component_schedule(void *);
int rumpuser_component_errtrans(int);
+int rumpuser_component_errtrans_rump2host(int);
void rumpuser_component_kthread(void);
struct lwp *rumpuser_component_curlwp(void);
diff --git a/lib/librumpuser/rumpuser_errtrans.c b/lib/librumpuser/rumpuser_errtrans.c
index 9120803..ebdf1aa 100644
--- a/lib/librumpuser/rumpuser_errtrans.c
+++ b/lib/librumpuser/rumpuser_errtrans.c
@@ -7,6 +7,9 @@
* awk '/^#define/{printf "#ifdef %s\n\tcase %-15s: return %s;\n#endif\n", \
* $2, $2, $3}' < errno.h
*
+ * awk '/^#define/{printf "#ifdef %s\n\tcase %-15s: return %s;\n#endif\n", \
+ * $2, $3, $2}' < errno.h
+ *
*/
#include <errno.h>
@@ -319,3 +322,331 @@ rumpuser__errtrans(int hosterr)
default : return 22; /* EINVAL */
}
}
+
+
+/*
+ * Translate rump kernel errno to host errno
+ */
+int rumpuser__errtrans_rump2host(int); /* a naughty decouple */
+int
+rumpuser__errtrans_rump2host(int rumperr)
+{
+
+ /* just in case the vompiler is being silly */
+ if (rumperr == 0)
+ return 0;
+
+ switch (rumperr) {
+#ifdef EPERM
+ case 1 : return EPERM;
+#endif
+#ifdef ENOENT
+ case 2 : return ENOENT;
+#endif
+#ifdef ESRCH
+ case 3 : return ESRCH;
+#endif
+#ifdef EINTR
+ case 4 : return EINTR;
+#endif
+#ifdef EIO
+ case 5 : return EIO;
+#endif
+#ifdef ENXIO
+ case 6 : return ENXIO;
+#endif
+#ifdef E2BIG
+ case 7 : return E2BIG;
+#endif
+#ifdef ENOEXEC
+ case 8 : return ENOEXEC;
+#endif
+#ifdef EBADF
+ case 9 : return EBADF;
+#endif
+#ifdef ECHILD
+ case 10 : return ECHILD;
+#endif
+#ifdef EDEADLK
+ case 11 : return EDEADLK;
+#endif
+#ifdef ENOMEM
+ case 12 : return ENOMEM;
+#endif
+#ifdef EACCES
+ case 13 : return EACCES;
+#endif
+#ifdef EFAULT
+ case 14 : return EFAULT;
+#endif
+#ifdef ENOTBLK
+ case 15 : return ENOTBLK;
+#endif
+#ifdef EBUSY
+ case 16 : return EBUSY;
+#endif
+#ifdef EEXIST
+ case 17 : return EEXIST;
+#endif
+#ifdef EXDEV
+ case 18 : return EXDEV;
+#endif
+#ifdef ENODEV
+ case 19 : return ENODEV;
+#endif
+#ifdef ENOTDIR
+ case 20 : return ENOTDIR;
+#endif
+#ifdef EISDIR
+ case 21 : return EISDIR;
+#endif
+#ifdef EINVAL
+ case 22 : return EINVAL;
+#endif
+#ifdef ENFILE
+ case 23 : return ENFILE;
+#endif
+#ifdef EMFILE
+ case 24 : return EMFILE;
+#endif
+#ifdef ENOTTY
+ case 25 : return ENOTTY;
+#endif
+#ifdef ETXTBSY
+ case 26 : return ETXTBSY;
+#endif
+#ifdef EFBIG
+ case 27 : return EFBIG;
+#endif
+#ifdef ENOSPC
+ case 28 : return ENOSPC;
+#endif
+#ifdef ESPIPE
+ case 29 : return ESPIPE;
+#endif
+#ifdef EROFS
+ case 30 : return EROFS;
+#endif
+#ifdef EMLINK
+ case 31 : return EMLINK;
+#endif
+#ifdef EPIPE
+ case 32 : return EPIPE;
+#endif
+#ifdef EDOM
+ case 33 : return EDOM;
+#endif
+#ifdef ERANGE
+ case 34 : return ERANGE;
+#endif
+#ifdef EAGAIN
+ case 35 : return EAGAIN;
+#endif
+#ifdef EWOULDBLOCK
+ case EAGAIN : return EWOULDBLOCK;
+#endif
+#ifdef EINPROGRESS
+ case 36 : return EINPROGRESS;
+#endif
+#ifdef EALREADY
+ case 37 : return EALREADY;
+#endif
+#ifdef ENOTSOCK
+ case 38 : return ENOTSOCK;
+#endif
+#ifdef EDESTADDRREQ
+ case 39 : return EDESTADDRREQ;
+#endif
+#ifdef EMSGSIZE
+ case 40 : return EMSGSIZE;
+#endif
+#ifdef EPROTOTYPE
+ case 41 : return EPROTOTYPE;
+#endif
+#ifdef ENOPROTOOPT
+ case 42 : return ENOPROTOOPT;
+#endif
+#ifdef EPROTONOSUPPORT
+ case 43 : return EPROTONOSUPPORT;
+#endif
+#ifdef ESOCKTNOSUPPORT
+ case 44 : return ESOCKTNOSUPPORT;
+#endif
+#ifdef EOPNOTSUPP
+ case 45 : return EOPNOTSUPP;
+#endif
+#ifdef EPFNOSUPPORT
+ case 46 : return EPFNOSUPPORT;
+#endif
+#ifdef EAFNOSUPPORT
+ case 47 : return EAFNOSUPPORT;
+#endif
+#ifdef EADDRINUSE
+ case 48 : return EADDRINUSE;
+#endif
+#ifdef EADDRNOTAVAIL
+ case 49 : return EADDRNOTAVAIL;
+#endif
+#ifdef ENETDOWN
+ case 50 : return ENETDOWN;
+#endif
+#ifdef ENETUNREACH
+ case 51 : return ENETUNREACH;
+#endif
+#ifdef ENETRESET
+ case 52 : return ENETRESET;
+#endif
+#ifdef ECONNABORTED
+ case 53 : return ECONNABORTED;
+#endif
+#ifdef ECONNRESET
+ case 54 : return ECONNRESET;
+#endif
+#ifdef ENOBUFS
+ case 55 : return ENOBUFS;
+#endif
+#ifdef EISCONN
+ case 56 : return EISCONN;
+#endif
+#ifdef ENOTCONN
+ case 57 : return ENOTCONN;
+#endif
+#ifdef ESHUTDOWN
+ case 58 : return ESHUTDOWN;
+#endif
+#ifdef ETOOMANYREFS
+ case 59 : return ETOOMANYREFS;
+#endif
+#ifdef ETIMEDOUT
+ case 60 : return ETIMEDOUT;
+#endif
+#ifdef ECONNREFUSED
+ case 61 : return ECONNREFUSED;
+#endif
+#ifdef ELOOP
+ case 62 : return ELOOP;
+#endif
+#ifdef ENAMETOOLONG
+ case 63 : return ENAMETOOLONG;
+#endif
+#ifdef EHOSTDOWN
+ case 64 : return EHOSTDOWN;
+#endif
+#ifdef EHOSTUNREACH
+ case 65 : return EHOSTUNREACH;
+#endif
+#ifdef ENOTEMPTY
+ case 66 : return ENOTEMPTY;
+#endif
+#ifdef EPROCLIM
+ case 67 : return EPROCLIM;
+#endif
+#ifdef EUSERS
+ case 68 : return EUSERS;
+#endif
+#ifdef EDQUOT
+ case 69 : return EDQUOT;
+#endif
+#ifdef ESTALE
+ case 70 : return ESTALE;
+#endif
+#ifdef EREMOTE
+ case 71 : return EREMOTE;
+#endif
+#ifdef EBADRPC
+ case 72 : return EBADRPC;
+#endif
+#ifdef ERPCMISMATCH
+ case 73 : return ERPCMISMATCH;
+#endif
+#ifdef EPROGUNAVAIL
+ case 74 : return EPROGUNAVAIL;
+#endif
+#ifdef EPROGMISMATCH
+ case 75 : return EPROGMISMATCH;
+#endif
+#ifdef EPROCUNAVAIL
+ case 76 : return EPROCUNAVAIL;
+#endif
+#ifdef ENOLCK
+ case 77 : return ENOLCK;
+#endif
+#ifdef ENOSYS
+ case 78 : return ENOSYS;
+#endif
+#ifdef EFTYPE
+ case 79 : return EFTYPE;
+#endif
+#ifdef EAUTH
+ case 80 : return EAUTH;
+#endif
+#ifdef ENEEDAUTH
+ case 81 : return ENEEDAUTH;
+#endif
+#ifdef EIDRM
+ case 82 : return EIDRM;
+#endif
+#ifdef ENOMSG
+ case 83 : return ENOMSG;
+#endif
+#ifdef EOVERFLOW
+ case 84 : return EOVERFLOW;
+#endif
+#ifdef EILSEQ
+ case 85 : return EILSEQ;
+#endif
+#ifdef ENOTSUP
+ case 86 : return ENOTSUP;
+#endif
+#ifdef ECANCELED
+ case 87 : return ECANCELED;
+#endif
+#ifdef EBADMSG
+ case 88 : return EBADMSG;
+#endif
+#ifdef ENODATA
+ case 89 : return ENODATA;
+#endif
+#ifdef ENOSR
+ case 90 : return ENOSR;
+#endif
+#ifdef ENOSTR
+ case 91 : return ENOSTR;
+#endif
+#ifdef ETIME
+ case 92 : return ETIME;
+#endif
+#ifdef ENOATTR
+ case 93 : return ENOATTR;
+#endif
+#ifdef EMULTIHOP
+ case 94 : return EMULTIHOP;
+#endif
+#ifdef ENOLINK
+ case 95 : return ENOLINK;
+#endif
+#ifdef EPROTO
+ case 96 : return EPROTO;
+#endif
+#ifdef ELAST
+ case 96 : return ELAST;
+#endif
+#ifdef EJUSTRETURN
+ case -2 : return EJUSTRETURN;
+#endif
+#ifdef ERESTART
+ case -3 : return ERESTART;
+#endif
+#ifdef EPASSTHROUGH
+ case -4 : return EPASSTHROUGH;
+#endif
+#ifdef EDUPFD
+ case -5 : return EDUPFD;
+#endif
+#ifdef EMOVEFD
+ case -6 : return EMOVEFD;
+#endif
+
+ default : return EINVAL;
+ }
+}
diff --git a/lib/librumpuser/rumpuser_int.h b/lib/librumpuser/rumpuser_int.h
index 1f4fc75..15ee9eb 100644
--- a/lib/librumpuser/rumpuser_int.h
+++ b/lib/librumpuser/rumpuser_int.h
@@ -96,6 +96,7 @@ do { \
int rumpuser__sig_rump2host(int);
int rumpuser__errtrans(int);
+int rumpuser__errtrans_rump2host(int);
#ifdef __NetBSD__
#define ET(_v_) return (_v_);
#else