Skip to content
Snippets Groups Projects
Commit 0ad6972d authored by Christopher Bohn's avatar Christopher Bohn :thinking:
Browse files

Extracted add/remove client from process-based server to common code

parent 93682a51
No related branches found
No related tags found
No related merge requests found
#include <stdbool.h>
#include <signal.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include "chat.h"
#include "chat-server.h" #include "chat-server.h"
void manage_server(int connect_socket_fd); void manage_server(int connect_socket_fd);
void manage_client(int socket_fd); void manage_client(int socket_fd);
void repeat_messages(int *client_fd_list, pid_t *handler_pid_list, int list_length, char *message); void repeat_messages(int *client_fd_list, pid_t *handler_pid_list, int list_length, char *message);
void add_client(int new_client_fd, int **client_fd_list, pid_t new_handler_pid, pid_t **handler_pid_list, int *list_length);
void remove_client(int exiting_client_fd, int *client_fd_list, pid_t *handler_pid_list);
void on_signal_listener(int sig); void on_signal_listener(int sig);
void on_signal_handler(int sig); void on_signal_handler(int sig);
void on_sigusr1(int sig); void on_sigusr1(int sig);
...@@ -100,42 +95,6 @@ void manage_server(int connect_socket_fd) { ...@@ -100,42 +95,6 @@ void manage_server(int connect_socket_fd) {
} }
} }
void add_client(int new_client_fd, int **client_fd_list, pid_t new_handler_pid, pid_t **handler_pid_list, int *list_length) {
int i = 0;
int *client_list = *client_fd_list;
int *handler_list = *handler_pid_list;
while (client_list[i] && (i < *list_length)) {
i++;
}
if (i == *list_length) {
// need to grow the lists
client_list = calloc(2 * (*list_length), sizeof(int));
handler_list = calloc(2 * (*list_length), sizeof(pid_t));
for (int j = 0; j < *list_length; j++) {
client_list[j] = (*client_fd_list)[j];
handler_list[j] = (*handler_pid_list)[j];
}
free(*client_fd_list);
free(*handler_pid_list);
*list_length *= 2;
}
client_list[i] = new_client_fd;
handler_list[i] = new_handler_pid;
*client_fd_list = client_list;
*handler_pid_list = handler_list;
}
void remove_client(int exiting_client_fd, int *client_fd_list, pid_t *handler_pid_list) {
if (exiting_client_fd) {
while (*client_fd_list != exiting_client_fd) {
client_fd_list++;
handler_pid_list++;
}
*client_fd_list = 0;
*handler_pid_list = 0;
}
}
void repeat_messages(int *client_fd_list, pid_t *handler_pid_list, int list_length, char *message) { void repeat_messages(int *client_fd_list, pid_t *handler_pid_list, int list_length, char *message) {
long exiting_client_fd; long exiting_client_fd;
char *original_start, *new_start; char *original_start, *new_start;
......
...@@ -52,3 +52,39 @@ int listen_to_port(unsigned short port, struct sockaddr_in *server_socket_addres ...@@ -52,3 +52,39 @@ int listen_to_port(unsigned short port, struct sockaddr_in *server_socket_addres
} }
return listening_socket_fd; return listening_socket_fd;
} }
void add_client(int new_client_fd, int **client_fd_list, pid_t new_handler_pid, pid_t **handler_pid_list, int *list_length) {
int i = 0;
int *client_list = *client_fd_list;
int *handler_list = *handler_pid_list;
while (client_list[i] && (i < *list_length)) {
i++;
}
if (i == *list_length) {
// need to grow the lists
client_list = calloc(2 * (*list_length), sizeof(int));
handler_list = calloc(2 * (*list_length), sizeof(pid_t));
for (int j = 0; j < *list_length; j++) {
client_list[j] = (*client_fd_list)[j];
handler_list[j] = (*handler_pid_list)[j];
}
free(*client_fd_list);
free(*handler_pid_list);
*list_length *= 2;
}
client_list[i] = new_client_fd;
handler_list[i] = new_handler_pid;
*client_fd_list = client_list;
*handler_pid_list = handler_list;
}
void remove_client(int exiting_client_fd, int *client_fd_list, pid_t *handler_pid_list) {
if (exiting_client_fd) {
while (*client_fd_list != exiting_client_fd) {
client_fd_list++;
handler_pid_list++;
}
*client_fd_list = 0;
*handler_pid_list = 0;
}
}
\ No newline at end of file
...@@ -7,5 +7,7 @@ ...@@ -7,5 +7,7 @@
void display_host_info(unsigned short port); void display_host_info(unsigned short port);
int listen_to_port(unsigned short port, struct sockaddr_in *server_socket_address); int listen_to_port(unsigned short port, struct sockaddr_in *server_socket_address);
void add_client(int new_client_fd, int **client_fd_list, pid_t new_handler_pid, pid_t **handler_pid_list, int *list_length);
void remove_client(int exiting_client_fd, int *client_fd_list, pid_t *handler_pid_list);
#endif //CHAT_SERVER_H #endif //CHAT_SERVER_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment