1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
|
#ifndef __ZSERVER_H__
#define __ZSERVER_H__
/* This file is part of the Project Athena Zephyr Notification System.
* It contains declarations for use in the server.
*
* Created by: John T. Kohl
*
* $Source$
* $Author$
* $Header$
*
* Copyright (c) 1987 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <zephyr/mit-copyright.h>
#include <zephyr/zephyr.h> /* which includes <errno.h>,
<sys/types.h>,
<netinet/in.h>,
<sys/time.h>,
<stdio.h> */
#include <arpa/inet.h>
#include <zephyr/acl.h>
#include <sys/file.h>
#include <syslog.h>
#include <strings.h>
#include "timer.h"
#include "zsrv_err.h"
/* definitions for the Zephyr server */
/* structures */
typedef struct _ZSubscr_t {
struct _ZSubscr_t *q_forw; /* links in client's subscr. queue */
struct _ZSubscr_t *q_back;
char *zst_class; /* class of messages */
char *zst_classinst; /* class-inst of messages */
char *zst_recipient; /* recipient of messages */
} ZSubscr_t;
typedef struct _ZClient_t {
struct sockaddr_in zct_sin; /* ipaddr/port of client */
struct _ZSubscr_t *zct_subs; /* subscriptions */
C_Block zct_cblock; /* session key for this client */
} ZClient_t;
typedef struct _ZClientList_t {
struct _ZClientList_t *q_forw;
struct _ZClientList_t *q_back;
ZClient_t *zclt_client;
} ZClientList_t;
typedef struct _ZAcl_t {
char *acl_filename;
} ZAcl_t;
typedef enum _ZAccess_t {
TRANSMIT, /* use transmission acl */
SUBSCRIBE /* use subscription acl */
} ZAccess_t;
typedef struct _ZClass_t {
struct _ZClass_t *q_forw;
struct _ZClass_t *q_back;
char *zct_classname;
ZAcl_t *zct_acl;
ZClientList_t *zct_clientlist;
} ZClass_t;
typedef struct _ZHostList_t {
struct _ZHostList_t *q_forw;
struct _ZHostList_t *q_back;
struct _ZClientList_t *zh_clients;
struct sockaddr_in zh_addr; /* IP addr/port of hostmanager */
} ZHostList_t;
typedef enum _server_state {
SERV_UP, /* Server is up */
SERV_TARDY, /* Server due for a hello */
SERV_DEAD, /* Server is considered dead */
SERV_STARTING /* Server is between dead and up */
} server_state;
typedef struct _ZServerDesc_t {
server_state zs_state; /* server's state */
struct sockaddr_in zs_addr; /* server's address */
long zs_timeout; /* Length of timeout in sec */
timer zs_timer; /* timer struct for this server */
int zs_numsent; /* number of hello's sent */
ZHostList_t *zs_hosts; /* pointer to list of info from this
server */
} ZServerDesc_t;
typedef struct _ZNotAcked_t {
struct _ZNotAcked_t *q_forw; /* link to next */
struct _ZNotAcked_t *q_back; /* link to prev */
timer na_timer; /* timer for retransmit */
long na_abstimo; /* absolute timeout to drop after */
int na_rexmits; /* number of retransmits */
caddr_t na_packet; /* ptr to packet */
int na_packsz; /* size of packet */
ZUnique_Id_t na_uid; /* uid of packet */
union { /* address to send to */
ZClient_t *na_clt; /* client descr */
int srv_idx; /* index of server */
} dest;
#define na_client dest.na_clt
#define na_srv_idx dest.srv_idx
} ZNotAcked_t;
typedef enum _ZSentType {
NOT_SENT, /* message was not xmitted */
SENT, /* message was xmitted */
AUTH_FAILED, /* authentication failed */
NOT_FOUND /* user not found for uloc */
} ZSentType;
/* this is just for lint */
struct qelem {
struct qelem *q_forw;
struct qelem *q_back;
char *q_data;
};
/* Function declarations */
/* found in access_s.c */
extern int access_check();
/* found in brain_dump.c */
extern void bdump_get(), bdump_send(), bdump_offer();
extern Code_t bdump_send_list_tcp();
/* found in class_s.c */
extern Code_t class_register(), class_deregister(), class_restrict();
extern Code_t class_setup_restricted();
extern ZClientList_t *class_lookup();
extern ZAcl_t *class_get_acl();
extern int class_is_control(), class_is_admin(), class_is_hm();
extern int class_is_ulogin(), class_is_uloc();
/* found in client_s.c */
extern Code_t client_register();
extern void client_deregister();
extern ZClient_t *client_which_client();
/* found in common.c */
extern char *strsave();
/* found in dispatch.c */
extern void dispatch(), clt_ack(), nack_release(), sendit();
/* found in hostm_s.c */
extern void hostm_dispatch(), hostm_flush(), hostm_shutdown(), hostm_losing();
extern ZHostList_t *hostm_find_host();
extern ZServerDesc_t *hostm_find_server();
extern void hostm_transfer();
/* found in server_s.c */
extern void server_timo(), server_dispatch(), server_recover();
extern void server_adispatch(), server_init(), server_shutdown();
extern void server_forward(), server_kill_clt();
extern int is_server();
extern ZServerDesc_t *server_which_server();
/* found in subscr_s.c */
extern Code_t subscr_cancel(), subscr_subscribe(), subscr_send_subs();;
extern ZClientList_t *subscr_match_list();
extern void subscr_list_free(), subscr_cancel_client(), subscr_sendlist();
/* found in uloc_s.c */
extern void ulogin_dispatch(), ulocate_dispatch(), uloc_hflush();
extern Code_t uloc_send_locations();
/* found in zctl.c */
extern void control_dispatch();
/* found in libc.a */
char *malloc(), *realloc();
long random();
/* global identifiers */
/* found in main.c */
extern struct in_addr my_addr; /* my inet address */
extern struct sockaddr_in sock_sin; /* socket descriptors */
extern int srv_socket; /* dgram sockets for clients
and other servers */
extern int bdump_socket; /* brain dump socket
(closed most of the time) */
extern struct sockaddr_in bdump_sin; /* addr of brain dump socket */
extern fd_set interesting; /* the file descrips we are listening
to right now */
extern int nfildes; /* number to look at in select() */
extern int zdebug;
extern char myname[]; /* domain name of this host */
extern ZNotAcked_t *nacklist; /* list of not ack'ed packets */
/* found in server_s.c */
extern ZServerDesc_t *otherservers; /* array of servers */
extern int me_server_idx; /* me (in the array of servers) */
extern int nservers; /* number of other servers*/
#ifdef DEBUG
/* found in dispatch.c */
extern char *pktypes[]; /* names of the packet types */
#endif DEBUG
/* useful defines */
/* client defines */
#define REXMIT_SECS ((long) 10) /* rexmit delay on normal notices */
#define NUM_REXMITS (5) /* number of rexmits */
/* hostmanager defines */
#define LOSE_TIMO (15) /* time during which a losing host
must respond to a ping */
/* server-server defines */
#define TIMO_UP ((long) 60) /* timeout between up and tardy */
#define TIMO_TARDY ((long) 60) /* timeout btw tardy hellos */
#define TIMO_DEAD ((long)(15*60)) /* timeout between hello's for dead */
#define H_NUM_TARDY 3 /* num hello's before going dead
when tardy */
#define H_NUM_STARTING 2 /* num hello's before going dead
when starting */
#define ADMIN_HELLO "HELLO" /* Opcode: hello, are you there */
#define ADMIN_IMHERE "IHEARDYOU" /* Opcode: yes, I am here */
#define ADMIN_SHUTDOWN "GOODBYE" /* Opcode: I am shutting down */
#define ADMIN_BDUMP "DUMP_AVAIL" /* Opcode: I will give you a dump */
#define ADMIN_DONE "DUMP_DONE" /* Opcode: brain dump for this server
is complete */
#define ADMIN_NEWCLT "NEXT_CLIENT" /* Opcode: this is a new client */
#define ADMIN_LOST_CLT "LOST_CLIENT" /* Opcode: client not ack'ing */
#define ADMIN_KILL_CLT "KILL_CLIENT" /* Opcode: client is dead, remove */
#define ADMIN_LIMBO "LIMBO" /* Class inst: please send limbo info*/
#define ADMIN_YOU "YOUR_STATE" /* Class inst: please send your state*/
#define NULLZCT ((ZClass_t *) 0)
#define NULLZCNT ((ZClient_t *) 0)
#define NULLZCLT ((ZClientList_t *) 0)
#define NULLHMCT ((ZHMClient_t *) 0)
#define NULLZST ((ZSubscr_t *) 0)
#define NULLZHLT ((ZHostList_t *) 0)
#define NULLZNAT ((ZNotAcked_t *) 0)
#define NULLZACLT ((ZAcl_t *) 0)
#define NULLZPT ((ZPacket_t *) 0)
#define NULLZSDT ((ZServerDesc_t *) 0)
/* me_server_idx is the index into otherservers of this server descriptor. */
/* the 'limbo' server is always the first server */
#define me_server (&otherservers[me_server_idx])
#define limbo_server_idx() (0)
#define limbo_server (&otherservers[limbo_server_idx()])
#define ack(a,b) clt_ack(a,b,SENT)
#define nack(a,b) clt_ack(a,b,NOT_SENT)
#define max(a,b) ((a) > (b) ? (a) : (b))
/* these are to keep lint happy */
#define xfree(foo) free((caddr_t) (foo))
#define xinsque(a,b) insque((struct qelem *)(a), (struct qelem *)(b))
#define xremque(a) remque((struct qelem *)(a))
#define xmalloc(a) malloc((unsigned)(a))
/* the magic class to match all packets */
#define MATCHALL_CLASS "zmatch_all"
/* ACL's for pre-registered classes */
#define ZEPHYR_ACL_DIR "/site/zephyr/"
#define ZEPHYR_CTL_ACL "zctl.acl"
#define LOGIN_ACL "login.acl"
#define LOCATE_ACL "locate.acl"
#define MATCH_ALL_ACL "matchall.acl"
/* debugging macros */
#ifdef DEBUG
#define zdbug(s1) if (zdebug) syslog s1;
#else !DEBUG
#define zdbug(s1)
#endif DEBUG
#endif !__ZSERVER_H__
|