--- BDB/BDB.xs 2008/01/13 09:43:21 1.30 +++ BDB/BDB.xs 2008/03/30 04:34:20 1.31 @@ -956,6 +956,42 @@ sv_setiv (SvRV (sv), 0); } +static int +errno_get (pTHX_ SV *sv, MAGIC *mg) +{ + if (*mg->mg_ptr == '!') // should always be the case + if (-30999 <= errno && errno <= -30800) + { + sv_setpv (sv, db_strerror (errno)); + return 0; + } + + return PL_vtbl_sv.svt_get (aTHX_ sv, mg); +} + +static MGVTBL vtbl_errno; + +// this wonderful hack :( patches perl's $! variable to support our errno values +static void +patch_errno (void) +{ + SV *sv; + MAGIC *mg; + + if (!(sv = get_sv ("!", 1))) + return; + + if (!(mg = mg_find (sv, PERL_MAGIC_sv))) + return; + + if (mg->mg_virtual != &PL_vtbl_sv) + return; + + vtbl_errno = PL_vtbl_sv; + vtbl_errno.svt_get = errno_get; + mg->mg_virtual = &vtbl_errno; +} + MODULE = BDB PACKAGE = BDB PROTOTYPES: ENABLE @@ -1161,6 +1197,7 @@ X_COND_CHECK (reqwait); #endif + patch_errno (); } void @@ -2047,3 +2084,4 @@ OUTPUT: RETVAL +