1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-12-04 14:46:30 -05:00

Update: Refactor error codes to a key-indexed array

Instead of storing the ID in the icecast_error_tag, use it as
array index for the error codes lookup list. That way its not
needed anymore to iterate the whole list to lookup errors by id.
This commit is contained in:
Marvin Scholz 2020-09-04 01:27:29 +02:00
parent 987bdec373
commit d22ce7b95d
2 changed files with 209 additions and 133 deletions

View File

@ -16,140 +16,215 @@
#include "logging.h"
#define CATMODULE "errors"
// cut -d' ' -f2 x | while read x; do printf " {.id = %-60s .http_status = xxx,\n .message = \"\"},\n" "$x",; done
static const icecast_error_t __errors[] = {
{.id = ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING, .http_status = 400,
.uuid = "52735a81-16fe-4d7e-9984-5aed8a941055",
.message = "Destination not running"},
{.id = ICECAST_ERROR_ADMIN_METADAT_BADCALL, .http_status = 400,
.uuid = "85d33e67-5c4e-4511-b4fa-3ca69ccd03de",
.message = "illegal metadata call"},
{.id = ICECAST_ERROR_ADMIN_METADAT_NO_SUCH_ACTION, .http_status = 501,
.uuid = "14f4d814-98d9-468c-8a0b-ba5e74c9d771",
.message = "No such action"},
{.id = ICECAST_ERROR_ADMIN_MISSING_PARAMETER, .http_status = 400,
.uuid = "cb11dc71-6149-454c-8d4e-47a3af26b03a",
.message = "Missing parameter"},
{.id = ICECAST_ERROR_ADMIN_missing_parameter, .http_status = 400,
.uuid = "8be9ef0a-2b32-450c-aec9-a414ca0c074c",
.message = "missing parameter"},
{.id = ICECAST_ERROR_ADMIN_MOUNT_NOT_ACCEPT_URL_UPDATES, .http_status = 501,
.uuid = "3bed51bb-a10f-4af3-9965-4e67181de7d6",
.message = "mountpoint will not accept URL updates"},
{.id = ICECAST_ERROR_ADMIN_NO_SUCH_DESTINATION, .http_status = 404,
.uuid = "c5f1ee06-46a0-4697-9f01-6e9fc333d555",
.message = "No such destination"},
{.id = ICECAST_ERROR_ADMIN_ROLEMGN_ADD_NOSYS, .http_status = 501,
.uuid = "7e1a8426-2ae1-4a6b-bfd9-59d8f8153021",
.message = "Adding users to role not supported by role"},
{.id = ICECAST_ERROR_ADMIN_ROLEMGN_DELETE_NOSYS, .http_status = 501,
.uuid = "367fbad1-389e-4292-bba8-c97984e616cc",
.message = "Deleting users from role not supported by role"},
{.id = ICECAST_ERROR_ADMIN_ROLEMGN_ROLE_NOT_FOUND, .http_status = 404,
.uuid = "59fe9c81-8c34-49ff-800f-7ec42ea498be",
.message = "Role not found"},
{.id = ICECAST_ERROR_ADMIN_SOURCE_DOES_NOT_EXIST, .http_status = 404,
.uuid = "2f51a026-02e4-4fe4-bf9d-cc16557b3b65",
.message = "Source does not exist"},
{.id = ICECAST_ERROR_ADMIN_SOURCE_IS_NOT_AVAILABLE, .http_status = 400,
.uuid = "00b9d977-f41d-455f-820f-6d457dffb246",
.message = "Source is not available"},
{.id = ICECAST_ERROR_ADMIN_SUPPLIED_MOUNTPOINTS_ARE_IDENTICAL, .http_status = 400,
.uuid = "4be9a010-7a3f-44e4-b74d-3c6d9c4f7236",
.message = "supplied mountpoints are identical"},
{.id = ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND, .http_status = 400,
.uuid = "811bddac-5be5-4580-9cde-7b849e66dfe5",
.message = "unrecognised command"},
{.id = ICECAST_ERROR_AUTH_BUSY, .http_status = 503,
.uuid = "26708754-8f98-4191-81d1-7fb7246200d6",
.message = "busy, please try again later"},
{.id = ICECAST_ERROR_CON_CONTENT_TYPE_NOSYS, .http_status = 415,
.uuid = "f684ad3c-513b-4d87-9a66-424788bc6adb",
.message = "Content-type not supported"},
{.id = ICECAST_ERROR_CON_INTERNAL_FORMAT_ALLOC_ERROR, .http_status = 500,
.uuid = "47a4b11b-5d2a-46e2-8948-942e7b0af3e6",
.message = "internal format allocation problem"},
{.id = ICECAST_ERROR_CON_MISSING_PASS_PARAMETER, .http_status = 400 /* XXX */,
.uuid = "b59c3a05-e2b1-4a14-8798-bbe1ae46603b",
.message = "missing pass parameter"},
{.id = ICECAST_ERROR_CON_MOUNT_IN_USE, .http_status = 409,
.uuid = "c5724467-5f85-48c7-b45a-915c3150c292",
.message = "Mountpoint in use"},
{.id = ICECAST_ERROR_CON_MOUNTPOINT_NOT_STARTING_WITH_SLASH, .http_status = 400,
.uuid = "1ae45ead-40fc-4de2-b56f-e54d3247f2ee",
.message = "source mountpoint not starting with /"},
{.id = ICECAST_ERROR_CON_NO_CONTENT_TYPE_GIVEN, .http_status = 400,
.uuid = "2cd86778-ac30-49e7-a108-26d627a7923b",
.message = "No Content-type given"},
{.id = ICECAST_ERROR_CON_PER_CRED_CLIENT_LIMIT, .http_status = 429,
.uuid = "9c72c1ec-f638-4d33-a077-6acbbff25317",
.message = "Reached limit of concurrent connections on those credentials"},
{.id = ICECAST_ERROR_CON_rejecting_client_for_whatever_reason, .http_status = 403 /* XXX */,
.uuid = "534ee9af-8be5-4645-a839-501d22d541bd",
.message = "Rejecting client for whatever reason"},
{.id = ICECAST_ERROR_CON_SOURCE_CLIENT_LIMIT, .http_status = 503,
.uuid = "c770182d-c854-422a-a8e5-7142689234a3",
.message = "too many sources connected"},
{.id = ICECAST_ERROR_CON_UNIMPLEMENTED, .http_status = 501,
.uuid = "58ce6cb4-72b4-49da-8ad2-feaf775bc61e",
.message = "Unimplemented"},
{.id = ICECAST_ERROR_CON_UNKNOWN_REQUEST, .http_status = 405,
.uuid = "78f590cc-8812-40d5-a4ef-17344ab75b35",
.message = "unknown request"},
{.id = ICECAST_ERROR_CON_UPGRADE_ERROR, .http_status = 400 /* XXX */,
.uuid = "ec16f654-f262-415f-ab91-95703ae33704",
.message = "Can not upgrade protocol"},
{.id = ICECAST_ERROR_FSERV_FILE_NOT_FOUND, .http_status = 404,
.uuid = "18c32b43-0d8e-469d-b434-10133cdd06ad",
.message = "The file you requested could not be found"},
{.id = ICECAST_ERROR_FSERV_FILE_NOT_READABLE, .http_status = 404 /* XXX */,
.uuid = "c883d55d-fb41-4f4c-8800-563f5542f51d",
.message = "File not readable"},
{.id = ICECAST_ERROR_FSERV_REQUEST_RANGE_NOT_SATISFIABLE, .http_status = 416,
.uuid = "5874cc51-770b-42b5-82d2-737b2b406b30",
.message = "Request Range Not Satisfiable"},
{.id = ICECAST_ERROR_GEN_BUFFER_REALLOC, .http_status = 500,
.uuid = "cda8203e-f237-4090-8d43-544efdd6295c",
.message = "Buffer reallocation failed."},
{.id = ICECAST_ERROR_GEN_CLIENT_LIMIT, .http_status = 503,
.uuid = "87fd3e61-6702-4473-b506-f616d27a142f",
.message = "Icecast connection limit reached"},
{.id = ICECAST_ERROR_GEN_CLIENT_NEEDS_TO_AUTHENTICATE, .http_status = 401,
.uuid = "25387198-0643-4577-9139-7c4f24f59d4a",
.message = "You need to authenticate"},
{.id = ICECAST_ERROR_GEN_HEADER_GEN_FAILED, .http_status = 500,
.uuid = "a8b3c3fe-cb87-45fe-9a9d-ee4c2075d43a",
.message = "Header generation failed."},
{.id = ICECAST_ERROR_GEN_MEMORY_EXHAUSTED, .http_status = 503,
.uuid = "18411e73-713e-4910-b7e4-52a2e324b4e0",
.message = "memory exhausted"},
{.id = ICECAST_ERROR_SOURCE_MOUNT_UNAVAILABLE, .http_status = 404 /* XXX */,
.uuid = "88d06875-fcf2-4417-84af-05866c97745c",
.message = "Mount unavailable"},
{.id = ICECAST_ERROR_SOURCE_STREAM_PREPARATION_ERROR, .http_status = 500 /* XXX */,
.uuid = "9e50d94d-f03d-4515-8216-577bf8e9f70d",
.message = "Stream preparation error"},
{.id = ICECAST_ERROR_XSLT_PARSE, .http_status = 404 /* XXX */,
.uuid = "f86b5b28-c1f8-49f6-a4cd-a18e2a6a44fd",
.message = "Could not parse XSLT file"},
{.id = ICECAST_ERROR_XSLT_problem, .http_status = 500,
.uuid = "d3c6e4b3-7d6e-4191-a81b-970273067ae3",
.message = "XSLT problem"},
{.id = ICECAST_ERROR_RECURSIVE_ERROR, .http_status = 500,
.uuid = "13489d5c-eae6-4bf3-889e-ec1fa9a9b9ac",
.message = "Recursive error"}
static const icecast_error_t __errors[ICECAST_ERROR_END_SENTINEL] =
{
[ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING] = {
.http_status = 400,
.uuid = "52735a81-16fe-4d7e-9984-5aed8a941055",
.message = "Destination not running"
},
[ICECAST_ERROR_ADMIN_METADAT_BADCALL] = {
.http_status = 400,
.uuid = "85d33e67-5c4e-4511-b4fa-3ca69ccd03de",
.message = "illegal metadata call"
},
[ICECAST_ERROR_ADMIN_METADAT_NO_SUCH_ACTION] = {
.http_status = 501,
.uuid = "14f4d814-98d9-468c-8a0b-ba5e74c9d771",
.message = "No such action"
},
[ICECAST_ERROR_ADMIN_MISSING_PARAMETER] = {
.http_status = 400,
.uuid = "cb11dc71-6149-454c-8d4e-47a3af26b03a",
.message = "Missing parameter"
},
[ICECAST_ERROR_ADMIN_missing_parameter] = {
.http_status = 400,
.uuid = "8be9ef0a-2b32-450c-aec9-a414ca0c074c",
.message = "missing parameter"
},
[ICECAST_ERROR_ADMIN_MOUNT_NOT_ACCEPT_URL_UPDATES] = {
.http_status = 501,
.uuid = "3bed51bb-a10f-4af3-9965-4e67181de7d6",
.message = "mountpoint will not accept URL updates"
},
[ICECAST_ERROR_ADMIN_NO_SUCH_DESTINATION] = {
.http_status = 404,
.uuid = "c5f1ee06-46a0-4697-9f01-6e9fc333d555",
.message = "No such destination"
},
[ICECAST_ERROR_ADMIN_ROLEMGN_ADD_NOSYS] = {
.http_status = 501,
.uuid = "7e1a8426-2ae1-4a6b-bfd9-59d8f8153021",
.message = "Adding users to role not supported by role"
},
[ICECAST_ERROR_ADMIN_ROLEMGN_DELETE_NOSYS] = {
.http_status = 501,
.uuid = "367fbad1-389e-4292-bba8-c97984e616cc",
.message = "Deleting users from role not supported by role"
},
[ICECAST_ERROR_ADMIN_ROLEMGN_ROLE_NOT_FOUND] = {
.http_status = 404,
.uuid = "59fe9c81-8c34-49ff-800f-7ec42ea498be",
.message = "Role not found"
},
[ICECAST_ERROR_ADMIN_SOURCE_DOES_NOT_EXIST] = {
.http_status = 404,
.uuid = "2f51a026-02e4-4fe4-bf9d-cc16557b3b65",
.message = "Source does not exist"
},
[ICECAST_ERROR_ADMIN_SOURCE_IS_NOT_AVAILABLE] = {
.http_status = 400,
.uuid = "00b9d977-f41d-455f-820f-6d457dffb246",
.message = "Source is not available"
},
[ICECAST_ERROR_ADMIN_SUPPLIED_MOUNTPOINTS_ARE_IDENTICAL] = {
.http_status = 400,
.uuid = "4be9a010-7a3f-44e4-b74d-3c6d9c4f7236",
.message = "supplied mountpoints are identical"
},
[ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND] = {
.http_status = 400,
.uuid = "811bddac-5be5-4580-9cde-7b849e66dfe5",
.message = "unrecognised command"
},
[ICECAST_ERROR_AUTH_BUSY] = {
.http_status = 503,
.uuid = "26708754-8f98-4191-81d1-7fb7246200d6",
.message = "busy, please try again later"
},
[ICECAST_ERROR_CON_CONTENT_TYPE_NOSYS] = {
.http_status = 415,
.uuid = "f684ad3c-513b-4d87-9a66-424788bc6adb",
.message = "Content-type not supported"
},
[ICECAST_ERROR_CON_INTERNAL_FORMAT_ALLOC_ERROR] = {
.http_status = 500,
.uuid = "47a4b11b-5d2a-46e2-8948-942e7b0af3e6",
.message = "internal format allocation problem"
},
[ICECAST_ERROR_CON_MISSING_PASS_PARAMETER] = {
.http_status = 400 /* XXX */,
.uuid = "b59c3a05-e2b1-4a14-8798-bbe1ae46603b",
.message = "missing pass parameter"
},
[ICECAST_ERROR_CON_MOUNT_IN_USE] = {
.http_status = 409,
.uuid = "c5724467-5f85-48c7-b45a-915c3150c292",
.message = "Mountpoint in use"
},
[ICECAST_ERROR_CON_MOUNTPOINT_NOT_STARTING_WITH_SLASH] = {
.http_status = 400,
.uuid = "1ae45ead-40fc-4de2-b56f-e54d3247f2ee",
.message = "source mountpoint not starting with /"
},
[ICECAST_ERROR_CON_NO_CONTENT_TYPE_GIVEN] = {
.http_status = 400,
.uuid = "2cd86778-ac30-49e7-a108-26d627a7923b",
.message = "No Content-type given"
},
[ICECAST_ERROR_CON_PER_CRED_CLIENT_LIMIT] = {
.http_status = 429,
.uuid = "9c72c1ec-f638-4d33-a077-6acbbff25317",
.message = "Reached limit of concurrent connections on those credentials"
},
[ICECAST_ERROR_CON_rejecting_client_for_whatever_reason] = {
.http_status = 403 /* XXX */,
.uuid = "534ee9af-8be5-4645-a839-501d22d541bd",
.message = "Rejecting client for whatever reason"
},
[ICECAST_ERROR_CON_SOURCE_CLIENT_LIMIT] = {
.http_status = 503,
.uuid = "c770182d-c854-422a-a8e5-7142689234a3",
.message = "too many sources connected"
},
[ICECAST_ERROR_CON_UNIMPLEMENTED] = {
.http_status = 501,
.uuid = "58ce6cb4-72b4-49da-8ad2-feaf775bc61e",
.message = "Unimplemented"
},
[ICECAST_ERROR_CON_UNKNOWN_REQUEST] = {
.http_status = 405,
.uuid = "78f590cc-8812-40d5-a4ef-17344ab75b35",
.message = "unknown request"
},
[ICECAST_ERROR_CON_UPGRADE_ERROR] = {
.http_status = 400 /* XXX */,
.uuid = "ec16f654-f262-415f-ab91-95703ae33704",
.message = "Can not upgrade protocol"
},
[ICECAST_ERROR_FSERV_FILE_NOT_FOUND] = {
.http_status = 404,
.uuid = "18c32b43-0d8e-469d-b434-10133cdd06ad",
.message = "The file you requested could not be found"
},
[ICECAST_ERROR_FSERV_FILE_NOT_READABLE] = {
.http_status = 404 /* XXX */,
.uuid = "c883d55d-fb41-4f4c-8800-563f5542f51d",
.message = "File not readable"
},
[ICECAST_ERROR_FSERV_REQUEST_RANGE_NOT_SATISFIABLE] = {
.http_status = 416,
.uuid = "5874cc51-770b-42b5-82d2-737b2b406b30",
.message = "Request Range Not Satisfiable"
},
[ICECAST_ERROR_GEN_BUFFER_REALLOC] = {
.http_status = 500,
.uuid = "cda8203e-f237-4090-8d43-544efdd6295c",
.message = "Buffer reallocation failed."
},
[ICECAST_ERROR_GEN_CLIENT_LIMIT] = {
.http_status = 503,
.uuid = "87fd3e61-6702-4473-b506-f616d27a142f",
.message = "Icecast connection limit reached"
},
[ICECAST_ERROR_GEN_CLIENT_NEEDS_TO_AUTHENTICATE] = {
.http_status = 401,
.uuid = "25387198-0643-4577-9139-7c4f24f59d4a",
.message = "You need to authenticate"
},
[ICECAST_ERROR_GEN_HEADER_GEN_FAILED] = {
.http_status = 500,
.uuid = "a8b3c3fe-cb87-45fe-9a9d-ee4c2075d43a",
.message = "Header generation failed."
},
[ICECAST_ERROR_GEN_MEMORY_EXHAUSTED] = {
.http_status = 503,
.uuid = "18411e73-713e-4910-b7e4-52a2e324b4e0",
.message = "memory exhausted"
},
[ICECAST_ERROR_SOURCE_MOUNT_UNAVAILABLE] = {
.http_status = 404 /* XXX */,
.uuid = "88d06875-fcf2-4417-84af-05866c97745c",
.message = "Mount unavailable"
},
[ICECAST_ERROR_SOURCE_STREAM_PREPARATION_ERROR] = {
.http_status = 500 /* XXX */,
.uuid = "9e50d94d-f03d-4515-8216-577bf8e9f70d",
.message = "Stream preparation error"
},
[ICECAST_ERROR_XSLT_PARSE] = {
.http_status = 404 /* XXX */,
.uuid = "f86b5b28-c1f8-49f6-a4cd-a18e2a6a44fd",
.message = "Could not parse XSLT file"
},
[ICECAST_ERROR_XSLT_problem] = {
.http_status = 500,
.uuid = "d3c6e4b3-7d6e-4191-a81b-970273067ae3",
.message = "XSLT problem"
},
[ICECAST_ERROR_RECURSIVE_ERROR] = {
.http_status = 500,
.uuid = "13489d5c-eae6-4bf3-889e-ec1fa9a9b9ac",
.message = "Recursive error"
},
};
const icecast_error_t * error_get_by_id(icecast_error_id_t id) {
size_t i;
if (id >= ICECAST_ERROR_END_SENTINEL || id < 0)
return NULL;
for (i = 0; i < (sizeof(__errors)/sizeof(*__errors)); i++) {
if (__errors[i].id == id) {
return &(__errors[i]);
}
}
return NULL;
return &(__errors[id]);
}
const icecast_error_t * error_get_by_uuid(const char *uuid)

View File

@ -10,7 +10,7 @@
#define __ERRORS_H__
typedef enum {
ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING,
ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING = 0,
ICECAST_ERROR_ADMIN_METADAT_BADCALL,
ICECAST_ERROR_ADMIN_METADAT_NO_SUCH_ACTION,
ICECAST_ERROR_ADMIN_MISSING_PARAMETER,
@ -49,11 +49,12 @@ typedef enum {
ICECAST_ERROR_SOURCE_STREAM_PREPARATION_ERROR,
ICECAST_ERROR_XSLT_PARSE,
ICECAST_ERROR_XSLT_problem,
ICECAST_ERROR_RECURSIVE_ERROR
ICECAST_ERROR_RECURSIVE_ERROR,
ICECAST_ERROR_END_SENTINEL /* This element must always be the last! */
} icecast_error_id_t;
struct icecast_error_tag {
const icecast_error_id_t id;
const int http_status;
const char *uuid;
const char *message;