// Funciones de apoyo para sockets TCP que usan varios programas de la semana.
#ifndef IO_UTIL_H
#define IO_UTIL_H

#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>

// Envía los n bytes aunque send escriba menos. Devuelve 0, o -1 si hay error.
int send_all(int fd, const void *buf, size_t n);

// Lee hasta completar n bytes. Devuelve n, un número menor si el otro extremo
// cerró antes de completarlos, o -1 si hay error.
ssize_t recv_all(int fd, void *buf, size_t n);

// socket + SO_REUSEADDR + bind + listen en todas las interfaces. Con el puerto
// 0, el sistema elige uno libre. Devuelve el descriptor, o -1 si hay error.
int tcp_listen(uint16_t port);

// Imprime "escuchando en el puerto N": útil cuando el puerto pedido fue 0.
int print_bound_port(int fd);

// Convierte un argumento a puerto (0-65535). Termina el programa si no es válido.
uint16_t parse_port(const char *text);

// close que informa el error.
void close_checked(int fd);

#endif
