penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

src/route_runtime.c

raw ยท 1373 bytes

#include <string.h>

#include "klog.h"
#include "route.h"
#include "route_runtime.h"

int start_route(struct worker *w, const struct route *r, struct route_ctx *ctx)
{
	int rc = 0;
	switch (r->listen.proto) {

	case PROTO_TCP:
		ctx->kind = ROUTE_CTX_STREAM;

		rc = start_stream_route(w, r, &ctx->u.stream);
		if (rc != 0) {
			ctx->kind = ROUTE_CTX_NONE;
			memset(&ctx->u.stream, 0, sizeof(ctx->u.stream));
		}

		return rc;

	case PROTO_UDP:
		ctx->kind = ROUTE_CTX_DATAGRAM;

		rc = start_datagram_route(w, r, &ctx->u.datagram);
		if (rc != 0) {
			ctx->kind = ROUTE_CTX_NONE;
			memset(&ctx->u.stream, 0, sizeof(ctx->u.datagram));
		}

		return rc;

	/* New approach
	case ENDPOINT_PROTO_TCP:
	case ENDPOINT_PROTO_UNIX_STREAM:
		return start_stream_listener(w, r, ctx);

	case ENDPOINT_PROTO_UDP:
	case ENDPOINT_PROTO_UNIX_DGRAM:
		return start_datagram_listener(w, r, ctx);
	*/

	default:
		LOG_ERROR("route listen endpoint is not listenable",
			"line", _LOGV(r->line_no),
			"listen", _LOGV_ENDPOINT(&r->listen)
		);
		return -EINVAL;
	}
}

void stop_route(struct route_ctx *ctx)
{
	if (ctx == NULL) {
		return;
	}

	switch (ctx->kind) {
	case ROUTE_CTX_STREAM:
		stop_stream_route(&ctx->u.stream);
		break;

	case ROUTE_CTX_DATAGRAM:
		stop_datagram_route(&ctx->u.datagram);
		break;

	case ROUTE_CTX_NONE:
	default:
		break;
	}

	memset(ctx, 0, sizeof(*ctx));
}