Consolidate all the external definitions into a single header.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 1 Apr 2008 19:12:19 +0000 (20:12 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 1 Apr 2008 21:23:57 +0000 (22:23 +0100)
This isn't a large project and isn't likely to become one.  This keeps
down the number of itty little files we need to keep track of.

36 files changed:
Makefile.am
acl.c
acl.h [deleted file]
addr.h [deleted file]
chan.c
chan.h [deleted file]
conf.c
endpt.c
endpt.h [deleted file]
exec.c
exec.h [deleted file]
fattr.c
fattr.h [deleted file]
file.c
file.h [deleted file]
fw.c
fw.h
identify.c
identify.h [deleted file]
inet.c
inet.h [deleted file]
make-manpage
mantext.h [deleted file]
privconn.c
privconn.h [deleted file]
reffd.c
reffd.h [deleted file]
rlimits.h
scan.c
socket.c
socket.h [deleted file]
source.c
source.h [deleted file]
target.h [deleted file]
un.c
un.h [deleted file]

index 7de67eb..6236c92 100644 (file)
@@ -61,39 +61,37 @@ fw_SOURCES           =
 fw_LDADD                = $(mLib_LIBS)
 
 ## Main program.
 fw_LDADD                = $(mLib_LIBS)
 
 ## Main program.
-fw_SOURCES             += fw.c         fw.h
+fw_SOURCES             += fw.c fw.h
 
 
-fw_SOURCES             += chan.c       chan.h
-fw_SOURCES             += endpt.c      endpt.h
-fw_SOURCES             += source.c     source.h
-fw_SOURCES             +=              target.h
+fw_SOURCES             += chan.c
+fw_SOURCES             += endpt.c
+fw_SOURCES             += source.c
 
 
-fw_SOURCES             += conf.c       conf.h
-fw_SOURCES             += scan.c       scan.h
-fw_SOURCES             += fattr.c      fattr.h
+fw_SOURCES             += conf.c
+fw_SOURCES             += scan.c
+fw_SOURCES             += fattr.c
 
 
-fw_SOURCES             += reffd.c      reffd.h
+fw_SOURCES             += reffd.c
 
 ## Sockets.
 
 ## Sockets.
-fw_SOURCES             += socket.c     socket.h
-fw_SOURCES             +=              addr.h
+fw_SOURCES             += socket.c
 
 
-fw_SOURCES             += un.c         un.h
+fw_SOURCES             += un.c
 
 
-fw_SOURCES             += inet.c       inet.h
-fw_SOURCES             += acl.c        acl.h
-fw_SOURCES             += identify.c   identify.h
-fw_SOURCES             += privconn.c   privconn.h
+fw_SOURCES             += inet.c
+fw_SOURCES             += acl.c
+fw_SOURCES             += identify.c
+fw_SOURCES             += privconn.c
 
 ## Files.
 
 ## Files.
-fw_SOURCES             += file.c       file.h
+fw_SOURCES             += file.c
 
 ## Executables.
 
 ## Executables.
-fw_SOURCES             += exec.c       exec.h
-fw_SOURCES             +=              rlimits.h
+fw_SOURCES             += exec.c
+fw_SOURCES             += rlimits.h
 
 ## Documentation.
 
 ## Documentation.
-fw_SOURCES             += mantext.c mantext.h
+fw_SOURCES             += mantext.c
 CLEANFILES             += mantext.c
 BUILT_SOURCES          += mantext.c
 
 CLEANFILES             += mantext.c
 BUILT_SOURCES          += mantext.c
 
diff --git a/acl.c b/acl.c
index f3140f5..fd5b777 100644 (file)
--- a/acl.c
+++ b/acl.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <mLib/sub.h>
-
-#include "acl.h"
+#include "fw.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
 
 /*----- Main code ---------------------------------------------------------*/
 
diff --git a/acl.h b/acl.h
deleted file mode 100644 (file)
index acc92d2..0000000
--- a/acl.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* -*-c-*-
- *
- * Access control list handling
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ACL_H
-#define ACL_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <stdio.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-/*----- Data structures ---------------------------------------------------*/
-
-/* --- An access control entry --- */
-
-typedef struct acl_entry {
-  struct acl_entry *next;              /* Next entry in the list */
-  const struct acl_ops *ops;           /* Operations for the ACL entry */
-  unsigned act;                                /* What to do with matching hosts */
-} acl_entry;
-
-#define ACL_DENY 0                     /* Deny access to matching conns */
-#define ACL_ALLOW 1                    /* Allow access to matching conns */
-#define ACL_PERM 1u                    /* Bit mask for permission bit */
-
-/* --- Host-based access control --- */
-
-typedef struct acl_host {
-  acl_entry a;                         /* Base structure */
-  struct in_addr addr, mask;           /* Address and netmask */
-} acl_host;
-
-/* --- ACL methods --- */
-
-typedef struct acl_ops {
-  int (*check)(void */*a*/, struct in_addr /*addr*/, unsigned /*port*/);
-  void (*dump)(void */*a*/, FILE */*fp*/);
-  void (*free)(void */*a*/);
-} acl_ops;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @acl_check@ --- *
- *
- * Arguments:  @acl_entry *a@ = pointer to ACL to check against
- *             @struct in_addr addr@ = address to check
- *             @unsigned port@ = port number to check
- *             @int *act@ = verdict (should initially be @ACT_ALLOW@)
- *
- * Returns:    Zero if undecided, nonzero if a rule matched.
- *
- * Use:                Checks an address against an ACL.
- */
-
-extern int acl_check(acl_entry */*a*/,
-                    struct in_addr /*addr*/, unsigned /*port*/,
-                    int */*act*/);
-
-/* --- @acl_dump@ --- *
- *
- * Arguments:  @acl_entry *a@ = pointer to ACL to dump
- *             @FILE *fp@ = pointer to stream to dump on
- *
- * Returns:    ---
- *
- * Use:                Dumps an access control list to an output stream.
- */
-
-extern void acl_dump(acl_entry */*a*/, FILE */*fp*/);
-
-/* --- @acl_free@ --- *
- *
- * Arguments:  @acl_entry *a@ = pointer to a list of ACLs
- *
- * Returns:    ---
- *
- * Use:                Frees all of the memory used by an ACL.
- */
-
-extern void acl_free(acl_entry */*a*/);
-
-/* --- @acl_addhost@ --- *
- *
- * Arguments:  @acl_entry ***a@ = address of pointer to list tail
- *             @unsigned act@ = what to do with matching addresses
- *             @struct in_addr addr, mask@ = address and mask to match
- *
- * Returns:    ---
- *
- * Use:                Adds a host-authentication entry to the end of an access
- *             control list.
- */
-
-extern void acl_addhost(acl_entry ***/*a*/, unsigned /*act*/,
-                       struct in_addr /*addr*/, struct in_addr /*mask*/);
-
-/* --- @acl_addpriv@ --- *
- *
- * Arguments:  @acl_entry ***a@ = address of pointer to list tail
- *             @unsigned act@ = what to do with matching addresses
- *
- * Returns:    ---
- *
- * Use:                Adds a privileged-port check to the end of an access control
- *             list.
- */
-
-extern void acl_addpriv(acl_entry ***/*a*/, unsigned /*act*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/addr.h b/addr.h
deleted file mode 100644 (file)
index 7da1fef..0000000
--- a/addr.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/* -*-c-*-
- *
- * Generic interface to network address handlers
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ADDR_H
-#define ADDR_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <mLib/dstr.h>
-#include <mLib/conn.h>
-
-#ifndef REFFD_H
-#  include "reffd.h"
-#endif
-
-#ifndef ENDPT_H
-#  include "endpt.h"
-#endif
-
-#ifndef SCAN_H
-#  include "scan.h"
-#endif
-
-/*----- Data structures ---------------------------------------------------*/
-
-/* --- A generic socket address --- *
- *
- * Not all systems understand @sa_len@ fields.  (In particular, Linux
- * doesn't.)  Some fairly ugly hacking is then performed on particular
- * address types.
- */
-
-typedef struct addr {
-  struct addr_ops *ops;
-  size_t sz;
-} addr;
-
-#define ADDRSZ(sz) (sizeof(addr) + (sz))
-
-/* --- Address configuration --- *
- *
- * An address family will want to extend this.
- */
-
-typedef struct addr_opts {
-  unsigned f;
-} addr_opts;
-
-#define ADDRF_NOLOG 1u
-
-/* --- Address types --- *
- *
- * For things like Internet addresses, source and destinations look
- * different.
- */
-
-enum {
-  ADDR_SRC,
-  ADDR_DEST,
-  ADDR_GLOBAL
-};
-
-/* --- Description of an address type handler --- */
-
-typedef struct addr_ops {
-  const char *name;                    /* Protocol's internal name */
-
-  /* --- @read@ --- *
-   *
-   * Arguments:        @scanner *sc@ = pointer to scanner to read from
-   *           @unsigned type@ = type of address to be read
-   *
-   * Returns:  A filled-in socket address.
-   *
-   * Use:      Parses a textual representation of a socket address.
-   */
-
-  addr *(*read)(scanner */*sc*/, unsigned /*type*/);
-
-  /* --- @destroy@ --- *
-   *
-   * Arguments:        @addr *a@ = pointer to an address block
-   *
-   * Returns:  ---
-   *
-   * Use:      Disposes of an address block in some suitable fashion.
-   */
-
-  void (*destroy)(addr */*a*/);
-
-  /* --- @print@ --- *
-   *
-   * Arguments:        @addr *a@ = pointer to socket address to read
-   *           @unsigned type@ = type of address to be written
-   *           @dstr *d@ = string on which to write the description
-   *
-   * Returns:  ---
-   *
-   * Use:      Writes a textual representation of a socket address to
-   *           a string.
-   */
-
-  void (*print)(addr */*a*/, unsigned /*type*/, dstr */*d*/);
-
-  /* --- @initsrcopts@ --- *
-   *
-   * Arguments:        ---
-   *
-   * Returns:  A pointer to a protocol-specific data block for a listener
-   *
-   * Use:      Creates a data block for a listener.  This is attached to the
-   *           listener data structure.  Options can then be requested, and
-   *           are added to the block when necessary.
-   */
-
-  addr_opts *(*initsrcopts)(void);
-
-  /* --- @option@ --- *
-   *
-   * Arguments:        @scanner *sc@ = pointer to a scanner to read from
-   *           @unsigned type@ = kind of option this is
-   *           @addr_opts *ao@ = data block to modify (from @init@), or null
-   *
-   * Returns:  Nonzero to claim the option.
-   *
-   * Use:      Parses a source option, either global or listener-specific.
-   */
-
-  int (*option)(scanner */*sc*/, addr_opts */*ao*/, unsigned /*type*/);
-
-  /* --- @confirm@ --- *
-   *
-   * Arguments:        @addr *a@ = pointer to an address structure
-   *           @unsigned type@ = kind of address this is
-   *           @addr_opts *ao@ = address options
-   *
-   * Returns:  ---
-   *
-   * Use:      Called during initialization when an address is fully
-   *           configured.
-   */
-
-  void (*confirm)(addr */*a*/, unsigned /*type*/, addr_opts */*ao*/);
-
-  /* --- @freesrcopts@ --- *
-   *
-   * Arguments:        @addr_opts *ao@ = data block to remove
-   *
-   * Returns:  ---
-   *
-   * Use:      Throws away all the configuration data for an address type.
-   */
-
-  void (*freesrcopts)(addr_opts */*ao*/);
-
-  /* --- @bind@ --- *
-   *
-   * Arguments:        @addr *a@ = the address to bind to
-   *           @addr_opts *ao@ = the address options
-   *
-   * Returns:  File descriptor of bound socket if OK, or @-1@ on error.
-   *
-   * Use:      Binds a listening socket.  The tedious stuff with @listen@
-   *           isn't necessary.
-   */
-
-  int (*bind)(addr */*a*/, addr_opts */*ao*/);
-
-  /* --- @unbind@ --- *
-   *
-   * Arguments:        @addr *a@ = pointer to an address
-   *
-   * Returns:  ---
-   *
-   * Use:      Unbinds an address.  This is used when tidying up.  The main
-   *           purpose is to let the Unix-domain handler remove its socket
-   *           node from the filesystem.
-   */
-
-  void (*unbind)(addr */*a*/);
-
-  /* --- @accept@ --- *
-   *
-   * Arguments:        @int fd@ = listening file descriptor
-   *           @addr_opts *ao@ = data block to get configuration from
-   *           @const char *desc@ = description of the listener
-   *
-   * Returns:  Pointer to a reference counted file descriptor.
-   *
-   * Use:      Accepts, verifies and logs an incoming connection.
-   */
-
-  reffd *(*accept)(int /*fd*/, addr_opts */*ao*/, const char */*desc*/);
-
-  /* --- @inittargopts@ --- *
-   *
-   * Arguments:        ---
-   *
-   * Returns:  A pointer to a protocol-specific data block for a connecter
-   *
-   * Use:      Creates a data block for a target.  This is attached to the
-   *           target data structure.  Options can then be requested, and
-   *           are added to the block when necessary.
-   */
-
-  addr_opts *(*inittargopts)(void);
-
-  /* --- @freetargopts@ --- *
-   *
-   * Arguments:        @addr_opts *ao@ = data block to remove
-   *
-   * Returns:  ---
-   *
-   * Use:      Throws away all the configuration data for an address type.
-   */
-
-  void (*freetargopts)(addr_opts */*ao*/);
-
-  /* --- @connect@ --- *
-   *
-   * Arguments:        @addr *a@ = destination address
-   *           @addr_opts *ao@ = target address options
-   *           @conn *c@ = connection structure
-   *           @endpt *e@ = endpoint structure
-   *
-   * Returns:  Zero if OK, @-1@ on some error.
-   *
-   * Use:      Requests that a connection be made, or at least set in
-   *           motion.  An address may do one of these things:
-   *
-   *             * Return @-1@.
-   *
-   *             * Call @starget_connected@ with @-1@ or a connected file
-   *               descriptor and the pointer @e@.
-   *
-   *             * Call @conn_init@ or @conn_fd@, giving @starget_connected@
-   *               and @e@ as the function to call.
-   */
-
-  int (*connect)(addr */*a*/, addr_opts */*ao*/, conn */*c*/, endpt */*e*/);
-
-} addr_ops;
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/chan.c b/chan.c
index 1729af3..e4965af 100644 (file)
--- a/chan.c
+++ b/chan.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <mLib/alloc.h>
-#include <mLib/conn.h>
-#include <mLib/sel.h>
-
-#include "chan.h"
 #include "fw.h"
 
 #ifdef CHAN_DEBUG
 #include "fw.h"
 
 #ifdef CHAN_DEBUG
diff --git a/chan.h b/chan.h
deleted file mode 100644 (file)
index e416feb..0000000
--- a/chan.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*-c-*-
- *
- * Channel management
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef CHAN_H
-#define CHAN_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <mLib/sel.h>
-
-/*----- Magic numbers -----------------------------------------------------*/
-
-#define CHAN_BUFSZ 4096
-
-/*----- Data structures ---------------------------------------------------*/
-
-typedef struct chan {
-  unsigned base, len;                  /* Base and length of data */
-  unsigned f;                          /* Various interesting flags */
-  void (*func)(void */*p*/);           /* Function to call on closure */
-  void *p;                             /* Argument to pass function */
-  sel_file r, w;                       /* Reader and writer selectors */
-  char buf[CHAN_BUFSZ];                        /* The actual data buffer */
-} chan;
-
-#define CHANF_CLOSE 1u                 /* Close channel when buffer empty */
-#define CHANF_READY 2u                 /* The channel destination exists */
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @chan_close@ --- *
- *
- * Arguments:  @chan *c@ = pointer to channel
- *
- * Returns:    ---
- *
- * Use:                Closes down a channel prematurely.
- */
-
-extern void chan_close(chan */*c*/);
-
-/* --- @chan_dest@ --- *
- *
- * Arguments:  @chan *c@ = pointer to channel
- *             @int fd@ = destination file descriptor for channel
- *
- * Returns:    ---
- *
- * Use:                Sets the channel's destination so it knows where to put
- *             data.
- */
-
-extern void chan_dest(chan */*c*/, int /*fd*/);
-
-/* --- @chan_open@ --- *
- *
- * Arguments:  @chan *c@ = pointer to channel to open
- *             @int from, to@ = source and destination file descriptors
- *             @void (*func)(void *p)@ = function to call on closure
- *             @void *p@ = argument to pass to function
- *
- * Returns:    ---
- *
- * Use:                Opens a channel.  Data is copied from the source to the
- *             destination.  The @to@ argument may be @-1@ if the file
- *             descriptor isn't known yet.
- */
-
-extern void chan_open(chan */*c*/, int /*from*/, int /*to*/,
-                     void (*/*func*/)(void */*p*/), void */*p*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/conf.c b/conf.c
index 7212e71..a31d179 100644 (file)
--- a/conf.c
+++ b/conf.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <mLib/dstr.h>
-#include <mLib/quis.h>
-#include <mLib/report.h>
-
-#include "conf.h"
-#include "scan.h"
+#include "fw.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
 
 /*----- Main code ---------------------------------------------------------*/
 
diff --git a/endpt.c b/endpt.c
index 9401aa4..2e51e54 100644 (file)
--- a/endpt.c
+++ b/endpt.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <mLib/alloc.h>
-
-#include "chan.h"
-#include "endpt.h"
+#include "fw.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/endpt.h b/endpt.h
deleted file mode 100644 (file)
index b2a5e14..0000000
--- a/endpt.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*-c-*-
- *
- * Generic endpoint abstraction
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef ENDPT_H
-#define ENDPT_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#ifndef REFFD_H
-#  include "reffd.h"
-#endif
-
-/*----- Data structures ---------------------------------------------------*/
-
-/* --- Basic endpoint structure --- */
-
-typedef struct endpt {
-  struct endpt_ops *ops;               /* Pointer to operations table */
-  struct endpt *other;                 /* Pointer to sibling endpoint */
-  unsigned f;                          /* Various flags */
-  struct tango *t;                     /* Private data structure */
-  reffd *in, *out;                     /* File descriptors */
-} endpt;
-
-/* --- Endpoint flags --- */
-
-#define EPF_PENDING 1u                 /* Endpoint creation in progress */
-#define EPF_FILE 2u                    /* Endpoint smells like a file */
-
-/* --- Endpoint operations table --- */
-
-typedef struct endpt_ops {
-
-  /* --- @attach@ --- *
-   *
-   * Arguments:        @endpt *e@ = pointer to endpoint to be attached
-   *           @reffd *in, *out@ = input and output file descriptors
-   *
-   * Returns:  ---
-   *
-   * Use:      Instructs a non-file endpoint to attach itself to a pair of
-   *           files.
-   */
-
-  void (*attach)(endpt */*e*/, reffd */*in*/, reffd */*out*/);
-
-  /* --- @file@ --- *
-   *
-   * Arguments:        @endpt *e@ = pointer to endpoint in question
-   *           @endpt *f@ = pointer to a file endpoint
-   *
-   * Returns:  ---
-   *
-   * Use:      Informs a non-file endpoint of a file endpoint which will
-   *           want to be closed when it's finished with.  At that time, the
-   *           endpoint should arrange to have both itself and its partner
-   *           closed.  If no file is registered, the endpoint manager will
-   *           close both endpoints itself.
-   */
-
-  void (*file)(endpt */*e*/, endpt */*f*/);
-
-  /* --- @wclose@ --- *
-   *
-   * Arguments:        @endpt *e@ = endpoint to be partially closed
-   *
-   * Returns:  ---
-   *
-   * Use:      Announces that the endpoint will not be written to any more.
-   */
-
-  void (*wclose)(endpt */*e*/);
-
-  /* --- @close@ --- *
-   *
-   * Arguments:        @endpt *e@ = endpoint to be closed
-   *
-   * Returns:  ---
-   *
-   * Use:      Completely closes an endpoint.  The endpoint's data may be
-   *           freed, although some endpoints may wish to delay freeing for
-   *           some reason.
-   */
-
-  void (*close)(endpt */*e*/);
-
-} endpt_ops;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @endpt_kill@ --- *
- *
- * Arguments:  @endpt *a@ = an endpoint
- *
- * Returns:    ---
- *
- * Use:                Kills an endpoint.  If the endpoint is joined to another, the
- *             other endpoint is also killed, as is the connection between
- *             them (and that's the tricky bit).
- */
-
-extern void endpt_kill(endpt */*a*/);
-
-/* --- @endpt_killall@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Destroys all current endpoint connections.  Used when
- *             shutting down.
- */
-
-extern void endpt_killall(void);
-
-/* --- @endpt_join@ --- *
- *
- * Arguments:  @endpt *a@ = pointer to first endpoint
- *             @endpt *b@ = pointer to second endpoint
- *
- * Returns:    ---
- *
- * Use:                Joins two endpoints together.
- */
-
-extern void endpt_join(endpt */*a*/, endpt */*b*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/exec.c b/exec.c
index 0ea283f..f7c96ef 100644 (file)
--- a/exec.c
+++ b/exec.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#define _GNU_SOURCE
-
-#include <ctype.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-
-#ifdef HAVE_SETRLIMIT
-#  include <sys/resource.h>
-#endif
-
-#ifndef DECL_ENVIRON
-  extern char **environ;
-#endif
-
-#include <pwd.h>
-#include <grp.h>
-
-#include <syslog.h>
-
-#include <mLib/alloc.h>
-#include <mLib/dstr.h>
-#include <mLib/env.h>
-#include <mLib/fdflags.h>
-#include <mLib/report.h>
-#include <mLib/sel.h>
-#include <mLib/selbuf.h>
-#include <mLib/sig.h>
-#include <mLib/sub.h>
-#include <mLib/sym.h>
-
-#include "conf.h"
-#include "endpt.h"
-#include "exec.h"
-#include "fattr.h"
 #include "fw.h"
 #include "fw.h"
-#include "reffd.h"
-#include "scan.h"
-#include "source.h"
-#include "target.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/exec.h b/exec.h
deleted file mode 100644 (file)
index 9d4fb0c..0000000
--- a/exec.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*-c-*-
- *
- * Source and target for executable programs
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef EXEC_H
-#define EXEC_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#ifndef SOURCE_H
-#  include "source.h"
-#endif
-
-#ifndef TARGET_H
-#  include "target.h"
-#endif
-
-/*----- Source and target -------------------------------------------------*/
-
-extern source_ops xsource_ops;
-extern target_ops xtarget_ops;
-
-/*----- Other functions ---------------------------------------------------*/
-
-/* --- @exec_init@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Initializes the executable problem source and target.
- */
-
-extern void exec_init(void);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/fattr.c b/fattr.c
index f27511c..716efbc 100644 (file)
--- a/fattr.c
+++ b/fattr.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include <pwd.h>
-#include <grp.h>
-
-#include "conf.h"
-#include "fattr.h"
-#include "scan.h"
+#include "fw.h"
 
 /*----- Global variables --------------------------------------------------*/
 
 
 /*----- Global variables --------------------------------------------------*/
 
diff --git a/fattr.h b/fattr.h
deleted file mode 100644 (file)
index d08be26..0000000
--- a/fattr.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* -*-c-*-
- *
- * Handling of file attributes
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef FATTR_H
-#define FATTR_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <sys/types.h>
-
-#include "scan.h"
-
-/*----- Data structures ---------------------------------------------------*/
-
-typedef struct fattr {
-  unsigned mode;
-  uid_t uid;
-  gid_t gid;
-} fattr;
-
-/*----- Global variables --------------------------------------------------*/
-
-extern fattr fattr_global;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @fattr_init@ --- *
- *
- * Arguments:  @fattr *f@ = pointer to file attributes
- *
- * Returns:    ---
- *
- * Use:                Initializes a set of file attributes to default values.
- */
-
-extern void fattr_init(fattr */*f*/);
-
-/* --- @fattr_option@ --- *
- *
- * Arguments:  @scanner *sc@ = pointer to scanner to read
- *             @fattr *f@ = pointer to file attributes to set
- *
- * Returns:    Whether the option was clamed.
- *
- * Use:                Reads file attributes from a scanner.
- */
-
-extern int fattr_option(scanner */*sc*/, fattr */*f*/);
-
-/* --- @fattr_apply@ --- *
- *
- * Arguments:  @const char *file@ = pointer to filename
- *             @fattr *f@ = pointer to attribute set
- *
- * Returns:    @-1@ if it failed.
- *
- * Use:                Applies file attributes to a file.  For best results, try to
- *             create the file with the right permissions and so on.  This
- *             call will fix everything up, but there are potential races
- *             which might catch you out if you're not careful.
- */
-
-extern int fattr_apply(const char */*file*/, fattr */*f*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/file.c b/file.c
index 914edd8..cf0706d 100644 (file)
--- a/file.c
+++ b/file.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <mLib/alloc.h>
-#include <mLib/dstr.h>
-#include <mLib/fdflags.h>
-#include <mLib/sub.h>
-
-#include "conf.h"
-#include "endpt.h"
-#include "fattr.h"
-#include "file.h"
 #include "fw.h"
 #include "fw.h"
-#include "reffd.h"
-#include "scan.h"
-#include "source.h"
-#include "target.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/file.h b/file.h
deleted file mode 100644 (file)
index cb558f7..0000000
--- a/file.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*-c-*-
- *
- * File source and target
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef FILE_H
-#define FILE_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#ifndef SOURCE_H
-#  include "source.h"
-#endif
-
-#ifndef TARGET_H
-#  include "target.h"
-#endif
-
-/*----- Sources and targets -----------------------------------------------*/
-
-extern source_ops fsource_ops;
-extern target_ops ftarget_ops;
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/fw.c b/fw.c
index d09302b..4b0a861 100644 (file)
--- a/fw.c
+++ b/fw.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include <unistd.h>
-#include <syslog.h>
-
-#include <grp.h>
-#include <pwd.h>
-
-#include <mLib/bres.h>
-#include <mLib/dstr.h>
-#include <mLib/mdwopt.h>
-#include <mLib/quis.h>
-#include <mLib/report.h>
-#include <mLib/sel.h>
-#include <mLib/sig.h>
-#include <mLib/sub.h>
-
-#include "conf.h"
-#include "endpt.h"
-#include "exec.h"
-#include "fattr.h"
-#include "file.h"
 #include "fw.h"
 #include "fw.h"
-#include "mantext.h"
-#include "privconn.h"
-#include "scan.h"
-#include "socket.h"
-#include "source.h"
 
 /*----- Global variables --------------------------------------------------*/
 
 
 /*----- Global variables --------------------------------------------------*/
 
diff --git a/fw.h b/fw.h
index afd313e..0206b2e 100644 (file)
--- a/fw.h
+++ b/fw.h
 
 /*----- Header files ------------------------------------------------------*/
 
 
 /*----- Header files ------------------------------------------------------*/
 
+/* --- Configuration --- */
+
+#include "config.h"
+#define _GNU_SOURCE
+
+/* --- ANSI C --- */
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <time.h>
 #include <time.h>
+
+/* --- Unix --- */
+
 #include <fcntl.h>
 #include <fcntl.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/wait.h>
+
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <pwd.h>
+#include <grp.h>
+
+#include <syslog.h>
+
+/* --- mLib --- */
+
+#include <mLib/alloc.h>
+#include <mLib/bres.h>
+#include <mLib/conn.h>
+#include <mLib/darray.h>
+#include <mLib/dstr.h>
+#include <mLib/env.h>
+#include <mLib/fdflags.h>
+#include <mLib/fdpass.h>
+#include <mLib/ident.h>
+#include <mLib/mdwopt.h>
+#include <mLib/quis.h>
+#include <mLib/report.h>
 #include <mLib/sel.h>
 #include <mLib/sel.h>
+#include <mLib/selbuf.h>
+#include <mLib/sig.h>
+#include <mLib/str.h>
+#include <mLib/sub.h>
+#include <mLib/sym.h>
+#include <mLib/tv.h>
+
+/*----- Other subtleties --------------------------------------------------*/
+
+#if defined(HAVE_DECL_ENVIRON) && !HAVE_DECL_ENVIRON
+  extern char **environ;
+#endif
+
+/*----- Main program ------------------------------------------------------*/
 
 
-/*----- Global variables --------------------------------------------------*/
+/* --- The global select state --- */
 
 extern sel_state *sel;
 
 
 extern sel_state *sel;
 
-/*----- Functions provided ------------------------------------------------*/
+/* --- Help text --- */
+
+extern const char grammar_text[];
+extern const char option_text[];
 
 /* --- @fw_log@ --- *
  *
 
 /* --- @fw_log@ --- *
  *
@@ -69,6 +141,1264 @@ extern void fw_log(time_t /*t*/, const char */*fmt*/, ...);
 extern void fw_inc(void);
 extern void fw_dec(void);
 
 extern void fw_inc(void);
 extern void fw_dec(void);
 
+/*----- Channel management ------------------------------------------------*/
+
+/* --- Magic numbers --- */
+
+#define CHAN_BUFSZ 4096
+
+/* --- Channel structure --- */
+
+typedef struct chan {
+  unsigned base, len;                  /* Base and length of data */
+  unsigned f;                          /* Various interesting flags */
+  void (*func)(void */*p*/);           /* Function to call on closure */
+  void *p;                             /* Argument to pass function */
+  sel_file r, w;                       /* Reader and writer selectors */
+  char buf[CHAN_BUFSZ];                        /* The actual data buffer */
+} chan;
+
+#define CHANF_CLOSE 1u                 /* Close channel when buffer empty */
+#define CHANF_READY 2u                 /* The channel destination exists */
+
+/* --- @chan_close@ --- *
+ *
+ * Arguments:  @chan *c@ = pointer to channel
+ *
+ * Returns:    ---
+ *
+ * Use:                Closes down a channel prematurely.
+ */
+
+extern void chan_close(chan */*c*/);
+
+/* --- @chan_dest@ --- *
+ *
+ * Arguments:  @chan *c@ = pointer to channel
+ *             @int fd@ = destination file descriptor for channel
+ *
+ * Returns:    ---
+ *
+ * Use:                Sets the channel's destination so it knows where to put
+ *             data.
+ */
+
+extern void chan_dest(chan */*c*/, int /*fd*/);
+
+/* --- @chan_open@ --- *
+ *
+ * Arguments:  @chan *c@ = pointer to channel to open
+ *             @int from, to@ = source and destination file descriptors
+ *             @void (*func)(void *p)@ = function to call on closure
+ *             @void *p@ = argument to pass to function
+ *
+ * Returns:    ---
+ *
+ * Use:                Opens a channel.  Data is copied from the source to the
+ *             destination.  The @to@ argument may be @-1@ if the file
+ *             descriptor isn't known yet.
+ */
+
+extern void chan_open(chan */*c*/, int /*from*/, int /*to*/,
+                     void (*/*func*/)(void */*p*/), void */*p*/);
+
+/*----- Character scanners ------------------------------------------------*/
+
+/* --- A low-level scanner source --- */
+
+typedef struct scansrc {
+  struct scansrc *next;                        /* Next one in the list */
+  struct scansrc_ops *ops;             /* Pointer to operations table */
+  char *src;                           /* Name of this source */
+  int line;                            /* Current line number */
+  dstr pushback;                       /* Pushback characters */
+  char *tok;                           /* Token pushback */
+  unsigned t;                          /* Token type pushback */
+} scansrc;
+
+/* --- Scanner source operations --- */
+
+typedef struct scansrc_ops {
+  int (*scan)(scansrc */*ss*/);                /* Read another character */
+  void (*destroy)(scansrc */*ss*/);    /* Destroy an unwanted source */
+} scansrc_ops;
+
+/* --- A character scanner --- */
+
+typedef struct scanner {
+  scansrc *head, **tail;               /* Scanner list head and tail */
+  int t;                               /* Token type */
+  dstr d;                              /* Current token value */
+  const char *wbegin, *wcont;          /* Parsing exception strings */
+} scanner;
+
+/* --- @scan_file@ --- *
+ *
+ * Arguments:  @FILE *fp@ = pointer to file descriptor
+ *             @const char *name@ = pointer to source file name
+ *             @unsigned f@ = flags
+ *
+ * Returns:    A scanner source.
+ *
+ * Use:                Creates a new scanner source for reading from a file.
+ */
+
+#define SCF_NOCLOSE 1u                 /* Don't close @fp@ when finished */
+
+extern scansrc *scan_file(FILE */*fp*/, const char */*name*/,
+                         unsigned /*f*/);
+
+/* --- @scan_argv@ --- *
+ *
+ * Arguments:  @char **av@ = pointer to argument array (null terminated)
+ *
+ * Returns:    A scanner source.
+ *
+ * Use:                Creates a new scanner source for reading from an @argv@
+ *             array.
+ */
+
+extern scansrc *scan_argv(char **/*av*/);
+
+/* --- @scan@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *
+ * Returns:    Character read, or end-of-file.
+ *
+ * Use:                Scans a character from a source of characters.
+ */
+
+extern int scan(scanner */*sc*/);
+
+/* --- @unscan@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *             @int ch@ = character to unscan
+ *
+ * Returns:    ---
+ *
+ * Use:                Scans a character from a source of characters.
+ */
+
+extern void unscan(scanner */*sc*/, int /*ch*/);
+
+/* --- @scan_push@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *             @scansrc *ss@ = souorce to push
+ *
+ * Returns:    ---
+ *
+ * Use:                Pushes a scanner source onto the front of the queue.
+ */
+
+extern void scan_push(scanner */*sc*/, scansrc */*ss*/);
+
+/* --- @scan_add@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *             @scansrc *ss@ = souorce to push
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a scanner source onto the end of the queue.
+ */
+
+extern void scan_add(scanner */*sc*/, scansrc */*ss*/);
+
+/* --- @scan_create@ --- *
+ *
+ * Arguments:  @scanner *sc@ = scanner context to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a scanner block ready for use.
+ */
+
+extern void scan_create(scanner */*sc*/);
+
+/* --- @scan_destroy@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner context
+ *
+ * Returns:    ---
+ *
+ * Use:                Destroys a scanner and all the sources attached to it.
+ */
+
+extern void scan_destroy(scanner */*sc*/);
+
+/*----- Configuration parsing ---------------------------------------------*/
+
+/* --- Magical constants --- */
+
+#define CTOK_EOF (-1)
+#define CTOK_WORD 256
+
+/* --- @conf_undelim@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner definition
+ *             @const char *d, *dd@ = pointer to characters to escape
+ *
+ * Returns:    ---
+ *
+ * Use:                Modifies the tokenizer.  Characters in the first list will
+ *             always be considered to begin a word.  Characters in the
+ *             second list will always be allowed to continue a word.
+ */
+
+extern void conf_undelim(scanner */*sc*/,
+                        const char */*d*/, const char */*dd*/);
+
+/* --- @token@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner definition
+ *
+ * Returns:    Type of token scanned.
+ *
+ * Use:                Reads the next token from the character scanner.
+ */
+
+extern int token(scanner */*sc*/);
+
+/* --- @error@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner definition
+ *             @const char *msg@ = message skeleton string
+ *             @...@ = extra arguments for the skeleton
+ *
+ * Returns:    Doesn't
+ *
+ * Use:                Reports an error at the current scanner location.
+ */
+
+extern void error(scanner */*sc*/, const char */*msg*/, ...);
+
+/* --- @pushback@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner definition
+ *
+ * Returns:    ---
+ *
+ * Use:                Pushes the current token back.  This is normally a precursor
+ *             to pushing a new scanner source.
+ */
+
+extern void pushback(scanner */*sc*/);
+
+/* --- @conf_enum@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to a scanner object
+ *             @const char *list@ = comma-separated things to allow
+ *             @unsigned @f = flags for the search
+ *             @const char *err@ = error message if not found
+ *
+ * Returns:    Index into list, zero-based, or @-1@.
+ *
+ * Use:                Checks whether the current token is a string which matches
+ *             one of the comma-separated items given.  The return value is
+ *             the index (zero-based) of the matched string in the list.
+ *
+ *             The flags control the behaviour if no exact match is found.
+ *             If @ENUM_ABBREV@ is set, and the current token is a left
+ *             substring of exactly one of the possibilities, then that one
+ *             is chosen.  If @ENUM_NONE@ is set, the value @-1@ is
+ *             returned; otherwise an error is reported and the program is
+ *             terminated.
+ */
+
+#define ENUM_ABBREV 1u
+#define ENUM_NONE 2u
+
+extern int conf_enum(scanner */*sc*/, const char */*list*/,
+                    unsigned /*flags*/, const char */*err*/);
+
+/* --- @conf_prefix@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to a scanner object
+ *             @const char *p@ = pointer to prefix string to check
+ *
+ * Returns:    Nonzero if the prefix matches.
+ *
+ * Use:                If the current token is a word matching the given prefix
+ *             string, then it and an optional `.' character are removed and
+ *             a nonzero result is returned.  Otherwise the current token is
+ *             left as it is, and zero is returned.
+ *
+ *             Typical options parsing code would remove an expected prefix,
+ *             scan an option anyway (since qualifying prefixes are
+ *             optional) and if a match is found, claim the option.  If no
+ *             match is found, and a prefix was stripped, then an error
+ *             should be reported.
+ */
+
+extern int conf_prefix(scanner */*sc*/, const char */*p*/);
+
+/* --- @CONF_BEGIN@, @CONF_END@ --- *
+ *
+ * Arguments:  @sc@ = scanner to read from
+ *             @prefix@ = prefix to scan for
+ *             @desc@ = description of what we're parsing
+ *
+ * Use:                Bracket an options parsing routine.  The current token is
+ *             checked to see whether it matches the prefix.  If so, it is
+ *             removed and the following token examined.  If that's a `.'
+ *             then it's removed.  If it's a `{' then the enclosed
+ *             option-parsing code is executed in a loop until a matching
+ *             '}' is found.  If the options parser doesn't accept an
+ *             option, the behaviour is dependent on whether a prefix was
+ *             seen: if so, an error is reported; otherwse a zero return is
+ *             made.
+ */
+
+#define CS_PLAIN 0
+#define CS_PREFIX 1
+#define CS_BRACE 2
+#define CS_UNKNOWN 3
+
+#define CONF_BEGIN(sc, prefix, desc) do {                              \
+  scanner *_conf_sc = (sc);                                            \
+  const char *_conf_desc = (desc);                                     \
+  int _conf_state = CS_PLAIN;                                          \
+                                                                       \
+  /* --- Read the initial prefix --- */                                        \
+                                                                       \
+  if (_conf_sc->t == CTOK_WORD &&                                      \
+      strcmp(_conf_sc->d.buf, (prefix)) == 0) {                                \
+    token(_conf_sc);                                                   \
+    _conf_state = CS_PREFIX;                                           \
+    if (_conf_sc->t == '.')                                            \
+      token(_conf_sc);                                                 \
+    else if (_conf_sc->t == '{') {                                     \
+      token(_conf_sc);                                                 \
+      _conf_state = CS_BRACE;                                          \
+    }                                                                  \
+  }                                                                    \
+                                                                       \
+  /* --- Ensure the next token is a word --- */                                \
+                                                                       \
+  if (_conf_sc->t != CTOK_WORD)                                                \
+    error(_conf_sc, "parse error, expected option keyword");           \
+  do {
+
+#define CONF_END                                                       \
+                                                                       \
+    /* --- Reject an option --- *                                      \
+     *                                                                 \
+     * We could get here as a result of an explicit @CONF_REJECT@ or   \
+     * because the option wasn't accepted.                             \
+     */                                                                        \
+                                                                       \
+    goto _conf_reject;                                                 \
+  _conf_reject:                                                                \
+    if (_conf_state == CS_PLAIN)                                       \
+      _conf_state = CS_UNKNOWN;                                                \
+    else {                                                             \
+      error(_conf_sc, "unknown %s option `%s'",                                \
+           _conf_desc, _conf_sc->d.buf);                               \
+    }                                                                  \
+                                                                       \
+    /* --- Accept an option --- *                                      \
+     *                                                                 \
+     * It's safe to drop through from above.  Either an error will have        \
+     * been reported, or the state is not @CS_BRACE@.                  \
+     */                                                                        \
+                                                                       \
+  _conf_accept:                                                                \
+    if (_conf_state == CS_BRACE && _conf_sc->t == ';')                 \
+      token(_conf_sc);                                                 \
+  } while (_conf_state == CS_BRACE && _conf_sc->t == CTOK_WORD);       \
+                                                                       \
+  /* --- Check for a closing brace --- */                              \
+                                                                       \
+  if (_conf_state == CS_BRACE) {                                       \
+    if (_conf_sc->t == '}')                                            \
+      token(_conf_sc);                                                 \
+    else                                                               \
+      error(_conf_sc, "parse error, expected `}'");                    \
+  }                                                                    \
+                                                                       \
+  /* --- Return an appropriate value --- */                            \
+                                                                       \
+  return (_conf_state != CS_UNKNOWN);                                  \
+} while (0)
+
+/* --- @CONF_ACCEPT@, @CONF_REJECT@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Use:                Within an options parser (between @CONF_BEGIN@ and
+ *             @CONF_END@), accept or reject an option.
+ */
+
+#define CONF_ACCEPT goto _conf_accept
+#define CONF_REJECT goto _conf_reject
+
+/* --- @CONF_QUAL@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Use:                Evaluates to a nonzero value if the current option is
+ *             qualified.  This can be used to decide whether abbreviations
+ *             for options should be accepted.
+ */
+
+#define CONF_QUAL (_conf_state != CS_PLAIN)
+
+/* --- @conf_name@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner
+ *             @char delim@ = delimiter character to look for
+ *             @dstr *d@ = pointer to dynamic string for output
+ *
+ * Returns:    ---
+ *
+ * Use:                Reads in a compound name consisting of words separated by
+ *             delimiters.  Leading and trailing delimiters are permitted,
+ *             although they'll probably cause confusion if used.  The name
+ *             may be enclosed in square brackets if that helps at all.
+ *
+ *             Examples of compound names are filenames (delimited by `/')
+ *             and IP addresses (delimited by `.').
+ */
+
+extern void conf_name(scanner */*sc*/, char /*delim*/, dstr */*d*/);
+
+/*----- Reference-counted file descriptors --------------------------------*/
+
+typedef struct reffd {
+  int fd;
+  unsigned ref;
+  void (*proc)(void */*p*/);
+  void *p;
+} reffd;
+
+/* --- @reffd_init@ --- *
+ *
+ * Arguments:  @int fd@ = file descriptor
+ *
+ * Returns:    Reference-counted file descriptor object.
+ *
+ * Use:                Creates a refcounted file descriptor.
+ */
+
+extern reffd *reffd_init(int /*fd*/);
+
+/* --- @reffd_handler@ --- *
+ *
+ * Arguments:  @reffd *r@ = pointer to reference counted filehandle
+ *             @void (*proc)(void *p)@ = procedure to call
+ *             @void *p@
+ *
+ * Returns:    ---
+ *
+ * Use:                Sets the reference counted file descriptor to call @proc@
+ *             when it is no longer required.
+ */
+
+extern void reffd_handler(reffd */*r*/, void (*/*proc*/)(void */*p*/),
+                         void */*p*/);
+
+/* --- @reffd_inc@ --- *
+ *
+ * Arguments:  @reffd *r@ = pointer to reference counted filehandle
+ *
+ * Returns:    ---
+ *
+ * Use:                Increments the reference count for a file descriptor.
+ */
+
+#define REFFD_INC(r) do { (r)->ref++; } while (0)
+
+extern void reffd_inc(reffd */*r*/);
+
+/* --- @reffd_dec@ --- *
+ *
+ * Arguments:  @reffd *r@ = pointer to reference counted filehandle
+ *
+ * Returns:    ---
+ *
+ * Use:                Decrements the reference count for a file descriptor.
+ */
+
+#define REFFD_DEC(r) do {                                              \
+  reffd *_r = (r);                                                     \
+  _r->ref--;                                                           \
+  if (_r->ref == 0) {                                                  \
+    close(_r->fd);                                                     \
+    if (_r->proc)                                                      \
+      _r->proc(_r->p);                                                 \
+    DESTROY(_r);                                                       \
+  }                                                                    \
+} while (0)
+
+extern void reffd_dec(reffd */*r*/);
+
+/*----- Sources, targets and endpoints ------------------------------------*/
+
+/* --- Basic endpoint structure --- */
+
+typedef struct endpt {
+  struct endpt_ops *ops;               /* Pointer to operations table */
+  struct endpt *other;                 /* Pointer to sibling endpoint */
+  unsigned f;                          /* Various flags */
+  struct tango *t;                     /* Private data structure */
+  reffd *in, *out;                     /* File descriptors */
+} endpt;
+
+/* --- Endpoint flags --- */
+
+#define EPF_PENDING 1u                 /* Endpoint creation in progress */
+#define EPF_FILE 2u                    /* Endpoint smells like a file */
+
+/* --- Endpoint operations table --- */
+
+typedef struct endpt_ops {
+
+  /* --- @attach@ --- *
+   *
+   * Arguments:        @endpt *e@ = pointer to endpoint to be attached
+   *           @reffd *in, *out@ = input and output file descriptors
+   *
+   * Returns:  ---
+   *
+   * Use:      Instructs a non-file endpoint to attach itself to a pair of
+   *           files.
+   */
+
+  void (*attach)(endpt */*e*/, reffd */*in*/, reffd */*out*/);
+
+  /* --- @file@ --- *
+   *
+   * Arguments:        @endpt *e@ = pointer to endpoint in question
+   *           @endpt *f@ = pointer to a file endpoint
+   *
+   * Returns:  ---
+   *
+   * Use:      Informs a non-file endpoint of a file endpoint which will
+   *           want to be closed when it's finished with.  At that time, the
+   *           endpoint should arrange to have both itself and its partner
+   *           closed.  If no file is registered, the endpoint manager will
+   *           close both endpoints itself.
+   */
+
+  void (*file)(endpt */*e*/, endpt */*f*/);
+
+  /* --- @wclose@ --- *
+   *
+   * Arguments:        @endpt *e@ = endpoint to be partially closed
+   *
+   * Returns:  ---
+   *
+   * Use:      Announces that the endpoint will not be written to any more.
+   */
+
+  void (*wclose)(endpt */*e*/);
+
+  /* --- @close@ --- *
+   *
+   * Arguments:        @endpt *e@ = endpoint to be closed
+   *
+   * Returns:  ---
+   *
+   * Use:      Completely closes an endpoint.  The endpoint's data may be
+   *           freed, although some endpoints may wish to delay freeing for
+   *           some reason.
+   */
+
+  void (*close)(endpt */*e*/);
+
+} endpt_ops;
+
+/* --- A basic target object --- */
+
+typedef struct target {
+  struct target_ops *ops;
+  char *desc;
+} target;
+
+/* --- Forwarding target operations --- */
+
+typedef struct target_ops {
+  const char *name;                    /* Name of this target */
+
+  /* --- @option@ --- *
+   *
+   * Arguments:        @target *t@ = pointer to target object, or zero if global
+   *           @scanner *sc@ = scanner to read from
+   *
+   * Returns:  Nonzero to claim the option.
+   *
+   * Use:      Handles an option string from the configuration file.
+   */
+
+  int (*option)(target */*t*/, scanner */*sc*/);
+
+  /* --- @read@ --- *
+   *
+   * Arguments:        @scanner *sc@ = pointer to scanner to read from
+   *
+   * Returns:  Pointer to a target object to claim, null to reject.
+   *
+   * Use:      Parses a target description from the configuration file.
+   *           Only the socket target is allowed to omit the prefix on a
+   *           target specification.
+   */
+
+  target *(*read)(scanner */*sc*/);
+
+  /* --- @confirm@ --- *
+   *
+   * Arguments:        @target *t@ = pointer to target
+   *
+   * Returns:  ---
+   *
+   * Use:      Confirms configuration of a target.
+   */
+
+  void (*confirm)(target */*t*/);
+
+  /* --- @create@ --- *
+   *
+   * Arguments:        @target *t@ = pointer to target
+   *           @const char *desc@ = description of connection
+   *
+   * Returns:  Pointer to a created endpoint.
+   *
+   * Use:      Generates a target endpoint for communication.
+   */
+
+  endpt *(*create)(target */*t*/, const char */*desc*/);
+
+  /* --- @destroy@ --- *
+   *
+   * Arguments:        @target *t@ = pointer to target
+   *
+   * Returns:  ---
+   *
+   * Use:      Destroys a target.
+   */
+
+  void (*destroy)(target */*t*/);
+
+} target_ops;
+
+/* --- A basic source object --- */
+
+typedef struct source {
+  struct source *next, *prev;
+  struct source_ops *ops;
+  char *desc;
+} source;
+
+/* --- Forwarding source operations --- */
+
+typedef struct source_ops {
+  const char *name;                    /* Name of this source */
+
+  /* --- @option@ --- *
+   *
+   * Arguments:        @scanner *sc@ = scanner to read from
+   *           @source *s@ = pointer to source object, or zero if global
+   *
+   * Returns:  Nonzero to claim the option.
+   *
+   * Use:      Handles an option string from the configuration file.
+   */
+
+  int (*option)(source */*s*/, scanner */*sc*/);
+
+  /* --- @read@ --- *
+   *
+   * Arguments:        @scanner *sc@ = pointer to scanner to read from
+   *
+   * Returns:  Pointer to a source object to claim, null to reject.
+   *
+   * Use:      Parses a source description from the configuration file.
+   *           Only the socket source is allowed to omit the prefix on a
+   *           source specification.
+   */
+
+  source *(*read)(scanner */*sc*/);
+
+  /* --- @attach@ --- *
+   *
+   * Arguments:        @source *s@ = pointer to source
+   *           @scanner *sc@ = scanner (for error reporting)
+   *           @target *t@ = pointer to target to attach
+   *
+   * Returns:  ---
+   *
+   * Use:      Attaches a target to a source.
+   */
+
+  void (*attach)(source */*s*/, scanner */*sc*/, target */*t*/);
+
+  /* --- @destroy@ --- *
+   *
+   * Arguments:        @source *s@ = pointer to source
+   *
+   * Returns:  ---
+   *
+   * Use:      Destroys a source.  Used when closing the system down, for
+   *           example as a result of a signal.
+   */
+
+  void (*destroy)(source */*s*/);
+
+} source_ops;
+
+/* --- @endpt_kill@ --- *
+ *
+ * Arguments:  @endpt *a@ = an endpoint
+ *
+ * Returns:    ---
+ *
+ * Use:                Kills an endpoint.  If the endpoint is joined to another, the
+ *             other endpoint is also killed, as is the connection between
+ *             them (and that's the tricky bit).
+ */
+
+extern void endpt_kill(endpt */*a*/);
+
+/* --- @endpt_killall@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Destroys all current endpoint connections.  Used when
+ *             shutting down.
+ */
+
+extern void endpt_killall(void);
+
+/* --- @endpt_join@ --- *
+ *
+ * Arguments:  @endpt *a@ = pointer to first endpoint
+ *             @endpt *b@ = pointer to second endpoint
+ *
+ * Returns:    ---
+ *
+ * Use:                Joins two endpoints together.
+ */
+
+extern void endpt_join(endpt */*a*/, endpt */*b*/);
+
+/* --- @source_add@ --- *
+ *
+ * Arguments:  @source *s@ = pointer to a source
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a source to the master list.  Only do this for passive
+ *             sources (e.g., listening sockets), not active sources (e.g.,
+ *             executable programs).
+ */
+
+extern void source_add(source */*s*/);
+
+/* --- @source_remove@ --- *
+ *
+ * Arguments:  @source *s@ = pointer to a source
+ *
+ * Returns:    ---
+ *
+ * Use:                Removes a source from the master list.
+ */
+
+extern void source_remove(source */*s*/);
+
+/* --- @source_killall@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Frees all sources.
+ */
+
+extern void source_killall(void);
+
+/*----- The exec source and target ----------------------------------------*/
+
+extern source_ops xsource_ops;
+extern target_ops xtarget_ops;
+
+/* --- @exec_init@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes the executable problem source and target.
+ */
+
+extern void exec_init(void);
+
+/*----- The file source and target ----------------------------------------*/
+
+extern source_ops fsource_ops;
+extern target_ops ftarget_ops;
+
+/*----- The socket source and target --------------------------------------*/
+
+extern source_ops ssource_ops;
+extern target_ops starget_ops;
+
+/* --- @starget_connected@ --- *
+ *
+ * Arguments:  @int fd@ = file descriptor now ready for use
+ *             @void *p@ = pointer to an endpoint structure
+ *
+ * Returns:    ---
+ *
+ * Use:                Handles successful connection of the target endpoint.
+ */
+
+extern void starget_connected(int /*fd*/, void */*p*/);
+
+/*----- Handling of file attributes ---------------------------------------*/
+
+/* --- File attribute options structure --- */
+
+typedef struct fattr {
+  unsigned mode;
+  uid_t uid;
+  gid_t gid;
+} fattr;
+
+/* --- Shared global options --- */
+
+extern fattr fattr_global;
+
+/* --- @fattr_init@ --- *
+ *
+ * Arguments:  @fattr *f@ = pointer to file attributes
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a set of file attributes to default values.
+ */
+
+extern void fattr_init(fattr */*f*/);
+
+/* --- @fattr_option@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner to read
+ *             @fattr *f@ = pointer to file attributes to set
+ *
+ * Returns:    Whether the option was clamed.
+ *
+ * Use:                Reads file attributes from a scanner.
+ */
+
+extern int fattr_option(scanner */*sc*/, fattr */*f*/);
+
+/* --- @fattr_apply@ --- *
+ *
+ * Arguments:  @const char *file@ = pointer to filename
+ *             @fattr *f@ = pointer to attribute set
+ *
+ * Returns:    @-1@ if it failed.
+ *
+ * Use:                Applies file attributes to a file.  For best results, try to
+ *             create the file with the right permissions and so on.  This
+ *             call will fix everything up, but there are potential races
+ *             which might catch you out if you're not careful.
+ */
+
+extern int fattr_apply(const char */*file*/, fattr */*f*/);
+
+/*----- Making privileged connections -------------------------------------*/
+
+/* --- @privconn_split@ --- *
+ *
+ * Arguments:  @sel_state *s@ = select state
+ *
+ * Returns:    ---
+ *
+ * Use:                Splits off the privileged binding code into a separate
+ *             process.
+ */
+
+extern void privconn_split(sel_state */*s*/);
+
+/* --- @privconn_adddest@ --- *
+ *
+ * Arguments:  @struct in_addr peer@ = address to connect to
+ *             @unsigned port@ = port to connect to
+ *
+ * Returns:    Index for this destination address, or @-1@ if not
+ *             available.
+ *
+ * Use:                Adds a valid destination for a privileged connection.
+ */
+
+extern int privconn_adddest(struct in_addr /*peer*/, unsigned /*port*/);
+
+/* --- @privconn_connect@ --- *
+ *
+ * Arguments:  @conn *c@ = connection structure to fill in
+ *             @sel_state *s@ = pointer to select state to attach to
+ *             @int i@ = address index to connect to
+ *             @struct in_addr bind@ = address to bind to
+ *             @void (*func)(int, void *)@ = function to call on connect
+ *             @void *p@ = argument for the function
+ *
+ * Returns:    Zero on success, @-1@ on failure.
+ *
+ * Use:                Sets up a privileged connection job.
+ */
+
+extern int privconn_connect(conn */*c*/, sel_state */*s*/,
+                           int /*i*/, struct in_addr /*bind*/,
+                           void (*/*func*/)(int, void *), void */*p*/);
+
+/*----- Identifying remote clients ----------------------------------------*/
+
+typedef struct id_req {
+  struct sockaddr_in lsin;             /* Local address of connection */
+  struct sockaddr_in rsin;             /* Remote address of connection */
+  const char *desc;                    /* Description of connection */
+  const char *act;                     /* Action taken by server */
+  reffd *r;                            /* Pointer to file descriptor */
+} id_req;
+
+/* --- @identify@ --- *
+ *
+ * Arguments:  @const id_req *q@ = pointer to request block
+ *
+ * Returns:    ---
+ *
+ * Use:                Starts a background ident lookup and reverse-resolve job
+ *             which will, eventually, report a message to the system log.
+ */
+
+extern void identify(const id_req */*q*/);
+
+/*----- Host-based access control -----------------------------------------*/
+
+/* --- An access control entry --- */
+
+typedef struct acl_entry {
+  struct acl_entry *next;              /* Next entry in the list */
+  const struct acl_ops *ops;           /* Operations for the ACL entry */
+  unsigned act;                                /* What to do with matching hosts */
+} acl_entry;
+
+#define ACL_DENY 0                     /* Deny access to matching conns */
+#define ACL_ALLOW 1                    /* Allow access to matching conns */
+#define ACL_PERM 1u                    /* Bit mask for permission bit */
+
+/* --- Host-based access control --- */
+
+typedef struct acl_host {
+  acl_entry a;                         /* Base structure */
+  struct in_addr addr, mask;           /* Address and netmask */
+} acl_host;
+
+/* --- ACL methods --- */
+
+typedef struct acl_ops {
+  int (*check)(void */*a*/, struct in_addr /*addr*/, unsigned /*port*/);
+  void (*dump)(void */*a*/, FILE */*fp*/);
+  void (*free)(void */*a*/);
+} acl_ops;
+
+/* --- @acl_check@ --- *
+ *
+ * Arguments:  @acl_entry *a@ = pointer to ACL to check against
+ *             @struct in_addr addr@ = address to check
+ *             @unsigned port@ = port number to check
+ *             @int *act@ = verdict (should initially be @ACT_ALLOW@)
+ *
+ * Returns:    Zero if undecided, nonzero if a rule matched.
+ *
+ * Use:                Checks an address against an ACL.
+ */
+
+extern int acl_check(acl_entry */*a*/,
+                    struct in_addr /*addr*/, unsigned /*port*/,
+                    int */*act*/);
+
+/* --- @acl_dump@ --- *
+ *
+ * Arguments:  @acl_entry *a@ = pointer to ACL to dump
+ *             @FILE *fp@ = pointer to stream to dump on
+ *
+ * Returns:    ---
+ *
+ * Use:                Dumps an access control list to an output stream.
+ */
+
+extern void acl_dump(acl_entry */*a*/, FILE */*fp*/);
+
+/* --- @acl_free@ --- *
+ *
+ * Arguments:  @acl_entry *a@ = pointer to a list of ACLs
+ *
+ * Returns:    ---
+ *
+ * Use:                Frees all of the memory used by an ACL.
+ */
+
+extern void acl_free(acl_entry */*a*/);
+
+/* --- @acl_addhost@ --- *
+ *
+ * Arguments:  @acl_entry ***a@ = address of pointer to list tail
+ *             @unsigned act@ = what to do with matching addresses
+ *             @struct in_addr addr, mask@ = address and mask to match
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a host-authentication entry to the end of an access
+ *             control list.
+ */
+
+extern void acl_addhost(acl_entry ***/*a*/, unsigned /*act*/,
+                       struct in_addr /*addr*/, struct in_addr /*mask*/);
+
+/* --- @acl_addpriv@ --- *
+ *
+ * Arguments:  @acl_entry ***a@ = address of pointer to list tail
+ *             @unsigned act@ = what to do with matching addresses
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a privileged-port check to the end of an access control
+ *             list.
+ */
+
+extern void acl_addpriv(acl_entry ***/*a*/, unsigned /*act*/);
+
+/*----- Network addresses -------------------------------------------------*/
+
+/* --- A generic socket address --- *
+ *
+ * Not all systems understand @sa_len@ fields.  (In particular, Linux
+ * doesn't.)  Some fairly ugly hacking is then performed on particular
+ * address types.
+ */
+
+typedef struct addr {
+  struct addr_ops *ops;
+  size_t sz;
+} addr;
+
+#define ADDRSZ(sz) (sizeof(addr) + (sz))
+
+/* --- Address configuration --- *
+ *
+ * An address family will want to extend this.
+ */
+
+typedef struct addr_opts {
+  unsigned f;
+} addr_opts;
+
+#define ADDRF_NOLOG 1u
+
+/* --- Address types --- *
+ *
+ * For things like Internet addresses, source and destinations look
+ * different.
+ */
+
+enum {
+  ADDR_SRC,
+  ADDR_DEST,
+  ADDR_GLOBAL
+};
+
+/* --- Description of an address type handler --- */
+
+typedef struct addr_ops {
+  const char *name;                    /* Protocol's internal name */
+
+  /* --- @read@ --- *
+   *
+   * Arguments:        @scanner *sc@ = pointer to scanner to read from
+   *           @unsigned type@ = type of address to be read
+   *
+   * Returns:  A filled-in socket address.
+   *
+   * Use:      Parses a textual representation of a socket address.
+   */
+
+  addr *(*read)(scanner */*sc*/, unsigned /*type*/);
+
+  /* --- @destroy@ --- *
+   *
+   * Arguments:        @addr *a@ = pointer to an address block
+   *
+   * Returns:  ---
+   *
+   * Use:      Disposes of an address block in some suitable fashion.
+   */
+
+  void (*destroy)(addr */*a*/);
+
+  /* --- @print@ --- *
+   *
+   * Arguments:        @addr *a@ = pointer to socket address to read
+   *           @unsigned type@ = type of address to be written
+   *           @dstr *d@ = string on which to write the description
+   *
+   * Returns:  ---
+   *
+   * Use:      Writes a textual representation of a socket address to
+   *           a string.
+   */
+
+  void (*print)(addr */*a*/, unsigned /*type*/, dstr */*d*/);
+
+  /* --- @initsrcopts@ --- *
+   *
+   * Arguments:        ---
+   *
+   * Returns:  A pointer to a protocol-specific data block for a listener
+   *
+   * Use:      Creates a data block for a listener.  This is attached to the
+   *           listener data structure.  Options can then be requested, and
+   *           are added to the block when necessary.
+   */
+
+  addr_opts *(*initsrcopts)(void);
+
+  /* --- @option@ --- *
+   *
+   * Arguments:        @scanner *sc@ = pointer to a scanner to read from
+   *           @unsigned type@ = kind of option this is
+   *           @addr_opts *ao@ = data block to modify (from @init@), or null
+   *
+   * Returns:  Nonzero to claim the option.
+   *
+   * Use:      Parses a source option, either global or listener-specific.
+   */
+
+  int (*option)(scanner */*sc*/, addr_opts */*ao*/, unsigned /*type*/);
+
+  /* --- @confirm@ --- *
+   *
+   * Arguments:        @addr *a@ = pointer to an address structure
+   *           @unsigned type@ = kind of address this is
+   *           @addr_opts *ao@ = address options
+   *
+   * Returns:  ---
+   *
+   * Use:      Called during initialization when an address is fully
+   *           configured.
+   */
+
+  void (*confirm)(addr */*a*/, unsigned /*type*/, addr_opts */*ao*/);
+
+  /* --- @freesrcopts@ --- *
+   *
+   * Arguments:        @addr_opts *ao@ = data block to remove
+   *
+   * Returns:  ---
+   *
+   * Use:      Throws away all the configuration data for an address type.
+   */
+
+  void (*freesrcopts)(addr_opts */*ao*/);
+
+  /* --- @bind@ --- *
+   *
+   * Arguments:        @addr *a@ = the address to bind to
+   *           @addr_opts *ao@ = the address options
+   *
+   * Returns:  File descriptor of bound socket if OK, or @-1@ on error.
+   *
+   * Use:      Binds a listening socket.  The tedious stuff with @listen@
+   *           isn't necessary.
+   */
+
+  int (*bind)(addr */*a*/, addr_opts */*ao*/);
+
+  /* --- @unbind@ --- *
+   *
+   * Arguments:        @addr *a@ = pointer to an address
+   *
+   * Returns:  ---
+   *
+   * Use:      Unbinds an address.  This is used when tidying up.  The main
+   *           purpose is to let the Unix-domain handler remove its socket
+   *           node from the filesystem.
+   */
+
+  void (*unbind)(addr */*a*/);
+
+  /* --- @accept@ --- *
+   *
+   * Arguments:        @int fd@ = listening file descriptor
+   *           @addr_opts *ao@ = data block to get configuration from
+   *           @const char *desc@ = description of the listener
+   *
+   * Returns:  Pointer to a reference counted file descriptor.
+   *
+   * Use:      Accepts, verifies and logs an incoming connection.
+   */
+
+  reffd *(*accept)(int /*fd*/, addr_opts */*ao*/, const char */*desc*/);
+
+  /* --- @inittargopts@ --- *
+   *
+   * Arguments:        ---
+   *
+   * Returns:  A pointer to a protocol-specific data block for a connecter
+   *
+   * Use:      Creates a data block for a target.  This is attached to the
+   *           target data structure.  Options can then be requested, and
+   *           are added to the block when necessary.
+   */
+
+  addr_opts *(*inittargopts)(void);
+
+  /* --- @freetargopts@ --- *
+   *
+   * Arguments:        @addr_opts *ao@ = data block to remove
+   *
+   * Returns:  ---
+   *
+   * Use:      Throws away all the configuration data for an address type.
+   */
+
+  void (*freetargopts)(addr_opts */*ao*/);
+
+  /* --- @connect@ --- *
+   *
+   * Arguments:        @addr *a@ = destination address
+   *           @addr_opts *ao@ = target address options
+   *           @conn *c@ = connection structure
+   *           @endpt *e@ = endpoint structure
+   *
+   * Returns:  Zero if OK, @-1@ on some error.
+   *
+   * Use:      Requests that a connection be made, or at least set in
+   *           motion.  An address may do one of these things:
+   *
+   *             * Return @-1@.
+   *
+   *             * Call @starget_connected@ with @-1@ or a connected file
+   *               descriptor and the pointer @e@.
+   *
+   *             * Call @conn_init@ or @conn_fd@, giving @starget_connected@
+   *               and @e@ as the function to call.
+   */
+
+  int (*connect)(addr */*a*/, addr_opts */*ao*/, conn */*c*/, endpt */*e*/);
+
+} addr_ops;
+
+/* --- Address types --- */
+
+extern addr_ops un_ops;
+extern addr_ops inet_ops;
+
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus
index 281c974..aef45f4 100644 (file)
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <syslog.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <mLib/alloc.h>
-#include <mLib/bres.h>
-#include <mLib/conn.h>
-#include <mLib/dstr.h>
-#include <mLib/ident.h>
-#include <mLib/report.h>
-#include <mLib/sel.h>
-#include <mLib/selbuf.h>
-#include <mLib/str.h>
-
 #include "fw.h"
 #include "fw.h"
-#include "identify.h"
 
 /*----- Magic numbers -----------------------------------------------------*/
 
 
 /*----- Magic numbers -----------------------------------------------------*/
 
diff --git a/identify.h b/identify.h
deleted file mode 100644 (file)
index 66dc1c7..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*-c-*-
- *
- * Identifies and logs the client of a connection
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef IDENTIFY_H
-#define IDENTIFY_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#ifndef REFFD_H
-#  include "reffd.h"
-#endif
-
-/*----- Data structures ---------------------------------------------------*/
-
-typedef struct id_req {
-  struct sockaddr_in lsin;             /* Local address of connection */
-  struct sockaddr_in rsin;             /* Remote address of connection */
-  const char *desc;                    /* Description of connection */
-  const char *act;                     /* Action taken by server */
-  reffd *r;                            /* Pointer to file descriptor */
-} id_req;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @identify@ --- *
- *
- * Arguments:  @const id_req *q@ = pointer to request block
- *
- * Returns:    ---
- *
- * Use:                Starts a background ident lookup and reverse-resolve job
- *             which will, eventually, report a message to the system log.
- */
-
-extern void identify(const id_req */*q*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/inet.c b/inet.c
index cd66719..5b83a05 100644 (file)
--- a/inet.c
+++ b/inet.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <mLib/alloc.h>
-#include <mLib/dstr.h>
-#include <mLib/fdflags.h>
-#include <mLib/report.h>
-#include <mLib/sub.h>
-
-#include "acl.h"
-#include "addr.h"
-#include "conf.h"
 #include "fw.h"
 #include "fw.h"
-#include "identify.h"
-#include "inet.h"
-#include "privconn.h"
-#include "reffd.h"
-#include "scan.h"
-#include "socket.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/inet.h b/inet.h
deleted file mode 100644 (file)
index 2804bde..0000000
--- a/inet.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*-c-*-
- *
- * Protocol specific definitions for IPv4 sockets
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef INET_H
-#define INET_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#ifndef ADDR_H
-#  include "addr.h"
-#endif
-
-/*----- Protocol definition -----------------------------------------------*/
-
-extern addr_ops inet_ops;
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
index d5088d4..2c05b65 100755 (executable)
@@ -133,7 +133,7 @@ if ($mode eq 'c') {
  * Generated grammar and options summary
  */
 
  * Generated grammar and options summary
  */
 
-#include "mantext.h"
+#include "fw.h"
 
 EOF
   for $head (keys %ch) {
 
 EOF
   for $head (keys %ch) {
diff --git a/mantext.h b/mantext.h
deleted file mode 100644 (file)
index ccd0ae7..0000000
--- a/mantext.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*-c-*-
- *
- * Grammar declarations
- *
- * (c) 2006 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef MANTEXT_H
-#define MANTEXT_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Data provided -----------------------------------------------------*/
-
-extern const char grammar_text[];
-extern const char option_text[];
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
index bb282d0..4bb243a 100644 (file)
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include <assert.h>
-#include <errno.h>
-#include <signal.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#include <mLib/conn.h>
-#include <mLib/darray.h>
-#include <mLib/fdflags.h>
-#include <mLib/fdpass.h>
-#include <mLib/report.h>
-#include <mLib/sel.h>
-
-#include "privconn.h"
+#include "fw.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/privconn.h b/privconn.h
deleted file mode 100644 (file)
index 78e0ba4..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*-c-*-
- *
- * Making privileged connections
- *
- * (c) 2003 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef PRIVCONN_H
-#define PRIVCONN_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <arpa/inet.h>
-
-#include <mLib/conn.h>
-#include <mLib/sel.h>
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @privconn_split@ --- *
- *
- * Arguments:  @sel_state *s@ = select state
- *
- * Returns:    ---
- *
- * Use:                Splits off the privileged binding code into a separate
- *             process.
- */
-
-extern void privconn_split(sel_state */*s*/);
-
-/* --- @privconn_adddest@ --- *
- *
- * Arguments:  @struct in_addr peer@ = address to connect to
- *             @unsigned port@ = port to connect to
- *
- * Returns:    Index for this destination address, or @-1@ if not
- *             available.
- *
- * Use:                Adds a valid destination for a privileged connection.
- */
-
-extern int privconn_adddest(struct in_addr /*peer*/, unsigned /*port*/);
-
-/* --- @privconn_connect@ --- *
- *
- * Arguments:  @conn *c@ = connection structure to fill in
- *             @sel_state *s@ = pointer to select state to attach to
- *             @int i@ = address index to connect to
- *             @struct in_addr bind@ = address to bind to
- *             @void (*func)(int, void *)@ = function to call on connect
- *             @void *p@ = argument for the function
- *
- * Returns:    Zero on success, @-1@ on failure.
- *
- * Use:                Sets up a privileged connection job.
- */
-
-extern int privconn_connect(conn */*c*/, sel_state */*s*/,
-                           int /*i*/, struct in_addr /*bind*/,
-                           void (*/*func*/)(int, void *), void */*p*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/reffd.c b/reffd.c
index 44d7e39..80afb7d 100644 (file)
--- a/reffd.c
+++ b/reffd.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <mLib/sub.h>
-
-#include "reffd.h"
+#include "fw.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
 
 /*----- Main code ---------------------------------------------------------*/
 
diff --git a/reffd.h b/reffd.h
deleted file mode 100644 (file)
index 5e03f1b..0000000
--- a/reffd.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*-c-*-
- *
- * Reference counted file descriptors
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef REFFD_H
-#define REFFD_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <unistd.h>
-
-#include <mLib/sub.h>
-
-/*----- Data structures ---------------------------------------------------*/
-
-typedef struct reffd {
-  int fd;
-  unsigned ref;
-  void (*proc)(void */*p*/);
-  void *p;
-} reffd;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @reffd_init@ --- *
- *
- * Arguments:  @int fd@ = file descriptor
- *
- * Returns:    Reference-counted file descriptor object.
- *
- * Use:                Creates a refcounted file descriptor.
- */
-
-extern reffd *reffd_init(int /*fd*/);
-
-/* --- @reffd_handler@ --- *
- *
- * Arguments:  @reffd *r@ = pointer to reference counted filehandle
- *             @void (*proc)(void *p)@ = procedure to call
- *             @void *p@
- *
- * Returns:    ---
- *
- * Use:                Sets the reference counted file descriptor to call @proc@
- *             when it is no longer required.
- */
-
-extern void reffd_handler(reffd */*r*/, void (*/*proc*/)(void */*p*/),
-                         void */*p*/);
-
-/* --- @reffd_inc@ --- *
- *
- * Arguments:  @reffd *r@ = pointer to reference counted filehandle
- *
- * Returns:    ---
- *
- * Use:                Increments the reference count for a file descriptor.
- */
-
-#define REFFD_INC(r) do { (r)->ref++; } while (0)
-
-extern void reffd_inc(reffd */*r*/);
-
-/* --- @reffd_dec@ --- *
- *
- * Arguments:  @reffd *r@ = pointer to reference counted filehandle
- *
- * Returns:    ---
- *
- * Use:                Decrements the reference count for a file descriptor.
- */
-
-#define REFFD_DEC(r) do {                                              \
-  reffd *_r = (r);                                                     \
-  _r->ref--;                                                           \
-  if (_r->ref == 0) {                                                  \
-    close(_r->fd);                                                     \
-    if (_r->proc)                                                      \
-      _r->proc(_r->p);                                                 \
-    DESTROY(_r);                                                       \
-  }                                                                    \
-} while (0)
-
-extern void reffd_dec(reffd */*r*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
index d983fd7..23e6ecd 100644 (file)
--- a/rlimits.h
+++ b/rlimits.h
 #  define RLIMIT_NOFILE RLIMIT_OFILE
 #endif
 
 #  define RLIMIT_NOFILE RLIMIT_OFILE
 #endif
 
+#ifdef RLIMIT_AS
+  R(RLIMIT_AS, as)
+#endif
+#ifdef RLIMIT_CORE
+  R(RLIMIT_CORE, core)
+#endif
 #ifdef RLIMIT_CPU
   R(RLIMIT_CPU, cpu)
 #endif
 #ifdef RLIMIT_CPU
   R(RLIMIT_CPU, cpu)
 #endif
+#ifdef RLIMIT_DATA
+  R(RLIMIT_DATA, data)
+#endif
 #ifdef RLIMIT_FSIZE
   R(RLIMIT_FSIZE, fsize)
 #endif
 #ifdef RLIMIT_FSIZE
   R(RLIMIT_FSIZE, fsize)
 #endif
-#ifdef RLIMIT_DATA
-  R(RLIMIT_DATA, data)
+#ifdef RLIMIT_LOCKS
+  R(RLIMIT_LOCKS, locks)
 #endif
 #endif
-#ifdef RLIMIT_STACK
-  R(RLIMIT_STACK, stack)
+#ifdef RLIMIT_MEMLOCK
+  R(RLIMIT_MEMLOCK, memlock)
 #endif
 #endif
-#ifdef RLIMIT_CORE
-  R(RLIMIT_CORE, core)
+#ifdef RLIMIT_MSGQUEUE
+  R(RLIMIT_MSGQUEUE, msgqueue)
 #endif
 #endif
-#ifdef RLIMIT_RSS
-  R(RLIMIT_RSS, rss)
+#ifdef RLIMIT_NICE
+  R(RLIMIT_NICE, nice)
+#endif
+#ifdef RLIMIT_NOFILE
+  R(RLIMIT_NOFILE, nofile)
 #endif
 #ifdef RLIMIT_NPROC
   R(RLIMIT_NPROC, nproc)
 #endif
 #endif
 #ifdef RLIMIT_NPROC
   R(RLIMIT_NPROC, nproc)
 #endif
-#ifdef RLIMIT_NOFILE
-  R(RLIMIT_NOFILE, nofile)
+#ifdef RLIMIT_RSS
+  R(RLIMIT_RSS, rss)
 #endif
 #endif
-#ifdef RLIMIT_MEMLOCK
-  R(RLIMIT_MEMLOCK, memlock)
+#ifdef RLIMIT_RTPRIO
+  R(RLIMIT_RTPRIO, rtprio)
+#endif
+#ifdef RLIMIT_SIGPENDING
+  R(RLIMIT_SIGPENDING, sigpending)
+#endif
+#ifdef RLIMIT_STACK
+  R(RLIMIT_STACK, stack)
 #endif
 #ifdef RLIMIT_VMEM
   R(RLIMIT_VMEM, vmem)
 #endif
 #endif
 #ifdef RLIMIT_VMEM
   R(RLIMIT_VMEM, vmem)
 #endif
-#ifdef RLIMIT_AS
-  R(RLIMIT_AS, as)
-#endif
 
 #undef R
 
 
 #undef R
 
diff --git a/scan.c b/scan.c
index 0f0f81c..450f2f4 100644 (file)
--- a/scan.c
+++ b/scan.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <mLib/dstr.h>
-#include <mLib/sub.h>
-
-#include "scan.h"
+#include "fw.h"
 
 /*----- File scanner source -----------------------------------------------*/
 
 
 /*----- File scanner source -----------------------------------------------*/
 
index 5a7dbfa..53ac666 100644 (file)
--- a/socket.c
+++ b/socket.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <mLib/alloc.h>
-#include <mLib/conn.h>
-#include <mLib/dstr.h>
-#include <mLib/fdflags.h>
-#include <mLib/sel.h>
-#include <mLib/sub.h>
-
-#include "addr.h"
-#include "conf.h"
-#include "endpt.h"
 #include "fw.h"
 #include "fw.h"
-#include "scan.h"
-#include "socket.h"
-#include "target.h"
-
-#include "inet.h"
-#include "un.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/socket.h b/socket.h
deleted file mode 100644 (file)
index 4726abf..0000000
--- a/socket.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*-c-*-
- *
- * Socket source and target definitions
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef SOCKET_H
-#define SOCKET_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#ifndef SOURCE_H
-#  include "source.h"
-#endif
-
-#ifndef TARGET_H
-#  include "target.h"
-#endif
-
-/*----- Sources and targets -----------------------------------------------*/
-
-extern source_ops ssource_ops;
-extern target_ops starget_ops;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @starget_connected@ --- *
- *
- * Arguments:  @int fd@ = file descriptor now ready for use
- *             @void *p@ = pointer to an endpoint structure
- *
- * Returns:    ---
- *
- * Use:                Handles successful connection of the target endpoint.
- */
-
-extern void starget_connected(int /*fd*/, void */*p*/);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
index 5256e87..db18c56 100644 (file)
--- a/source.c
+++ b/source.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "source.h"
+#include "fw.h"
 
 /*----- Static variables --------------------------------------------------*/
 
 
 /*----- Static variables --------------------------------------------------*/
 
diff --git a/source.h b/source.h
deleted file mode 100644 (file)
index 4ec5d65..0000000
--- a/source.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/* -*-c-*-
- *
- * Description of forwarding sources
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef SOURCE_H
-#define SOURCE_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <stdio.h>
-
-#ifndef SCAN_H
-#  include "scan.h"
-#endif
-
-#ifndef TARGET_H
-#  include "target.h"
-#endif
-
-/*----- Data structures ---------------------------------------------------*/
-
-/* --- A basic source object --- */
-
-typedef struct source {
-  struct source *next, *prev;
-  struct source_ops *ops;
-  char *desc;
-} source;
-
-/* --- Forwarding source operations --- */
-
-typedef struct source_ops {
-  const char *name;                    /* Name of this source */
-
-  /* --- @option@ --- *
-   *
-   * Arguments:        @scanner *sc@ = scanner to read from
-   *           @source *s@ = pointer to source object, or zero if global
-   *
-   * Returns:  Nonzero to claim the option.
-   *
-   * Use:      Handles an option string from the configuration file.
-   */
-
-  int (*option)(source */*s*/, scanner */*sc*/);
-
-  /* --- @read@ --- *
-   *
-   * Arguments:        @scanner *sc@ = pointer to scanner to read from
-   *
-   * Returns:  Pointer to a source object to claim, null to reject.
-   *
-   * Use:      Parses a source description from the configuration file.
-   *           Only the socket source is allowed to omit the prefix on a
-   *           source specification.
-   */
-
-  source *(*read)(scanner */*sc*/);
-
-  /* --- @attach@ --- *
-   *
-   * Arguments:        @source *s@ = pointer to source
-   *           @scanner *sc@ = scanner (for error reporting)
-   *           @target *t@ = pointer to target to attach
-   *
-   * Returns:  ---
-   *
-   * Use:      Attaches a target to a source.
-   */
-
-  void (*attach)(source */*s*/, scanner */*sc*/, target */*t*/);
-
-  /* --- @destroy@ --- *
-   *
-   * Arguments:        @source *s@ = pointer to source
-   *
-   * Returns:  ---
-   *
-   * Use:      Destroys a source.  Used when closing the system down, for
-   *           example as a result of a signal.
-   */
-
-  void (*destroy)(source */*s*/);
-
-} source_ops;
-
-/*----- Functions provided ------------------------------------------------*/
-
-/* --- @source_add@ --- *
- *
- * Arguments:  @source *s@ = pointer to a source
- *
- * Returns:    ---
- *
- * Use:                Adds a source to the master list.  Only do this for passive
- *             sources (e.g., listening sockets), not active sources (e.g.,
- *             executable programs).
- */
-
-extern void source_add(source */*s*/);
-
-/* --- @source_remove@ --- *
- *
- * Arguments:  @source *s@ = pointer to a source
- *
- * Returns:    ---
- *
- * Use:                Removes a source from the master list.
- */
-
-extern void source_remove(source */*s*/);
-
-/* --- @source_killall@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Frees all sources.
- */
-
-extern void source_killall(void);
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/target.h b/target.h
deleted file mode 100644 (file)
index 1f65688..0000000
--- a/target.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*-c-*-
- *
- * Description of forwarding targets
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef TARGET_H
-#define TARGET_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#include <stdio.h>
-
-#ifndef ENDPT_H
-#  include "endpt.h"
-#endif
-
-#ifndef SCAN_H
-#  include "scan.h"
-#endif
-
-/*----- Data structures ---------------------------------------------------*/
-
-/* --- A basic target object --- */
-
-typedef struct target {
-  struct target_ops *ops;
-  char *desc;
-} target;
-
-/* --- Forwarding target operations --- */
-
-typedef struct target_ops {
-  const char *name;                    /* Name of this target */
-
-  /* --- @option@ --- *
-   *
-   * Arguments:        @target *t@ = pointer to target object, or zero if global
-   *           @scanner *sc@ = scanner to read from
-   *
-   * Returns:  Nonzero to claim the option.
-   *
-   * Use:      Handles an option string from the configuration file.
-   */
-
-  int (*option)(target */*t*/, scanner */*sc*/);
-
-  /* --- @read@ --- *
-   *
-   * Arguments:        @scanner *sc@ = pointer to scanner to read from
-   *
-   * Returns:  Pointer to a target object to claim, null to reject.
-   *
-   * Use:      Parses a target description from the configuration file.
-   *           Only the socket target is allowed to omit the prefix on a
-   *           target specification.
-   */
-
-  target *(*read)(scanner */*sc*/);
-
-  /* --- @confirm@ --- *
-   *
-   * Arguments:        @target *t@ = pointer to target
-   *
-   * Returns:  ---
-   *
-   * Use:      Confirms configuration of a target.
-   */
-
-  void (*confirm)(target */*t*/);
-
-  /* --- @create@ --- *
-   *
-   * Arguments:        @target *t@ = pointer to target
-   *           @const char *desc@ = description of connection
-   *
-   * Returns:  Pointer to a created endpoint.
-   *
-   * Use:      Generates a target endpoint for communication.
-   */
-
-  endpt *(*create)(target */*t*/, const char */*desc*/);
-
-  /* --- @destroy@ --- *
-   *
-   * Arguments:        @target *t@ = pointer to target
-   *
-   * Returns:  ---
-   *
-   * Use:      Destroys a target.
-   */
-
-  void (*destroy)(target */*t*/);
-
-} target_ops;
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif
diff --git a/un.c b/un.c
index 223dfc0..60d1cc4 100644 (file)
--- a/un.c
+++ b/un.c
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Header files ------------------------------------------------------*/
-
-#include "config.h"
-#undef sun /* Cretins */
-
-#include <errno.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <mLib/alloc.h>
-#include <mLib/dstr.h>
-#include <mLib/report.h>
-#include <mLib/sub.h>
-
-#include "addr.h"
-#include "conf.h"
-#include "fattr.h"
 #include "fw.h"
 #include "fw.h"
-#include "reffd.h"
-#include "scan.h"
-#include "socket.h"
-#include "un.h"
 
 /*----- Data structures ---------------------------------------------------*/
 
 
 /*----- Data structures ---------------------------------------------------*/
 
diff --git a/un.h b/un.h
deleted file mode 100644 (file)
index f83cca5..0000000
--- a/un.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*-c-*-
- *
- * Protocol specific definitions for Unix-domain sockets
- *
- * (c) 1999 Straylight/Edgeware
- */
-
-/*----- Licensing notice --------------------------------------------------*
- *
- * This file is part of the `fw' port forwarder.
- *
- * `fw' is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * `fw' is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with `fw'; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef UN_H
-#define UN_H
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-/*----- Header files ------------------------------------------------------*/
-
-#ifndef ADDR_H
-#  include "addr.h"
-#endif
-
-/*----- Protocol defintions -----------------------------------------------*/
-
-extern addr_ops un_ops;
-
-/*----- That's all, folks -------------------------------------------------*/
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif