summaryrefslogtreecommitdiffstats
path: root/iv/orodja/ldmitm/tcp_times_example.c
diff options
context:
space:
mode:
Diffstat (limited to 'iv/orodja/ldmitm/tcp_times_example.c')
-rw-r--r--iv/orodja/ldmitm/tcp_times_example.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/iv/orodja/ldmitm/tcp_times_example.c b/iv/orodja/ldmitm/tcp_times_example.c
index c98b29a..707bfce 100644
--- a/iv/orodja/ldmitm/tcp_times_example.c
+++ b/iv/orodja/ldmitm/tcp_times_example.c
@@ -12,7 +12,24 @@ Posluša na TCP vratih 6969, prejme eno povezavo, vsako sekundo nanjo izpiše LF
#include <stdbool.h>
#include <sys/ioctl.h>
#include <fcntl.h>
+#include <signal.h>
+int samomor = 0;
+void handler (int sig __attribute__((unused))) {
+ samomor = 1;
+}
int main (void) {
+ if (signal(SIGINT, handler) == SIG_ERR) {
+ perror("signal");
+ return 1;
+ }
+ if (signal(SIGHUP, handler) == SIG_ERR) {
+ perror("signal");
+ return 1;
+ }
+ if (signal(SIGTERM, handler) == SIG_ERR) {
+ perror("signal");
+ return 1;
+ }
int tcp_socket = socket(AF_INET6, SOCK_STREAM, 0);
if (tcp_socket == -1) {
perror("socket");
@@ -29,12 +46,12 @@ int main (void) {
}
if (listen(tcp_socket, 1 /* only one client is handled*/) == -1) {
perror("listen");
- return 1;
+ goto die;
}
int flow = accept(tcp_socket, NULL, NULL);
if (flow == -1) {
perror("accept");
- return 1;
+ goto die;
}
int tcp_times = open("/proc/tcp_times", O_RDWR);
struct tcp_times tt = {
@@ -44,13 +61,20 @@ int main (void) {
while (true) {
if (ioctl(tcp_times, 0, &tt) == -1) {
perror("ioctl");
- return 1;
+ break;
}
printf(TCP_TIMES_PRINTF_FORMAT "\n", TCP_TIMES_PRINTF_VARIABLES(tt.));
if (send(flow, &buf, 1, MSG_NOSIGNAL) == -1) {
perror("write");
- return 1;
+ break;
}
+ if (samomor)
+ break;
sleep(1);
}
+die:
+ close(tcp_times);
+ close(flow);
+ close(tcp_socket);
+ return 1;
}