joeylib2/tests/gate/common/gateNet.h

68 lines
2.5 KiB
C

// Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
// See LICENSE.md for license information.
// SPDX-License-Identifier: MIT
//
// gateNet.h - sockets, waits, and the clock shared by the gates' serial and
// network peers (tests/gate/serialLoopPeer.c and the rest), and received
// bytes shown printably in their logs. Their command lines are gateArg's,
// and gateTextFind finds bytes in what they receive.
#ifndef GATE_NET_H
#define GATE_NET_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <netinet/in.h>
// gateNetRecv: nothing arrived in time, or the stream ended (or failed).
#define GATE_NET_IDLE 0
#define GATE_NET_CLOSED (-1)
// The only address the peers listen on or connect to, and the backlog a
// peer that takes one connection listens with.
#define GATE_NET_HOST "127.0.0.1"
#define GATE_NET_ONE_PEER 1
// A connection on listener within seconds (its address in from, unless
// NULL); -1 when none came. A failed accept ends the tool.
int gateNetAccept(int listener, double seconds, struct sockaddr_in *from);
// Listen on port for one connection within seconds, then stop listening;
// -1 when none came.
int gateNetAcceptOne(uint16_t port, double seconds);
// A socket listening on GATE_NET_HOST:port (SO_REUSEADDR) with backlog
// connections waiting at most; a port it cannot have ends the tool.
int gateNetListen(uint16_t port, int backlog);
// Seconds on a clock that never steps.
double gateNetNow(void);
// Up to cap bytes from fd, waiting at most seconds: their count,
// GATE_NET_IDLE, or GATE_NET_CLOSED (errno 0 at the end of the stream,
// else what failed).
int32_t gateNetRecv(int fd, uint8_t *buf, size_t cap, double seconds);
// Every byte to fd; false (errno set) when it fails.
bool gateNetSendAll(int fd, const void *data, size_t len);
// len bytes in double quotes: printable ASCII as itself, a backslash or a
// double quote escaped with a backslash, \n \r \t, and any other byte as
// \xNN.
void gateNetShowBytes(FILE *out, const void *data, size_t len);
// Sleep seconds (none at all for 0 or less).
void gateNetSleep(double seconds);
// Each peer's first act: the name its messages begin with, stdout written a
// line at a time (so a killed peer's log is whole), and a closed connection
// an error from send rather than a SIGPIPE.
void gateNetStart(const char *toolName);
// Whether fd is ready for events (poll's) within seconds.
bool gateNetWait(int fd, short events, double seconds);
#endif