diff --git a/demo/demo.c b/demo/demo.c index 9a5c95b..41c10e3 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -6,6 +6,10 @@ #include "demo.h" +#define _GNU_SOURCE +#define __USE_GNU +#include + #include #include #include @@ -35,9 +39,10 @@ void TF_WriteImpl(const uint8_t *buff, size_t len) } } -static bool demo_client(void) +static int demo_client(void* unused) { - pid_t childPID; + (void)unused; + ssize_t n = 0; uint8_t recvBuff[1024]; struct sockaddr_in serv_addr; @@ -66,42 +71,29 @@ static bool demo_client(void) return false; } - childPID = fork(); - if (childPID >= 0) { // fork was successful - if (childPID == 0) {// child process - printf("\n Child Process \n"); - - while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0 && !conn_disband) { - dumpFrame(recvBuff, (size_t) n); - TF_Accept(recvBuff, (size_t) n); - } - printf("\n End read \n"); + printf("\n Child Process \n"); - if (n < 0) { - printf("\n Read error \n"); - } - - printf("\n Close sock \n"); - close(sockfd); - sockfd = -1; - - return true; - } - else { //Parent process - printf("\n Parent process \n"); - - return true; - } - } - else { // fork failed - printf("\n Fork failed!!!!!! \n"); - return false; + while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0) { + dumpFrame(recvBuff, (size_t) n); + TF_Accept(recvBuff, (size_t) n); } +// printf("\n End read \n"); +// +// if (n < 0) { +// printf("\n Read error \n"); +// } +// +// printf("\n Close sock \n"); +// close(sockfd); +// sockfd = -1; +// +// return true; + return 0; } -static bool demo_server(void) +static int demo_server(void* unused) { - pid_t childPID; + (void)unused; ssize_t n; int listenfd = 0; uint8_t recvBuff[1024]; @@ -121,54 +113,37 @@ static bool demo_server(void) serv_addr.sin_port = htons(PORT); if (bind(listenfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { - perror("Failed to bind "); - return false; + perror("Failed to bind"); + return 1; } if (listen(listenfd, 10) < 0) { - perror("Failed to listen "); - return false; + perror("Failed to listen"); + return 1; } - childPID = fork(); - if (childPID >= 0) { // fork was successful - if (childPID == 0) {// child process - printf("\n Child Process \n"); - - while (1) { - printf("\nWaiting for client...\n"); - sockfd = accept(listenfd, (struct sockaddr *) NULL, NULL); - setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&option, sizeof(option)); - printf("\nClient connected\n"); - conn_disband = false; - - while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0 && !conn_disband) { - printf("...read %ld\n", n); - dumpFrame(recvBuff, n); - TF_Accept(recvBuff, (size_t) n); - } - - if (n < 0) { - printf("\n Read error \n"); - } - - printf("Closing socket\n"); - close(sockfd); - sockfd = -1; - } - - return true; + while (1) { + printf("\nWaiting for client...\n"); + sockfd = accept(listenfd, (struct sockaddr *) NULL, NULL); + setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&option, sizeof(option)); + printf("\nClient connected\n"); + conn_disband = false; + + while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0 && !conn_disband) { + printf("...read %ld\n", n); + dumpFrame(recvBuff, n); + TF_Accept(recvBuff, (size_t) n); } - else { //Parent process - printf("\n Parent process \n"); - return true; + if (n < 0) { + printf("\n Read error \n"); } + + printf("Closing socket\n"); + close(sockfd); + sockfd = -1; } - else { // fork failed - printf("\n Fork failed!!!!!! \n"); - return false; - } + return 0; } void signal_handler(int sig) @@ -176,7 +151,7 @@ void signal_handler(int sig) (void)sig; printf("Shutting down..."); demo_disconn(); - exit(0); + exit(sig); } void demo_init(TF_PEER peer) @@ -184,14 +159,26 @@ void demo_init(TF_PEER peer) signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); - bool suc; + int retc; + void *stack = malloc(8192); + if (stack == NULL) { + perror("Oh fuck"); + signal_handler(9); + return; + } + + printf("Starting %s...\n", peer == TF_MASTER ? "MASTER" : "SLAVE"); if (peer == TF_MASTER) { - suc = demo_client(); + retc = clone(&demo_client, (char *)stack+8192, CLONE_VM|CLONE_FILES, 0); } else { - suc = demo_server(); + retc = clone(&demo_server, (char *)stack+8192, CLONE_VM|CLONE_FILES, 0); } - if (!suc) { + if (retc == 0) { + perror("Clone fail"); signal_handler(9); + return; } + + printf("Thread started\n"); } diff --git a/demo/hello/master.c b/demo/hello/master.c index 3c64960..581fa42 100644 --- a/demo/hello/master.c +++ b/demo/hello/master.c @@ -32,7 +32,7 @@ int main(void) TF_SendSimple(1, (pu8)"Ahoj", 5); TF_SendSimple(1, (pu8)"Hello", 6); - TF_QuerySimple(1, (pu8)"Query!", 6, testIdListener, 0); + TF_QuerySimple(2, (pu8)"Query!", 6, testIdListener, 0); while(1) usleep(10); } diff --git a/demo/hello/slave.c b/demo/hello/slave.c index 1f1f873..e178e73 100644 --- a/demo/hello/slave.c +++ b/demo/hello/slave.c @@ -12,9 +12,18 @@ bool helloListener(TF_MSG *msg) { printf("helloListener()\n"); dumpFrameInfo(msg); - msg->data = (const uint8_t *) "jak se mas?"; + return true; +} + +bool replyListener(TF_MSG *msg) +{ + printf("replyListener()\n"); + dumpFrameInfo(msg); + msg->data = (const uint8_t *) "response to query"; msg->len = (TF_LEN) strlen((const char *) msg->data); TF_Respond(msg); + + TF_SendSimple(77, (const uint8_t *) "NAZDAR", 7); return true; } @@ -22,6 +31,7 @@ int main(void) { TF_Init(TF_SLAVE); TF_AddTypeListener(1, helloListener); + TF_AddTypeListener(2, replyListener); demo_init(TF_SLAVE); printf("MAIN PROCESS CONTINUES...\n"); diff --git a/demo/utils.c b/demo/utils.c index 8c2c891..c79297f 100644 --- a/demo/utils.c +++ b/demo/utils.c @@ -10,7 +10,7 @@ void dumpFrame(const uint8_t *buff, size_t len) { size_t i; for(i = 0; i < len; i++) { - printf("%3u \033[34m%02X\033[0m", buff[i], buff[i]); + printf("%3u \033[94m%02X\033[0m", buff[i], buff[i]); if (buff[i] >= 0x20 && buff[i] < 127) { printf(" %c", buff[i]); } else {