16 KiB
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
int execve(const char *pathname, char *const argv[], char *const envp[]);
Arguments
pathname: Path to the executable fileargv[]: 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
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
pid_t waitpid(pid_t pid, int *status, int options);
Arguments
pid: Process ID to wait forstatus: Pointer to store exit statusoptions: 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
int kill(pid_t pid, int sig);
Arguments
pid: Process IDsig: 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
sighandler_t signal(int signum, sighandler_t handler);
Arguments
signum: Signal numberhandler: 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
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
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
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
int dup2(int oldfd, int newfd);
Arguments
oldfd: Source file descriptornewfd: 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
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
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
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
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
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Arguments
sockfd: Socket descriptoraddr: Address structureaddrlen: 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
int listen(int sockfd, int backlog);
Arguments
sockfd: Socket descriptorbacklog: 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
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
Arguments
sockfd: Listening socket descriptoraddr: Buffer for client addressaddrlen: 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
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Arguments
sockfd: Socket descriptoraddr: Server address structureaddrlen: 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
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
Arguments
sockfd: Socket descriptorbuf: Buffer containing data to sendlen: Length of dataflags: 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
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
Arguments
sockfd: Socket descriptorbuf: Buffer to store received datalen: Buffer sizeflags: 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
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
Arguments
sockfd: Socket descriptorlevel: Protocol level (SOL_SOCKET)optname: Option name (SO_REUSEADDR, etc.)optval: Option valueoptlen: 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
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
Arguments
sockfd: Socket descriptoraddr: Buffer for addressaddrlen: 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
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
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
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
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
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
Arguments
node: Hostname or IP addressservice: Port number or service namehints: Address criteriares: 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
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
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
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
Arguments
nfds: Highest file descriptor number + 1readfds: Set of file descriptors to check for readabilitywritefds: Set of file descriptors to check for writabilityexceptfds: Set of file descriptors to check for exceptionstimeout: 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
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
Arguments
fds: Array of pollfd structuresnfds: Number of file descriptorstimeout: 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
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
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
Arguments
epfd: Epoll file descriptorop: Operation (EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL)fd: Target file descriptorevent: 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
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
Arguments
epfd: Epoll file descriptorevents: Buffer for returned eventsmaxevents: Maximum number of eventstimeout: 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
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
int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);
Arguments
kq: kqueue descriptorchangelist: Array of events to registernchanges: Number of changeseventlist: Buffer for returned eventsnevents: Maximum events to returntimeout: 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
int open(const char *pathname, int flags, mode_t mode);
Arguments
pathname: File pathflags: 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
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
ssize_t read(int fd, void *buf, size_t count);
Arguments
fd: File descriptorbuf: Buffer to store datacount: 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
ssize_t write(int fd, const void *buf, size_t count);
Arguments
fd: File descriptorbuf: Data buffercount: 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
int access(const char *pathname, int mode);
Arguments
pathname: File pathmode: 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
int stat(const char *pathname, struct stat *statbuf);
Arguments
pathname: File pathstatbuf: 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
int fcntl(int fd, int cmd, ...);
Arguments
fd: File descriptorcmd: 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
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
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
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
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.