Implement server initialization: add Server class with constructor to initialize host and port from ConfigManager

This commit is contained in:
whaffman 2025-09-16 15:05:35 +02:00
parent 3ee0a607a1
commit 94653db136
9 changed files with 1669 additions and 3 deletions

View File

@ -1,5 +1,6 @@
server {
listen 80;
host 0.0.0.0;
server_name localhost;
root /var/www/html;

816
docs/ALLOWED.md Normal file
View File

@ -0,0 +1,816 @@
# Allowed Functions Documentation
This document describes all the system functions allowed for use in the webserv project, organized by functional categories.
# Process Management
## execve
### Prototype
```c
int execve(const char *pathname, char *const argv[], char *const envp[]);
```
### Arguments
- `pathname`: Path to the executable file
- `argv[]`: Array of argument strings (NULL-terminated)
- `envp[]`: Array of environment strings (NULL-terminated)
### Return
Does not return on success; returns -1 on error
### Description
Executes a program by replacing the current process image. Used for CGI script execution in webserv.
## fork
### Prototype
```c
pid_t fork(void);
```
### Arguments
None
### Return
Returns child PID to parent, 0 to child, -1 on error
### Description
Creates a new process by duplicating the current process. Required for executing CGI scripts in separate processes.
## waitpid
### Prototype
```c
pid_t waitpid(pid_t pid, int *status, int options);
```
### Arguments
- `pid`: Process ID to wait for
- `status`: Pointer to store exit status
- `options`: Wait options (WNOHANG, etc.)
### Return
Returns child PID on success, 0 if WNOHANG and no child, -1 on error
### Description
Waits for child process state changes. Essential for managing CGI child processes.
## kill
### Prototype
```c
int kill(pid_t pid, int sig);
```
### Arguments
- `pid`: Process ID
- `sig`: Signal number
### Return
Returns 0 on success, -1 on error
### Description
Sends signals to processes. Used for terminating CGI processes or handling timeouts.
## signal
### Prototype
```c
sighandler_t signal(int signum, sighandler_t handler);
```
### Arguments
- `signum`: Signal number
- `handler`: Signal handler function
### Return
Returns previous handler on success, SIG_ERR on error
### Description
Sets signal handlers. Used for graceful server shutdown and signal management.
# Inter-Process Communication
## pipe
### Prototype
```c
int pipe(int pipefd[2]);
```
### Arguments
- `pipefd[2]`: Array to store file descriptors (pipefd[0] for read, pipefd[1] for write)
### Return
Returns 0 on success, -1 on error
### Description
Creates a pipe for inter-process communication. Essential for CGI communication between parent and child processes.
## socketpair
### Prototype
```c
int socketpair(int domain, int type, int protocol, int sv[2]);
```
### Arguments
- `domain`: Protocol family (AF_UNIX)
- `type`: Socket type (SOCK_STREAM)
- `protocol`: Protocol (usually 0)
- `sv[2]`: Array to store socket descriptors
### Return
Returns 0 on success, -1 on error
### Description
Creates a pair of connected sockets for bi-directional communication between processes.
## dup
### Prototype
```c
int dup(int oldfd);
```
### Arguments
- `oldfd`: File descriptor to duplicate
### Return
Returns new file descriptor on success, -1 on error
### Description
Creates a duplicate of a file descriptor. Useful for redirecting input/output in CGI processes.
## dup2
### Prototype
```c
int dup2(int oldfd, int newfd);
```
### Arguments
- `oldfd`: Source file descriptor
- `newfd`: Target file descriptor number
### Return
Returns new file descriptor on success, -1 on error
### Description
Duplicates a file descriptor to a specific descriptor number. Essential for CGI stdin/stdout redirection.
# Error Handling
## strerror
### Prototype
```c
char *strerror(int errnum);
```
### Arguments
- `errnum`: Error number (usually errno)
### Return
Returns a pointer to error message string
### Description
Converts error numbers to human-readable error messages for debugging and logging.
## gai_strerror
### Prototype
```c
const char *gai_strerror(int errcode);
```
### Arguments
- `errcode`: Error code from getaddrinfo()
### Return
Returns a pointer to error message string
### Description
Converts getaddrinfo() error codes to human-readable messages for network-related error handling.
## errno
### Prototype
```c
extern int errno;
```
### Arguments
None (global variable)
### Return
Current error number
### Description
Global variable that contains the error code of the last failed system call. Used throughout webserv for error checking.
# Network Programming
## socket
### Prototype
```c
int socket(int domain, int type, int protocol);
```
### Arguments
- `domain`: Protocol family (AF_INET, AF_INET6)
- `type`: Socket type (SOCK_STREAM, SOCK_DGRAM)
- `protocol`: Protocol (usually 0)
### Return
Returns socket descriptor on success, -1 on error
### Description
Creates a communication endpoint (socket). Foundation of all network communication in webserv.
## bind
### Prototype
```c
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `addr`: Address structure
- `addrlen`: Address structure size
### Return
Returns 0 on success, -1 on error
### Description
Binds a socket to a specific address and port. Required for server socket setup before listening.
## listen
### Prototype
```c
int listen(int sockfd, int backlog);
```
### Arguments
- `sockfd`: Socket descriptor
- `backlog`: Maximum pending connections
### Return
Returns 0 on success, -1 on error
### Description
Marks a socket as passive, ready to accept connections. Essential for server socket setup.
## accept
### Prototype
```c
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
### Arguments
- `sockfd`: Listening socket descriptor
- `addr`: Buffer for client address
- `addrlen`: Size of address buffer
### Return
Returns new socket descriptor on success, -1 on error
### Description
Accepts incoming connections on a listening socket. Creates new socket for each client connection.
## connect
### Prototype
```c
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `addr`: Server address structure
- `addrlen`: Address structure size
### Return
Returns 0 on success, -1 on error
### Description
Establishes connection to a server. Primarily used for client-side connections (may be used for proxying).
## send
### Prototype
```c
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
```
### Arguments
- `sockfd`: Socket descriptor
- `buf`: Buffer containing data to send
- `len`: Length of data
- `flags`: Send flags
### Return
Returns number of bytes sent on success, -1 on error
### Description
Sends data through a socket connection. Used for sending HTTP responses to clients.
## recv
### Prototype
```c
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
```
### Arguments
- `sockfd`: Socket descriptor
- `buf`: Buffer to store received data
- `len`: Buffer size
- `flags`: Receive flags
### Return
Returns number of bytes received, 0 on connection close, -1 on error
### Description
Receives data from a socket connection. Used for reading HTTP requests from clients.
## setsockopt
### Prototype
```c
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `level`: Protocol level (SOL_SOCKET)
- `optname`: Option name (SO_REUSEADDR, etc.)
- `optval`: Option value
- `optlen`: Option value size
### Return
Returns 0 on success, -1 on error
### Description
Sets socket options. Commonly used to set SO_REUSEADDR for server sockets.
## getsockname
### Prototype
```c
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `addr`: Buffer for address
- `addrlen`: Address buffer size
### Return
Returns 0 on success, -1 on error
### Description
Retrieves the local address of a socket. Useful for determining assigned port numbers.
# Network Utilities
## htons
### Prototype
```c
uint16_t htons(uint16_t hostshort);
```
### Arguments
- `hostshort`: 16-bit number in host byte order
### Return
Returns 16-bit number in network byte order
### Description
Converts 16-bit integers from host to network byte order. Used for port numbers in socket programming.
## htonl
### Prototype
```c
uint32_t htonl(uint32_t hostlong);
```
### Arguments
- `hostlong`: 32-bit number in host byte order
### Return
Returns 32-bit number in network byte order
### Description
Converts 32-bit integers from host to network byte order. Used for IP addresses in socket programming.
## ntohs
### Prototype
```c
uint16_t ntohs(uint16_t netshort);
```
### Arguments
- `netshort`: 16-bit number in network byte order
### Return
Returns 16-bit number in host byte order
### Description
Converts 16-bit integers from network to host byte order. Used when receiving port numbers from network.
## ntohl
### Prototype
```c
uint32_t ntohl(uint32_t netlong);
```
### Arguments
- `netlong`: 32-bit number in network byte order
### Return
Returns 32-bit number in host byte order
### Description
Converts 32-bit integers from network to host byte order. Used when receiving IP addresses from network.
## getaddrinfo
### Prototype
```c
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
```
### Arguments
- `node`: Hostname or IP address
- `service`: Port number or service name
- `hints`: Address criteria
- `res`: Pointer to store result list
### Return
Returns 0 on success, non-zero error code on failure
### Description
Resolves hostnames and service names to socket addresses. Used for address resolution in network programming.
## freeaddrinfo
### Prototype
```c
void freeaddrinfo(struct addrinfo *res);
```
### Arguments
- `res`: Address info structure to free
### Return
None (void function)
### Description
Frees memory allocated by getaddrinfo(). Essential for preventing memory leaks.
## getprotobyname
### Prototype
```c
struct protoent *getprotobyname(const char *name);
```
### Arguments
- `name`: Protocol name ("tcp", "udp")
### Return
Returns protocol entry structure, NULL on error
### Description
Looks up protocol information by name. May be used for protocol-specific socket operations.
# I/O Multiplexing
## select
### Prototype
```c
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
```
### Arguments
- `nfds`: Highest file descriptor number + 1
- `readfds`: Set of file descriptors to check for readability
- `writefds`: Set of file descriptors to check for writability
- `exceptfds`: Set of file descriptors to check for exceptions
- `timeout`: Timeout specification
### Return
Returns number of ready descriptors, 0 on timeout, -1 on error
### Description
Multiplexes I/O operations by monitoring multiple file descriptors. Alternative to epoll for handling multiple connections.
## poll
### Prototype
```c
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
```
### Arguments
- `fds`: Array of pollfd structures
- `nfds`: Number of file descriptors
- `timeout`: Timeout in milliseconds
### Return
Returns number of ready descriptors, 0 on timeout, -1 on error
### Description
More efficient alternative to select() for I/O multiplexing. Monitors multiple file descriptors for I/O events.
## epoll_create
### Prototype
```c
int epoll_create(int size);
```
### Arguments
- `size`: Size hint (ignored in modern kernels)
### Return
Returns epoll file descriptor on success, -1 on error
### Description
Creates an epoll instance for efficient I/O event monitoring. Linux-specific alternative to select/poll.
## epoll_ctl
### Prototype
```c
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
```
### Arguments
- `epfd`: Epoll file descriptor
- `op`: Operation (EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL)
- `fd`: Target file descriptor
- `event`: Event specification
### Return
Returns 0 on success, -1 on error
### Description
Controls epoll instance by adding, modifying, or removing file descriptors from monitoring.
## epoll_wait
### Prototype
```c
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
```
### Arguments
- `epfd`: Epoll file descriptor
- `events`: Buffer for returned events
- `maxevents`: Maximum number of events
- `timeout`: Timeout in milliseconds
### Return
Returns number of ready events, 0 on timeout, -1 on error
### Description
Waits for I/O events on an epoll instance. Core function for epoll-based event loops.
## kqueue
### Prototype
```c
int kqueue(void);
```
### Arguments
None
### Return
Returns kqueue descriptor on success, -1 on error
### Description
Creates a kernel event queue. BSD-specific alternative to epoll for efficient event monitoring.
## kevent
### Prototype
```c
int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);
```
### Arguments
- `kq`: kqueue descriptor
- `changelist`: Array of events to register
- `nchanges`: Number of changes
- `eventlist`: Buffer for returned events
- `nevents`: Maximum events to return
- `timeout`: Timeout specification
### Return
Returns number of events, 0 on timeout, -1 on error
### Description
Registers events and waits for them on a kqueue. Used for BSD-style event monitoring.
# File Operations
## open
### Prototype
```c
int open(const char *pathname, int flags, mode_t mode);
```
### Arguments
- `pathname`: File path
- `flags`: Open flags (O_RDONLY, O_WRONLY, etc.)
- `mode`: File permissions (when creating)
### Return
Returns file descriptor on success, -1 on error
### Description
Opens files for reading or writing. Used for serving static files and file uploads.
## close
### Prototype
```c
int close(int fd);
```
### Arguments
- `fd`: File descriptor to close
### Return
Returns 0 on success, -1 on error
### Description
Closes a file descriptor. Essential for resource management and cleaning up sockets.
## read
### Prototype
```c
ssize_t read(int fd, void *buf, size_t count);
```
### Arguments
- `fd`: File descriptor
- `buf`: Buffer to store data
- `count`: Maximum bytes to read
### Return
Returns number of bytes read, 0 on EOF, -1 on error
### Description
Reads data from a file descriptor. Used for reading from sockets, files, and pipes.
## write
### Prototype
```c
ssize_t write(int fd, const void *buf, size_t count);
```
### Arguments
- `fd`: File descriptor
- `buf`: Data buffer
- `count`: Number of bytes to write
### Return
Returns number of bytes written, -1 on error
### Description
Writes data to a file descriptor. Used for writing to sockets, files, and pipes.
## access
### Prototype
```c
int access(const char *pathname, int mode);
```
### Arguments
- `pathname`: File path
- `mode`: Access mode (R_OK, W_OK, X_OK, F_OK)
### Return
Returns 0 if accessible, -1 otherwise
### Description
Checks file accessibility and permissions. Used for validating file paths and permissions.
## stat
### Prototype
```c
int stat(const char *pathname, struct stat *statbuf);
```
### Arguments
- `pathname`: File path
- `statbuf`: Buffer for file information
### Return
Returns 0 on success, -1 on error
### Description
Retrieves file information and metadata. Essential for serving files and directory listings.
## fcntl
### Prototype
```c
int fcntl(int fd, int cmd, ...);
```
### Arguments
- `fd`: File descriptor
- `cmd`: Command (F_GETFL, F_SETFL, etc.)
- `...`: Additional arguments depending on command
### Return
Returns value depends on command, -1 on error
### Description
Performs various operations on file descriptors. Essential for setting non-blocking mode on sockets.
# Directory Operations
## chdir
### Prototype
```c
int chdir(const char *path);
```
### Arguments
- `path`: Directory path
### Return
Returns 0 on success, -1 on error
### Description
Changes the current working directory. May be used for CGI script execution in correct directory.
## opendir
### Prototype
```c
DIR *opendir(const char *name);
```
### Arguments
- `name`: Directory path
### Return
Returns directory stream pointer on success, NULL on error
### Description
Opens a directory for reading. Used for implementing directory listing functionality.
## readdir
### Prototype
```c
struct dirent *readdir(DIR *dirp);
```
### Arguments
- `dirp`: Directory stream pointer
### Return
Returns directory entry pointer, NULL on end or error
### Description
Reads directory entries one by one. Used for generating directory index pages.
## closedir
### Prototype
```c
int closedir(DIR *dirp);
```
### Arguments
- `dirp`: Directory stream pointer
### Return
Returns 0 on success, -1 on error
### Description
Closes a directory stream. Essential for resource management when reading directories.

816
docs/ALLOWED_CLEAN.md Normal file
View File

@ -0,0 +1,816 @@
# Allowed Functions Documentation
This document describes all the system functions allowed for use in the webserv project, organized by functional categories.
# Process Management
## execve
### Prototype
```c
int execve(const char *pathname, char *const argv[], char *const envp[]);
```
### Arguments
- `pathname`: Path to the executable file
- `argv[]`: Array of argument strings (NULL-terminated)
- `envp[]`: Array of environment strings (NULL-terminated)
### Return
Does not return on success; returns -1 on error
### Description
Executes a program by replacing the current process image. Used for CGI script execution in webserv.
## fork
### Prototype
```c
pid_t fork(void);
```
### Arguments
None
### Return
Returns child PID to parent, 0 to child, -1 on error
### Description
Creates a new process by duplicating the current process. Required for executing CGI scripts in separate processes.
## waitpid
### Prototype
```c
pid_t waitpid(pid_t pid, int *status, int options);
```
### Arguments
- `pid`: Process ID to wait for
- `status`: Pointer to store exit status
- `options`: Wait options (WNOHANG, etc.)
### Return
Returns child PID on success, 0 if WNOHANG and no child, -1 on error
### Description
Waits for child process state changes. Essential for managing CGI child processes.
## kill
### Prototype
```c
int kill(pid_t pid, int sig);
```
### Arguments
- `pid`: Process ID
- `sig`: Signal number
### Return
Returns 0 on success, -1 on error
### Description
Sends signals to processes. Used for terminating CGI processes or handling timeouts.
## signal
### Prototype
```c
sighandler_t signal(int signum, sighandler_t handler);
```
### Arguments
- `signum`: Signal number
- `handler`: Signal handler function
### Return
Returns previous handler on success, SIG_ERR on error
### Description
Sets signal handlers. Used for graceful server shutdown and signal management.
# Inter-Process Communication
## pipe
### Prototype
```c
int pipe(int pipefd[2]);
```
### Arguments
- `pipefd[2]`: Array to store file descriptors (pipefd[0] for read, pipefd[1] for write)
### Return
Returns 0 on success, -1 on error
### Description
Creates a pipe for inter-process communication. Essential for CGI communication between parent and child processes.
## socketpair
### Prototype
```c
int socketpair(int domain, int type, int protocol, int sv[2]);
```
### Arguments
- `domain`: Protocol family (AF_UNIX)
- `type`: Socket type (SOCK_STREAM)
- `protocol`: Protocol (usually 0)
- `sv[2]`: Array to store socket descriptors
### Return
Returns 0 on success, -1 on error
### Description
Creates a pair of connected sockets for bi-directional communication between processes.
## dup
### Prototype
```c
int dup(int oldfd);
```
### Arguments
- `oldfd`: File descriptor to duplicate
### Return
Returns new file descriptor on success, -1 on error
### Description
Creates a duplicate of a file descriptor. Useful for redirecting input/output in CGI processes.
## dup2
### Prototype
```c
int dup2(int oldfd, int newfd);
```
### Arguments
- `oldfd`: Source file descriptor
- `newfd`: Target file descriptor number
### Return
Returns new file descriptor on success, -1 on error
### Description
Duplicates a file descriptor to a specific descriptor number. Essential for CGI stdin/stdout redirection.
# Error Handling
## strerror
### Prototype
```c
char *strerror(int errnum);
```
### Arguments
- `errnum`: Error number (usually errno)
### Return
Returns a pointer to error message string
### Description
Converts error numbers to human-readable error messages for debugging and logging.
## gai_strerror
### Prototype
```c
const char *gai_strerror(int errcode);
```
### Arguments
- `errcode`: Error code from getaddrinfo()
### Return
Returns a pointer to error message string
### Description
Converts getaddrinfo() error codes to human-readable messages for network-related error handling.
## errno
### Prototype
```c
extern int errno;
```
### Arguments
None (global variable)
### Return
Current error number
### Description
Global variable that contains the error code of the last failed system call. Used throughout webserv for error checking.
# Network Programming
## socket
### Prototype
```c
int socket(int domain, int type, int protocol);
```
### Arguments
- `domain`: Protocol family (AF_INET, AF_INET6)
- `type`: Socket type (SOCK_STREAM, SOCK_DGRAM)
- `protocol`: Protocol (usually 0)
### Return
Returns socket descriptor on success, -1 on error
### Description
Creates a communication endpoint (socket). Foundation of all network communication in webserv.
## bind
### Prototype
```c
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `addr`: Address structure
- `addrlen`: Address structure size
### Return
Returns 0 on success, -1 on error
### Description
Binds a socket to a specific address and port. Required for server socket setup before listening.
## listen
### Prototype
```c
int listen(int sockfd, int backlog);
```
### Arguments
- `sockfd`: Socket descriptor
- `backlog`: Maximum pending connections
### Return
Returns 0 on success, -1 on error
### Description
Marks a socket as passive, ready to accept connections. Essential for server socket setup.
## accept
### Prototype
```c
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
### Arguments
- `sockfd`: Listening socket descriptor
- `addr`: Buffer for client address
- `addrlen`: Size of address buffer
### Return
Returns new socket descriptor on success, -1 on error
### Description
Accepts incoming connections on a listening socket. Creates new socket for each client connection.
## connect
### Prototype
```c
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `addr`: Server address structure
- `addrlen`: Address structure size
### Return
Returns 0 on success, -1 on error
### Description
Establishes connection to a server. Primarily used for client-side connections (may be used for proxying).
## send
### Prototype
```c
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
```
### Arguments
- `sockfd`: Socket descriptor
- `buf`: Buffer containing data to send
- `len`: Length of data
- `flags`: Send flags
### Return
Returns number of bytes sent on success, -1 on error
### Description
Sends data through a socket connection. Used for sending HTTP responses to clients.
## recv
### Prototype
```c
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
```
### Arguments
- `sockfd`: Socket descriptor
- `buf`: Buffer to store received data
- `len`: Buffer size
- `flags`: Receive flags
### Return
Returns number of bytes received, 0 on connection close, -1 on error
### Description
Receives data from a socket connection. Used for reading HTTP requests from clients.
## setsockopt
### Prototype
```c
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `level`: Protocol level (SOL_SOCKET)
- `optname`: Option name (SO_REUSEADDR, etc.)
- `optval`: Option value
- `optlen`: Option value size
### Return
Returns 0 on success, -1 on error
### Description
Sets socket options. Commonly used to set SO_REUSEADDR for server sockets.
## getsockname
### Prototype
```c
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
### Arguments
- `sockfd`: Socket descriptor
- `addr`: Buffer for address
- `addrlen`: Address buffer size
### Return
Returns 0 on success, -1 on error
### Description
Retrieves the local address of a socket. Useful for determining assigned port numbers.
# Network Utilities
## htons
### Prototype
```c
uint16_t htons(uint16_t hostshort);
```
### Arguments
- `hostshort`: 16-bit number in host byte order
### Return
Returns 16-bit number in network byte order
### Description
Converts 16-bit integers from host to network byte order. Used for port numbers in socket programming.
## htonl
### Prototype
```c
uint32_t htonl(uint32_t hostlong);
```
### Arguments
- `hostlong`: 32-bit number in host byte order
### Return
Returns 32-bit number in network byte order
### Description
Converts 32-bit integers from host to network byte order. Used for IP addresses in socket programming.
## ntohs
### Prototype
```c
uint16_t ntohs(uint16_t netshort);
```
### Arguments
- `netshort`: 16-bit number in network byte order
### Return
Returns 16-bit number in host byte order
### Description
Converts 16-bit integers from network to host byte order. Used when receiving port numbers from network.
## ntohl
### Prototype
```c
uint32_t ntohl(uint32_t netlong);
```
### Arguments
- `netlong`: 32-bit number in network byte order
### Return
Returns 32-bit number in host byte order
### Description
Converts 32-bit integers from network to host byte order. Used when receiving IP addresses from network.
## getaddrinfo
### Prototype
```c
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
```
### Arguments
- `node`: Hostname or IP address
- `service`: Port number or service name
- `hints`: Address criteria
- `res`: Pointer to store result list
### Return
Returns 0 on success, non-zero error code on failure
### Description
Resolves hostnames and service names to socket addresses. Used for address resolution in network programming.
## freeaddrinfo
### Prototype
```c
void freeaddrinfo(struct addrinfo *res);
```
### Arguments
- `res`: Address info structure to free
### Return
None (void function)
### Description
Frees memory allocated by getaddrinfo(). Essential for preventing memory leaks.
## getprotobyname
### Prototype
```c
struct protoent *getprotobyname(const char *name);
```
### Arguments
- `name`: Protocol name ("tcp", "udp")
### Return
Returns protocol entry structure, NULL on error
### Description
Looks up protocol information by name. May be used for protocol-specific socket operations.
# I/O Multiplexing
## select
### Prototype
```c
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
```
### Arguments
- `nfds`: Highest file descriptor number + 1
- `readfds`: Set of file descriptors to check for readability
- `writefds`: Set of file descriptors to check for writability
- `exceptfds`: Set of file descriptors to check for exceptions
- `timeout`: Timeout specification
### Return
Returns number of ready descriptors, 0 on timeout, -1 on error
### Description
Multiplexes I/O operations by monitoring multiple file descriptors. Alternative to epoll for handling multiple connections.
## poll
### Prototype
```c
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
```
### Arguments
- `fds`: Array of pollfd structures
- `nfds`: Number of file descriptors
- `timeout`: Timeout in milliseconds
### Return
Returns number of ready descriptors, 0 on timeout, -1 on error
### Description
More efficient alternative to select() for I/O multiplexing. Monitors multiple file descriptors for I/O events.
## epoll_create
### Prototype
```c
int epoll_create(int size);
```
### Arguments
- `size`: Size hint (ignored in modern kernels)
### Return
Returns epoll file descriptor on success, -1 on error
### Description
Creates an epoll instance for efficient I/O event monitoring. Linux-specific alternative to select/poll.
## epoll_ctl
### Prototype
```c
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
```
### Arguments
- `epfd`: Epoll file descriptor
- `op`: Operation (EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL)
- `fd`: Target file descriptor
- `event`: Event specification
### Return
Returns 0 on success, -1 on error
### Description
Controls epoll instance by adding, modifying, or removing file descriptors from monitoring.
## epoll_wait
### Prototype
```c
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
```
### Arguments
- `epfd`: Epoll file descriptor
- `events`: Buffer for returned events
- `maxevents`: Maximum number of events
- `timeout`: Timeout in milliseconds
### Return
Returns number of ready events, 0 on timeout, -1 on error
### Description
Waits for I/O events on an epoll instance. Core function for epoll-based event loops.
## kqueue
### Prototype
```c
int kqueue(void);
```
### Arguments
None
### Return
Returns kqueue descriptor on success, -1 on error
### Description
Creates a kernel event queue. BSD-specific alternative to epoll for efficient event monitoring.
## kevent
### Prototype
```c
int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);
```
### Arguments
- `kq`: kqueue descriptor
- `changelist`: Array of events to register
- `nchanges`: Number of changes
- `eventlist`: Buffer for returned events
- `nevents`: Maximum events to return
- `timeout`: Timeout specification
### Return
Returns number of events, 0 on timeout, -1 on error
### Description
Registers events and waits for them on a kqueue. Used for BSD-style event monitoring.
# File Operations
## open
### Prototype
```c
int open(const char *pathname, int flags, mode_t mode);
```
### Arguments
- `pathname`: File path
- `flags`: Open flags (O_RDONLY, O_WRONLY, etc.)
- `mode`: File permissions (when creating)
### Return
Returns file descriptor on success, -1 on error
### Description
Opens files for reading or writing. Used for serving static files and file uploads.
## close
### Prototype
```c
int close(int fd);
```
### Arguments
- `fd`: File descriptor to close
### Return
Returns 0 on success, -1 on error
### Description
Closes a file descriptor. Essential for resource management and cleaning up sockets.
## read
### Prototype
```c
ssize_t read(int fd, void *buf, size_t count);
```
### Arguments
- `fd`: File descriptor
- `buf`: Buffer to store data
- `count`: Maximum bytes to read
### Return
Returns number of bytes read, 0 on EOF, -1 on error
### Description
Reads data from a file descriptor. Used for reading from sockets, files, and pipes.
## write
### Prototype
```c
ssize_t write(int fd, const void *buf, size_t count);
```
### Arguments
- `fd`: File descriptor
- `buf`: Data buffer
- `count`: Number of bytes to write
### Return
Returns number of bytes written, -1 on error
### Description
Writes data to a file descriptor. Used for writing to sockets, files, and pipes.
## access
### Prototype
```c
int access(const char *pathname, int mode);
```
### Arguments
- `pathname`: File path
- `mode`: Access mode (R_OK, W_OK, X_OK, F_OK)
### Return
Returns 0 if accessible, -1 otherwise
### Description
Checks file accessibility and permissions. Used for validating file paths and permissions.
## stat
### Prototype
```c
int stat(const char *pathname, struct stat *statbuf);
```
### Arguments
- `pathname`: File path
- `statbuf`: Buffer for file information
### Return
Returns 0 on success, -1 on error
### Description
Retrieves file information and metadata. Essential for serving files and directory listings.
## fcntl
### Prototype
```c
int fcntl(int fd, int cmd, ...);
```
### Arguments
- `fd`: File descriptor
- `cmd`: Command (F_GETFL, F_SETFL, etc.)
- `...`: Additional arguments depending on command
### Return
Returns value depends on command, -1 on error
### Description
Performs various operations on file descriptors. Essential for setting non-blocking mode on sockets.
# Directory Operations
## chdir
### Prototype
```c
int chdir(const char *path);
```
### Arguments
- `path`: Directory path
### Return
Returns 0 on success, -1 on error
### Description
Changes the current working directory. May be used for CGI script execution in correct directory.
## opendir
### Prototype
```c
DIR *opendir(const char *name);
```
### Arguments
- `name`: Directory path
### Return
Returns directory stream pointer on success, NULL on error
### Description
Opens a directory for reading. Used for implementing directory listing functionality.
## readdir
### Prototype
```c
struct dirent *readdir(DIR *dirp);
```
### Arguments
- `dirp`: Directory stream pointer
### Return
Returns directory entry pointer, NULL on end or error
### Description
Reads directory entries one by one. Used for generating directory index pages.
## closedir
### Prototype
```c
int closedir(DIR *dirp);
```
### Arguments
- `dirp`: Directory stream pointer
### Return
Returns 0 on success, -1 on error
### Description
Closes a directory stream. Essential for resource management when reading directories.

View File

@ -3,7 +3,7 @@
#include <string>
#include <vector>
class ServerConfig;
#include <webserv/config/ServerConfig.hpp>
class ConfigManager
{

View File

@ -43,7 +43,7 @@ void ServerConfig::parseServerBlock(const std::string &block)
// Optionally parse the server block here
std::string locationBlock = block.substr(bracePos + 1, closeBrace - bracePos - 1);
std::cout << "Added location: " << locationPath << '\n';
locations.emplace(locationPath, LocationConfig(locationBlock));
locations.emplace(locationPath, locationBlock);
pos = closeBrace + 1;
}

View File

@ -7,7 +7,7 @@
#include <webserv/config/LocationConfig.hpp>
class ServerConfig
{
{
public:
ServerConfig(const std::string &serverBlock);

View File

@ -1,6 +1,7 @@
#include <webserv/config/ConfigManager.hpp>
#include <webserv/config/LocationConfig.hpp>
#include <webserv/config/ServerConfig.hpp>
#include <webserv/server/Server.hpp>
#include <iostream>
#include <string>
@ -26,5 +27,8 @@ int main(int argc, char **argv)
}
}
Server server(ConfigManager::getInstance());
// server.start();
return 0;
}

16
webserv/server/Server.cpp Normal file
View File

@ -0,0 +1,16 @@
#include <webserv/server/Server.hpp>
#include <iostream>
Server::Server(const ConfigManager &configManager)
{
const auto &serverConfigs = configManager.getServerConfigs();
if (serverConfigs.empty())
{
throw std::runtime_error("No server configurations available.");
}
// For simplicity, just take the first server config
const ServerConfig &config = serverConfigs[0];
host = config.getHost();
port = config.getPort();
std::cout << "Server initialized on " << host << ":" << port << '\n';
}

13
webserv/server/Server.hpp Normal file
View File

@ -0,0 +1,13 @@
#pragma once
#include "webserv/config/ConfigManager.hpp"
class Server
{
public:
Server(const ConfigManager &configManager);
private:
std::string host;
int port;
};