From bec82e3d55acadbc8ccf1862b4a0d89047e2cb09 Mon Sep 17 00:00:00 2001 From: lxsang Date: Wed, 5 Aug 2020 20:10:44 +0200 Subject: [PATCH] able to communicate with client --- tunnel.h | 2 ++ vterm/vterm | Bin 40520 -> 47344 bytes vterm/vterm.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/tunnel.h b/tunnel.h index c86918f..e46f4b5 100644 --- a/tunnel.h +++ b/tunnel.h @@ -14,6 +14,8 @@ #define CHANNEL_OPEN (uint8_t)0x4 #define CHANNEL_CLOSE (uint8_t)0x5 #define CHANNEL_DATA (uint8_t)0x6 +#define CHANNEL_UNSUBSCRIBE (uint8_t)0x3 +#define CHANNEL_SUBSCRIBE (uint8_t)0x2 typedef struct { uint8_t type; diff --git a/vterm/vterm b/vterm/vterm index 6c1164585d10de899c604ab77e5399e281572684..fd9fdc3c6c44f022559617ea9f04eefd1c2f7033 100755 GIT binary patch literal 47344 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�fwOC7?+IWq>(~^uY z(b9b<#Hp2<-&IMb#~{7dijlBWo1hh?#jAIVZ7fc6)J`sNYU&O8WHj1cz2TpNpKQa( ztWyhQz^8FOD4p8W6nYw_v$S`|>;?E09`vFzjej{^bzih>dU~2YIS_0IOOqv0jR=3# zhOblje04u$u5$qB7C)1HbkJO0Pt(3v15fhT+T;ug`qVhN7x;Ab{jQS3`>T&2Pe-Qu z{upICzP_{LOhJ}(NhklPpeRm>&)*9A9C#dv6ko^spHQNGRXN=2K?I@@DA9Y&Oh{goen=2c(T)8-}(&n&A_Mg zTO05NjxvqE3&bAjCp>Acl^E`)*JhCa`3!iPw~+sjD&-NS;0GD#e}nRT^wUz?czA}A z)35sbY$fLx3cp$PQ~WH8IB2PmU%J|HYkzTB8W&Yi$dO(qq&$1>2H+d+9_VcS4F z7RP?wnl=sl-S8#V81@y0g!8VGmVb~Vj7w+uo+tS(-ZpT)}Sh#f%yJ7o!`+Fkz z#%#^P+WBXsC&C8cXm_}EV4!t7HjBmwwqqADw(*8}|Ewj4-L2j6BvSPfOqJ~hptHA+wlji2G)a4`Pi9%QCq%97fA>bW)S2ZE!>g0;q4m&fB&PyQQ&_q6WiX4 zO~**%12XMm2(F1>FMdrFdys4Jes&FZBlkxJ;@d4K+KJj;-QBKG!KIDZ!rZ9|@-A#q z)@s_fN1;Ndcn3k0Y{f2FY+6prgi$sS>1ibf1@-sDwHncKH2`Zm`;aAo_FdP+BioRr z5dzeGBED-PUD)kQBScp_q;XElkb{HdU>K^fuN=Z8J6d0>!NAmu!3Ma;Xwwm?VUj-Da}~>zk{NgKc)(pW66V`J2~Z5MO7?l z8K(3Uob;&2{QP{%X#i!`13!e4bkJXcto$vwU(ms6rOcXFo*ys*KYEkI&(FJ@2AEK# zcK!>1{}A7JWc&HKm{ZozkH2>NTftAiR>1sEEBiU6c@iB|NAffC^W#J}aKys={G81x z-|s;p4w7L#E=PvGVafdbJkF__R?)ln;$S*XuK||6iOKn$WGD_!d3t2GUsB1nR`MzH z^YcBYhZG^}x7YuRC@21W(NLy75`lR%{Ikg=cga{x8sQP zl}jZ?yR%GVrfdhF@*#fOcKQsV>Wz$o*~&*_DVpY7u`zFR{4 zcOu3!ALk<(`0u5G6~|6n0ND8{Z|kChuj;EJ!LPi@l;U6^PL5l?e^N2Wo}`r5s&C8m bIa{G!KMl7w62bW41CpP9c+Ps*vfBRwxOzzc literal 40520 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 HTUPr&OIC?d diff --git a/vterm/vterm.c b/vterm/vterm.c index d0c02dd..11cb0ec 100644 --- a/vterm/vterm.c +++ b/vterm/vterm.c @@ -1,16 +1,29 @@ #include +#include #include #include #include +#include +#include #include "tunnel.h" #define MODULE_NAME "vterm" +static volatile int running = 1; + +void int_handler(int dummy) { + (void) dummy; + running = 0; +} + + int main(int argc, char** argv) { int fd; tunnel_msg_t msg; + fd_set fd_in; int status; + struct timeval timeout; char buff[MAX_CHANNEL_NAME+1]; LOG_INIT(MODULE_NAME); if(argc != 2) @@ -18,6 +31,7 @@ int main(int argc, char** argv) printf("Usage: %s path/to/hotline/socket\n", argv[0]); return -1; } + signal(SIGINT, int_handler); LOG(MODULE_NAME, "Hotline is: %s", argv[1]); // now try to request new channel from hotline fd = open_unix_socket(argv[1]); @@ -53,19 +67,71 @@ int main(int argc, char** argv) if(msg.data) free(msg.data); } + + // now read data + while(running) + { + timeout.tv_sec = 0; + timeout.tv_usec = 500; + FD_ZERO(&fd_in); + FD_SET(fd, &fd_in); + status = select(fd + 1, &fd_in, NULL, NULL, &timeout); + + switch (status) + { + case -1: + LOG(MODULE_NAME, "Error %d on select()\n", errno); + running = 0; + break; + case 0: + timeout.tv_sec = 0; + timeout.tv_usec = 10000; // 5 ms + select(0, NULL, NULL, NULL, &timeout); + break; + // we have data + default: + if(msg_read(fd, &msg) == -1) + { + ERROR(MODULE_NAME, "Unable to read message from channel. quit"); + (void) close(fd); + running = 0; + } + else + { + switch (msg.header.type) + { + case CHANNEL_SUBSCRIBE: + LOG(MODULE_NAME, "Client %d subscribes to the chanel", msg.header.client_id); + break; + + case CHANNEL_UNSUBSCRIBE: + LOG(MODULE_NAME, "Client %d unsubscribes to the chanel", msg.header.client_id); + break; + case CHANNEL_DATA: + LOG(MODULE_NAME, "Got data"); + if(msg_write(fd, &msg) == -1) + { + LOG(MODULE_NAME,"Unable to write data back"); + } + break; + default: + LOG(MODULE_NAME, "Client %d send message of type %d", msg.header.client_id, msg.header.type); + break; + } + } + } + } + // close the channel LOG(MODULE_NAME, "Close the channel %s (%d)", MODULE_NAME, fd); msg.header.type = CHANNEL_CLOSE; msg.header.size = 0; msg.data = NULL; - sleep(5); if( msg_write(fd, &msg) == -1) { ERROR(MODULE_NAME, "Unable to request channel close"); } (void)msg_read(fd, &msg); - shutdown(fd, SHUT_WR); (void) close(fd); - printf("Main application\n"); return 0; } \ No newline at end of file