From 054c71c8fdd91c07db0a50394a966755ab57f2f0 Mon Sep 17 00:00:00 2001 From: cashmere Date: Wed, 1 Jul 2026 13:58:41 +0200 Subject: add src/telnet.h --- src/telnet.h | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/telnet.h (limited to 'src') diff --git a/src/telnet.h b/src/telnet.h new file mode 100644 index 0000000..ec22139 --- /dev/null +++ b/src/telnet.h @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include + +struct client { + char nickname[32]; + int has_nickname; +}; + +// returns a socket file descriptor. +// if connection could not be established, -1 gets returned +int establish_connection(struct sockaddr_in addr) { + int sfd = socket(AF_INET, SOCK_STREAM, 0); + if (sfd == -1) { + return -1; + } + int opt = -1; + setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + int bind_addr = bind(sfd, (struct sockaddr *)&addr, sizeof(addr)); + if (bind_addr == -1) { + close(sfd); + return -1; + } + int listen_addr = listen(sfd, 100); + if (listen_addr == -1) { + close(sfd); + return -1; + } + return sfd; +} + +// handles new telnet connections. +// returns 0 on success and -1 on failure. +int handle_new_connection(int sfd, struct pollfd *fds, nfds_t *nfds, + struct client *clients) { + int conn = accept(sfd, NULL, NULL); + if (conn == -1) + return -1; + fds[*nfds].fd = conn; + fds[*nfds].events = POLLIN; + clients[*nfds].has_nickname = 0; + char *message = "Enter your nickname:\n"; + write(fds[*nfds].fd, message, strlen(message)); + + (*nfds)++; + return 0; +} + +// process message to all the connected clients. +// returns 0 on success and -1 on failure. +// TODO: add struct client *clients +int process_message(struct pollfd *fds, nfds_t *nfds, struct client *clients) { + for (nfds_t i = 1; i < *nfds; i++) { + /* if client has something to say */ + if (fds[i].revents & POLLIN) { + char buffer[1024]; /* create a new empty buffer */ + ssize_t message = + read(fds[i].fd, buffer, + sizeof(buffer)); /* read the message which the client sent */ + if (message == 0) { + /* close the connection if client disappeared or disconnected */ + close(fds[i].fd); + fds[i] = fds[*nfds - 1]; /* move back last slot */ + (*nfds)--; /* size down the current array */ + i--; + } else if (message == -1) { + /* if message of the client returns an error */ + close(fds[i].fd); + fds[i] = fds[*nfds - 1]; /* move back last slot */ + (*nfds)--; /* size down the current array */ + i--; + return -1; + } else { + if (clients[i].has_nickname == 0) { + + } + /* send every message bytes to the other clients */ + for (nfds_t j = 1; j < *nfds; j++) { + if (j != i) { + write(fds[j].fd, buffer, message); + } + } + } + } + } + return 0; +} -- cgit v1.3.1