1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2001,2008 Oracle.  All rights reserved.
5 *
6 * $Id: rep_base.h,v 12.17 2008/02/27 22:04:15 alanb Exp $
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
16typedef struct {
17	char *host;		/* Host name. */
18	u_int32_t port;		/* Port on which to connect to this site. */
19} repsite_t;
20
21/* Globals */
22typedef struct {
23	SHARED_DATA shared_data;
24	int elected;
25	void *comm_infrastructure;
26} APP_DATA;
27
28extern int master_eid;
29extern char *myaddr;
30extern unsigned short myport;
31
32struct __member;	typedef struct __member member_t;
33struct __machtab;	typedef struct __machtab machtab_t;
34
35/* Arguments for the connect_all thread. */
36typedef struct {
37	DB_ENV *dbenv;
38	const char *progname;
39	const char *home;
40	machtab_t *machtab;
41	repsite_t *sites;
42	int nsites;
43} all_args;
44
45/* Arguments for the connect_loop thread. */
46typedef struct {
47	DB_ENV *dbenv;
48	const char * home;
49	const char * progname;
50	machtab_t *machtab;
51	int port;
52} connect_args;
53
54#define	CACHESIZE	(10 * 1024 * 1024)
55#define	DATABASE	"quote.db"
56#define	MAX_THREADS	25
57#define	SLEEPTIME	3
58
59#ifndef COMPQUIET
60#define	COMPQUIET(x,y)	x = (y)
61#endif
62
63/* Portability macros for basic threading and networking */
64#ifdef _WIN32
65
66#include <winsock2.h>
67#include <windows.h>
68
69extern int getopt(int, char * const *, const char *);
70
71typedef HANDLE thread_t;
72#define	thread_create(thrp, attr, func, arg)				   \
73    (((*(thrp) = CreateThread(NULL, 0,					   \
74	(LPTHREAD_START_ROUTINE)(func), (arg), 0, NULL)) == NULL) ? -1 : 0)
75#define	thread_join(thr, statusp)					   \
76    ((WaitForSingleObject((thr), INFINITE) == WAIT_OBJECT_0) &&		   \
77    GetExitCodeThread((thr), (LPDWORD)(statusp)) ? 0 : -1)
78
79typedef HANDLE mutex_t;
80#define	mutex_init(m, attr)						   \
81    (((*(m) = CreateMutex(NULL, FALSE, NULL)) != NULL) ? 0 : -1)
82#define	mutex_lock(m)							   \
83    ((WaitForSingleObject(*(m), INFINITE) == WAIT_OBJECT_0) ? 0 : -1)
84#define	mutex_unlock(m)		(ReleaseMutex(*(m)) ? 0 : -1)
85#define	sleep(s)		Sleep(1000 * (s))
86
87typedef int socklen_t;
88typedef SOCKET socket_t;
89#define	SOCKET_CREATION_FAILURE INVALID_SOCKET
90#define	readsocket(s, buf, sz)	recv((s), (buf), (int)(sz), 0)
91#define	writesocket(s, buf, sz)	send((s), (const char *)(buf), (int)(sz), 0)
92#define	net_errno		WSAGetLastError()
93
94#else /* !_WIN32 */
95
96#include <netinet/in.h>
97#include <sys/socket.h>
98#include <sys/wait.h>
99#include <netdb.h>
100#include <pthread.h>
101#include <signal.h>
102#include <unistd.h>
103
104typedef pthread_t thread_t;
105#define	thread_create(thrp, attr, func, arg)				   \
106    pthread_create((thrp), (attr), (func), (arg))
107#define	thread_join(thr, statusp) pthread_join((thr), (statusp))
108
109typedef pthread_mutex_t mutex_t;
110#define	mutex_init(m, attr)	pthread_mutex_init((m), (attr))
111#define	mutex_lock(m)		pthread_mutex_lock(m)
112#define	mutex_unlock(m)		pthread_mutex_unlock(m)
113
114typedef int socket_t;
115#define	SOCKET_CREATION_FAILURE -1
116#define	closesocket(fd)		close(fd)
117#define	net_errno		errno
118#define	readsocket(s, buf, sz)	read((s), (buf), (sz))
119#define	writesocket(s, buf, sz)	write((s), (buf), (sz))
120
121#endif
122
123void *connect_all __P((void *args));
124void *connect_thread __P((void *args));
125int   doclient __P((DB_ENV *, const char *, machtab_t *));
126int   domaster __P((DB_ENV *, const char *));
127socket_t   get_accepted_socket __P((const char *, int));
128socket_t   get_connected_socket
129	__P((machtab_t *, const char *, const char *, int, int *, int *));
130int   get_next_message __P((socket_t, DBT *, DBT *));
131socket_t   listen_socket_init __P((const char *, int));
132socket_t   listen_socket_accept
133	__P((machtab_t *, const char *, socket_t, int *));
134int   machtab_getinfo __P((machtab_t *, int, u_int32_t *, int *));
135int   machtab_init __P((machtab_t **, int));
136void  machtab_parm __P((machtab_t *, int *, u_int32_t *));
137int   machtab_rem __P((machtab_t *, int, int));
138int   quote_send __P((DB_ENV *, const DBT *, const DBT *, const DB_LSN *,
139    int, u_int32_t));
140
141#endif /* !_EX_REPQUOTE_H_ */
142