1 /*-
2  * Copyright (c) 2001, 2020 Oracle and/or its affiliates.  All rights reserved.
3  *
4  * See the file EXAMPLES-LICENSE for license information.
5  *
6  * $Id$
7  */
8 
9 #ifndef _EX_REPQUOTE_H_
10 #define	_EX_REPQUOTE_H_
11 
12 #include "../common/rep_common.h"
13 
14 #define	SELF_EID	1
15 
16 /* Globals */
17 typedef struct {
18 	SHARED_DATA shared_data;
19 	int elected;
20 	void *comm_infrastructure;
21 } APP_DATA;
22 
23 extern int master_eid;
24 extern char *myaddr;
25 extern unsigned short myport;
26 
27 struct __member;	typedef struct __member member_t;
28 struct __machtab;	typedef struct __machtab machtab_t;
29 
30 /* Arguments for the connect_all thread. */
31 typedef struct {
32 	DB_ENV *dbenv;
33 	const char *progname;
34 	const char *home;
35 	machtab_t *machtab;
36 	repsite_t *sites;
37 	int nsites;
38 } all_args;
39 
40 /* Arguments for the connect_loop thread. */
41 typedef struct {
42 	DB_ENV *dbenv;
43 	const char * home;
44 	const char * progname;
45 	machtab_t *machtab;
46 	const char * host;
47 	int port;
48 } connect_args;
49 
50 #define	CACHESIZE	(10 * 1024 * 1024)
51 #define	DATABASE	"quote.db"
52 #define	MAX_THREADS	25
53 #define	SLEEPTIME	3
54 
55 #ifndef COMPQUIET
56 #define	COMPQUIET(x,y)	x = (y)
57 #endif
58 
59 /* Portability macros for basic threading and networking */
60 #ifdef _WIN32
61 
62 typedef HANDLE mutex_t;
63 #define	mutex_init(m, attr)						   \
64     (((*(m) = CreateMutex(NULL, FALSE, NULL)) != NULL) ? 0 : -1)
65 #define	mutex_lock(m)							   \
66     ((WaitForSingleObject(*(m), INFINITE) == WAIT_OBJECT_0) ? 0 : -1)
67 #define	mutex_unlock(m)		(ReleaseMutex(*(m)) ? 0 : -1)
68 
69 typedef int socklen_t;
70 typedef SOCKET socket_t;
71 #define	SOCKET_CREATION_FAILURE INVALID_SOCKET
72 #define	readsocket(s, buf, sz)	recv((s), (buf), (int)(sz), 0)
73 #define	writesocket(s, buf, sz)	send((s), (const char *)(buf), (int)(sz), 0)
74 #define	net_errno		WSAGetLastError()
75 #undef SHUT_RDWR
76 #define SHUT_RDWR		SD_BOTH
77 
78 #else /* !_WIN32 */
79 
80 #include <netinet/in.h>
81 #include <sys/socket.h>
82 #include <sys/wait.h>
83 #include <netdb.h>
84 #include <pthread.h>
85 #include <signal.h>
86 #include <unistd.h>
87 
88 typedef pthread_mutex_t mutex_t;
89 #define	mutex_init(m, attr)	pthread_mutex_init((m), (attr))
90 #define	mutex_lock(m)		pthread_mutex_lock(m)
91 #define	mutex_unlock(m)		pthread_mutex_unlock(m)
92 
93 typedef int socket_t;
94 #define	SOCKET_CREATION_FAILURE -1
95 #define	closesocket(fd)		close(fd)
96 #define	net_errno		errno
97 #define	readsocket(s, buf, sz)	read((s), (buf), (sz))
98 #define	writesocket(s, buf, sz)	write((s), (buf), (sz))
99 
100 #endif
101 
102 void *connect_all __P((void *));
103 void *connect_thread __P((void *));
104 int   doclient __P((DB_ENV *, const char *, machtab_t *));
105 int   domaster __P((DB_ENV *, const char *));
106 socket_t   get_accepted_socket __P((const char *, int));
107 socket_t   get_connected_socket
108 	__P((machtab_t *, const char *, const char *, int, int *, int *));
109 int   get_next_message __P((socket_t, DBT *, DBT *));
110 socket_t   listen_socket_init __P((const char *, const char *, int,
111 	machtab_t *));
112 socket_t   listen_socket_accept
113 	__P((machtab_t *, const char *, socket_t, int *));
114 int   machtab_destroy __P((machtab_t *));
115 int   machtab_getinfo __P((machtab_t *, int, struct sockaddr *, int *));
116 int   machtab_init __P((machtab_t **, int));
117 void  machtab_parm __P((machtab_t *, int *, u_int32_t *));
118 int   machtab_rem __P((machtab_t *, int, int));
119 int   quote_send __P((DB_ENV *, const DBT *, const DBT *, const DB_LSN *,
120     int, u_int32_t));
121 
122 #endif /* !_EX_REPQUOTE_H_ */
123