diff options
Diffstat (limited to 'os2')
-rw-r--r-- | os2/dl_os2.c | 30 | ||||
-rw-r--r-- | os2/os2.c | 41 |
2 files changed, 40 insertions, 31 deletions
diff --git a/os2/dl_os2.c b/os2/dl_os2.c index 02ca2efd46..aaeeb580f4 100644 --- a/os2/dl_os2.c +++ b/os2/dl_os2.c @@ -8,6 +8,8 @@ static ULONG retcode; static char fail[300]; +char *os2error(int rc); + void * dlopen(char *path, int mode) { @@ -62,29 +64,17 @@ dlerror(void) { static char buf[700]; ULONG len; + char *err; if (retcode == 0) return NULL; - if (DosGetMessage(NULL, 0, buf, sizeof buf - 1, retcode, - "OSO001.MSG", &len)) { - if (fail[0]) - sprintf(buf, -"OS/2 system error code %lu, possible problematic module: '%s'", - retcode, fail); - else - sprintf(buf, "OS/2 system error code %lu", retcode); - } else { - buf[len] = '\0'; - if (len && buf[len - 1] == '\n') - buf[--len] = 0; - if (len && buf[len - 1] == '\r') - buf[--len] = 0; - if (len && buf[len - 1] == '.') - buf[--len] = 0; - if (fail[0] && len < 300) - sprintf(buf + len, ", possible problematic module: '%s'", - fail); - } + err = os2error(retcode); + len = strlen(err); + if (len > sizeof(buf) - 1) + len = sizeof(buf) - 1; + strncpy(buf, err, len+1); + if (fail[0] && len < 300) + sprintf(buf + len, ", possible problematic module: '%s'", fail); retcode = 0; return buf; } @@ -1356,20 +1356,36 @@ os2error(int rc) { static char buf[300]; ULONG len; + char *s; + int number = SvTRUE(get_sv("OS2::nsyserror", TRUE)); if (!(_emx_env & 0x200)) return ""; /* Nop if not OS/2. */ if (rc == 0) - return NULL; - if (DosGetMessage(NULL, 0, buf, sizeof buf - 1, rc, "OSO001.MSG", &len)) - sprintf(buf, "OS/2 system error code %d=0x%x", rc, rc); - else { - buf[len] = '\0'; - if (len && buf[len - 1] == '\n') - buf[--len] = 0; - if (len && buf[len - 1] == '\r') - buf[--len] = 0; - if (len && buf[len - 1] == '.') - buf[--len] = 0; + return ""; + if (number) { + sprintf(buf, "SYS%04d=%#x: ", rc, rc); + s = buf + strlen(buf); + } else + s = buf; + if (DosGetMessage(NULL, 0, s, sizeof(buf) - 1 - (s-buf), + rc, "OSO001.MSG", &len)) { + if (!number) { + sprintf(buf, "SYS%04d=%#x: ", rc, rc); + s = buf + strlen(buf); + } + sprintf(s, "[No description found in OSO001.MSG]"); + } else { + s[len] = '\0'; + if (len && s[len - 1] == '\n') + s[--len] = 0; + if (len && s[len - 1] == '\r') + s[--len] = 0; + if (len && s[len - 1] == '.') + s[--len] = 0; + if (len >= 10 && number && strnEQ(s, buf, 7) + && s[7] == ':' && s[8] == ' ') + /* Some messages start with SYSdddd:, some not */ + Move(s + 9, s, (len -= 9) + 1, char); } return buf; } @@ -2186,6 +2202,9 @@ Xs_OS2_init(pTHX) gv = gv_fetchpv("OS2::os_ver", TRUE, SVt_PV); GvMULTI_on(gv); sv_setnv(GvSV(gv), _osmajor + 0.001 * _osminor); + gv = gv_fetchpv("OS2::nsyserror", TRUE, SVt_PV); + GvMULTI_on(gv); + sv_setiv(GvSV(gv), 1); /* DEFAULT: Show number on syserror */ } return 0; } |