1/************************************************************************
2          Copyright 1988, 1991 by Carnegie Mellon University
3
4                          All Rights Reserved
5
6Permission to use, copy, modify, and distribute this software and its
7documentation for any purpose and without fee is hereby granted, provided
8that the above copyright notice appear in all copies and that both that
9copyright notice and this permission notice appear in supporting
10documentation, and that the name of Carnegie Mellon University not be used
11in advertising or publicity pertaining to distribution of the software
12without specific, written prior permission.
13
14CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
15SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
16IN NO EVENT SHALL CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
17DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
18PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
19ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20SOFTWARE.
21************************************************************************/
22
23
24/*
25 * bootpd.h -- common header file for all the modules of the bootpd program.
26 */
27
28#include "bptypes.h"
29#include "hash.h"
30#include "hwaddr.h"
31
32#ifndef TRUE
33#define TRUE	1
34#endif
35#ifndef FALSE
36#define FALSE	0
37#endif
38
39#ifndef PRIVATE
40#define PRIVATE static
41#endif
42
43#ifndef SIGUSR1
44#define SIGUSR1			 30	/* From 4.3 <signal.h> */
45#endif
46
47#define MAXSTRINGLEN		 80	/* Max string length */
48
49/* Local definitions: */
50#define MAX_MSG_SIZE		(3*512) /* Maximum packet size */
51
52
53/*
54 * Return pointer to static string which gives full network error message.
55 */
56#define get_network_errmsg get_errmsg
57
58
59/*
60 * Data structure used to hold an arbitrary-lengthed list of IP addresses.
61 * The list may be shared among multiple hosts by setting the linkcount
62 * appropriately.
63 */
64
65struct in_addr_list {
66    unsigned int	linkcount, addrcount;
67    struct in_addr	addr[1];		/* Dynamically extended */
68};
69
70
71/*
72 * Data structures used to hold shared strings and shared binary data.
73 * The linkcount must be set appropriately.
74 */
75
76struct shared_string {
77    unsigned int	linkcount;
78    char		string[1];		/* Dynamically extended */
79};
80
81struct shared_bindata {
82    unsigned int	linkcount, length;
83    byte		data[1];		/* Dynamically extended */
84};
85
86
87/*
88 * Flag structure which indicates which symbols have been defined for a
89 * given host.  This information is used to determine which data should or
90 * should not be reported in the bootp packet vendor info field.
91 */
92
93struct flag {
94    unsigned	bootfile	:1,
95		bootserver	:1,
96		bootsize	:1,
97		bootsize_auto	:1,
98		cookie_server	:1,
99		domain_server	:1,
100		gateway		:1,
101		generic		:1,
102		haddr		:1,
103		homedir		:1,
104		htype		:1,
105		impress_server	:1,
106		iaddr		:1,
107		log_server	:1,
108		lpr_server	:1,
109		name_server	:1,
110		name_switch	:1,
111		rlp_server	:1,
112		send_name	:1,
113		subnet_mask	:1,
114		tftpdir		:1,
115		time_offset	:1,
116		time_server	:1,
117		dump_file	:1,
118		domain_name	:1,
119		swap_server	:1,
120		root_path	:1,
121		exten_file	:1,
122		reply_addr	:1,
123		nis_domain	:1,
124		nis_server	:1,
125		ntp_server	:1,
126		exec_file	:1,
127		msg_size	:1,
128		min_wait	:1,
129		/* XXX - Add new tags here */
130		vm_cookie	:1;
131};
132
133
134
135/*
136 * The flags structure contains TRUE flags for all the fields which
137 * are considered valid, regardless of whether they were explicitly
138 * specified or indirectly inferred from another entry.
139 *
140 * The gateway and the various server fields all point to a shared list of
141 * IP addresses.
142 *
143 * The hostname, home directory, and bootfile are all shared strings.
144 *
145 * The generic data field is a shared binary data structure.  It is used to
146 * hold future RFC1048 vendor data until bootpd is updated to understand it.
147 *
148 * The vm_cookie field specifies the four-octet vendor magic cookie to use
149 * if it is desired to always send the same response to a given host.
150 *
151 * Hopefully, the rest is self-explanatory.
152 */
153
154struct host {
155    unsigned		    linkcount;		/* hash list inserts */
156    struct flag		    flags;		/* ALL valid fields */
157    struct in_addr_list	    *cookie_server,
158			    *domain_server,
159			    *gateway,
160			    *impress_server,
161			    *log_server,
162			    *lpr_server,
163			    *name_server,
164			    *rlp_server,
165			    *time_server,
166			    *nis_server,
167			    *ntp_server;
168    struct shared_string    *bootfile,
169			    *hostname,
170			    *domain_name,
171			    *homedir,
172			    *tftpdir,
173			    *dump_file,
174			    *exten_file,
175			    *root_path,
176			    *nis_domain,
177			    *exec_file;
178    struct shared_bindata   *generic;
179    byte		    vm_cookie[4],
180			    htype,  /* RFC826 says this should be 16-bits but
181				       RFC951 only allocates 1 byte. . . */
182			    haddr[MAXHADDRLEN];
183    int32		    time_offset;
184    u_int32		    bootsize,
185			    msg_size,
186			    min_wait;
187    struct in_addr	    bootserver,
188			    iaddr,
189			    swap_server,
190			    reply_addr,
191			    subnet_mask;
192    /* XXX - Add new tags here (or above as appropriate) */
193};
194
195
196
197/*
198 * Variables shared among modules.
199 */
200
201extern int debug;
202extern char *bootptab;
203extern char *progname;
204
205extern u_char vm_cmu[4];
206extern u_char vm_rfc1048[4];
207
208extern hash_tbl *hwhashtable;
209extern hash_tbl *iphashtable;
210extern hash_tbl *nmhashtable;
211
212