proj: Add server.c in perf
This commit is contained in:
6
proj/perf/.gitignore
vendored
Normal file
6
proj/perf/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
main
|
||||||
|
server
|
||||||
|
*.csv
|
||||||
|
*.txt
|
||||||
|
*.log
|
||||||
|
*.zip
|
||||||
@@ -4,13 +4,16 @@ CFLAGS=-std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -
|
|||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
all: default
|
all: default
|
||||||
default: main
|
default: main server
|
||||||
|
|
||||||
main.o: main.c
|
%.o: %.c
|
||||||
$(CC) -c -o $@ $^ $(CFLAGS)
|
$(CC) -c -o $@ $^ $(CFLAGS)
|
||||||
|
|
||||||
main: main.o
|
main: main.o
|
||||||
$(CC) -o $@ $^ $(CFLAGS) -lc
|
$(CC) -o $@ $^ $(CFLAGS) -lc
|
||||||
|
|
||||||
|
server: server.o
|
||||||
|
$(CC) -o $@ $^ $(CFLAGS) -lc
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf main *.o
|
rm -rf main *.o
|
||||||
|
|||||||
66
proj/perf/server.c
Normal file
66
proj/perf/server.c
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(const int argc, const char *argv[]) {
|
||||||
|
if (argc != 3) {
|
||||||
|
fprintf(stderr, "usage: server <path> <mode>\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);
|
||||||
|
}
|
||||||
@@ -14,9 +14,22 @@ function test() {
|
|||||||
done
|
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
|
test ./main
|
||||||
cd ../intercept
|
cd ../intercept
|
||||||
test ./intercept -o -i - -- ../perf/main
|
test ./intercept -o -i - -- ../perf/main
|
||||||
test ./intercept -o -i stderr -- ../perf/main
|
test ./intercept -o -i stderr -- ../perf/main
|
||||||
test ./intercept -o -i file:out.log -- ../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
|
||||||
|
|||||||
45
proj/server/src/performance
Executable file
45
proj/server/src/performance
Executable file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# File: performance
|
||||||
|
# Author: Lorenz Stechauner <e12119052@student.tuwien.ac.at>
|
||||||
|
# Lorenz Stechauner <lorenz.stechauner@necronda.net>
|
||||||
|
|
||||||
|
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()
|
||||||
Reference in New Issue
Block a user