Mercurial
diff seobeo/s_linux_network.c @ 6:1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Mon, 29 Sep 2025 16:00:44 -0700 |
| parents | 0b3b4f5887bb |
| children | fb2cff495a60 |
line wrap: on
line diff
--- a/seobeo/s_linux_network.c Sat Sep 27 16:23:04 2025 -0700 +++ b/seobeo/s_linux_network.c Mon Sep 29 16:00:44 2025 -0700 @@ -110,12 +110,12 @@ return p_handle; } -Seobeo_PHandle Seobeo_Stream_Handle_Accept(Seobeo_PHandle server_h) +Seobeo_PHandle Seobeo_Stream_Handle_Accept(Seobeo_PHandle p_server_handle) { struct sockaddr_storage addr; socklen_t addrlen = sizeof addr; char client_inet_addr[INET6_ADDRSTRLEN]; - int client_fd = accept(server_h->socket, + int client_fd = accept(p_server_handle->socket, (struct sockaddr*)&addr, &addrlen); inet_ntop( @@ -128,45 +128,46 @@ return NULL; } - Seobeo_PHandle h = malloc(sizeof *h); + Seobeo_PHandle p_client_handle = malloc(sizeof *p_client_handle); - h->socket = client_fd; - h->host = strdup(client_inet_addr); - h->port = NULL; + p_client_handle->socket = client_fd; + p_client_handle->host = strdup(client_inet_addr); + p_client_handle->port = NULL; - h->read_buffer_capacity = server_h->read_buffer_capacity; - h->read_buffer_len = 0; - h->read_buffer = malloc(h->read_buffer_capacity); + p_client_handle->read_buffer_capacity = p_server_handle->read_buffer_capacity; + p_client_handle->read_buffer_len = 0; + p_client_handle->read_buffer = malloc(p_client_handle->read_buffer_capacity); - h->write_buffer_capacity = server_h->write_buffer_capacity; - h->write_buffer_len = 0; - h->write_buffer = malloc(h->write_buffer_capacity); + p_client_handle->write_buffer_capacity = p_server_handle->write_buffer_capacity; + p_client_handle->write_buffer_len = 0; + p_client_handle->write_buffer = malloc(p_client_handle->write_buffer_capacity); - return h; + return p_client_handle; } -void Seobeo_Handle_Destroy(Seobeo_PHandle h) +void Seobeo_Handle_Destroy(Seobeo_PHandle p_handle) { - close(h->socket); - free(h->host); - free(h->port); - free(h->read_buffer); - free(h->write_buffer); - free(h->file); - free(h->text_copy); - free(h->file_name); - free(h); + close(p_handle->socket); + free(p_handle->host); + free(p_handle->port); + free(p_handle->read_buffer); + free(p_handle->write_buffer); + free(p_handle->file); + free(p_handle->text_copy); + free(p_handle->file_name); + free(p_handle); } -int Seobeo_Handle_Flush(Seobeo_PHandle h) +int Seobeo_Handle_Flush(Seobeo_PHandle p_handle) { - uint32 total = h->write_buffer_len; + uint32 total = p_handle->write_buffer_len; uint32 sent = 0; - while (sent < total) { + while (sent < total) + { ssize_t n = write( - h->socket, - h->write_buffer + sent, + p_handle->socket, + p_handle->write_buffer + sent, total - sent ); if (n < 0) { @@ -177,28 +178,29 @@ sent += (uint32)n; } - h->write_buffer_len = 0; + p_handle->write_buffer_len = 0; return 0; } - -int Seobeo_Handle_QueueData(Seobeo_PHandle h, const uint8_t *data, uint32_t data_size) +int Seobeo_Handle_Queue(Seobeo_PHandle p_handle, const uint8_t *data, uint32_t data_size) { - if (h->write_buffer_len + data_size > h->write_buffer_capacity) { - int rc = Seobeo_Handle_Flush(h); + if (p_handle->write_buffer_len + data_size > p_handle->write_buffer_capacity) + { + int rc = Seobeo_Handle_Flush(p_handle); if (rc < 0) return -1; if (rc > 0) return 1; } - if (data_size > h->write_buffer_capacity) + if (data_size > p_handle->write_buffer_capacity) { uint32_t offset = 0; while (offset < data_size) { - ssize_t n = write(h->socket, + ssize_t n = write(p_handle->socket, data + offset, data_size - offset); - if (n < 0) { + if (n < 0) + { if (errno == EINTR) continue; if (errno == EAGAIN) return 1; return -1; @@ -208,13 +210,55 @@ return 0; } - memcpy(h->write_buffer + h->write_buffer_len, + memcpy(p_handle->write_buffer + p_handle->write_buffer_len, data, data_size); - h->write_buffer_len += data_size; + p_handle->write_buffer_len += data_size; return 0; } +int Seobeo_Handle_Read(Seobeo_PHandle p_handle) +{ + // How many bytes we can still read into the buffer + uint32 free_space = p_handle->read_buffer_capacity - p_handle->read_buffer_len; + if (free_space == 0) + return -1; + + ssize_t n = read( + p_handle->socket, + p_handle->read_buffer + p_handle->read_buffer_len, + free_space + ); + if (n < 0) { + if (errno == EINTR) return Seobeo_Handle_Read(p_handle); + if (errno == EAGAIN) return 0; // no data available right now + return -1; // fatal error + } + if (n == 0) { + return -2; // peer closed the connection + } + + p_handle->read_buffer_len += (uint32)n; + return (int)n; // number of bytes read +} + +void Seobeo_Handle_Consume(Seobeo_PHandle p_handle, uint32 consumed) +{ + if (consumed >= p_handle->read_buffer_len) + { + p_handle->read_buffer_len = 0; + return; + } + + // Slide remaining bytes to the front + memmove( + p_handle->read_buffer, + p_handle->read_buffer + consumed, + p_handle->read_buffer_len - consumed + ); + p_handle->read_buffer_len -= consumed; +} + void *Seobeo_GetIP4OrIP6(struct sockaddr *sa) { if (sa->sa_family == AF_INET)