diff --git a/client.c b/client.c index 29db479..a295e2c 100644 --- a/client.c +++ b/client.c @@ -25,7 +25,7 @@ client_t* client_open(conn_handler handler) { return client; } -int client_connect(client_t *client, int16_t port, char *ip_str) { +int client_connect(client_t *client, char *ip_str, int16_t port) { struct sockaddr_in servaddr; unsigned int servaddr_len = 0; diff --git a/client.h b/client.h index c03cfa7..77ba2fb 100644 --- a/client.h +++ b/client.h @@ -23,7 +23,7 @@ typedef struct client { client_t* client_open(conn_handler handler); -int client_connect(client_t *client, int16_t port, char *ip_str); +int client_connect(client_t *client, char *ip_str, int16_t port); int client_close(client_t* client); diff --git a/issuer.c b/issuer.c index 6de22f2..7baa22f 100644 --- a/issuer.c +++ b/issuer.c @@ -16,6 +16,15 @@ typedef struct issuer { struct ecdaa_issuer_secret_key_FP256BN isk; } issuer_t; +typedef enum issuer_state { + ON, + SETUPDONE, + JOINSTART, + JOINPROCEED, + PUBLISH, + READY +} issuerstate_e; + int process_issuer(int connfd); int main() { @@ -43,26 +52,105 @@ int main() { int process_issuer(int connfd) { char inbuf[MAX_BUFSIZE]; char outbuf[MAX_BUFSIZE]; - int n = 0; - for (;;) { + int ret = 2; + issuerstate_e state = ON; + + while (ret == 2) { bzero(inbuf, MAX_BUFSIZE); bzero(outbuf, MAX_BUFSIZE); if (0 >= read(connfd, inbuf, sizeof(inbuf))) { - printf("process_issuer: cannot read from socket\n"); - return -1; + printf("process_member: cannot read from socket\n"); + ret = -1; } printf("> ISSUER: %s\n", inbuf); - strncpy(outbuf, "OK", 2); + + + if (0 == strncmp("OK", inbuf, 2)) { + switch (state) { + case SETUPDONE: + case JOINPROCEED: + case PUBLISH: + state = READY; + break; + default: + strncpy(outbuf, "ERR\n", 4); + break; + } + } else if (0 == strncmp("ERR", inbuf, 3)) { + switch (state) { + case SETUPDONE: + case JOINPROCEED: + case PUBLISH: + printf("command failed at client\n"); + state = READY; + break; + default: + printf("invalid instruction\n"); + strncpy(outbuf, "ERR\n", 4); + break; + } + } else if (0 == strncmp("SETUP", inbuf, 5)) { + switch (state) { + case ON: + printf("setup()\n"); + strncpy(outbuf, "SETUPDONE\n", 10); + state = SETUPDONE; + break; + default: + strncpy(outbuf, "ERR\n", 4); + break; + } + } else if (0 == strncmp("JOIN", inbuf, 4)) { + switch (state) { + case READY: + printf("join()\n"); + strncpy(outbuf, "JOINSTART\n", 10); + state = JOINSTART; + break; + default: + strncpy(outbuf, "ERR\n", 4); + break; + } + } else if (0 == strncmp("APPEND", inbuf, 6)) { + switch (state) { + case JOINSTART: + printf("append()\n"); + strncpy(outbuf, "JOINPROCEED\n", 12); + state = JOINPROCEED; + break; + default: + strncpy(outbuf, "ERR\n", 4); + break; + } + } else if (0 == strncmp("PUBLISH", inbuf, 7)) { + switch (state) { + case READY: + printf("publish()\n"); + strncpy(outbuf, "PUBLISH\n", 8); + state = PUBLISH; + break; + default: + strncpy(outbuf, "ERR\n", 4); + break; + } + } else if (0 == strncmp("EXIT", inbuf, 4)) { + printf("exit()\n"); + strncpy(outbuf, "OK\n", 3); + ret = 0; + } else if (0 == strncmp("SHUTDOWN", inbuf, 8)) { + strncpy(outbuf, "OK\n", 3); + ret = 1; + } else { + printf("error()\n"); + strncpy(outbuf, "ERR\n", 4); + ret = 0; + } + printf("< ISSUER: %s\n", outbuf); write(connfd, outbuf, sizeof(outbuf)); - if (0 == strncmp("exit", inbuf, 4)) { - printf("process_issuer: exiting gracefully\n"); - return 0; - } - if (0 == strncmp("shutdown", inbuf, 8)) { - printf("process_issuer: shutting down gracefully\n"); - return 1; - } } -} \ No newline at end of file + + return + ret; +} diff --git a/member.c b/member.c index 4b95f4d..d157fff 100644 --- a/member.c +++ b/member.c @@ -2,6 +2,7 @@ #include #include #include "client.h" +#include "server.h" #define ISSUERIP "127.0.0.1" #define ISSUERPORT 6590 @@ -21,80 +22,130 @@ typedef enum memberstate { APPEND, JOINED, ATTEST, - PUBLISH + PUBLISH, + SHUTDOWN }memberstate_t; -int process_member_client(int connfd); +int process_member(int connfd); +int member_join(int connfd); int main() { int err = 0; - client_t *client; + server_t *server; - client = client_open(&process_member_client); - if (NULL == client) { + server = server_open(&process_member, MEMBERPORT); + if (NULL == server) { printf("listen failed, closing...\n"); } for (; !err;) { - err = client_connect(client, ISSUERPORT, ISSUERIP); + err = server_accept(server); if (1 == err) { printf("graceful shutdown...\n"); } else if (err) { printf("accept failed, closing...\n"); } } - printf("shut down client\n"); - client_close(client); - return 0; + printf("shut down server\n"); + server_close(server); + + return 0; } -int process_member_client(int connfd) { +int process_member(int connfd) { char inbuf[MAX_BUFSIZE]; char outbuf[MAX_BUFSIZE]; - int n = 0; - memberstate_t state = JOIN; + int ret = 2; - strncpy(outbuf, "JOIN", 4); - printf("< MEMBER: %s\n", outbuf); - write(connfd, outbuf, sizeof(outbuf)); - for (;;) { + while (ret == 2) { bzero(inbuf, MAX_BUFSIZE); bzero(outbuf, MAX_BUFSIZE); if (0 >= read(connfd, inbuf, sizeof(inbuf))) { - printf("process_issuer: cannot read from socket\n"); - return -1; + printf("process_member: cannot read from socket\n"); + ret = -1; + } + printf("> MEMBER: %s\n", inbuf); + + if (0 == strncmp("ATTEST", inbuf, 6)) { + printf("attest()\n"); + strncpy(outbuf, "OK\n", 3); } + else if (0 == strncmp("PUBLISH", inbuf, 7)) { + printf("publish()\n"); + strncpy(outbuf, "OK\n", 3); + } + else if (0 == strncmp("JOIN", inbuf, 4)) { + printf("join()\n"); + client_t *client; + client = client_open(&member_join); + if(0 != client_connect(client, ISSUERIP, ISSUERPORT)) { + strncpy(outbuf, "ERR\n", 4); + ret = -1; + } else { + if(0 != client_close(client)) { + strncpy(outbuf, "ERR\n", 4); + } + strncpy(outbuf, "OK\n", 3); + } + } + else if (0 == strncmp("EXIT", inbuf, 4)) { + printf("exit()\n"); + strncpy(outbuf, "OK\n", 3); + ret = 0; + } + else if (0 == strncmp("SHUTDOWN", inbuf, 8)) { + strncpy(outbuf, "OK\n", 3); + ret = 1; + } + else { + printf("error()\n"); + strncpy(outbuf, "ERR\n", 4); + ret = -1; + } + + printf("< MEMBER: %s\n", outbuf); + write(connfd, outbuf, sizeof(outbuf)); + } + return ret; +} +int member_join(int connfd) { + char inbuf[MAX_BUFSIZE]; + char outbuf[MAX_BUFSIZE]; + int n = 0; + memberstate_t state = JOIN; + + for (;;) { switch(state) { case JOIN: + strncpy(outbuf, "JOIN", 4); state = APPEND; break; case APPEND: - state = JOINED; + if (0 == strncmp("JOINSTART", inbuf, 9)) { + strncpy(outbuf, "APPEND\n", 7); + state = JOINED; + } break; case JOINED: - state = ATTEST; - state = PUBLISH; - break; - case ATTEST: - state = JOINED; - break; - case PUBLISH: + if (0 == strncmp("JOINPROCEED", inbuf, 11)) { + strncpy(outbuf, "OK\n", 3); + return 0; + } break; + default: + return -1; } - printf("> MEMBER: %s\n", inbuf); - strncpy(outbuf, "OK", 2); - printf("< MEMBER: %s\n", outbuf); + bzero(outbuf, MAX_BUFSIZE); + printf("ISSUER < MEMBER: %s\n", outbuf); write(connfd, outbuf, sizeof(outbuf)); - if (0 == strncmp("exit", inbuf, 4)) { - printf("process_issuer: exiting gracefully\n"); - return 0; - } - if (0 == strncmp("shutdown", inbuf, 8)) { - printf("process_issuer: shutting down gracefully\n"); - return 1; + + bzero(inbuf, MAX_BUFSIZE); + if (0 >= read(connfd, inbuf, sizeof(inbuf))) { + printf("process_issuer: cannot read from socket\n"); + return -1; } } } \ No newline at end of file diff --git a/server.c b/server.c index c39ade0..581838f 100644 --- a/server.c +++ b/server.c @@ -37,6 +37,8 @@ int server_accept(server_t *server) { struct sockaddr_in client; unsigned int client_len = 0; int connfd = -1; + int ret = 0; + if (NULL == server || 0 != listen(server->conn->fd, MAX_CLIENTS)) { printf("server_accept: listen failed\n"); return -1; @@ -48,13 +50,13 @@ int server_accept(server_t *server) { printf("server_accept: connection to client failed, "); return -1; } else { - server->handler(connfd); + ret = server->handler(connfd); if(0 != close(connfd)) { printf("server_accept: failed to close client connection properly"); return -1; } } - return 0; + return ret; } int server_close(server_t *server) {