pjproject/pjlib/src/pj/errno.c

108 lines
2.8 KiB
C

/* $Header: /pjproject-0.3/pjlib/src/pj/errno.c 2 10/14/05 12:26a Bennylp $ */
/*
* $Log: /pjproject-0.3/pjlib/src/pj/errno.c $
*
* 2 10/14/05 12:26a Bennylp
* Finished error code framework, some fixes in ioqueue, etc. Pretty
* major.
*
* 1 10/08/05 9:53a Bennylp
* Created.
*
*/
#include <pj/errno.h>
#include <pj/string.h>
#include <pj/compat/sprintf.h>
/* Prototype for platform specific error message, which will be defined
* in separate file.
*/
extern int platform_strerror( pj_os_err_type code,
char *buf, pj_size_t bufsize );
/* PJLIB's own error codes/messages */
static const struct
{
int code;
const char *msg;
} err_str[] =
{
{ PJ_EUNKNOWN, "Unknown Error" },
{ PJ_EPENDING, "Pending operation" },
{ PJ_ETOOMANYCONN, "Too many connecting sockets" },
{ PJ_EINVAL, "Invalid value or argument" },
{ PJ_ENAMETOOLONG, "Name too long" },
{ PJ_ENOTFOUND, "Not found" },
{ PJ_ENOMEM, "Not enough memory" },
{ PJ_EBUG, "BUG DETECTED!" },
{ PJ_ETIMEDOUT, "Operation timed out" },
{ PJ_ETOOMANY, "Too many objects of the specified type"},
{ PJ_EBUSY, "Object is busy"},
{ PJ_ENOTSUP, "Option/operation is not supported"},
{ PJ_EINVALIDOP, "Invalid operation"}
};
/*
* pjlib_error()
*
* Retrieve message string for PJLIB's own error code.
*/
static int pjlib_error(pj_status_t code, char *buf, pj_size_t size)
{
unsigned i;
for (i=0; i<sizeof(err_str)/sizeof(err_str[0]); ++i) {
if (err_str[i].code == code) {
pj_size_t len = strlen(err_str[i].msg);
if (len >= size) len = size-1;
pj_memcpy(buf, err_str[i].msg, len);
buf[len] = '\0';
return len;
}
}
*buf++ = '?';
*buf++ = '?';
*buf++ = '?';
*buf++ = '\0';
return 3;
}
/*
* pj_strerror()
*/
PJ_DEF(pj_str_t) pj_strerror( pj_status_t statcode,
char *buf, pj_size_t bufsize )
{
int len = -1;
pj_str_t errstr;
if (statcode < PJ_ERRNO_START + PJ_ERRNO_SPACE_SIZE) {
len = pj_snprintf( buf, bufsize, "Unknown error %d", statcode);
} else if (statcode < PJ_ERRNO_START_STATUS + PJ_ERRNO_SPACE_SIZE) {
len = pjlib_error(statcode, buf, bufsize);
} else if (statcode < PJ_ERRNO_START_SYS + PJ_ERRNO_SPACE_SIZE) {
len = platform_strerror(PJ_STATUS_TO_OS(statcode), buf, bufsize);
} else if (statcode < PJ_ERRNO_START_USER + PJ_ERRNO_SPACE_SIZE) {
len = pj_snprintf( buf, bufsize, "User error %d", statcode);
} else {
len = pj_snprintf( buf, bufsize, "Invalid error %d", statcode);
}
if (len < 1) {
*buf = '\0';
len = 0;
}
errstr.ptr = buf;
errstr.slen = len;
return errstr;
}