CScpp/CS.h
changeset 0 5c129dd80d4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CScpp/CS.h	Thu Nov 21 14:55:10 2019 +0100
@@ -0,0 +1,171 @@
+#ifndef _CSH_
+#define _CSH_ 1
+
+using namespace std;
+#include <string>
+#include <iostream>
+#include <thread>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <sys/time.h>
+#include <openssl/ssl.h>
+#include <openssl/bio.h>
+#include <openssl/err.h>
+#include <sys/wait.h>
+#include <sys/select.h>
+#include <sys/mman.h>
+#include <semaphore.h>
+#include <libgen.h>
+#include <math.h>
+#include "Debug.h"
+
+typedef struct ShareS {			// shared items between procs or threads
+	int conns;						// overall connections# both in ring and mash
+	int msgs;						// overall forwards#	   both in ring and mash
+	int act;							//	active nodes#		   both in ring and mash
+	sem_t counterSem;				// semaphore for counters
+} ShareT, *ShareP;
+#define ShareA(v) if((v = (ShareP) mmap(NULL, sizeof(ShareT), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)) < 0) SYSERR("mmap")
+
+typedef struct CSS {				// top level attributes
+	string text;					// text to be sent in messages
+	int ttl;							// TTL for circulating msgs
+	int mp0;							// TCP port of first mash node
+	int mn;							// intended # of nodes in mash
+	int rp0;							// TCP port of first ring node
+	int rn;							// intended # of nodes in ring
+   struct timespec pace;		// pacing time quantum
+   int pacing;						// pacing indicator
+	int issl;						// ssl switch: 0=no_ssl, 1=ssl, 2=both
+	int connThreshold;			// connection retry threshhold
+	int connTO;						// connection timeout in usecs
+	int selTO;						// selection timeout in secs
+	string cePath;					// SSL certs path
+	string caPath;					// CA  certs path
+	ShareP shP;
+	CSS(DebugP, char*);
+} *CSP;
+
+typedef struct HeaderS {		// container header
+	int ttl;
+	int ts;
+	int remPort;
+
+	HeaderS();
+	HeaderS(int);
+	int len();
+} *HeaderP;
+
+typedef struct PayloadS {		// payload structure
+	time_t ts;
+	char text;
+
+	PayloadS();
+	PayloadS(const char *);
+	int check(PayloadS*);
+	char *deliver();
+	string digest();
+	void sabotage();
+	int len();
+} *PayloadP;
+
+typedef struct ContainerS {	// data container sent throug mash or ring
+	HeaderS hdr;
+	PayloadS payl;
+	int len();
+} ContainerT, *ContainerP;
+
+typedef class DataC {			// data sent and received
+public:
+	DebugP deP;
+	ContainerP contP;
+	int dataLen;
+//	int transferLen;
+
+	DataC();
+	DataC(DebugP);
+	int dttl();
+	int ttl();
+	void load(int, const char*);
+	string unld();
+	string digest();
+	bool dataOk();
+	int ts();
+	int remPort();
+	int remPort(int);
+} *DataP;
+
+typedef struct SocketS {		// info about sockets allocated in node
+	int remPort;
+	int sc;
+	SSL *sslP;
+} *SocketP;
+
+typedef enum{ring, mash} topology;
+typedef enum{client, server} nodeside;
+class ConstellationC {			// constellation of communication nodes (mash or ring)
+	DebugP deP;
+public:
+	topology topo;
+	int ssl, first, nodes, *forwP;
+
+	ConstellationC();
+	ConstellationC(topology, int);
+	int run();
+};
+typedef ConstellationC *ConstellationP;
+
+class NodeC : public ConstellationC {	// attributes and operations of one node of constellation (mash or ring)
+public:
+	DebugP deP;
+	int locPort;
+	int last;
+	int kicker;
+	int closing;
+	thread closingThread;		// thread to close client side sockets
+	DataC data;
+	int len;
+	int ssc;
+	SocketP cliSides;
+	SocketP srvSides;
+	SSL_CTX *ctxP;
+
+	NodeC(ConstellationP, int);
+	int run();
+	void mainLoop();
+	void bindN();
+	void conn(int, int);
+	void acc(int);
+	void closeSocket(int, nodeside);
+	int getN(int);
+	int readN(int);
+	int putN(int);
+	int writeN(int);
+	int next_node();
+	void forward(int);
+	void closeClients();
+};
+typedef NodeC *NodeP;
+
+extern char *gpa(struct sockaddr *);
+extern void gai(int, struct addrinfo *ai, DebugP);
+#define GAI(level, ai) gai(level, ai, deP)
+extern void ssl_err(char*);
+extern void abend();
+
+#define SYSERR(e) LOG(0, "%s: %s (%d)", (char*)e, strerror(errno), errno), abend(deP)
+#define SSLERR(e) ssl_err((char*)e, deP), abend(deP)
+#define SOFTERR(e) LOG(0, e), fflush(stderr)
+#define HARDERR(e) SOFTERR(e), abend(deP);
+
+extern CSP csP;
+
+#endif