1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
//#OPTIONS: CPP
#include "HsBaseConfig.h"
#ifdef GHCJS_TRACE_ERRNO
function h$logErrno() { h$log.apply(h$log,arguments); }
#define TRACE_ERRNO(args...) h$logErrno(args)
#else
#define TRACE_ERRNO(args...)
#endif
var h$errno = 0;
function h$__hscore_get_errno() {
TRACE_ERRNO("hscore_get_errno: " + h$errno);
return h$errno;
}
function h$unsupported(status, c) {
h$errno = 12456;
if(c) c(status);
return status;
}
function h$strerror(err) {
if(err === 12456) {
RETURN_UBX_TUP2(h$encodeUtf8("operation unsupported on this platform"), 0);
}
#ifdef GHCJS_BROWSER
RETURN_UBX_TUP2(h$encodeUtf8("unknown error"), 0);
#else
RETURN_UBX_TUP2(h$encodeUtf8(h$errorStrs[err] || "unknown error"), 0);
#endif
}
#ifndef GHCJS_BROWSER
function h$setErrno(e) {
TRACE_ERRNO("setErrno: " + e);
var es = e.toString();
var getErr = function() {
if(es.indexOf('ENOTDIR') !== -1) return CONST_ENOTDIR;
if(es.indexOf('EISDIR') !== -1) return CONST_EISDIR;
if(es.indexOf('ENOENT') !== -1) return CONST_ENOENT;
if(es.indexOf('EEXIST') !== -1) return CONST_EEXIST;
if(es.indexOf('ENETUNREACH') !== -1) return CONST_EINVAL; // fixme
if(es.indexOf('EPERM') !== -1) return CONST_EPERM;
if(es.indexOf('EMFILE') !== -1) return CONST_EMFILE;
if(es.indexOf('EPIPE') !== -1) return CONST_EPIPE;
if(es.indexOf('EAGAIN') !== -1) return CONST_EAGAIN;
if(es.indexOf('EINVAL') !== -1) return CONST_EINVAL;
if(es.indexOf('ESPIPE') !== -1) return CONST_ESPIPE;
if(es.indexOf('EBADF') !== -1) return CONST_EBADF;
if(es.indexOf('Bad argument') !== -1) return CONST_ENOENT; // fixme?
throw ("setErrno not yet implemented: " + e);
}
h$errno = getErr();
}
var h$errorStrs = { CONST_E2BIG: "Argument list too long"
, CONST_EACCESS: "Permission denied"
, CONST_EINVAL: "Invalid argument"
, CONST_EBADF: "Bad file descriptor"
, CONST_ENOTDIR: "Not a directory"
, CONST_EISDIR: "Illegal operation on a directory"
, CONST_ENOENT: "No such file or directory"
, CONST_EPERM: "Operation not permitted"
, CONST_EEXIST: "File exists"
, CONST_EMFILE: "Too many open files"
, CONST_EPIPE: "Broken pipe"
, CONST_EAGAIN: "Resource temporarily unavailable"
, CONST_ESPIPE: "Illegal seek"
}
function h$handleErrno(r_err, f) {
try {
return f();
} catch(e) {
h$setErrno(e);
return r_err;
}
}
function h$handleErrnoS(r_err, r_success, f) {
try {
f();
return r_success;
} catch(e) {
h$setErrno(e);
return r_err;
}
}
function h$handleErrnoC(err, r_err, r_success, c) {
if(err) {
h$setErrno(err);
c(r_err);
} else {
c(r_success);
}
}
#endif
|