From 3e55faa4bde6174d0a0ff2fb8051a67cb774fc99 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 1 Sep 2025 10:20:57 +0200 Subject: [PATCH] proj: Add server.c in perf --- proj/perf/.gitignore | 6 ++++ proj/perf/Makefile | 7 ++-- proj/perf/server.c | 66 +++++++++++++++++++++++++++++++++++++ proj/perf/test.sh | 15 ++++++++- proj/server/src/performance | 45 +++++++++++++++++++++++++ 5 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 proj/perf/.gitignore create mode 100644 proj/perf/server.c create mode 100755 proj/server/src/performance diff --git a/proj/perf/.gitignore b/proj/perf/.gitignore new file mode 100644 index 0000000..87554cd --- /dev/null +++ b/proj/perf/.gitignore @@ -0,0 +1,6 @@ +main +server +*.csv +*.txt +*.log +*.zip diff --git a/proj/perf/Makefile b/proj/perf/Makefile index ec3ec12..9cc02c1 100644 --- a/proj/perf/Makefile +++ b/proj/perf/Makefile @@ -4,13 +4,16 @@ CFLAGS=-std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE - .PHONY: all clean all: default -default: main +default: main server -main.o: main.c +%.o: %.c $(CC) -c -o $@ $^ $(CFLAGS) main: main.o $(CC) -o $@ $^ $(CFLAGS) -lc +server: server.o + $(CC) -o $@ $^ $(CFLAGS) -lc + clean: rm -rf main *.o diff --git a/proj/perf/server.c b/proj/perf/server.c new file mode 100644 index 0000000..b22b531 --- /dev/null +++ b/proj/perf/server.c @@ -0,0 +1,66 @@ + +#include +#include +#include +#include +#include +#include +#include + +int main(const int argc, const char *argv[]) { + if (argc != 3) { + fprintf(stderr, "usage: server \n"); + return 1; + } + + const char *path = argv[1]; + const char *mode = argv[2]; + + int fd; + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { + fprintf(stderr, "unable to create socket: %s\n", strerror(errno)); + return 1; + } + + struct sockaddr_un addr = {.sun_family = AF_UNIX}; + strcpy(addr.sun_path, path); + if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) { + fprintf(stderr, "unable to bind socket: %s\n", strerror(errno)); + close(fd); + return 1; + } + + if (listen(fd, 4) != 0) { + fprintf(stderr, "unable to listen on socket: %s\n", strerror(errno)); + close(fd); + return 1; + } + + size_t len = 4096; + char *line = malloc(len); + while (1) { + int client_fd; + if ((client_fd = accept(fd, NULL, NULL)) == -1) { + fprintf(stderr, "unable to accept connection: %s\n", strerror(errno)); + break; + } + + FILE *client; + if ((client = fdopen(client_fd, "w+")) == NULL) { + fprintf(stderr, "unable open stream: %s\n", strerror(errno)); + break; + } + + int n = 0; + while (getline(&line, &len, client) > 0) { + if (n % 2 == 1) { + fprintf(client, "%s\n", mode); + } + n++; + } + } + + free(line); + close(fd); + unlink(path); +} diff --git a/proj/perf/test.sh b/proj/perf/test.sh index e98cd13..9642caf 100755 --- a/proj/perf/test.sh +++ b/proj/perf/test.sh @@ -14,9 +14,22 @@ function test() { done } +rm /tmp/test.ok.sock /tmp/test.return.sock /tmp/intercept.performance.ok.sock /tmp/intercept.performance.return.sock +./server /tmp/test.ok.sock 'ok' & +./server /tmp/test.return.sock 'return 0' & + test ./main cd ../intercept test ./intercept -o -i - -- ../perf/main test ./intercept -o -i stderr -- ../perf/main test ./intercept -o -i file:out.log -- ../perf/main -#test ./intercept -o -i unix:/ -- ../perf/main + +cd ../server/src +./performance -m ok & +./performance -m return & +cd ../../intercept +sleep 1 +test ./intercept -o -i unix:/tmp/test.ok.sock -- ../perf/main +test ./intercept -o -i unix:/tmp/test.return.sock -- ../perf/main +test ./intercept -o -i unix:/tmp/intercept.performance.ok.sock -- ../perf/main +test ./intercept -o -i unix:/tmp/intercept.performance.return.sock -- ../perf/main diff --git a/proj/server/src/performance b/proj/server/src/performance new file mode 100755 index 0000000..c51eb26 --- /dev/null +++ b/proj/server/src/performance @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# File: performance +# Author: Lorenz Stechauner +# Lorenz Stechauner + +import argparse + +import intercept +import intercept.standard + + +MODE: str + + +class Handler(intercept.standard.Handler): + def before_pipe(self, fildes_ptr: intercept.Pointer) -> str: + return 'return 0' if MODE == 'return' else 'ok' + + def after_pipe(self, fildes_ptr: intercept.Pointer, + ret_value: int, errno: str = None, fildes: list[int] = None) -> None: + pass + + def before_close(self, fildes: int) -> str: + return 'return 0' if MODE == 'return' else 'ok' + + def after_close(self, fildes: int, + ret_value: int, errno: str = None) -> None: + pass + + +def main() -> None: + global MODE + parser = argparse.ArgumentParser() + parser.add_argument('-m', '--mode', choices=['ok', 'return']) + args = parser.parse_args() + MODE = args.mode + + socket_name = f'/tmp/intercept.performance.{MODE}.sock' + intercept.intercept(socket_name, Handler) + + +if __name__ == '__main__': + main()