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

Bug#531756: Add extern int code_of_unix_error (value error);



Package: ocaml
Version: 3.11.0-1a0.mrvn.1
Severity: wishlist
Tags: patch

Hi,

the unixsupport.h header provides functions to convert unix errno into
ocamls Unix.error, which is sufficient for most applications. The
attached patch adds a function for the reverse conversion.

See http://caml.inria.fr/mantis/view.php?id=4812 for upstreams bugreport.

Rational:
For libfuse bindings I need to convert Unix.error to errno
numbers. The C stubs call an ocaml closure and expect usualy a string
as return value or an Unix.Unix_error exception in case of an
error. The stubs need to catch the exception, convert them back to
unix errno numbers and return -err to libfuse. The code looks
something like this:

static int readlink_stub(const char *name, char *buf, size_t size) {
  int res = 0;
  leave_blocking_section();
  CAMLparam0();
  CAMLlocal3(ml_name, ml_res, ml_exn);

  ml_name = caml_copy_string(name);
  value ml_res = caml_callback2(readlink_callback, ml_name, Val_int(size));
  if (Is_exception_result(ml_res)) {
    ml_exn = Extract_exception(ml_res);
    res = -code_of_unix_error(Field(ml_exn, 1));
  } else {
    strncpy(buf, String_val(ml_res), size);
  }
  enter_blocking_section();
  return res;
}

MfG
	Goswin

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable-i386
  APT policy: (500, 'unstable-i386'), (500, 'unstable'), (200, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.29.4-frosties-1
Locale: LANG=C, LC_CTYPE=de_DE (charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/bash

Versions of packages ocaml depends on:
ii  libx11-dev             2:1.2.1-1         X11 client-side library (developme
ii  ocaml-base             3.11.0-1a0.mrvn.1 Runtime system for OCaml bytecode 
ii  ocaml-nox              3.11.0-1a0.mrvn.1 ML language implementation with a 

ocaml recommends no packages.

Versions of packages ocaml suggests:
ii  tcl8.4-dev                    8.4.19-3   Tcl (the Tool Command Language) v8
ii  tk8.4-dev                     8.4.19-3   Tk toolkit for Tcl and X11, v8.4 -

-- no debconf information
#! /bin/sh -e 
## code_of_unix_error.dpatch by Goswin von Brederlow <goswin-v-b@web.de>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: add code_of_unix_error() to unixsupport.[ch] (see OCaml PR#4812)

if [ $# -ne 1 ]; then
    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
    exit 1
fi
case "$1" in
    -patch) patch -f --no-backup-if-mismatch -p1 < $0;;
    -unpatch) patch -f --no-backup-if-mismatch -R -p1 < $0;;	
    *)
	echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
	exit 1;;
esac

exit 0
@DPATCH@
--- ocaml-3.11.0.orig/otherlibs/unix/unixsupport.h
+++ ocaml-3.11.0/otherlibs/unix/unixsupport.h
@@ -20,6 +20,7 @@
 #define Nothing ((value) 0)
 
 extern value unix_error_of_code (int errcode);
+extern int code_of_unix_error (value error);
 extern void unix_error (int errcode, char * cmdname, value arg) Noreturn;
 extern void uerror (char * cmdname, value arg) Noreturn;
 
--- ocaml-3.11.0.orig/otherlibs/unix/unixsupport.c
+++ ocaml-3.11.0/otherlibs/unix/unixsupport.c
@@ -263,6 +263,15 @@
   return err;
 }
 
+extern int code_of_unix_error (value error)
+{
+  if (Is_block(error)) {
+    return Int_val(Field(error, 0));
+  } else {
+    return error_table[Int_val(error)];
+  }
+}
+
 void unix_error(int errcode, char *cmdname, value cmdarg)
 {
   value res;

Reply to: