terom@6: terom@6: #include "error.h" terom@6: terom@30: // for the error_desc tables terom@30: #include "sock.h" terom@30: #include "sock_gnutls.h" terom@55: #include "module.h" terom@30: terom@7: #include terom@7: #include terom@7: terom@30: struct error_desc _core_error_desc[] = { terom@31: { ERR_CALLOC, "calloc", ERR_EXTRA_NONE }, terom@37: { ERR_STRDUP, "strdup", ERR_EXTRA_NONE }, terom@71: { ERR_SIGACTION, "sigaction", ERR_EXTRA_ERRNO }, terom@108: { ERR_ACCESS_READ, "access(R_OK)", ERR_EXTRA_ERRNO }, terom@31: { ERR_GETADDRINFO, "getaddrinfo", ERR_EXTRA_GAI }, terom@31: { ERR_GETADDRINFO_EMPTY, "getaddrinfo: no results", ERR_EXTRA_NONE }, terom@31: { ERR_EVENT_NEW, "event_new", ERR_EXTRA_NONE }, terom@31: { ERR_EVENT_ADD, "event_add", ERR_EXTRA_NONE }, terom@31: { ERR_EVSQL_NEW_PQ, "evsql_new_pq", ERR_EXTRA_NONE }, terom@68: { ERR_EVSQL_QUERY_EXEC, "evsql_query_exec", ERR_EXTRA_NONE }, terom@63: { ERR_CMD_OPT, "argv", ERR_EXTRA_STR }, terom@31: { _ERR_INVALID, NULL, 0 } terom@7: terom@31: }, _sock_error_desc[] = { terom@31: { ERR_SOCKET, "socket", ERR_EXTRA_ERRNO }, terom@31: { ERR_CONNECT, "connect", ERR_EXTRA_ERRNO }, terom@31: { ERR_READ, "read", ERR_EXTRA_ERRNO }, terom@31: { ERR_READ_EOF, "read: EOF", ERR_EXTRA_NONE }, terom@31: { ERR_WRITE, "write", ERR_EXTRA_ERRNO }, terom@31: { ERR_WRITE_EOF, "write: EOF", ERR_EXTRA_NONE }, terom@31: { ERR_FCNTL, "fcntl", ERR_EXTRA_ERRNO }, terom@31: { ERR_CLOSE, "close", ERR_EXTRA_ERRNO }, terom@134: { ERR_GETSOCKOPT, "getsockopt", ERR_EXTRA_ERRNO }, terom@134: { ERR_OPEN, "open", ERR_EXTRA_ERRNO }, terom@31: { _ERR_INVALID, NULL, 0 } terom@30: terom@31: }, _sock_gnutls_error_desc[] = { terom@31: { ERR_GNUTLS_CERT_ALLOC_CRED, "gnutls_certificate_allocate_credentials", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_GLOBAL_INIT, "gnutls_global_init", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_SET_DEFAULT_PRIORITY, "gnutls_set_default_priority", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_CRED_SET, "gnutls_credentials_set", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_HANDSHAKE, "gnutls_handshake", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_RECORD_SEND, "gnutls_record_send", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_RECORD_RECV, "gnutls_record_recv", ERR_EXTRA_GNUTLS }, terom@31: { ERR_GNUTLS_RECORD_GET_DIRECTION, "gnutls_record_get_direction", ERR_EXTRA_GNUTLS }, terom@140: { ERR_GNUTLS_CERT_VERIFY_PEERS2, "gnutls_certificate_verify_peers2", ERR_EXTRA_GNUTLS }, terom@140: { ERR_GNUTLS_CERT_VERIFY, "X.509 Certificate verification failed", ERR_EXTRA_STR }, terom@140: { ERR_GNUTLS_CERT_SET_X509_TRUST_FILE,"gnutls_certificate_set_x509_trust_file", ERR_EXTRA_GNUTLS }, terom@140: { ERR_GNUTLS_CERT_SET_X509_KEY_FILE, "gnutls_certificate_set_x509_key_file", ERR_EXTRA_GNUTLS }, terom@31: { _ERR_INVALID, NULL, 0 } terom@31: terom@100: }, _irc_error_desc[] = { terom@37: { ERR_LINE_TOO_LONG, "IRC line is too long", ERR_EXTRA_NONE }, terom@37: { ERR_LINE_INVALID_TOKEN, "Illegal token value for IRC line", ERR_EXTRA_NONE }, terom@37: { ERR_INVALID_NM, "Invalid nickmask", ERR_EXTRA_NONE }, terom@37: { ERR_INVALID_NICK_LENGTH, "Nickname is too long", ERR_EXTRA_NONE }, terom@100: terom@100: // extra: the name of the invalid field terom@100: { ERR_IRC_NET_INFO, "invalid irc_net_info", ERR_EXTRA_STR }, terom@100: { ERR_IRC_NET_STATE, "invalid irc_net state for operation", ERR_EXTRA_NONE }, terom@100: { ERR_IRC_CHAN_STATE, "invalid irc_chan state for operation", ERR_EXTRA_NONE }, terom@100: terom@37: { _ERR_INVALID, NULL, 0 } terom@100: terom@100: }, _config_error_desc[] = { terom@121: { ERR_CONFIG_NAME, "unknown config option", ERR_EXTRA_STR }, terom@121: { ERR_CONFIG_TYPE, "invalid config type", ERR_EXTRA_NONE }, terom@100: { ERR_CONFIG_REQUIRED, "missing required value", ERR_EXTRA_STR }, terom@121: { ERR_CONFIG_VALUE, "invalid value", ERR_EXTRA_STR }, terom@121: { ERR_CONFIG_PARAMS, "invalid number of paramters", ERR_EXTRA_NONE }, terom@100: terom@100: { _ERR_INVALID, NULL, 0 } terom@100: terom@55: }, _module_error_desc[] = { terom@108: { ERR_MODULE_NAME, "invalid module name", ERR_EXTRA_NONE }, terom@108: { ERR_MODULE_DUP, "module already loaded", ERR_EXTRA_NONE }, terom@108: { ERR_MODULE_PATH, "invalid module path", ERR_EXTRA_STR }, terom@57: { ERR_MODULE_OPEN, "module dlopen() failed", ERR_EXTRA_STR }, terom@108: { ERR_MODULE_SYM, "module dlsym() failed", ERR_EXTRA_STR }, terom@57: { ERR_MODULE_INIT_FUNC, "invalid module init func", ERR_EXTRA_STR }, terom@56: { ERR_MODULE_CONF, "module_conf", ERR_EXTRA_STR }, terom@55: { _ERR_INVALID, NULL, 0 } terom@100: terom@100: }, _lua_error_desc[] = { terom@106: { ERR_LUA_MEM, "lua: out of memory", ERR_EXTRA_STR }, terom@106: { ERR_LUA_SYNTAX, "lua: syntax error", ERR_EXTRA_STR }, terom@106: { ERR_LUA_RUN, "lua: runtime error", ERR_EXTRA_STR }, terom@106: { ERR_LUA_ERR, "lua: error handling error", ERR_EXTRA_STR }, terom@106: { ERR_LUA_FILE, "lua: error loading file", ERR_EXTRA_STR }, terom@100: { _ERR_INVALID, NULL, 0 } terom@138: }, _pcre_error_desc[] = { terom@138: { ERR_PCRE_COMPILE, "pcre_compile", ERR_EXTRA_STR }, terom@138: { ERR_PCRE_EXEC, "pcre_exec", ERR_EXTRA_STR }, terom@138: { _ERR_INVALID, NULL, 0 } terom@30: }; terom@30: terom@30: /** terom@30: * Array of error_desc tables terom@6: */ terom@30: static struct error_desc* _desc_tables[] = { terom@30: _core_error_desc, terom@30: _sock_error_desc, terom@30: _sock_gnutls_error_desc, terom@100: _irc_error_desc, terom@121: _config_error_desc, terom@55: _module_error_desc, terom@100: _lua_error_desc, terom@138: _pcre_error_desc, terom@30: NULL terom@30: }; terom@30: terom@30: /** terom@30: * Look up the error_desc for the given error code terom@30: */ terom@30: static const struct error_desc* error_lookup_desc (err_t code) terom@30: { terom@30: struct error_desc **desc_table, *desc = NULL; terom@30: terom@30: // iterate over each defined error_desc array terom@41: for (desc_table = _desc_tables; *desc_table; desc_table++) { terom@30: for (desc = *desc_table; desc->code && desc->name; desc++) { terom@30: // compare code terom@30: if (desc->code == code) terom@30: // found terom@30: return desc; terom@30: } terom@30: } terom@30: terom@30: // not found terom@30: return NULL; terom@30: } terom@6: terom@6: const char *error_name (err_t code) terom@6: { terom@30: const struct error_desc *desc; terom@30: terom@30: // do we have an error_desc for it? terom@30: if ((desc = error_lookup_desc(code))) terom@30: return desc->name; terom@30: else terom@30: // unknown terom@30: return "[unknown]"; terom@6: } terom@6: terom@8: const char *error_msg (const struct error_info *err) terom@7: { terom@7: static char msg[ERROR_MSG_MAXLEN]; terom@30: const struct error_desc *desc; terom@30: terom@30: // do we have an error_desc for it? terom@30: if ((desc = error_lookup_desc(err->code)) == NULL) terom@30: // ??? terom@30: snprintf(msg, ERROR_MSG_MAXLEN, "[%#.8x]: %#.8x", err->code, err->extra); terom@30: terom@30: else terom@30: // intrepret .extra terom@30: switch (desc->extra_type) { terom@30: case ERR_EXTRA_NONE: terom@30: // no additional info terom@30: snprintf(msg, ERROR_MSG_MAXLEN, "%s", desc->name); terom@30: break; terom@30: terom@30: case ERR_EXTRA_ERRNO: terom@30: // strerror terom@30: snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", desc->name, strerror(err->extra)); terom@30: break; terom@30: terom@30: case ERR_EXTRA_GAI: terom@30: // gai_strerror terom@30: snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", desc->name, gai_strerror(err->extra)); terom@30: break; terom@30: terom@30: case ERR_EXTRA_GNUTLS: terom@30: // gnutls_strerror terom@30: snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", desc->name, gnutls_strerror(err->extra)); terom@30: break; terom@30: terom@56: case ERR_EXTRA_STR: terom@56: // static error message string terom@56: snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", desc->name, err->extra_str); terom@56: break; terom@56: terom@30: default: terom@30: // ??? terom@30: snprintf(msg, ERROR_MSG_MAXLEN, "%s: %#.8x", desc->name, err->extra); terom@30: break; terom@30: } terom@7: terom@7: // return static pointer terom@7: return msg; terom@7: } terom@7: