6 changed files with 192 additions and 2 deletions
@ -0,0 +1,29 @@ |
|||||
|
#include <unistd.h> |
||||
|
#include "connection.h" |
||||
|
|
||||
|
connection_t* create_connection(conntype_e type){ |
||||
|
connection_t* conn = malloc(sizeof(connection_t)); |
||||
|
if(NULL == conn) { |
||||
|
printf("create_connection: malloc failed\n"); |
||||
|
} else { |
||||
|
conn->type = type; |
||||
|
conn->fd = -1; |
||||
|
} |
||||
|
|
||||
|
return conn; |
||||
|
} |
||||
|
|
||||
|
int destroy_connection(connection_t* conn) { |
||||
|
int err = 0; |
||||
|
|
||||
|
if(NULL != conn) { |
||||
|
if(-1 != conn->fd) { |
||||
|
err = close(conn->fd); |
||||
|
if(-1 == err) { |
||||
|
printf("destroy_connection: close connection failed"); |
||||
|
} |
||||
|
} |
||||
|
free(conn); |
||||
|
} |
||||
|
return err; |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
//
|
||||
|
// Created by root on 10/30/19.
|
||||
|
//
|
||||
|
|
||||
|
#ifndef ECDAA_ISSUER_CONNECTION_H |
||||
|
#define ECDAA_ISSUER_CONNECTION_H |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
typedef enum conntype { |
||||
|
CONN_TYPE_SERVER, |
||||
|
CONN_TYPE_CLIENT |
||||
|
}conntype_e; |
||||
|
|
||||
|
typedef struct connection { |
||||
|
int fd; |
||||
|
conntype_e type; |
||||
|
} connection_t; |
||||
|
|
||||
|
typedef int (*conn_handler)(int fd); |
||||
|
|
||||
|
connection_t* create_connection(conntype_e type); |
||||
|
int destroy_connection(connection_t* conn); |
||||
|
|
||||
|
#endif //ECDAA_ISSUER_CONNECTION_H
|
||||
@ -1,8 +1,54 @@ |
|||||
#include <stdio.h> |
#include <stdio.h> |
||||
#include <string.h> |
#include <string.h> |
||||
#include <ecdaa.h> |
#include <ecdaa.h> |
||||
|
#include "server.h" |
||||
|
|
||||
|
typedef struct issuer { |
||||
|
struct ecdaa_issuer_public_key_FP256BN ipk; |
||||
|
struct ecdaa_issuer_secret_key_FP256BN isk; |
||||
|
} issuer_t; |
||||
|
|
||||
|
int process_issuer(int connfd); |
||||
int main() { |
int main() { |
||||
printf("Hello, World!\n"); |
int err = 0; |
||||
|
server_t *server; |
||||
|
|
||||
|
server = server_open(&process_issuer); |
||||
|
if (NULL == server) { |
||||
|
printf("listen failed, closing...\n"); |
||||
|
} |
||||
|
|
||||
|
for (; !err;) { |
||||
|
err = server_accept(server); |
||||
|
if (err) { |
||||
|
printf("accept failed, closing...\n"); |
||||
|
} |
||||
|
} |
||||
|
printf("shut down server\n"); |
||||
|
server_close(server); |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
int process_issuer(int connfd) { |
||||
|
char inbuf[MAX_BUFSIZE]; |
||||
|
char outbuf[MAX_BUFSIZE]; |
||||
|
int n = 0; |
||||
|
for (;;) { |
||||
|
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("> ISSUER: %s\n", inbuf); |
||||
|
strncpy(outbuf, "OK", 2); |
||||
|
printf("< ISSUER: %s\n", outbuf); |
||||
|
write(connfd, outbuf, sizeof(outbuf)); |
||||
|
if (0 == strncmp("exit", inbuf, 4)) { |
||||
|
printf("process_issuer: exiting gracefully\n"); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
return 0; |
return 0; |
||||
} |
} |
||||
@ -0,0 +1,61 @@ |
|||||
|
#include "server.h" |
||||
|
|
||||
|
server_t* server_open(conn_handler handler) { |
||||
|
struct sockaddr_in servaddr; |
||||
|
server_t *server = malloc(sizeof(server_t)); |
||||
|
if(NULL == handler) { |
||||
|
printf("server_open: received empty handler, stopping"); |
||||
|
return NULL; |
||||
|
} |
||||
|
if (NULL == server) { |
||||
|
printf("server_open: malloc failed"); |
||||
|
return NULL; |
||||
|
} |
||||
|
server->conn = malloc(sizeof(connection_t)); |
||||
|
if (NULL == server->conn) { |
||||
|
printf("server_open: malloc failed"); |
||||
|
free(server); |
||||
|
return NULL; |
||||
|
} |
||||
|
server->handler = handler; |
||||
|
server->conn->fd = socket(AF_INET, SOCK_STREAM, 0); |
||||
|
if (-1 == server->conn->fd) { |
||||
|
printf("server_listen: failed to create endpoint.\n"); |
||||
|
return NULL; |
||||
|
} |
||||
|
servaddr.sin_family = AF_INET; |
||||
|
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
||||
|
servaddr.sin_port = htons(PORT); |
||||
|
|
||||
|
if (0 != bind(server->conn->fd, (const struct sockaddr *) &servaddr, sizeof(servaddr))) { |
||||
|
printf("server_listen: failed to bind socket\n"); |
||||
|
return NULL; |
||||
|
} |
||||
|
return server; |
||||
|
} |
||||
|
|
||||
|
int server_accept(server_t *server) { |
||||
|
struct sockaddr_in client; |
||||
|
int client_len = 0; |
||||
|
int connfd = -1; |
||||
|
if (NULL == server || 0 != listen(server->conn->fd, MAX_CLIENTS)) { |
||||
|
printf("server_accept: listen failed\n"); |
||||
|
return -1; |
||||
|
} |
||||
|
printf("server_accept: listening\n"); |
||||
|
client_len = sizeof(client); |
||||
|
connfd = accept(server->conn->fd, &client, &client_len); |
||||
|
if(0 >= connfd) { |
||||
|
server->handler(connfd); |
||||
|
close(connfd); |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
int server_close(server_t *server) { |
||||
|
if (NULL != server && 0 != close(server->conn->fd)) { |
||||
|
printf("server_close: closing socket failed\n"); |
||||
|
return -1; |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
//
|
||||
|
// Created by root on 10/30/19.
|
||||
|
//
|
||||
|
|
||||
|
#ifndef ECDAA_ISSUER_SERVER_H |
||||
|
#define ECDAA_ISSUER_SERVER_H |
||||
|
#include <sys/socket.h> |
||||
|
#include <netinet/in.h> |
||||
|
#include <unistd.h> |
||||
|
#include "connection.h" |
||||
|
|
||||
|
#define PORT 6590 |
||||
|
#define MAX_CLIENTS 10 |
||||
|
#define MAX_BUFSIZE 1024 |
||||
|
|
||||
|
typedef struct server { |
||||
|
connection_t* conn; |
||||
|
conn_handler handler; |
||||
|
}server_t; |
||||
|
|
||||
|
server_t* server_open(conn_handler handler); |
||||
|
|
||||
|
int server_accept(server_t *server); |
||||
|
|
||||
|
int server_close(server_t* server); |
||||
|
|
||||
|
#endif //ECDAA_ISSUER_SERVER_H
|
||||
Loading…
Reference in new issue