chiark / gitweb /
Socket address type management.
[fwd] / addr.h
1 /* -*-c-*-
2  *
3  * $Id: addr.h,v 1.1 1999/07/26 23:34:26 mdw Exp $
4  *
5  * Generic interface to network address handlers
6  *
7  * (c) 1999 Straylight/Edgeware
8  */
9
10 /*----- Licensing notice --------------------------------------------------* 
11  *
12  * This file is part of the `fw' port forwarder.
13  *
14  * `fw' is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  * 
19  * `fw' is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  * 
24  * You should have received a copy of the GNU General Public License
25  * along with `fw'; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27  */
28
29 /*----- Revision history --------------------------------------------------* 
30  *
31  * $Log: addr.h,v $
32  * Revision 1.1  1999/07/26 23:34:26  mdw
33  * Socket address type management.
34  *
35  */
36
37 #ifndef ADDR_H
38 #define ADDR_H
39
40 #ifdef __cplusplus
41   extern "C" {
42 #endif
43
44 /*----- Header files ------------------------------------------------------*/
45
46 #include <sys/socket.h>
47
48 #include <mLib/dstr.h>
49
50 #ifndef REFFD_H
51 #  include "reffd.h"
52 #endif
53
54 #ifndef SCAN_H
55 #  include "scan.h"
56 #endif
57
58 /*----- Data structures ---------------------------------------------------*/
59     
60 /* --- A generic socket address --- *
61  *
62  * Not all systems understand @sa_len@ fields.  (In particular, Linux
63  * doesn't.)  Some fairly ugly hacking is then performed on particular
64  * address types.
65  */
66
67 typedef struct addr {
68   struct addr_ops *ops;
69   size_t sz;
70 } addr;
71
72 typedef struct gen_addr {
73   addr a;
74   struct sockaddr sa;
75 } gen_addr;
76
77 #define ADDRSZ(sz) (sizeof(addr) + (sz))
78
79 /* --- Address configuration --- *
80  *
81  * An address family will want to extend this.
82  */
83
84 typedef struct addr_opts {
85   unsigned f;
86 } addr_opts;
87
88 #define ADDRF_NOLOG 1u
89
90 /* --- Address types --- *
91  *
92  * For things like Internet addresses, source and destinations look
93  * different.
94  */
95
96 enum {
97   ADDR_SRC,
98   ADDR_DEST
99 };
100
101 /* --- Description of an address type handler --- */
102
103 typedef struct addr_ops {
104   const char *name;                     /* Protocol's internal name */
105   int pf;                               /* Protocol family number */
106
107   /* --- @read@ --- *
108    *
109    * Arguments: @scanner *sc@ = pointer to scanner to read from
110    *            @unsigned type@ = type of address to be read
111    *
112    * Returns:   A filled-in socket address.
113    *
114    * Use:       Parses a textual representation of a socket address.
115    */
116
117   addr *(*read)(scanner */*sc*/, unsigned /*type*/);
118
119   /* --- @destroy@ --- *
120    *
121    * Arguments: @addr *a@ = pointer to an address block
122    *
123    * Returns:   ---
124    *
125    * Use:       Disposes of an address block in some suitable fashion.
126    */
127
128   void (*destroy)(addr */*a*/);
129
130   /* --- @print@ --- *
131    *
132    * Arguments: @addr *a@ = pointer to socket address to read
133    *            @unsigned type@ = type of address to be written
134    *            @dstr *d@ = string on which to write the description
135    *
136    * Returns:   ---
137    *
138    * Use:       Writes a textual representation of a socket address to
139    *            a string.
140    */
141
142   void (*print)(addr */*a*/, unsigned /*type*/, dstr */*d*/);
143
144   /* --- @initopts@ --- *
145    *
146    * Arguments: ---
147    *
148    * Returns:   A pointer to a protocol-specific data block for a listener
149    *
150    * Use:       Creates a data block for a listener.  This is attached to the
151    *            listener data structure.  Options can then be requested, and
152    *            are added to the block when necessary.
153    */
154
155   addr_opts *(*initopts)(void);
156
157   /* --- @option@ --- *
158    *
159    * Arguments: @scanner *sc@ = pointer to a scanner to read from
160    *            @addr_opts *ao@ = data block to modify (from @init@), or null
161    *
162    * Returns:   Nonzero to claim the option.
163    *
164    * Use:       Parses an option, either global or listener-specific.
165    */
166
167   int (*option)(scanner */*sc*/, addr_opts */*ao*/);
168
169   /* --- @accept@ --- *
170    *
171    * Arguments: @int fd@ = listening file descriptor
172    *            @addr_opts *ao@ = data block to get configuration from
173    *            @const char *desc@ = description of the listener
174    *
175    * Returns:   Pointer to a reference counted file descriptor.
176    *
177    * Use:       Accepts, verifies and logs an incoming connection.
178    */
179
180   reffd *(*accept)(int /*fd*/, addr_opts */*ao*/, const char */*desc*/);
181
182   /* --- @freeopts@ --- *
183    *
184    * Arguments: @addr_opts *ao@ = data block to remove
185    *
186    * Returns:   ---
187    *
188    * Use:       Throws away all the configuration data for an address type.
189    */
190
191   void (*freeopts)(addr_opts */*ao*/);
192
193   /* --- @bound@ --- *
194    *
195    * Arguments: @addr *a@ = pointer to an address
196    *            @addr_opts *ao@ = pointer to attributes block
197    *
198    * Returns:   ---
199    *
200    * Use:       Reports that a file descriptor has been (successfully) bound
201    *            to an address.
202    */
203
204   void (*bound)(addr */*a*/, addr_opts */*ao*/);
205
206   /* --- @unbind@ --- *
207    *
208    * Arguments: @addr *a@ = pointer to an address
209    *
210    * Returns:   ---
211    *
212    * Use:       Unbinds an address.  This is used when tidying up.  The main
213    *            purpose is to let the Unix-domain handler remove its socket
214    *            node from the filesystem.
215    */
216
217   void (*unbind)(addr */*a*/);
218
219 } addr_ops;
220   
221 /*----- That's all, folks -------------------------------------------------*/
222
223 #ifdef __cplusplus
224   }
225 #endif
226
227 #endif