feat(error): refactor error handling

This commit is contained in:
lohhiiccc 2026-01-25 15:10:18 +01:00
parent 34daac0361
commit 7f79d4c8c4
9 changed files with 23 additions and 23 deletions

View file

@ -16,9 +16,11 @@ struct icmp_handle {
#define ICMP_ERR_RECV -4
#define ICMP_ERR_INVALID -5
#define ICMP_ERR_ENOMEM -6
#define ICMP_ERR_AGAIN -7
#define ICMP_ERR_EAGAIN -7
/* Internal error handling functions */
void icmp_set_error(struct icmp_handle *h, int code, const char *msg);
void icmp_set_error_fmt(struct icmp_handle *h, int code, const char *fmt, ...);
void icmp_clear_error(struct icmp_handle *h);
#endif

View file

@ -9,8 +9,4 @@ int socket_create(struct icmp_handle *h);
/* Configure socket (non-blocking, buffer size) */
int socket_configure(struct icmp_handle *h);
/* Internal helpers for error handling */
void socket_clear_error(struct icmp_handle *h);
void socket_set_error(struct icmp_handle *h, int code, const char *fmt, ...);
#endif

View file

@ -2,11 +2,12 @@ SRC_DIR = src
SRCS += $(SRC_DIR)/utils/checksum.c
SRCS += $(SRC_DIR)/utils/time.c
SRCS += $(SRC_DIR)/error/set_error.c
SRCS += $(SRC_DIR)/error/set_error_fmt.c
SRCS += $(SRC_DIR)/error/clear_error.c
SRCS += $(SRC_DIR)/error/strerror.c
SRCS += $(SRC_DIR)/error/should_retry.c
SRCS += $(SRC_DIR)/socket/create.c
SRCS += $(SRC_DIR)/socket/configure.c
SRCS += $(SRC_DIR)/socket/utils.c
SRCS += $(SRC_DIR)/handle/create.c
SRCS += $(SRC_DIR)/handle/destroy.c
SRCS += $(SRC_DIR)/handle/get_fd.c

8
src/error/clear_error.c Normal file
View file

@ -0,0 +1,8 @@
#include "internal/icmp_internal.h"
void
icmp_clear_error(struct icmp_handle *h)
{
h->last_error = ICMP_OK;
h->error_msg[0] = '\0';
}

View file

@ -3,14 +3,7 @@
#include <stdio.h>
void
socket_clear_error(struct icmp_handle *h)
{
h->last_error = ICMP_OK;
h->error_msg[0] = '\0';
}
void
socket_set_error(struct icmp_handle *h, int code, const char *fmt, ...)
icmp_set_error_fmt(struct icmp_handle *h, int code, const char *fmt, ...)
{
va_list args;

View file

@ -9,5 +9,5 @@ icmp_should_retry(const icmp_handle_t *h)
if (NULL == handle)
return 0;
return (ICMP_ERR_AGAIN == handle->last_error) ? 1 : 0;
return (ICMP_ERR_EAGAIN == handle->last_error) ? 1 : 0;
}

View file

@ -29,7 +29,7 @@ socket_configure(struct icmp_handle *h)
}
/* Clear error state on success */
socket_clear_error(h);
icmp_clear_error(h);
return 0;
}
@ -37,6 +37,6 @@ socket_configure(struct icmp_handle *h)
static void
handle_configure_error(struct icmp_handle *h, const char *func)
{
socket_set_error(h, ICMP_ERR_SOCKET,
icmp_set_error_fmt(h, ICMP_ERR_SOCKET,
"%s failed: %s", func, strerror(errno));
}

View file

@ -27,7 +27,7 @@ socket_create(struct icmp_handle *h)
h->fd = fd;
/* Clear error state on success */
socket_clear_error(h);
icmp_clear_error(h);
return 0;
}
@ -37,12 +37,12 @@ handle_socket_error(struct icmp_handle *h, int err)
{
if (EPERM == err)
{
socket_set_error(h, ICMP_ERR_PERMISSION,
icmp_set_error_fmt(h, ICMP_ERR_PERMISSION,
"Raw socket requires CAP_NET_RAW or root");
}
else
{
socket_set_error(h, ICMP_ERR_SOCKET,
icmp_set_error_fmt(h, ICMP_ERR_SOCKET,
"socket() failed: %s", strerror(err));
}
}

View file

@ -57,16 +57,16 @@ Test(error, strerror_no_error)
cr_assert_str_eq(msg, "No error");
}
/* Test 7: should_retry returns 1 for ICMP_ERR_AGAIN */
/* Test 7: should_retry returns 1 for ICMP_ERR_EAGAIN */
Test(error, should_retry_with_eagain)
{
struct icmp_handle h = {0};
h.last_error = ICMP_ERR_AGAIN;
h.last_error = ICMP_ERR_EAGAIN;
strcpy(h.error_msg, "Send would block");
int should_retry = icmp_should_retry((icmp_handle_t *)&h);
cr_assert_eq(should_retry, 1, "Should return 1 for ICMP_ERR_AGAIN");
cr_assert_eq(should_retry, 1, "Should return 1 for ICMP_ERR_EAGAIN");
}
/* Test 8: should_retry returns 0 for other errors */