const char * WIN32_strerror(int err) { static char xbstrerror_buf[BUFSIZ]; if (err < 0 || err >= sys_nerr) strncpy(xbstrerror_buf, wsastrerror(err), BUFSIZ); else strncpy(xbstrerror_buf, strerror(err), BUFSIZ); return xbstrerror_buf; }
char * pmErrStr_r(int code, char *buf, int buflen) { int i; #ifndef IS_MINGW static int first = 1; static char *unknown = NULL; #else static char unknown[] = "Unknown error"; #endif if (code == 0) { strncpy(buf, "No error", buflen); buf[buflen-1] = '\0'; return buf; } /* * Is the code from a library wrapped by libpcp? (e.g. NSS/SSL/SASL) * By good fortune, these libraries are using error codes that do not * overlap - by design for NSS/SSL/NSPR, and by sheer luck with SASL. */ if (code < PM_ERR_NYI) { #ifdef HAVE_SECURE_SOCKETS #define DECODE_SECURE_SOCKETS_ERROR(c) ((c) - PM_ERR_NYI) /* negative */ #define DECODE_SASL_SPECIFIC_ERROR(c) ((c) < -1000 ? 0 : (c)) int error = DECODE_SECURE_SOCKETS_ERROR(code); if (DECODE_SASL_SPECIFIC_ERROR(error)) { PM_LOCK(__pmLock_extcall); pmsprintf(buf, buflen, "Authentication - %s", sasl_errstring(error, NULL, NULL)); /* THREADSAFE */ PM_UNLOCK(__pmLock_extcall); } else strncpy(buf, PR_ErrorToString(error, PR_LANGUAGE_EN), buflen); buf[buflen-1] = '\0'; return buf; #endif } #ifndef IS_MINGW PM_LOCK(err_lock); if (first) { /* * reference message for an unrecognized error code. * For IRIX, strerror() returns NULL in this case. */ strerror_x(-1, buf, buflen); if (buf[0] != '\0') { /* * For Linux et al, strip the last word, expected to be the * error number as in ... * Unknown error -1 * or * Unknown error 4294967295 */ char *sp = strrchr(buf, ' '); char *p; if (sp != NULL) { sp++; if (*sp == '-') sp++; for (p = sp; *p != '\0'; p++) { if (!isdigit((int)*p)) break; } if (*p == '\0') { PM_FAULT_POINT("libpcp/" __FILE__ ":1", PM_FAULT_ALLOC); *sp = '\0'; if ((unknown = strdup(buf)) != NULL) unknown[sp - buf] = '\0'; } } } first = 0; } PM_UNLOCK(err_lock); if (code < 0 && code > -PM_ERR_BASE) { /* intro(2) / errno(3) errors, maybe */ strerror_x(-code, buf, buflen); if (unknown == NULL) { if (buf[0] != '\0') return buf; } else { /* The intention here is to catch variants of "Unknown * error XXX" - in this case we're going to fail the * stncmp() below, fall through and return a pcp error * message, otherwise return the system error message */ if (strncmp(buf, unknown, strlen(unknown)) != 0) return buf; } } #else /* WIN32 */ if (code > -PM_ERR_BASE || code < -PM_ERR_NYI) { const char *bp; if ((bp = wsastrerror(-code)) != NULL) { strncpy(buf, bp, buflen); buf[buflen-1] = '\0'; } else { /* No strerror_r in MinGW, so need to lock */ char *tbp; PM_LOCK(__pmLock_extcall); tbp = strerror(-code); /* THREADSAFE */ strncpy(buf, tbp, buflen); buf[buflen-1] = '\0'; PM_UNLOCK(__pmLock_extcall); } if (strncmp(buf, unknown, strlen(unknown)) != 0) return buf; } #endif for (i = 0; errtab[i].err; i++) { if (errtab[i].err == code) { strncpy(buf, errtab[i].errmess, buflen); buf[buflen-1] = '\0'; return buf; } } /* failure */ pmsprintf(buf, buflen, BADCODE, code); return buf; }