aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorPedro F. Giffuni <pfg@FreeBSD.org>2015-01-28 22:55:06 +0000
committerPedro F. Giffuni <pfg@FreeBSD.org>2015-01-28 22:55:06 +0000
commite925d4a747df4a349c2baac436a71f606945baa5 (patch)
treee3a2ccc21623f0453c6f43f9016535205ba10d21 /contrib
parent509fcedcfec077a6070002f4059db0ae675be869 (diff)
downloadsrc-e925d4a747df4a349c2baac436a71f606945baa5.tar.gz
src-e925d4a747df4a349c2baac436a71f606945baa5.zip
amd: flatten the tree
Notes
Notes: svn path=/vendor/amd/dist/; revision=277863
Diffstat (limited to 'contrib')
-rw-r--r--contrib/amd/AUTHORS430
-rw-r--r--contrib/amd/BUGS303
-rw-r--r--contrib/amd/COPYING37
-rw-r--r--contrib/amd/ChangeLog12025
-rw-r--r--contrib/amd/FAQ69
-rw-r--r--contrib/amd/INSTALL124
-rw-r--r--contrib/amd/MIRRORS.html106
-rw-r--r--contrib/amd/MIRRORS.txt60
-rw-r--r--contrib/amd/NEWS1489
-rw-r--r--contrib/amd/README104
-rw-r--r--contrib/amd/README.attrcache129
-rw-r--r--contrib/amd/README.ldap57
-rw-r--r--contrib/amd/README.y2k27
-rw-r--r--contrib/amd/TODO177
-rw-r--r--contrib/amd/amd/am_ops.c475
-rw-r--r--contrib/amd/amd/amd.8371
-rw-r--r--contrib/amd/amd/amd.c577
-rw-r--r--contrib/amd/amd/amd.h867
-rw-r--r--contrib/amd/amd/amfs_auto.c176
-rw-r--r--contrib/amd/amd/amfs_direct.c110
-rw-r--r--contrib/amd/amd/amfs_error.c151
-rw-r--r--contrib/amd/amd/amfs_generic.c1262
-rw-r--r--contrib/amd/amd/amfs_host.c709
-rw-r--r--contrib/amd/amd/amfs_link.c133
-rw-r--r--contrib/amd/amd/amfs_linkx.c113
-rw-r--r--contrib/amd/amd/amfs_nfsl.c238
-rw-r--r--contrib/amd/amd/amfs_nfsx.c512
-rw-r--r--contrib/amd/amd/amfs_program.c205
-rw-r--r--contrib/amd/amd/amfs_root.c99
-rw-r--r--contrib/amd/amd/amfs_toplvl.c318
-rw-r--r--contrib/amd/amd/amfs_union.c132
-rw-r--r--contrib/amd/amd/amq_subr.c479
-rw-r--r--contrib/amd/amd/amq_svc.c229
-rw-r--r--contrib/amd/amd/autil.c783
-rw-r--r--contrib/amd/amd/clock.c244
-rw-r--r--contrib/amd/amd/conf.c1406
-rw-r--r--contrib/amd/amd/conf_parse.y158
-rw-r--r--contrib/amd/amd/conf_tok.l192
-rw-r--r--contrib/amd/amd/get_args.c437
-rw-r--r--contrib/amd/amd/info_exec.c423
-rw-r--r--contrib/amd/amd/info_file.c253
-rw-r--r--contrib/amd/amd/info_hesiod.c190
-rw-r--r--contrib/amd/amd/info_ldap.c573
-rw-r--r--contrib/amd/amd/info_ndbm.c140
-rw-r--r--contrib/amd/amd/info_nis.c441
-rw-r--r--contrib/amd/amd/info_nisplus.c307
-rw-r--r--contrib/amd/amd/info_passwd.c192
-rw-r--r--contrib/amd/amd/info_union.c147
-rw-r--r--contrib/amd/amd/map.c1072
-rw-r--r--contrib/amd/amd/mapc.c1192
-rw-r--r--contrib/amd/amd/mntfs.c366
-rw-r--r--contrib/amd/amd/nfs_prot_svc.c301
-rw-r--r--contrib/amd/amd/nfs_start.c453
-rw-r--r--contrib/amd/amd/nfs_subr.c828
-rw-r--r--contrib/amd/amd/ops_TEMPLATE.c305
-rw-r--r--contrib/amd/amd/ops_autofs.c1279
-rw-r--r--contrib/amd/amd/ops_cachefs.c260
-rw-r--r--contrib/amd/amd/ops_cdfs.c228
-rw-r--r--contrib/amd/amd/ops_efs.c172
-rw-r--r--contrib/amd/amd/ops_lofs.c159
-rw-r--r--contrib/amd/amd/ops_mfs.c54
-rw-r--r--contrib/amd/amd/ops_nfs.c1042
-rw-r--r--contrib/amd/amd/ops_nfs3.c54
-rw-r--r--contrib/amd/amd/ops_nullfs.c54
-rw-r--r--contrib/amd/amd/ops_pcfs.c226
-rw-r--r--contrib/amd/amd/ops_tfs.c54
-rw-r--r--contrib/amd/amd/ops_tmpfs.c54
-rw-r--r--contrib/amd/amd/ops_ufs.c180
-rw-r--r--contrib/amd/amd/ops_umapfs.c54
-rw-r--r--contrib/amd/amd/ops_unionfs.c54
-rw-r--r--contrib/amd/amd/ops_xfs.c171
-rw-r--r--contrib/amd/amd/opts.c1519
-rw-r--r--contrib/amd/amd/readdir.c498
-rw-r--r--contrib/amd/amd/restart.c288
-rw-r--r--contrib/amd/amd/rpc_fwd.c478
-rw-r--r--contrib/amd/amd/sched.c304
-rw-r--r--contrib/amd/amd/srvr_amfs_auto.c210
-rw-r--r--contrib/amd/amd/srvr_nfs.c1042
-rw-r--r--contrib/amd/amq/amq.8262
-rw-r--r--contrib/amd/amq/amq.c692
-rw-r--r--contrib/amd/amq/amq.h63
-rw-r--r--contrib/amd/amq/amq_clnt.c223
-rw-r--r--contrib/amd/amq/amq_xdr.c267
-rw-r--r--contrib/amd/amq/pawd.190
-rw-r--r--contrib/amd/amq/pawd.c261
-rw-r--r--contrib/amd/aux_conf.h.in58
-rwxr-xr-xcontrib/amd/bootstrap108
-rw-r--r--contrib/amd/conf/checkmount/checkmount_bsd44.c77
-rw-r--r--contrib/amd/conf/fh_dref/fh_dref_freebsd22.h2
-rw-r--r--contrib/amd/conf/hn_dref/hn_dref_default.h2
-rw-r--r--contrib/amd/conf/mount/mount_default.c46
-rw-r--r--contrib/amd/conf/mount/mount_freebsd3.c68
-rw-r--r--contrib/amd/conf/mtab/mtab_bsd.c144
-rw-r--r--contrib/amd/conf/nfs_prot/nfs_prot_aix5_1.h315
-rw-r--r--contrib/amd/conf/nfs_prot/nfs_prot_darwin.h259
-rw-r--r--contrib/amd/conf/nfs_prot/nfs_prot_freebsd2.h145
-rw-r--r--contrib/amd/conf/nfs_prot/nfs_prot_freebsd3.h188
-rw-r--r--contrib/amd/conf/nfs_prot/nfs_prot_osf5.h431
-rw-r--r--contrib/amd/conf/nfs_prot/nfs_prot_sunos5_8.h388
-rw-r--r--contrib/amd/conf/sa_dref/sa_dref_bsd44.h6
-rw-r--r--contrib/amd/conf/transp/transp_sockets.c540
-rw-r--r--contrib/amd/conf/trap/trap_default.h2
-rw-r--r--contrib/amd/conf/trap/trap_freebsd3.h3
-rw-r--r--contrib/amd/conf/umount/umount_bsd44.c120
-rw-r--r--contrib/amd/cvs-server.txt43
-rw-r--r--contrib/amd/doc/am-utils.texi8686
-rw-r--r--contrib/amd/doc/stamp-vti4
-rw-r--r--contrib/amd/doc/texinfo.tex7014
-rw-r--r--contrib/amd/doc/version.texi4
-rw-r--r--contrib/amd/fixmount/fixmount.8177
-rw-r--r--contrib/amd/fixmount/fixmount.c603
-rw-r--r--contrib/amd/fsinfo/fsi_analyze.c672
-rw-r--r--contrib/amd/fsinfo/fsi_data.h238
-rw-r--r--contrib/amd/fsinfo/fsi_dict.c137
-rw-r--r--contrib/amd/fsinfo/fsi_gram.y418
-rw-r--r--contrib/amd/fsinfo/fsi_lex.l274
-rw-r--r--contrib/amd/fsinfo/fsi_util.c681
-rw-r--r--contrib/amd/fsinfo/fsinfo.8121
-rw-r--r--contrib/amd/fsinfo/fsinfo.c291
-rw-r--r--contrib/amd/fsinfo/fsinfo.h136
-rw-r--r--contrib/amd/fsinfo/wr_atab.c334
-rw-r--r--contrib/amd/fsinfo/wr_bparam.c108
-rw-r--r--contrib/amd/fsinfo/wr_dumpset.c95
-rw-r--r--contrib/amd/fsinfo/wr_exportfs.c107
-rw-r--r--contrib/amd/fsinfo/wr_fstab.c341
-rw-r--r--contrib/amd/hlfsd/hlfsd.8323
-rw-r--r--contrib/amd/hlfsd/hlfsd.c926
-rw-r--r--contrib/amd/hlfsd/hlfsd.h160
-rw-r--r--contrib/amd/hlfsd/homedir.c807
-rw-r--r--contrib/amd/hlfsd/nfs_prot_svc.c249
-rw-r--r--contrib/amd/hlfsd/stubs.c534
-rw-r--r--contrib/amd/include/am_compat.h393
-rw-r--r--contrib/amd/include/am_defs.h1595
-rw-r--r--contrib/amd/include/am_utils.h497
-rw-r--r--contrib/amd/include/am_xdr_func.h327
-rw-r--r--contrib/amd/include/amq_defs.h157
-rw-r--r--contrib/amd/include/mount_headers1.h216
-rw-r--r--contrib/amd/include/mount_headers2.h87
-rw-r--r--contrib/amd/ldap-id.ms306
-rw-r--r--contrib/amd/ldap-id.txt360
-rw-r--r--contrib/amd/ldap.schema52
-rw-r--r--contrib/amd/libamu/alloca.c504
-rw-r--r--contrib/amd/libamu/amu.h79
-rw-r--r--contrib/amd/libamu/clnt_sperrno.c147
-rw-r--r--contrib/amd/libamu/hasmntopt.c118
-rw-r--r--contrib/amd/libamu/misc_rpc.c210
-rw-r--r--contrib/amd/libamu/mount_fs.c1003
-rw-r--r--contrib/amd/libamu/mtab.c250
-rw-r--r--contrib/amd/libamu/nfs_prot_xdr.c58
-rw-r--r--contrib/amd/libamu/strerror.c68
-rw-r--r--contrib/amd/libamu/strutil.c270
-rw-r--r--contrib/amd/libamu/wire.c573
-rw-r--r--contrib/amd/libamu/xdr_func.c1098
-rw-r--r--contrib/amd/libamu/xutil.c1091
-rw-r--r--contrib/amd/mk-amd-map/mk-amd-map.882
-rw-r--r--contrib/amd/mk-amd-map/mk-amd-map.c399
-rw-r--r--contrib/amd/scripts/Makefile.am49
-rw-r--r--contrib/amd/scripts/Makefile.in381
-rw-r--r--contrib/amd/scripts/am-eject.in53
-rw-r--r--contrib/amd/scripts/amd.conf-sample164
-rw-r--r--contrib/amd/scripts/amd.conf.5784
-rwxr-xr-xcontrib/amd/scripts/amd2ldif.in60
-rwxr-xr-xcontrib/amd/scripts/amd2sun.in51
-rw-r--r--contrib/amd/scripts/automount2amd.8121
-rwxr-xr-xcontrib/amd/scripts/automount2amd.in72
-rwxr-xr-xcontrib/amd/scripts/ctl-amd.in155
-rwxr-xr-xcontrib/amd/scripts/ctl-hlfsd.in116
-rw-r--r--contrib/amd/scripts/expn.11369
-rwxr-xr-xcontrib/amd/scripts/expn.in1369
-rwxr-xr-xcontrib/amd/scripts/fix-amd-map.in52
-rwxr-xr-xcontrib/amd/scripts/fixrmtab24
-rwxr-xr-xcontrib/amd/scripts/fixrmtab.in24
-rw-r--r--contrib/amd/scripts/lostaltmail.conf-sample84
-rwxr-xr-xcontrib/amd/scripts/lostaltmail.in658
-rwxr-xr-xcontrib/amd/scripts/redhat-ctl-amd.in106
-rwxr-xr-xcontrib/amd/scripts/test-attrcache.in135
-rwxr-xr-xcontrib/amd/scripts/wait4amd.in45
-rwxr-xr-xcontrib/amd/scripts/wait4amd2die.in49
-rw-r--r--contrib/amd/tasks111
-rw-r--r--contrib/amd/vers.m41
-rw-r--r--contrib/amd/wire-test/wire-test.888
-rw-r--r--contrib/amd/wire-test/wire-test.c129
182 files changed, 0 insertions, 85563 deletions
diff --git a/contrib/amd/AUTHORS b/contrib/amd/AUTHORS
deleted file mode 100644
index 3c241d016bb9..000000000000
--- a/contrib/amd/AUTHORS
+++ /dev/null
@@ -1,430 +0,0 @@
-PRIMARY AUTHORS AND MAJOR CONTRIBUTORS TO AM_UTILS:
-Original authors of amd were the Berkeley team and especially Jan-Simon
-Pendry. Since then many people have contributed patches.
-
-This file lists the ones who contributed major code changes, in no
-particular order, and I thank them all. This is of course not to diminish
-the smaller contributes of the many others. Thank you all.
-
-* Erez Zadok <ezk@cs.sunysb.edu>
-
-The most significant changes were made by Erez Zadok in terms of bug fixes,
-ports, and new features added. Erez Zadok is the current maintainer of
-am-utils, as of January 1997.
-
-* Ion Badulescu <ion@cs.columbia.edu>
-
-Co-maintainer of am-utils since late 1999: Linux and Solaris autofs support,
-Linux NFSv3 support, major code reorganization, etc...
-
-* Randall S. Winchester <rsw@glue.umd.edu>
-
-May 7, 1997: contributed a special version of upl102 that included NFS V.3
-support. Some of the code was contributed by Christos Zoulas
-<christos@deshaw.com>. I (Erez) ported these changes to am-utils.
-
-September 12, 1997: lots of small prototype cleanups and fixes to numerous
-files.
-
-January 27, 1998: support pid files in the amd.conf file. Provide base name
-for hesiod zone files. Always use /etc/amd.conf if exists.
-
-August 8, 1998: add detection support for NFS V.3 for NetBSD 1.3F.
-
-February 1, 1998: fixes for NetBSD to better detect its features.
-
-September 4, 1999: assorted fixes for NetBSD 1.4+.
-
-* Hannes Reinecke <hare@MathI.UNI-Heidelberg.DE>
-
-Back in 1995, contributed code for linux. A new parser for file system
-specific options that only exist under linux.
-
-* Leif Johansson <leifj@matematik.su.se>
-
-June 22, 1997: minor patch to ensure that systems without an RE library work.
-
-June 23, 1997: mount options should be properly comma limited.
-
-July 10, 1997: info_ldap.c and prototype changes to all map _init and _mtime
-functions. Contributed scripts/amd2ldif.pl.
-
-August 4, 1997: info_ldap.c fixes and adding two new amd.conf ldap
-variables: ldap_cache_seconds and ldap_cache_maxmem.
-
-* Andreas Stolcke <stolcke@speech.sri.com>
-
-June 22, 1997: patches to ensure that proto= and vers= options work
-properly in mount tables and can be overridden. Later on, more code
-contribued to optimize the best combination of proto/vers.
-
-July 4, 1997: patches to get NFS V.3 working under irix5.
-
-September 9, 1997: initialize all fields of mntent_t structures to 0.
-
-October 2, 1997: don't log an RPC timeout as an error but only as an info
-message.
-
-December 19, 1997: detected an FMR (Free Memory Read) in amd/mntfs.c,
-uninit_mntfs().
-
-* Danny Braniss <danny@cs.huji.ac.il>
-
-July, 6 1997: contributed patches to hesiod on bsdi3.
-
-* Tom Schmidt <tschmidt@micron.com>
-
-July 10, 1997: Recommdation to include libgdbm if libc has no dbm_open.
-Patches for netgrp(host) command. Mods to aux/config.guess to recognize
-sun3.
-
-January 19, 1998: print correct -l option depending if system supports
-syslog and/or syslog facilities.
-
-January 29, 1998: fix for 0.0.0.0 loopback on SunOS 3.X which defines
-IFF_ROUTE instead of IFF_LOOPBACK.
-
-May 30, 2000: correct logging types for addopts/mergeopts messages.
-
-* Daniel S. Riley <dsr@mail.lns.cornell.edu>
-
-July 11, 1997: fixes to DU-4.0 to support string POSIX.1 signals, and struct
-sockaddr with sa_len field.
-
-July 13, 1997: Move amd.conf parsing to before switch_option() on log/debug
-options. Minor type wrt "ro" option in libamu/mount_fs.c. Added more
-fillers of mnttab options, for acdirmax, acdirmin, acregmax, acregmin, noac,
-grpid, nosuid, and actimo.
-
-August 15, 1998: fix memory leak in processing of /defaults, and avoid
-accessing uninitialized memory in osf1.
-
-* Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
-July 23, 1997: Got lots of patches from the Debian Linux folks, who fixed
-several generic bugs, and one serious one for Linux. The latter involved
-using connected sockets for NFS mounts on kernels 1.3.10 and older. Roman's
-work is baed on amd-upl102, and work from Ian Murdock <imurdock@debian.org>
-and Dominik Kubla <dominik@debian.org>.
-
-* Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
-August 6, 1997: assorted fixes to support hesiod-1.3, solaris 2.4 (which I
-already fixed but did not release yet), and support for $LDFLAGS at
-configure/compile time.
-
-February 24, 1998: lots of patches for ultrix 4.3 port.
-
-February 28, 1998: lots of documentation fixes!
-
-January 8, 1999: texi fixes, and more Ultrix 4.3 fixes, among others.
-
-January 11, 1999: hesiod_isup function. Fix format errors in dlog/plog.
-Remove obsolete or unnecessary files/macros. Don't report disabled file
-systems. More misc fixes.
-
-February 3, 1998: don't start autofs listener unless autofs maps were in
-use.
-
-December 10, 1999: assorted fixed and lots of fixes to support in-kernel
-mount tables in Solaris 8.
-
-February 9, 2000: new debug options hrtime (hi-res timer) and xdrtrace. bug
-fixes.
-
-* Jason Thorpe <thorpej@nas.nasa.gov>
-
-August 25, 1997: make amd work when talking to NIS+ servers in NIS
-compatibility mode. Fix originally came from Matthieu Herrb
-<matthieu@laas.fr>.
-
-* Chris Metcalf <metcalf@catfish.lcs.mit.edu>
-
-August 29, 1997: patch to make amd use FQHN for NFS/RPC authentication,
-useful esp. for cross-domain NFS mounts.
-September 2, 1997: if plock() succeeded, don't display errno string.
-
-* Enami Tsugutomo <enami@cv.sony.co.jp>
-
-September 4, 1997: don't ping remote servers with NFS V.3 always, but V.2,
-regardless of client's NFS version. (conf/transp/transp_sockets.c)
-
-* Dan Riley <dsr@mail.lns.cornell.edu>
-
-September 19, 1997: make sure that amd works with more secure portmappers
-that do not allow forwarding of RPC messages to other services.
-
-* Wolfgang Rupprecht <wolfgang@wsrcc.com>
-
-August 10, 1997: netbsd and other bsd systems have a mask flag for
-pcfs_args (msdos mount).
-
-* Christos Zoulas <christos@zoulas.com>
-
-September 25, 1997: fix to initialize uid/gid fields of pcfs_args_t on
-netbsd.
-
-October 10, 1997: compile time cleanups of printf()s in hlfsd code. If nfs
-server is down or does not support a portmapper call, then mark it down as
-version 2, and try again later.
-
-November 29, 2002: compile fixes for NetBSD, a couple of bug fixes (one
-already fixed by maintainers)
-
-April 12, 2003: support new "unmount" option, useful to timeout removable
-local media mounts.
-
-October 12, 2004: patch to support two new amd.conf options, domain_strip
-and auto_attrcache. Patch to cleanup NFS attribute-cache flag computation.
-Patch to fix an inconsistency in timeouts in the RPC code between socket and
-TLI implementations. Patch to print version string (amd -v) after all
-options had been initialized, so we can print domain, host, and hostd.
-Linux patch to use umount2(2) if umount(2) fails.
-
-* Bill Paul <wpaul@ctr.columbia.edu>
-
-November 5, 1997: NFS v.3 support for AIX 4.2.1, which does *not* include
-headers for this. Bill had to guess at the right structures, field names,
-sizes, alignment, etc.
-
-January 15, 1999: small ldap bug fixes.
-
-* Stefan Vogel <vogel@physik-rzu.unizh.ch>
-
-November 14, 1997: typo in the subscription instructions to amd-dev.
-
-* Guntram Wolski <gwolsk@sei.com>
-
-November 15, 1997: pointed out mismatching documentation for the -o option.
-
-* Michael Hucka <hucka@eecs.umich.edu>
-
-January 11, 1997: pointed out reversed definition of NFS mount options vers
-and proto.
-
-* Albert Chin <china@pprd.abbott.com>
-
-January 12, 1998: minor bug in output of amd -H.
-
-June 23, 2005: assortment of small compile bugs on aix4, and solaris 5/6/7.
-
-* Thomas Richter <richter@chemie.fu-berlin.de>
-
-January 13, 1998: use case insensitive comparisons for variables that need
-it (such as all hostname related ones, and more).
-
-July 20, 1998: don't leak memory in the private version of yp_all (when
-vendor yp_all is bad).
-
-* Fred Korz <korz@smarts.com>
-
-January 30, 1998: minor typo fixed to tftp example in am-utils.texi.
-
-* Donald Buczek <buczek@MPIMG-Berlin-Dahlem.MPG.DE>
-
-March 6, 1998: correctly inherit existing NFS V.3 mounts upon restart.
-
-March 17, 1998: compare log file name and syslog string with correct length.
-
-March 20, 1998: do not close stdout in case it gets reused elsewhere and to
-allow startup script to redirect it. Set a temporary secure umask(0022)
-before writing log file and restore it afterwards.
-
-* Matthew Crosby <mcrosby@ms.com>
-
-April 20, 1998: allow arbitrary number of interfaces in wire listing.
-
-* David O'Brien <obrien@NUXI.com>
-
-September 4, 1998: bug fix to avoid overrunning hostname buffer, and minor
-amd.conf man page typo correction.
-
-September 22, 1999: use more secure vsnprintf in real_plog().
-
-* Danny Rathjens <dkr@cs.fiu.edu>
-
-October 29, 1998: swap arguments to kill(2) in amd.c.
-
-* Mike Mitchell <mcm@unx.sas.com>
-
-November 3, 1998: amd/nfs_subr.c (nfsproc_lookup_2_svc): try to avoid a race
-condition between unmounting and re-mounting an entry, by increasing the ttl
-of a looked up entry before unmounting it.
-
-* Douglas K. Rand" <rand@aero.und.edu>
-
-December 3, 1998: case insensitive host name match for nfsl.
-
-* David Wolfskill <dhw@whistle.com>
-January 28, 1999: don't turn on/off noconn option if it was already in that
-state.
-
-* Jeffrey C Honig <jch@BSDI.COM>
-March 14, 1999: clean up more autogenerated files upon "make distclean".
-
-March 15, 1999: avoid overly verbose NIS warning even on systems that don't
-run NIS. On BSD systems, wire.c uses getifaddrs(), sysctl(), IRS routines,
-and more fixes. Numerous IP packet security fixes.
-
-March 16, 1999: documentation typos. new cdfs options. ufs structure
-detection for bsdi4.
-
-September 17, 1999: fixes to expn.
-
-* Paul Balyoz <pbalyoz@sedona.ch.intel.com>
-March 26, 1999: ensure lostaltmail displays Y2K compliant dates.
-
-* Jon Peatfield <J.S.Peatfield@damtp.cam.ac.uk>
-March 30, 1999: turn off incomplete NFS V.3 support in HPUX 10.20.
-
-September 22, 1999: safe reloading of maps without first clearing old
-copies, and using cached copies if map failed to reload.
-
-* Peter Breitenlohner <peb@mppmu.mpg.de>
-July 24, 1999: patch for linux 2.2.x to work with older libc5 systems, and
-nis_isup mis-logic fixes.
-December 13, 2001: report typos in scripts/amd.conf.5.
-
-* Dale Talcott <aeh@quest.cc.purdue.edu>
-July 26, 1999: added NFS3 support for AIX mounting.
-
-* Christophe Kalt <Christophe-Kalt@deshaw.com>
-July 14, 1999: add netgrpd() syntax function which uses FQHN.
-
-* Andrew J. Korty <ajk@purdue.edu>
-September 5, 1999: pawd works for type:=nfsl.
-
-* Nick Williams <njw@ms.com>
-September 1, 1999: bug fix for incorrect symlinks when two locations are
-requested simultaneously.
-
-November 1, 1999: fixes to sync maps even if they are set to mapcache:=sync.
-
-January 19, 2000: fix (and reduce the incidence of) stale file handles when
-doing rapid mounts and umounts in succession.
-
-June 5, 2000: better handling of potential race-conditions during rapid
-u/mounts. Correctly update d_drops stats for amq -s.
-
-* Johann Pfefferl <johann.pfefferl.jp@germany.agfa.com>
-November 16, 1999: fix to ldap code so repeated calls to string2he don't
-corrupt the string passed.
-
-* Amitha Perera <perera@cs.rpi.edu>
-December 9, 1999: detect all wire() interfaces correctly.
-
-* Steven Danz <sdanz@awc.kc.noaa.gov>
-January 25, 2000: allow browsable auto maps.
-
-* Wolfram Klaus <klaus@physik.fu-berlin.de>.
-November 21, 2000: recognize proplist mnttab flag.
-
-* Thomas Klausner <tk@giga.or.at>
-November 21, 2000: lots of NetBSD fixes (many of which are generic).
-
-April 18, 2003: patch to reference am-utils info pages in man page.
-
-November 28, 2004: small fixes to typos in amd.conf(5) man page.
-
-* Olaf Kirch <okir@caldera.de>
-February 1, 2001: important Linux NFS error number mapping fixed
-
-* Ahmon Dancy <dancy@franz.com>
-February 9, 2001: Apple Rhapsody/Darwin/OS X port
-
-* Sebastien Bahloul <sebastien.bahloul@mangoosta.fr>
-July 3, 2001: LDAP fixes and updates to support new APIs
-
-March 27, 2002: LDAP bug and port to HPUX-11.
-
-* Philippe Troin <phil@fifi.org>
-July 12, 2001: Proper handling of GNU getopt, support for optionally
-disabling LDAP/Hesiod, fixes for the dev/nodev option on Linux. Texi
-documentation fix.
-
-November 28, 2001: Bug fix. Support "nolock" as an NFS option, not a
-generic mount option.
-
-July 17, 2003: pref:=null core dump fix. libgdbm portability. tcpd/librap
-support. And a few other things for the 6.0 branch.
-
-* Trond Myklebust <trond.myklebust@fys.uio.no>
-January 10, 2002: Proper initialization of the timeo parameter on Linux, TCP
-_must_ have a timeout 2 orders of magnitude larger than UDP
-
-* George Ross <gdmr@dcs.ed.ac.uk>
-April 29, 2002: Rework of old code, support for wildcards in LDAP queries,
-and an FD leak fix. Amd -A support.
-
-October 21, 2002: ldap_unbind fix for SIGPIPE, and support for LDAPv3
-protocol version parameter (with Tim Colles <timc@inf.ed.ac.uk>).
-
-* Matthias Scheler <tron@zhadum.de>
-June 14, 2002: patch to use "xlatecookie" NFS mount option.
-
-* Jun-ichiro itojun Hagino <itojun@iijlab.net>.
-June 11, 2002: minor fixes to support NetBSD 1.6A.
-
-* Sean Fagan <sef@apple.com>
-March 14, 2003: detect and use the MNT2_GEN_OPT_AUTOMNTFS mount flag
-on OS X / Darwin.
-
-* Hendrik Scholz <hscholz@raisdorf.net>
-June 9, 2003: mk-amd-map should open temp db file using O_EXCL.
-
-* Mark Davies <mark@mcs.vuw.ac.nz>
-July 14, 2003: define "xlatecookie" mnttab option if not defined (for
-NetBSD). Support null hesiod entries if they start with a ".".
-
-* Eric S. Raymond <esr@thyrsus.com>
-December 9, 2003: fix unbalanced [] typo in fsinfo man page.
-
-* Martin Blapp <mb@imp.ch>
-July 6, 2004: recognize fields in pcfs_args_t in FreeBSD 5.
-
-* Dan Nelson <dnelson@allantgroup.com>
-August 2, 2004: pawd to recognize "host" type mounts.
-
-* Hauke Fath <hauke@Espresso.Rhein-Neckar.DE>
-August 3, 2004: pawd to recognize "linkx" type mounts.
-
-* Michael van Elst <M.van.Elst@science-computing.de>
-September 1, 2004: bug fix to avoid race condition in calls to mntctl on
-AIX.
-
-* Jonathan Chen <jon+amd@spock.org>
-October 22, 2004: patch/fix to move mlock/mlockall/plock code after the
-fork().
-June 29, 2005: core dump going off end of exported_ap[] array.
-September 29, 2005: patch/fix for pawd not to go into an infinite loop.
-October 25, 2005: patch/fix for pawd to repeatedly resolve path.
-
-* David Rage <rage@ucl.ac.uk>
-January 17, 2005: prevent Amd from logging 'Read-only filesystem' errors
-when the mount point has an ancestor (i.e. '/') that is mounted read-only.
-
-* Kevin Layer <layer@franz.com>
-January 28, 2005: basic instructions how to setup Amd on Mac OS-X.
-
-* Dan Ottavio <dottavio@ic.sunysb.edu>
-March 2, 2005: new global amd.conf option debug_mtab_file, to set the debug
-mtab file when using debug_options=mtab. Default has changed from "./mtab"
-to "/tmp/mtab" to avoid security problem. Bug fixed to ensure that Amd
-terminates properly even mtab file doesn't exist.
-
-* Erik Kline <ekline at ekline dot com>
-January 3, 2005: implementation of executable maps for Amd.
-
-* Jim Zajkowski <jim.zajkowski@gmail.com>
-March 14, 2005: small patch to amd2ldif.
-
-* Adam Morley <adam at gmi dot com>
-January 27, 2005: synchronize what amd2ldif does vs. what the ldap.schema
-expects.
-
-* Graeme Wilford <G.Wilford@surrey.ac.uk>
-July 4, 2005: buffer overflow in pawd.
-
-* Steve Plite <splite-amutils@sigint.cs.purdue.edu>
-September 22, 2005: repair reversed meaning of D_AMQ, so amq will unregister
-on exit.
diff --git a/contrib/amd/BUGS b/contrib/amd/BUGS
deleted file mode 100644
index 3a3ba6b367d4..000000000000
--- a/contrib/amd/BUGS
+++ /dev/null
@@ -1,303 +0,0 @@
- LIST OF KNOWN BUGS IN AM-UTILS OR OPERATING SYSTEMS
-
-Note: report am-utils bugs via Bugzilla to https://bugzilla.am-utils.org/ or
-by email to the am-utils@am-utils.org mailing list.
-
-
-(1) mips-sgi-irix*
-
-[1A] known to have flaky NFS V.3 and TCP. Amd tends to hang or spin
-infinitely after a few hours or days of use. Users must install recommended
-patches from vendor. Patches help, but not all the time. Otherwise avoid
-using NFS V.3 and TCP on these systems, by setting
-
- /defaults opts:=vers=2,proto=udp
-
-[1B] yp_all() leaks a file descriptor. Eventually amd runs out of file
-descriptors and hangs. Am-utils circumvents this by using its own version
-of yp_all which uses udp and iterates over NIS maps. The latter isn't as
-reliable as yp_all() which uses TCP, but it is better than hanging.
-
-(I have some reports that older version of hpux-9, with older libc, also
-leak file descriptors.)
-
-[1C] SGI's MIPSpro C compiler on IRIX 6 has the unfortunate habit of
-creating code specificially for the machine it runs on. The ABI and ISA
-used depend very much on the OS version and compiler release used. This
-means that the resulting amd binary won't run on machines different from
-the build host, particularly older ones. Older versions of am-utils
-enforced the O32 ABI when compiling with cc to work around this, but this
-ABI is deprecated in favor of the N32 ABI now, so we use -n32 -mips3 to
-ensure that the binaries run on every host capable of running IRIX 6 at
-all. If this is not appropriate for you, configure with something like
-CC='cc -64' instead to get the desired ABI and ISA.
-
-(2) alpha-unknown-linux-gnu (RedHat Linux 4.2)
-
-hasmntopt(mnt, opt) can go into an infinite loop if opt is any substring
-of mnt->mnt_opts. Redhat 5.0 does not have this libc bug. Here is an
-example program:
-
-#include <stdio.h>
-#include <mntent.h>
-main()
-{
- struct mntent mnt;
- char *cp;
- mnt.mnt_opts = "intr,rw,port=1023,timeo=8,foo=br,retrans=110,indirect,map=/usr/local/AMD/etc/amd.proj,boo";
- cp = hasmntopt(&mnt, "ro");
- printf("cp = %s\n", cp);
- exit(0);
-}
-
-It is possible that sufficiently newer version of libc for RH4.2 fix this
-problem.
-
-
-(3) mips-dec-ultrix4.3
-
-Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> reports
-
-[3A] One needs the Kernel Config Files (UDTBIN430) subset installed to
-compile am-utils, otherwise essential header files (net/if.h, net/route.h,
-rpcsvc/mount.h, rpcsvc/yp_prot.h, rpcsvc/ypclnt.h, sys/proc.h) are
-missing.
-
-[3B] It's probably impossible to build am-utils with DEC C on Ultrix V4.3.
-This compiler is pseudo-ANSI only. Maybe the new ANSI C compiler in V4.3A
-and beyond will do. I successfully used gcc 2.8.1.
-
-[3C] You need to build against a recent libhesiod (I used 3.0.2) and
-libresolv/lib44bsd (I used BIND 4.9.5-P1). The resolver routines in
-libc seem to cause random memory corruption. It is necessary to specify
-LIBS=-l44bsd. lib44bsd is a helper library of libresolv used to supply
-functions like strdup which are missing on the host system. This isn't
-currently autoconfiscated.
-
-[3D] You need to configure with CONFIG_SHELL=/bin/sh5 /bin/sh5 buildall;
-/bin/sh cannot handle the shell functions used in buildall and is both
-buggy and slow.
-
-[3E] At least the gcc 2.7.0 fixincludes-mangled <sys/utsname.h> needs a
-forward declaration of struct utsname to avoid lots of gcc warnings:
-
-RCS file: RCS/utsname.h,v
-retrieving revision 1.1
-diff -u -r1.1 utsname.h
---- utsname.h 1995/06/19 13:07:01 1.1
-+++ utsname.h 1998/01/27 12:34:26
-@@ -59,6 +59,7 @@
- #ifdef KERNEL
- #include "../h/limits.h"
- #else /* user mode */
-+struct utsname;
- extern int uname _PARAMS((struct utsname *));
- #endif
- #define __SYS_NMLN 32
-
-
-(4) powerpc-ibm-aix4.2.1.0
-
-[4A] "Randall S. Winchester" <rsw@Glue.umd.edu> reports that for amd to
-start, you need to kill and restart rpc.mountd and possibly also make sure
-that nfsd is running. Normally these are not required.
-
-[4B] "Stefan Vogel" <vogel@physik.unizh.ch> reports that if your amq
-executable dump core unexpectedly, then it may be a bug in gcc 2.7.x.
-Upgrade to gcc 2.8.x or use IBM's xlC compiler.
-
-[C] Do not link amd with libnsl. It is buggy and causes amd to core dump
-in strlen inside strdup inside svc_register().
-
-
-(5) *-linux-rh51 (RedHat Linux 5.1)
-
-There's a UDP file descriptor leak in libnsl in RedHat Linux 5.1. This
-library part of glibc2. Am-utils currently declares redhat 5.1 systems as
-having a "broken yp_all" and using an internal, slower, leak-free version.
-The leak is known to the glibc maintainers and a fix from them is due soon,
-but it is not yet in the glibc-2.0.7-19 RPM.
-
-
-(6) rs6000-ibm-aix4.1.x
-
-A bug in libc results in an amq binary that doesn't work; amq -v dumps core
-in xdr_string. There is no known fix (source code or vendor patch) at this
-time. (Please let am-utils@am-utils.org know if you know of a fix.)
-
-
-(7) *-aix4.3.2.0
-
-The plock() function will pre-reserve all of the memory up to the maximum
-listed in the ulimit. If the ulimit is infinite, plock() will try to take
-all of the system's memory, and fail with ENOMEM (Not Enough Space).
-Normally ulimit may be set to a few gigs of max memory usage, but even that
-is too much; Amd doesn't need more than a few megs of resident memory size
-(depending on the particular usage, number of maps, etc.) Solution: lower
-your ulimit before starting amd. This can be done inside the ctl-amd
-script, but be careful not to limit it too low. Alternatively, don't use
-plock on aix-4.3: set it to plock=no in amd.conf (which is the default if
-you do nothing).
-
-
-(8) *-linux (systems using glibc 2.1, such as RedHat-6.x)
-
-There's a UDP file descriptor leak in the NIS routines in glibc, especially
-those that do yp_bind. Until this is bug fixed, do not set nis_domain in
-amd.conf, but let the system pick up the default domain name as set by your
-system. That would avoid using the buggy yp_bind routines in libc.
-
-
-(9) *-linux (SuSE systems using unfsd)
-
-The user-level nfsd (2.2beta44) on older SuSE Linux systems (and possibly
-others) dies with a SEGV when amd tries to contact it for access to a volume
-that does not exist, or one for which there is no permission to mount.
-
-
-(10) *-*-hpux11
-
-If you're using NFSv3, you must install HP patches PHNE_20344 and
-PHNE_20371. If you don't, and you try to use amd with NFSv3 over TCP, your
-kernel will panic.
-
-
-(11) *-linux* (any system using a 2.2.18+ kernel)
-
-The Linux kernels don't support Amd's direct mounts very well, leading to
-erratic behavior: shares that don't get remounted after the first timeout,
-inability to restart Amd because its mount points cannot be unmounted, etc.
-There are some kernel patches on the am-utils Web site, which solve these
-problems. See http://www.am-utils.org/patches/.
-
-Later 2.4.x kernels completely disallow the hack amd was using for direct
-mounts, so another solution will have to be found.
-
-Note: the above is for the old-style amd mount_type = nfs. The autofs mounts
-don't support direct mounts at all (due to lack of kernel support).
-
-(12) *-aix5.1.0.0 and *-hpux9*
-
-/bin/sh is broken and fails to run the configure script properly. You need
-to use /bin/ksh instead. The buildall script will do it for you; if for some
-reason you need to run configure directly, run it using 'ksh configure'
-instead of just 'configure'.
-
-[12A] *-aix5.2.*
-
-Apparently there is an NFS client side bug in vmount() which causes amd to
-hang when it starts (and tries to NFS-mount itself). According to IBM
-engineers, this has to do with partial support code for IPv6: the NFS kernel
-code doesn't appear to recognize the sin_family of the amd vmount(),
-although amd does the right thing. The bug doesn't appear to be in 5.1 or
-4.3.3. A fix from IBM is available, APAR number IY41417.
-
-A binary built on 4.3.3 will not work on 5.2, because the kernel ABIs have
-changed.
-
-[12C] *-aix*
-
-It is important that you install bos.net.nfs.adt before configuring and
-building am-utils. If you don't, you will get compile-time or
-configure-time errors, especially when configure tries to find AIX's
-definition of struct nfs_args.
-
-(13) *-linux and *-darwin6.0
-
-Certain linux kernels (2.4.18+ are fine, 2.4.10- are probably bad, those in
-between have not been tested) have a bug which causes them to reconnect
-broken NFS/TCP connections using unprivileged ports (greater than 1024),
-unlike the initial connections which do originate from privileged
-ports. This can upset quite a few NFS servers and causes accesses to the
-mounted shares to fail with "Operation not permitted" (EPERM).
-
-The darwin (MacOS X) kernel defaults to using unprivileged ports, but that
-can be changed by setting the resvport mount flag (which amd sets by
-default). Nonetheless, if a TCP connection breaks, under certain unclear
-circumstances the kernel might "forget" about that flag and start using
-unprivileged ports, causing the same EPERM error above.
-
-(14) Solaris
-
-The line "%option" in *.l files may cause Solaris /usr/ccs/bin/lex to abort
-with the error "missing translation value." This is a bug in Solaris lex.
-
-Moreover, both Solaris yacc and lex produce code that does not pass strict
-compilation such as "gcc -Wall -Werror".
-
-Use GNU Flex and Bison instead. You can download ready-made binaries from
-www.sunfreeware.com. Note, however, that sometimes the binaries on
-sunfreeware.com don't seem to work, often because they are built against an
-older revision of Solaris or build tools. In that case, build a fresh
-version of GNU flex and/or bison from the latest stable sources. See
-http://www.gnu.org/software/flex/ and http://www.gnu.org/software/bison/.
-
-(15) Solaris 8 + patch 10899[34]-xx (18 <= xx < 25) or patch 11260[56]-xx
-
-With this patch, Sun updated the autofs kernel module and automountd
-userspace daemon from version 3 to version 4. They also updated the
-/usr/include/rpcsvc/autofs_prot.x file, but forgot to regenerate the
-autofs_prot.h file. Thus, when amd is compiled, it uses the old header and
-thinks it should use autofs version 3, when in fact the kernel now supports
-(and expects) only version 4.
-
-The workaround is to run 'rpcgen -C -h /usr/include/rpcsvc/autofs_prot.x >
-/usr/include/rpcsvc/autofs_prot.h' and completely reconfigure and rebuild
-am-utils (removing config.cache before running configure).
-
-The problem is fixed in patch revisions 10899[34]-25 and up.
-
-
-(16) Linux kernel 2.4+ and lofs mounts
-
-Lofs mounts are not supported by the linux kernel, at all, but since 2.4.0
-the kernel supports a similar type of mount called a bind mount. Its
-semantics are closer to those of a hardlink than to those of lofs, and one
-of the results is that bind mounts ignore any mount options paseed to them.
-
-Amd uses bind mounts internally to emulate lofs mounts, which means that
-lofs mounts on linux will effectively ignore their mount parameters and
-inherit whatever options the original filesystem mounted upon had.
-
-
-(17) autoconf 2.57
-
-If you see configure warnings of the following kind:
-
-configure: WARNING: sys/proc.h: present but cannot be compiled
-configure: WARNING: sys/proc.h: check for missing prerequisite headers?
-configure: WARNING: sys/proc.h: proceeding with the preprocessor's result
-configure: WARNING: ## ------------------------------------ ##
-configure: WARNING: ## Report this to bug-autoconf@gnu.org. ##
-configure: WARNING: ## ------------------------------------ ##
-
-please ignore them. They are not real errors, and neither
-bug-autoconf@gnu.org nor the am-utils maintainers are interested in hearing
-about them. Autoconf simply tries to do more than we need and attempts to
-compile each header in isolation, which fails for many system headers.
-That's ok, because we only need to know if a header file exists -- we know
-how to use it properly ourselves.
-
-While autoconf does offer a way to specify other files to be included with
-the tested header, in order to avoid these warnings, using it would enlarge
-the resulting configure script by an order of magnitude, and for no real
-gain. Configure is big enough as it is, we don't need any more useless
-baggage in it.
-
-(18) NetBSD 2.0.2, FreeBSD 5.4, OpenBSD 3.7, and quite possibly most other
- BSDs and other OSs (as of September 2005)
-
-Some BSD kernels don't have a way to turn off the NFS attribute cache. They
-don't have a 'noac' mount flag, and setting various cache timeout fields in
-struct nfs_args doesn't turn off the attribute cache; instead, it sets the
-attribute cache timeout to some internal hard-coded default (usually
-anywhere from 5-30 seconds). If Amd cannot turn off the NFS attribute
-cache, under heavy Amd usage, users could get ESTALE errors from automounted
-symlinks, or find that those symlinks point to the wrong place. One
-workaround which would minimize this effect is to set auto_attrcache=1 in
-your amd.conf, but it doesn't eliminate the problem! The best solutions are
-(1) to use Amd in Autofs mode, if it's supported in your OS, and (2) talk to
-your OS vendor to support a true "noac" flag. See README.attrcache for more
-details.
-
-Erez & the am-utils team.
diff --git a/contrib/amd/COPYING b/contrib/amd/COPYING
deleted file mode 100644
index 035f6239c935..000000000000
--- a/contrib/amd/COPYING
+++ /dev/null
@@ -1,37 +0,0 @@
-Copyright (c) 1997-2006 Erez Zadok
-Copyright (c) 1989 Jan-Simon Pendry
-Copyright (c) 1989 Imperial College of Science, Technology & Medicine
-Copyright (c) 1989 The Regents of the University of California.
-All rights reserved.
-
-This code is derived from software contributed to Berkeley by
-Jan-Simon Pendry at Imperial College, London.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
- must display the following acknowledgment:
- This product includes software developed by the University of
- California, Berkeley and its contributors, as well as the Trustees of
- Columbia University.
-4. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
diff --git a/contrib/amd/ChangeLog b/contrib/amd/ChangeLog
deleted file mode 100644
index 12f2c5fb8e65..000000000000
--- a/contrib/amd/ChangeLog
+++ /dev/null
@@ -1,12025 +0,0 @@
-2006-05-11 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1.5 ***
- *******************************************************************
-
-2006-05-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Minor new ports: i386-unknown-freebsd6.1 (RELEASE)
- powerpc-apple-darwin8.6.0, and i386-unknown-openbsd3.9.
-
- * libamu/mount_fs.c (compute_nfs_attrcache_flags): fix signedness
- problems on IRIX-6.5.
-
- * conf/autofs/autofs_solaris_v1.c (xdr_umntrequest): fix
- signedness problems on IRIX-6.5.
-
-2006-05-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: check if libc already includes dbm functionality
- (as in FreeBSD 6), then don't bother to check specific libraries
- such as libdbm, gdbm, etc.
-
-2006-04-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: detect G/DBM support via gdbm_compat library
- (Debian 3.1).
-
- * minor new port: powerpc-apple-darwin8.5.0
-
-2006-04-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf-sample, scripts/amd.conf.5, doc/am-utils.texi,
- NEWS: document new nfs_allow_any_interface parameter.
-
- * include/am_compat.h (INADDR_LOOPBACK): define INADDR_LOOPBACK if
- not defined, since some systems don't have it.
-
-2006-04-20 Nick Williams <Nick.Williams@morganstanley.com>
-
- * libamu/wire.c (is_interface_local): new boolena function to
- determine if address represents any of the local interfaces.
- (getwire): more properly check if address equals INADDR_LOOPBACK,
- not if IFF_LOOPBACK is not (the latter isn't as correct).
-
- * include/am_utils.h: extern for new is_interface_local() function.
-
- * conf/transp/transp_{sockets,tli}.c: don't define INADDR_LOOPBACK
- here but in am_compat.h
-
- * amd/nfs_prot_svc.c (nfs_program_2): if
- nfs_allow_any_interface=yes, then allow NFS packets from any local
- interface (not just 127.0.0.1).
-
- * amd/conf.c (gopt_nfs_allow_any_interface): implement the new
- amd.conf parameter nfs_allow_any_interface.
-
- * amd/amd.h (CFM_NFS_ANY_INTERFACE): define new global flag when
- al interfaces are acceptable for local NFS packets.
-
-2006-04-18 Christos Zoulas <christos@zoulas.com>
-
- * amd/opts.c: Add support for optionally specifying the hostname
- to match against the netgroup in the netgrp and netgrpd selectors.
-
-2006-04-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/mtab.c (hasmntval): fix inverted meaning of error from
- hasmntvalerr().
-
-2006-04-14 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/mount_fs.c (compute_nfs_attrcache_flags): use new
- hasmntvalerr() function to set attribute cache values only if they
- were set (regardless whether they were set to zero or a non-zero
- value). Before, we were unable to distinguish between an error to
- parse an option, and a user who actually wanted to set an
- attribute-cache value to 0. This now fixes an important
- performance bug that Amd was turning off the attribute caches even
- for regular (non-automounter) NFS mounts.
-
- * libamu/mtab.c (hasmntvalerr): new function to set the value of
- an option into an integer, but ONLY if that options was set and
- parsed correctly. This function returns 1 on error, 0 on success
- (instead of always setting the option value to 0).
- (hasmntval): wrapper function around hasmntvalerr, which maintains
- backwards compatibility (always sets option value to 0, even on
- error to parse the option).
-
- * amd/nfs_subr.c (fh_to_mp3): use long int printf format for
- fhh_pid.
-
-2006-04-05 Christos Zoulas <christos@zoulas.com>
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): fix use-after-free bug
- (Coverity).
-
-2006-03-27 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi, scripts/{amd.conf.5,amd.conf-sample}:
- document new nfs_retransmit_counter_toplvl and
- nfs_retry_interval_toplvl global amd.conf parameters.
-
- * amd/conf.c (gopt_nfs_retransmit_counter_toplvl,
- (gopt_nfs_retry_interval_toplvl): parse amd.conf
- nfs_retransmit_counter_toplvl and nfs_retry_interval_toplvl global
- parameters.
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount): support setting toplvl
- timeo/retrans parameters for Amd's toplvl mounts, separately from
- all other UDP or NFS mounts.
-
- * amd/amd.h: define a new timeo/retrans parameter for toplvl
- mounts.
-
-2006-03-22 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-suse10.1 (beta 8).
-
-2006-03-21 Christos Zoulas <christos@zoulas.com>
-
- * amd/am_ops.c (merge_opts): Remove useless check found by
- Coverity; xmalloc never returns NULL.
-
-2006-03-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: i386-pc-linux-fc5.
-
- * amd/info_ldap.c: as of Linux Fedora Core 5 (which comes with
- openldap-2.3.9), the ldap.h headers deprecate several functions
- used in this file, such as ldap_unbind. You get compile errors
- about missing extern definitions. Those externs are still in
- <ldap.h>, but surrounded by an ifdef LDAP_DEPRECATED. I am
- turning on that ifdef at the top of info_ldap.c, under the
- assumption that the functions may be deprecated, but they still
- work for this (older?) version of the LDAP API. It gets am-utils
- to compile, but it is not clear if it will work perfectly.
-
- * libamu/xdr_func.c (xdr_am_mountres3_ok), amq/amq_xdr.c
- (xdr_amq_mount_tree, xdr_amq_mount_tree_p,
- xdr_amq_mount_info_list, xdr_amq_mount_tree_list), amq/amq.c
- (show_mti), amd/amq_subr.c (xdr_amq_setopt, xdr_amq_mount_subtree,
- xdr_amq_mount_tree, xdr_amq_mount_tree_list, xdr_amq_mount_tree),
- libamu/xdr_func.c (xdr_am_mountres3_ok): use casing magic to stop
- GCC-4.1 from complaining about "dereferencing type-punned pointer
- will break strict-aliasing rules" here (but not elsewhere).
-
-2006-03-20 Christos Zoulas <christos@zoulas.com>
-
- * libamu/wire.c: avoid potential dereferencing of a NULL pointer
- (Coverity).
-
- * hlfsd/homedir.c (delay): remove unnecessary check for NULL
- pointer (Coverity).
-
- * fsinfo/fsi_analyze.c (analyze_dkmounts, analyze_mounts,
- analyze_mounts): avoid potential dereferencing of a NULL pointer
- (Coverity).
-
- * conf/transp/transp_sockets.c (create_amq_service): avoid
- potential dereferencing of a NULL pointer (Coverity).
-
- * amd/sched.c (sigchld): properly check for the end of the waiting
- process list (Coverity).
-
- * amd/mapc.c (mapc_create): initialize 'modify' to zero (Coverity).
-
- * amd/autil.c (amfs_mkcacheref, am_unmounted): avoid potential
- dereferencing of a NULL pointer (Coverity).
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): free def_opts before
- reusing it (memory leak bug detected by Coverity).
- (amfs_bgmount): avoid potential dereferencing of a NULL pointer
- (Coverity).
-
- * amd/am_ops.c (merge_opts): no need to check if newstr is NULL
- (bug detected by Coverity).
-
-2006-03-08 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/nfs_subr.c (mp_to_fh): fixed old-style filehandles--the pid
- comparison was failing.
-
-2006-03-08 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: properly test for either <gdbm/ndbm.h> or
- <gdbm-ndbm.h> (unfortunately, Autoconf will map both names to the
- same $ac_cv_* variable name). Some systems support one header or
- another. Patch inspired by work Debian did.
-
-2006-02-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1.4 ***
- *******************************************************************
-
-2006-01-04 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (auto_attrcache Parameter): revise discussion
- to mention pros and cons of turning on/off this parameter,
- including impact on Amd's performance, and ways to improve
- performance while minimizing the window of vulnerability in which
- kernel may return the wrong (cached) attributes.
-
-2006-01-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * updated copyright year to 2006 on all files.
-
-2005-12-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_utils.h, conf/transp/transp_tli.c (amu_svc_register,
- register_autofs_service): use a consistent prototype for the
- dispatch function of the autofs service de/registration functions.
-
-2005-12-03 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: i386-unknown-netbsdelf2.1,
- i386-unknown-netbsdelf3.0 (RELEASE), and i386-unknown-openbsd3.8.
-
-2005-12-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/check_field.m4: remove double inclusion of msdosfs
- headers, which are included in mount_header1.h (netbsd 2.1 doesn't
- protect <msdosfs/msdosfsmount.h> which causes compile errors).
-
-2005-11-08 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-unknown-freebsd6.0 (RELEASE)
-
-2005-10-26 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/amq_subr.c (amqproc_pawd_1_svc): repeatedly resolve path in
- Amd, not in pawd (to avoid repeated network RPCs).
-
- * amq/pawd.c (transform_dir): move repeated path resolution into Amd.
-
-2005-10-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amq/pawd.c (transform_dir): resolve path repeatedly until
- finished. Bug fix from Jonathan Chen <jon+amd-at-spock.org>.
- Added safety check to prevent infinite loops.
-
-2005-10-19 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (opts Option): document new pcfs options
- longname, nowin95, shortname, user=N, group=N, mask=N, and
- dirmask=N.
-
- * amd/ops_pcfs.c (mount_pcfs): process new pcfs options longname,
- nowin95, shortname, user=N, group=N, mask=N, and dirmask=N.
-
- * include/am_compat.h: provide compatibility mnttab string names,
- if needed, for pcfs mount options longname, nowin95, shortname,
- user=N, group=N, mask=N, and dirmask=N.
-
- * include/am_utils.h: extern for hasmntstr().
-
- * libamu/mtab.c (hasmntstr): new function to return the string
- value following a mount option, up to the next comma-delimited
- options.
-
- * configure.in: check for mnttab and pcfs options longname,
- nowin95, and shortname.
-
- * Makefile.am (EXTRA_DIST_M4): distribute new macro
- check_mnt2_pcfs_opt.m4.
-
- * m4/macros/check_mnt2_pcfs_opt.m4: new macro to check for pcfs
- mnttab and mount options.
-
-2005-10-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/mount_fs.c (print_nfs_args): print nfs_args->addr
- correctly, depending if it's a pointer or not.
-
- * conf/sa_dref/sa_dref_*.h: for each NFS_SA_DREF macro, also
- #define NFS_ARGS_T_ADDR_IS_POINTER if nfs_args->addr is a pointer
- or an embedded structure, so we can tell how to print it.
-
- * libamu/mount_fs.c (print_nfs_args): print nfs_args->addrlen
- field, if it exists.
-
- * configure.in: check for nfs_args->addrlen field.
-
- * wire-test/wire-test.c (main), libamu/mount_fs.c
- (print_nfs_args), fixmount/fixmount.c (inetresport,
- clnt_create_timeout), amq/pawd.c (transform_dir), amq/amq.c
- (main), amd/srvr_nfs.c (find_nfs_srvr), amd/autil.c
- (amfs_mount): document that as per POSIX, we don't need to set the
- sa_len/sin_len fields in struct sockaddr/sockaddr_in. The field
- is used only internally in the kernel. See
- www.awprofessional.com/articles/article.asp?p=169505&seqNum=2&rl=1
-
- * fixmount/fixmount.c (inetresport): initialize sockaddr_in
- structure before filling in some fields.
-
-2005-10-11 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (nfs_vers, nfs_proto parameters): clarify and
- correct mistaken description of nfs_proto.
-
-2005-10-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1.3 ***
- *******************************************************************
-
-2005-10-07 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/check_mnttab_type.m4: move the test for MOUNT_* to the
- very end, after the test using getvfsbyname().
-
- * m4/macros/expand_run_string.m4: if the string value returned is
- empty, consider it invalid.
-
- * m4/macros/check_varargs_macros.m4: rewrite macro so it'll
- try and compile the varargs test, not just cpp it. Some systems
- pass the old cpp test, but not when you actually try to compile
- the code (Tru64's cc).
-
- * conf/autofs/autofs_solaris_v1.h: redefine
- autofs_strdup_space_hack as a macro to str3cat(NULL,(s)," ","").
- This works everywhere and we avoid linking problems, inline
- functions, etc.
-
- * conf/autofs/autofs_solaris_v1.c (autofs_mount_fs): remove
- autofs_strdup_space_hack() function altogether.
-
- * m4/macros/os_cflags.m4: remove hack that hardcodes pte_t=u_int.
-
- * configure.in: test for <sys/immu.h> header.
- Test for pte_t, but only on IRIX6 systems.
-
- * Makefile.am (EXTRA_DIST_M4): distribute new type_pte_t.m4 file.
-
- * m4/macros/type_pte_t.m4: new test for existence of pte_t
- typedef, needed on some IRIX-6.5/gcc systems.
-
- * m4/macros/header_templates.m4: add missing templates for
- HAVE_EXTERN_GETDTABLESIZE, HAVE_EXTERN_GETWD, and
- HAVE_EXTERN_UALARM.
-
- * amd/info_exec.c (exec_map_open): break assignment from inside
- conditional, to work around an IRIX-6.5 cc bug.
-
- * fsinfo/fsi_util.c (set_ether_if), amd/map.c (unmount_mp),
- libamu/xutil.c (expand_error), libamu/strutil.c (xsnprintf): avoid
- comparison between signed and unsigned integers.
-
- * conf/autofs/autofs_solaris_v1.h, conf/autofs/autofs_solaris_v1.c
- (autofs_strdup_space_hack): move "space_hack" function from static
- inline in header, into the only source file that needs it. This
- is cleaner and also prevents linking problem with some compilers
- that won't apply CPP macros inside static inline functions (for
- the strl* functions).
-
- * amq/pawd.c (find_mt, find_mlp): remove obsolete, inefficient
- code.
- (transform_dir): call the new, efficient amqproc_pawd_1() routine.
-
- * amq/amq_clnt.c (amqproc_pawd_1): AMQPROC_PAWD wrapper routine.
-
- * amq/amq.h (amqproc_pawd_1): extern for amq's AMQPROC_PAWD
- wrapper routine.
-
- * amd/amq_svc.c (amq_program_1): dispatch point for
- amqproc_pawd_1_svc.
-
- * amd/amq_subr.c (amqproc_pawd_1_svc): moved pawd's path-matching
- functionality into Amd, where it can be done a lot more
- efficiently. We don't have to construct and ship a whole export
- tree from Amd to pawd. We just get a variable-length
- xdr_wrapstring for the user's path, iterate over the entire export
- list inside Amd, and return only a matched string if found
- (otherwise we return "" to indicate that there was no match, and
- let pawd printf the same string it sent over).
-
- * amd/amd.h: extern for amqproc_pawd_1_svc, amd's service routine
- the AMQPROC_PAWD RPC.
-
-2005-10-06 Erez Zadok <ezk@cs.sunysb.edu>
-
- * ltmain.sh, m4/macros/libtool.m4: update to libtool-1.5.20.
- Fixes Tru64 bugs when using ksh.
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount): break complex ifdef macro
- into two sections, to workaround a C99 varargs-macro bug in
- gcc-3.2.2 (RH9).
-
- * libamu/wire.c (print_wires): convert argument-less xsnprintf to
- xstrlcpy.
-
- * include/am_utils.h: use new HAVE_C99_VARARGS_MACROS or
- HAVE_GCC_VARARGS_MACROS to pass file name and line number to
- xsnprintf/xvsnprintf.
-
- * libamu/strutil.c (xsnprintf, xvsnprintf): if debugging is on,
- then also print the source file name and line number that called
- xsnprintf/xvsnprintf with a buffer that wasn't large enough (most
- likely an am-utils bug).
-
- * Makefile.am (EXTRA_DIST_M4): distribute new
- check_varargs_macros.m4 file.
-
- * configure.in: execute new AMU_VARARGS_MACROS test.
-
- * m4/macros/check_varargs_macros.m4: new test to check what style
- of variable-length argument macros, if any, does the
- compiler/pre-processor supports.
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_lookup_2_req)
- conf/autofs/autofs_solaris_v1.c (autofs_mount_1_req), amd/opts.c,
- amd/nfs_subr.c (nfsproc_lookup_2_svc), amd/nfs_start.c
- (mount_automounter), amd/get_args.c (get_args), amd/amfs_toplvl.c,
- amd/amfs_auto.c (amfs_auto_mount), amd/amd.h, amd/amd.c (main):
- use sizeof() instead of fixed SIZEOF_* macros.
-
- * libamu/strutil.c (xstrlcat, xstrlcpy), include/am_utils.h
- (DEBUG): if debugging is on, then also print the source file name
- and line number that called xstrl* with a buffer that wasn't large
- enough (most likely an am-utils bug)
-
- * include/am_compat.h (INADDR_NONE): define in a common location,
- if OS doesn't have it, use 0xffffffffU which should work with any
- ANSI compiler.
-
- * fixmount/fixmount.c, libamu/wire.c: remove local definition of
- INADDR_NONE.
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount), amd/amfs_auto.c
- (amfs_auto_mount): use common SIZEOF_OPTS in definition and call
- to autofs_get_opts.
-
- * amd/amd.h (SIZEOF_OPTS): moved #define to common header.
-
-2005-10-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/opts.c (expand_op): Need to check BUFSPACE for env for
- vlen+1. Likewise for cp and strlen(cp)+1.
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount) [HAVE_FS_AUTOFS]: Pass new
- size argument to autofs_get_opts.
-
-2005-10-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amq/pawd.c (transform_dir): was using UDP only. Now will also
- try TCP if UDP failed. Destroy client after use to avoid leftover
- TCP sockets in the kernel.
-
- * libamu/hasmntopt.c (amu_hasmntopt): increase size of MNTMAXSTR
- from 128 to to 256, because some users have really long option
- strings. Suggestion from jon+amd-at-spock.org.
-
- * amd/opts.c (expand_op): should check BUFSPACE for vlen+1, not
- just vlen. Bug discovered when started using xstrlcpy().
-
- * ALL: convert from using strcat to the safer xstrlcat, and from
- strcpy to safer xstrlcpy.
-
-2005-10-04 Erez Zadok <ezk@cs.sunysb.edu>
-
- * hlfsd/hlfsd.h: remove old fatalerror() and ERRM macros.
-
- * hlfsd/hlfsd.c (fatalerror): new function instead of macro.
- Easier to use xstrlcat in this new function.
-
- * amd/amd.h, include/am_utils.h, amd/amd.c: moved 'hostd' extern
- from am_utils.h to amd.h, and define its size as a macro that
- could be passed to xstrl*().
-
- * ALL: convert from using sprintf to the safer xsnprintf.
-
- * mk-amd-map/Makefile.am (LDADD): link with libamu to get
- xsnprintf().
-
- * amd/amd.h, amd/amd.c, include/am_utils.h: moved pid_fsname
- extern from am_utils.h to amd.h, and define its size as a macro
- that could be passed to xsnprintf().
-
-2005-10-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_utils.h: extern for xvsnprintf().
-
- * amd/autil.c: move strsplit() to libamu/strutil.c.
-
- * libamu/Makefile.am: use strutil.c, not util.c.
-
- * libamu/strutil.c: rename from util.c to explain better purpose
- of file. Move xvsnprintf and xsnprintf from xutil.c to this
- file. Sync up with 6.2 version of file.
-
- * libamu/xutil.c: explain purpose of file. Move mkdirs/rmdirs
- code from old util.c.
-
-2005-10-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/header_templates.m4: templates for FFS.
-
- * m4/macros/check_mnttab_type.m4: on BSD44 systems, check for file
- system mount table name via the MOUNT_* mount(2) macros (because
- BSD44 keeps the mount table in the kernel).
-
- * configure.in: synchronise order of searching for mnttab entries
- and mount names. The new order is "ext3 ext2 ffs ufs 4.2 4.3 4.4
- efs xfs jfs ultrix" (which would prefer ffs on BSD44 instead of
- ufs, and ext3 instead of ext2 on Linux).
-
- * include/am_defs.h: include <sys/statvfs.h> if it exists.
-
- * conf/nfs_prot/nfs_prot_netbsd1_4.h: NetBSD 3 has both statfs()
- and statvfs(), but the latter is preferred, so #define to use
- statvfs.
-
- * configure.in: check for statfs(), statvfs(), and
- <sys/statvfs.h>.
-
- * config.guess.long: strip trailing '.' on "netbsdelf3.0."
- (Beta). Workaround for bug in config.guess.
-
- * config.{guess,sub}: update to latest versions.
-
-2005-09-30 Christos Zoulas <christos@zoulas.com>
-
- * fsinfo/fsi_util.c (set_ether_if): use INADDR_NONE instead of
- hard-coded value of -1.
-
- * include/amq_defs.h (AMQ_STRLEN): increase default size from 2KB
- to 16KB. We can afford it these days.
-
- * libamu/strcasecmp.c (strcasecmp): use unsigned chars in
- tolower() to avoid sign/size promotion bugs.
-
- * libamu/xutil.c (switch_to_logfile): don't output to LOG_CONS by
- default (it's unfriendly). If user really wants to, they can set
- it in /etc/syslog.conf.
-
-2005-09-29 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amq/pawd.c (find_mt): if the auto mount type is used, pawd could
- go into an infinite loop since the mt_directory and mt_mountpoint
- fields are the same for auto mounts. Solution: ignore type auto
- mounts, similar to toplvl. Bug fix from Jonathan Chen
- <jon+amd@spock.org>.
-
- * README.attrcache: document test-attrcache script.
-
- * scripts/Makefile.am (noinst_SCRIPTS): build test-attrcache
- script.
-
- * configure.in: build scripts/test-attrcache script and chmod it
- so it can be executed in place.
-
- * scripts/test-attrcache.in: script to test the NFS attribute
- cache using Amd.
-
-2005-09-26 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/xutil.c (unregister_amq): repair broken meaning of D_AMQ,
- which was reversed in am-utils-6.2. Bug fix from Steve Plite
- <splite-amutils at sigint.cs.purdue.edu>.
-
- * hlfsd/stubs.c (nfsproc_getattr_2_svc, nfsproc_lookup_2_svc,
- nfsproc_readlink_2_svc, nfsproc_readdir_2_svc), hlfsd/hlfsd.c
- (hlfsd_init): use new clocktime() function.
-
-2005-09-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1.2.1 ***
- *******************************************************************
-
- * README.attrcache: Update status of freebsd and openbsd.
- Document netbsd's patchs to support noac.
-
- * libamu/mount_fs.c (compute_nfs_attrcache_flags): cleanup the
- code that sets the ac{reg,dir}{min,max} fields so it also sets the
- appropriate nfs_args->flags such as MNT2_NFS_OPT_ACREGMIN.
-
- * configure.in: check for nfs_args fields acregmax and acdirmax.
-
- *******************************************************************
- *** Released am-utils-6.1.2 ***
- *******************************************************************
-
- * README.attrcache: new file documenting in detail OS bugs
- relating to attribute caching, which can affect Amd's reliability
- under heavy load.
-
- * doc/Makefile.am: install README.attrcache file as attrache.txt
- file on am-utils Web site.
-
- * Makefile.am (EXTRA_DIST): include README.attrcache in distro.
-
- * BUGS, NEWS, doc/am-utils.texi (auto_attrcache Parameter),
- scripts/amd.conf.5, scripts/amd.conf-sample: document attribute
- cache bugs on some OSs.
-
-2005-09-17 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/xutil.c (clocktime): newly implemented routine. Uses
- gettimeofday() each time to return a high-resolution clock time,
- and does not "cache" the last time. Returns time in seconds, just
- like the old implementation. If passed a non-null argument, will
- fill it in with the current time in seconds+microseconds.
-
- * libamu/xutil.c: remove actual declaration of clock_valid, and
- another never-used declaration for xclock_valid.
-
- * include/am_utils.h: remove defunct definition of clocktime()
- macro and clock_valid variable. Add extern for new definition.
-
- * libamu/mount_fs.c (mount_fs), hlfsd/homedir.c (homedir,
- hlfsd_diskspace, hlfsd_getpwent, plt_reset, table_add),
- hlfsd/hlfsd.c (main, hlfsd_init, reload, cleanup),
- conf/mtab/mtab_mach3.c (open_locked_mtab), conf/mtab/mtab_file.c
- (open_locked_mtab), amd/nfs_start.c (do_select, run_rpc),
- amd/autil.c (host_normalize): remove defunct clock_valid.
-
- * amd/nfs_subr.c (nfsproc_getattr_2_svc): Print microseconds for
- node's mtime.
- (fh_to_mp3): use new clocktime() to update mtime and get a better
- time resolution.
-
- * amd/mapc.c (mapc_reload_map): change prototype from returning
- void to returning an int. If reloading was needed and succeeded,
- return 1; else return 0.
- (mapc_sync): update mtime of parent node if needed. This is a
- CRITICAL FIX, to ensure that the kernel flushes its DNLC/dcache
- when we run "amq -f" manually or when a map is reloaded.
-
- * amd/map.c (new_ttl): update am_ttl and na_atime in one shot.
- (init_map): use new clocktime().
- (unmount_mp): if the OS doesn't support a "symttl" option, then
- update the mtime of the parent node using the clocktime(); but if
- the time hasn't gotten changed because of rapid Amd accesses on
- systems that don't have a micro-second NFS-client resolution, then
- increment mtime by one arbitrarily (this could, on some systems
- and under pathological cases, result in mtime's that are in the
- future).
-
- * amd/autil.c (forcibly_timeout_mp): MAJOR BUG FIX: force mtime
- update of parent dir, to prevent DNLC/dcache from caching the old
- entry, which could result in ESTALE errors, bad symlinks, and
- more.
- (am_mounted): record mount time, and update am_stats at the same
- time, using the double-action redone clocktime() routine.
- (am_mounted): update parent's mtime from that of the child.
- (am_unmounted): when unmounting an entry, update mtime of parent
- node.
-
- * amd/amfs_generic.c (amfs_bgmount): now that clocktime() doesn't
- remember it's last non-zero value, save it in a temporary variable
- to avoid a TOCTOU problem (between an "if" and a "dlog").
-
- * libamu/xutil.c (show_time_host_and_name),
- conf/autofs/autofs_linux.c (autofs_mounted, autofs_timeout_mp),
- amd/srvr_nfs.c (nfs_keepalive_callback, nfs_keepalive_timeout)
- (find_nfs_srvr), amd/rpc_fwd.c (fwd_alloc), amd/nfs_subr.c
- (nfsproc_getattr_2_svc), amd/nfs_start.c (do_select, run_rpc),
- amd/mapc.c (root_init), amd/map.c(map_flush_srvr, timeout_mp),
- amd/info_ndbm.c (ndbm_init), amd/info_ldap.c (amu_ldap_rebind),
- amd/info_file.c (file_open), amd/info_exec.c (fgets_timed,
- exec_search), amd/clock.c (timeout, softclock), amd/autil.c
- (forcibly_timeout_mp), amd/amfs_generic.c (amfs_retry,
- amfs_bgmount, amfs_generic_mount_child), amd/amd.c (main): pass
- NULL to clocktime().
-
-2005-09-07 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: powerpc-apple-darwin8.2.0.
-
- * m4/macros/type_auth_create_gidlist.m4: Old macosx used "gid_t"
- but all newer ones (10.4+) use int.
-
- * m4/macros/type_recvfrom_fromlen.m4: Old macosx used "int" for
- 6th arg of recvfrom(), but all newer ones (10.4+) use socklen_t.
-
- * minor new port: i386-pc-linux-deb3.1.
-
-2005-09-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/mount/mount_linux.c: If autoconf didn't find any disk-based
- file system on this system (probably because /proc isn't mounted),
- then provide some default definition for this file to compile.
-
-2005-08-27 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Makefile.am (DISTCLEANFILES): also remove amu_autofs_prot.h,
- config.cache.old, and dbgcf.h on "make distclean".
- (CLEANFILES): remove dbgcf on plain "make clean".
-
- * amd/Makefile.am (DISTCLEANFILES): also remove ops_autofs.c on
- "make distclean".
-
-2005-08-24 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: wrap all LDAP and HESIOD tests in test whether
- --with-OPT was used.
-
-2005-08-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: sinclude([vers.m4]) version number file.
-
- * vers.m4: new file to separate version number out of
- configure.in, useful for nightly snapshot script to generate
- nightly version string.
-
- * Makefile.am (EXTRA_DIST_M4): include vers.m4 in distro.
-
-2005-08-11 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: keep AC_INIT on same line, for nightly snapshot
- build script.
-
-2005-08-06 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf.5: selectors_in_defaults is a common parameter,
- not just [global]. Use consistent capitalization of Amd/Amq.
-
- * scripts/amd.conf-sample: properly list all of the parameters
- which are common to both the [global] and the per-map sections.
-
- * doc/am-utils.texi (Common Parameters): selectors_in_defaults is
- a common parameter, not just [global].
-
- * scripts/amd.conf-sample (sun_map_syntax): example of new flag.
-
- * cvs-server.txt: update instructions after branching 6.1-stable.
-
-2005-08-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1.1 ***
- *******************************************************************
-
- * libamu/xutil.c (xsnprintf): "unsafe" alternative to vsnprintf is
- vsprintf, not sprintf.
-
- * conf/umount/umount_osf.c (umount_fs): refer to proper formal
- parameter name.
- (umount2_fs): pass second arg to umount().
-
- * ALL: remove CVS ID and put actual file name in source.
-
- * conf/autofs/*.[hc]: proper copyright headers.
-
- * whitespace reformatting. Remove remaining '%W%' SCCS IDs.
-
- * amd/mntfs.c (free_mntfs): don't discard the last reference to an
- mntfs that had been mounted already. It won't have the
- MFF_RESTARTED flag on, as it gets turned off after the entry is
- mounted, but it will have the MFF_RSTKEEP flag on.
-
- * amd/autil.c (mf_mounted), amd/restart.c (restart_fake_mntfs):
- show the mntfs's flags.
-
-2005-08-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/mtab/mtab_linux.c: removed unused code. Cleanup.
- (handler): removed this bad signal handler.
- (lock_mtab): Redhat's original code set a signal handler called
- "handler()" for all non-ALRM signals. The handler called
- unlock_mntlist(), plog'ed the signal name, and then exit(1)!
- Never, ever, exit() from inside a utility function. This messed
- up Amd's careful signal-handling code, and caused Amd to abort
- uncleanly only any other "innocent" signal
- (even simple SIGUSR1), leaving behind a hung Amd mnt point. That
- code should have at least restored the signal handlers' states
- upon a successful mtab unlocking. Anyway, that handler was
- unnecessary, because will call unlock_mntlist() properly anyway on
- exit.
-
- * conf/mtab/mtab_{file,isc3,mach3,linux}.c (unlock_mntlist): dlog
- message that we're inside the unlock_mntlist function.
-
- * amd/amd.c (main): use new setup_sighandler() for Amd's four main
- signals (INT, TERM, HUP, and CHLD).
- (main) Add SIGINT and SIGTERM to masked_sigs, used in
- nfs_start.c:do_select() for setjmp/longjmp code; the MASK was set
- to all four signals if !HAVE_SIGACTION, but only to HUP+CHLD if we
- HAVE_SIGACTION. So this change makes Amd behave consistently.
-
- * include/am_utils.h: extern for new setup_sighandler().
-
- * libamu/xutil.c (setup_sighandler): new utility function to setup
- a single signal-handler regardless of what method is supported by
- this OS.
- (going_down): call unlock_mntlist() when exiting, to ensure that
- Amd will remove any leftover mtab lock files, if any.
-
- * amd/restart.c (restart_automounter_nodes): cleanup function.
-
- * minor new port: i386-pc-linuxoldld-deb3.1.
-
- * configure.in: include <sys/types.h> before <linux/socket.h> to
- get the definition of size_t on Debian-3.1r0a.
-
-2005-07-29 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/srvr_nfs.c (find_nfs_srvr): don't blindly copy the hostent
- IP address. First check if it differs from the existing one of
- the fserver, and copy only if it changed. If it did change, flush
- the fhandle cache to avoid a stale fhandle being reused. This
- allows Amd to detect IP address changes even for an fserver that
- lost one or more NFS pings, but not enough to be declared totally
- down. We handle the "totally down" fserver case in
- check_fs_addr_change().
-
- * amd/ops_nfs.c (nfs_umount), amd/sched.c (sched_task),
- amd/nfs_subr.c (nfs_quick_reply): code clarity.
-
- * conf/mount/mount_linux.c (linux_nfs_error): dlog mappings of
- errnos to NFS errors.
-
- * conf/umount/umount_linux.c (umount2_fs): cleanup code. Trying
- stat() seems doomed to hang at times, so don't try stat at all,
- because umount2() appears to be clever enough to never hang.
-
-2005-07-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/amd.h (FSF_FORCE_UNMOUNT): new flag used to indicate that a
- particular fserver may need forced/lazy unmounts when it's mntfs's
- are unmounted.
-
- * amd/ops_nfs.c (nfs_umount): a simple unmount returned EBUSY, and
- the user specified forced_unmounts=yes in amd.conf, and this
- fserver was flagged with FSF_FORCE_UNMOUNT, and the OS supports
- forced/lazy unmounts, then try forced/lazy unmounts. This should
- allow a hung mount point to be removed.
-
- * amd/srvr_nfs.c (find_nfs_srvr): move away IP-address change
- detection code to its own function.
- (check_fs_addr_change): new function to detect if the IP address
- of a downed host has changed, and do various cleanups and fixups
- to try and recover as best from that situation (e.g., flushing
- various caches). Also set the FSF_FORCE_UNMOUNT flag for the
- fserver in question.
- (flush_srvr_nfs_cache): pass fserver as argument, so we can
- selectively flush the NFS cache for a single fserver (or all of
- them, if you pass NULL).
-
- * libamu/xutil.c (switch_to_logfile): truncate a regular-file log
- file if user passed non-zero "truncate_log" flag.
-
- * include/am_utils.h: switch_to_logfile() now takes a 3rd arg.
-
- * amd/get_args.c (get_args): pass "truncate_log" flag as per
- amd.conf global settings.
-
- * amd/conf.c (gopt_truncate_log): store global value of
- truncate_log flag.
-
- * amd/amq_subr.c (amqproc_setopt_1_svc), hlfsd/hlfsd.c (main,
- reload): don't truncate log file when calling switch_to_logfile().
-
- * amd/amd.h (CFM_TRUNCATE_LOG): new flag. Fix comment typo.
-
- * NEWS, doc/am-utils.texi (truncate_log Parameter),
- scripts/amd.conf.5, scripts/amd.conf-sample (log_file): document
- new truncate_log amd.conf parameter.
-
- * amd/conf.c (gopt_forced_unmounts): check Linux kernel version
- and alert if your version may be too old for MNT_FORCE to work
- (before 2.4.0) or for MNT_DETACH to work (before 2.6.0).
- Otherwise it may be impossible to pin down the exact kernel
- version in which we should enable this feature.
-
- * conf/umount/umount_linux.c (umount2_fs): if MNT_FORCE returned
- EBUSY, then don't try to stat(2) before MNT_DETACH because it
- could hang.
-
-2005-07-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/umount/umount_linux.c (umount_fs): cleanup this function,
- breaking long "if" statements using "goto out".
-
- * conf/umount/umount_{aix,bsd44,osf,default,linux}.c (umount_fs):
- call new utility function umount2_fs() as needed (EBUSY, EIO, or
- ESTALE).
-
- * conf/umount/umount_{aix,bsd44,osf,default,linux}.c (umount2_fs):
- define a new utility function to invoke forcible/lazy unmounts
- without touching any mtab files. This separate utility function
- is useful because it can be called from elsewhere.
-
- * amd/amfs_toplvl.c (amfs_toplvl_init): new function, called
- before Amd mounts toplvl mounts, which gives us a hook for cleanup
- of a previously dead Amd. In our case, if the user asked for
- forced_unmounts, and the OS supports it, then we try forced/lazy
- unmounts on any previous toplvl mounts. This is useful if a
- previous Amd died and left behind toplvl mount points (this Amd
- will clean them up!). WARNING: Don't use forced/lazy unmounts if
- you have another valid Amd running, because this code WILL force
- those valid toplvl mount points to be detached as well!
-
- * amd/amfs_toplvl.c (amfs_toplvl_umount): don't unconditionally
- try forced/lazy unmounts because it will prevent a normal Amd from
- terminating and cleaning up properly (self-deadlocking: detached
- mounts hang the parent Amd on a stat). Since we already do
- unmounts in the background, then try a safer policy: after trying
- the normal unmounts a few times (5 sec), escalate and try forced
- unmounts a few times (5 more seconds), and if even that failed,
- then try the ultimate -- detached unmounts (which always succeed).
- This allows Amd to first try and shutdown cleanly, and gradually
- try more forcible ways to shutdown. On Linux, this procedure will
- cleanly shutdown Amd even if there are processes with their CWD on
- Amd's mount points (which normally result in EBUSY).
-
-2005-07-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Makefile.am (EXTRA_DIST_CONF): add new umount_aix.c to distro.
-
- * conf/umount/umount_aix.c: easier if AIX has its own unmount
- helper file.
-
- * m4/macros/check_umount_style.m4: AIX needs its own unmount style
- file.
-
- * doc/am-utils.texi (forced_unmounts Parameter): @xref -> @pxref.
-
-2005-07-19 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_aix5_2.h: define compatible
- forced-unmount flag.
-
- * conf/umount/umount_default.c (umount_fs): if regular umount got
- EBUSY, EIO, or ESTALE, then try forced unmount, if supported. Try
- umount2 (Solaris) or uvmount (AIX).
-
- * conf/umount/umount_{bsd44,osf}.c (umount_fs): if default
- umount() failed with EIO or ESTALE, also try forced unmount.
-
-2005-07-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/autil.c (amfs_mount), amd/amfs_toplvl.c
- (amfs_toplvl_umount): enable forced/lazy unmounts only if user
- asked for it (and dlog it).
-
- * scripts/amd.conf.5: document new force_unmount global parameter.
-
- * doc/am-utils.texi (forced_unmounts Parameter): document new
- global parameter.
-
- * amd/conf.c (gopt_forced_unmounts): process forced_unmounts
- option (default "no"). Exit with an error if user specified the
- option as "yes" but configure couldn't find support for either the
- MNT_FORCE or MNT_DETACH flags.
-
- * scripts/amd.conf-sample (forced_unmounts): example usage of new
- option.
-
- * amd/amd.h (CFM_FORCED_UNMOUNTS): new flag for forced_unmounts
- option.
-
- * m4/macros/header_templates.m4: templates for _DETACH and _FORCE.
-
- * configure.in: check for generic u/mount options "detach" and
- "force".
-
- * include/am_utils.h (UMOUNT_FS, umount_fs): new prototypes.
- Define AMU_UMOUNT flags for force, detach, and autofs.
-
- * amd/amfs_toplvl.c (amfs_toplvl_umount): pass _FORCE and _DETACH
- unmount flags unconditionally. Pass them to UMOUNT_FS().
-
- * conf/nfs_prot/nfs_prot_linux.h: define MNT_FORCE and MNT_DETACH
- if needed, because some Linux systems don't define them
- (presumably because it would be too dangerous to expose these
- flags to users).
-
- * amd/autil.c (amfs_mount): if mount(2) failed with ESTALE or EIO,
- then assume that we're in trouble, possibly because a previous
- mount is hung. So, first try to force a lazy unmount of the old
- mount. If the forced unmount worked, then try again to mount the
- desired file system. If the forced unmount failed, then don't
- retry: just return an error.
-
- * amd/amfs_generic.c (amfs_generic_umount), amd/amfs_host.c
- (amfs_host_umount), amd/ops_cachefs.c (cachefs_umount),
- amd/ops_cdfs.c (cdfs_umount), amd/ops_efs.c (efs_umount),
- amd/ops_lofs.c (lofs_umount), amd/ops_nfs.c (nfs_umount),
- amd/ops_pcfs.c (pcfs_umount), amd/ops_ufs.c (ufs_umount),
- amd/ops_xfs.c (xfs_umount), conf/umount/umount_bsd44.c
- (umount_fs), conf/umount/umount_default.c (umount_fs),
- conf/umount/umount_linux.c (umount_fs), conf/umount/umount_osf.c
- (umount_fs): compute and use unmount specific flags.
-
-2005-07-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * configure.in: better help for users, if nfs_args can't be found.
-
-2005-07-15 Erez Zadok <ezk@cs.sunysb.edu>
-
- * BUGS: more details on AIX's need to install bos.net.nfs.adt
- before configuring am-utils (else configure cannot find struct
- nfs_args on AIX).
-
-2005-07-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/srvr_nfs.c (find_nfs_srvr): flush NFS handle cache if the IP
- address of a down server had changed.
-
- * amd/info_union.c (union_reload): use safer xsnprintf() routine.
-
- * amd/srvr_nfs.c (find_nfs_srvr): check to see if the IP address
- of a named but down fserver changed (i.e., the previous IP address
- is no longer responding). If so, then reset the fserver to the
- new IP address, and set the fserver's flags such that the function
- will fall through to doing the usual NFS version/proto checks and
- pinging. (This should fix one case of bug #308.)
-
- * conf/umount/umount_linux.c (umount_fs): warn if plain umount()
- failed, before we try to ignore any errors or try optional
- umount2(), possibly with forced/lazy unmount.
- (umount_fs): dlog when unmount succeeded.
-
-2005-07-08 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/mount/mount_linux.c: add a couple more NFSv2 error codes
- that are compatible with NFSv3.
-
-2005-07-07 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/header_templates.m4: extern template for strlcat().
-
- * amd/get_args.c (get_version_string): use safer strlcat (or
- replacement strlcat). Use new wrapper xsnprintf() function, which
- will use the safer vsnprintf() if available, else default to plain
- sprintf.
-
- * configure.in: check for existence of strlcat() and its extern,
- replacing with libamu/strlcat.c as needed.
-
- * libamu/Makefile.am (EXTRA_DIST): add strlcat.c to distro.
-
- * include/am_defs.h: optional strlcat() extern.
-
- * include/am_utils.h: extern for new xvsnprintf().
-
- * configure.in: overdue new major libtool shlib version.
- Check for snprintf function and extern.
-
-2005-07-06 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_aix4_3.h: cleanup struct
- aix4_nfs_args_bis.
-
- * Makefile.am (EXTRA_DIST_CONF): include mount_aix3.c in
- distribution.
-
- * conf/mount/mount_aix.c: mount style for aix 5.x and newer.
-
- * conf/mount/mount_aix3.c: mount styles for aix 3.x/4.x.
-
- * m4/macros/check_mount_style.m4: split mount styles for
- aix3.x/4.x and the newer (and better) aix 5.x code.
-
-2005-07-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amq/pawd.c (getawd): avoid buffer overflow. Bug fix from Graeme
- Wilford <G.Wilford@surrey.ac.uk>.
-
-2005-06-30 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/map.c (get_next_exported_ap): Avoid running off the end of
- the exported_ap[] array. Patch from jon+amd-at-spock.org. Fixed
- bug #301.
-
-2005-06-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Makefile.am (EXTRA_DIST_CONF): distribute new mtab_linux.c.
-
- * conf/mtab/mtab_linux.c (rewrite_mtab): variable declarations
- must come before C code.
-
- * conf/mtab/mtab_linux.c: Linux-specific mount table hanlding
- that's safe (uses locks, handles symlinks to /proc/mounts, etc.).
- Patch from Red Hat, which they adapted from mtab_file.c. Minor
- fixes to this file.
-
- * m4/macros/check_mnttab_style.m4: Use Linux-specific mount table
- handling.
-
-2005-06-24 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/mount/mount_aix.c (mount_aix3): minor cleanup of filehandle
- copying code.
-
-2005-06-23 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_hpux.h: add extern for h_errno, which may
- be missing from older hpux10 systems.
-
- * configure.in: update bug-reporting address to list
- https://bugzilla.am-utils.org/ as well as the mailing list.
-
- * Makefile.am (EXTRA_DIST_M4): distribute new type_rpcvers_t.m4
- macro.
-
- * conf/transp/transp_tli.c (get_nfs_version): always use
- rpcvers_t, now that it'll be automatically discovered.
-
- * configure.in: check for rpcvers_t type.
-
- * m4/macros/type_rpcvers_t.m4: new macro to check for type of
- rpcvers_t (Some Solaris versions need it).
-
- * conf/nfs_prot/nfs_prot_sunos5_8.h: don't define INADDR_NONE
- here, but in the actual source files that may need it.
-
- * libamu/wire.c (INADDR_NONE): define INADDR_NONE if not defined
- already.
-
- * include/am_defs.h: define extern for sleep(3) if needed.
-
- * m4/macros/header_templates.m4: template for sleep(3) extern.
-
- * configure.in: check for extern for sleep(3), which is missing
- from some old (and buggy) versions of gcc's fixinc'ed headers.
-
- * conf/nfs_prot/nfs_prot_aix4_3.h: update definition of struct
- nfs_args from actual system headers.
-
- * conf/mount/mount_aix.c (mount_aix3): fix name of aix4 "bis"
- structure.
-
-2005-06-22 Erez Zadok <ezk@cs.sunysb.edu>
-
- * BUGS: update Solaris information about use of f/lex and
- yacc/bison.
-
-2005-06-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-suse9.3.
-
-2005-06-20 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * configure.in (linux/nfs_mount.h): Move __KERNEL__ definition up
- so u32 is available for <linux/sunrpc/msg_prot.h>.
-
-2005-06-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/mapc.c (maptypes): move MAP_EXEC after MAP_FILE, because
- exec maps will always match when users use amd with command line
- args (not amd.conf). Using that legacy way, unfortunately, means
- that Amd will use it's hard-coded info-service search path, which
- doesn't work for everyone. It's much better to use amd.conf and
- specify what you want exactly.
-
-2005-06-15 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-fc4 (gcc4 catches more bugs).
-
- * m4/macros/type_recvfrom_fromlen.m4: linux systems use unsigned
- int as the type of recvfrom()'s 6th argument.
-
- * m4/macros/type_yp_order_outorder.m4: linux systems use unsigned
- int as the type of yp_order()'s 3rd argument.
-
-2005-06-15 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf-sample (map_type): typo, said mount_type
- instead of map_type for the 'exec' example.
-
-2005-06-11 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1 ***
- *******************************************************************
-
-2005-06-04 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/ops_nfs.c (mount_nfs_fh): set timeo/retrans mount options
- only if the user specified them in amd.conf or elsewhere. If they
- were not specified, don't do anything, which would let the OS use
- its own defaults.
-
- * amd/get_args.c (get_args): negative timeo/retrans are "good" in
- that they represent uninitialized values (meaning to let the OS
- use it's default values). So only check if user specified a value
- equal to zero (invalid).
-
- * amd/amd.h: define AMU_TYPE_NONE so we know when users didn't
- specify timeo/retrans at all.
-
-2005-06-03 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1-rc7 ***
- *******************************************************************
-
- * m4/macros/os_cflags.m4 (CFLAGS): use custom-OS C flags for
- configuring, not just for building. That way the two phases
- (configure and compile) are in sync. This fixes getwire() on
- OSF/1 systems.
-
- * conf/nfs_prot/nfs_prot_sunos5_8.h: define INADDR_NONE if not
- defined in system headers.
-
-2005-06-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/Makefile.am (EXTRA_DIST): remove alloca.c as it's no
- longer needed.
-
-2005-05-28 Erez Zadok <ezk@cs.sunysb.edu>
-
- * completed set of fixes for irix6.5.
-
- * Minor new ports alpha-unknown-linux-gentoo1.4.16
- alphaev56-dec-osf4.0f, mips-unknown-linux-gentoo1.4.16, and
- sparc64-unknown-linux-gentoo1.4.16, and mips-sgi-irix6.5. Test
- those systems with both cc and gcc, where possible.
-
- * include/am_xdr_func.h: remove trailing comma at end of enum
- list.
-
- * m4/macros/os_cflags.m4: with gcc 3.4.3 on irix-6.5, we get pte_t
- undefined. So give it a dummy value.
-
- * libamu/alloca.c: remove file from distro.
-
- * configure.in: don't call AC_FUNC_ALLOCA any more.
-
- * include/am_defs.h: remove header fixups for <alloca.h>, now that
- we don't need it.
-
- * amd/amq_svc.c (amqsvc_is_client_allowed): rewrite function to
- avoid only use of alloca() in am-utils, and to use strdup
- explicitly. This way we can avoid using alloca, a feature that's
- not portable on various systems.
-
- * amq/amq.c: remove unused lint/rcsid cruft.
-
-2005-05-27 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/checkmount/checkmount_osf.c (fixmount_check_mount): add
- extra parentheses around assignments in "if" expressions (gcc
- complains).
-
- * conf/nfs_prot/nfs_prot_osf4.h: add missing extern definitions
- for plock, hstrerror, getmntinfo, alloca, xdr_exportnode, and
- xdr_groups.
-
- * configure.in: check for <linux/socket.h>, which, if found,
- appears to be preferable to <sys/socket.h>. Use it to find
- <linux/nfs_mount.h>. On some Linux systems
- (Gentoo), both exist but only one must be included, or else you
- get redefined structure errors.
-
- * libamu/wire.c (is_network_member): check if masknum is
- INADDR_NONE, not "< 0" because it's an unsigned quantity.
-
- * libamu/util.c (xstrlcpy): remove useless test for size_t < 0,
- because it's an unsigned quantity.
-
-2005-05-26 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1-rc6 ***
- *******************************************************************
-
-2005-05-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_aix5_2.h: AIX 5.3 complains about
- missing definition of struct thread_credentials in <sys/vfs.h>
- but trying to bring that definition in drags a whole lot of other
- messy stuff. So just provide a dummy definition for this
- structure.
-
-2005-05-24 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Makefile.am (EXTRA_DIST_M4): distribute m4/macros/libtool.m4.
-
- * m4/macros/header_templates.m4: template for HAVE_EXTERN_MNTCTL.
-
- * m4/macros/check_extern.m4: include <sys/vmount.h> on AIX
- systems, so we can find extern definition for mntctl().
-
- * conf/mtab/mtab_aix.c, conf/checkmount/checkmount_aix.c: only
- define an extern for mntctl() if needed.
-
- * amd/ops_nfs.c (prime_nfs_fhandle_cache): never, ever, use C++
- style comments in C code. Some C compilers don't accept it.
-
- * amd/info_ldap.c (amu_ldap_init, get_ldap_timestamp): force cast
- of "time_t *ts" to u_long, to avoid complaints on AIX 5.2 with
- xlC.
-
- * amd/get_args.c: rename symbol conf_file to amu_conf_file to
- avoid conflict with libldap.a from openldap-2.0.21 on AIX 5.2.
- Oh, when will people who develop libraries learn to always prefix
- their exported symbols with a library-specific name?
-
- * configure.in: check for mntctl() extern on AIX systems.
-
- * ltmain.sh: update from latest libtool-1.5.18, so we can properly
- build on AIX 5.2/5.3 with cc and with gcc.
-
- * m4/macros/libtool.m4: update from latest libtool-1.5.18. This
- time, and from now on, we must include libtool.m4 from the libtool
- distribution itself. That way we ensure that we use an ltmain.sh
- that matches the appropriate libtool M4 macros. This makes
- am-utils no longer dependent on having libtool installed on a
- given system on which you run bootstrap.
-
-2005-05-23 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-deb3.0.
-
-2005-05-22 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: i386-unknown-netbsdelf2.0.2 and
- i386-unknown-openbsd3.7.
-
-2005-05-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: i386-pc-linux-gentoo1.4.16 and
- powerpc-unknown-linux-yellowdog2.3.
-
- * include/{mount_headers2.h, am_defs.h}: safer setup before
- inclusion of <linux/nfs_mount.h>, which is broken on several
- systems.
-
- * configure.in: test for <linux/nfs2.h>. Separate special test
- for <linux/nfs_mount.h> because we need to define __KERNEL__ for
- that test, as well as optionally define struct nfs2_fh for some
- systems (gentoo with 2.4 kernel, yellowdog 2.3, and others).
-
- * config.guess.long: support Gentoo and Yellow Dog Linux distros.
-
-2005-05-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: i386-pc-linux-suse9.2 and
- i386-unknown-freebsd5.4.
-
- * amd/nfs_subr.c: use NFS_FHSIZE, not FHSIZE.
-
-2005-05-17 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1-rc5 ***
- *******************************************************************
-
- * amd/info_ldap.c (amu_ldap_init): change plog to dlog, to avoid
- sending annoying warning for a minor issue.
-
-2005-05-17 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/nfs_subr.c: check for NULL pointer before dereferencing it.
-
-2005-05-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: powerpc-apple-darwin7.9.0.
-
- * m4/macros/host_macros.m4: if a NetBSD system, remove 'elf' part
- from OS name because it's no longer relevant. Also, don't include
- the major OS version number in the OS name because that's also
- unnecessary (and users can always use $osver in maps).
-
- * amd/nfs_subr.c: use [1] for out-of-band pointer at the end of
- struct am_fh, because it's the most portable method. Bug fix
- suggestion from Dan Riley <dsr at mail.lns.cornell.edu>. Better
- fix from Ion Badulescu: use [FHSIZE-sizeof(u_int)] which is the
- actual size we use.
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): reset currently used
- def_opts to options given in -opts, appended with the /default
- options. Bug fix suggestion from Dan Riley <dsr at
- mail.lns.cornell.edu>.
-
-2005-05-13 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1-rc4 ***
- *******************************************************************
-
-2005-05-11 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * amd/amd.c (main) : fixed memory leak detected by valgrind
-
- * amd/info_ldap.c (amu_ldap_init) : fixed memory leak detected by
- valgrind
-
-2005-05-11 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/{check_checkmount_style.m4, check_mnttab_style.m4,
- check_nfs_fh_dref.m4, check_nfs_prot_headers.m4,
- check_nfs_sa_dref.m4, check_umount_style.m4, os_cflags.m4}: check
- for "macosx" as valid OS string, so we compile properly on Darwin
- systems.
-
- *******************************************************************
- *** Released am-utils-6.1-rc3 ***
- *******************************************************************
-
- * rerun bootstrap to get a working configure script that actually
- checks for limits.h and dependent linux autofs/nfs headers.
-
- * configure.in: remove redundant check for limits.h.
-
-2005-05-09 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1-rc2 ***
- *******************************************************************
-
-2005-05-08 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): removed redundant use of
- old_def_opts variable.
-
-2005-05-08 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * amd/amfs_generic.c (amfs_lookup_mntfs) : Make sure when a map
- entry has a single dash '-', that the default options are reset.
- This functionality was somehow lost from earlier releases and
- reported by Dan Riley <dsr@mail.lns.cornell.edu>.
-
-2005-05-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * config.guess.long: detect SuSE Enterprise Server and call it
- "sles" not "suse".
-
-2005-05-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (amd): document proper use of
- /etc/hosts.allow. Don't spawn a new Amd process because Amd will
- get confused if someone else waitpid's on its children (which
- often do important un/mount work). Issue reported by Francis
- Montagnac <Francis.Montagnac at sophia.inria.fr>.
-
- * minor new ports: powerpc64-unknown-linux-rhel4, and
- powerpc64-unknown-linux-sles9.
-
-2005-05-01 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * amd/amfs_host.c (amfs_host_umount): We do not want to pass
- ENOENT as an error because if the directory does not exists our
- work is done anyway.
-
- * conf/umount/umount_linux.c (umount_fs): If we are successful or
- there was an ENOENT, remove the mount entry from the mtab file.
-
-2005-05-01 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/nfs_subr.c: am_fh definition moved here from amd.h;
- restructured to better reflect its duality (old/new filehandles)
- (fh_to_mp3): fhh_gen is always used, even for new style f/h
- (mp_to_fh): ditto
-
- * amd/amd.h: moved am_fh definition to nfs_subr.c (which is the
- only place where it's used)
-
-2005-04-30 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/host_macros.m4: use sw_vers on Apple machines to find
- out more appropriate OS name (macosx) and OS version (10.3.x) than
- uname(3) reports.
-
-2005-04-29 Erez Zadok <ezk@cs.sunysb.edu>
-
- * config.guess, config.sub, doc/texinfo.tex: updates from latest
- official GNU distributions.
-
- * m4/macros/host_macros.m4: for macosx, change architecture value
- from "Power Macintosh" to "powerpc".
-
- * libamu/util.c (xstrlcpy): format 'len' parameter as u_long, not
- int (it's a size_t).
-
-2005-04-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf.5, doc/am-utils.texi (normalize_slashes
- Parameter), scripts/amd.conf-sample: document new
- normalize_slashes global configuration parameter.
-
- * amd/opts.c (deslashify, normalize_slash): don't touch trailing
- slashes, even if multiples of them, if user said
- normalize_slashes=no in amd.conf.
-
- * amd/conf.c (gopt_normalize_slashes): new function to record if
- to normalize slashes or not.
-
- * amd/amd.h (CFM_NORMALIZE_SLASHES): new flag to decide if to
- normalize double-slashes or not ("yes" by default).
-
- * amd/autil.c (am_mounted): pass TRUE when calling mf_mounted.
- This is the parent mntfs which does the mf->mf_fo
- (am_opts type), and we're passing TRUE here to tell mf_mounted to
- actually free the am_opts.
-
- * amd/autil.c (mf_mounted): Be careful when calling free_ops and
- XFREE here. Some pseudo file systems like nfsx call this
- function, even though it would be called by the lower-level amd
- file system functions. nfsx needs to call this function because
- of the other actions it takes. So we pass a boolean from the
- caller (yes, not so clean workaround) to determine if we should
- free or not. If we're not freeing (often because we're called
- from a callback function), then just to be sure, we'll zero out
- the am_opts structure and set the pointer to NULL. The parent
- mntfs node owns this memory and is going to free it with a call to
- mf_mounted(mntfs,TRUE).
-
- * amd/amd.h: pass flag to mf_mounted, to free or not to free the
- am_opts.
-
- * amd/amfs_nfsx.c (amfs_nfsx_cont): call mf_mounted with FALSE to
- tell it not to free the am_opts, to avoid double free.
-
- * include/am_defs.h: include limits.h if found.
-
- * configure.in: check for limits.h. Check for certain Linux
- headers such as auto_fs.h after checking for limits.h, and include
- the latter if it exists, because some Linux headers depend on
- limits.h. This prevents warnings during configure time.
-
-2005-04-12 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount): do NOT set retrans/timeo
- values from default global UDP settings, because it can cause
- unexpected timeouts in Amd on slow systems. The default that each
- OS provides for these toplvl NFS mounts should be OK, or else you
- can use the map_options entry.
-
-2005-04-09 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * amd/nfs_subr.c (mp_to_fh): Replace xstrlcpy with memcpy because the
- source buffer is treated more as a filehandle than a string.
-
- * amd/nfs_subr.c (fh_to_mp3): Replace xstrlcpy with memcpy because the
- source buffer is treated more as a filehandle than a string.
-
- * amd/opts.c (free_op): No longer need to assign pointer to NULL
- after XFREE.
-
- * amd/opts.c (expand_op): Revert back to using strncpy() instead
- of xstrlcpy. The code is correct and relies on the semantics of
- strncpy.
-
- * libamu/mount_fs.c (compute_nfs_args): Leave XXX warning that use
- of xstrlcpy in NFS_HN_DREF may corrupt a struct nfs_args, or
- truncate our concocted "hostname:/path" string prematurely if the
- nap->hostname field is ever less than 64 bytes long
- (MAXHOSTNAMELEN).
-
- * libamu/util.c (xstrlcpy): Return immediately if len is 0 to
- avoid unnecessary work. Log an error and return if len is less
- than 0.
-
-2005-04-07 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_utils.h (XFREE): XFREE() should nullify the pointer
- even when compiling without debugging. It's safer this way.
-
- * libamu/xutil.c (am_set_hostname),
- hlfsd/stubs.c (nfsproc_lookup_2_svc),
- fsinfo/fsinfo.c (fsi_get_args),
- fixmount/fixmount.c (is_same_host, remove_mount, main),
- conf/mtab/mtab_isc3.c (mnt_dup, mtab_of),
- conf/mount/mount_svr4.c (mount_svr4),
- conf/mount/mount_linux.c (setup_loop_device),
- conf/hn_dref/hn_dref_linux.h (NFS_HN_DREF),
- conf/hn_dref/hn_dref_isc3.h (NFS_HN_DREF),
- amd/opts.c (expand_op),
- amd/ops_nfs.c (mount_nfs_fh),
- amd/nfs_subr.c (fh_to_mp3, mp_to_fh),
- amd/amfs_host.c (amfs_host_mount),
- amd/am_ops.c (merge_opts):
- use the new xstrlcpy instead of strncpy.
-
- * conf/checkmount/checkmount_{default,svr4}.c
- (fixmount_check_mount): document why NOT to use xstrlcpy.
-
- * libamu/xutil.c: am_hostname need not be MAXHOSTNAMELEN+1 any
- more, just MAXHOSTNAMELEN.
-
- * libamu/xutil.c (real_plog): use strlcpy (not xstrlcpy to avoid
- recursion, since xstrlcpy may use plog).
-
- * libamu/util.c (xstrlcpy): truncating a string is serious. Use
- XLOG_ERROR not XLOG_WARNING.
-
-2005-04-06 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_utils.h: external definition for new xstrlcpy
- function.
-
- * libamu/util.c (xstrlcpy): new function. Similar to strncpy, but
- uses strlcpy to guarantee that the resulting string is null
- terminated, and also warn if the resulting string was truncated.
-
- * libamu/xutil.c (get_server_pid): move this function from util.c
- which is for general-purpose utilities.
-
- * m4/macros/header_templates.m4: template for HAVE_EXTERN_STRLCPY.
-
- * include/am_defs.h: provide extern definition for strlcpy, if
- needed.
-
- * libamu/Makefile.am (EXTRA_DIST): include strlcpy.c in distro.
-
- * configure.in: search for strlcpy and its extern.
-
- * amq/pawd.c (find_mt): It only handles *some* filesystem types,
- so it breaks on direct xfs mounts for example. The fix (from
- Christos Zoulas) is simple: We need to exclude toplvl to avoid
- infinite recursion, but all other fs's are game.
-
-2005-03-31 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/nfs_subr.c (fh_to_mp3): strncpy may not null terminate if
- copying exactly len bytes, so add null just to be safe.
-
-2005-03-30 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * amd/nfs_subr.c (fh_to_mp3): Increased the n of strncpy()
- to make sure it null terminates.
-
-2005-03-29 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * amd/nfs_subr.c (fh_to_mp3): Fix memset bug. In this case
- the memset can be removed because strncpy() should padd the
- buffer with NULLs anyway.
-
-2005-03-21 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * include/am_defs.h: Clarify comment.
-
-2005-03-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_defs.h: undefine "GROUP" so Solaris 10 with gcc-2.96
- won't complain about a conflict for this definition between
- <rpcsvc/nis.h> and <sys/acl.h>.
-
-2005-03-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/readdir.c (amfs_readdir_browsable): use %p, not %lx.
-
- * libamu/mount_fs.c (print_nfs_args): print pointer with %p, not
- %lx.
-
-2005-03-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- *******************************************************************
- *** Released am-utils-6.1-rc1 ***
- *******************************************************************
-
-2005-03-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/transp/transp_tli.c (get_nfs_version): use proper type for
- versout on Solaris (rpcvcers_t).
-
- * amd/mapc.c (mapc_showtypes): if last map type to print, don't
- append newline or comma to it.
-
- * libamu/mount_fs.c (print_nfs_args): cast struct netbuf pointer
- to %lx because on Solaris 10 sparc gcc-3.4.3 complains about
- casting it to an int (size is different).
-
- * configure.in, NEWS: prepare for 6.1-rc1 release.
-
-2005-03-17 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd2ldif.in, ldap.schema: fixes by Adam Morley
- <adam-at-gmi-dot-com> to synchronize what amd2ldif does vs. what
- the ldap.schema expects.
-
- * amd/map.c (exported_ap_free): We're using a free-list data
- structure and re-using malloc'ed objects. So, to be safe, memset
- entire structure when it's freed, not just the pointer.
- (umount_exported): bug fix to on-exit code. Don't run
- am_unmounted() unless unmount_mp() didn't run, since the latter
- already calls am_unmounted(). This way we avoid a double-free
- bug.
-
-2005-03-15 Erez Zadok <ezk@cs.sunysb.edu>
-
- * tasks: updates. Executable maps is supported. NFSv4 and
- FreeBSD autofs isn't.
-
- * Makefile.am (EXTRA_DIST): include FAQ in distro.
-
- * doc/Makefile.am (alldocs): install README.lda and README.osx.
-
- * FAQ: new file, better late than never.
-
-2005-03-14 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd2ldif.in: patch to add the amdMapName attribute to
- the amdMapTimestamp object when amd2ldif converts it. This is
- necessary if you are using type:=auto mounts and want those
- mountmaps looked up through LDAP. Patch from Jim Zajkowski
- <jim.zajkowski@gmail.com>.
-
-2005-03-12 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new ports: i386-pc-linux-rhel4.
-
- * minor new ports: powerpc-apple-darwin7.8.0.
-
-2005-03-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/ops_nfs.c (prime_nfs_fhandle_cache): rearrange code so it's
- cleaner.
-
- * ltmain.sh: upgrade from libtool-1.5.6.
-
- * m4/macros/check_{fs_mntent,mnttab_type,mount_type}.m4: check for
- Linux 2.6 kernel modules, which have a .ko extension, not .o. Now
- we can properly detect which file systems exist on Linux 2.6 based
- systems (SLES9, RHEL4, Fedora, etc.).
-
-2005-03-09 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/host_macros.m4: find out what's the OS software
- distribution name, if any.
-
- * m4/macros/header_templates.m4: template for DISTRO_NAME.
-
- * amd/get_args.c (get_version_string): print again full_os, os,
- osver, and vendor (bug fix).
- (get_version_string): print distribution name, if known (e.g.,
- rh9, suse8, etc.).
-
- * amd/mapc.c (mapc_showtypes): wrap around list of supported map.
-
-2005-03-08 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/map.c (umount_exported): when unmounting file systems on
- exit (when amd.conf global unmount_on_exit=yes), use unmount_mp()
- instead of unmount_node() because the latter always unmounts in
- the foreground, whereas the former unmounts in the bg/fg as
- needed. Unmounting always in the foreground has two problems: (1)
- if the unmount hangs, amd hangs, and (2) for type:=program, the
- unmount script is execve'd(!) thus replacing the main amd process,
- which never gets to finish up, leaving the amd mount points hung.
-
- * NEWS: mention new feature of executable maps.
-
- * AUTHORS: Acknowledge Erik Kline.
-
- * scripts/amd.conf.5: document executable maps and
- exec_map_timeout parameter.
-
- * scripts/amd.conf-sample: examples of an executable map and
- exec_map_timeout.
-
- * m4/macros/header_templates.m4: template for HAVE_MAP_EXEC.
-
- * doc/am-utils.texi: document Executable maps and exec_map_timeout
- parameter.
-
- * amd/conf.c (gopt_exec_map_timeout): function to parse
- exec_map_timeout [global] parameter.
-
- * amd/amd.h (AMFS_EXEC_MAP_TIMEOUT): define default executable map
- timeout to 10 seconds, and a global placeholder for the
- configurable value.
-
- * amd/amd.c (init_global_options): initialize default executable
- map timeout.
-
- * amd/Makefile.am (EXTRA_amd_SOURCES): include info_exec.c in
- tarball.
-
- * configure.in: enable executable maps.
-
- * amd/mapc.c: define executable map functions and behavior.
-
- * amd/info_exec.c: executable map implementation from Erik Kline
- <ekline at ekline dot com>, modified, cleaned-up, and fixed.
-
-2005-03-07 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/info_file.c (file_init_or_mtime): consolidate identical
- file_init and file_mtime into one function.
-
-2005-03-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (Program Filesystem): if umount/unmount are
- not specified, Amd uses "umount ${fs}" by default.
-
- * amd/amfs_program.c (amfs_program_match): if neither unmount nor
- umount parameters are specified, use the default userland umount
- program with "umount ${fs}". This way type:=program doesn't have
- to specify the umount program for basic unmounting actions.
- (amfs_program_init): save unmount program string in mf_private
- only if it's NULL, not based on mf_refc.
-
- * configure.in: auto-detect name of userland unmount program.
-
- * aux_conf.h.in (UNMOUNT_PROGRAM): macro for default userland
- unmount program.
-
- * amd/ops_cachefs.c (cachefs_init): save unmount program string in
- mf_private only if it's NULL, not based on mf_refc.
-
- * configure.in: don't "discover" inheritance file system any more,
- since we don't have the .c file for it.
-
- * amd/get_args.c (get_version_string): hack to still show that we
- support the inherit file system in output of amd -v.
-
-2005-03-05 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/amfs_inherit.c: removed, dead code
-
- * amd/Makefile.am,
- amd/am_ops.c,
- amd/amd.h,
- conf/autofs/autofs_linux.h,
- conf/autofs/autofs_solaris_v1.h,
- conf/autofs/autofs_solaris_v2_v3.h,
- m4/macros/header_templates.m4: removed references to amfs_inherit.c
-
-2005-03-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/autil.c (am_mounted): completely rewrite the unmount
- no/timeout code to (1) make more sense for odd conditions, and (2)
- allow utimeout=N mount options to override FS_NOTIMEOUT default
- flags for disk-based file systems such as ufs, pcfs, cdfs, etc.
-
- * libamu/mount_fs.c (mount_fs): use safer XFREE() not free().
-
- * conf/umount/umount_linux.c (umount_fs): strtok is destructive,
- so use strdup'ed string.
-
- * conf/mount/mount_linux.c (parse_opts): strtok is destructive, so
- use strdup'ed string.
-
-2005-03-04 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf.5, doc/am-utils.texi (cache_duration
- Parameter): clarify actual behavior: this Parameter affects
- initial mount timeout as well as the linear backoff what happens
- the initial failed EBUSY unmount.
-
- * doc/am-utils.texi (opts Option): better explanation of
- utimeout=N mount pseudo-option.
-
- * amd/amd.h (AM_TTL, AM_TTL_W): better comments, minor cleanup.
-
-2005-03-02 Daniel P. Ottavio <dottavio@ic.sunysb.edu>
-
- * AUTHORS: add Dan Ottavio.
-
- * scripts/amd.conf.5: document new debug_mtab_file option.
-
- * scripts/amd.conf-sample (debug_mtab_file): show example.
-
- * doc/am-utils.texi (debug_mtab_file Parameter): document new
- option.
-
- * conf/mtab/mtab_{file,mach3}.c (open_locked_mtab): if mtab file
- doesn't exist by the time Amd tries to exist, return a 0 rather
- than hang indefinitely.
-
- * amd/conf.c (gopt_debug_mtab_file): new function to parse
- debug_mtab_file option.
-
- * amd/amd.h: placeholder for debug_mtab_file string.
- Define default debug_mtab_file to "/tmp/mtab".
-
- * NEWS: document new debug_mtab_file option.
-
-2005-03-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/transp/transp_{sockets,tli}.c (amu_get_myaddress): when
- users want Amd's NFS service to bind to some arbitrary "localhost"
- address, show which address was actually resolved and bound to.
-
-2005-03-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/srvr_nfs.c (start_nfs_pings): move code from elsewhere
- (update_nfs_pingval) that initializes the pinger, as well as turns
- it on/off as needed, and handles changing its value. This is to
- avoid races and other infinite-loop conditions that could result
- in ping storms.
-
- * amd/srvr_amfs_auto.c (amfs_generic_find_srvr): when creating a
- new file server structure, default the ping value to AM_PINGER
- (30sec) and set the FSF_PING_UNINIT flag.
-
- * amd/amd.h (FSF_PING_UNINIT): new flag to tell whether the NFS
- pinger had been initialized for a given file server.
-
- * scripts/ctl-amd.in (stop): no need to check if
- /var/lock/subsys/amd file exists if you do an rm -f afterward.
- Ensure that proper return value is returned from script.
-
- * NEWS, doc/am-utils.texi (opts Option): update meaning of ping=N
- so that if N=-1, pings are off; if N=0, pings are set to the
- default value (currently 30 seconds).
-
-2005-02-28 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/nfs_prot_svc.c (nfs_program_2): on TLI system, try to call
- __rpc_get_local_uid to verify if the RPC call through the
- local host interface came from UID 0.
-
- * configure.in: look for internal libnsl function
- __rpc_get_local_uid (seems to be available on all known TLI
- systems, Solaris and HP-UX 11).
-
- * conf/transp/transp_tli.c (amu_svc_getcaller): unnecessary
- function for TLI systems (and it violated a array's bounds,
- discovered with libumem.so).
- (bind_resv_port, bind_resv_port_only_udp, get_autofs_address):
- just to be on the safe side, set struct t_bind's qlen field to non
- zero (64 by default). This value cannot be zero for TCP
- connections, and it's unclear if it's good to have it zero for UDP
- connections, so setting it to 64 is safer.
-
-2005-02-27 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (opts Option, Keep-alives): update text on
- ping option.
-
- * amd/srvr_nfs.c (update_nfs_pingval): new function to update NFS
- server ping values, turn them off, or re-enable them.
- (find_nfs_srvr): call update_nfs_pingval() as needed.
-
- * hlfsd/hlfsd.c (reaper, cleanup): don't use exit(3) in a signal
- handler, but use _exit(2) instead.
-
- * amd/amd.c (parent_exit): This signal handler is called during
- Amd initialization. The parent forks a child to do all the hard
- automounting work, and waits for a SIGQUIT signal from the child.
- When the parent gets the signal it's supposed to call this handler
- and exit(3), thus completing the daemonizing process. Alas, on
- some systems, especially Linux 2.4/2.6 with Glibc, exit(3) doesn't
- always terminate the parent process. Worse, the parent process
- now refuses to accept any more SIGQUIT signals -- they are
- blocked. What's really annoying is that this doesn't happen all
- the time, suggesting a race condition somewhere.
- (This happens even if I change the logic to use another signal.)
- I traced this to something which exit(3) does in addition to
- exiting the process, probably some atexit() stuff or other
- side-effects related to signal handling. Either way, since at
- this stage the parent process just needs to terminate, I'm simply
- calling _exit(2). Note also that the OpenGroup doesn't list
- exit(3) as a recommended "Base Interface" but they do list
- _exit(2) as one. This fix seems to work reliably all the time.
-
- * scripts/wait4amd2die.in: change default to recognize that amd is
- down more quickly (check every 3 seconds instead of 5).
-
-2005-02-26 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/xutil.c (amu_release_controlling_tty): warn if closing
- stdin/stdout/stderr failed. No need for tempfd.
-
- * scripts/ctl-{amd,hlfsd}.in: before running any real program in
- these shell scripts, chdir to "/" to avoid possible hangs with
- existing NFS mounts. This was causing ctl-amd's forked
- grand-child amd process to hang if restartable_mounts=no. Go
- figure.
-
-2005-02-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port ia64-unknown-linux-rhel4
-
- * fsinfo/fsi_util.c (set_ether_if): avoid u_long casting to -1
- (RHEL4 gcc 3.4.3 ia64 compiler complains).
-
-2005-02-24 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port i386-unknown-freebsd6.0 (6.0-CURRENT-SNAP001).
-
-2005-02-23 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-rhel3.
-
- * INSTALL: major update of the compatibility list.
-
- * m4/macros/os_cflags.m4: set AMU_CFLAGS not AM_CFLAGS.
-
-2005-02-22 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf.5, doc/am-utils.texi (preferred_amq_port):
- document new preferred_amq_port [global] option.
-
- * scripts/amd.conf-sample (preferred_amq_port): example.
-
- * include/am_utils.h: add preferred_amq_port to prototype.
-
- * conf/transp/transp_tli.c (bind_preferred_amq_port): new function
- to bind the Amq RPC service for UDP and TCP to a preferred port
- (or to any port if preferred_amq_port==0).
- (create_amq_service): decide if to bind to RPC_ANYFD, or to a
- requested port.
-
- * conf/transp/transp_sockets.c (create_amq_service): if
- preferred_amq_port is greater than 0, then bind to that port for
- both UDP and TCP. If preferred_amq_port==0, then bind to any
- port.
-
- * amd/nfs_start.c (mount_automounter): pass global
- preferred_amq_port value to create_amq_service().
-
- * amd/conf.c (gopt_preferred_amq_port): new function to parse
- amd.conf value for preferred_amq_port.
-
- * amd/amd.h: placeholder for preferred_amq_port.
-
-2005-02-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/transp/transp_tli.c (bind_resv_port_only_udp): rename old
- bindnfs_port to a more proper name. This function binds the NFS
- service to a specified port, and only for UDP.
-
- * conf/transp/transp_tli.c: cleanup some code, rename some
- functions, in preparation for RPC amq port specification code.
-
-2005-02-19 Erez Zadok <ezk@cs.sunysb.edu>
-
- * */Makefile.am: don't redefine CFLAGS or LDFLAGS; they are
- reserved for users to pass them on the command line. Instead, use
- autoconf's internal AM_CFLAGS and AM_LDFLAGS.
-
- * depcomp, install-sh, missing, mkinstalldirs: update from latest
- versions of Automake 1.9.2.
-
- * m4/macros/*.m4: properly quote AC_DEFUN'ed macro name, and fix
- regexp/patsubst M4 commands. Newer versions of autoconf (e.g.,
- v2.59) complain about those.
-
-2005-02-17 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/opts.c (f_xhost): if we don't have hstrerror, just print the
- value of h_errno.
-
- * configure.in: include -lresolv if it defines the hstrerror()
- function and not already available in existing libraries.
-
- * minor new port: powerpc-apple-darwin7.7.0.
-
- * amd/nfs_subr.c (mp_to_fh): pathlen should be u_int because it is
- later compared against an unsigned quantity (complaint from gcc
- 3.3 on SuSE 8.2)
-
- * include/am_utils.h: remove unnecessary (and conflicting) extern
- for bind_resv_port2(), which is declared as static in
- transp_tli.c.
-
- * doc/am-utils.texi, scripts/amd.conf.5, scripts/amd.conf-sample,
- NEWS: document four new amd.conf options: nfs_retry_interval_udp,
- nfs_retransmit_counter_udp nfs_retry_interval_tcp, and
- nfs_retransmit_counter_tcp.
-
- * amd/ops_nfs.c (mount_nfs_fh): set timeo/retrans values based on
- wether nfs_proto was "udp" or "tcp".
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount): set retrans/timeo values
- from default UDP settings (because toplvl mounts are UDP for now).
-
- * amd/get_args.c (get_args): use parameters to -t option to set
- both UDP and TCP timeo/retrans values.
-
- * amd/conf.c: (gopt_nfs_retransmit_counter_udp,
- (gopt_nfs_retransmit_counter_tcp, gopt_nfs_retry_interval_udp
- (gopt_nfs_retry_interval_tcp): new functions to parse UDP and TCP
- retrans/timeo parameters separately.
- (gopt_nfs_retry_interval, gopt_nfs_retransmit_counter): if
- specified, use it to set defaults for both UDP and TCP.
-
- * amd/amd.c (init_global_options): initialize default values of
- both UDP and TCP retrans/timeo values to -1.
-
- * amd/amd.h (AMU_TYPE_{TCP,UDP,MAX}): define separate retrans and
- timeo values, one for udp mounts and another for tcp mounts.
-
-2005-02-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * README.osx: new file with some instructions for Mac OS-X users,
- courtesy Kevin Layer.
-
- * amd/get_args.c (get_args): move call to switch_to_logfile()
- after processing -v, so we don't print "no logfile defined; using
- stderr" when we're about to print version info and exit anyway.
-
- * minor new port: powerpc-ibm-aix5.3.0.0.
-
- * hlfsd/hlfsd.c (main): rewrite code to avoid negative array
- references.
-
- * conf/checkmount/checkmount_aix.c: remove extern definition for
- mntctl(), since AIX 5.3 has it in <sys/vmount.h>.
-
- * amd/info_union.c (union_reload): rewrite code to avoid negative
- array references.
-
- * amd/opts.c (split_opts, expand_op): rewrite code to avoid
- negative array references.
-
- * conf/mtab/mtab_aix.c: remove extern definition for mntctl(),
- since AIX 5.3 has it in <sys/vmount.h>.
-
- * libamu/xutil.c (real_plog): rewrite code to avoid negative array
- references.
-
- * libamu/wire.c (is_network_member): rearrange code slightly to
- avoid negative array references (AIX 5.3 xlC 7.0 compiler
- complains about it).
-
-2005-01-26 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (xhost Selector Function): document new
- selector function.
-
- * amd/opts.c (f_xhost): new function for use when matching the
- "host" selector for the current host's name. This function will
- now match the primary host name as well as all known aliases
- (CNAMES) that gethostbyname() returns. This function now supports
- a new function selector called xhost(ARG); the old host==ARG
- selector is unharmed.
-
-2005-01-17 Ion Badulescu <ionut@moisil.badula.org>
-
- * NEWS: document the ability to restart old mount points
-
- * amd/map.c (mount_auto_node): force the fileid of the
- root to be 1, so that it won't change between restarts; use the
- root filesystem's own methods instead of hard-coding the use of
- the default methods
-
- * conf/transp/transp_tli.c (create_nfs_service): better cleanup on
- error conditions.
- (bind_resv_port2): allow the caller to request a certain port.
-
- * conf/transp/transp_sockets.c (bind_resv_port): allow the caller
- to request a certain port.
- (create_nfs_service): better cleanup on error conditions.
-
- * amd/restart.c (restart_automounter_nodes): new function, takes
- care of restarting automounter NFS mount points (autofs will come
- later).
- (restart): skip all automounter mount points.
-
- * amd/nfs_subr.c (fh_to_mp3, mp_to_fh): new filehandle
- implementation: if the path to the node is shorter than sizeof(fh)
- chars (currently 32 chars for a NFSv2 fh), simply store it inside
- the fh. For longer paths, keep the old implementation.
-
- * amd/nfs_start.c (mount_automounter): reorder things so that
- restarting the toplvl filesystems occurs before anything else (so
- that we can grab all the ports we need before we accidentally use
- them for something else).
-
- * amd/mntfs.c (locate_mntfs): remove dead code; add special
- handling of restarted toplvl filesystems.
-
- * amd/mapc.c (root_keyiter): fix up a comment.
-
- * amd/map.c (path_to_exported_ap): new function, searches for and
- returns a node by the path to it.
- (get_root_nfs_fh): remove unnecessary fiddling with the root fh.
-
- * config.guess.long: support Red Hat Enterprise Linux
-
-2005-01-17 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/util.c (rmdirs): prevent amd from logging 'Read-only
- filesystem' errors when the mount point has an ancestor (i.e. '/')
- that is mounted read-only. Patch from David Rage <rage@ucl.ac.uk>.
-
-2005-01-17 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/umount/umount_linux.c (umount_fs): Linux doesn't need the
- autofs space hack
-
- * conf/umount/umount_default.c (umount_fs): there is no need for
- HAVE_LOOP_DEV, now that Linux has its own dedicated umount_linux.c
-
-2005-01-17 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (Automatic Unmounting): document new umount2()
- behavior on Linux.
-
- * conf/umount/umount_linux.c (umount_fs): new file. On Linux, if
- umount(2) failed with EIO or ESTALE, try umount2(2) with
- MNT_FORCE+MNT_DETACH. Based on patch from Christos Zoulas
- <christos@zoulas.com>.
-
- * m4/macros/check_umount_style.m4: pick new linux umount style.
-
- * Makefile.am (EXTRA_DIST_CONF): distribute new umount_linux.c
- file.
-
-2005-01-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_aix{4_2,4_3,5_1,5_2}.h,
- m4/macros/struct_nfs_args.m4: minor cleanups for quicker execution
- of "nfs_args" test.
-
-2005-01-13 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/get_args.c (show_usage): separate function to print usage
- string.
- (get_args) Call show_usage() from get_args when needed, then exit.
-
- * amd/get_args.c (get_version_string): print also domain, host,
- and hostd.
- (get_args): print version string at the very end, after all other
- values had been initialized. Patch from Christos Zoulas
- <christos@zoulas.com>.
-
- * conf/transp/transp_sockets.c (check_pmap_up, get_nfs_version),
- conf/transp/transp_tli.c (check_pmap_up): correct an inconsistency
- in timeouts in the RPC code between socket and TLI
- implementations. The clntudp_create timeout has a different
- meaning than the clnt_call timeout. Set the timeout of the create
- to 2 seconds which means retry if no answer in two seconds, and
- the timeout call to 6 seconds, which will give us consistently 2
- to 3 pings. This is useful on occasional network UDP loss where a
- single packet loss would wrongfully mark a server down. (The TLI
- code is the one that had the problem occurs.) Patch from Christos
- Zoulas <christos@zoulas.com>.
-
- * libamu/mount_fs.c (compute_nfs_attrcache_flags): make sure code
- compiles even for systems that don't have the nfs_args
- ac{reg,dir}{min,max} fields.
-
- * amd/amfs_toplvl.c (set_auto_attrcache_timeout): just to be safe,
- add "noac" if amd.conf option auto_attrcache was set to 0. This
- should hopefully make the compute_nfs_attrcache_flags patch even
- safer.
-
- * libamu/mount_fs.c (compute_nfs_attrcache_flags): separate
- function to compute attribute-cache values. This function now
- computes attribute-cache flags for BOTH Amd's automount points
- (NFS) as well as any normal NFS mount that Amd performs.
- (compute_nfs_args, compute_automounter_nfs_args): call
- compute_nfs_attrcache_flags to figure out attribute-cache related
- flags. Patch from Christos Zoulas <christos@zoulas.com>.
-
- * scripts/amd.conf-sample: show examples of new global options
- domain_strip and auto_attrcache.
-
- * scripts/amd.conf.5: document new global options domain_strip and
- auto_attrcache. Add warning to auto_attrcache use in case of
- ESTALE.
-
- * doc/am-utils.texi: minor cleanups and document new global
- options domain_strip and auto_attrcache. Add warning to
- auto_attrcache use in case of ESTALE.
-
- * amd/conf.c (gopt_auto_attrcache): parse new global amd.conf
- option auto_attrcache.
- (gopt_domain_strip): parse new global amd.conf option
- domain_strip. Part of a patch from Christos Zoulas
- <christos@zoulas.com>.
-
- * amd/autil.c (host_normalize): don't call domain_strip()
- unconditionally, but depend on the new global amd.conf flag
- domain_strip.
-
- * amd/amfs_toplvl.c (set_auto_attrcache_timeout): new function to
- set attribute cache timeout value given other configured global
- defaults.
- (amfs_toplvl_mount): set automount point attribute cache option
- value to "noac" if attrcache=0, else set it to whatever
- set_auto_attrcache_timeout() returns.
-
- * amd/amd.h (CFM_DOMAIN_STRIP, CFM_DEFAULT_FLAGS): flag to decide
- if to strip the domain from the host name or not, default options
- set to strip the domain.
- Store global value of automount attribute cache timeout value.
-
- * amd/amd.c (init_global_options): add flag to record automount
- point attribute cache value.
-
- * amd/amd.c (do_memory_locking): new function to encapsulate all
- of the memory-locking functionality, which was in main() before.
- Also added a call to madvise(), just in case.
- (main): call do_memory_locking() to pin process memory if amd.conf
- asked for it, but do so after the main Amd process daemonizes,
- because mlock/mlockall is not inherited by fork() by default.
- Slightly restructured patch from Jonathan Chen
- <jon+amd@spock.org>.
-
- * configure.in: check for madvise(2).
-
- * config.guess, config.sub: updates for latest official GNU
- versions.
-
- * m4/GNUmakefile: update paths to "make update"
-
-2005-01-12 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_hpux11.h: define an nfs_fh3 structure
- that's compatible for HPUX11 as well as NFSv3.
-
- * include/am_defs.h: On AIX 5.2, both <resolv.h> and
- <arpa/nameser_compat.h> define MAXDNAME, if compiling with gcc
- -D_USE_IRS (so that we get extern definitions for hstrerror() and
- others). So undef MAXDNAME before it gets redefined.
-
- * include/am_defs.h: Solaris 10 (build 72) defines GROUP_OBJ in
- <sys/acl.h>, which is included in many other header files.
- <rpcsvc/nis.h> uses GROUP_OBJ inside enum zotypes. So if you're
- unlucky enough to include both headers, you get a compile error
- because the two symbols conflict. Temp hack: undefine acl.h's
- GROUP_OBJ before including nis.h, because we don't need acl.h for
- am-utils.
-
- * m4/macros/os_cflags.m4: turn -D_USE_IRS for AIX5+ so that
- certain extern definitions of resolver functions become available.
-
- * amd/opts.c (expand_op): use #define for expand_error string
- because some compilers complain about the use of static const
- char[] inside a varargs function.
-
- * minor new port i386-unknown-netbsdelf1.6.2.
-
- * new port i386-unknown-netbsdelf2.0.
-
- * minor port i386-unknown-freebsd5.3.
-
- * libamu/mount_fs.c (compute_nfs_args): don't compare
- nap->maxgrouplist against NULL but against 0 directly, because on
- FreeBSD 4.3, NULL is defined is (void *)0 and gcc 3.4 complains
- about a type mismatch.
-
- * minor port i386-pc-linux-fc3 (Fedora Core 3).
-
-2005-01-11 Erez Zadok <ezk@cs.sunysb.edu>
-
- * hlfsd/hlfsd.c (main): use sigsuspend() over sigpause(), because
- FC3 doesn't have proper extern definition for the defunct
- sigpause().
-
- * configure.in: look for sigsuspend().
-
-2005-01-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * updated copyright year to 2005 on all files.
-
-2004-11-29 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/amd.conf.5: Small fixes to typos in man page, from
- Thomas Klausner <tk@giga.or.at>.
-
-2004-10-22 Erez Zadok <ezk@cs.sunysb.edu>
-
- * ldap.schema: add this file to distribution.
-
-2004-09-15 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi: fix old URLs.
-
-2004-09-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/mtab/mtab_aix.c (read_mtab): avoid a race condition between
- multiple calls to mntctl(). Patch suggested by Michael van Elst
- <M.van.Elst@science-computing.de>.
-
-2004-08-07 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi (Program Filesystem): document how to get
- double slashes in Amd maps.
-
- * amd/opts.c (normalize_slash): support escaped slashes, needed
- for SMB mounts. Use '\\\/\\\/' in a string to get a double slash.
-
-2004-08-06 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/amfs_program.c (amfs_program_match): bug fix. Complain if
- both opt_unmount and opt_umount are missing, not when just one of
- them is missing.
-
-2004-08-03 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amq/pawd.c (find_mt): recognize "linkx" type mounts. Patch from
- Hauke Fath <hauke@Espresso.Rhein-Neckar.DE>. Support "nfsx" while
- we're at it.
-
- * doc/am-utils.texi: mention bugzilla. Fix broken URL HREF's.
-
-2004-08-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amq/pawd.c (find_mt): recognize "host" type mounts. Patch from
- Dan Nelson <dnelson@allantgroup.com>.
-
-2004-07-30 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi, NEWS: minor typos fixed.
-
-2004-07-30 Erez Zadok <ezk@play.cs.columbia.edu>
-
- * include/am_xdr_func.h: cannot have field-less structure; put a
- dummy field in.
-
- * conf/autofs/autofs_solaris_v2_v3.c (xdr_autofs_rddirargs): cast
- 2nd arg of xdr_u_int to a u_int*, not int*.
- (autofs_mount_2_req): don't use C++ // comments.
-
-2004-07-30 Erez Zadok <ezk@cs.sunysb.edu>
-
- * m4/macros/{try_compile_anyfs,check_field}.m4: include
- <fs/msdosfs/msdosfsmount.h> if it exists. Part of a set of
- FreeBSD 5 patches from Martin Blapp <mb@imp.ch>.
-
- * include/am_defs.h: include <fs/msdosfs/msdosfsmount.h> if it
- exists.
-
- * amd/ops_pcfs.c (mount_pcfs): set pcfs_args_t.dirmask field to
- 0777 by default.
-
- * configure.in: check for pcfs_args_t.dirmask field. Check for
- existence of <fs/msdosfs/msdosfsmount.h>, new on FreeBSD 5.
-
-2004-07-29 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-fc2 (Fedora Core 2).
-
- * amd/info_ldap.c (amu_ldap_rebind): don't use ldap_enable_cache()
- unless the function exists in libldap and the extern is in
- <ldap.h>. Recently, openldap removed the extern from ldap.h, but
- left the function in libldap, for binary compatibility; however
- ldap_enable_cache and related functions have been deprecated (and
- no longer listed in the header files), and therefore should be
- avoided.
-
- * m4/macros/check_extern_ldap.m4: new macro to check for
- LDAP-specific externs. This is separate from check_extern.m4 so
- as to avoid breaking the general-purpose macro with LDAP-specific
- headers.
-
- * m4/macros/header_templates.m4: extern template for new
- HAVE_EXTERN_LDAP_ENABLE_CACHE.
-
- * configure.in: call new check_extern_ldap.m4 macro.
-
- * Makefile.am (EXTRA_DIST_M4): distribute new check_extern_ldap.m4
- macro.
-
- * config.guess.long: distinguish between redhat and fedora-core
- releases.
-
-2004-07-23 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Minor new port i386-pc-linux-suse8.2: minor new port to SuSE
- 8.2. This systems' latest GCC (gcc version 3.3 20030226
- prerelease) correctly caught a lot of possibly bad comparisons
- between signed and unsigned quantities.
-
- * hlfsd/homedir.c (table_add, plt_search): changed first arg of
- both functions to u_int.
-
- * hlfsd/hlfsd.h, hlfsd/hlfsd.c: change 'cache_interval' to u_int.
- Changed proto for plt_search arg to u_int.
-
- * amq/amq.c (show_mi, main): change 'i' to u_int.
-
- * amq/pawd.c (find_mlp): change 'i' to u_int.
-
- * amd/srvr_nfs.c (find_nfs_srvr): change proto_nfs_version to
- u_int.
-
- * amd/amd.h: change prototype of vreaddir and amfs_error_readdir
- to use u_int count parameter.
-
- * amd/ops_TEMPLATE.c (foofs_readdir), amd/amfs_error.c
- (amfs_error_readdir): change 'count' parameter in proto to u_int.
-
- * amd/amd.h: change proto of amfs_generic_readdir() to use u_int
- count parameter.
-
- * amd/readdir.c (make_entry_chain): preflen should be u_int.
- (amfs_readdir_browsable): change 'count' to u_int.
- (amfs_generic_readdir): change 'count' to u_int.
-
- * amd/amd.h: amu_global_options's portmap_program field should be
- u_long, not int (to match RPC conventions). Change am_fh's
- fhh_gen field to u_int, to match am_gen field in struct am_node.
-
- * amd/conf.c (gopt_portmap_program): use atol() instead of atoi()
- to avoid size differences.
-
- * conf/mount/mount_linux.c (find_unused_loop_device): cast to int
- to avoid comparison between chars and integers.
-
- * libamu/mount_fs.c (get_hex_string): change 'i' to u_int to avoid
- comparisons between signed and unsigned integers.
-
-2004-07-13 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-pc-linux-suse9.1.
-
- * include/am_defs.h: don't use __kernel_dev_t for dev_t on Linux,
- because SuSE wants __kernel_old_dev_t. Instead, just define it
- directly to what they both use: an unsigned short.
-
-2004-05-27 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-unknown-freebsd4.10
-
-2004-04-29 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): fix the creation of
- mountpoints for autofs-based sublinks the right way
-
-2004-04-28 Ion Badulescu <ionut@moisil.badula.org>
-
- Fixes for various memory management problems discovered by
- Rainer's purify run:
-
- * conf/transp/transp_tli.c (check_pmap_up): zero out struct
- timeval before using;
- (get_nfs_version): ditto
-
- * amd/map.c (umount_exported): make sure we don't try to free the
- same am_node multiple times, by setting its corresponding
- exported_ap slot to null
-
- * amd/get_args.c (get_version_string): a static pointer is pretty
- pointless, make it automatic
-
- * amd/conf.c (gopt_debug_options): remove unnecessary strdup();
- (gopt_log_options): ditto
- (gopt_print_version): free version string after using it
-
- * amd/autil.c (mf_mounted): free mntfs->mf_fo instead of leaking
- it
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): use the CALLOC macro
- (amfs_lookup_mntfs): free def_opts on return
-
- * amd/amd.c (daemon_mode): zero out struct sigaction before using
- it;
- (main): ditto
-
-2004-04-27 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): force FS_MKMNT on
- the real mount of an autofs-based sublink
-
-2004-04-25 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/map.c (free_map_if_success): avoid dereferencing a pointer
- to potentially freed memory
-
-2004-02-26 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-unknown-freebsd5.2.1.
-
-2004-01-30 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * scripts/ctl-hlfsd.in: don't run hlfsd with -D fork
-
-2004-01-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: sparc64-unknown-linux-deb3.0
-
- * config.guess.long: recoognize Debian Linux.
-
-2004-01-22 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/transp/transp_tli.c (amu_get_myaddress): use
- htonl(INADDR_LOOPBACK) and define INADDR_LOOPBACK if not already
- available.
-
-2004-01-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * wire-test/wire-test.c, hlfsd/hlfsd.c (main): pass NULL as second
- parameter to amu_get_myaddress().
-
- * conf/transp/transp_tli.c (amu_get_myaddress): resolve value of
- localhost_address amd.conf parameter, if defined (else default to
- HOST_SELF_CONNECT).
- Removed htonl() around socket address copying (I think it was
- wrong) since plog("My IP address is...") in amd.c was printing
- addresses wrong on Solaris x86..
-
- * conf/transp/transp_sockets.c (amu_get_myaddress): comment out
- old DEBUG code that warns if 127.0.0.1 isn't the same as what
- get_myaddress() reports. Add code to resolve value of
- localhost_address amd.conf parameter, if defined (else default to
- 127.0.0.1).
-
- * amd/conf.c (gopt_localhost_address): new function to parse
- amd.conf parameter localhost_address.
-
- * amd/amd.h: global field to store amd.conf localhost_address
- parameter.
-
- * amd/amd.c (main): call amu_get_myaddress with global option,
- which could have been set in amd.conf.
-
- * NEWS, doc/am-utils.texi, scripts/amd.conf-sample,
- scripts/amd.conf.5: document new option localhost_address.
-
-2004-01-20 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/conf.c (gopt_nfs_allow_insecure_port): support function for
- the new "nfs_allow_insecure_port" amd.conf directive
-
- * amd/nfs_prot_svc.c (nfs_program_2): complain about the insecure
- port and drop the request only if the "nfs_allow_insecure_port"
- option is not set in amd.conf
-
- * doc/am-utils.texi (Global Parameters): documented the new
- amd.conf directive "nfs_allow_insecure_port"
-
- * scripts/amd.conf.5 (nfs_allow_insecure_port): ditto
-
- * scripts/amd.conf-sample (nfs_allow_insecure_port): added the
- "nfs_allow_insecure_port" directive
-
-2004-01-20 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/am-utils.texi: amd-workers is defunct.
-
-2004-01-19 Erez Zadok <ezk@cs.sunysb.edu>
-
- * cvs-server.txt: updated instructions
-
-2004-01-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * minor new port: i386-unknown-freebsd5.2.
-
-2004-01-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * MIRRORS.{txt,html}: verify each mirror site, update to new
- locations (if found), and remove stale mirrors URLs.
-
- * updated copyright year to 2004 on all files.
-
-2004-01-03 Erez Zadok <ezk@cs.sunysb.edu>
-
- * MIRRORS.txt: track status.
-
- * Makefile.am (install-snapshot): new directory to install
- snapshots (now that am-utils home page is moved).
-
-2004-01-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * INSTALL, README.autofs: remove forced text-mode.
-
- * doc/am-utils.texi: fix Amd book URL.
-
- * Makefile.am (EXTRA_DIST): include new mirror files in tarball.
-
- * AUTHORS, BUGS, README, README.y2k, configure.in,
- doc/am-utils.texi: revisions to use newer URLs for Web site, FTP,
- and mailing lists.
-
- * MIRRORS.{html,txt}: updates.
-
- * doc/Makefile.am: install mirror lists officially.
-
-2004-01-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * tasks: things to do after migrating ftp/Web sites.
-
-2003-12-09 Erez Zadok <ezk@cs.sunysb.edu>
-
- * fsinfo/fsinfo.8: fixed typo (unbalanced []) in man page. Bug
- report from Eric S. Raymond <esr@thyrsus.com>.
-
-2003-11-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Makefile.am (EXTRA_DIST_M4): exclude removed file
- m4/macros/struct_nfs_fh3.m4 from distro.
-
-2003-10-24 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * libamu/xdr_func.c (xdr_am_nfs_fh3): Use AM_FHSIZE3 instead of
- FHSIZE3 (may be undefined).
-
-2003-10-24 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- Compile fix for Solaris7 with LDAP:
-
- * include/am_defs.h: moved the ldap headers before am_nfs_prot.h
- to facilitate using ldap types in it
-
- * conf/nfs_prot/nfs_prot_sunos5_7.h: add a couple of ldap
- definitions that Sun left out of their headers
-
-2003-10-24 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/nfs_prot/nfs_prot_*.h: remove all NFSv3-related
- definitions, they are now defined globally
-
- * libamu/xdr_func.c: unconditionally define all xdr functions
- needed for NFSv3, but with an am_ prefix to prevent namespace
- collisions
-
- * amd/amfs_host.c, amd/ops_nfs.c, amd/srvr_nfs.c,
- libamu/mount_fs.c: added the am_ prefix to all
- structures and functions having to do with NFSv3 to prevent
- namespace collisions
-
- * include/am_utils.h: moved definition of am_nfs_handle to ...
-
- * include/am_xdr_func.h: ... here. Also define AM_FHSIZE3,
- am_nfs_fh3, AM_NFSPROC3_LOOKUP, am_nfsstat3, am_fhandle3,
- am_mountstat3, am_mountres3_ok, am_mountres3, am_filename3,
- am_diropargs3, am_LOOKUP3args, am_LOOKUP3resok, am_LOOKUP3resfail,
- am_LOOKUP3res here; remove cross-platform compile helper macros
- AMU_LOOKUP3RES_*.
-
- * include/am_defs.h: include am_xdr_func.h before am_utils.h to
- provide definitions for NFS filehandles
-
- * amd/amd.h: removed declaration for xdr_mountres3
-
- * doc/am-utils.text: minor warning fix
-
- * BUGS: document the autoconf warnings when trying to compile
- system header files in isolation
-
-2003-10-23 Ion Badulescu <ionut@moisil.badula.org>
-
- * m4/macros/struct_nfs_fh3.m4: removed, not needed
-
- * configure.in: check if struct mounta has the optptr field;
- removed all NFSv3-related checks, we implement everything
- internally now
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_mount_2_free): don't
- touch mnt->optptr unless HAVE_MOUNTA_OPTPTR is defined
-
-2003-10-22 Ion Badulescu <ionut@moisil.badula.org>
-
- * m4/macros/struct_nfs_fh3.m4: removed, not used anymore
-
- * libamu/xdr_func.c (xdr_am_nfs_fh3): update xdr_am_nfs_fh3
- comments
-
- * configure.in: don't check for xdr_nfs_fh3 and struct nfs_fh3, we
- always use our own
-
-2003-10-22 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * BUGS: document the limitations of bind mounts on Linux
-
-2003-10-21 Ion Badulescu <ionut@moisil.badula.org>
-
- * buildall: added support for -i (make install)
-
-2003-10-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * NEWS: New minor port i386-pc-solaris2.10 (Solaris 10).
- * INSTALL: Mention its test status.
-
-2003-10-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/ops_nfs.c (nfs_init): declare as static to match forward
- definition at top of file.
-
- * conf/nfs_prot/nfs_prot_{hpux11, netbsd1_4,openbsd,aix5_2}.h:
- added missing definitions for LOOKUP3res, diropargs3, etc.
-
-2003-10-15 Erez Zadok <ezk@cs.sunysb.edu>
-
- * libamu/xdr_func.c (xdr_LOOKUP3res, xdr_am_nfs_fh3),
- libamu/mount_fs.c (compute_nfs_args), amd/ops_nfs.c
- (got_nfs_fh_mount, got_nfs_fh_webnfs, prime_nfs_fhandle_cache,
- webnfs_lookup), amd/amfs_host.c (fetch_fhandle): Attempt to
- cleanup some inconsistencies with how we treat NFSv3 file handles.
- Whenever we need to get data out of a filehandle given to us, we
- assume that it uses the OS's native fhandle structure
- (often struct nfs_fh3). When we store the fhandle data for our
- own use, however, we store it in one of two ways. The first, is
- that we use the system's default nfs_fh3 structure; the second is
- that we define out own struct am_nfs_fh3 in nfs_prot.h (and go
- through an elaborate autoconf song-and-dance to "discover" it as a
- native fh3 handle structure). It appears that we do the latter,
- instead of using the system's default fhandle structure, simply to
- avoid extra malloc's and free's, because whereas nfsv2's fhandle
- structure is a simple 32-byte buffer, nfsv3's fhandle structures
- often just define a "char *" for the fhandle data, and the caller
- must malloc/free the space inside as needed. Our code was never
- written with constructor/destructor callbacks for these nfsv3
- filehandles. Moreover, we carefully wrote our own am_nfs_fh3
- structure so IT JUST SO HAPPENS to align with most (hopefully all)
- of the fhandle structures for v3: first four bytes are the length
- fields and the next four bytes are the fhandle data. Sigh.
- Having this inconsistent use of v3 filehandles can be a real bear,
- because we simply cannot avoid using the system's default fhandle
- structure indirectly, through things like diropargs3 in
- xdr_diropargs3(), which has inside of it a reference to the
- system's default nfs_fh3 structure. ANYWAY, the current fix I've
- come up with is to generalize the way we dereference field names
- within the nfs_fh3 structure (whether ours or the system's) and
- the same for the system's LOOKUP3res structure. I'm not pleased
- with this fix; I'd rather we don't use our own am_nfs_fh3
- structure at all.
-
- * libamu/xdr_func.c (xdr_am_nfs_fh3): always define this
- function if we have NFS3, because we often use our own,
- incompatible am_nfs_fh3 structure.
-
- * include/am_xdr_func.h: We cannot use the native system's
- xdr_nfs_fh3 because we are defining our own incompatible
- am_hfs_fh3 structure for some systems.
-
- * include/am_xdr_func.h: Define default values for field names of
- struct nfs_fh3 and LOOKUP3res.
-
- * doc/am-utils.texi (debug_options Parameter): minor typo fixed.
-
- * conf/nfs_prot/nfs_prot_freebsd3.h: FreeBSD uses different fields
- names for struct nfs_fh3 and LOOKUP3res, so override the default
- names here.
-
- * configure.in: AMU_CHECK_FS_MNTENT(nfs3) test before
- AMU_STRUCT_NFS_FH3, because the latter depends on the former.
-
- * amd/ops_nfs.c (prime_nfs_fhandle_cache): add {} to disambiguate
- and clarify if-the-else clauses.
-
-2003-10-13 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/get_args.c (get_version_string): change "Built by" to
- "Configured by", and add a new "Built by" line using the variables
- below
-
- * m4/update_build_version (vers): add BUILD_USER, BUILD_HOST, and
- BUILD_DATE to build_version.h
-
- * amd/mntfs.c (locate_mntfs): fix restarted filesystems: mf_fo
- must be initialized even for them, otherwise we lose opt_sublink
- (and perhaps other options as well). Report from Rainer Orth.
-
- * amd/amfs_generic.c (amfs_bgmount): The fix for the mf_fo NULL
- pointer dereferencing was a bit too aggressive and could end up
- not processing the sublink option if the filesystem was already
- mounted.
-
-2003-10-11 Ion Badulescu <ionut@moisil.badula.org>
-
- Fix restarted filesystem by disabling the amfs_inherit filesystem
- and moving the restarting logic into the generic code. The old
- code is still there, will be removed sometime in the near future.
-
- * amd/mntfs.c (locate_mntfs): disable amfs_inherit and simply
- return the pointer to the restarted filesystem
- (free_mntfs): check for the MFF_RESTART flag instead of the
- amfs_inherit ops
-
- * amd/autil.c (mf_mounted): remove the MFF_RESTART flag once the
- filesystem is in use
-
- * amd/amfs_nfsx.c (amfs_nfsx_init): only call fs_init() if the
- filesystem is not being restarted
- (amfs_nfsx_remount): if the filesystem is already mounted,
- short-circuit the code and just continue
-
- * amd/amfs_generic.c (amfs_bgmount): only call fs_init() if the
- filesystem is not being restarted; remove hack that was used to
- work around an amfs_inherit problem
-
-2003-10-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Use WebNFS to obtain file handles for mount(2).
-
- * NEWS: Document WebNFS support.
-
- * configure.in: Check for public mount option.
- * include/am_compat.h (MNTTAB_OPT_PUBLIC): Define if missing.
- * doc/am-utils.texi (opts Option): Renamed webnfs to public,
- update description.
-
- * amd/amd.h (FSF_WEBNFS): New mntfs flag.
- * include/am_utils.h (RPC_XID_WEBNFS): New XID type.
-
- * amd/amfs_host.c (amfs_host_mount, amfs_host_umounted): Reject
- WebNFS mount/umount attempts.
- * amd/ops_nfs.c (got_nfs_fh_mount): Renamed from got_nfs_fh.
- (got_nfs_fh_webnfs): New function.
- (flush_nfs_fhandle_cache): Don't invalidate port for WebNFS servers.
- (prime_nfs_fhandle_cache): Likewise.
- Remove unconditional return of public file handle for WebNFS, but
- get NFS file handles via mountd or WebNFS instead.
- (webnfs_lookup): New function.
- (nfs_umounted): Don't inform mountd if MFF_WEBNFS.
- * amd/rpc_fwd.c (fwd_packet, fwd_reply): Send/receive WebNFS
- packets.
- * amd/srvr_nfs.c (recompute_portmap): Don't contact portmap for
- WebNFS servers.
- Mention host in info message.
- (find_nfs_srvr): Handle public mount option.
- Prefer NFSv3/tcp if the client supports it.
- Allow port mount option to override default or result from portmap
- lookup.
-
- * libamu/xdr_func.c (xdr_diropargs3, xdr_filename3,
- xdr_LOOKUP3args, xdr_LOOKUP3res, xdr_LOOKUP3resfail,
- xdr_LOOKUP3resok, xdr_nfs_fh3, xdr_nfsstat3): New functions.
- * include/am_xdr_func.h: Declare them.
- * configure.in: Check for them.
- * conf/nfs_prot/nfs_prot_linux.h: Provide missing NFSv3
- definitions and types.
-
-2003-10-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Support IRIX 6 private mount option.
-
- * configure.in (AC_CHECK_MNTTAB_OPTS): Check for private option
- name string.
- (AC_CHECK_MNT2_NFS_OPTS): Check for private NFS mount option (IRIX 6).
- * aux/macros/header_templates.m4 (MNTTAB_OPT_PRIVATE,
- MNT2_NFS_OPT_PRIVATE): Provide templates.
- * include/am_compat.h (MNTTAB_OPT_PRIVATE): Define if missing.
- * doc/am-utils.texi (opts Option): Document it.
-
-2003-10-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * doc/am-utils.texi (opts Option): Fix Tru64 UNIX name in proplist
- mount option.
-
-2003-10-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * libamu/mount_fs.c (compute_nfs_args) [HAVE_NFS_ARGS_T_FH_LEN]:
- Don't reference removed fh3.
-
-2003-10-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * NEWS: New minor port sparc-sun-solaris2.10 (Solaris 10).
-
- * INSTALL: Mention test status of various ports.
- Describe IRIX 6 autofs status.
-
-2003-10-09 Ion Badulescu <ionut@moisil.badula.org>
-
- * NEWS: updated
-
- * amd/amfs_generic.c (amfs_bgmount): don't use mf_fo until after
- we've done all the tests and we know we have a valid and mountable
- mntfs. Otherwise we could end up dereferencing null pointers.
-
- * amd/amd.h: fixed a copy&paste comment bug
-
- * amd/am_ops.c (ops_match): minor code cleanup
-
- * doc/am-utils.texi: fixed various typos; added warning about the
- racy nature of nfsx; removed duplicated listing of debug options;
- added paragraph about signals supported by hlfsd; removed the long
- list of (maybe) supported platforms since it duplicates the list
- in INSTALL.
-
-2003-10-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Simplify FD_SET etc. use.
-
- * include/am_defs.h (FD_SET, FD_ISSET, FD_CLR, FD_ZERO): Provide
- if missing.
- (rpc_pending_now, run_rpc): Use them.
- * configure.in: Check for fds_bits field in fd_set.
- * amd/nfs_start.c (run_rpc): Use it.
-
-2003-10-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Improve RPC XID handling.
-
- * amd/rpc_fwd.c (fwd_packet, fwd_reply): Always log xid.
- Convert xid to/from host/network byte order.
-
-2003-10-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Use NFS V2/V3 file handles instead of mount results.
-
- * include/am_utils.h (am_nfs_fhandle): Use NFS V2/V3 file handles
- only, not MOUNTPROC_MNT results.
- * amd/amfs_host.c (fetch_fhandle): Use local variables to store
- MOUNTPROC_MNT results.
- * amd/autil.c (amfs_mount): Use new am_nfs_fhandle_t.
- * amd/ops_nfs.c (struct fh_cache): New member fh_status.
- (got_nfs_fh): Use local variables to store MOUNTPROC_MNT results.
- Store MOUNTPROC_MNT errors in fh_status.
- (prime_nfs_fhandle_cache): Get fh_error from fh_status.
- * hlfsd/hlfsd.c (main): Use new am_nfs_fhandle_t.
- * libamu/mount_fs.c (compute_nfs_args): Copy NFS V2/V3 file
- handles straight from new am_nfs_fhandle_t.
-
-2003-10-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/clock.c (CID_ALLOC): Remove unused argument.
- (timeout): Likewise.
-
- * amd/ops_nfs.c (FHID_ALLOC): Remove unused argument.
- (prime_nfs_fhandle_cache): Likewise.
- (call_mountd): Use UDPMSGSIZE instead of magic constant.
-
- * amd/rpc_fwd.c (XID_ALLOC): Remove unused argument.
- (fwd_packet): Likewise.
- Handle TLOOK error from t_rcvudata().
-
-2003-09-30 Ion Badulescu <ionut@moisil.badula.org>
-
- * NEWS: updated
-
- * libamu/mount_fs.c (mount_fs): don't try to recreate the mount
- point if the mount fails with ENOENT: in the best case we would be
- papering over a bug, and in the worst case we could cause a
- deadlock (with autofs). If there are races, they need to be
- exposed and fixed properly.
-
- * conf/autofs/autofs_solaris_v1.h,
- conf/autofs/autofs_solaris_v2_v3.h,
- conf/autofs/autofs_linux.h: (AUTOFS_NFSX_FS_FLAGS): autofs
- semantics don't allow us to mount nfsx directly onto an autofs
- mountpoint, so disallow it
-
- * amd/amfs_nfsx.c (amfs_nfsx_match): more restrictive sanity check
- to avoid trying to memmove(foo, bar, (unsigned)-1) due to invalid
- map entries...
- (amfs_nfsx_cont): amfs_retry does most of the cleanup work for us
- in the upper layer, so don't do anything else beside wakeup() on
- success
- (amfs_nfsx_remount): only create the mountpoints as we need them,
- avoids creating them on the wrong filesystem in the case of
- hierarchical mounts; fix crash-generating typo (m should really be
- mf and I swear I hate single-character variable names)
-
- * amd/amfs_generic.c (amfs_cont): one more dlog
- (amfs_bgmount): amazingly enough, even foreground mounts can be
- backgrounded (in the case of nfsx), so account for this
- possibility and permit retries
-
- * m4/macros/check_autofs_style.m4 (AMU_AUTOFS_PROT_HEADER): define
- and AC_SUBST it as ${top_builddir}/amu_autofs_prot.h
-
- * amd/Makefile.am ($(amd_OBJECTS) $(EXTRA_amd_OBJECTS)): depend on
- @AMU_AUTOFS_PROT_HEADER@
-
-2003-09-29 Erez Zadok <ezk@urd.fsl.cs.sunysb.edu>
-
- * minor new port mipsel-unknown-linux-rhPS2 (Linux on Sony
- PlayStation 2)
-
- * amd/srvr_nfs.c (find_nfs_srvr): don't run code that expects
- "char protocols[]" unless MNTTAB_OPT_PROTO is defined.
-
-2003-09-26 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Consolidate alloca support.
-
- * amd/amq_svc.c: Move alloca support ...
- * include/am_defs.h: ... here.
- * amd/conf_parse.y: Remove alloca support.
- * fsinfo/fsi_gram.y: Likewise.
-
-2003-09-25 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Handle Solaris 10.
- * m4/macros/check_nfs_prot_headers.m4
- (AMU_CHECK_NFS_PROT_HEADERS): Don't use wildcards for
- sunos5.[0-3], solaris 2.[0-3], there were no micro releases.
- Explicitly match sunos5*, solaris2* for Solaris 8 and beyond.
-
- * m4/macros/os_cflags.m4 (AMU_OS_CFLAGS): Dont use wildcards for
- solaris2.[0-5], sunos5.[0-5], but explicitly handle Solaris 2.5
- micro releases to cope with Solaris 2.5.1.
- Explicitly match solaris2*, sunos5*.
-
-2003-09-25 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/amq_svc.c: Provide alloca prerequisites.
-
- * conf/transp/transp_tli.c (register_autofs_service): Fix typo.
-
-2003-09-23 Ion Badulescu <ion@opteron.tower-research.com>
-
- * minor new port: x86_64-unknown-linux-rh2.9.5AS. (Red Hat
- Enterprise Linux 3.0 beta running on a 64-bit AMD64 platform)
-
-2003-09-22 Ion Badulescu <ionut@buggy.badula.org>
-
- * conf/autofs/autofs_solaris_v1.c (autofs_mount_fs): compile fix
-
-2003-09-19 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/amfs_nfsl.c (amfs_nfsl_match): checking opt_fs is not always
- enough, we should lstat() the sublink if it's defined.
- (amfs_nfsl_ffserver): ditto
- (ALL): Removed some obsolete comments. The nfsl code is now little
- more than a very straight-forward switch between link and nfs.
-
- * amd/amfs_link.c (amfs_link_match): more up-to-date explanation
- for the prepend-the-dot hack for type link; also, the sublink is
- already normalized and absolute, so take advantage of that
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): the sublink is
- already normalized and absolute, so take advantage of that
-
- * amd/am_ops.c (ops_match): normalize the sublink here, early into
- the matching process
-
- * amd/autil.c (am_mounted): be consistent and accept both
- "nounmount" and "noumount" as pseudo mount options (same as
- "unmount" and "umount" nearby)
-
- * amd/Makefile.am (build_version.h): fixed dependencies (depends
- on amd_OBJECTS, not OBJECTS -- which doesn't even exist)
-
-2003-09-19 Erez Zadok <ezk@dhcp8.fsl.cs.sunysb.edu>
-
- * amd/amq_subr.c (amqproc_export_1_svc): force double casting to
- avoid gcc-3.3 complaints on Solaris 9 about "dereferencing
- type-punned pointer will break strict-aliasing rules".
-
-2003-09-16 Ion Badulescu <ionut@moisil.badula.org>
-
- * Released beta version 6.1b4
-
-2003-09-15 Ion Badulescu <ionut@moisil.badula.org>
-
- * doc/am-utils.texi (opts Option): removed documentation for old
- ignore_portmapper mount option, documented the new webnfs option
-
- * NEWS: webnfs support
-
- * amd/srvr_nfs.c (find_nfs_srvr): set MFF_WEBNFS if the "webnfs"
- (former "ignore_portmapper") mount option is present
-
- * amd/ops_nfs.c (prime_nfs_fhandle_cache): generate a public
- filehandle (all zeros) if MFF_WEBNFS is set
- (nfs_umounted): don't talk to mountd if MFF_WEBNFS is set
-
- * amd/amd.h (MFF_WEBNFS): new flag, obvious meaning
-
-2003-09-13 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/srvr_nfs.c: renamed np_xid to global_xid; sanitized the
- NPXID_ALLOC macro and renamed it to XID_ALLOC; renamed start_ping
- to create_ping_payload; renamed nfs_pinged to
- nfs_keepalive_callback; renamed nfs_timed_out to
- nfs_keepalive_timeout; renamed nfs_srvr_port to get_mountd_port;
- made ping_buf and ping_len arrays with one element for each
- supported nfs version
-
- * amd/amd.h: renamed nfs_srvr_port() to get_mountd_port()
-
- * amd/amfs_host.c (amfs_host_init): ditto
-
- * amd/ops_nfs.c (call_mountd): ditto
-
-2003-09-03 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * BUGS: Mention fix for broken Solaris 8 <rpcsvc/autofs_prot.h>
- patches.
-
-2003-08-31 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * amd/autil.c (strealloc): don't call malloc_verify() unless it
- exists.
-
- * configure.in: move "OPTION PROCESSING" section (opt_debug etc.)
- after we figure out PROG_CC and other compiler features, because
- some of the option processing macros need a compiler to function.
-
- * libamu/xutil.c: don't define variables that won't be used unless
- mallinfo() and malloc_verify() exist.
- (real_plog): don't call checkup_mem unless
- mallocinfo() and malloc_verify() exist.
- (checkup_mem): don't define this function unless mallocinfo() and
- malloc_verify() exist.
-
- * m4/macros/opt_debug.m4: check for functions malloc_verify and
- mallinfo in general libraries and then in libmapmalloc and
- libmalloc. These seem to have disappeared in FreeBSD 5.x.
-
- * libamu/xutil.c (dxfree): print pointer using %p
-
-2003-08-29 Erez Zadok <ezk@a-opendarwin.fsl.cs.sunysb.edu>
-
- * configure.in: start 6.1b4-pre officially (belated)
-
- * minor new port: i686-apple-darwin6.6
-
-2003-08-27 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_solaris_v1.c: convert relative targets to
- absolute paths when using lofs mounts
-
- * conf/autofs/autofs_solaris_v2_v3.c: ditto
-
- * conf/autofs/autofs_linux.c: ditto
-
-2003-08-27 Ion Badulescu <ionut@buggy.badula.org>
-
- * README.autofs: added a paragraph about the resource consumption
- of auto maps over autofs
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): moved the setting of
- the MFF_IS_AUTOFS flag from init_mntfs() to
- amfs_lookup_one_mntfs(), where it belongs
-
- * amd/mntfs.c (init_mntfs): ditto
-
-2003-08-27 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/ops_nfs.c (got_nfs_fh): make the error EACCES if we are
- denied a filehandle by the server (used to be EIO)
-
-2003-08-27 Erez Zadok <ezk@a-bsdi42.fsl.cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_bsdi3.h: support na_uid and na_gid.
-
-2003-08-27 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_linux.c (autofs_mount_succeeded): force
- daemon-initiated timeouts on autofs filesystems, since apparently
- they appear as "always busy" to the kernel-based expiration routine
-
-2003-08-26 Ion Badulescu <ionut@buggy.badula.org>
-
- * NEWS: updated
-
- * conf/autofs/autofs_linux.h (AUTOFS_LINK_FS_FLAGS): remove
- FS_ON_AUTOFS
- (AUTOFS_LINKX_FS_FLAGS): ditto
-
- * conf/autofs/autofs_solaris_v1.h (AUTOFS_LINK_FS_FLAGS): remove
- FS_ON_AUTOFS
- (AUTOFS_LINKX_FS_FLAGS): ditto
-
- * conf/autofs/autofs_solaris_v2_v3.h (AUTOFS_LINK_FS_FLAGS): remove
- FS_ON_AUTOFS
- (AUTOFS_LINKX_FS_FLAGS): ditto
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): don't modify the
- original opt_fs, instead store the new mount point for autofs in a
- temporary variable and pass it around. Fixes a problem with the
- link side of nfsl.
-
-2003-08-25 Ion Badulescu <ionut@moisil.badula.org>
-
- * NEWS: updated
-
- * amd/ops_nfs.c (prime_nfs_fhandle_cache): use get_mntfs_wchan to
- initialize the fh_wchan member of the cache entry
- (prime_nfs_fhandle_cache): use get_mntfs_wchan for the wchan_t
- argument of call_mountd()
-
- * amd/map.c (free_map_if_success): use get_mntfs_wchan for the
- wchan_t argument of wakeup()
-
- * amd/amfs_nfsx.c (amfs_nfsx_cont): use get_mntfs_wchan for the
- wchan_t argument of wakeup_task() and wakeup()
-
- * amd/amfs_host.c (amfs_host_init): use get_mntfs_wchan for the
- wchan_t argument of nfs_srvr_port()
-
- * amd/amfs_generic.c (ALL): use get_mntfs_wchan for the wchan_t
- argument of sched_task() and wakeup()
- (amfs_retry): minor cleanup
- (amfs_bgmount): call nfs_quick_reply on failure
-
- * amd/sched.c (get_mntfs_wchan): new function which calls the
- member function get_wchan if defined, otherwise returns the mntfs
- pointer itself
-
- * amd/amfs_inherit.c (amfs_inherit_get_wchan): new function,
- calls get_mntfs_wchan() on the inherited filesystem
-
- * amd/amfs_*.c, amd/ops_*.c: initialize the new get_wchan member
- of the ops to 0
-
- * amd/amd.h: new function type vget_wchan
- (struct mntfs): new member get_wchan which returns the waiting
- channel associated with the mntfs (normally itself)
-
-2003-08-22 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * conf/mount/mount_linux.c (parse_opts): minor cleanup
-
- * conf/autofs/autofs_linux.c (autofs_handle_fdset): added missing
- break in case autofs_ptype_expire_multi
-
-2003-08-22 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_solaris_v1.h: undefine autofs support if
- autofs_args_t cannot be determined (hopefully fixes a reported
- IRIX 6.5.4 problem).
-
- * conf/autofs/autofs_solaris_v1.c: wrap entire file in #ifdef
- HAVE_FS_AUTOFS / #endif (see above)
-
- * conf/autofs/autofs_linux.h: undefine autofs support if the
- necessary header files are not found (fixes a reported RedHat 6.2
- Sparc problem).
-
- * conf/autofs/autofs_linux.c: wrap entire file in #ifdef
- HAVE_FS_AUTOFS / #endif (see above)
-
- * libamu/mount_fs.c (compute_nfs_args): only use MNT2_NFS_OPT_SOFT
- if autoconf detected it (fixes a reported RedHat 6.2 Alpha problem).
-
- * amd/map.c (unmount_mp, unmount_exported): move the code that
- changes the fattr from NFLNK to NFDIR from unmount_mp to
- unmount_exported, it was causing troubles (ESTALE) after failed
- unmounts. This is still very very unclean, but it's the same as the
- old 6.0 code.
-
-2003-08-22 Nick Williams <Nick.Williams@morganstanley.com>
-
- * amd/info_ldap.c (amu_ldap_init): don't try to pass a null
- pointer as a string to plog, Solaris (and other OS's) don't like
- it and will dump core.
-
-2003-08-13 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amd.h: introduced two new types, wchan_t and opaque_t, as
- aliases of voidp. This makes reading the code easier on the eyes. :)
-
- * ALL: replace various instances of voidp with wchan_t and
- opaque_t, as appropriate
-
-2003-08-13 Ion Badulescu <ionut@nicu.badula.org>
-
- * NEWS, configure.in: bumped version up to 6.1b4-pre
-
-2003-08-13 Ion Badulescu <ionut@moisil.badula.org>
-
- * Released beta version 6.1b3
-
-2003-08-13 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * conf/autofs/autofs_linux.c (autofs_mount_fs): HACK: always use
- symlinks for host mounts; assorted fixes for the symlink mode
-
-2003-08-05 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/umount/umount_default.c (umount_fs): enable space hack
- handling for autofs v1
-
- * amd/map.c (get_first_exported_ap, get_next_exported_ap): new
- functions that facilitate iterating through the list of
- mountpoints
-
- * amd/amfs_union.c (amfs_union_mounted): use get_first_exported_ap
- and get_next_exported_ap
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_unmount_2_req): ditto
-
-2003-08-04 Erez Zadok <ezk@ulkesh.dyn.optonline.net>
-
- * configure.in: check if system stores mount tables in files
- (usually in /etc), and configure couldn't find a definition for
- either struct mntent or struct mnttab. If so, abort configure
- because this could be a new/misconfigured system, or a bug in
- am-utils.
-
-2003-08-04 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_umount_fs): fix
- compile warning
-
-2003-08-04 Ion Badulescu <ionut@buggy.badula.org>
-
- * conf/autofs/autofs_linux.c (autofs_mount_fs): don't call
- ops->mount_fs() for an already mounted filesystem
- (autofs_umount_fs): only call ops->umount_fs() if we're holding
- the last reference to the filesystem
-
- * conf/autofs/autofs_solaris_v1.c (autofs_mount_fs): ditto
- (autofs_umount_fs): ditto
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_mount_fs): ditto
- (autofs_umount_fs): ditto
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): remove the shortcut for
- already-mounted filesystems
- (amfs_cont): only release the autofs_fh if the filesystem is not
- mounted; add another comment about the NFS_SCALEDOWN hack
- (amfs_bgmount): if the mntfs is already mounted, skip just the
- filesystem initialization, but do call mount_node()
-
- * amd/map.c (mount_node): always call autofs_mount_fs(), but only
- call ops->mount_fs() if the mntfs is not yet mounted
- (unmount_node): always call autofs_umount_fs(), but only call
- ops->umount_fs() if the refcount on the mntfs equals 1.
-
-2003-08-02 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_openbsd.h: include <ufs/ufs/ufsmount.h>
- here with the proper workarounds for openbsd3.3 (define MAXQUOTAS,
- define dummy struct netexport, and include <ufs/ufs/extattr.h>
- wrapped in _KERNEL).
-
- * conf/nfs_prot/nfs_prot_freebsd3.h: include <ufs/ufs/ufsmount.h>
- here with the proper workarounds for freebsd5.1 (define dummy
- struct ufs_extattr_per_mount).
-
- * conf/nfs_prot/nfs_prot_bsdi2.h: include <ufs/ufs/ufsmount.h>
- here with the proper workarounds for bsdi2 (define MAXQUOTAS and
- dummy struct netexport).
-
- * include/mount_headers1.h: do not include <ufs/ufs/ufsmount.h>
- here, b/c every *BSD system has some sort of problem in including
- this header file, which includes ugly workarounds. Inclusion of
- this header was already moved out of am_defs.h (used to compile
- amd), but we forgot to move it out of mount_headers1.h (used to
- configure). The specific inclusion of ufsmount.h is now in the OS
- specific nfs_prot.h file.
-
- * configure.in: if configure could not find any definition for
- "struct nfs_args", abort configure with an explanatory message.
- There's no point in continuing, as this could be a system bug,
- buggy am-utils, or a new system to which am-utils wasn't ported to
- yet.
-
- * minor new port: i386-pc-solaris2.9
-
-2003-08-01 Ion Badulescu <ionut@buggy.badula.org>
-
- * doc/am-utils.texi (NFS-Link Filesystem): make the documentation
- match the code (as well as basic logic operations: the negation of
- 'a or b' is 'not a and not b', not 'not a or not b')
-
-2003-08-01 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * minor new port: i386-unknown-openbsd3.3.
-
- * m4/macros/check_libwrap_severity.m4: new macro to check if
- libwrap includes the integer variables deny_severity and
- allow_severity, since some libwrap implementations do and others
- don't. The test tries to compile and run a simple empty main()
- program, then the same program while defining these two variables:
- comparing the results of the two tests, we can tell whether we
- should define NEED_LIBWRAP_SEVERITY_VARIABLES.
-
- * Makefile.am (EXTRA_DIST_M4): distribute new macro
- check_libwrap_severity.m4.
-
- * m4/macros/header_templates.m4: template for HAVE_LIBWRAP (which
- we must define explicitly since we've overridden the
- action-if-found in AC_CHECK_LIB(wrap). Also template for
- NEED_LIBWRAP_SEVERITY_VARIABLES.
-
- * amd/amq_svc.c: if libwrap does not include the severity
- variables, then define and initialize them here.
-
- * amd/Makefile.am (LIBS): explicitly include @WRAPLIB@ only for
- Amd binary. Other am-utils binaries don't need -lwrap.
-
- * configure.in: if libwrap is found, only define it in @WRAPLIB@,
- so we don't automatically link every am-utils binary with -lwrap.
- Run test for existence of severity variables in libwrap.
-
-2003-07-31 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_openbsd.h: define struct fattr fields uid
- and gid.
-
- * configure.in: move check for AC_CHECK_LIB(libwrap) as far down
- as possible because on modern tcpwrapper systems such as openbsd,
- the caller must provide two symbols: deny_severity and
- allow_severity, which determine the logging level of rejected and
- requested requests, respectively. If this check happens too
- early, then $LIBS includes -lwrap, which causes many subsequent
- tests that need to run a compiled program to fail with missing
- symbols.
-
- * m4/macros/header_templates.m4: fix typo in template for
- readdirplus.
-
- * configure.in: check for <ufs/ufs/extattr.h> (OpenBSD 3.3)
-
- * minor new port: i386-unknown-netbsdelf1.6.1.
-
- * configure.in: save state before system-specific tests are run.
-
- * m4/macros/check_gnu_getopt.m4: do NOT abort ./configure just
- because the compiled test program failed to run.
-
-2003-08-01 Ion Badulescu <ionut@buggy.badula.org>
-
- * NEWS, README.autofs: updated
-
- * libamu/mount_fs.c (mount_fs): added support for the space hack
-
- * doc/am-utils.texi: mention than UFS/XFS/EFS/CacheFS filesystems
- are not expired by default; correct and expand the section
- describing the program filesystem
-
- * conf/autofs/autofs_solaris_v2_v3.h (AUTOFS_*_FS_FLAGS): add
- FS_ON_AUTOFS for supported filesystems
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_mount_fs): call
- mf->mount_fs()
- (autofs_umount_fs): call mf->umount_fs()
-
- * conf/autofs/autofs_solaris_v1.h (autofs_strdup_space_hack): add
- prototype for malloc()
- (AUTOFS_*_FS_FLAGS): lose the FS_MKMNT flags, add FS_ON_AUTOFS for
- supported filesystems
-
- * conf/autofs/autofs_solaris_v1.c (autofs_mount_fs): add support
- for the space hack; call mf->mount_fs()
- (autofs_umount_fs): add support for the space hack; call
- mf->umount_fs()
- (autofs_mount_succeeded): add support for the space hack
-
- * conf/autofs/autofs_linux.h: lose the FS_MKMNT flags, add
- FS_ON_AUTOFS for supported filesystems
-
- * conf/autofs/autofs_linux.c (AUTOFS_MAX_VERSION): define to
- AUTOFS_MAX_PROTO_VERSION instead of hardcoding to 4
- (autofs_mounted): host mounts are now supported on all autofs
- versions, remove the hack to turn it off on v3
- (autofs_mount_fs): call mf->mount_fs(), create/remove mountpoints
- as needed
- (autofs_umount_fs): call mf->umount_fs(), remove mountpoints on
- success
- (ALL): use '#if AUTOFS_MAX_VERSION >= 4' instead of
- '#ifdef autofs_ptype_expire_multi'
-
- * amd/map.c (mount_node): autofs_mount_fs() now calls
- mf->mount_fs() internally
- (unmount_node): autofs_umount_fs() now calls mf->umount_fs()
- internally
-
- * amd/autil.c (am_mounted): minor cleanup
-
- * amd/amfs_program.c (amfs_program_ops): added FS_MKMNT to
- nfs_fs_flags
-
- * amd/amfs_generic.c (amfs_lookup_one_mntfs): use the FS_ON_AUTOFS
- flag instead of hardcoding filesystem types
- (amfs_bgmount): better mount_type logging
-
- * amd/amd.h (FS_ON_AUTOFS): new flag which tells the code that
- this filesystem can be mounted directly onto an autofs mountpoint
-
-2003-07-31 Ion Badulescu <ionut@buggy.badula.org>
-
- * amd/amfs_nfsl.c (amfs_nfsl_umount): fix copy&paste error (was
- calling amfs_link_ops.umount_fs() for NFS filesystems)
- (amfs_nfsl_umounted): remove rmdirs() hack, it is now handled
- properly elsewhere
- (amfs_nfsl_ffserver): remove FS_MKMNT from mf_fsflags if we're
- using link (not NFS)
-
-2003-07-31 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * README.autofs: Correct IRIX spelling.
- AutoFS support exists only on IRIX 6.
- Update IRIX 6 status.
-
- Allow AutoFS V1 support to compile on IRIX 6.
- * conf/autofs/autofs_solaris_v1.c (autofs_mount_1_req): Add
- SVCXPRT * arg.
- Remove superfluous \n from dlog messages.
- (autofs_unmount_1_req): Likewise.
- Switch to get_exported_ap.
- (autofs_program_1): Invoke handlers with additional transp arg.
- * conf/autofs/autofs_solaris_v1.h: Use autofs_args_t to define
- autofs_fh_t, struct auto_args doesn't exist on IRIX 6.
-
- * conf/mount/mount_irix6.c (mount_irix) [HAVE_FS_AUTOFS]: Support
- AutoFS mounts.
- [HAVE_FS_LOFS]: Likewise for lofs mounts.
-
- * conf/nfs_prot/nfs_prot_irix6.h (AUTOFS_CONFTYPE): Define.
- Don't disable AutoFS support any more.
-
- * conf/transp/transp_sockets.c [HAVE_FS_AUTOFS && AUTOFS_PROG]
- (register_autofs_service): Define autofs_xprt.
-
- * m4/macros/check_autofs_style.m4 (AMU_CHECK_AUTOFS_STYLE): Update
- Solaris 8+ comment to mention AutoFS V4.
- (irix6*): Enable AutoFS V1 support on IRIX 6.
-
-2003-07-30 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * NEWS, doc/am-utils.texi, scripts/amd.conf.5: revised explanation
- of autofs_use_lofs.
-
-2003-07-30 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/ops_efs.c (efs_mount): Replace on_autofs arg with
- MFF_ON_AUTOFS flag.
- (efs_umount): Likewise.
-
-2003-07-30 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * conf/umount/umount_bsd44.c (umount_fs): convert to new way of
- unmounting which takes autofs into account.
-
-2003-07-30 Ion Badulescu <ionut@moisil.badula.org>
-
- * ALL: renamed MFF_AUTOFS to MFF_IS_AUTOFS; removed mf_real_mount
- hack; pass a new on_autofs argument to mount/umount function,
- based on the MFF_ON_AUTOFS mntfs flag
-
- * NEWS, README.autofs: updated
-
- * scripts/amd.conf.5: document new option autofs_use_lofs
-
- * scripts/amd.conf-sample (autofs_use_lofs): document new option
-
- * m4/macros/check_autofs_style.m4 (am_utils_link_files): symlink
- the autofs header as amu_autofs_prot.h instead of slurping it into
- aux_conf.h
-
- * libamu/mount_fs.c (mount_fs): removed old stub, renamed
- mount_fs2 to mount_fs, added new argument on_autofs
-
- * doc/am-utils.texi (Direct Automount Filesystem): document
- problems with nfs direct mounts on modern kernels, document good
- autofs support for direct mounts on Solaris
- (autofs_use_lofs Parameter): document this new option
- (browsable_dirs Parameter): note that mount storms are avoided
- when using autofs
-
- * conf/umount/umount_bsd44.c (umount_fs): removed old stub,
- renamed umount_fs2 to umount_fs
-
- * conf/umount/umount_osf.c (umount_fs): removed old stub,
- renamed umount_fs2 to umount_fs, added new argument on_autofs
-
- * conf/umount/umount_default.c (umount_fs): ditto as above; return
- an error on ENOENT instead of faking success
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_lookup_2_req): much
- simplified, now only consults the map for existance of the key and
- returns success if key is found
- (autofs_mount_2_req): request symlinks if CFM_AUTOFS_USE_LOFS is
- not on;
- (autofs_mount_2_free): implemented
- (autofs_unmount_2_req): use get_exported_ap() instead of
- referencing export_ap directly
- (autofs_mount_succeeded): remove code for replying to lookup
- requests, now only mount requests can end up here
- (autofs_mount_failed): ditto
-
- * conf/autofs/autofs_solaris_v1.h (AUTOFS_HOST_FS_FLAGS): removed
- FS_AUTOFS
- (AUTOFS_DIRECT_FS_FLAGS): added FS_DIRECTORY
-
- * conf/autofs/autofs_solaris_v2_v3.h (AUTOFS_HOST_FS_FLAGS): removed
- FS_AUTOFS
- (AUTOFS_DIRECT_FS_FLAGS): added FS_DIRECTORY
- (AUTOFS_LINK_FS_FLAGS): added FS_MBACKGROUND
-
- * conf/autofs/autofs_linux.c (autofs_bind_umount): new function,
- factored out of autofs_umount_fs()
- (autofs_mount_fs): renamed from autofs_link_mount() and expanded
- to deal with filesystems mounted indirectly (via lofs/bind
- mounts) on autofs and to observe the new CFM_AUTOFS_USE_LOFS flag
- (autofs_umount_fs): ditto, from autofs_link_umount()
-
- * conf/autofs/autofs_solaris_v1.c (autofs_mount_fs): ditto
- * (autofs_umount_fs): ditto
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_mount_fs): ditto
- * (autofs_umount_fs): ditto
-
- * amd/opts.c: made fs_static static
-
- * amd/ops_nfs.c: made nfs_init, nfs_match, nfs_mount, nfs_umount
- and nfs_umounted static
- (mount_nfs_fh): removed unnecessary arguments
-
- * amd/ops_cachefs.c (cachefs_ops): use amfs_generic_find_srvr for
- the ffserver method, because using NULL causes problems
-
- * amd/ops_cdfs.c (cdfs_ops): ditto
-
- * amd/ops_efs.c (efs_ops): ditto
-
- * amd/ops_lofs.c (lofs_ops): ditto
-
- * amd/ops_pcfs.c (pcfs_ops): ditto
-
- * amd/ops_ufs.c (ufs_ops): ditto
-
- * amd/ops_xfs.c (xfs_ops): ditto
-
- * amd/nfs_subr.c (fh_to_mp3, fh_to_mp, mp_to_fh): moved here from
- map.c
-
- * amd/nfs_start.c: use get_exported_ap() instead of referencing
- exported_ap directly
-
- * amd/mntfs.c (locate_mntfs): new function, factored out of
- find_mntfs
- (locate_mntfs): special-case FS_DIRECT filesystems: for direct
- mounts we will have two filesystems mounted on the same m/p
- (realloc_mntfs): removed the old EZK hack for failovers
-
- * amd/map.c (get_exported_ap): new function that returns an
- exported_ap member by its index
- (root_node,exported_ap,exported_ap_size,first_free_map,last_used_map):
- made static
- (fh_to_mp3, fh_to_mp, mp_to_fh): moved to nfs_subr.c
- (get_root_ap): removed unused second argument
- (unmount_mp): moved the mk_fattr(NFDIR) here from umount_exported
- to catch more cases
- (mount_node): call autofs_mount_fs after ops->mount_fs for autofs
- nodes
- (unmount_node): call autofs_umount_fs before ops->umount_fs for
- autofs nodes
-
- * amd/conf.c: new global option "autofs_use_lofs", takes yes/no
- values
-
- * amd/autil.c (amfs_mount): take an extra argument (mf)
- (amfs_mount): call autofs_compute_mount_flags() for mounts
- directly on autofs m/p
- (am_unmounted): document and avoid the race between am_umounted()
- at shutdown time and amfs_cont()
-
- * amd/amfs_union.c (amfs_union_mounted): use get_exported_ap()
- instead of referencing internal map variables directly
-
- * amd/amq_subr.c (amqproc_export_1_svc): ditto
-
- * amd/amfs_toplvl.c (amfs_toplvl_ops): removed FS_AUTOFS from
- nfs_fs_flags
- (amfs_toplvl_mount): pass extra argument (mf) to amfs_mount()
- (amfs_toplvl_umount): refuse to attempt the unmount if the
- mountpoint is not a directory
-
- * amd/amfs_nfsx.c (amfs_nfsx_init): propagate the MFF_ON_AUTOFS
- flag into the nfs f/s at the bottom of the stack
-
- * amd/amfs_nfsl.c: call nfs and link member functions through
- their respective am_ops structures, not directly
-
- * amd/amfs_linkx.c (amfs_linkx_umount): new static stub
-
- * amd/amfs_link.c: made amfs_link_mount() and amfs_link_umount()
- static functions
- (amfs_link_mount): removed call to autofs_link_mount()
- (amfs_link_umount): removed call to autofs_link_umount()
-
- * amd/amfs_host.c (amfs_host_ops): removed FS_AUTOFS from
- nfs_fs_flags
- (do_mount): removed superfluous function arguments
-
- * amd/amfs_direct.c (amfs_direct_ops): removed FS_AUTOFS from
- nfs_fs_flags
-
- * amd/amfs_auto.c (amfs_auto_ops): removed FS_AUTOFS from
- nfs_fs_flags
- (amfs_auto_mount): pass extra argument (mf) to amfs_mount
-
- * amd/amd.h (CFM_AUTOFS_USE_LOFS): new flag, tells amd whether to
- use lofs-mounts or symlinks when mounting on autofs
- (CFM_DEFAULT_FLAGS): added CFM_AUTOFS_USE_LOFS
- (VLOOK_LOOKUP): new flag, will merely check if a key exists
- (MFF_IS_AUTOFS): renamed from MFF_AUTOFS
- (MFF_ON_AUTOFS): new flag, tells amd if a f/s is mounted directly
- on an autofs m/p, or indirectly via a lofs mount/symlink
- (fh_to_mp2): macro expanded throughout the code and removed
- (mntfs): removed mf_real_mount hack
- (autofs_mount_fs): renamed from autofs_link_mount
- (autofs_umount_fs): renamed from autofs_link_umount
- (mount_lofs): exposed
- various other cleanups, functions/variables made static and removed
-
- * aux_conf.h.in: removed @am_utils_autofs_style@, it is now
- included directly as amu_autofs_prot.h
-
-2003-07-24 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * doc/am-utils.texi, scripts/amd.conf.5: document that
- use_tcpwrappers is "yes" by default.
-
- * amd/amd.c (init_global_options): set default global options.
-
- * amd/amd.h (CFM_DEFAULT_FLAGS): define default options which
- are always on (plock and use_tcpwrappers).
-
- * scripts/amd.conf-sample: reorganize values per option so default
- one is listed first.
-
-2003-07-23 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * tasks: trim old stuff. Discuss new parser.
-
- * amd/conf.c (set_conf_kv): initialize the very first map in conf
- file from global defaults. Bug fix which was introduced after
- conf.c code restructuring.
-
-2003-07-18 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * m4/macros/header_templates.m4: template for
- HAVE_EXTERN_HOSTS_CTL.
-
- * include/am_defs.h: define extern for hosts_ctl() if needed.
-
- * configure.in (AMU_CHECK_EXTERNS): check for extern definition
- for libwrap's hosts_ctl() (FreeBSD 5.0 doesn't have it).
-
- * m4/macros/check_extern.m4: include tcpd.h if it and libwrap exist.
-
-2003-07-18 Erez Zadok <ezk@cs.sunysb.edu>
-
- * hlfsd/hlfsd.h: redundant extern for mboxfile removed.
-
- * amd/amq_svc.c (amq_program_1): only check for tcpwrappers if
- amd.conf global option use_tcpwrappers=yes.
-
- * scripts/amd.conf.5, scripts/amd.conf-sample (use_tcpwrappers),
- doc/am-utils.texi (use_tcpwrappers Parameter): document new
- amd.conf global option.
-
- * amd/conf.c (gopt_use_tcpwrappers): define a new amd.conf global
- option called use_tcpwrappers ("no" by default).
-
- * amd/amq_svc.c (amqsvc_is_client_allowed): include tcpd/libwrap
- code only if both libwrap and tcpd.h exist.
- (amq_program_1): log warning when an Amq service client is denied,
- and a debug message when a client is allowed.
-
- * amd/amd.h (CFM_USE_TCPWRAPPERS): define [global] amd.conf flag.
- (AMD_SERVICE_NAME): define AMD_SERVICE_NAME for tcpd/libwrap.
-
- * include/am_defs.h: include tcpd.h if available and libwrap
- available.
-
- * configure.in: check for tcpd.h.
-
-2003-07-18 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * scripts/expn.1, amd/amd.8 amq/amq.8, fixmount/fixmount.8,
- hlfsd/hlfsd.8, scripts/expn.1: remove ".PD 0" nroff command
- because it removes useful spaces in between paragraphs. Based on
- smaller patch from Philippe Troin <phil@fifi.org>.
-
-2003-07-17 Philippe Troin <phil@fifi.org>
-
- * amq/amq.8: Document the libwrap/amd behavior.
-
- * amd/amq_svc.c (libwrap_check_client): New function to validate
- an amq connection with libwrap.
- (amq_program_1): Call libwrap_check_client() and close the
- connection if libwrap does not allow it.
-
- * configure.in: Check for the tcp wrappers library.
-
-2003-07-17 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * amd/amq_subr.c (amqproc_mnttree_1_svc, amqproc_stats_1_svc,
- amqproc_getmntfs_1_svc, xdr_amq_mount_tree), hlfsd/hlfsd.c
- (hlfsd_init): cast pointers to void* before casting them to
- another type, to avoid gcc-3.3 -Wall warnings.
-
- * fsinfo/*.[hc]: rename fsinfo function log() to fsi_log(), to
- avoid conflict with builtin function in gcc-3.3.
-
-2003-07-17 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * scripts/amd.conf-sample: Remove obsolete comment.
-
-2003-07-16 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/info_file.c (read_line): check for errors from fgets().
- Although rare, they can occur upon disk or network failures.
- Patch from Nick Williams <Nick.Williams@morganstanley.com>.
-
-2003-07-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * BUGS (Solaris 8): Update patch revisions, mention old autofs
- patches, fix filenames and rpcgen command.
-
-2003-07-15 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * doc/am-utils.texi (map_defaults Parameter): document new
- map_defaults option.
-
- * scripts/amd.conf.5: document new map_defaults option.
-
- * scripts/amd.conf-sample (map_type): show examples of new
- map_defaults option.
-
- * amd/mapc.c (mapc_create): initialize mnt_map->cfm field to NULL.
-
- * amd/get_args.c (get_args): call process_all_regular_maps().
-
- * amd/conf.c: keep head and tail of cfm list.
- (init_cf_map): reworked reset_cf_map. This one doesn't reset a
- globaly reused cfm, but rather just inherits [global] options.
- (set_conf_kv): just store global/map options without actually
- creating any mnt_map's. Essentially, we now parse the whole
- amd.conf file, and then try to process the maps one at a time.
- (process_one_regular_map): new function to process one map, just
- renamed from process_regular_map.
- (process_all_regular_maps): new exported function to process all
- maps. No need for hacky process_last_map().
- (find_cf_map): new exported function to return a cf_map_t given a
- map's mount point (e.g., /home or /net).
-
- * amd/amfs_generic.c (amfs_parse_defaults): find if amd.conf
- specificed a map_defaults for a given map. If so, use that
- instead of the /defaults that came from the map itself. Also
- restructure code a bit so it's not one huge long "if" statement.
-
- HACK ALERT: there's no easy way to find out what the map mount
- point is at this point, so I am forced to initialize the
- mnt_map->cfm field here for the first time, upon the very first
- search for a /defaults entry in this map. This initialization is
- much better done in mapc_create(), but it's impossible to do that
- there with the current code structure.
-
- * amd/amd.h: struct cf_map becomes linked list. struct mnt_map
- includes pointer to cf_map_t, amd.conf defaults and options for a
- given map. extern cleanups.
-
-2003-07-15 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * amd/info_hesiod.c (hesiod_search): It's not possible to have a
- key such as ".access" in a hesiod map as that would imply a null
- node in the DNS tree. So a lookup for such a key must clearly
- fail. With the current info_hesiod.c it does (after calling
- hes{,iod}_resolve) but returns an error that confuses some
- programs - eg. apache. This patch shortcuts the process and just
- returns ENOENT for any key starting with ".". Patch submitted by
- by Mark Davies <mark@mcs.vuw.ac.nz>.
-
- * include/am_utils.h (CALLOC): redefine macro to use xzalloc, not
- fsinfo's own xcalloc.
-
- * fsinfo/fsi_util.c (xcalloc): remove redundant function.
-
-2003-07-14 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_compat.h (MNTTAB_OPT_XLATECOOKIE): The NetBSD
- xlatecookie NFS option doesn't work as MNTTAB_OPT_XLATECOOKIE is
- never defined. Define it as needed. Patch from Mark Davies
- <mark@mcs.vuw.ac.nz>.
-
-2003-07-14 Ion Badulescu <lionut@gonzales.badula.org>
-
- * BUGS (Note): document the Solaris 8 bug (the upgrade to autofs
- v4 without updating all the header files)
-
-2003-07-13 Ion Badulescu <lionut@gonzales.badula.org>
-
- * NEWS, tasks: updated
-
- * amd/amfs_generic.c (free_continuation): free _all_ mntfs's in
- the am_mfarray, unconditionally
- (amfs_bgmount): call free_mntfs when we're done with a mntfs, call
- dup_mntfs when starting processing of a new one; make sure we
- always go through 'goto failed' for a failed mntfs; use the error
- code returned by autofs_get_fh()
-
- * conf/autofs/autofs_linux.c (autofs_get_fh): return proper error
- codes in case of problems
-
-2003-07-13 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * BUGS: Document buggy behavior of Solaris /usr/ccs/bin/lex. In
- short, use flex.
-
-2003-07-13 Erez Zadok <ezk@a-hpux11.fsl.cs.sunysb.edu>
-
- * fsinfo/fsi_lex.l, amd/conf_tok.l: allocate more output slots so
- lex scanners don't run out of mem.
-
-2003-07-13 Ion Badulescu <lionut@gonzales.badula.org>
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): ditto as below for the
- special provision
-
- * amd/mntfs.c (find_mntfs): compare the filesystem type
- (i.e. mf_ops) in addition to mf_info; the special provision
- mentioned below is really for any filesystem already mounted on
- our mount point, not just for inherited filesystems
-
-2003-07-13 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * doc/Makefile.am (install-html): build per-chapter HTML manual,
- as well as manual in one big HTML file.
-
- * doc/am-utils.texi: Minor corrections. Ack Ion's autofs work.
- Ack maintainers. New section on How to get additionl info,
- including the Amd book. Correct stale URLs and Emails.
-
- * amd/amd.8, amq/amq.8, amq/pawd.1, fixmount/fixmount.8,
- fsinfo/fsinfo.8, hlfsd/hlfsd.8, mk-amd-map/mk-amd-map.8,
- scripts/amd.conf.5, scripts/automount2amd.8,
- wire-test/wire-test.8: include references to info pages, proper
- authors, am-utils Web page, and amd book.
-
-2003-07-13 Ion Badulescu <lionut@gonzales.badula.org>
-
- * amd/mntfs.c (find_mntfs): re-add the check for mf_info, but with
- a special provision for inherited filesystems. This unbreaks the
- handling of parallel mounts
-
- * amd/amfs_generic.c (amfs_lookup_mntfs): for restarted
- filesystems, there can be no alternative mntfs to try to mount
-
-2003-07-13 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/amd.8: reference am-utils info page in amd man page, as per
- Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at>.
-
- * fsinfo/fsinfo.h, fsinfo/fsinfo.c (fsi_get_args): don't use
- yywrap() if it doesn't exist.
-
- * amd/conf_parse.y, amd/conf_tok.l, fsinfo/fsi_gram.y,
- fsinfo/fsi_lex.l: fixes to support old flex 2.5.4, as well as the
- newer flex 2.5.31 (beta development). These include resolving
- conflicts with yylineno, unput() vs. nounput(), etc.
-
-2003-07-13 Ion Badulescu <lionut@gonzales.badula.org>
-
- * amd/amfs_generic.c (amfs_cont): check for (am_error > 0) before
- calling assign_error_mntfs()
- (amfs_generic_mount_child): ditto
-
- * amd/autil.c (assign_error_mntfs): move the check for
- (am_error > 0) up into the caller, it's less confusing that way
-
- * tasks: some updates
-
- * conf/transp/transp_tli.c (check_pmap_up): new function which
- detects if the remote portmapper is functional
- (amu_clnt_create_best_version): removed
- (get_nfs_version): use a much simplified version of the old
- amu_clnt_create_best_version(), based on clnt_create_vers() and
- its _timed() counterpart
-
- * conf/transp/transp_sockets.c (check_pmap_up): new function which
- detects if the remote portmapper is functional
- (pmap_ping): deleted
- (get_nfs_version): removed calls to pmap_ping, already done by
- caller
-
- * amd/srvr_nfs.c: call check_pmap_up() before continuing with
- get_nfs_version()
-
- * amd/amfs_generic.c: updated a couple of log messages
-
- * configure.in: detect clnt_create_vers and clnt_create_vers_timed;
- changed LIBTOOL versioning to 3:0:0
-
-2003-07-12 Ion Badulescu <lionut@gonzales.badula.org>
-
- * conf/autofs/autofs_linux.h (AUTOFS_HOST_FS_FLAGS): removed
- FS_AUTOFS because the host mount cannot be a top level mount
- (AUTOFS_DIRECT_FS_FLAGS): removed FS_AUTOFS because Linux autofs
- doesn't support direct mounts
-
-2003-07-12 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * amd/conf_parse.y, amd/conf_tok.l: pretty comments on # cpp
- macros.
-
-2003-07-10 Ion Badulescu <ionut@buggy.badula.org>
-
- * include/am_utils.h (dlog): improved version for gcc, using
- vararg macros
-
- * amd/rpc_fwd.c (fwd_packet): unused variable when compiling
- without debugging
-
-2003-07-10 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * include/am_utils.h (dlog): change the #define of non-debugging
- dlog to "nothing" so that all that'll be left behind is a list of
- args in parenthesis (arg,arg,...). GCC and other native C
- compilers seem OK with it, even if it doesn't optimize away the
- whole debugging line.
-
- * ltmain.sh: was from libtool 1.4.2. updated to libtool 1.4.3,
- the latest on RH9 systems (but is not the latest libtool
- available). Stay with stable version in preparation for 6.1
- release.
-
- * config.{guess,sub}, doc/texinfo.tex: update to latest off of
- ftp.gnu.org.
-
-2003-07-09 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * amd/amfs_inherit.c (amfs_inherit_inherit): don't use // C++
- style comments: breaks non-C++ compilers (like AIX xlC 6)
-
-2003-07-02 Ion Badulescu <ionut@buggy.badula.org>
-
- * doc/am-utils.texi (opts Option): document ignore_portmapper option
-
- * conf/transp/transp_sockets.c (get_nfs_version): better
- protocol/version cycling while probing remote server; better log
- messages
-
- * amd/srvr_nfs.c (start_ping): improved log message
- (find_nfs_srvr): always use requested nfs_version/nfs_proto; make
- sure we have a valid NFS port; start the server as "valid, down" if
- the remote portmapper tells us the NFS service is not running;
- implement the "ignore_portmapper" pseudo-mount option
-
- * amd/rpc_fwd.c (fwd_packet): better debug messages
-
- * amd/ops_nfs.c (got_nfs_fh): log a messages if a root fh is
- denied; call wakeup even if mountd call fails
-
- * amd/amq_subr.c (xdr_amq_mount_info_qelem): use FSRV_ISUP/ISDOWN
- instead of checking the flags directly
- * amd/srvr_amfs_auto.c (free_srvr): ditto
-
- * amd/amfs_generic.c (amfs_bgmount): refined some error/debug
- messages
-
- * amd/amd.h (FSRV_ERROR): new macro
- (FSRV_ISDOWN, FSRV_ISUP): a server that doesn't exist (i.e. it's a
- local filesystem) is always up
-
-2003-06-30 Erez Zadok <ezk@cs.sunysb.edu>
-
- * amd/autil.c (am_mounted): set AMF_NOTIMEOUT if either unmount or
- umount options are present.
-
- * doc/am-utils.texi (Program Filesystem): document alias options
- to unmount:=, umount:=.
-
- * amd/opts.c (expansions): initialize opt_umount.
- (to_free): initialize opt_umount.
-
- * amd/amfs_program.c (amfs_program_match): ensure that only one of
- umount:= or unmount:= options are specified, but that at least one
- of them is listed.
-
- * amd/amd.h: support unmount:=XXX as well as umount:=XXX (too
- annoying in type:program, when one forgets the 'n' in "unmount").
- They are two separate fields, so we can catch mistakes when
- someone tries to define both options.
-
- * doc/am-utils.texi (Program Filesystem): explain that both mount
- and unmount options must be specified. Correct example to show
- both.
-
-2003-06-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * XXX: beginning of new amd.conf option map_defaults: will parse
- the option and set remember it in the right places. Need to
- document this and actually hook it up with the rest of the code.
- Any volunteers? :-)
-
- * scripts/amd.conf-sample (map_defaults): example of map_defaults
- amd.conf option.
-
- * amd/conf.c (reset_cf_map): initialize global and per-mount
- map_defaults.
- (gopt_map_defaults): parse global map_defaults.
- (process_regular_option,ropt_map_defaults): parse per-map
- map_defaults amd.conf option.
-
- * amd/amd.h: a place to store global and per-mount map_defaults.
-
- * BUGS: more notes about AIX 5.2 problems and how to overcome
- them.
-
-2003-06-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- * doc/Makefile.am: force version.texi to be rebuilt regardless of
- maintainer mode. Silly Automake will not build version.texi if
- maintainer mode is off (this is hardcoded into the automake perl
- script!). According to the Automake maintainers, users should
- always build in CVS trees with maintainer-mode on; but what if I
- don't want to?! I don't want to distribute Makefiles with
- maintained rules in them to users. The Automake maintainers also
- say that "make dist" will rebuild version.texi no matter what. I
- find that not to be the case. It failed to run a "make" before
- "make dist" because version.texi doesn't exist! Chicken and Egg
- situation. So, until Automake deals with version.texi in a more
- flexible and friendly manner, I adapted a rule to build
- version.texi and inserted it in this Makefile.am.
-
-2003-06-09 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * mk-amd-map/mk-amd-map.c (main): open temp db file using O_EXCL,
- next best thing to using mkstemp(). Patch from Hendrik Scholz
- <hscholz@raisdorf.net>.
-
-2003-05-08 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * libamu/mount_fs.c (compute_automounter_mount_flags): use
- MNT2_GEN_OPT_AUTOMNTFS if available; minor cleanup
-
- * m4/macros/header_templates.m4: added template for
- MNT2_GEN_OPT_AUTOMOUNTED
-
-2003-05-01 Ion Badulescu <ionut@nicu.badula.org>
-
- * amd/ops_xfs.c (mount_xfs): compile fix (s/genflags/flags/)
-
-2003-04-23 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * conf/transp/transp_sockets.c (create_amq_service): minor cpp
- directive indentation and commenting.
-
-2003-04-22 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/transp/transp_sockets.c (create_amq_service): Ugly *BSD fix
- for an RPC library DoS issue (original patch from Martin Blapp,
- massaged into something more digestable by me)
-
-2003-04-14 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_solaris_v2_v3.c: removed autofs_free_data(),
- left over from the recent cleanup
-
-2003-04-13 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * doc/Makefile.am (DVIPS): use proper options for dvips.
-
- * doc/am-utils.texi (opts Option): document new 'unmount' option,
- and better explain the 'nounmount' option. Also some misc options
- for better generation of html manual.
-
- * doc/Makefile.am (install-html): support newer texi2html 4.0
- options, as older options were renamed or changed behavior.
-
- * amd/autil.c (am_mounted): support new 'unmount' option, to allow
- all file system mounts to timeout and thus expire. This option is
- useful for removable local media such as CD-ROMs, USB drives,
- etc. so they can expire when not in use, and get unmounted (such
- drives can get work out when they keep spinning). Patch from
- Christos Zoulas <christos@zoulas.com> (originally from Koji
- Imada).
-
-2003-04-10 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * configure.in: use AM_MAINTAINER_MODE, so maintainer-only rules
- do not get added to Makefiles by default (they are confusing to
- users who don't have autotools installed).
-
-2003-04-09 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/mntfs.c (find_mntfs): revert the "change of philosophy" (see
- the 2001-05-23 entry) back to the 6.0 code
-
-2003-04-04 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * libamu/xutil.c (switch_to_logfile): don't try to print logfile
- if it is null (strlen core dump on solaris). Bug report from John
- P. Rouillard <rouilj@ieee.org>.
-
-2003-03-31 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * fsinfo/fsinfo.8: typo co-ordinate -> coordinate. Typo report
- from Perry E. Metzger" <perry@piermont.com>.
-
-2003-03-25 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * include/am_defs.h: Don't include malloc.h if stdlib.h exists,
- because modern systems (e.g., BSD) complain if you use malloc.h
- instead of stdlib.h. Let's hope there are no systems out
- there that need both.
-
-2003-03-20 Erez Zadok <ezk@suse73.fsl.cs.sunysb.edu>
-
- * minor new port: sparc64-unknown-linux-suse7.3.
-
-2003-03-20 Erez Zadok <ezk@a-freebsd5.fsl.cs.sunysb.edu>
-
- * minor new port: i386-unknown-freebsd5.0.
-
- * configure.in: detect nfsclient/nfsargs.h.
-
- * conf/nfs_prot/nfs_prot_freebsd3.h: include
- <nfsclient/nfsargs.h>, needed in FreeBSD 5.0.
-
-2003-03-15 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * amd/amd.8, amd/amd.8, fixmount/fixmount.8, hlfsd/hlfsd.8,
- scripts/amd.conf.5, scripts/expn.1: minor spell checking and
- extraneous space elimination.
-
-2003-03-07 Ion Badulescu <ionut@buggy.badula.org>
-
- * conf/autofs/autofs_linux.c (autofs_get_fh): don't leak file
- descriptors if limit exceeded
- (autofs_mounted): call autofs_get_mp(); init am_autofs_ttl
- (autofs_release_fh): release pending_mounts and pending_umounts
- queues
- (autofs_timeout_mp): update am_autofs_ttl instead of am_ttl
-
- * amd/mntfs.c (init_mntfs): delete initialization of removed
- mf_autofs_fh
- (uninit_mntfs): delete call to autofs_release_fh()
-
- * amd/map.c (init_map): init autofs_fh to 0, delete initialization
- of removed autofs_data
- (free_map): release autofs_fh after unmounting map; delete call to
- autofs_free_data()
- (umount_exported): call autofs_release_mp() prior to unmounting
- autofs f/s
- (unmount_mp): ditto
- (free_map_if_success): call autofs_get_mp() if unmounting fails
- (timeout_mp): use the dedicated am_autofs_ttl timeout for f/s-wide
- timeouts instead of the per-mountpoint am_ttl
-
- * amd/autil.c (am_unmounted): release autofs_fh after unmounting
- autofs f/s
-
- * amd/amfs_generic.c (amfs_cont): release autofs_fh if mounting
- autofs f/s fails;
- (amfs_bgmount): ditto
-
- * amd/amd.h: moved autofs_fh from mntfs to am_node, since it's
- more related to the mount point than to the f/s mounted;
- added am_autofs_ttl to am_node, for running expirations on entire
- filesystems
-
- * conf/autofs/autofs_*: autofs_get_fh() returns int instead of
- autofs_fh_t *; autofs_release_fh() now takes an am_node * parameter
- instead of autofs_fh_t *, in an effort to not deal with
- autofs-specific data structures outside autofs code;
- new methods autofs_get_mp() and autofs_release_mp(), which
- acquire/release autofs resources to allow clean unmount attempts;
- nuke autofs_data_t, never used
-
- * amd/amd.h: prototypes for new and changed autofs functions
-
-2003-03-07 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/nfs_subr.c (do_readlink): eliminate third argument, never used
- (nfsproc_getattr_2_svc): reorganize the code a bit
-
- * amd/map.c (mk_fattr): take a nfsfattr * argument instead of an
- am_node * argument
-
- * amd/amd.h: changed prototype for mk_fattr()
-
- * amd/autil.c (am_unmounted): when remounting, use the parent
- node's lookup_child() and mount_child() operations, not the
- generic ones
-
- * amd/amfs_generic.c (amfs_cont): minor code optimization
-
-2003-03-06 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amfs_auto.c: lots of renames and code moving:
- amfs_auto_match() -> amfs_generic_match(), moved to generic;
- amfs_auto_mkcacheref() -> amfs_mkcacheref(), moved to autil.c;
- amfs_auto_mounted() -> amfs_generic_mounted(), moved to generic;
- amfs_auto_umount() -> amfs_generic_umount(), moved to generic;
- free_continuation(): moved to generic, made static;
- assign_error_mntfs(): moved to autil.c;
- amfs_auto_cont() -> amfs_cont(), moved to generic, made static;
- amfs_auto_retry() -> amfs_retry(), moved to generic, made static;
- try_mount() + mount_node() -> mount_node(), moved to map.c
- amfs_auto_bgmount() -> amfs_bgmount(), moved to generic;
- amfs_parse_defaults(): moved to generic;
- amfs_auto_lookup_node() -> amfs_lookup_node(), moved to generic;
- amfs_auto_lookup_one_mntfs() -> amfs_lookup_one_mntfs(), in generic;
- amfs_auto_lookup_mntfs() -> amfs_lookup_mntfs(), moved to generic;
- amfs_auto_mount_child() -> amfs_generic_mount_child(), in generic;
- amfs_auto_lookup_child() -> amfs_generic_lookup_child(), in generic;
- next_nonerror_node(): moved to autil.c;
- amfs_auto_readdir() -> amfs_generic_readdir(), moved to readdir;
- amfs_auto_readdir_browsable() -> amfs_readdir_browsable(), in readdir;
-
- * amd/amfs_toplvl.c: mount_amfs_toplvl() renamed to amfs_mount()
- and moved to autil.c
-
- * amd/readdir.c, amd/amfs_generic.c: new files with stuff ripped
- out of amd/amfs_auto.c
-
- * amd/amd.h: struct continuation moved to generic.c; prototypes
- for the renamed functions; NumChild renamed to NumChildren
-
- * amd/map.c: collaped unmount_node_wrap() and unmount_node() into
- the latter
-
- * amd/mapc.c: key_already_in_chain(): moved to readdir.c;
- make_entry_chain(): moved to readdir.c;
-
- * amd/srvr_amfs_auto.c: find_amfs_auto_srvr() renamed to
- amfs_generic_find_srvr()
-
- * amd/amfs_*.c: adjustments for the renames above
-
- * amd/ops_*.c: low-level filesystems don't need a find_server()
- method
-
- * amd/Makefile.am: added amfs_generic.c and readdir.c
-
- * doc/am-utils.texi: minor clarification for auto maps
-
-2003-03-06 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amd.h: moved lots and lots of amd-only stuff here, from
- include/am_utils.h; changed task_fun, cb_fun and fwd_fun typedefs
- to be function typedefs, not pointer to function typedefs
-
- * include/am_utils.h: see above
-
- * amd/ops_nfs.c, amd/rpc_fwd.c, amd/sched.c: adjustments for
- function typedef changes
-
-2003-03-05 Erez Zadok <ezk@cs.sunysb.edu>
-
- * BUGS: record IBM's patch number for the AIX 5.2 NFS over IPv6
- bug.
-
-2003-02-02 Erez Zadok <ezk@siamese.fsl.cs.sunysb.edu>
-
- * NEWS: minor new port: ia64-unknown-linux-rh2.1AS
-
-2003-01-31 Ion Badulescu <ion@console.limebrokerage.com>
-
- * m4/macros/os_cflags.m4: rhapsody and darwin are the same
-
- * amd/autil.c (mount_node): vastly simplified, just a wrapper now
-
- * amd/amfs_inherit.c (amfs_inherit_mount): remove the am_mounted()
- hack, we now do it properly in the generic code
-
- * amd/amfs_auto.c (amfs_auto_bgmount): get the autofs_fh _before_
- forking the child; set and reset MFF_MOUNTING here, not in
- mount_node(), because the latter might be running in child
- context; call am_mounted() after a successful foreground mount
-
-2003-01-29 Ion Badulescu <ionut@moisil.badula.org>
-
- * configure.in: new flag --with[out]-ndbm; don't pull in libldap
- if building --without-ldap; look for the gdbm/ndbm.h header; make
- explicit the dependency between the ndbm headers and libraries;
- define NEW_DBM_H as the ndbm header that should be used
-
- * include/am_defs.h: simply include NEW_DBM_H for ndbm stuff,
- instead of trying to second-guess configure
-
- * m4/macros/header_templates.m4: new template for NEW_DBM_H
-
- * m4/macros/check_map_funcs.m4:
- (ac_upcase_map_name): use the third argument correctly
-
- * ltmain.sh: working version from libtool-1.4.2-7
-
- * buildall: print the entire configure command, including extra
- arguments; pass each of the extra arguments separately, not
- commingled into one
-
-2003-01-28 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * include/am_utils.h (DEBUG_MNTTAB): define outside of #ifdef
- DEBUG; it is not used without DEBUG, but it is referenced at
- compile time. Bug report from John Kilburg <john@physics.unlv.edu>.
- (D_ALL): don't include D_XDRTRACE, too verbose and normally
- unnecessary
-
-2003-01-28 Erez Zadok <ezk@cs.sunysb.edu>
-
- * ltmain.sh, config.guess, config.sub, doc/texinfo.tex: updates
- from latest official GNU versions.
-
-2003-01-25 Erez Zadok <ezk@cs.sunysb.edu>
-
- * BUGS (Note): document AIX-5.1 NFS-client side bug (hangs in
- vmount).
-
-2003-01-25 Ion Badulescu <ionut@moisil.badula.org>
-
- * Released beta version 6.1b2
-
-2003-01-24 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/autil.c (am_unmounted): reset MFF_MKMNT from mf_flags when
- calling rmdirs() on mountpoint
-
- * amd/amfs_auto.c (amfs_auto_bgmount): ditto
-
- * amd/amfs_nfsl.c (amfs_nfsl_umounted): ditto
-
- * doc/am-utils.texi (opts Option): "sftlookup" -> "softlookup"
-
- * NEWS: "sftlookup" -> "softlookup"
-
- * amd/ops_nfs.c (nfs_mount): "sftlookup" -> "softlookup", also
- check for "nosoftlookup" in combination with "soft"
-
-2003-01-23 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * m4/macros/check_nfs_fh_dref.m4: darwin/rhapsody is another
- freebsd22 derivative
-
- * NEWS: updated for Darwin changes
-
- * .cvsignore: added A.i386-apple-darwin6.0
-
- * m4/macros/os_cflags.m4: add -D_P1003_1B_VISIBLE to cflags for
- Darwin
-
-2003-01-23 Erez Zadok <ezk@cs.sunysb.edu>
-
- * conf/mount/mount_aix.c (mount_aix3): clean back this file from
- all the debugging cruft that is no longer needed (and really was
- never needed in the first place).
-
-2003-01-10 Erez Zadok <ezk@cs.sunysb.edu>
-
- * scripts/test-amd.{misc,conf}: simple amd.conf and amd.misc
- (map) files for testing basic amd functionality such as whether it
- can mount its own mount NFS points.
-
-2002-12-28 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/srvr_nfs.c (start_nfs_pings): don't set FSF_PINGING if
- pings are disabled
-
- * libamu/xdr_func.c (xdr_ftype): use a local enum_t variable
- instead of casting the pointer to (enum_t *)
- (xdr_mountstat3): ditto
- (xdr_nfsstat): ditto
-
- * libamu/misc_rpc.c (make_rpc_packet): fix make_rpc_packet() on
- 64-bit big-endian platforms, bug report from Bill Fenner
- <fenner@research.att.com>
-
- * configure.in: increase library patchlevel
-
- * libamu/xutil.c (amu_release_controlling_tty): close and reopen
- file descriptors 0,1,2 before calling setsid()
-
-2002-12-27 Erez Zadok <ezk@cs.sunysb.edu>
-
- * updated copyright year to 2003 on all files
-
-2002-12-10 Erez Zadok <ezk@localhost.localdomain>
-
- * rename "aux/" subdir into "m4/" so as to avoid problems with
- MS-DOS systems (where "AUX" is a reserved name). This required
- fixing numerous files.
-
-2002-12-10 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * configure.in: don't check for bad hasmntopt() function if
- hasmntopt() doesn't exist on the system, because we will replace
- it with our own version anyway.
-
- * conf/transp/transp_sockets.c (amu_get_myaddress): use "%lx" in
- dlog because htonl() returns a u_long.
-
-2002-12-10 Erez Zadok <ezk@localhost.localdomain>
-
- * include/am_defs.h: use system's hasmntopt() only if it is found
- and it is not buggy.
-
- * libamu/hasmntopt.c (nextmntopt): isspace() takes an int, not a
- char.
-
- * amd/am_ops.c, amd/amfs_auto.c, amd/autil.c, amd/nfs_subr.c,
- amd/ops_cdfs.c, amd/ops_nfs.c, amd/srvr_nfs.c, libamu/hasmntopt.c,
- libamu/mount_fs.c, libamu/mtab.c: rename all uses of hasmntopt()
- to amu_hasmntopt(). Don't use hasmntopt() directly any more!
-
- * aux/macros/func_bad_hasmntopt.m4: new M4 macro to test for a bad
- hasmntopt() function, which incorrectly finds the option "soft" in
- a string "hard,softlookup,ro".
-
- * libamu/hasmntopt.c (hasmntopt): use 'const' on two args to
- hasmntopt(), to match what most systems use.
-
- * aux/macros/header_templates.m4: template for HAVE_BAD_HASMNTOPT.
-
- * configure.in: invoke test for bad hasmntopt()
-
- * NEWS: minor new port, i386-pc-linux-rh8.0.
- Mention autofs-v4 on solaris9 works.
-
- * bootstrap: remove any autom4te-*.cache directories, now that
- autoconf uses a version number for them.
-
-2002-12-09 Ion Badulescu <ionut@moisil.badula.org>
-
- Patches from Christos Zoulas:
-
- -1- am_utils.h: add full prototypes
- -2- amfs_auto.c make functions static and add prototypes
- -3- map.c: kill double free
- -5- transp_sockets.c: add full prototypes
-
-2002-12-09 Ion Badulescu <ionut@moisil.badula.org>
-
- * NEWS: updated
-
- * doc/am-utils.texi (opts Option): document sftlookup
-
- * conf/autofs/autofs_solaris_v2_v3.c: compile fixes
-
-2002-11-22 Erez Zadok <ezk@filer.fsl.cs.sunysb.edu>
-
- * amd/info_ldap.c (amu_ldap_rebind): gopt.ldap_cache_seconds is
- %ld not %d.
-
-2002-11-21 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * {amd,fsinfo}/Makefile.am: remove special rules for processing
- yacc/lex files, now that autoconf/automake properly handle them
- better (esp. now that bison 1.75 behaves differently than older
- bison versions).
-
-2002-11-21 Erez Zadok <ezk@cs.sunysb.edu>
-
- * config.guess.long: updated script so it will properly find the
- version number of the new Itanium 2 machines running "Red Hat
- Linux Advanced Workstation release 2.1AW (Derry)". The script now
- will report ia64-unknown-linux-rh2.1AW.
-
-2002-11-20 Ion Badulescu <ionut@moisil.badula.org>
-
- * amfs_auto_bgmount(): almost complete rewrite
-
- * fixed amfs_inherit to do the right thing and not dereference
- freed mntfs'es
-
- * #if 0'ed bogus code in fh_to_mp3() -- it is now done properly in
- amfs_autofs_lookup_child()
-
- * release the autofs_fh only in one place
-
- * remove the mountpoint only if mf_refc == 1
-
- * print the mntfs type in free_mntfs()
-
- * new pseudo-mount option 'sftlookup' which causes lookups to
- mounted shares from downed servers to return EIO; the default
- depends on whether the mount is 'hard' or 'soft'
-
- * improved querying of supported NFS versions on the server --
- don't even try if it's known to be down
-
- * solaris autofs mount code moved to transp_{sockets,tli}.c
-
- * incipient (non-functional) AIX autofs support
-
-2002-11-11 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * doc/am-utils.texi (Keep-alives): removed outdated info about not
- maintaining the state of TCP NFS servers
-
-2002-11-04 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * include/am_utils.h: prototype for ops_search()
-
- * amd/am_ops.c (ops_search): new function for searching the right
- set of ops for a given filesystem type
-
- * amd/restart.c (restart): cleanup and split into two functions in
- preparation for handling the restart of amd's own mount points
- (restart_fake_mntfs): new function, factored out from restart()
-
-2002-11-04 Ion Badulescu <ionut@buggy.badula.org>
-
- * amd/ops_cdfs.c (mount_cdfs): remove special code for loop device
- (cdfs_umount): ditto
-
- * conf/mount/mount_linux.c (mount_linux): factor it out to
- mount_linux_nfs() and mount_linux_nonfs()
- (mount_linux_nonfs): generalize loop device support to all
- filesystems (not just cdfs); make it automatic for anything that's
- a regular file
- (parse_opts): deprecate the explicit "loop" mount option
- (do_mount_linux): minor cleanup
-
- * conf/umount/umount_default.c (umount_fs2): release loop device
- on umount()
-
-2002-11-03 Erez Zadok <ezk@cnm20>
-
- * include/am_defs.h: moved #include of net/if.h above net/route.h,
- because on AIX 5.2 if.h is needed for route.h (let's hope it
- doesn't break things on other systems).
-
- * include/am_defs.h: AIX 5.2 needs struct sigevent from signal.h
- to be defined, but I don't want to move the inclusion of signal.h
- this early into this file. Luckily, amd doesn't need the size of
- this structure in any other structure that it uses. So we
- sidestep it for now.
-
- * conf/nfs_prot/nfs_prot_aix5_2.h: AIX 5.2 wants 'struct pathcnf',
- but I couldn't find its definition anywhere. Luckily, amd doesn't
- need the size of this structure in any other structure that it
- uses. So we sidestep it for now.
-
-2002-11-02 Erez Zadok <ezk@cs.sunysb.edu>
-
- * config.guess, config.sub, doc/texinfo.tex: updates from
- the latest GNU distributions (2002-09-05).
-
-2002-10-30 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_aix5_2.h: add more definitions from
- mount.h for NFSOPT_* and NFSMNT_*.
- Don't use typedefs that aren't found in system header files.
-
-2002-10-30 Erez Zadok <ezk@cs.sunysb.edu>
-
- * Makefile.am (EXTRA_DIST_CONF): distribute nfs_prot_aix5_2.h.
-
- * conf/nfs_prot/nfs_prot_aix5_2.h: new file.
-
- * aux/macros/struct_nfs_args.m4 (ac_cv_have_struct_nfs_args): look
- for "struct aux52_nfs_args".
-
- * aux/macros/check_nfs_prot_headers.m4: define new header file for
- AIX 5.2.
-
-2002-10-21 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * scripts/amd.conf.5 (ldap_proto_version): document in amd.conf
- man page.
-
- * scripts/amd.conf-sample (ldap_proto_version): show example of use
-
- * doc/am-utils.texi (ldap_proto_version Parameter): document new
- amd.conf option.
-
- * amd/conf.c (gopt_ldap_proto_version): new conf function to
- support ldap_proto_version amd.conf parameter.
-
- * amd/amd.h: field to hold LDAP protocol version.
-
- * amd/amd.c (init_global_options): set default for
- ldap_proto_version. ldap_proto_version patch from George Ross
- <gdmr@dcs.ed.ac.uk> and Tim Colles <timc@inf.ed.ac.uk>.
-
- * amd/info_ldap.c (amu_ldap_unbind): ignore SIGPIPE errors while
- unbinding from an LDAP server that may have been restarted. Fix
- from George Ross <gdmr@dcs.ed.ac.uk>.
-
-2002-09-17 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * remove all autoconf stuff added for sys_nerr
-
- * amq/amq.c, libamu/xutil.c, hlfsd/hlfsd.c: always use strerror
-
- * libamu/strerror.c: more explicit text for unknown errno's
-
-2002-10-01 Erez Zadok <ezk@cs.sunysb.edu>
-
- * include/am_defs.h: define "extern int sys_err" if needed.
-
- * aux/macros/header_templates.m4: template for
- HAVE_EXTERN_SYS_NERR.
-
- * hlfsd/hlfsd.h, libamu/xutil.c (expand_error), amq/amq.c
- (show_mi): remove "extern int sys_err"
-
- * configure.in: execute test for "extern int sys_err"
-
- * Makefile.am (EXTRA_DIST_AUX): distribute new extern_sys_err.m4 file.
-
- * aux/macros/extern_sys_nerr.m4: new test to check for existence
- of "extern int sys_nerr" definition in system headers.
-
-2002-09-17 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * libamu/xutil.c (dbg_opt): bring comments in line with the code
-
- * hlfsd/hlfsd.c (main): use amuDebug() instead of touching
- debug_flags directly
-
- * amd/amd.c (main): don't init debug_flags, leave it as zero (no
- debugging by default)
-
-2002-09-11 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- Debug code sanitization:
-
- - amuDebug() becomes an expression, and explicit if() statements
- are added around it throughout the code
- - amuDebugNo() goes away (ugh!)
- - D_AMQ, D_DAEMON and D_FORK reverse their meaning
- - D_ALL contains only options that don't affect amd's functionality
-
-2002-09-04 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amfs_auto.c (free_continuation): avoid double-free'ing the
- mntfs if there was an error/timeout
-
-2002-09-04 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amfs_auto.c (amfs_auto_lookup_mntfs): use ereturn() instead
- of "return NULL" to signal an error to the upper layers
- (amfs_auto_mount): use strdup so the string can be free'd later on
- [Debian bug report from Matt Chapman <matthewc@cse.unsw.edu.au>]
-
-2002-09-03 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- Patches from George Ross <gdmr@dcs.ed.ac.uk>:
-
- * amd/amfs_auto.c (assign_error_mntfs): do not discard old mntfs,
- it will be done in free_continuation(); assorted debugging messages
-
- * amd/srvr_nfs.c (nfs_timed_out): allocate a new XID on server
- timeout to avoid problems with late ping replies
-
- * amd/mntfs.c (free_mntfs): sanity check for mf_refc; assorted
- debugging messages
-
- * amd/map.c (unmount_node): more verbose debug message
-
-2002-07-29 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amfs_auto.c (amfs_auto_lookup_mntfs): prevent deferencing
- de-allocated memory in str3cat
- (amfs_auto_lookup_mntfs): check for buffer overflow
-
-2002-07-11 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * scripts/expn.{1,in}: fixed typos as reported by Thomas Klausner
- <wiz@danbala.ifoer.tuwien.ac.at>.
-
-2002-06-26 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * doc/Makefile.am (install-html): don't use locally hacked
- texi2html features.
-
- * conf/transp/transp_sockets.c (amu_get_myaddress): Most modern
- systems should use 127.0.0.1 as the localhost address over which
- you can do NFS mounts. In the past we found that some NFS clients
- may not allow mounts from localhost. So we used get_myaddress()
- and that seemed to work. Alas, on some other systems,
- get_myaddress() may return one of the interface addresses at
- random, and thus use a less efficient IP address than 127.0.0.1.
- The solution is to hard-code 127.0.0.1, but still check if
- get_myaddress() returns a different value and warn about it.
-
- * doc/am-utils.texi: don't use ':' in @cindex entries.
-
-2002-06-25 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * Released beta version 6.1b1
-
-2002-06-24 Ion Badulescu <ionut@moisil.badula.org>
-
- * aux/macros/struct_nfs_args.m4: added test for aix51_nfs_args
-
- * conf/nfs_prot/nfs_prot_aix5_1.h: rename aix42_nfs_args to
- aix51_nfs_args, rename unknown fields to u<number>, add the
- unknown new field into the middle of the old 4.2 structure
-
-2002-06-24 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * include/am_compat.h: better test for struct netconfig
- (!HAVE_NETCONFIG_H && !HAVE_SYS_NETCONFIG_H)
-
- * aux/macros/check_nfs_prot_headers.m4: added new header for aix5.1+
-
- * buildall: fix 'buildall -b' on hpux9 and aix5.1
-
-2002-06-24 Ion Badulescu <ionut@buggy.badula.org>
-
- * INSTALL: updated
-
- * conf/autofs/autofs_solaris_v1.c (autofs_link_mount): compile fix
- (autofs_link_umount): ditto
-
- * amd/mntfs.c (init_mntfs): don't use autofs if !amd_use_autofs
-
-2002-06-23 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_linux.c: compile fixes for autofs v3
-
-2002-06-23 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_mounted): no
- expirations needed;
- (autofs_timeout_mp): likewise
-
- * conf/autofs/autofs_solaris_v1.c (autofs_mounted): no expirations
- needed;
- (autofs_timeout_mp): likewise
-
- * conf/autofs/autofs_linux.c (autofs_mounted): set the first
- expiration interval
-
- * amd/autil.c (am_mounted): call autofs_mounted here, instead of
- in mf_mounted()
-
- * amd/amd.h (NEVER): moved here from map.c
- (autofs_mounted): change argument from mntfs* to am_node*
-
-2002-06-23 Ion Badulescu <lionut@gonzales.badula.org>
-
- * conf/autofs/autofs_linux.c (autofs_mounted): set the kernel
- timeout on the autofs mountpoint to cache_duration (gopt.am_timeo)
- (autofs_timeout_mp): don't update the ttl if we're going down
-
- * amd/map.c (timeout_mp): don't call autofs_timeout_mp unless the
- timeout on that particular am_node has expired
-
- * conf/autofs/autofs_linux.c (autofs_timeout_mp): really update
- the ttl, as per the comment (compilers are not very good at
- translating comments into code...)
-
- * amd/amfs_auto.c (amfs_auto_lookup_one_mntfs): strdup am_path
- instead of opt_rfs into opt_fs for autofs, thus avoiding conflicts
- between link mounts pointing to the same target
-
-2002-06-23 Ion Badulescu <lionut@gonzales.badula.org>
-
- * conf/autofs/autofs_linux.c (send_fail, send_ready): new helper
- functions for sending messages back to the kernel
- (autofs_expire_one): initial implementation of the kernel-based
- expiration handler
- (autofs_handle_expire): call autofs_expire_one()
- (autofs_handle_expire_multi): ditto
- (autofs_umount_succeeded): search pending_umounts, send message
- back to the kernel
- (autofs_umount_failed): ditto
- (autofs_mount_succeeded): tell amd core not to expire autofs entries
- (autofs_timeout_mp): expiration function for autofs filesystems
- (autofs_timeout_mp_task): helper function for autofs_timeout_mp
-
- * conf/autofs/autofs_linux.h: new struct autofs_pending_umount for
- keeping tracking of pending umounts
- (autofs_fh_t) rename pending to pending_mounts, add pending_umounts
-
- * conf/autofs/autofs_solaris_v1.c (autofs_timeout_mp): stub
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_timeout_mp): stub
-
- * amd/map.c (timeout_mp): call autofs_timeout_mp() for autofs
- filesystems
-
- * amd/autil.c (mf_mounted): move here the call autofs_mounted()
- from amfs_auto_mounted().
-
-2002-06-22 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * amd/nfs_start.c (mount_automounter): Security fix. if user sets
- -D noamq, don't even create listening socket. Suggestion by Ed
- Ravin <eravin@panix.com>.
-
-2002-06-22 Ion Badulescu <lionut@gonzales.badula.org>
-
- * hlfsd/homedir.c (homedir): use setgid() instead of setegid()
-
- * ALL: #ifdef cleanups, unify some TLI/socket function prototypes
-
-2002-06-22 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * conf/nfs_prot/nfs_prot_netbsd1_4.h: minor port to support
- na_gid and na_uid. NetBSD patch from Jun-ichiro itojun Hagino
- <itojun@iijlab.net>.
-
- * doc/am-utils.texi (Option): document xlatecookie mount option.
-
- * libamu/mount_fs.c (compute_nfs_args): support "xlatecookie"
- NFS mount option. Patch from Matthias Scheler <tron@zhadum.de>
- for NetBSD.
-
-2002-06-22 Ion Badulescu <ionut@edgar.badula.org>
-
- * conf/autofs/autofs_solaris_v1.h: add FS_MBACKGROUND to
- AUTOFS_LINK_FS_FLAGS
-
- * conf/autofs/autofs_solaris_v1.c: convert link mounts to lofs
- mounts in autofs_link_mount/umount
-
-2002-06-22 Ion Badulescu <lionut@gonzales.badula.org>
-
- * configure.in: check for devid inside struct umntrequest
-
- * conf/autofs/autofs_solaris_v2_v3.c (xdr_umntrequest): handle the
- new umntrequest structure in v4.
- (autofs_unmount_2_req): ditto
-
- * README.autofs: updated for Solaris 2.5/2.5.1
-
-2002-06-22 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * configure.in: only define LDAP/Hesiod if both the headers and
- the libraries exist, and the user didn't explicitly disable those
- maps.
-
-2002-06-22 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * doc/am-utils.texi: fix typos. Can't use ":" in @cindex entries.
-
-2002-06-22 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * doc/am-utils.texi, scripts/amd.conf.5, scripts/amd.conf-sample,
- amd/amd.8, amd/get_args.c (get_args): document amd -A option.
-
- * amd/get_args.c (get_args): support "amd -A arg" option to
- override the system's detected architecture. Patch from George
- Ross <gdmr@dcs.ed.ac.uk>.
-
- * amd/info_ldap.c (amu_ldap_rebind): don't use ldap_enable_cache()
- if the system doesn't have it.
-
- * configure.in: detect existence of ldap_enable_cache function,
- because it doesn't exist on Solaris 9's latest ldap libraries.
-
- * amd/info_ldap.c: LDAP patches from George Ross
- <gdmr@dcs.ed.ac.uk>. Rework of old code, support for wildcards in
- LDAP queries, and an FD leak fix.
-
-2002-06-22 Ion Badulescu <lionut@gonzales.badula.org>
-
- * buildall: use ksh for configure on aix5.1; pass the extra
- arguments after "--" to configure, not to make
-
- * Makefile.am: added nfs_prot_aix4_3.h to EXTRA_DIST_CONF
-
- * conf/mount/mount_aix.c (mount_aix3): if the NFSv3 mount fails
- with EINVAL and we have MOUNT_TYPE_NFS3_BIS defined, retry the
- mount with the alternative nfs3_args structure
-
- * conf/nfs_prot/nfs_prot_aix4_3.h: added alternative nfs3_args
- structure, similar to that in aix5.1, for a hack that tries to
- compensate for IBM's brain fart
-
- * conf/nfs_prot/nfs_prot_aix5_1.h: new nfs_prot header for aix5.1+
-
- * aux/macros/check_nfs_prot_headers.m4: added new header for aix5.1+
-
- * BUGS: update for direct mounts on Linux; document the brokenness
- of /bin/sh on AIX 5.1 and HP-UX 9
-
- * NEWS: aix5.1 port, aix4.3 workaround
-
-2002-06-22 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * ltmain.sh: use libtool 1.4d, needed support for newer AIX.
-
-2002-06-21 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * aux/macros/check_autofs_style.m4: enable autofs_v2_v3 for
- all solaris2.6+, not just for 2.[6-8]
-
- * conf/autofs/autofs_default.h: disable autofs if configure
- detects it
-
-2002-06-21 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * aux/macros/with_addon.m4: correct M4 quoting.
-
- * aux/macros/cache_check_dynamic.m4: correct M4 quoting.
-
- * bootstrap: show version of autotools being used. Helps
- maintainer debugging.
-
- * configure.in: new proper syntax for libtool and
- ansi2knr-filtering rules, required by autoconf 1.53 and higher.
-
-2002-06-21 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/GNUmakefile: new search paths for "update" target.
-
- * config.guess, config.sub, doc/texinfo.tex, ltmain: updates from
- the latest GNU distributions.
-
-2002-06-11 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * amd/amfs_auto.c (amfs_auto_lookup_child): split part of this
- function into the new amfs_auto_lookup_one_child function; return
- null if all ivecs failed to match
-
-2002-05-30 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * config.guess.long: support SuSE version names in long
- config.guess format.
-
-2002-05-01 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/lostaltmail.in (vrfy_user): unlink temp files if too
- small.
-
-2002-04-07 Ion Badulescu <ionut@moisil.badula.org>
-
- * hlfsd/hlfsd.c (main): compile fix for --enable-debug=no
-
-2002-03-29 Ion Badulescu <ionut@moisil.badula.org>
-
- * README.autofs: solaris 2.5/2.5.1 info, other minor changes
-
- * doc/am-utils.texi (History): document solaris 2.5+ support
-
- * include/am_utils.h: new member in struct mntfs: mfs_real_mount;
- autofs_fs_flags becomes conditional of HAVE_AUTOFS_FS; new
- prototype for umount_fs2(); extra argument for UMOUNT_FS()
-
- * hlfsd/hlfsd.c: use the new mount_fs2() and UMOUNT_FS()
-
- * libamu/mount_fs.c (mount_fs): wrapper around the new mount_fs2()
- function; swap mntdir and real_mntdir as necessary for solaris 2.5
- autofs support
-
- * conf/umount/umount_default.c (umount_fs2): swap mntdir and
- real_mntdir as necessary for solaris 2.5 autofs support
-
- * conf/umount/umount_*.c (umount_fs): wrapper around the new
- umount_fs2() function
- (umount_fs2): new function which takes the real mountpoint as an
- extra argument
-
- * conf/nfs_prot/nfs_prot_sunos5_5.h: allow autofs support to be
- compiled in
-
- * conf/autofs/autofs_solaris_v1.h (autofs_strdup_space_hack): new
- function that appends a space at the end of a string (the famous
- "Autofs Space Protocol")
-
- * conf/autofs/autofs_solaris_v1.c: almost complete reimplementation
-
- * conf/autofs/autofs_*.h (AUTOFS_*_FS_FLAGS): add
- system-specific definitions for these macros
-
- * conf/autofs/autofs_linux.c (create_autofs_service): remove hacks
- which are now handled properly by more generic code
- (autofs_link_umount): complain if umount_fs() fails, rmdir the
- mountpoint on success
- (autofs_umount_succeeded): remove the rmdirs() code, now handled
- by generic code
- (autofs_mount_succeeded): ditto
-
- * amd/nfs_start.c (checkup): implement it as an emtpy stub if
- DEBUG is not defined
- (run_rpc): call autofs_add_fdset() after umount_exported() to
- avoid passing invalid file descriptors to select(); use plog()
- instead of perror()
-
- * amd/mntfs.c (init_mntfs): initialize mf_real_mount from mp
- (uninit_mntfs): free mf_real_mount
-
- * amd/autil.c (am_unmounted): don't remove the mount point if a
- remount is pending, also don't make the removal conditional on not
- being an autofs mount point
-
- * amd/amfs_nfsx.c (amfs_nfsx_remount): call mkdirs() on
- mf->mf_real_mount instead of mf->mf_mount
-
- * amd/amfs_nfsl.c, amd/amfs_nfsx.c: (amfs_nfsl_umounted): call
- rmdirs() on mf->mf_real_mount instead of mf->mf_mount
-
- * amd/amfs_host.c (make_mntpt): change the third argument to be
- the mountpoint, not the entire mntfs structure
- (do_mount): takes real_mntdir as an extra argument
-
- * amd/amfs_auto.c (amfs_auto_bgmount): move the creation of the
- mountpoint here from try_mount(), otherwise the change to mf_flags
- is lost for background mounts; remove the mountpoint if we created
- it and the mount fails
- (amfs_auto_lookup_mntfs): re-initialize mf->mf_real_mount using
- autofs_strdup_space_hack() if NEED_AUTOFS_SPACE_HACK is defined
-
- * amfs_*.c, ops_*.c: initialize autofs_fs_flags using the
- AUTOFS_*_FS_FLAGS macro defined in the system-specific autofs
- header; UMOUNT_FS() takes mf->mf_real_mount as an extra argument;
- mount_fs() becomes mount_fs2() and takes mf->mf_real_mount as an
- extra argument
-
- * amd/amd.h, amd/ops_nfs.c, amd/amfs_host.c: mount_nfs_fh takes
- the real mountpoint as an additional argument
-
-2002-03-28 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * amd/ops_cdfs.c (mount_cdfs): correctly interpret error return
- values back from mount_fs(). Return correct error number from
- this function.
-
- * conf/mount/mount_linux.c (do_mount_linux): cleanup loop mount
- cruft from this function, moved elsewhere.
- (mount_linux): prepare for loop-device mounts of ISO images.
-
-2002-03-28 Ion Badulescu <ionut@buggy.badula.org>
-
- * libamu/Makefile.am (EXTRA_DIST): added strerror.c
-
- * libamu/strerror.c: strerror() implementation for systems lacking it
-
- * doc/am-utils.texi (History): rewrote the history :) about autofs
- support
-
- * conf/autofs/autofs_solaris_v2_v3.c: updated copyright;
- (autofs_unmount_2_req): minor cleanup
- (create_autofs_service): print log message
- (destroy_autofs_service): ditto
-
- * conf/autofs/autofs_linux.c: updated copyright
-
- * amd/nfs_start.c (mount_automounter): move the debug message into
- create_autofs_service()
-
- * amd/amd.c (main): call destroy_autofs_service() before
- going_down(), not after
-
- * configure.in: added strerror to AC_CHECK_FUNCS(); disable ldap
- if the ldap headers are not found
-
-2002-03-28 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * amd/info_ldap.c: patch from "Sebastien Bahloul"
- <sebastien.bahloul@medasys.org> to fix a simple initialization bug
- and change "HE" to HE_ENT so as to compile on HPUX.
-
-2002-02-26 Erez Zadok <ezk@t3.fsl.cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_freebsd3.h (na_uid): freebsd4.5 uses nfs
- atttributes field named "uid". So #define na_uid to it.
-
-2002-02-12 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * scripts/lostaltmail.in: don't verify user if -noverify option
- was turned on. fix comment typo.
-
-2002-02-11 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * amd/Makefile.am (TESTS): enable one test script, test1.sh.
-
- * amd/test1.sh: re-commit simple test script.
-
-2002-02-11 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * Released snapshot 6.1a5
-
- * NEWS: Solaris autofs readdir() support, Linux autofs sublink fix
-
- * README: require newer auto-tools, update mailing list address
-
- * README.autofs: major update
-
- * configure.in: version changed to 6.1a5
-
-2002-02-11 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_linux.c (autofs_link_mount): don't do a
- stat() on the am_link if called from the parent amd, to prevent
- deadlocks
-
- * amd/autil.c (am_unmounted): call amfs_link_ops.umount_fs if the
- fstype is not link but we have a sublink (Linux autofs needs this)
- (am_mounted): call amfs_link_ops.mount_fs if the fstype is not
- link but we have a sublink (Linux autofs needs this)
-
- * amd/amfs_auto.c (amfs_auto_bgmount): print the real mountpoint,
- not the amd entry point
-
-2002-02-09 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/autofs/autofs_solaris_v2_v3.c (amd_rddirres): new custom
- structure for returning the results from readdir_2()
- (xdr_amd_putrddirres): renamed from xdr_autofs_putrddirres,
- changed to process our internal format (which is essentially the
- NFS readdir format)
- (xdr_autofs_getrddirres): not needed, deleted
- (xdr_amd_rddirres): renamed from xdr_autofs_rddirres, other
- changes to handle amd_rddirres instead of autofs_rddirres
- (autofs_lookup_2_req): return AUTOFS_NONE instead of
- AUTOFS_MOUNT_RQ, to prevent mount storms during ls -F
- (autofs_readdir_2_req): implemented
- (autofs_readdir_2_free): not needed, deleted
- (autofs_program_2): changes from autofs_rddirres to amd_rddirres
- (autofs_get_fh): changed initialization of the fh->map member, it
- now gets the mountpoint path because it makes it easier to
- implement readdir
- (autofs_release_fh): put #ifdef HAVE_AUTOFS_ARGS_T_ADDR around
- code touching fh->addr
- (destroy_autofs_service): new function, deregister the autofs
- service with the portmapper on exit
-
- * conf/autofs/autofs_linux.c (autofs_handle_missing): update
- statistics
- (destroy_autofs_service): new stub
-
- * amd/mapc.c (mapc_find): fixed indentation
-
- * amd/map.c (find_ap_recursive): renamed from find_ap2(), made
- static
-
- * amd/amd.h: removed prototype for find_ap2(), added prototype for
- destroy_autofs_service()
-
- * amd/amd.c (main): call destroy_autofs_service() before going
- down
-
-2002-02-07 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_field.m4: need also a new version of
- AC_CHECK_MEMBERS (plural).
-
-2002-02-06 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_field.m4: include a fixed version of
- AC_CHECK_MEMBER. g/cc will fail to check a member if the .member
- is itself a data structure, because you cannot compare, in C, a
- data structure against NULL; you can compare a native data type
- (int, char) or a pointer. Solution: do what I did in my original
- member checking macro: try to take the address of the member. You
- can always take the address of anything.
-
-2002-01-31 Erez Zadok <ezk@localhost.localdomain>
-
- * remove old '%W%' SCCS IDs from all sources.
-
-2002-01-21 Ion Badulescu <ionut@moisil.badula.org>
-
- * conf/mount/mount_linux.c (mount_linux): fix breakage introduced
- by the loop device mount support. Linux mount takes a real string
- as the last argument, unless the mount type is NFS, NCP, or SMB.
-
-2002-01-20 Erez Zadok <ezk@localhost.localdomain>
-
- * hlfsd/hlfsd.h (HLFSD_VERSION): up version of hlfsd to 1.2,
- because we made some important changes.
-
-2002-01-20 Ion Badulescu <lionut@gonzales.badula.org>
-
- * include/am_utils.h (D_ALL): do not include D_MTAB and D_HRTIME
- by default
-
- * NEWS: document latest changes
-
- * amd/map.c (unmount_mp): same fix as for hlfsd, update the
- seconds field in mtime because Linux ignores the useconds field
-
- * hlfsd/homedir.c: made some global vars static
- (plt_init): remove all trailing '/' chars from root's home;
- use root's home, not the username (silly bugfix)
-
-2002-01-20 Ion Badulescu <lionut@gonzales.badula.org>
-
- * hlfsd/homedir.c (homedir): don't special case uid 0 as having /
- as home; instead use the root account's home
- (plt_init): properly initialize root_home from the root account's
- home directory, or as "" if root doesn't exist
- (plt_reset): free root_home
-
-2002-01-20 Erez Zadok <ezk@localhost.localdomain>
-
- * hlfsd/stubs.c (nfsproc_{lookup,getattr}_2_svc): non-SYMTTL code.
- Increment seconds, not microseconds (which are ignored by NFS).
- Set symlink owner to euid.
-
- * hlfsd/homedir.c (homedir): pass gid to this function, so we can
- also change the effective GID of the process writing to the user's
- home dir, as well as the group of the hlfsd symlink.
- (homedir): run setegid in the right places.
-
-2002-01-15 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * scripts/redhat-ctl-amd.in: refer to @sbindir@ not
- ${prefix}/sbin.
-
- * scripts/ctl-{amd,hlfsd}.in: refer to @sysconfdir@ not
- ${prefix}/etc. Bug report from "A Braunsdorf"
- <ab@eas.purdue.edu>.
-
-2002-01-13 Erez Zadok <ezk@localhost.localdomain>
-
- * configure.in: only check for clock_gettime if --enable-debug was
- used.
-
- * aux/macros/opt_debug.m4: define a cache variable to record value
- of debug option used.
-
- * libamu/xutil.c (show_time_host_and_name): do not use
- clock_gettime unless debugging was compiled in. This way, if
- debugging is not compiled, we don't bother linking with librt,
- libpthread, and a whole lot of other libraries that aren't that
- necessary (esp. on Linux).
-
-2002-01-12 Erez Zadok <ezk@wavy.dyn.optonline.net>
-
- * doc/am-utils.texi (opts Option): document loop option.
-
- * include/am_utils.h: each mounted file system (mntfs) should
- optionally store the loop device used in the field mf_loopdev.
-
- * conf/nfs_prot/nfs_prot_linux.h: define HAVE_LOOP_DEVICE and some
- loop function extern definitions. For now this code is here
- because we only support loop devices on Linux.
-
- * conf/mount/mount_linux.c: recognize "loop" as a valid iso9660
- mount option.
- (parse_opts): when skipping over unknown mount options, skip over
- "loop" (since it was given in amd map entry), but not over
- loop=/dev/loopX, because the latter will go into /etc/mtab.
- (do_mount_linux): override actual cdfs mounted device name
- because with loop devices you don't mount the .iso file directly,
- but the /dev/loopX device that was setup for it.
- (show_loop, is_loop_device, find_unused_loop_device,
- setup_loop_device, delete_loop_device): support code for loop
- devices.
-
- * amd/ops_cdfs.c (mount_cdfs): pass loop device name to function.
- setup loop device before isofs mount, if "loop" option was given,
- before actual mount(2).
- (cdfs_mount): pass loopdev name to mount_cdfs().
- (cdfs_umount): delete/unset loop device after a successful
- unmount, if a loop device was used.
-
- * amd/mntfs.c (init_mntfs): initialize mf_loopdev to NULL.
-
- * include/am_compat.h: If loop device (header file) exists, define
- mount table option MNTTTAB_OPT_LOOP.
-
- * conf/nfs_prot/nfs_prot_linux.h: hack: define HAVE_LOOP_DEVICE
- here until we have a better way to detect /dev/loop devices.
-
- * include/am_defs.h: include <linux/loop.h> if it exists. Define
- LARGEFILE support macros, possibly needed for loop devices.
- Redefine dev_t apropriately for loop devices.
-
- * configure.in: check for <linux/loop.h>.
-
-2002-01-10 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * conf/mount/mount_linux.c (mount_linux): tcp _must_ have a timeo
- parameter 2 orders of magnitude larger than udp (patch from Trond
- Myklebust)
-
-2002-01-09 Erez Zadok <ezk@localhost.localdomain>
-
- * aux/macros/linux_headers.m4: properly [quote] a long string in
- m4 and use AC_MSG_WARN.
-
- * ALL: put /* comments */ on #else/#endif lines everywhere.
-
- * configure.in, aux/macros/with_addon.m4: due to limitation of
- AC_HELP_STRING, pass 2nd arg to AMU_WITH_ADDON, listing name of
- package for help string.
-
- * doc/am-utils.texi (FSinfo): fixed various texinfo errors in the
- FSinfo section of the manual.
- (map_reload_interval Parameter): document new amd.conf global
- parameter.
-
- * scripts/amd.conf.5 document new global option
- map_reload_interval. Sort entries for nfs_vers and nfs_proto
- alphabetically.
-
- * amd/nfs_start.c (do_select): increment do_mapc_reload's value by
- global map_reload_interval value, not by fixed ONE_HOUR.
-
- * amd/amd.c (main): increment do_mapc_reload's value by global
- map_reload_interval value, not by fixed ONE_HOUR.
-
- * scripts/amd.conf-sample (map_reload_interval): usage example
-
- * amd/amd.c (init_global_options): initialize map_reload_interval
- to 3600 seconds.
-
- * amd/conf.c (gopt_map_reload_interval): support a new global
- amd.conf option map_reload_interval, to determine how often (in
- seconds) Amd should check if the map source has changed and then
- reload it it. This value was hard-coded to one hour, now it's the
- default if not otherwise specified.
-
- * doc/am-utils.texi (plock Parameter): document plock=yes option
- as using mlockall(2) if found.
-
- * scripts/amd.conf.5: document -S option as using mlockall(2) if
- found.
-
- * include/am_defs.h: include <sys/mman.h> if it exists.
-
- * configure.in: check for mlockall() function. Check for
- sys/mman.h.
-
- * amd/amd.c (main): support mlockall() on systems that have it and
- don't have plock(3) for plock=yes. On systems that have both,
- will try plock() first and then mlockall(), until one of them (if
- any) succeeds.
-
-2002-01-09 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * aux/macros/opt_debug.m4, opt_cppflags.m4, opt_amu_cflags.m4,
- with_addon.m4 (ac_upcase): fix help string formatting using
- AC_HELP_STRING.
-
- * amd/test1.sh: simple test script for "make check". Runs "amd
- -v".
-
- * amd/Makefile.am (TESTS): add one simple test script, running
- "amd -v" and checking its return value. More tests can be added.
-
- * aux/macros/linux_headers.m4: use AC_MSG_WARN directly.
-
- * aux/macros/*.m4: avoid the cumbersome "changequote" M4 command.
- Instead, list bracketed regexp patterns in [[double brackets]].
-
- * aux/macros/header_templates.m4: remove all unnecessary
- HAVE_FIELD_* definitions, now that we're using autoconf's new
- AC_CHECK_MEMBERS.
-
- * aux/macros/field_mntent_t_mnt_time_string.m4: don't call
-
- * configure.in: use new syntax for AMU_CHECK_FIELD
-
- * aux/macros/check_field.m4: use new and simpler macro
- AC_CHECK_MEMBERS. Change all sources to use HAVE_aggregate.member
- instead of HAVE_FIELD_aggregate.member.
-
- * aux/amdgrep: simple utility script to egrep the am-utils sources
- for any pattern.
-
- * aux/macros/{check_mnttab_style.m4, check_mount_style.m4,
- check_umount_style.m4, check_network_transport_type.m4}: use newer
- AC_LIBOBJ macros instead of modifying $LIBOBJS directly
-
- * aux/macros/func_bad_memcmp.m4: redefine to use native
- AC_FUNC_MEMCMP, and then define HAVE_BAD_MEMCMP as needed.
-
- * fsinfo/fsi_gram.y, amd/conf_parse.y: indent #pragma command so
- pre-ANSI C compilers will ignore it.
-
- * conf/autofs/autofs_linux.c (autofs_link_mount): call s/getpgrp()
- correctly depending on whether it takes a void or a 0.
-
- * configure.in: check if s/getpgrp() takes void or a 0.
-
-2002-01-08 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * configure.in: use the newer AC_CONFIG_LINKS instead of
- AC_LINK_FILES.
-
- * aux/macros/check_autofs_style.m4, check_checkmount_style.m4,
- check_mnttab_style.m4, check_mount_style.m4,
- check_network_transport_type.m4, check_umount_style.m4,
- check_nfs_prot_headers.m4: removed backward compatible code for
- pre-autoconf-2.14.
-
-2002-01-07 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * doc/Makefile.am: define @SET_MAKE@ for AC_PROG_MAKE_SET macro, since
- this Makefile could explicitly chdir to other directories and run
- make there.
- (install-ps): use ${MAKE} with ${MFLAGS}.
-
- * Makefile.am (EXTRA_DIST_AUX): distribute new package_*.m4 files.
- Define @SET_MAKE@ for AC_PROG_MAKE_SET macro, since this Makefile
- could explicitly chdir to other directories and run make there.
- (install-snapshot): use ${MAKE} ${MFLAGS}, not hardcoded "make".
-
- * configure.in: call AC_PROG_MAKE_SET to check if make program
- defines $MAKE variable.
-
- * amd/get_args.c (get_version_string): use new PACKAGE_* macros
- and also report the bug-reporting address.
-
- * aux/macros/package_{name,version}.m4, header_templates.m4: using
- new PACKAGE_{NAME,VERSION,BUGREPORT} macros.
-
- * aux/macros/name_bugreport.m4: simple macro to print out the
- bug-reporting address which was configured in AC_INIT.
-
- * bootstrap: remove new autoconf messages about misuse of
- m4_patsubst and m4_regexp (internal GNU M4 macros).
-
- * configure.in: remove old comment above AC_OUTPUT.
- Use AC_CONFIG_FILES and AC_OUTPUT separately.
- Fix AC_REVISION use.
- Add AC_COPYRIGHT.
- Use new style for AC_INIT, listing package name, version, and
- bug-reporting address.
- Call new AMU_PACKAGE_* macros.
-
- * updated copyright year to 2002 on all files
-
- * configure.in: using newly renamed am-utils macros (AMU_*)
-
- * aux/macros/*.m4: renamed ALL am-utils specific macros so they
- start with AMU_*, not AC_*. That way it is easier to distinguish
- between macros that come with am-utils and those that are part of
- Autoconf or Automake. It helps to identify those am-utils macros
- that can be removed once there is generic support for them in a
- future version of Autoconf.
-
- * bootstrap: run automake --copy
- remove autom4te.cache dir before rerunning autoconf
-
-2001-12-13 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * scripts/amd.conf.5: correct title to section 5, not 8. Correct
- reversed meaning of nfs_proto and nfs_vers parameters. Typos
- reported by Peter Breitenlohner <peb@mppmu.mpg.de>.
-
-2001-12-02 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * scripts/ctl-amd.in: run "test" or "[" in front of -x/-f
-
- * scripts/ctl-hlfsd.in: run "test" or "[" in front of -x/-f
-
-2001-12-02 Ion Badulescu <ionut@moisil.badula.org>
-
- * hlfsd/homedir.c (plt_print): fix typo (s/plot/plog/) in
- non-mkstemp code
-
- * scripts/ctl-amd.in: touch/remove /var/lock/subsys/amd to make RH
- happy
-
- * scripts/ctl-hlfsd.in: ditto (for hlfsd)
-
- * conf/mtab/mtab_file.c (rewrite_mtab): fchmod(644) the file we
- get from mkstemp(), otherwise samba becomes very unhappy (sigsegv)
-
- * conf/mtab/mtab_mach3.c (rewrite_mtab): ditto
-
-2001-11-29 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * tasks: updated
-
- * NEWS: document the fixed autofs fd leak
-
- * amq/amq.8: better document the -f option
-
-2001-11-29 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * libamu/mount_fs.c (mnt_flags): same this as for nolock option
- handling, do for maxgrps.
-
-2001-11-29 Ion Badulescu <ion@guppy.limebrokerage.com>
-
- * conf/autofs/autofs_linux.c (hash_init): determine the max number
- of fd's at runtime, use it to dynamically scale the hash and list
- arrays
- (autofs_get_fh): sanity check, don't allow a pipe() fd greater
- than autofs_max_fds
- (autofs_release_fh): close our end of the pipe here (no clue why
- or when it got commented out)
- (autofs_mounted): set kernelfd to -1 after closing it
-
-2001-11-28 Philippe Troin <phil@fifi.org>
-
- * libamu/mount_fs.c (mnt_flags): Drop nolock from generic mount
- opts.
- (compute_nfs_args): Added nolock handling.
- Adapted from an original patch from Avery Pennarun <apenwarr@nit.ca>.
-
-2001-11-27 Erez Zadok <ezk@a-hpux11i.fsl.cs.sunysb.edu>
-
- * ported to ia64-hp-hpux11.20 using HP's ANSI/C compiler.
- Couldn't use bison/flex because of 32-bit vs. 64-bit binaries
- issues. Had to use HP's own yacc/lex.
-
-2001-11-26 Erez Zadok <ezk@a-hpux11i.fsl.cs.sunysb.edu>
-
- * */Makefile.am: don't use $(OBJECTS) directly because it is no
- longer automatically defined now that Automake has automatic
- dependency tracking (which I turn off). Instead, hard-code
- minimal dependencies on am-utils' header files to depend on
- PROG_OBJECTS (where PROG is the program name being built). This
- was discovered by using HP's non-GNU make program.
-
- * amd/nfs_start.c (checkup): cast getpagesize() return val to
- long, to avoid conflicts in division of a long by an int (on
- hpux11i, with their ANSI/C compiler).
-
- * INSTALL, doc/am-utils.texi: port updates
-
- * minor new ports: ia64-hp-hpux11.20, i386-unknown-freebsd5.0,
- i386-unknown-freebsd4.4, i386-pc-linux-rh7.2,
- ia64-unknown-linux-rh7.1.
-
- * include/am_defs.h: actually declare extern definition for
- xdr_callmsg() if it doesn't already exist.
-
- * aux/macros/header_templates.m4: declare template for
- HAVE_EXTERN_XDR_CALLMSG.
-
- * configure.in: check for extern definition for xdr_callmsg()
- because hpux11 has that function but a bad <rpc/xdr.h> header file
- that doesn't define it in the right place.
-
- * libamu/mount_fs.c (print_nfs_args): cast ->rdev to u_long b/c
- on hpux11 its type is dev_t.
-
- * conf/nfs_prot/nfs_prot_hpux11.h: don't support autofs on hpux11
- yet.
-
-2001-11-16 Erez Zadok <ezk@fsl-gw.fsl.cs.sunysb.edu>
-
- * buildall (Usage): separate $cnf_flags and $extra_cnf_flags due
- to /bin/sh limitations.
-
- * bootstrap (cmd): turn back on --ignore-deps (this Automake may
- have problems)
-
- * libamu/xutil.c: remove __attribute__ format_arg statement for
- expand_error() because this function, although taking a
- printf-like string, does not use it in a printf function; it only
- expands a non-printf amd-special syntax %m.
-
-2001-11-14 Erez Zadok <ezk@fsl-gw.fsl.cs.sunysb.edu>
-
- * conf/nfs_prot/nfs_prot_linux.h: define KERNEL_VERSION macro
- before using it because older Linux systems don't define this
- (e.g., Red Hat 4.2)
-
-2001-11-13 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * configure.in: convert to using autoconfig 2.52. Use new macros.
- AC_MSG_NOTICE for messages; AH_TOP and AH_BOTTOM to top and bottom
- parts of autogenerated config.h.in; increase autoconf
- pre-requisite to version 2.50; use AC_DISABLE_SHARED not
- AM_DISABLE_SHARED.
-
- * aux/macros/cache_check_dynamic.m4: finally I can use the new
- $ECHO_N syntax in macros instead of $ac_n, since I'm using a new
- autoconf. Isn't it nice to be such forward looking and having
- placed a comment "XXX: use the next line for autoconf-2.14 and
- newer"... :-)
-
- * aux/macros/save_state.m4: highlight message with ***'s
-
- * aux/macros/host_macros.m4: use proper M4 quoting ([], not "")
-
- * config.{guess,sub}: upated from latest prep ftp distributions
-
- * depcomp, missing, mkinstalldirs: upated from latest Automake 1.5
-
- * ltmain.sh: updated from latest Libtool 1.4.2
-
- * bootstrap: finally, new autoconf doesn't print silly "AC_TRY_RUN
- called without default to allow cross compiling" warnings. And,
- it only took like 3+ years to fix this. But, now it has anoter,
- albeit less annoying warning (which the manual says to ignore):
- "AC_PROG_LEX invoked multiple times".
- When autoheader is run, don't treat the "all clear" message
- "config.h.in is update" as an error.
-
- * ltconfig: removed. not needed with latest version of libtool
-
- * aux/macros/header_templates.m4: replaces acconfig.h and defines
- all CPP macros we use in this package, including their
- accompanying C /* comments */.
-
- * acconfig.h: removed. replaced by new autoconf system to generate
- header templates using AH_TEMPLATE macros and such.
-
- * aux/macros/msg.m4: removed. Replaced with new macro
- AC_MSG_NOTICE
-
- * Makefile.am (EXTRA_DIST_AUX): remove aux/macros/msg.m4. Add
- aux/macros/header_templates.m4
-
- * configure.in: early, in host_macros.m4, I'm renaming silly linux
- $host_os names such as linux-gnu and lignux to plain "linux".
- Alas, RMS finally had his way and libtool will NOT recognize
- "linux" as a valid system, only "linux-gnu". Sigh. Rich, I know
- you're responsible to Linux's fame. Kudos to you and your
- cohorts. But please don't force the rest of us to use those ugly
- or long names. Solution: temporarily name $host_os to "linux-gnu"
- before calling the AC_PROG_LIBTOOL macro, then name it back to
- "linux". (That way I don't have to maintain my own version of
- ltmain.sh.
-
- * buildall: force running configure -C (to create and use a local
- config.cache file). New default behavior for autoconf is NOT to
- use cache files. Yeah, that's gonna fly real well with am-utils,
- with its 700+ automatic tests.
-
- * conf/mtab/mtab_mach3.c (rewrite_mtab): use mkstemp instead of
- mktemp, if the former is available.
-
- * conf/mtab/mtab_file.c (rewrite_mtab): use mkstemp instead of
- mktemp, if the former is available.
-
- * mk-amd-map/mk-amd-map.c (main): use mkstemp instead of mktemp,
- if the former is available.
-
- * aux/macros/check_nfs_socket_connection.m4: AC_DEFINE calls must
- be on a separate line, as per new Autoconf manual, to avoid some
- Bourne Shell syntactical bizarreness.
-
-2001-11-13 Erez Zadok <ezk@a-rh71i.fsl.cs.suunysb.edu>
-
- * amd/amfs_auto.c (amfs_auto_readdir_browsable): cast to u_long,
- for IA64 Linux.
-
-2001-11-12 Ion Badulescu <ionut@buggy.badula.org>
-
- * libamu/mtab.c (hasmntval): strtol can return a non-NULL pointer
- pointing to '\0' on success, so we need to allow for it. This
- fixes the problem with rejecting numerical mount options if they
- are the last option in the string.
-
- * configure.in: increased library patchlevel
-
- * NEWS: document the parsing bug
-
-2001-10-29 Ion Badulescu <ionut@moisil.badula.org>
-
- * configure.in: bumped version up to 6.1a5-pre
-
- * NEWS: fixed speeling mistaike
-
-2001-10-29 Ion Badulescu <ionut@moisil.badula.org>
-
- * released snapshot am-utils-6.1a4
-
-2001-10-26 Ion Badulescu <ionut@moisil.badula.org>
-
- These changes fix autofs support for sublinks. While it is not
- perfect by any means and is hardly better than non-autofs, at
- least it works.
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_lookup_2_req): don't
- reply if the mount is in progress
- (autofs_mount_succeeded): handle both delayed lookups and mounts
- (autofs_mount_failed): ditto
-
- * amd/amfs_auto.c (amfs_auto_lookup_mntfs): don't dispose of the
- original opt_fs if we have a sublink
-
-2001-10-23 Ion Badulescu <ionut@moisil.badula.org>
-
- * amd/amfs_auto.c (amfs_auto_lookup_mntfs): fixed silly typo (mf
- instead of new_mf) which was causing null pointer error when
- sublinks were being used
-
-2001-10-22 Ion Badulescu <ionut@moisil.badula.org>
-
- * README.autofs: updated
-
- * NEWS: updated
-
- * INSTALL: updated
-
- * AUTHORS: added myself
-
- * doc/am-utils.texi: updated
-
- * conf/autofs/autofs_solaris_v2_v3.c (xdr_autofs_rddirargs): use
- xdr_u_int() and cast things to (int) to appease Solaris 2.7 compile
- (autofs_readdir_2_req): cast req->rda_offset to (int), same as
- above
-
-2001-10-22 Ion Badulescu <ionut@moisil.badula.org>
-
- Autofs direct mounts have been verified to work on Solaris2.[67].
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_lookup_2_req):
- retrieve the uid and gid from the lookup request
- (autofs_mount_2_req): skip the first char in the name (it's a
- leading '/') if this is a direct mount
-
- * amd/amfs_direct.c (amfs_direct_ops): use amfs_auto_lookup_child
- and amfs_auto_mount_child for amfs_direct's methods
-
- * amd/amfs_auto.c (amfs_auto_lookup_child): don't leak an am_node
- if the mntfs lookup fails
-
-2001-10-21 Ion Badulescu <ionut@moisil.badula.org>
-
- * include/am_utils.h (AMF_REMOUNT): new flag, marks the node as
- pending a remount
- (mntfs): new member mf_fsflags, holds a copy of the filesystem's
- fs_flags
- (am_ops): new member autofs_fs_flags, holds the filesystem's flags
- when mounted onto an autofs node; fs_flags renamed to nfs_fs_flags
-
- * conf/autofs/autofs_linux.c (create_autofs_service): turn on
- FS_MKMNT for amfs_auto and FS_MBACKGROUND for amfs_link
- (autofs_umount_succeeded): don't rmdir the mountpoint if a remount
- is needed [lest the access that triggered the remount will fail]
-
- * amd/mntfs.c (init_mntfs): copy the filesystem's nfs_fs_flags
- into mf_fsflags on initialization
-
- * amd/autil.c (am_unmounted): start the remounting right away if
- the node is marked as needing a remount [fixes the Linux autofs
- deadlock when mount/unmount collide]
-
- * amd/amfs_auto.c (amfs_auto_lookup_node): mark the node as
- needing a remount if a mount request comes in while we're
- unmounting it
- (amfs_auto_lookup_mntfs): copy the filesystem's autofs_fs_flags
- into mf_fsflags if this is an autofs node
-
- * amd/amfs_*.c, amd/ops_*.c: added initialization for the new
- autofs_fs_flags member of am_ops
-
-2001-10-20 Ion Badulescu <ionut@moisil.badula.org>
-
- With these changes, Solaris 2.[67] autofs support is finally
- functional!
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_readdir_2_req): stub
- (autofs_readdir_2_free, xdr_autofs_rddirargs, xdr_autofs_putrddirres,
- xdr_autofs_getrddirres, xdr_autofs_rddirres): new functions
- (autofs_lookup_2_req): do an actual lookup here, and tell the
- kernel to create a symlink if necessary
- (autofs_mount_2_req): no need to am_autofs_data
- (autofs_program_2): enable AUTOFS_READDIR
- (autofs_link_mount): no code needed here
- (autofs_link_umount): return success
- (autofs_mount_succeeded): lstat real mount points; don't mark
- symlinks as NOTIMEOUT
-
- * amd/mntfs.c (init_mntfs): mf_dev and mf_rdev don't exist anymore
-
- * amd/map.c (init_map): init am_dev and am_rdev to -1
- (free_map): free am_mfarray and all mntfs's listed
-
- * amd/autil.c (mf_mounted): move the lstat of the node to the
- autofs-specific code
-
- * amd/amfs_link.c (amfs_link_ops): don't background symlink creation
-
-2001-10-18 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * aux/macros/os_cflags.m4 (irix6*): Enforce N32 ABI/mips3 ISA with cc.
- * BUGS: Explain this.
-
-2001-10-02 Erez Zadok <ezk@agora.fsl.cs.sunysb.edu>
-
- * doc/am-utils.texi (redhat-ctl-amd): document new script.
-
- * scripts/Makefile.am: build redhat-ctl-amd but do not install it.
-
- * scripts/redhat-ctl-amd.in: new script, useful to correctly
- control Amd on Red Hat Linux systems. Script adapted from ctl-amd
- and Red Hat's own rc.d script.
-
-2001-10-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/nfs_prot/nfs_prot_osf5.h: Renamed from nfs_prot_osf5_1.h.
- (MNT2_NFS_OPT_AUTO): Disable.
- * Makefile.am (EXTRA_DIST_CONF): Reflect new name.
- * aux/macros/check_nfs_prot_headers.m4: Use this file for all
- Tru64 UNIX V5 and up releases.
-
-2001-09-24 Ion Badulescu <ionut@moisil.badula.org>
-
- * include/mount_headers1.h (MFS): define as 1 instead of nothing,
- to fix compile problems on OS X (patch from Ahmon Dancy)
-
- * aux/macros/try_compile_anyfs.m4 (MFS): ditto
-
-2001-08-13 Erez Zadok <ezk@fsl-gw.fsl.cs.sunysb.edu>
-
- * doc/am-utils.texi (in_network Selector Variable): document
- expanded syntax
-
- * libamu/wire.c (is_network_member): support for network/netmask
- as well as network/bits syntax in in_network()
-
-2001-08-11 Erez Zadok <ezk@a-linux64.fsl.cs.sunysb.edu>
-
- * amq/amq.c (show_mti): print full four digits for year, and print
- it in MM/DD/YYYY format, not in YY/MM/DD format.
-
-2001-08-11 Ion Badulescu <lionut@gonzales.badula.org>
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_lookup_2_req):
- initial attempt to do something useful -- but commented out for now
- (autofs_link_mount): create an action structure with a link
- request and pass it up
- (autofs_mount_2_req): pass the link request to the kernel
- (autofs_free_data): new helper function
-
- * conf/autofs/autofs_linux.h: added definition for autofs_data_t
-
- * conf/autofs/autofs_solaris_v2_v3.h: ditto
-
- * amd/map.c (init_map): initialize am_autofs_data
- (free_map): call the autofs cleanup function if necessary
-
- * include/am_utils.h (am_node): added private data and cleanup
- function for autofs
-
- * tasks: removed some obsolete entries
-
-2001-08-11 Erez Zadok <ezk@a-solaris8.fsl.cs.sunysb.edu>
-
- * amd/map.c (free_map_if_success): run autofs_umount_failed() only
- if this mount node is of type autofs.
-
-2001-08-11 Ion Badulescu <lionut@gonzales.badula.org>
-
- * amd/amd.h: removed mf_array from struct continuation (moved into
- am_node)
-
- * include/am_utils.h: removed VLOOK_LOOKUP; renamed vlookuppn to
- vlookup_child; added vmount_child; added mount_child to the fs_ops
- API; added prototypes for amfs_auto_mount_child and
- amfs_error_mount_child
-
- * amd/map.c (init_map): initialize am_mfarray to 0
-
- * amd/amfs_*, amd/ops_*: new API function mount_child, old API
- function lookuppn renamed to lookup_child
-
- * amd/amfs_auto.c: renamed amfs_auto_lookuppn1 to
- amfs_auto_lookup_node; renamed amfs_auto_lookuppn2 to
- amfs_auto_lookup_mntfs; renamed amfs_auto_lookuppn3 to
- amfs_auto_mount_child; moved the freeing of the error mntfs in the
- newly allocated am_node from lookup_mntfs to mount_child; make
- sure lookup_child returns a negative error if the node needs to be
- mounted; removed the call to lookuppn3 from lookup_child
-
- * amd/amfs_error.c: added stub implementations of
- amfs_error_lookup_child and amfs_error_mount_child
-
- * amd/amfs_direct.c, amd/amfs_union.c, amd/map.c, amd/nfs_subr.c,
- conf/autofs/autofs_linux.c, conf/autofs/autofs_solaris_v2_v3.c:
- call both lookup_child and mount_child, instead of the old
- lookuppn API method
-
-2001-07-19 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/get_args.c (get_args): a better way to handle GNU and
- non-GNU getopts without strdup-ing the getopt string.
-
-2001-07-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_ldap.c (amu_ldap_rebind): The first time you called
- amu_ldap_init, aldh->ldap is not set. So when amu_ldap_rebind is
- called, this function is absolutely sure to return 0. Then
- amu_ldap_init return 0 without having opened any LDAP connection.
- This is not the correct behavior.
- (get_ldap_timestamp, amu_ldap_search): error to free an object
- ("entry") that is automatically freed by the library. Patch from
- Sebastien Bahloul <sebastien.bahloul@mangoosta.fr>.
-
-2001-07-19 Ion Badulescu <ionut@moisil.badula.org>
-
- * AUTHORS (variables): added Philippe Troin
-
- * Makefile.am (EXTRA_DIST): added bootstrap
-
- * include/am_compat.h (xfs_args_t): define as u_int if the
- filesystem is supported but we can't autodetect the type for
- xfs_args_t. This allows Linux to mount xfs filesystems.
-
-2001-07-12 Philippe Troin <phil@fifi.org>
-
- * doc/am-utils.texi: Added @dircategory Administration.
-
-2001-07-12 Philippe Troin <phil@fifi.org>
-
- * aux/macros/with_addon.m4: Created. Wrapper around AC_ARG_WITH
- with only the `yes' and `no' as possible answers.
-
- * configure.in: Added support for disabling LDAP and HESIOD even
- if the supporting libraries are found.
-
- * Makefile.am (EXTRA_DIST_AUX): Added with_addon.m4 macro file.
-
-2001-07-12 Philippe Troin <phil@fifi.org>
-
- * include/am_compat.h: Removed forced definition of MNTTAB_OPT_DEV
- if MNT2_GEN_OPT_NODEV was found. Actually, the dev= (SVR4) options
- and the linux nodev options are different beasts.
-
- * conf/mount/mount_linux.c (opt_map): Removed the MNTTAB_OPT_DEV
- entry (not really necessary on linux).
-
-2001-07-12 Philippe Troin <phil@fifi.org>
-
- * amd/get_args.c (get_args): Prepend "+" to the getopt string if
- HAVE_GNU_GETOPT to avoid getting all options (even the ones after
- the first non-option argument) slurped in by GNU getopt.
-
- * aux/macros/check_gnu_getopt.m4: Created. Defines HAVE_GNU_GETOPT
- if GNU/glibc getopt implementation is detected.
-
- * configure.in: Added call to AC_CHECK_GNU_GETOPT.
-
- * acconfig.h: Document HAVE_GNU_GETOPT.
-
- * Makefile.am (EXTRA_DIST_AUX): Added check_gnu_getopt.m4 macro file.
-
-2001-06-25 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * LSM.am-utils, NEWS, README.y2k, ChangeLog: make sure all
- am-utils URL references use www.am-utils.org, not the columbia
- URL.
-
-2001-06-08 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/transp/transp_sockets.c (create_nfs_service): cast to
- u_long to ensure clean compile on freebsd5 and bsdi2.
-
-2001-05-23 Ion Badulescu <ionut@moisil.badula.org>
-
- WARNING: WORK IN PROGRESS
-
- It works for me on Linux (both autofs and nfs mounts), for nfs and
- link, but I won't make any guarantees outside those.
-
- * amd/mntfs.c (find_mntfs): reuse the mntfs only if both the mount
- point and the device/fileserver are the same. This is an important
- change of philosophy, watch out for memory leaks!
-
- * amd/map.c (get_ap_child): helper function for
- amfs_auto_lookuppn, creates a new am_node for key fname, inits it,
- and inserts it into all necessary structures
-
- * amd/amfs_auto.c (free_continuation): free unused mntfs's; don't
- free any of the removed fields
- (amfs_auto_lookuppn, amfs_auto_bgmount): split lookuppn into three
- subfunctions, including some code stolen from bgmount; lookuppn
- now generates an array of possible mntfs to try mounting, and
- bgmount will actually try to mount each of them.
- (amfs_auto_lookuppn[123]): the three new subfunctions for lookuppn
- (amfs_parse_defaults): new helper function for lookuppn
-
-2001-05-19 Erez Zadok <ezk@kosh.dyn.optonline.net>
-
- * conf/mount/mount_linux.c: typo: added comma after '0' element.
-
-2001-05-19 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/autofs/autofs_linux.c (AUTOFS_MAX_VERSION): allow using
- autofs-v4 again
- (autofs_get_opts): don't pass pgrp, the kernel will get it
- automatically anyway, not to mention that we were passing bogus
- data if amd was not daemonized.
-
- * conf/mount/mount_linux.c (linux_nfs_error): don't special case
- the 0 result, just put it into the translation list
-
-2001-05-19 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/mount/mount_linux.c (linux_nfs_error): don't report success
- (0) as error (NE_IO)!
-
-2001-05-18 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * amd/amfs_host.c (amfs_host_mount): don't fail the mount if at
- least one share is already mounted
-
-2001-05-17 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * libamu/util.c (str3cat): updated comment
-
- * include/am_utils.h: added VLOOK_LOOKUP and FS_DIRECT
-
- * conf/autofs/autofs_linux.c (autofs_get_fh): removed obsolete comment
- (autofs_mounted): disable autofs support for host f/s if version < 4
- (create_autofs_service): turn on FS_MKMNT on auto f/s if using autofs
- (autofs_umount_succeeded): use rmdirs instead of rmdir
- (autofs_mount_failed): ditto
-
- * amd/opts.c (expand_op): align the debugging messages
-
- * amd/map.c (mount_auto_node): use am_node *mp instead of casting
- the void *arg; update the comment
-
- * amd/autil.c (am_mounted): check the FS_DIRECT flag instead of
- comparing to &amfs_direct_ops
- (mount_node): ifs_mount doesn't exist, make note of it in the
- comment
-
- * amd/amfs_direct.c (amfs_direct_ops): added FS_DIRECT to fs_flags
-
- * amd/amfs_auto.c (amfs_auto_mount): removed the autofs hack to
- create the mountpoint directory for auto f/s; it is now handled in
- autofs_linux.c
- (amfs_auto_bgmount): renamed the mpe parameter to mp_error;
- renamed dont_retry to retry and reverted its meaning as well;
- moved the mp variable up one scope and made use of it throughout
- the function;
- (amfs_auto_readdir): whitespace
- (amfs_auto_readdir_browsable): whitespace, also some debugging
-
- * amd/am_ops.c (vops): updated a comment
-
- * .cvsignore: added A.i386-pc-linux-rh7.[01]
-
-2001-05-01 Ion Badulescu <ionut@gonzales.dev.hydraweb.com>
-
- * conf/mount/mount_linux.c: fixed stupid error in the linux
- nfs_errormap[], which was mapping ENOENT to success!!!
-
-2001-04-28 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * BUGS: added info about the direct mount problems on Linux and
- about the kernel patches on www.am-utils.org.
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_unmount_2_req):
- removed obsolete comment
-
- * amd/autil.c (forcibly_timeout_mp): always log a message when the
- forced unmount request is ignored
- (mf_mounted): don't lstat unless this is an autofs mount point,
- lest we deadlock
-
- * amd/amfs_auto.c (amfs_auto_bgmount): don't gratuitously add
- MFF_MKMNT to the flags, it causes deadlocks later on when
- unmounting
-
-2001-04-14 Erez Zadok <ezk@whitestar.dyn.optonline.net>
-
- * COPYING: update copyright year
-
- * amd/amfs_auto.c, amd/amfs_host.c, amd/amfs_nfsx.c,
- amd/amfs_toplvl.c, amd/amfs_union.c, amd/conf.c, amd/info_nis.c,
- amd/info_nisplus.c, amd/mapc.c, amd/nfs_subr.c, amd/ops_nfs.c,
- amd/rpc_fwd.c, amd/srvr_amfs_auto.c, amd/srvr_nfs.c,
- conf/autofs/autofs_solaris_v1.c, conf/mtab/mtab_file.c,
- conf/mtab/mtab_isc3.c, conf/mtab/mtab_svr4.c,
- conf/transp/transp_sockets.c, conf/transp/transp_tli.c,
- libamu/mount_fs.c, libamu/mtab.c: rewritten various dlog/plog
- messages for clarity, to avoid duplication, to better recognize
- what the message means and where it ran, and to fix typos.
-
- * amd/nfs_subr.c (nfsproc_lookup_2_svc): moved trace message of
- function's name to the beginning of the function, before any other
- messages are logged.
-
-2001-04-14 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/mount/mount_linux.c (do_mount_linux): removed plog() of
- binary data
-
-2001-04-05 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * include/am_defs.h: define NFSCLIENT, NFS, PCFS, LOFS, RFS,
- MSDOSFS, MFS and CD9660 to 1, so that both #if FOO and #ifdef FOO
- work (needed for MacOS X); removed duplicate definition of NFS.
-
-2001-03-29 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * amd/amd.h, amd/amfs_auto.c, amd/conf.c,
- doc/am-utils.texi,
- scripts/amd.conf-sample, scripts/amd.conf.5:
- renamed selectors_on_default to selectors_in_defaults,
- kept the former as a deprecated option;
- renamed CFM_ENABLE_DEFAULT_SELECTORS to CFM_SELECTORS_IN_DEFAULTS;
- renamed gopt_selectors_on_default() to gopt_selectors_in_defaults()
-
-2001-03-19 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * amd/amfs_toplvl.c, amd/amfs_auto.c, amd/srvr_nfs.c,
- include/am_utils.h: compile fixes for --enable-debug=no
-
-2001-03-15 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * NEWS: updated
-
- * README.autofs: updated
-
- * conf/mount/mount_linux.c (linux_version_code): export the fn
-
- * conf/nfs_prot/nfs_prot_linux.h: ditto
-
- * conf/autofs/autofs_linux.c (create_autofs_service): verify the
- kernel version here, and turn off bind_works if the kernel is
- older than 2.4.0.
- (autofs_link_mount): don't touch bind_works here, it's useless
- b/c we're in a child process; remove the mountpoint directory if
- the bind mount fails
-
- * amd/opts.c (eval_fs_opts): changed some annoying debugging plogs
- into dlogs
-
- * conf/autofs/autofs_linux.c (autofs_link_mount): zero out the
- mntent struct before initializing it
-
-2001-03-14 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/mount/mount_linux.c (parse_opts): added support for lofs
- (mount_linux): support lofs through bind mounts and/or FiST lofs
-
- * scripts/ctl-hlfsd.in: search for /var/spool/mail in addition to
- /var/mail and /usr/spool/mail
-
- * conf/nfs_prot/nfs_prot_linux.h (MS_BIND): add define for it, if
- kernel is newer than 2.4.0
- (MNTTYPE_LOFS): ditto
-
- * conf/autofs/autofs_solaris_v2_v3.c (autofs_link_umount): new stub
- (autofs_lookup_failed): removed stub
-
- * conf/autofs/autofs_linux.c (autofs_lookup_failed): moved up in
- the file, made static;
- (autofs_link_mount): activate MNT2_GEN_OPT_BIND code; use stat()
- and friends to determine if bind mounts can be used and to trigger
- further cascading mounts; return proper error codes
- (autofs_link_umount): distinguish between symlinks and bind mounts
- and handle both correctly
- (autofs_umount_succeeded): remove call to autofs_link_umount()
-
- * amd/map.c (umount_exported): try to unmount all mount points on
- an autofs filesystem; this isn't really needed and will be removed
- when we start handling restarting autofs mounts
-
- * amd/amfs_link.c (amfs_link_[u]mount): call autofs_link_[u]mount,
- if necessary
-
- * amd/amfs_auto.c (amfs_auto_bgmount): fixed a bug that was
- causing the wrong mntfs to be selected when using autofs; removed
- call to autofs_link_mount() (moved where it belongs, in
- amfs_link.c)
-
- * amd/amfs_link.c: added FS_MBACKGROUND to fs flags -- cleaner
- solution is needed, because background mounting is only necessary
- for linux autofs + bind mounts
-
- * amd/amd.h: removed prototype for autofs_lookup_failed (internal
- static function for linux autofs); added prototype for
- autofs_link_umount
-
- * configure.in: bump up library patchlevel
-
-2001-02-28 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * aux/macros/check_mount_trap.m4,
- aux/macros/check_nfs_fh_dref.m4,
- aux/macros/check_nfs_prot_headers.m4,
- aux/macros/type_recvfrom_fromlen.m4,
- aux/macros/type_yp_order_outorder.m4:
- Fixed newer freebsd's fh type, expanded more aix3, osf2, hpux9 to
- aix[1-3], osf[1-3] and hpux[6-9].
-
-2001-02-28 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * check_mount_style.m4, check_mount_trap.m4,
- check_network_transport_type.m4, check_nfs_fh_dref.m4,
- check_nfs_prot_headers.m4, check_nfs_sa_dref.m4,
- check_nfs_socket_connection.m4, os_cflags.m4,
- type_yp_order_outorder.m4: small fixes to Ion's cleanup, and more
- cleanup (use [[0-1]] instead of M4 changequote commands).
-
- * Makefile.am: removed unused conf/trap/trap_hpux11.h
-
-2001-02-27 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * aux/macros/check_network_transport_type.m4,
- aux/macros/check_mount_style.m4,
- aux/macros/check_mount_trap.m4,
- aux/macros/check_network_transport_type.m4,
- aux/macros/check_nfs_fh_dref.m4,
- aux/macros/check_nfs_prot_headers.m4,
- aux/macros/check_nfs_sa_dref.m4,
- aux/macros/check_nfs_socket_connection.m4,
- aux/macros/os_cflags.m4,
- aux/macros/type_auth_create_gidlist.m4,
- aux/macros/type_recvfrom_fromlen.m4,
- aux/macros/type_yp_order_outorder.m4:
- Reworked the scripts, so that a new _unknown_ version of a known OS
- will use the option for the newest _known_ version of that OS. For
- example, when freebsd6 comes out, it will use the stuff for
- freebsd5, not the stuff for freebsd2. This makes configure more
- likely to succeed on new systems/versions.
-
- * Makefile.am (EXTRA_DIST_AUX): added check_autofs_style.m4 (grr)
-
-2001-02-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * Makefile.am (install-snapshot): use a different symlink target
- for the experimental snapshots.
-
-2001-02-23 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * Makefile.am (EXTRA_DIST_CONF): include nfs_prot_darwin.h in
- distributions.
-
-2001-02-22 Erez Zadok <ezk@earth.cs.columbia.edu>
-
- * released snapshot am-utils-6.1a3
-
- * amd/Makefile.am (EXTRA_amd_SOURCES): don't forget to distribute
- get_args.c
-
-2001-02-21 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mtab.c: added the functions hasmnteq and haseq to
- ease checks for non-numeric values in opt=value strings.
- Recoded hasmntval to qualify input as numeric, allow hex and
- octal strings on rhs of =, and log when the value is missing
- or invalid.
-
- * conf/mount/mount_linux.c: revised mount_linux to use new
- hasmnteq function to extract type of non-nfs mounts, and added
- a log message to catch possible failure of strdup.
-
- * amd/am_ops.c: revised merge_ops to use new haseq function
-
- * amd/srvr_nfs.c: revised find_nfs_srvr to use hasmnteq to
- discover protocol setting.
-
- * include/am_utils.h: added function prototypes for hasmnteq
- and haseq
-
-2001-02-19 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * include/mount_headers2.h (_LINUX_NFS3_H): define it, to avoid
- pulling in unwanted declarations from 2.2.19pre and 2.4.1ac
-
- * include/am_defs.h (_LINUX_NFS3_H): ditto
-
- * conf/nfs_prot/nfs_prot_linux.h: whitespace, comments
-
-2001-02-19 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_fs_mntent.m4 (ac_safe): remove debugging "echo"
- command.
-
-2001-02-18 Erez Zadok <ezk@earth.cs.columbia.edu>
-
- * aux/macros/mount_headers.m4, include/mount_headers[12].h: split
- mount_headers.h in two because one relative header (nfs_prot.h)
- file cannot be included inside another from the start directory of
- the first (it's relative to the directory of the first).
-
-2001-02-09 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * AUTHORS: added Ahmon Dancy <dancy@franz.com>
-
- * (all): added Darwin/Rhapsody/Apple OS X support from Ahmon Dancy
-
- * aux/macros/mount_headers.m4: moved all the C code into a
- separate file, include/mount_headers.h; the effect is that
- configure goes down in size by a factor of 2.5!
-
- * include/mount_headers.h: new file, with C code from
- aux/macros/mount_headers.m4
-
-2001-02-01 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/mount/mount_linux.c: made linux_nfs_error() more robust.
-
-2001-02-01 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.1a2
-
- * updated ltmain.sh and ltconfig from latest stable version of
- libtool-1.3.5
-
-2001-02-01 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/nfs_prot/nfs_prot_linux.h (nfs_error): moved the definition
- of nfs_error here, from mount_linux.c, so that it can actually be
- used.
-
- * conf/mount/mount_linux.c: added unused errno 41 to the
- nfs_errormap array, lest the following errno's get shifted up by
- one!
-
-Sat Jan 13 00:04:38 2001 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/amd.h (autofs_lookuppn): Fixup whitespace.
- * amd/amfs_auto.c (amfs_auto_bgmount): Likewise.
- * amd/amfs_error.c: (amfs_error_match): Likewise.
- * amd/amfs_host.c (fetch_fhandle): Fixup whitespace. Remove
- unnecessary temporary variable.
- * amd/info_file.c (read_line): Likewise.
- (search_or_reload_file): Likewise.
- * amd/info_ldap.c (get_ldap_timestamp): Likewise.
- * amd/map.c (get_root_ap): Likewise.
- * amd/nfs_prot_svc.c: Likewise.
- * amd/ops_TEMPLATE.c (foofs_match, foofs_lookuppn,
- foofs_readlink, foofs_ffserver): Likewise.
- * amd/ops_autofs.c (autofs_bgmount): Likewise.
- * amd/ops_lofs.c (lofs_match): Likewise.
- * amd/ops_nfs.c (got_nfs_fh): Fixup whitespace.
- * amd/ops_xfs.c (xfs_match): Likewise.
- * amd/srvr_amfs_auto.c (srvrlog): Line break.
- * amd/srvr_nfs.c (got_portmap, call_portmap, nfs_pinged,
- nfs_srvr_port): Fixup whitespace.
- * conf/nfs_prot/nfs_prot_bsdi2.h: Likewise.
- * conf/nfs_prot/nfs_prot_hpux.h: Likewise.
- * conf/nfs_prot/nfs_prot_hpux11.h: Likewise.
- * conf/nfs_prot/nfs_prot_irix5.h: Likewise.
- * conf/nfs_prot/nfs_prot_irix6.h: Likewise.
- * conf/nfs_prot/nfs_prot_nextstep.h: Likewise.
- * conf/nfs_prot/nfs_prot_osf2.h: Likewise.
- * conf/nfs_prot/nfs_prot_osf4.h: Likewise.
- * conf/nfs_prot/nfs_prot_osf5_1.h: Likewise.
- * conf/nfs_prot/nfs_prot_sunos3.h: Likewise.
- * conf/nfs_prot/nfs_prot_sunos4.h: Likewise.
- * conf/nfs_prot/nfs_prot_ultrix.h: Likewise.
- * conf/transp/transp_tli.c (get_mount_client): Likewise.
- * hlfsd/nfs_prot_svc.c: Likewise.
- * include/am_defs.h (sys_errlist): Likewise.
- * include/am_utils.h (am_get_progname, am_get_hostname,
- amq_program_1): Likewise.
- (nfsxprt): Moved declaration.
-
-Fri Jan 12 23:31:45 2001 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- Removed support for amq -M.
-
- * acconfig.h (ENABLE_AMQ_MOUNT): Removed.
- * aux/macros/opt_amq_mount.m4: Removed.
- * Makefile.am (EXTRA_DIST_AUX): Don't distribute
- opt_amq_mount.m4.
- * configure.in (AC_OPT_AMQ_MOUNT): Removed invocation.
-
- * amd/amq_subr.c (ok_security, amqproc_mount_1_svc): Removed.
- * amd/amq_svc.c (amq_program_1): Removed amq -M support.
- * amq/amq.c (mount_map): Removed.
- (main): Removed -M option handling.
- Removed transport-type specific CLIENT creation.
- (get_secure_amd_client, amq_bind_resv_port, privsock): Removed.
-
- * amq/amq.8: Removed -M documentation.
- * doc/am-utils.texi (Top-level Filesystem): Removed amq -M
- reference, but retain comment on mount -t amd.
- (Controlling Amd): Likewise.
-
- * tasks: Removed this task.
-
-Fri Jan 12 23:18:26 2001 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/autofs/autofs_*.c: Bump copyright year to 2001.
- * hlfsd/hlfsd.h (HLFSD_VERSION): Likewise.
-
- * aux/macros/check_autofs_style.m4: Renamed solaris[12] styles to
- solaris_v1, solaris_v2_v3 to reflect that these are AutoFS
- protocol version numbers, not solaris versions.
- * conf/autofs/autofs_solaris[12].[ch]: Renamed to
- autofs_solaris_{v1, 2_v3}.[ch] to reflect this.
- * Makefile.am (EXTRA_DIST_CONF): Likewise.
-
- * aux/macros/check_autofs_style.m4: Use solaris2 style for both
- versions 2 and 3 of the AutoFS protocol.
-
- Handle missing AUTOFS_POSTUNMOUNT, AUTOFS_POSTMOUNT (unnecessary
- with Solaris 8 mntfs).
-
- * conf/autofs/autofs_solaris2.c (xdr_postumntreq, xdr_postumntres,
- xdr_postmountreq, xdr_postmountres, autofs_postunmount_2_req,
- autofs_postmount_2_req ): Don't define for version 3.
- (autofs_program_2): Don't handle AUTOFS_POSTUNMOUNT,
- AUTOFS_POSTMOUNT if missing.
-
- * conf/nfs_prot/nfs_prot_sunos5_8.h: Enable AutoFS support.
-
- * aux/macros/check_autofs_style.m4: Use empty autofs_default.[ch]
- files on systems without existing autofs port.
- * conf/autofs/autofs_default.[ch]: New files, empty.
- * Makefile.am (EXTRA_DIST_CONF): Distribute them.
- * INSTALL: With this change, Solaris 8 and Tru64 5.1 compile and
- link.
-
-2001-01-12 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * Makefile.am (EXTRA_DIST): distribute new LDAP files.
-
- * README.ldap, ldap-id.txt, ldap-id.ms: LDAP status information,
- proposed Schema, and internet draft.
-
-Fri Jan 12 22:27:07 2001 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * Support Tru64 UNIX V5.1:
-
- * conf/nfs_prot/nfs_prot_osf5_1.h: New file.
-
- * Makefile.am (EXTRA_DIST_CONF): Distribute it.
-
- * aux/macros/check_nfs_prot_headers.m4: Tru64 UNIX V5.1 has
- AutoFS, need to disable it until a port exists.
-
- * INSTALL, doc/am-utils.texi (Supported Platforms): Mention new
- minor port.
-
-2001-01-09 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * ALL: bump copyright year to 2001.
-
-2001-01-05 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * acconfig.h: correct comments for NODEV/NONDEV mount options
-
-Fri Jan 5 05:12:02 2001 Erez Zadok <ezk@subzero.cs.columbia.edu>
-
- * libamu/xdr_func.c: removed ugly casts to "groups*", now that
- irix6's nfs_prot.h is fixed.
-
- * conf/nfs_prot/nfs_prot_irix6.h: copied relevant parts of
- <rpcsvc/mount.h> here so we don't have to include this header.
-
-2001-01-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_irix6.h: redefine "groups" typedef to
- struct groups, not the pointer to this struct.
-
- * include/am_xdr_func.h: prototype should take "groups *" as 2nd
- arg.
-
- * libamu/xdr_func.c (xdr_groupnode, xdr_exportnode): change
- casting of second arg of xdr_groups to "groups *". It's only
- needed for irix6, due to problems with xdr_groups on that platform.
- (xdr_groups): prototype should take "groups *" as 2nd arg.
-
- * conf/nfs_prot/nfs_prot_aix*.h: correct xdr_groups extern
- definition. Report from Ahmon Dancy <dancy@franz.com>.
-
-2000-12-06 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * include/am_defs.h: force non-inclusion of <linux/fs.h> via
- <linux/auto_fs.h>
-
- * conf/autofs/autofs_linux.c (autofs_mounted): rename
- AUTOFS_MIN_PROTO_VERSION to AUTOFS_MIN_VERSION (leftover from
- previous commit)
-
- * configure.in: fixed libtool version
-
-2000-12-02 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * doc/am-utils.texi (opts Option): document lock/nolock
-
-2000-12-02 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/autofs/autofs_linux.h: added struct autofs_pending_mount;
- modified autofs_fh_t to have a linked list of autofs_pending_mount;
- added some support for autofs4
-
- * conf/autofs/autofs_linux.c: use a linked list for pending
- request, to allow for handling multiple simultaneous request;
- incipient non-functional support for autofs4; incipient
- non-functional support for bind-mounting
-
- * amd/amd.c (main): print a warning if PROCLOCK is requested but
- the O/S doesn't support it
-
- * libamu/mount_fs.c (mnt_flags): allow the use of the "nolock"
- option
-
- * include/am_defs.h: don't include <linux/fs.h> on a glibc2
- system; include <linux/auto_fs4.h> if it exists, instead of
- <linux/auto_fs.h>
-
- * include/am_compat.h: define the "nolock" mnttab option if the
- NONLM NFS mount option is defined
-
- * acconfig.h: added MNT2_NFS_OPT_NONLM, MNT2_GEN_OPT_BIND
-
- * configure.in: added detection of the NONLM Linux NFS mount
- option; added a clarification for the library versioning rules and
- increased the minor level; added detection of <linux/auto_fs4.h>
- and the MS_BIND generic mount option
-
-2000-11-29 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * Enabled Solaris 2.7 autofs support (tested, works)
-
- * Updated NEWS, README.autofs
-
- * Updated Makefile's, make dist is now fixed
-
- * Fixed potential memory leak in map.c
-
- * Fixed autofs style detection for solaris 2.[67]
-
- * Added a few casts in autofs_solaris2.c, needed on Solaris 2.7
-
-2000-11-28 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- More Solaris 2.[67] work in progress:
-
- * changed the API for the mount/umount methods: fmount/fumount are
- gone, and mount/umount now take two arguments (am_node and mntfs)
-
- * changed the semantics of the MFF_AUTOFS flag: MFF_AUTOFS now
- means the mntfs is a filesystem of type autofs, and AMF_AUTOFS
- means the am_node is a node on a filesystem of type autofs.
-
- * renamed nfs_program_2_transp to current_transp so it can be used
- with autofs
-
- * renamed quick_reply() to nfs_quick_reply()
-
- * added two more autofs methods: autofs_umount_failed() and
- autofs_compute_mount_flags() -- it turns out that on sol2.6 the
- autofs mounts MUST be overlay'ed
-
- * moved the autofs_mount_succeeded() into am_mounted()
-
- * made amd *not* timeout autofs mounts -- the kernel will do it
- for us
-
- * store dev and rdev of a mounted filesystem in the mntfs
- structure, to help autofs
-
- * moved the rmdirs() call from uninit_mntfs() to am_umounted(), to
- prevent deadlocking with autofs
-
- * amd/Makefile.am: shuffled things around to make
- update_build_version be the last thing that runs
-
-2000-11-27 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * split amd/ops_autofs.c into conf/autofs/autofs_<system>.c files
- and made configure create a symlink to the appropriate one
-
- * moved the xdr autofs functions from libamu/xdr_func.c into the
- system-specific conf/autofs/autofs*.c
-
- * added some more experimental code to the sol2.6 autofs support,
- but it's by no means functional
-
-2000-11-27 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * libamu/wire.c (getwire_lookup): truncate the hostname to
- MAXHOSTNAMELEN characters.
-
-2000-11-26 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_utils.h (MAXHOSTNAMELEN): if not defined, set this to
- 256 bytes, not 64. Suggestion form Kris Kennaway
- <kris@FreeBSD.org>.
-
-2000-11-26 Erez Zadok <ezk@dmath5.geometrie.tuwien.ac.at>
-
- * configure.in (AC_CHECK_MNT2_NFS_OPTS): check for NFS mount
- options kerb, rdirplus, readdirsize, and xlatecookie
- (NetBSD-1.5K).
-
- * acconfig.h: recognize NFS mount options rdirplus, readdirsize,
- and xlatecookie (NetBSD-1.5K)
-
-2000-11-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/srvr_nfs.c: comment on NFS proto search order.
-
- * libamu/xutil.c (real_plog): don't try to write the last byte of
- the fmt buf. security suggtion from NetBSD: Thomas Klausner
- <wiz@danbala.ifoer.tuwien.ac.at>
-
-2000-11-22 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * amd/amfs_auto.c (amfs_auto_bgmount): removed the initialization of
- fattr.na_fileid, it is now done in map.c when the map is initialized
-
- * amd/map.c (init_map): initialize fattr.na_fileid to am_gen, not
- to 0, to avoid cache aliasing problems on Linux (and to follow the
- NFS spec!)
-
-2000-11-22 Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at>
-
- * libamu/mount_fs.c (mount_fs): avoid using extra limited-size buf
- (security)
-
- * libamu/xutil.c, fsinfo/fsinfo.h, include/am_utils.h: use
- __attribute__, __format__, and __printf__ for GCC string auditing.
-
- * wire-test/wire-test.8: this is not a section 8L man page.
-
- * libamu/xutil.c (expand_error): don't use sys_nerr on systems
- that support strerror().
- (dplog): fmt is const
- (plog): fmt is const
- (real_plog): fmt is const. use new expand_error function with its
- new return value. be more careful about running off the end of
- char[] fixed size buffers.
-
- * libamu/wire.c (getwire): fix alignment error on alpha using an
- extra automatic storage variable ifrpool.
-
- * hlfsd/hlfsd.c (fatal): use proper printf style to plog.
-
- * fsinfo/fsinfo.c (find_username): getlogin() returns a const.
-
- * fsinfo/fsi_util.c (error, lerror, lwarning, fatal, log): use
- vfprintf.
-
- * fsinfo/fsi_lex.l (yyerror): use vfprintf.
-
- * fixmount/fixmount.8: this is not a section 8L man page.
-
- * doc/am-utils.texi (Hesiod maps): fixed typo.
-
- * amd/sched.c (do_task_notify): typo in comment.
-
- * amd/opts.c (expand_op): expand_error[] is a const char *.
-
- * amd/amd.c (main): use proper printf style to plog.
-
-2000-11-22 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (mnt_flags, compute_nfs_args): recognize
- proplist mnttab flag. Bug fix from Wolfram Klaus
- <klaus@physik.fu-berlin.de>.
-
-2000-11-19 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * updated config.guess, config.sub, and doc/texinfo.tex from
- mirrors
-
- * Makefile.am (update): proper updating of config.* and texinfo
- from mirrors.
-
- * aux/macros/check_nfs_prot_headers.m4: newer netbsd systems
- reports their system name as "netbsdelf" in config.guess.
-
-2000-11-13 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (opts Option): document new mount option
- "proplist"
-
- * include/am_compat.h: define amd mount option "proplist" if the
- system doesn't recognize it, but the NFS bit flag exists.
-
- * configure.in, acconfig.h: recognize/support "proplist" NFS mount
- option in Amd, useful under DU-4.0 to process ACLs over NFS
- mounts.
-
-2000-11-10 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- * conf/mount/mount_linux.c (mount_linux): removed unnecessary
- rsize/wsize defaults -- performance killers on 2.2.18+ and 2.4.0+
-
-2000-10-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/am-eject.in: accept "cdrom" and "floppy" as arguments.
-
-2000-11-05 Ion Badulescu <ionut@moisil.dev.hydraweb.com>
-
- Too many changes to list them here. Here's a high level
- description:
-
- * Forward-ported the Linux fixes from 6.0.5pre
-
- * Got rid of a mountain of #ifdef DEBUG, replaced with smart
- header-file #ifdef's
-
- * and, the grand finale: initial Solaris 2.6 autofs
- support. Compiles, mounts, gets requests; all the
- infrastructure is in place to actually implement the calls. Linux
- autofs might be a bit broken, but only compile-time so it'll be
- easy to fix.
-
-2000-11-01 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * MIRRORS (Note): added a mirror at ufl.edu
-
-2000-10-11 Erez Zadok <ezk@lorien.dev.hydraweb.com>
-
- * amq/amq.8: synchronize Amq's options with reality
-
- * amq/amq.c (main): synchronize Amq's usage() string with reality
-
-2000-10-10 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-amd.in: add targets condrestart (redhat) and
- reload.
-
-2000-10-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/lostaltmail.in (vrfy_user): ensure that MAILDIR is
- defined.
-
-2000-09-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/opts.c (backslash): Bell char (ASCII 007) should be \g, not
- \a.
-
-2000-09-17 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_utils.h: removed unused field opt_autopref
-
- * amd/opts.c: removed unused variable $autopref
-
-2000-09-05 Erez Zadok <ezk@aladdin.dev.hydraweb.com>
-
- * conf/mtab/mtab_svr4.c (lockfile): function not needed unless
- MOUNT_TABLE_ON_FILE is defined.
- mtlckname static var is onlyneeded if MOUNT_TABLE_ON_FILE.
- (update_mnttab_fields): only needed if MOUNT_TABLE_ON_FILE.
-
-2000-09-03 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * buildall (Usage): typo in usage string
-
-2000-08-25 Erez Zadok <ezk@lynn.soscorp.com>
-
- * conf/mount/mount_linux.c (mount_linux): MNT2_NFS_OPT_VER3 may
- is no defined on older Linux systems (kernel 2.0.36)
-
-2000-08-19 Erez Zadok <ezk@earth.cs.columbia.edu>
-
- * scripts/amd.conf.5: correct swapped descriptions for ldap_base
- and ldap_hostports.
-
- * doc/am-utils.texi: correct swapped descriptions for ldap_base
- and ldap_hostports.
-
- * scripts/amd.conf-sample: swap examples for ldap_base and
- ldap_hostports.
-
-2000-08-13 Erez Zadok <ezk@earth.cs.columbia.edu>
-
- * scripts/amd.conf-sample: -O is CLI equivalent to "os"
- amd.conf parameter
-
-2000-07-30 Erez Zadok <ezk@earth.cs.columbia.edu>
-
- * scripts/amd.conf-sample (nfs_retransmit_counter): correct
- meaning and use of parameter
-
-2000-07-23 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi: updated URLs to www.am-utils.org.
-
-2000-07-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Supported Platforms): document osf4.0f
-
-2000-06-19 Erez Zadok <ezk@vir.cs.columbia.edu>
-
- * doc/am-utils.texi (dollar Selector Variable): document
- ${dollar}.
-
- * amd/opts.c: special new variable ${dollar} which expands into a
- literal '$' sign. Otherwise there is no way to include a literal
- dollar symbol in an amd map.
-
-2000-06-11 Ion Badulescu <ib42@moisil.cs.columbia.edu>
-
- * amd/opts.c (eval_selectors): don't deref opt after it's been
- XFREE'd
-
-2000-06-11 Erez Zadok <ezk@earth.cs.columbia.edu>
-
- * amd/opts.c: move mount_type expansion until later in the list,
- so common variable are "hit" first.
-
-2000-06-11 Ion Badulescu <ib42@moisil.cs.columbia.edu>
-
- * amd/opts.c (split_opts, eval_selectors): split old function
- eval_opts into two, one that only splits non-selectors and
- assigns the values to fs_static, and one that only evaluates
- selectors; also simplified the rather obfuscated logic inside
- these functions
- (expand_op): made it take a char * instead of a structure from
- which it was using only one field (a char *). Also now returns a
- char * instead of modifying said structure in place
- (expand_opts): deal with the change above
- (expand_selectors): renamed from expand_key
- (expand_options): new function, expands non-selectors; it's the
- complement of expand_selectors, both of which are just wrappers
- around expand_op()
- (eval_fs_opts): use the new split_opts, eval_selectors to allow
- using options (like ${rhost}) in selectors
-
-2000-06-11 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * config.guess.long: munge config.guess' output so that intel
- linux appears as i386-pc-linux
-
-Fri Jun 9 16:06:56 2000 Erez Zadok <ezk@defiant.dev.hydraweb.com>
-
- * conf/nfs_prot/nfs_prot_bsdi2.h: getifaddrs() on bsdi2 is broken.
- Don't use it.
-
-2000-06-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/mapc.c (maptypes): Change default allocation mode to
- MAPC_INC where reload support is missing to avoid warning in
- mapc_create().
-
-2000-06-09 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos5_5.h: turn off autofs support for
- solaris 2.5 until a full port can be done.
-
-2000-06-07 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * Makefile.am, aux/GNUmakefile: fix maintainer rules to update
- config.* and texinfo.tex files.
-
- * amd/nfs_subr.c (nfsproc_getattr_2_svc): Don't conditionalize the
- mtime update of the symlinks on the SYMTTL option, but rather
- delay unmount of what was looked up using am_timeo_w. Patch from
- Nick Williams <Nick.Williams@msdw.com>. As Nick says "Basically:
- during unmount, increment the parent dir's mtime (fixes
- people doing amq -u). During stat, increase the TTL (to fix bad-luck
- timeouts), but leave the mtime alone."
-
- (nfsproc_lookup_2_svc, nfsproc_readlink_2_svc, unlink_or_rmdir,
- nfsproc_readdir_2_svc): correctly update d_drops stats for amq -s.
- Patch from Nick Williams <Nick.Williams@msdw.com>.
-
- * amd/map.c (unmount_mp): update mtime of amd symlink to further
- reduce the chances of race conditions between unmounting and
- looking up an entry again. Patch from Nick Williams
- <Nick.Williams@msdw.com>.
-
- * README: updated instructions
-
- * bootstrap: remove log file before existing
-
-2000-06-06 Erez Zadok <ezk@aladdin.dev.hydraweb.com>
-
- * configure.in: no longer using aux/ subdir. don't force autoconf
- 2.14. comment out (but leave explanation) everything that's needed
- for autoconf 2.14, so for now it works with autoconf-2.13, but the
- code is ready for 2.14 when it is released. Similar changes to
- make code work with automake-1.4, until the next release comes
- out.
-
- * libamu/Makefile.am: include definitions that are required in
- automake 1.4, but won't be necessary when the next release of
- automake comes out (see XXX comments).
-
- * cache_check_dynamic.m4, check_checkmount_style.m4,
- check_mnttab_style.m4, check_mount_style.m4,
- check_network_transport_type.m4, check_nfs_prot_headers.m4,
- check_umount_style.m4: use symlink creation code that works for
- both autoconf 2.13 and 2.14 (when the latter comes out).
-
- * bootstrap: new script for maintainers to run to update autoconf,
- automake, and libtool related files. Has the same effect as
- "buildall -K".
-
- * removed dependencies on CVS versions of autoconf, automake, and
- libtool, especially the modified automake I had. This is so that
- maintainers could built the auto* files out of the latest released
- GNU autoconf, automake, and libtool. However, without my nice
- patches to automake, many files that used to live in the aux/
- subdir now were moved to the top level source directory: acconfig.h,
- acinclude.m4, aclocal.m4, aux_conf.h.in, config.guess,
- config.guess.long, config.h.in, config.sub, configure.in, depcomp,
- install-sh, ltconfig, ltmain.sh, missing, and mkinstalldirs. Also
- texinfo.tex and mdate-sh moved from aux/ dir to doc/ dir.
-
-2000-06-05 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * cvs-server.txt: instructions for maintainers to access the CVS
- server for am-utils.
-
-2000-06-03 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * amd/restart.c (restart): grr.. passing around initialized
- structures is *really* bad habit. memset(mo, 0) so at least we can
- test for NULL pointers...
-
-2000-06-02 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/am_ops.c (ops_match): changed XLOG_USER messages about
- merging addopts options to the more appropriate XLOG_INFO. Patch
- submitted by Tom Schmidt <tschmidt@micron.com>.
-
- * config.{guess,sub}: make sure chmod'ed a+rx. Updated from
- latest GNU copies.
-
-2000-05-30 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * aux/configure.in: bump up the version to 6.1a2
-
-2000-05-29 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * released snapshot am-utils-6.1a1
-
-2000-05-29 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * amd/ops_autofs.c (autofs_mounted): retrieve the autofs protocol
- version and store it in the fh
- (autofs_get_opts): support protocol version 4
-
- * amd/mntfs.c (uninit_mntfs): clear the autofs fh pointer after
- releasing it
-
- * conf/transp/transp_sockets.c (amu_svc_getcaller): cast result of
- svc_getcaller() to sockaddr_in, to appease glibc 2.2
-
- * amd/amfs_auto.c (amfs_auto_bgmount): if the filesystem wants
- autofs handling and the parent is already handled by autofs,
- handle this filesystem as well
- (amfs_auto_mount): create the mountpoint for an autofs mount
- (amfs_auto_umount): do a real UMOUNT_FS() call for autofs mounts
-
- * include/am_utils.h (FS_AUTOFS): new flag signalling that the
- filesystem wants autofs handling; toplvl, auto, host and direct
- have this flag, at least for now
-
-2000-05-28 Erez Zadok <ezk@mulberry.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Network Filesystem Group): minor typos
-
-2000-05-28 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * amd/autil.c (am_unmounted): check mp->am_parent before dereferencing
-
- * amd/srvr_nfs.c (find_nfs_srvr): if NFS_SCALEDOWN, force
- version=2 and proto=udp and try again
-
- * amd/ops_nfs.c (prime_nfs_fhandle_cache): take an explicit mntfs
- instead of a voidp; handle the NFS_SCALEDOWN case by removing the
- cached server entry and re-querying the server
-
- * amd/amfs_toplvl.c (amfs_toplvl_mount): removed ugly if
- statement, assign mnttype from the fs-specific mf_ops->fs_type
- instead
-
- * amd/amfs_nfsx.c (amfs_nfsx_init): call fs_init() only if it's
- defined;
- (amfs_nfsx_remount): removed superfluous check for fmount_fs -- it
- always exists
- (amfs_nfsx_umount): removed the hacked am_node -- umounted() now
- takes an mntfs; call umounted() only if it's defined
-
- * amd/amfs_auto.c: removed amfs_auto_umounted and moved its
- functionality into am_umounted().
- (amfs_auto_cont): Linux hack: if we got an EINVAL, mark the mntfs
- as needing an "NFS scaledown" and retry the operation
-
- * amd/amfs_*.c: changed all fmount/fumount functions to
- mount/umount and made them take an am_node instead of an
- mntfs. This is a first step towards an amfs/ops API separation.
-
- * amd/{amfs,ops}_*.c: changed the umounted() function to take an
- mntfs instead of an am_node
-
-2000-05-28 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * amd/amfs_toplvl.c (mount_amfs_toplvl): init error to 0 to shut
- up gcc
-
- * aux/macros/check_hide_mount_type.m4: revert to the 6.0 version
- which always defines HIDE_MOUNT_TYPE
-
- * amd/ops_autofs.c (autofs_mounted): remove MFF_AUTOFS
- initialization -- now done in init_mntfs()
-
- * amd/mntfs.c (init_mntfs): init mf_flags to MFF_AUTOFS if we are
- mounting an autofs-style map
-
- * amd/*.c: use the MFF_AUTOFS flag instead of doing a costly STREQ
-
- * amd/amfs_toplvl.c (mount_amfs_toplvl): MTYPE_TYPE is not
- necessarily a string type, so handle the nfs/autofs separation
- differently
-
- * amd/amfs_auto.c (amfs_auto_bgmount): removed initialization of
- opt_mount_type (now done in ops_match())
-
- * amd/am_ops.c (ops_match): need to initialize opt_mount_type if
- it's not initialized yet
-
-2000-05-27 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/wire.c (getwire_lookup): handle calling irs_gen_acc with
- one or two arguments (bsdi3 vs. bsdi4)
-
-2000-05-27 Ion Badulescu <ib42@chestnut.mcl.cs.columbia.edu>
-
- * libamu/xutil.c (amu_release_controlling_tty): removed an unused
- variable from the previous patch
-
-2000-05-26 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * aux/macros/check_autofs_style.m4: fixed substitution for default
- case
-
- * libamu/xutil.c (amu_release_controlling_tty): close standard
- file descriptors, re-open them as /dev/null
-
- * include/am_defs.h: don't try to include both <ndbm.h> and
- <db1/ndbm.h>, it really doesn't work
-
-2000-05-16 Ion Badulescu <ib42@earth.cs.columbia.edu>
-
- * hlfsd/stubs.c (nfsproc_lookup_2_svc): added code to update mtime
- on lookup if MNT2_NFS_OPT_SYMTTL is not defined (copied from
- getattr). This fixes the problem introduced by the Linux nfsv3
- patches.
-
-2000-05-12 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * Makefile.am (EXTRA_DIST_CONF): added conf/autofs/autofs_linux.h
-
-2000-05-10 Ion Badulescu <ib42@earth.cs.columbia.edu>
-
- * amd/ops_autofs.c (autofs_handle_fdset): call
- autofs_lookup_failed instead of autofs_mount_failed, if the name
- is not in the map
- (autofs_umount_{succeeded,failed}): pass the actual mount point,
- not its parent, as it's needed for clean-up;
-
- * amd/autil.c (am_unmounted): notify autofs that the umount
- succeeded
-
- * amd/amfs_link.c (amfs_link_[u]mount): autofs link notification
- moved elsewhere
-
-2000-05-09 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * amd/amfs_auto.c (amfs_auto_bgmount): initialize opt_mount_type
- if necessary;
- (amfs_auto_mounted): test if opt_mount_type is NULL first
- (amfs_auto_mount): revert earlier change
-
- * amd/ops_autofs.c (autofs_mount_failed): remove autofs directory
- if mount failed
-
-2000-05-09 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * amd/ops_autofs.c (autofs_link_mount): use am_link as target
-
- * amd/map.c (unmount_mp): release file handle for autofs f/s about
- to be unmounted; this leak was preventing the unmount altogether
-
- * amd/amfs_auto.c (amfs_auto_umount): removed autofs-specific
- code, was broken
- (amfs_auto_bgmount): nfs mounts + sublinks is a valid combination,
- handle it
-
-2000-05-07 Ion Badulescu <ib42@moisil.cs.columbia.edu>
-
- * Merged changes from stable branch
-
-2000-04-30 Erez Zadok <ezk@beetle.mcl.cs.columbia.edu>
-
- * include/am_defs.h, aux/macros/mount_headers.m4,
- aux/macros/try_compile_anyfs.m4: include linux/kdev_t.h and
- linux/list.h before including linux/fs.h, and define __KERNEL__
- for those two headers. All of this to get a couple of definitions
- that are needed in the new struct vfsmount.
-
- * aux/configure.in: look for <linux/kdev_t.h> and <linux/list.h>.
-
- * include/am_defs.h, aux/macros/mount_headers.m4: avoid conflicts
- between linux/in.h. and netinet/in.h (linux-2.3.99-pre6), by
- defining _LINUX_IN_H so it doesn't get included.
-
-2000-04-03 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new ports: i686-pc-linux-gnu-rh6.2,
- i386-unknown-freebsdelf3.4, i586-pc-linux-gnu-rh6.2.
-
-2000-04-03 Erez Zadok <ezk@vir.cs.columbia.edu>
-
- * aux/acconfig.h: move all #undef macros above @TOP@, so they can
- be recognized by pickier autoconf.
-
-2000-04-03 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/cache_check_dynamic.m4 (ac_tmp): use correct echo -n
- or \c.
-
-2000-03-25 Erez Zadok <ezk@beetle.mcl.cs.columbia.edu>
-
- * include/am_defs.h: ditto
-
- * aux/macros/{mount_headers,try_compile_anyfs}.m4: force
- non-inclusion of <linux/string.h>. Breaks build on newer 2.3
- kernels.
-
-2000-02-26 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Amq -w option): document new amq -w option.
-
- * amq/amq.8: document new amq -w option.
-
- * amq/amq.c: disable last remains of insecure amq -M code.
- (main): add amq -H option to show usage.
- (main): new amq -w option, translates getpwd() into an amd path.
-
-2000-02-25 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * libamu/util.c (get_server_pid): new function
-
- * hlfsd/hlfsd.c (main): make use of HIDE_MOUNT_TYPE
-
- * conf/transp/transp_sockets.c: removed create_autofs_service
-
- * conf/mount/mount_linux.c: added autofs mount options; split
- mount_linux into two functions, itself and do_mount_linux
-
- * aux/macros/check_hide_mount_type.m4: better failover
-
- * aux/configure.in: changed version to 6.1a1; added
- AC_CHECK_AUTOFS_STYLE
-
- * aux/aux_conf.h.in: added @am_utils_autofs_style@
-
- * amd/opts.c: added "mount_type" option
-
- * amd/ops_autofs.c: ifdef-ed out solaris code; moved all autofs
- variables in here; split create_autofs_service into sun and linux
- specific functions
-
- * amd/nfs_start.c: removed autofs-specific variables
-
- * amd/map.c (get_root_nfs_fh): renamed root_fh to get_root_nfs_fh
- (get_root_ap): renamed root_ap to get_root_ap
-
- * amd/amfs_toplvl.c (amfs_toplvl_ops): replaced
- amfs_toplvl_mounted with amfs_auto_mounted
- (mount_amfs_toplvl): moved code around, added autofs handling
- (amfs_toplvl_mounted): removed
-
- * amd/amfs_nfsl.c (amfs_nfsl_ops): removed amfs_auto_fu?mount,
- replaced with amfs_nfsl_u?mount
-
- * amd/amfs_linkx.c (amfs_linkx_ops): removed amfs_auto_fumount,
- replaced with amfs_link_umount
-
- * amd/amfs_link.c (amfs_link_ops): removed amfs_auto_fu?mount,
- replaced with amfs_link_u?mount
-
- * amd/amfs_direct.c (amfs_direct_ops): changed "mounted" function
- from amfs_toplvl_mounted to amfs_auto_mounted
-
- * all: added autofs hooks throughout the code
-
- * amd/am_ops.c (vops): autofs_ops doesn't belong in here, removed
-
- * README.autofs: linux status update
-
-2000-02-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new port: alphaev6-dec-osf5.0
-
- * doc/am-utils.texi (Supported Platforms): hpux-11 supports NFSv3,
- but only for UDP.
-
- * released snapshot am-utils-6.0.4s3
-
- * conf/nfs_prot/nfs_prot_hpux11.h: support NFSv3 in hpux-11. Note
- that hpux-11 NFSv3 supports UDP only, and trying TCP locks up the
- kernel! Must set nfs_proto=udp in amd.conf [global].
-
- * aux/config.guess.long: set and export PATH separately. DU5
- /bin/sh doesn't like setting it on the command line in a
- back-tick'ed `script`.
-
-2000-02-24 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * Makefile.am: removed struct_nfs_mount_data.m4
-
- * aux/macros/struct_nfs_mount_data.m4: deleted
-
- * aux/acconfig.h: removed definition for HAVE_NFS_MOUNT_DATA
-
- * aux/configure.in: removed check for struct nfs_mount_data
-
-2000-02-24 Ion Badulescu <ib42@beetle.mcl.cs.columbia.edu>
-
- * amd/amfs_auto.c (amfs_auto_bgmount): changed log message to
- avoid having 'failed' in a message not indicating a failure
- (amfs_auto_lookuppn): ditto
-
- * amd/ops_autofs.c (autofs_bgmount): ditto
- (autofs_lookuppn): ditto
-
-2000-02-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * added .cvsignore files into the CVS repository.
-
- * remove files which can be regenerated: .in, configure, some
- files in aux/, and more.
-
-2000-02-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (nfs_vers/nfs_proto): description of two
- parameters was reversed. Reported by Paul Jenner
- <p.jenner@eim.surrey.ac.uk>.
-
-2000-02-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.4s2
-
- * amd/mntfs.c (realloc_mntfs): don't fallback on certain ops such
- as inherit, error, and toplvl (failover code).
-
- * amd/conf.c (gopt_nfs_vers, gopt_nfs_proto): two new (documented)
- global options in amd.conf: one to set the NFS version globally
- (i.e., nfs_vers=2), and one to set the NFS protocol globally
- (i.e., nfs_proto=udp).
-
- * amd/mntfs.c (realloc_mntfs): attempt to fix the failover code,
- so when a matching mount entry failed, try the next one.
-
-2000-02-15 Erez Zadok <ezk@moisil.cs.columbia.edu>
-
- * amd/amfs_auto.c: a new debug option "readdir" to trace the
- progress of the browsable_dirs code.
-
- * conf/mount/mount_linux.c (mount_linux): ensure that the new
- linux NFSv3 code works for v2-only machines.
-
-2000-02-14 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: cleanup unused dnl entries.
-
- * conf/mount/mount_linux.c (parse_opts): typo: check for string
- equality, not string inequality for pcfs and cdfs.
-
- * aux/acconfig.h: look for MNT2_NFS_OPT_INTR as well.
-
- * libamu/mount_fs.c (compute_mount_flags): check for INTR and
- NOINTR options as well (intr was never passed to linux mount
- syscall).
-
-2000-02-10 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.4s1
-
- * aux/GNUmakefile: buildall -k (for maintainers) temporarily now
- ignores autoconf warnings: "The macro `AC_OUTPUT_COMMANDS' is
- obsolete". It is harmless but annoying, and will be fixed when
- autoconf and automake in their respective CVS trees are working
- and in sync again.
-
- * scripts/amd.conf.5: document -D hrtime,xdrtrace
-
- * all man pages: update copyright to 2000.
-
- * doc/am-utils.texi: update copyright to 2000.
-
-Wed Feb 9 14:22:31 2000 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * include/am_utils.h (D_XDRTRACE): Define.
- (D_TEST): Disable here.
-
- * libamu/xutil.c (dbg_opt): Handle it.
-
- * doc/am-utils.texi (-D-Option): Document it.
-
- * libamu/xdr_func.c: Use it instead of D_TRACE.
-
- * include/am_utils.h (D_HRTIME): Define.
-
- * doc/am-utils.texi (-D-Option): Document it.
-
- * libamu/xutil.c (show_time_host_and_name): Print high-resolution
- timestamp if available and activated.
-
- * aux/configure.in (clock_gettime): Check for it in -lrt and
- -lposix4.
-
- * hlfsd/hlfsd.c (mnttab_file_name): Initialize to MNTTAB_FILE_NAME
- if defined, even for some systems with in kernel mount tables.
-
-2000-02-08 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * aux/macros/mount_headers.m4: remove #if 0 around linux/nfs.h to
- allow compiles against libc5
-
- * aux/macros/check_mnttab_type.m4: avoid detecting nfs3 under
- linux when the kernel doesn't support it
-
- * include/am_compat.h: add workaround for linux efs
-
-2000-02-08 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: test for ANSI C compiler (before AC_C_CONST).
- Comment out unused AC_STRUCT_ST_RDEV (which is obsolete anyway).
-
-2000-02-07 Ion Badulescu <ionut@moisil.cs.columbia.edu>
-
- * libamu/mount_fs.c (compute_nfs_args): turn on VER3 option for
- nfs (linux NFSv3).
-
- * include/am_defs.h: avoid reinclusion of some header files under
- linux.
-
- * conf/nfs_prot/nfs_prot_linux.h: support NFSv3.
-
- * conf/mount/mount_linux.c (mount_linux): support nfs mount
- (implementation) version 4 for NFSv3.
-
- * aux/macros/try_compile_nfs.m4: use AC_MOUNT_HEADERS.
-
- * aux/macros/mount_headers.m4: don't include <linux/fs.h> (may
- need to fix the code on other linux machines).
-
- * aux/macros/check_mnttab_type.m4 (ac_safe): ditto.
-
- * aux/macros/check_fs_mntent.m4 (ac_safe): check for nfs3 option
- under linux (depends on ac_cv variable, is that a good idea?)
-
- * added NFSv3 support for linux
-
- * aux/{configure.in,acconfig.h}: new option ver3
-
- * aux/macros/mount_headers.m4: commented out inclusion of
- linux/fs.h, it's not needed on rh61 (and actually generates
- conflicts), we should see if it's still needed on libc5 systems
-
- * aux/macros/try_compile_nfs.m4: use AC_MOUNT_HEADERS rather than
- try to have its own (out of date) list of headers and ifdef's and
- ...
-
-2000-02-07 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0.3 ***
- *******************************************************************
-
-2000-02-06 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_default.c: dummy empty file to work around a
- limitation of automake (it looks for LIBBOBJS in aclocal.m4 and
- processes them even if they are optional, enclosed in if/else).
-
-2000-01-29 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.3s5
-
-2000-01-25 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * update to use latest version of autoconf, automake, and libtool.
-
- * aux/GNUmakefile (depcomp): "make update" should also update the
- depcomp script.
-
- * Makefile.am (EXTRA_DIST_AUX): include depcomp in distribution.
-
- * aux/configure.in: use renamed AC_CHECK_AMU_FS.
-
- * aux/macros/check_amu_fs.m4: renamed macro name and file name to
- say AMU_FS, not AM_FS.
-
- * aux/acconfig.h: renamed HAVE_AM_FS_* to HAVE_AMU_FS_* because
- latest version of autoconf doesn't handle it (bug in 2.14a)
-
- * aux/configure.in: require version 2.14 of autoconf.
-
- * amd/mapc.c (mapc_reload_map): more fixes from Nick Williams.
-
- * doc/am-utils.texi (Automount Filesystem): document type:=auto
- map browsability option.
-
- * amd/mapc.c (make_entry_chain): patch from Steven Danz
- <sdanz@awc.kc.noaa.gov> to allow browsable auto maps.
-
-2000-01-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.3s4
-
- * amd/mapc.c (mapc_reload_map): fixes to sync maps even if they
- are set to mapcache:=sync. Fix from Nick Williams
- <Nick.Williams@msdw.com>.
-
-2000-01-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.3s3
-
- * minor port to i386-unknown-netbsd1.4.1
-
- * amd/nfs_subr.c (nfsproc_getattr_2_svc): patch from Nick Williams
- <Nick.Williams@msdw.com> to fix (or reduce the incidence of) stale
- file handles when doing rapid mounts and umounts in succession
- such as "ls /vol/foo ; amq -u /vol/foo ; ls /vol/foo"
-
-2000-01-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor port to i386-pc-bsdi4.1.
-
-2000-01-13 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/wire.c (getwire_lookup): pass NULL as conf_file (2nd)
- argument to irs_gen_acc(), which was changed in bsdi 4.1.
-
-2000-01-12 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/get_args.c (get_args): don't use MNTTAB_FILE_NAME for
- systems with in-kernel mount tables unless this macro is defined
- (Solaris 8).
-
-2000-01-01 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * ALL: bump copyright year to 2000.
-
-1999-12-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_svr4.c (mount_svr4): optionstr exists on
- solaris 7, but should not be used unless MAX_MNTOPT_STR also
- exists (solaris 8).
-
- * doc/am-utils.texi (opts Option): document new mount option:
- optionstr.
-
-Fri Dec 10 01:31:53 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/trap/trap_svr4.h (MOUNT_TRAP): Pass mount option string to
- mount_svr4().
- (mount_svr4): Adapt prototype.
- * conf/mount/mount_svr4.c (mount_svr4): Pass them to kernel so
- they are evaluated and show up in Solaris 8 in-kernel mnttab.
-
- * aux/configure.in: Check for new Solaris 8 MS_OPTIONSTR mount(2)
- option.
- * aux/acconfig.h (MNT2_GEN_OPT_OPTIONSTR): Provide template.
-
-1999-12-10 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.3s2
-
-1999-12-09 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (opts Option): document noexec and nomnttab
- (new to Solaris 8).
-
- * Makefile.am (EXTRA_DIST_CONF): include nfs_prot_sunos5_8.h in
- distribution.
-
- * applied fixes from Rainer Orth for Solaris 8.
-
- * libamu/wire.c (getwire): increment the cp pointer in the loop
- body, because the ioctl() inside the "for" loop will overwrite the
- ifr structure, thus not detecting all of the interfaces. Bug
- reported and fixed by Amitha Perera <perera@cs.rpi.edu>.
-
-Thu Dec 9 19:09:38 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/mtab/mtab_svr4.c (unlockmnttab, lockmnttab): No-ops if
- MOUNT_TABLE_ON_FILE.
-
- * amd/get_args.c (get_args): Initialize mnttab_file_name even for
- in-kernel mount table. conf/mtab/mtab_svr4.c (read_mtab) depends
- on a non-NULL value.
-
- * amd/info_ldap.c (get_ldap_timestamp): Don't peek into opaque
- LDAP structure to get error code, but use it directly.
- (amu_ldap_search): Likewise.
-
- * conf/nfs_prot/nfs_prot_sunos5_7.h: Rip superfluous and wrong
- ldap support.
- * conf/nfs_prot/nfs_prot_sunos5_8.h: Likewise.
-
- * conf/nfs_prot/nfs_prot_sunos5_8.h: New file, doesn't typedef
- nfsstat, already in <nfs/nfs.h>.
- * aux/macros/check_nfs_prot_headers.m4: Use it for all Solaris
- versions beyond 7.
- Allow for micro versions of SunOS 5.[67].
-
- * aux/configure.in: Check for new Solaris 8 Beta Refresh
- MS_NOMNTTAB mount(2) option.
- * aux/macros/check_mnttab_location.m4: Use it to test for
- mntfs-based in-kernel mnttab.
-
- * aux/macros/os_cflags.m4: Treat Solaris 8 and higher like 2.6/7.
-
- * aux/macros/check_fs_headers.m4: Revert test for duplicate
- objects.
- * aux/macros/check_fs_mntent.m4: Likewise
-
- * aux/macros/HEADER: Fixed typo.
-
- * include/am_defs.h: Likewise.
-
-1999-12-01 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/*.m4: prepare for hpux-12 (assume same as hpux-11)
-
-1999-11-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * BUGS: document glibc-2.1 nis file descriptor leak in yp_bind.
-
- * amd/info_ldap.c (string2he): updated function which does not
- corrupt strings when called more than once. Patch from
- JOHANN.PFEFFERL.JP@germany.agfa.com.
-
-1999-11-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * MIRRORS (Asia): two new mirrors in Japan.
-
-1999-11-10 Erez Zadok <ezk@kosh.cs.columbia.edu>
-
- * doc/am-utils.texi: document new variables for ${uid} and ${gid}.
-
- * amd/nfs_subr.c (nfsproc_lookup_2_svc): find the uid/gid of the
- last lookup from the RPC credentials.
-
- * aux/configure.in: upped version-info to 4:0:2 because I've added
- a new interface to libamu.
-
- * libamu/misc_rpc.c (getcreds): moved function from hlfsd to here,
- so it can be used by amd.
-
- * amd/opts.c: new variables ${uid} and ${gid}.
-
-1999-10-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-amd.in: add "status" command that tells you if amd
- is running on not (same output as RedHat scripts).
- Added start_msg and stop_msg targets as they are used on HPUX.
- reported by Jon Peatfield <J.S.Peatfield@damtp.cam.ac.uk>.
-
-1999-10-13 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.3s1
-
-1999-10-12 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/amd.c (main): On AIX you must lower the stack size using
- ulimit() before calling plock. Otherwise plock will reserve a lot
- of memory space based on your maximum stack size limit. Since it
- is not easily possible to tell what should the limit be, I print a
- warning before calling plock(). See the manual pages for
- ulimit(1,3,4) on your AIX system.
-
- * include/am_defs.h: define default extern for vsnprintf()
-
- * aux/configure.in: check for extern definition for vsnprintf()
-
-1999-10-08 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/amfs_auto.c (amfs_auto_bgmount): patch from Nick Williams
- <njw@ms.com>. SYMPTOMS: 'occasionally' sublinks do not point to
- the correct location, but to the top level of the mountpoint and
- an (error-hook) is seen being mounted in the log file. This causes
- things to Go Wrong(TM).
- CAUSE: When evaluating two locations which are requested
- 'practically simultaneously', and the two locations resolve to the
- same NFS mountpoint (but different sublinks), the later request
- will be "deferred" and retried after wakeup when the first mount
- succeeds. To do this, it rewinds the options location string to
- re-evaluate the location when the mount is retried. However, it
- shouldn't rewind the options for two reasons: (a) the semantics of
- the map language say you shouldn't and (b) the NFS mount reference
- is not reset at the same time, meaning that on the retry it will
- have an options structure out-of-sync with the mount
- structure. The "shortcut" code when retrying the mount sees the
- mount structure is already filled in and does not fully evaluate
- the options structure.... so if the first location is not the one
- which ties in with the mountpoint (see ordering in the
- recreate-by), you're now well messed up.
-
- * BUGS: mention aix4.3 plock() bug (memory usage blows up and
- plock fails)
-
-1999-10-07 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/GNUmakefile: certain files should be copied if they are
- newer, not also if they are bigger: install-sh, ltconfig,
- ltmain.sh, mdate-sh, missing, mkinstalldirs, and texinfo.tex.
-
- * minor new port: i586-pc-linux-gnu-rh6.1 (RedHat Linux 6.1)
-
-1999-10-05 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_nfs_prot_headers.m4: prepare for OSF-5.
-
- * aux/macros/check_nfs_fh_dref.m4: prepare for Tru64, aka OSF-5.
-
-1999-09-30 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0.2 ***
- *******************************************************************
-
-1999-09-27 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_linux.c (mount_linux): print the updated mount
- flags.
-
- * doc/am-utils.texi: document $full_os and $vendor.
-
- * scripts/amd.conf-sample: examples of $full_os and $vendor.
-
- * scripts/amd.conf.5: document $full_os and $vendor.
-
- * amd/conf.c: add support for $full_os and $vendor.
-
-1999-09-26 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (netgrp Selector Function): don't give
- examples with old single '=' assignment variable. Use foo:=bar.
-
- * amd/amfs_auto.c (amfs_auto_bgmount): corectly indent long
- comment describing this complex function.
-
- * doc/Makefile.am (alldocs): do install-ps last (because distiller
- is slow) and install-html next to last (because texi2html is also
- slow).
-
- * amd/amd.8: Major fixes to the description of the option -t
- timeout.retransmit.
-
- * doc/am-utils.texi: better description of "trace" debug option.
- amd -H (not -v) shows log_options and debug_options. Major fixes
- to the description of amd -t timeout.retransmit, and the amd.conf
- parameters nfs_retransmit_counter and nfs_retry_interval.
-
- * scripts/amd.conf.5: better description of "trace" debug option.
- amd -H (not -v) shows log_options and debug_options. Major fixes
- to the description of the parameters nfs_retransmit_counter and
- nfs_retry_interval.
-
-1999-09-25 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Automount Filesystem): cache:= is not a mount
- option, but a mount map option.
-
- * libamu/xutil.c (switch_to_logfile): log the name of the log file
- we switched into, after the log file had been [re]opened.
-
-1999-09-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/mapc.c (mapc_reload_map): count and show the number of times
- a map was reloaded. Only reload a map if its modify-time was
- updated. But amq -f forced a reload no matter what.
-
- * amd/amd.h: new flag to struct mnt_map to count number of times a
- map was reloaded.
-
- * amd/mapc.c (mapc_reload_map): attempt to reload the map without
- losing current data by reloading into a temp copy, and switching
- the hashes round only if the reload was successful. Patch from Jon
- Peatfield <J.S.Peatfield@damtp.cam.ac.uk>.
- (mapc_sync): mapc_reload_map() always succeeds.
-
-1999-09-22 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_ldap.c (amu_ldap_rebind): don't busy-loop trying to
- rebind to an LDAP server forever. Try up to 10 times.
-
- * fsinfo/fsi_lex.l (yyerror): rework code that will never happen
-
- * released snapshot am-utils-6.0.2s2
-
- * aux/configure.in: bumped library version-info to 3:2:1, since
- some libamu code got changed.
-
- * libamu/xutil.c (real_plog): use vsnprintf, not vsprintf, which
- is better and more secure. Fix from "David O'Brien"
- <obrien@NUXI.com>.
-
- * aux/configure.in: check for vsnprintf.
-
-1999-09-21 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/linux_headers.m4: use AC_MSG_ERROR.
-
- * aux/macros/opt_{cppflags,ldflags,libs,amu_cflags}.m4: the ARG is
- not optional. Make sure ARG is supplied else flag an error.
-
-1999-09-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor port i386-unknown-freebsdelf3.3
-
- * released snapshot am-utils-6.0.2s1
-
-1999-09-17 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in (AC_CHECK_FUNCS): check for getitimer().
-
- * include/am_defs.h: extern definition for getitimer().
-
- * aux/configure.in: use AC_CHECK_EXTERNS. Look for getitimer()
- extern.
-
- * aux/macros/check_extern.m4: define a simple AC_CHECK_EXTERNS
- that calls AC_CHECK_EXTERN in a loop. This saves repeated code in
- configure.
-
- * aux/macros/type_auth_create_gidlist.m4: AIX 4.x systems use
- 'int' as the 5th arg to authunix_create().
-
- * aux/macros/type_recvfrom_fromlen.m4: all AIX 4.x systems use a
- size_t for the 6th arg of recvfrom().
-
- * aux/macros/os_cflags.m4: define _XOPEN_EXTENDED_SOURCE for
- aix4.x systems.
-
- * libamu/mount_fs.c (print_nfs_args): cast some values to int, to
- avoid gcc -Wall errors.
-
- * scripts/expn.in: use sockaddr_in(), not pack() to correctly fill
- in a struct sockaddr_in. On Solaris x86 hosts, using pack()
- results in byte-misaligned values. Bug fix from Jeffrey C Honig
- <jch@BSDI.COM>.
-
- * libamu/mount_fs.c (compute_automounter_mount_flags): turn on
- automntfs (ignore on bsdi-4.1) flag.
- (compute_automounter_nfs_args): ditto.
-
- * aux/acconfig.h: add new flag for automntfs (ignore)
-
- * aux/configure.in: check for new automntfs flag (bsdi-4.1).
-
-1999-09-14 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * MIRRORS: added new site in Germany. Updated status of umn.edu
- and ferginc.com, who may no longer be mirroring am-utils.
-
-1999-09-08 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0.1 ***
- *******************************************************************
-
-1999-09-08 Erez Zadok <ezk@cs.columbia.edu>
-
- * aux/macros/mount_headers.m4: bsdi-2.1 needs MAXQUOTAS and struct
- netexport defined.
-
- * aux/macros/try_compile_anyfs.m4: bsdi-2.1 needs MAXQUOTAS and
- struct netexport defined.
-
-1999-09-07 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_field.m4 (ac_upcase_var_name): include
- <ifaddrs.h> so we can detect fields within struct ifaddrs.
-
- * libamu/wire.c (getwire): bsdi-2.1 uses a second arg to
- getifaddrs() and struct ifaddrs has no ifa_next field.
-
- * aux/configure.in: check if 'struct ifaddrs' has a field
- ifa_next.
-
- * include/amq_defs.h (AMQ_STRLEN): double size of amq string
- length to 2048 bytes.
-
- * conf/nfs_prot/nfs_prot_netbsd1_4.h: include several more nfs
- header files and ufs/ufs/ufsmount.h. Bug reported by <Christos
- Zoulas> christos@zoulas.com.
-
- * aux/macros/try_compile_anyfs.m4: include <ufs/ufs/ufsmount.h>.
- Bug reported by <Christos Zoulas> christos@zoulas.com.
-
- * aux/macros/mount_headers.m4: include <ufs/ufs/ufsmount.h>
-
-1999-09-06 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/xutil.c (expand_error): use strerror if available instead
- of sys_errlist. Bug reported by <Christos Zoulas>
- christos@zoulas.com.
-
- * hlfsd/hlfsd.c (fatal): use strerror if available instead of
- sys_errlist.
-
- * amq/amq.c (show_mi): use strerror if available instead of
- sys_errlist.
-
- * aux/macros/check_nfs_prot_headers.m4: make sure netbsd1.4
- nfs_prot header is used for any future (1.5 etc.) netbsd systems.
-
- * amq/pawd.c (find_mt): check for type nfsl as well. Fix from
- "Andrew J. Korty" <ajk@purdue.edu>
-
-1999-08-29 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Supported Platforms): updates for redhat
- systems.
-
- * INSTALL: updates for redhat systems.
-
- * libamu/wire.c (getwire_lookup): spell "succeeded" correctly
-
-1999-08-28 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-amd.in: sleep 1 second between killing amd and
- restarting it, because amq may respond that amd is down, where in
- fact it is still trying to unmount itself after unmapping itself
- from the portmapper.
-
- * aux/config.guess.long: new script to print long version of
- config.guess output.
-
- * buildall (host_alias): use long version of config.guess.
-
-1999-08-27 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-{amd,hlfsd}.in: update RH tags for start/stop
- scripts.
-
-1999-08-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s11
-
- * libamu/xutil.c (expand_error): make sure expanding the string
- with textual version of errno doesn't overrun the 1024 bytes
- buffer.
- (real_plog): null terminate msg, just in case.
-
- * amq/amq.c (main): don't getopt -M option and don't process it
- unless ENABLE_AMQ_MOUNT is on.
-
- * amd/amq_svc.c (amq_program_1): all code that relates to amq -M
- is conditional on #ifdef ENABLE_AMQ_MOUNT.
-
- * amd/amq_subr.c: remove amqproc_mount_1_svc() function invoked
- when amq -M code is disabled. Not taking any chances.
-
-1999-08-23 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s10
-
-Sun Aug 22 16:18:59 1999 Erez Zadok <ezk@subzero.cs.columbia.edu>
-
- * libamu/wire.c (getwire_lookup): if getnetbyaddr failed (e.g., on
- 128.59.16.0), try to shift the network out of zeros (e.g.,
- 128.59.16) and try again. Irix 6.4 requires short network
- numbers.
-
-1999-08-22 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/wire.c (getwire_lookup): correctly compute subnet using
- netmask.
-
- * libamu/mount_fs.c (compute_automounter_nfs_args): require that
- Amd's own NFS mounts use reserved ports (if possible). IP packet
- security fix from Jeffrey C Honig <jch@BSDI.COM>.
-
- * conf/transp/transp_tli.c (create_autofs_service): use correct
- autofs_port. IP packet security fix from Jeffrey C Honig
- <jch@BSDI.COM>.
-
- * conf/transp/transp_sockets.c (bindnfs_port): remove unnecessary
- function. IP packet security fix from Jeffrey C Honig
- <jch@BSDI.COM>.
- (create_nfs_service): use bind_resv_port() directly. ensure that
- privileged ports are used. IP packet security fix from Jeffrey C
- Honig <jch@BSDI.COM>.
-
- * amd/nfs_prot_svc.c (nfs_program_2): verify that requests come
- from reserved ports and from a local IP address. IP packet
- security fix from Jeffrey C Honig <jch@BSDI.COM>.
-
- * amd/amq_subr.c (ok_security): use IPPORT_RESERVED, instead of
- hard-coded 1024. IP packet security fix from Jeffrey C Honig
- <jch@BSDI.COM>.
- (amqproc_mount_1_svc): provide information on the caller making an
- amq -M request. IP packet security fix from Jeffrey C Honig
- <jch@BSDI.COM>.
-
- * amd/map.c (free_map_if_success): If the program doing an unmount
- of a program filesystem fails, amd tries to interpret the return
- code as an errno. Fix from Jeffrey C Honig <jch@BSDI.COM>.
-
- * amd/info_nis.c (determine_nis_domain): don't always print
- warning about NIS domain name not being set, even if NIS is not in
- use.
-
-1999-08-21 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_ldap.c (get_ldap_timestamp): initialize variable err.
- (amu_ldap_search): initialize variable err.
-
-1999-08-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/wire.c: written using getifaddrs() for BSD systems,
- contributed by BSDI, Jeffrey C Honig <jch@BSDI.COM>).
-
-1999-08-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_utils.h (SALLOC): a simple macro to allocate N bytes.
-
- * aux/configure.in: check for irs.h and ifaddrs.h.
- Increase libamu.so --version-info to 3:1:1 since we've changed the
- source code for the library.
- Check for getifaddrs() function.
-
-1999-08-14 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (print_nfs_args): print fields namlen and
- bsize if they exist.
-
- * conf/mount/mount_linux.c (mount_linux): set nfs_args_t->namlen
- and ->bsize fields correctly, if those fields exist. This is a
- bug in that amd neglected to set these fields, but told the
- kernel it is mounting the nfs_args_t structure using mount version
- 3 (which requires both bsize and namlen fields).
-
- * aux/configure.in: test for two new nfs_args_t fields (used on
- newer linux with mount versions 2 and 3): bsize and namlen.
-
- * doc/am-utils.texi (netgrpd Selector Function): document new
- selector function.
-
- * amd/opts.c (f_netgrpd): new amd map function netgrpd(ARG) to
- test if the current host (fully-qualified name) is in the ARG host
- netgroup. The netgrp() function uses the short form of a host
- name. Patch from Christophe Kalt <Christophe-Kalt@deshaw.com>.
-
- * doc/am-utils.texi (automount2amd): document new script.
-
- * scripts/Makefile.am: create, install, and distribute
- automount2amd perl script and its man page.
-
- * scripts/automount2amd.8: new man page for automount2amd.
-
- * scripts/automount2amd.in: new file, contributed a in 1993 by
- Mike Walker <mike@tab00.larc.nasa.gov>. Fixed to use addopts for
- any automount map options specified.
-
-1999-08-09 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s9
-
-1999-08-09 Erez Zadok <ezk@beetle.mcl.cs.columbia.edu>
-
- * amd/amfs_auto.c (DOT_DOT_COOKIE): set the NFS cookie of '..' to
- 1.
- (amfs_auto_readdir): use DOT_DOT_COOKIE instead of (u_int)~0.
- (amfs_auto_readdir_browsable): use DOT_DOT_COOKIE instead of
- (u_int)~0.
-
- * amd/mapc.c (make_entry_chain): NFS cookies should be
- monotonically increasing, because Linux 2.3 expects that, even
- though it is not in the spec (RFC-1094) for NFS V2.
-
-1999-08-06 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_lib_funcs.m4: removed unused macro.
-
- * aux/macros/linux_headers.m4: new macro to ensure that linux
- kernel headers match running kernel version.
-
- * aux/acconfig.h: define HOST_HEADER_VERSION so we can check if
- amd is configured on linux hosts that run one kernel but have
- headers for a different version.
-
- * amd/info_nis.c (nis_isup, nis_search, nis_init): fixes for the
- logic which uses nis_isup and has_yp_order. Make sure it is used
- correctly , esp. for NIS+ in NIS-compatibility mode. Bug fix from
- Peter Breitenlohner <peb@mppmu.mpg.de>.
-
- * include/am_defs.h: fix conflicts on linux 2.2 systems with older
- libc5. Bug fix from Peter Breitenlohner <peb@mppmu.mpg.de>.
-
- * scripts/lostaltmail.in: use sockaddr_in(), not pack() to
- correctly fill in a struct sockaddr_in. On Solaris x86 hosts,
- using pack() results in byte-misaligned values.
-
-1999-08-02 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mtab/mtab_aix.c (mnt_dup): add support for nfs3
- mounting, as per Dale Talcott <aeh@quest.cc.purdue.edu>. Also use
- better macros for case statement.
-
- * conf/nfs_prot/nfs_prot_sunos5_7.h: don't include ldap structures
- unless ldap is actually available.
-
- * use updated config.guess and config.sub. Use newer automake
- that fixes problems with distributing optional libamu files
- (clnt_sperrno.c, hasmntopt.c, strcasecmp.c, strdup.c, strstr.c,
- and ualarm.c)
-
-1999-07-19 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor port i386-unknown-openbsd2.5
-
-1999-07-17 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor ports to freebsdelf 3.[0-2] and 4.0 completed
-
- * aux/macros/check_nfs_prot_headers.m4: support freebsdelf
-
- * aux/macros/check_nfs_socket_connection.m4: support freebsdelf
-
-1999-06-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s8
-
-1999-06-23 Erez Zadok <ezk@beetle.mcl.cs.columbia.edu>
-
- * include/am_defs.h: avoid various header conflicts on
- RedHat/Linux 6.0 and kernels 2.2.10 or newer.
-
- * aux/configure.in: look for <db1/ndbm.h> (RedHat/Linux 6.0 and
- kernel 2.2.10)
-
- * amd/amfs_program.c (amfs_program_exec): make sure logfp is
- initialized dynamically to stderr if needed.
-
- * libamu/xutil.c (dplog): make sure logfp is initialized
- dynamically to stderr if needed.
- (plog): ditto.
-
- * amd/amfs_program.c (amfs_program_exec): set logfp to stderr if
- not initialized.
-
- * libamu/xutil.c: don't initialize logfp statically to stderr,
- because on RedHat/Linux 6.0 (kernel 2.2.10) stderr can no longer
- be manipulated like a variable.
-
- * include/am_defs.h: avoid more conflicts between <linux/fs.h> and
- <sys/mount.h> on 2.2 linux kernels.
- include <db1/ndbm.h> as needed (RedHat/Linux 6.0)
-
-1999-04-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * all Makefile.am: use AMU_NFS_PROT_HEADER (not *_HEADERS)
-
- * aux/macros/check_nfs_prot_headers.m4 (AMU_NFS_PROT_HEADER):
- renamed AC_SUBST name from *_HEADERS to *_HEADER so that automake
- won't attempt to add it to the header files to distribute.
-
-1999-04-19 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/GNUmakefile: invoke aclocal with new --altdir flag.
-
-1999-04-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new port: i386-unknown-netbsd1.4 (ALPHA)
-
- * aux/macros/check_field.m4: no need to include <cdfs/cdfsmount.h>
- and <isofs/cd9660/cd9660_mount.h> because they are also included
- from MOUNT_HEADERS. Causes multiple inclusion of unprotected
- headers on netbsd-1.4_ALPHA.
-
-1999-04-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/extern_sys_errlist.m4 (pattern): netbsd-1.4_ALPHA's
- sys_errlist extern doesn't end with [].
-
- * aux/macros/check_nfs_prot_headers.m4: netbsd 1.4 support.
-
-1999-04-11 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * newer automake wants texinfo.tex to be in aux/ not doc/
-
-1999-03-30 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/conf_parse.y: alloca support.
-
- * fsinfo/fsi_gram.y: alloca support.
-
- * libamu/Makefile.am (libamu_la_LIBADD): compile alloca.o if
- needed.
-
- * aux/configure.in: test for alloca support. Needed because bison
- generates parsers that use alloca, and hpux9 does have alloca and
- its /bin/cc doesn't support it builtin (the way gcc does).
-
- * libamu/alloca.c: new file, needed on hpux9 with /bin/cc. Taken
- verbatim from bison-1.25.
-
- * include/am_defs.h: fixed typo #errir -> #error
-
- * released snapshot am-utils-6.0.1s7
-
- * README.y2k: more information about am-utils' compatibility, from
- Paul Balyoz <pbalyoz@sedona.ch.intel.com>.
-
- * scripts/lostaltmail.in (Splice_in_resent_headers): ensure Y2K
- compliant format. Patch from Paul Balyoz
- <pbalyoz@sedona.ch.intel.com>
-
- * doc/am-utils.texi (Supported Platforms): hpux10.20 could have
- nfs v.3 support (with some vendor patches), but it is turned off.
-
- * aux/macros/os_cflags.m4: use ansi compiler options on hpux.
-
- * conf/nfs_prot/nfs_prot_hpux.h: Turn off NFS V.3 support to avoid
- confusing am-utils. 10.20 with some patches has incomplete
- support. Patch from Jon Peatfield
- <J.S.Peatfield@damtp.cam.ac.uk>.
-
-1999-03-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor port i386-pc-bsdi4.0.1
-
-1999-03-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Supported Platforms): add forgotten listing
- for powerpc-linux.
-
-1999-03-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/amd.conf.5: fix typo. From Jeffrey C Honig
- <jch@BSDI.COM>.
-
- * doc/am-utils.texi: document iso9660 options norrip, gens, and
- extatt.
- (opts Option): documented dumbtimr and noauto options. From
- Jeffrey C Honig <jch@BSDI.COM>.
-
- * include/am_compat.h: define default strings for options norrip,
- gens, and extatt.
-
- * amd/ops_cdfs.c (mount_cdfs): support options norrip, gens, and
- extatt.
-
- * aux/macros/mount_headers.m4: also include
- <isofs/cd9660/cd9660_mount.h> as needed.
-
- * aux/configure.in: check for isofs mount options for bsdi4:
- norrip, gens, and extatt. Reported by Jeffrey C Honig
- <jch@BSDI.COM>.
-
- * aux/macros/check_mnt2_cdfs_opt.m4: check for ISOFSMNT_* flags
- (bsdi4).
-
-1999-03-17 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_freebsd3.h: ditto.
-
- * conf/nfs_prot/nfs_prot_bsdi3.h: include <ufs/ufs/ufsmount.h>,
- for bsdi4, as per Jeffrey C Honig <jch@BSDI.COM>.
-
-1999-03-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * get latest copies of config.guess, config.sub, ltconfig, and
- ltmain.sh from libtool-1.2f.
-
- * all Makefile.am: don't use continuation lines (using \) for
- short lists of files.
-
- * libamu/Makefile.am (DISTCLEANFILES): make distclean should
- remove mountutil.c, mtabutil.c, transputil.c, and umount_fs.c.
- Reported by Jeffrey C Honig <jch@BSDI.COM>.
-
- * fixmount/Makefile.am (DISTCLEANFILES): make distclean should
- remove checkmount.c. Reported by Jeffrey C Honig <jch@BSDI.COM>.
-
- * Makefile.am (DISTCLEANFILES): make distclean should remove
- amu_nfs_prot.h, config.cache.old, and dbgcf.h. Reported by
- Jeffrey C Honig <jch@BSDI.COM>.
-
-1999-03-13 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s6
-
-1999-03-12 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * INSTALL: document freebsdelf.
-
- * doc/am-utils.texi (Supported Platforms): document freebsdelf.
-
-1999-03-08 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new ports: i386-unknown-freebsdelf3.1 and
- i386-unknown-freebsdelf4.0
-
- * aux/macros/check_nfs_prot_headers.m4: freebsd4 support.
-
- * aux/macros/check_nfs_socket_connection.m4: freebsd4 support.
-
- * aux/macros/check_nfs_fh_dref.m4: freebsd4 support.
-
- * amd/opts.c (eval_opts): changed log level of "executing
- negated..." message from USER to INFO, as per Guntram Wolski
- <gwolsk@sei.com>.
-
-1999-02-17 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * */Makefile.am (LDADD): force linking against an installed
- libamu.{a,so}.
-
- * doc/am-utils.texi (addopts Option): document remopts interaction
- with addopts.
-
- * amd/am_ops.c (ops_match): if addopts are specified, apply them
- to the value of remopts as well as opts.
-
- * amd/ops_nfs.c (mount_nfs_fh): tell users when remopts are used.
-
-1999-02-05 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s5
-
- * conf/mount/mount_linux.c (mount_linux): set default nfs_args
- options for ac{reg,dir}{min,man} as per the mount-2.8a package,
- but only if noac option was not used.
-
-1999-02-05 Erez Zadok <ezk@retro.cs.columbia.edu>
-
- * conf/mount/mount_linux.c (mount_linux): print nfs_args again
- since it was updated.
- (mount_linux): use 4KB for NFS rsize/wsize on 2.1.0 linux kernels
- and newer. Bug was found by Neil Conway
- <nconway.list@ukaea.org.uk>
-
-1999-02-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s4
-
-1999-02-03 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amq/amq.c (main): don't list -M as a valid amq option unless
- configure'd with --enable-amq-mount.
-
-Wed Feb 3 18:11:18 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/nfs_start.c (amd_use_autofs): Define.
- (mount_automounter): Create autofs service listener only if
- necessary to avoid unnecessary clashes with e.g. automountd.
-
- * amd/amd.h (amd_use_autofs): Declare.
-
- * amd/conf.c (gopt_mount_type): Set amd_use_autofs.
- (ropt_mount_type): Likewise.
-
-1999-02-02 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_mnt2_nfs_opt.m4:: ditto
-
- * aux/macros/check_mnt2_cdfs_opt.m4: ditto
-
- * aux/macros/check_mnt2_gen_opt.m4: ditto
-
- * aux/macros/check_mnttab_opt.m4: new macro in this file to loop
- over AC_CHECK_MNTTAB_OPT. Reduces size of configure script a lot.
-
- * conf/nfs_prot/nfs_prot_netbsd1_3.h: include nfs/rpcv2.h,
- nfs/nfs.h and nfs/nfsmount.h if they exist. Patch from
- christos@zoulas.com (Christos Zoulas).
-
- * amd/info_hesiod.c: some forward declarations. Patch from
- christos@zoulas.com (Christos Zoulas).
-
-1999-01-28 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (compute_nfs_args): don't turn on/off noconn
- option if it was already in that state. Patch from David
- Wolfskill <dhw@whistle.com>.
-
-1999-01-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: automake nowadays supports LTLIBOBJS (but not
- LTALLOCA yet). Substitute value of LIBTOOL_DEPS for libtool
- rebuild make rules.
-
- * Makefile.am: new rules to remake libtool (maintainers only)
-
- * amd/amfs_toplvl.c (mount_amfs_toplvl): print generic mount flags
- if -D trace was used.
-
-1999-01-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * buildall: all if statements should have an else clause because
- of Ultrix's /bin/sh.
-
-1999-01-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amq/amq.c: removed dummy variables.
-
- * amq/pawd.c: removed dummy variable.s
-
- * fixmount/fixmount.c (usage): removed dummy variables.
-
- * fsinfo/fsinfo.c: removed dummy variables.
-
- * hlfsd/hlfsd.c: removed dummy variables.
-
- * wire-test/wire-test.c: removed dummy variables.
-
- * mk-amd-map/mk-amd-map.c: removed dummy variables.
-
- * doc/texinfo.tex: updates from GNU mirror.
-
- * aux/GNUmakefile (../doc/texinfo.tex): new rule to update
- doc/texinfo.tex from GNU mirror.
-
- * released snapshot am-utils-6.0.1s3
-
- * Makefile.am (install-snapshot): better snapshot and new
- install-snapshot and test-snapshot rules (maintainer).
-
- * amd/info_ldap.c (amu_ldap_init): don't run STREQ if one of the
- args may be NULL.
- Some dlog() entries were not enclosed in #ifdef DEBUG. Fix from
- Bill Paul <wpaul@ctr.columbia.edu>
-
-1999-01-13 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * check for experimental generic 'ignore' mount flag on freebsd3.
-
- * Update library -version-info to 3:0:1 (will result in 2.1.0 .so
- version, which is backwards compatible with older versions.) Only
- one new interface was added to libamu.
-
- * amd/amfs_toplvl.c (mount_amfs_toplvl): add generic mount flags
- that are specific to automounter mounts.
-
- * aux/configure.in: update libamu.so age and revision since a new
- interface was added to libamu/mount_fs.c
- (compute_automounter_mount_flags).
-
- * libamu/mount_fs.c (compute_automounter_mount_flags): new
- function to compute generic mount flags that are specific to mount
- points only.
-
- * aux/{configure.in,acconfig.h}: add support for generic mount
- entry ignore option.
-
- * released snapshot am-utils-6.0.1s2
-
- * amd/info_ldap.c (get_ldap_timestamp): dlog format fixes.
-
- * libamu/mount_fs.c (print_nfs_args): solaris 2.7 changed format
- of knc_semantics from u_long to u_int.
-
- * aux/macros/check_mount_style.m4: freebsd3 no longer needs a
- special mount helper.
-
-1999-01-12 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_nfs_prot_headers.m4 (AMU_NFS_PROT_HEADERS):
- amu_nfs_conf.h should always be found in $top_builddir.
-
-Tue Jan 12 00:05:42 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/nfs_prot/nfs_prot_sunos5_7.h (MNTTAB_TYPE_AUTOFS): Undefine
- to avoid wrong reports from show_fstypes.
-
- * conf/nfs_prot/nfs_prot_irix5.h (MNTTAB_TYPE_XFS): Likewise.
-
- * conf/nfs_prot/nfs_prot_hpux11.h (MNTTAB_TYPE_NFS3): Likewise.
-
-Tue Jan 12 00:05:42 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * BUGS (mips-dec-ultrix4.3): Update Ultrix caveats.
-
-Tue Jan 12 00:05:42 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * hlfsd/homedir.c (delay): Cast child to long, adapt format.
- (hlfsd_getpwent): Likewise for pw_uid.
-
- * amd/info_nis.c (nis_init): Cast order to unsigned long, adapt
- format.
-
- * conf/transp/transp_tli.c (amu_clnt_create_best_vers): Cast
- tv_sec to int to match format.
- (get_nfs_version): Cast nfs_version, NFS_VERSION to int to match
- formats.
-
- * amd/amfs_program.c (amfs_program_exec): Cast ptr difference to
- long, adapt format.
-
- * include/am_defs.h: Handle __attribute__ if available. From
- GNU fileutils 4.0 lib/errors.h.
-
-Mon Jan 11 13:46:44 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * libamu/mount_fs.c (print_nfs_args): Cast sizeof() to int to
- match format.
-
- * hlfsd/stubs.c (nfsproc_getattr_2_svc): Cast uid, gid to long,
- adapt format.
- (nfsproc_lookup_2_svc): Likewise.
- (nfsproc_readlink_2_svc): Likewise for userid, groupid.
-
- * hlfsd/nfs_prot_svc.c (nfs_program_2): Cast args to int to match
- format.
-
- * hlfsd/homedir.c (homedir): Cast uid, child to long, adapt
- format.
-
- * amd/info_hesiod.c (hesiod_search): Cast m, pval, tp to unsigned
- long, adapt format.
-
- * amd/ops_nfs.c (find_nfs_fhandle_cache): Cast fh_wchan to
- unsigned long, adapt format.
- (got_nfs_fh): Likewise.
- (prime_nfs_fhandle_cache): Cast fh_nfs_version to int to match
- format.
- (call_mountd): Likewise, mnt_version also.
- (mount_nfs_fh): Likewise.
-
- * amd/ops_autofs.c (autofs_program_1): Cast args to int to match
- format.
- (autofs_unmount_1_svc): Cast ur->devid, ur_rdevid, ur->next to
- unsigned long, adapt formats.
- (autofs_bgmount): Cast opt_fs to unsigned to, adapt format.
- (autofs_bgmount): Use long format to match arg.
- (autofs_lookuppn): Removed superfluous arg.
-
- * amd/srvr_nfs.c (start_ping): Cast nfs_version to int to match
- format.
- (got_portmap): Likewise for port.
- (recompute_portmap): Likewise for fs->fs_version, mnt_version.
- (find_nfs_srvr): Likewise for nfs_version.
-
- * amd/sched.c (sched_task): Cast wchan to unsigned long, adapt
- format.
-
- * amd/nfs_start.c (checkup): Cast ptr difference to long, next_mem
- to unsigned long, adapt format.
- Cast tvv.tv_sec to int to match format.
-
- * amd/nfs_prot_svc.c (nfs_program_2): Cast args to int to match
- format.
-
- * amd/map.c (root_fh): Cast pid to long, adapt format.
- (timeout_mp): Cast time_t to long, adapt format.
-
- * amd/clock.c (reschedule_timeouts): Use long format, cast time_t
- arg.
-
- * amd/amfs_host.c (fetch_fhandle): Cast nfs_version to int to
- match format.
- (amfs_host_fmount): Likewise.
- (amfs_host_umounted): Likewise. Removed superfluous arg.
-
- * amd/amfs_auto.c (amfs_auto_bgmount): Cast pointer to unsigned
- long, adapt format.
- (amfs_auto_bgmount): Use long format, cast time_t arg.
- (amfs_auto_lookuppn): Removed superfluous arg.
-
- * amd/amd.c (main): Cast geteuid() result to long, adapt format.
-
- * conf/transp/transp_sockets.c (get_nfs_version): Cast nfs_version
- to int to match format.
-
- * include/am_utils.h: Declare plog, dplog as printf-like.
-
- * conf/mount/mount_irix6.c (mount_irix): Print type as char *.
-
-Mon Jan 11 13:46:44 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * amd/info_hesiod.c (hesiod_isup): New function.
- * amd/mapc.c (maptypes): Add it.
-
-1999-01-10 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0.1s1
-
-1999-01-09 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * ALL: bump copyright year to 1999.
-
-Fri Jan 8 15:24:15 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * aux/macros/check_mtype_type.m4: Ultrix uses an int mount type,
- too.
-
- * aux/macros/check_mtype_printf_type.m4: Adapt corresponding
- printf type.
-
-Fri Jan 8 15:24:15 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * aux/acconfig.h: Removed HAVE_AM_FS_AUTOFS, unused.
-
- * conf/nfs_prot/nfs_prot_irix6.h: Likewise.
-
- * conf/nfs_prot/nfs_prot_sunos5_6.h: Likewise.
-
- * conf/nfs_prot/nfs_prot_sunos5_7.h: Likewise.
-
- * Makefile.am (EXTRA_DIST_DIRS): Removed, not needed by current
- automake.
-
-Thu Jan 7 02:55:18 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * aux/configure.in (AM_PROG_YACC): Replaced by AC_PROG_YACC, not
- in current automake.
-
-Thu Jan 7 02:55:18 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * doc/am-utils.texi: Added some missing inter-punctation after
- @xref, or use @pxref/@ref as appropriate. Spotted by makeinfo
- from texinfo 3.12b.
-
-1999-01-07 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/texinfo.tex: updated off of latest GNU mirror.
-
-1999-01-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Supported Platforms): update platforms that
- support NFS v.3. Nicer postscript printing on double-sided pages.
-
- * amd/info_hesiod.c: add extern definition for hesiod_init()
-
-1999-01-01 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0 ***
- *******************************************************************
-
-1998-12-28 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos5_7.h: support ldap in solaris 2.7.
-
-1998-12-27 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_bsdi3.h: don't use reserved ports on
- bsdi4 for NFS V3/nfs mounts.
-
-1998-12-26 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * using latest libtool (1.2e + patches), now supporting shared
- libraries on many more systems. Also using latest autoconf and
- automake (unreleased GNU CVS'd versions.)
-
- * minor new ports: hppa2.0w-hp-hpux11.00,
- i386-unknown-netbsd1.3.3, mips-sgi-irix6.5.
-
- * fsinfo/fsinfo.h (yywrap): define it for systems (osf4) that
- have /usr/bin/flex but not libfl.
-
-1998-12-24 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * lots of code cleanup, to make sure libamu.so does not use
- undefined symbols. Some system's shared libraries cannot handle
- that.
-
-1998-12-23 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_defs.h: only defined seteuid extern if function also
- exists and is not superceded by setresuid (hpux).
-
- * amd/ops_autofs.c (autofs_bgmount, autofs_lookuppn): put explicit
- braces to avoid confusion with nested if-then-else clauses.
-
- * aux/config.{sub,status}, aux/{ltmain.sh,ltconfig,mkinstalldirs:
- updated from latest versions.
-
-1998-12-22 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new port: i386-pc-bsdi4.0
-
- * conf/nfs_prot/nfs_prot_bsdi3.h: add missing hesiod header
- definitions for bsdi4.
-
- * {amd,fsinfo}/Makefile.am: force path to .y/.l files, because
- some make programs (bsdi4) do not support VPATH correctly.
-
-1998-12-16 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_aix.c: minor code cleanup
-
- * aux/configure.in: check for extern definition to xdr_groups.
-
-1998-12-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new port: powerpc-ibm-aix4.3.1.0
-
- * aux/macros/*.m4: updates for aix 4.3
-
-1998-12-14 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * minor new port: i386-unknown-openbsd2.4
-
- * aux/configure.in: don't check for xfs on openbsd because
- openbsd-2.4 introduces a new file system named xfs, but different
- than Irix's XFS. Sigh.
-
- * minor new port: i386-unknown-freebsd2.2.8
-
-1998-12-03 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/amfs_nfsl.c (amfs_nfsl_ffserver): use case insensitive host
- name match. Bug fix from Douglas K. Rand" <rand@aero.und.edu>.
-
-1998-11-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-amd.in: wait4amd2die runs in the stop action, to
- avoid race conditions when shutting down systems running amd.
-
- * Makefile.am: add a dist-hook to change modes of the directories
- in the tar file so they are not world writable.
-
- * conf/nfs_prot/nfs_prot_freebsd3.h: turned on NFSv3 support,
- since it is now finally defined in the header files and
- (hopefully) stable.
-
- * amd/srvr_nfs.c (find_nfs_srvr): allow overriding if nfsv2 option
- is specified in mount options. freebsd patches from David
- O'Brien.
-
- * amq/amq.c (main), fixmount/fixmount.c (main), hlfsd/hlfsd.c
- (main), fsinfo/fsinfo.c (fsi_get_args), hlfsd/hlfsd.c (main),
- amd/get_args.c (get_args): posix: use -1 to check for return from
- getopt() (not EOF), as per posix.
-
- * amd/amq_subr.c (xdr_amq_mount_tree_node): patches from "David
- O'Brien" <obrien@NUXI.com>, from the FreeBSD source tree. Use
- real variable whose pointer is on the stack for decoding a long
- int.
-
-1998-11-11 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-{amd,hlfsd}.in: include comments useful for redhat's
- chkconfig utility.
-
-1998-11-10 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0b2s3
-
- * conf/transp/transp_sockets.c (create_nfs_service): remove C++
- style comments.
-
-1998-11-04 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0b2s2
-
- * created CVS package
-
- * amd/nfs_subr.c (nfsproc_lookup_2_svc): try to avoid a race
- condition between unmounting and re-mounting an entry, by
- increasing the ttl of a looked up entry before unmounting it.
- Patch from Mike Mitchell <mcm@unx.sas.com>.
-
- * All files: spell comments and strings.
-
-1998-11-03 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: look for yp_all in libnsl only if yp_all not
- already found elsewhere (in libc or other default libraries).
- This is so RedHat 5.1 systems could find yp functions in libnsl,
- but also so AIX 4.2.1 will NOT include libnsl, because the latter
- has broken nis functionality that also exists and works ok in libc.
-
-1998-10-29 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/amd.c (main): bug fix: swapped arguments to kill(2). Fix
- from Danny Rathjens <dkr@cs.fiu.edu>.
-
-1998-10-28 Erez Zadok <ezk@spruce.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0b2s1
-
-1998-10-27 Erez Zadok <ezk@spruce.mcl.cs.columbia.edu>
-
- * aux/macros/*.m4: support bsdi4 as bsdi3.
-
- * aux/macros/os_ldflags.m4: enable detection of LDAP on solaris
- 2.7 (libraries located in /usr/lib/fn). This is off until Sun
- includes LDAP header information.
-
-1998-10-20 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0b1 ***
- *******************************************************************
-
-1998-10-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * mk-amd-map/mk-amd-map.c (main): use perror not strerror.
- (main): set return type to int if no ndbm maps.
-
- * include/am_defs.h: avoid conflicts with <sys/mount.h> in 2.1
- kernels.
-
-1998-10-18 Erez Zadok <ezk@london.mcl.cs.columbia.edu>
-
- * A.i386-unknown-netbsd1.3.2/amu_nfs_prot.h: trim down and cleanup
- for netbsd 1.3.2.
-
-1998-10-17 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: check for yp_all in libnsl, b/c redhat 5.1
- systems put NIS functions there.
-
- * mk-amd-map/mk-amd-map.c: patch from "David O'Brien"
- <obrien@NUXI.com> merged in. Use POSIX -1 return code from
- getopt(), not EOF. Use .db extentions for systems that use it,
- instead of .{pag,dir}.
-
-1998-10-15 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * wire-test/wire-test.c, hlfsd/hlfsd.c, fixmount/fixmount.c,
- amd/amd.c (main): avoid overrunning hostname buffer. Bug fix from
- "David O'Brien" <obrien@NUXI.com>.
-
- * scripts/amd.conf.5: minor typo reported by "David O'Brien"
- <obrien@NUXI.com> in .TH section of man page.
-
- * amd/info_nis.c (am_yp_all): don't leak key-val entries. Patch
- from Thomas Richter <richter@chemie.fu-berlin.de>.
-
-1998-10-12 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Program Filesystem): minor typo fixed as per
- Andreas Stolcke <stolcke@speech.sri.com>.
-
- * minor new ports: sparc64-unknown-linux-gnu, i386-pc-solaris2.7,
- and sparc-sun-solaris2.7.
-
- * conf/mount/mount_freebsd3.c (mount_freebsd3): freebsd 3.0 is now
- a 4.4lite kernel, and somethings were removed, such as
- INITMOUNTNAMES.
-
- * amd/ops_autofs.c (autofs_lookuppn): don't leak memory while
- processing /defaults. Free temporary opts. Patch from
- dsr@mail.lns.cornell.edu (Daniel S. Riley)
-
- * amd/amfs_auto.c (amfs_auto_lookuppn): don't leak memory while
- processing /defaults. Free temporary opts. Patch from
- dsr@mail.lns.cornell.edu (Daniel S. Riley)
-
- * conf/mtab/mtab_osf.c (read_mtab): patch from
- dsr@mail.lns.cornell.edu (Daniel S. Riley) not to access
- uninitialized memory on Digital Unix.
-
-1998-10-09 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/{check_mtype_type,check_mtype_printf_type}.m4: most
- systems now use "char *" as their mount type.
-
-1998-10-08 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/conf.c (gopt_map_type, ropt_map_type): check if map type
- exists.
-
- * amd/mapc.c (mapc_type_exists): function to test if a map of
- certain type exists.
-
-1998-10-08 Erez Zadok <ezk@horatio.mcl.cs.columbia.edu>
-
- * aux/macros/{mount_headers,try_compile_anyfs,try_compile_nfs}.m4,
- include/am_defs.h: Avoid a conflict in definitions of ntohl/htonl
- in RH-5.1 sparc64 between <netinet/in.h> and
- <linux/byteorder/generic.h> (2.1 kernels).
-
-1998-09-28 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/func_bad_yp_all.m4 (ac_cv_func_yp_all_clean): RedHat
- 5.1 systems with glibc glibc-2.0.7-19 or below leak a UDP socket
- from yp_all().
-
-1998-09-25 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_linux.c (parse_opts): check for pcfs support
- only if autoconfigured.
-
-1998-09-18 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * Makefile.am (EXTRA_DIST): distribute README.yk2 file.
-
- * README.y2k: explain y2k compliance status of am-utils.
-
-1998-09-16 Erez Zadok <ezk@iguana.mcl.cs.columbia.edu>
-
- * amd/amfs_host.c (fetch_fhandle, amfs_host_fmount,
- amfs_host_umounted): clnt_sperrno() may return a const.
-
-Sat Aug 8 23:28:32 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: check for <nfs/nfsmount.h>, as per Christos
- Zoulas. Turned on checking for mount options: async, synchronous,
- deadthresh, leasterm, nqnfs, and readahead.
-
- * amd/info_nis.c: patch from christos@zoulas.com (Christos Zoulas)
- to include prototype definition for nis_isup().
-
-Sun Jul 19 18:50:10 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/stubs.c (getcreds): force sscanf arg to u_long.
-
-Tue Jul 14 20:34:25 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0a17s1
-
-Wed Jul 8 21:49:15 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/host_macros.m4: all x86 hosts should have $arch be
- i386, not i[456]86.
-
-Tue Jul 7 18:55:09 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/{mount_headers,try_compile_anyfs,try_compile_nfs}.m4,
- include/am_defs.h: include <linux/posix_types.h> before
- <linux/fs.h> because on redhat 5.1, there is a bug (misuse) of
- headers in <socketbits.h> (it defines _LINUX_TYPES_H instead of
- __KERNEL_STRICT_NAMES).
-
- * aux/configure.in: check for <linux/posix_types.h> because it is
- need for RedHat 5.1.
-
-Wed Jun 17 00:05:33 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/Makefile.am (EXTRA_DIST): have fixrmtab generated from
- .in as well, so it doesn't get removed by make clean.
-
-Tue Jun 16 22:00:15 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/{check_fs_mntent.m4, check_mnttab_type.m4,
- check_mount_type.m4}: redhat 5.1 puts some modules in
- /lib/modules/preferred/.
-
-Wed May 13 16:33:57 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_autofs.c (mount_autofs): cast pid to long.
-
-Tue Apr 28 15:12:36 1998 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/nfs_prot/nfs_prot/nfs_prot_irix6.h,
- conf/nfs_prot/nfs_prot_sunos5_6.h: Undef MNTTAB_TYPE_AUTOFS too to
- avoid amd/am_ops.c (show_fstypes) from erroneously claiming
- support.
-
-Fri Apr 24 23:02:11 1998 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * libamu/xutil.c (get_syslog_facility): Don't use LOG_DAEMON
- unconditionally, may be missing on Ultrix V4.3.
-
-Thu Apr 23 20:24:33 1998 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * conf/nfs_prot/nfs_prot_sunos5_4.h (MNTTYPE_CACHEFS): Define,
- missing from <sys/mntent.h>.
-
- * conf/mtab/mtab_ultrix.c: Need separate inclusion of <sys/fs_types.h>
- without KERNEL defined here.
-
- * aux/macros/mount_headers.m4: Need to include <ufs/ufs_mount.h>,
- <cdfs/cdfs_mount.h>, <cdfs/cdfsmount.h> so autoconfiguration of
- ufs_args_t, cdfs_args_t fields and cdfs mount options can succeed.
-
- * amd/ops_ufs.c (mount_ufs): Removed obsolete comment.
-
- * ChangeLog: Fixed confusing linebreaks from ChangeLog imports.
- Removed purely local (and obsolete) entry.
-
-Thu Apr 23 00:22:17 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a16 ***
- *******************************************************************
-
-Wed Apr 22 01:20:39 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_mount_style.m4: define freebsd3 mount style.
-
- * aux/macros/check_mount_trap.m4: new mount trap for freebsd3.
-
- * aux/macros/check_mtype_printf_type.m4,
- aux/macros/check_mtype_type.m4 (ac_cv_mtype_type,): freebsd3 (as
- of snapshot 3.0-980311-SNAP) uses char * types for mount(2), not
- integers, but I'll keep them as integers and do the mapping in
- conf/mount/mount_freebsd3.c
-
- * minor new port to i386-pc-bsdi3.1.
-
- * minor new port to i386-unknown-netbsd1.3.1.
-
- * amd/opts.c: new option addopts:=ARG, which smartly merges ARG
- options with whatever the /default ones for a key are. This
- allows adding or overriding /default options individual keys.
-
- * amd/am_ops.c (ops_match): strdup/malloc string assigned to
- opt_opts because it'll get free()'d upon next use.
- (merge_opts): new function to merge two sets of options.
- (ops_match): if addopts option exist, append and merge it to the
- current default options.
-
-Tue Apr 21 12:54:59 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * wire-test/wire-test.c (main): use dynamically allocated returned
- string with list of interfaces.
-
- * amd/get_args.c (get_version_string): allocate enough space for
- header version string and a list of network interfaces of any
- length.
-
- * libamu/wire.c (print_wires): return dynamically allocated string
- containing list of networks. Must be dynamic because some sites
- had potentially dozens of network interfaces. Patch from Matthew
- Crosby <mcrosby@ms.com> slightly modified.
-
-Mon Apr 20 00:37:20 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_irix5.h: underfine MNTTYPE_XFS because
- irix 5.3 does not have full header definitions for it.
-
- * fsinfo/fsi_lex.l (yywrap): define yywrap if needed, and
- undefined it when not needed (similar to amd/conf_tok.l)
-
- * hlfsd/hlfsd.h (ROOTID, SLINKID, INVALID): reduced maximum size
- of these to unsigned short (because uid_t on some linux systems is
- small).
-
- * released snapshot am-utils-6.0a16s10
-
- * doc/am-utils.texi (opts Option): documented resvport mount
- option.
-
-Sun Apr 19 18:17:03 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (-D-Option): document behavior of -D info and
- especially what it does to hesiod (turn on RES_DEBUG).
-
- * scripts/amd.conf.5: document info debugging option.
-
- * libamu/xutil.c (dbg_opt): parse info debugging option.
-
- * include/am_utils.h (D_INFO): define new trace option.
-
- * Makefile.am (EXTRA_DIST): include list of official mirrors in
- distribution.
-
- * libamu/wire.c (SIZE): in the simple case, just compute
- sizeof(struct ifreq).
-
-Sun Apr 19 16:30:35 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/amd.c (daemon_mode): set a temporary secure umask(0022)
- before writing log file and restore it afterwards. Patch from
- Donald Buczek <buczek@MPIMG-Berlin-Dahlem.MPG.DE>.
-
- * amd/get_args.c (get_args):
-
- * doc/am-utils.texi (-F Option), amd/amd.8: mention that amd.conf
- file specified by -F is always processed last.
-
- * amd/amd.c (daemon_mode): do not fclose(stdout) so that the fd
- won't be reused. Allows startup script to redirect stdout. Patch
- from Donald Buczek <buczek@MPIMG-Berlin-Dahlem.MPG.DE>.
-
- * libamu/xutil.c (switch_to_logfile): compare logfile name and
- syslog string with correct length. Patch from Donald Buczek
- <buczek@MPIMG-Berlin-Dahlem.MPG.DE>.
-
- * amd/restart.c (restart): correctly inherit existing NFS V.3
- mounts upon restart. Patch from Donald Buczek
- <buczek@MPIMG-Berlin-Dahlem.MPG.DE>.
-
-Sat Apr 18 19:01:19 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * using libtool 1.2 and automake 1.3 (with my patches).
-
- * aux/macros/opt_am_cflags.m4, */Makefile.in: rename AM_CFLAGS to
- AMU_CFLAGS to avoid conflicts with automake-1.3.
-
-Sun Apr 5 23:09:08 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * converted to using libtool-1.2.
-
-Tue Mar 10 16:52:09 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * fsinfo/fsi_analyze.c (fixup_required_mount_info): replaced silly
- for loop (ITER) which used to run only to initialize the variable
- dd once and then break; with a simple assignment.
-
- * hlfsd/hlfsd.h: cleanup so it compiles with Solaris
- /opt/SUNWspro/bin/cc, and use gid_t not int.
-
- * amd/mapc.c (mapc_sync): don't dereference pointer (so it
- compiles with Solaris /opt/SUNWspro/bin/cc)
-
-Sun Mar 8 15:54:22 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/config.{guess,sub}: used from gcc-2.8.1.
-
-Sat Mar 7 15:33:27 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0a16s9
-
- * INSTALL, doc/am-utils.texi (Supported Platforms): updated names
- based on new output of new config.guess.
-
- * aux/config.{sub,guess}: used newer versions from gcc-2.8.0.
-
- * amd/amd.8,doc/am-utils.texi: document correct usage of default
- /etc/amd.conf file.
-
- * fixmount/fixmount.c (inetresport,privsock): use some more
- portable code from amq/amq.c.
-
- * amd/get_args.c (get_args): use default /etc/amd.conf file only
- if no arguments had been passed to amd.
-
- * fixmount/fixmount.c (clnt_create_timeout): use tli/socket code
- ala amq/amq.c so that fixmount will work on both types of systems.
-
- * amq/amq.c (main): do no close tcp socket before running udp try,
- because we're not sure if it was opened at all.
-
- * mips-dec-ultrix* port merged in and cleaned up.
-
- * aux/configure.in: up minor shared library revision number, since
- it has changed enough.
-
- * hlfsd/hlfsd.c (main): don't check for overlay mount option here,
- as it is now done in compute_nfs_args(). Remove ultrix specific
- code also because it was moved to compute_nfs_args().
-
- * conf/mount/mount_svr4.c: removed DEBUG_MOUNT_SVR4 code, now that
- we have more generic code in print_nfs_args().
-
- * libamu/mount_fs.c (print_nfs_args): print maxlen of
- nfs_args.addr, and also syncaddr (which is mostly NULL). Print
- struct knetconfig from nfs_args->knconf.
-
- * aux/macros/mount_headers.m4 (define): do not check for ufs/cdfs
- headers here, but in try_compile_anyfs.m4.
-
- * aux/macros/type_ufs_args.m4: move test for struct ufs_specific
- (for ultrix) here from its own macro.
-
- * aux/macros/type_cdfs_args.m4: move test for struct iso_specific
- (for ultrix) here from its own macro.
-
- * amd/ops_nfs.c (mount_nfs_fh): no need to run code again checking
- for overlay mount option. Remove code which checks for overlay
- option, as it is now done in compute_nfs_args().
-
- * libamu/mount_fs.c (compute_mount_flags): move here code which
- checks for overlay mount option which was in amd/amfs_toplvl.c:
- mount_amfs_toplvl().
-
-Wed Feb 7 15:35:51 1998 Rainer Orth <ro@xayide.TechFak.Uni-Bielefeld.DE>
-
- * The following are Rainer's ChangeLog entries for his ultrix
- port, added manually. -Erez.
-
- * merged Ultrix port with am-utils 6.0 a16s5: amd/ops_afs.c
- (mount_toplvl) -> amd/amfs_toplvl.c (mount_amfs_toplvl)
-
- * include/am_defs.h: include cdfs specific mount headers
- avoid duplication definition of gt_names[] in <sys/fs_types.h> (Ultrix)
-
- * include/am_compat.h: define several mount options corresponding
- to mount flags: pgthresh, hard (nfs), defperm, nodefperm,
- noversion, rrip (cdfs), nocache, quota, sync (generic) removed
- duplicate MNTTAB_OPT_RO definition
-
- * aux/macros/try_compile_anyfs.m4: include Ultrix specific
- ufs/cdfs mount headers
-
- * aux/macros/mount_headers.m4: include several Ultrix/Digital UNIX
- specific mount headers
-
- * aux/macros/check_{fs_mntent, mount_type}.m4: check for GT_*
- mount types in mount headers (Ultrix)
-
- * aux/configure.in: Ultrix/Digital UNIX specific checks: new
- headers, mount structures and fields, filesystem and mount types,
- mount flags
-
- * aux/acconfig.h: placeholders for new mount options: quota
- (generic), ro (nfs), defperm, nodefperm, noversion, rrip (cdfs)
- cdfs, nfs, ufs mount structure fields new ufs, cdfs mount
- structures
-
- * amd/ops_ufs.c (mount_ufs): Ultrix stores generic mount flags in
- ufs_args.ufs_flags and has ufs specific pgthresh option
-
- * amd/ops_cdfs.c (mount_cdfs): handle Ultrix/Digital UNIX specific
- CDFS mount flags and options
-
- * amd/ops_afs.c (mount_toplvl), amd/ops_nfs.c (mount_nfs_fh),
- hlfsd/hlfsd.c (main): store generic mount flags in
- nfs_args.gfs_flags, handle separate NFS ro flag
-
- * aux/macros/{check_mnt2_cdfs_opt, struct_iso_specific,
- struct_ufs_specific}.m4: new files; check for Ultrix specific
- mount structures
-
- * conf/trap/trap_ultrix.h: arg 3 to mount(2) is rwflag
-
- * aux/macros/type_auth_create_gidlist.m4 (ultrix*):
- AUTH_CREATE_GIDLIST_TYPE is int (not short == gid_t) from a
- comment in <rpc/auth.h>
-
- * include/am_defs.h: #define KERNEL to avoid definition of
- gt_names[] conf/mtab/mtab_ultrix.c: #include <sys/fs_types> before
- <config.h> to force single definition here
-
- * libamu/mount_fs.c (compute_nfs_args): Ultrix support for
- nfs_args.gfs_flags moved to callers store mount options in
- nap->optstr
-
- * include/am_defs.h: fix _am_mntent mnt_{type, opts} field
- descriptions
-
- * aux/macros/mount_headers.m4, aux/macros/try_compile_nfs.m4:
- include <rpc/rpc.h> before AMU_NFS_PROTOCOL_HEADER for svc_req
- definition in prototypes
-
- * aux/macros/mount_headers.m4: include <sys/errno.h> before
- AMU_NFS_PROTOCOL_HEADER: <nfs/nfs.h> needs it for NFSERR_*
- definitions
-
- * conf/nfs_prot/nfs_prot_ultrix.h: new file
-
- * aux/macros/check_nfs_prot_headers.m4: use nfs_prot_ultrix.h
-
- * aux/macros/mount_headers.m4, aux/macros/try_compile_nfs.m4,
- aux/macros/try_compile_rpc.m4, include/am_defs.h: avoid multiple
- inclusion of <rpc/xdr.h>
-
-Sat Mar 7 13:56:05 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: save state of config.cache and confdefs.h
- (as dbgcf.h) at various points of the configure.
-
- * aux/macros/save_state.m4: new macro to save state of configure,
- esp. useful in long ones. Saves confdefs.h and write $ac_cv_*
- cache variables that are known so far.
-
- * released snapshot am-utils-6.0a16s8
-
-1998-03-06 Erez Zadok <ezk@mercer.psl.cs.columbia.edu>
-
- * fsinfo/fsi_lex.l,amd/conf_tok.l: define ECHO after undefining
- it, but only for flex.
-
-Fri Mar 6 17:23:17 1998 Erez Zadok <ezk@chestnut.mcl.cs.columbia.edu>
-
- * hlfsd/homedir.c (plt_print): change pathname of hlfsd dump file
- to /usr/tmp/hlfsd.dump.XXXXXX, and use a safe method (if possible)
- to write the dump file.
-
- * doc/am-utils.texi,amd/opts.c: rename all references to nomadic
- functions to boolean functions, which is what they really are.
-
- * aux/configure.in: don't look for strcasecmp in libucb at all,
- but rather complete it from libamu/strcasecmp.c as needed.
-
-Fri Mar 6 03:29:20 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_osf4.h: avoid conflicts with Irix's EFS.
-
- * libamu/wire.c (getwire): fix for 0.0.0.0 loopback on SunOS 3.X
- which defines IFF_ROUTE instead of IFF_LOOPBACK. Patch from Tom
- Schmidt <tschmidt@micron.com>.
-
- * released snapshot am-utils-6.0a16s7
-
- * conf/nfs_prot/nfs_prot_hpux11.h: a first working port of amd to
- hppa1.0-hp-hpux11.00.tgz.
-
-Thu Mar 5 21:59:03 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * converted all sources to use mntent field names, and map mnttab
- field names to mntent's.
-
- * include/am_defs.h (mnt_special): map struct mnttab field names
- to struct mntent field names.
-
- * aux/macros/check_mount_trap.m4: hpux11's mount trap style is
- identical to svr4/solaris2.
-
- * aux/macros/check_mount_style.m4: hpux11's mount style is
- identical to svr4/solaris2.
-
- * aux/macros/check_network_transport_type.m4: hpux11 is a TLI
- system!
-
- * aux/macros/check_nfs_sa_dref.m4: hpux11's NFS host address
- dereferencing style is same as svr4.
-
- * aux/macros/check_nfs_fh_dref.m4: hpux11's NFS file fh
- dereferencing style is same as svr4.
-
- * conf/transp/transp_tli.c (create_nfs_service): if failed to
- getnetconfigent() of ticlts, then try udp (hpux11).
-
- * conf/nfs_prot/nfs_prot_hpux11.h: added correct definitions for
- struct nfs_args, nfs_fh, and NFSMNT_* flags, taken from solaris
- 2.5.1 (HP used them).
-
- * amd/rpc_fwd.c (fwd_init): don't use O_NDELAY for t_open()
- because hpux11 doesn't like it. if t_open failed, print error
- based on t_errlist, not sys_errlist.
-
-Wed Mar 4 22:01:55 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi: lots of documentation fixes from Rainer Orth
- <ro@TechFak.Uni-Bielefeld.DE>.
-
-Sat Feb 28 22:16:35 1998 Erez Zadok <ezk@kosh.cs.columbia.edu>
-
- * fsinfo/fsi_lex.l: undefine ECHO again, so it doesn't get used
- later.
-
- * include/am_defs.h: defined the extern for ualarm() if it isn't
- found, regardless if the function isn't found in standard
- libraries, because otherwise libamu will include it.
-
-1998-02-28 Erez Zadok (per Ron Snyder) <ezk@short.cvo.roguewave.com>
-
- * initial port to hpux-11 completed. Compiles cleanly, but
- probably does not work, because of missing NFS V.2/3 headers.
-
- * amd/conf_tok.l: cast yytext to char* when passed to strlen and
- strdup, for hpux-11's ansi-cc compiler.
-
- * include/am_utils.h: renamed all xfree() to XFREE() to avoid
- conflict with hpux-11's system headers. Also move (voidp) cast
- from sources to inside the macro itself.
-
-Sat Feb 28 13:44:21 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0a16s6
-
- * amd/info_nis.c (nis_isup): new function to test if NIS is up
- without hanging amd. Used to ensure that amd does not clear the
- maps when the expiration period arrived, if the service is down.
- Otherwise it would be left with empty maps. It is better to stay
- with possibly old information than none at all.
-
- * amd/mapc.c (mapc_sync): check to see if map service is up.
-
-Tue Feb 24 02:19:42 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_lib2.m4 (AC_CHECK_LIB2): fix macro so it
- includes auxiliary library only if needed.
-
-1998-02-22 Erez Zadok <ezk@mercer.psl.cs.columbia.edu>
-
- * amd/conf_tok.l: undefine ECHO again, so it doesn't get used
- later.
-
-Sun Feb 22 01:41:08 1998 Erez Zadok <ezk@zen.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_osf2.h: port to alpha-dec-osf2.1
- completed.
-
- * conf/mtab/mtab_osf.c (mnt_dup): not all OSF have NFS3.
-
-Sat Feb 21 19:45:48 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Network Host Filesystem): correct example for
- type:=host map.
-
- * aux/macros/os_cflags.m4: only osf4 should compile with
- -D_SOCKADDR_LEN.
-
- * aux/macros/check_nfs_prot_headers.m4: distinguish between OSF2
- and OSF4.
-
- * BUGS: include a new file listing known bugs.
-
-Sat Feb 21 03:50:48 1998 Erez Zadok <ezk@mercer.psl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_linux.h: turn DES off on all linux
- versions.
-
- * aux/macros/type_recvfrom_fromlen.m4: linux alpha should use
- size_t for recvfrom fromlen arg.
-
-Sat Feb 21 03:33:59 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-hlfsd.in: turn -D fork so primary process never
- hangs.
-
-Sat Feb 21 02:45:51 1998 Erez Zadok <ezk@mercer.psl.cs.columbia.edu>
-
- * include/am_defs.h: don't include <sys/stat.h> and
- <linux/stat.h>, just remaining definitions in <statbuf.h>
-
-Thu Jan 29 00:44:28 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0a16s5
-
- * conf/mount/mount_irix6.c (mount_irix): pass {u,e,x}fs_args to
- mount(2).
-
- * check for <sys/fs/xfs_clnt.h> and include it when needed.
-
- * conf/mount/{mount_irix5.c,mount_irix6.c} (mount_irix): recognize
- efs and xfs separately from "ufs".
-
- * amd/{ops_xfs.c,ops_efs.c}: new support for irix xfs/efs.
-
- * aux/configure.in: look for irix efs and xfs file systems.
-
- * scripts/amd.conf.5: new unmount_on_exit option documented.
-
- * doc/am-utils.texi (unmount_on_exit): new option documented.
-
- * amd/conf.c (gopt_unmount_on_exit): new function to handle new
- amd.conf option.
-
- * amd/map.c (umount_exported): if global amd.conf flag
- unmount_on_exit is on, then try to unmount all mounted (or
- restartable) file systems.
-
- * amd/amd.c: if print_pid option is on, then normally print it to
- stdout. If also pid_file is specified, then print the process ID
- into that file.
-
- * amd/get_args.c (get_args): print correct -l option depending if
- system supports syslog and/or syslog facilities. Patch from
- Tom Schmidt <tschmidt@micron.com>.
-
- * doc/am-utils.texi (opts Option): updates for documentation for
- new cdfs options defperm, nodefperm, noversion, rrip.
-
- * amd/ops_cdfs.c (mount_cdfs): support cdfs options defperm,
- nodefperm, noversion, rrip.
-
- * conf/nfs_prot/nfs_prot_osf.h: need to look at <cdfs/cdfsmount.h>
- on osf.
-
- * aux/macros/{expand_cpp_hex.m4, expand_cpp_int.m4,
- expand_cpp_string.m4}: use #error to make failed compilations
- fail faster, rather than have the program fail during a run.
-
- * include/am_compat.h: added a few new cdfs options: rrip,
- noversion, defperm, and nodefperm (used in OSF).
-
-Wed Jan 28 20:24:09 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * released snapshot am-utils-6.0a16s4
-
- * doc/am-utils.texi (Global Parameters): update manual for new
- amd.conf global variable hesiod_base.
-
- * scripts/amd.conf.5: update man page for new amd.conf global
- variable hesiod_base.
-
- * amd/get_args.c (get_args): use /etc/amd.conf file if exists by
- default, else try command line options. Patch from Randall
- S. Winchester <rsw@Glue.umd.edu>.
-
-Wed Jan 28 12:20:56 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_hesiod.c (hesiod_search), amd/conf.c
- (gopt_hesiod_base), amd/amd.h, amd/amd.c (init_global_options):
- included patch from Randall S. Winchester <rsw@Glue.umd.edu>, to
- support a hesiod base name in the amd.conf file.
-
- * doc/am-utils.texi (pid_file Parameter): document new global
- amd.conf parameter.
-
- * scripts/amd.conf.5: document new global option pid_file.
-
- * amd/amd.c (daemon_mode): if cannot open pid_file, continue to
- run, but print error message.
-
- * amd/conf.c (gopt_pid_file), amd/amd.h, amd/amd.c (daemon_mode,
- init_global_options): Included patch from Randall S. Winchester
- <rsw@Glue.umd.edu>, to support pid files in the amd.conf file.
-
- * amd/get_args.c (get_args): correct usage info on amd -t.
-
- * amd/*.c: massive file name and symbol name changes. All amd
- file systems files and symbols are prefix with amfs_*. Now using
- real name of file system: amfs_auto instead of afs, amfs_inherit
- instead of ifs, amfs_linkx instead of sfsx, etc. This will enable
- clear distinction between amd file system and generic ones like
- nfs/ufs/pcfs/hsfs. Also, now we can implement true afs (Andrew
- f/s) and DFS (Distributed f/s).
-
- * amd/amfs_union.c: unionfs for amd is always defined, no need to
- #ifdef it.
-
-Mon Jan 26 16:51:38 1998 Erez Zadok <ezk@chestnut.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (compute_nfs_args): set 'noconn' NFS option on
- or off, based on the particular quirks of the OS in question.
-
- * aux/macros/check_nfs_socket_connection.m4: new macro to set the
- correct wait of handling un/connected NFS sockets.
-
- * scripts/wait4amd.in: use rlogin instead of rsh.
-
- * amd/am_ops.c (ops_showfstypes): when showing F/S types in amd
- -v, always show "nfs3" for NFS V.3.
-
-1998-01-25 Erez Zadok <ezk@snoopy.cs.columbia.edu>
-
- * lots of small fixes for solaris 2.6, since gcc 2.8.0 -Wall gets
- more picky than 2.7.2.3 did.
-
-1998-01-24 Erez Zadok <ezk@snoopy.cs.columbia.edu>
-
- * include/am_utils.h (dlog): amuDebug macros reduced to shorter
- forms.
-
-Fri Jan 23 18:38:30 1998 Erez Zadok <ezk@goat.mcl.cs.columbia.edu>
-
- * released snapshot am-utils-6.0a16s3
-
- * include/am_defs.h: on Solaris 2.6, <sys/varargs.h> is included
- in <sys/fs/autofs.h> but since stdargs.h is used, and varargs.h
- must not, fake a definition for varargs.
-
-Fri Jan 16 10:16:40 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * README: show how to configure in additional support such as
- hesiod using various --enable-* flags.
-
-Wed Jan 14 15:13:02 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: look for strcasecmp(), and replace it if not
- available.
-
- * amd/ops_nfsl.c (nfsl_match): host names should be compared using
- case insensitive.
-
- * amd/opts.c: for each map variable, define if the comparison
- needs to be done case insensitive.
-
- * include/am_utils.h (STRCEQ): a new macro to use strcasecmp().
- Patch from Thomas Richter <richter@chemie.fu-berlin.de>
-
-1998-01-14 Erez Zadok <ezk@irt.cs.columbia.edu>
-
- * aux/configure.in: look for "isofs" as a possible mount type for
- cdfs (RedHat Linux).
-
-Wed Jan 14 02:07:05 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_linux.c (parse_opts): don't look for cdfs mount
- type if not defined.
-
- * conf/nfs_prot/nfs_prot_linux.h: don't define __FD_* macros if
- already defined.
-
- * aux/configure.in: look for ext2fs before ufs, b/c some linux
- have both.
-
-Mon Jan 12 15:43:20 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * Makefile.am (snapshot): allow me to install snapshots into the
- ftp directory.
-
- * scripts/ctl-hlfsd.in: don't turn on -D mem by default.
-
- * amd/get_args.c (get_args): minor bug in output of amd -H.
-
-Mon Jan 12 03:05:06 1998 Erez Zadok <ezk@chestnut.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a15 ***
- *******************************************************************
-
-Sun Jan 11 15:06:34 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/conf.c (*_browsable_dirs): allow specifying
- browsable_dirs=full, which will print *all* entries (other than
- /default), including those with '*' and '/' characters.
-
- * amd/info_file.c (MAX_LINE_LEN): up maximum readdir chain length
- to 1500.
-
- * doc/am-utils.texi: fixed reversed documentation for NFS mount
- options vers and proto.
-
- * doc/Makefile.am (install-html): separate target just for
- installing html files. Another new target "alldocs" is just for
- installing all files needed for the am-utils home page.
-
- * scripts/amd.conf-sample: updated example for log_file.
-
- * scripts/amd.conf.5: updated for new way to declare new syslog
- facility in the log_file option.
-
- * amd/amd.8: updated for new way to declare new syslog facility in
- the -l option.
-
- * libamu/xutil.c (get_syslog_facility): allow users to specify the
- syslog facility as an appended string to the log device. Ex. amd
- -l syslog:local7 will use LOG_LOCAL7, while the older -l syslog
- will use the default LOG_DAEMON facility.
-
- * amd/get_args.c (get_args): updated new syntax for amd -l
- syslog:facility.
-
-Thu Jan 8 04:05:10 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/host_macros.m4: don't confuse sun3 (sparc) with sun3
- (intel).
-
- * libamu/wire.c (print_wires): bug fix. Nullify output buffer
- before appending to it, on systems with two or more network
- interfaces.
-
- * conf/nfs_prot/nfs_prot_sunos5_3.h: add missing definition for
- the mntent for cachefs.
-
- * include/am_defs.h: external definition for strstr() should use
- const for both arguments.
-
- * aux/configure.in: add extern definitions for getwd() if missing.
-
- * include/am_defs.h: define the extern for strdup() even if the
- function does not exist, for it will be filled in by
- libamu/strdup.c
-
- * amq/pawd.c (cluster_server): don't use getccent() if the extern
- for it isn't there. On hpux 10.20, the function is in libc, but
- <cluster.h> and struct cct_entry do not exist.
-
- * aux/configure.in: check for an extern for getccent() b/c some
- hpux systems don't have it (hpux 10.20).
-
-Wed Jan 7 00:09:19 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * doc/am-utils.texi (Amq -T option): manual documentation updates
- for new amq options -T/-U.
-
- * amq/amq.8: updated man page for new amq options -T/-U.
-
- * amq/amq.c: two new switches to amq. -U will contact amd using
- UDP only. -T will use TCP only. Normally amq will try TCP and
- if that failed, will try UDP.
-
- * doc/am-utils.texi (pawd): manual documentation for pawd.
-
- * amq/pawd.1: new man page for pawd.
-
-Tue Jan 6 04:21:59 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amq/pawd.c: a new program, Print Automounter Working Directory,
- to print the proper pathname of the cwd or any other pathname,
- adjusted for automounter paths, while avoiding mount points.
-
- * aux/macros/localconfig.m4: trivial support for am-utils
- maintainers to adjust some of the configuration of am-utils after
- it has been auto-configured by putting whatever definitions you
- wish in a file called localconfig.h, located in the top build
- directory (the same one where config.h is created for you).
-
- * doc/am-utils.texi (Caching Filesystem): updated documents for
- cachefs file system.
-
- * amd/ops_cachefs.c: initial cachefs support, for solaris.
- type:=cachefs, requires cachedir:=/cache/dir/name to be defined
- and initialized with cfsadmin -c. $rfs is backdir to be cached
- from, and $fs is the local mount point of the cachefs.
-
- * conf/mount/mount_svr4.c (mount_svr4): support mounting of
- cachefs file systems.
-
- * amd/ops_cdfs.c: cdfs should be named 'cdfs', not whatever the
- mnttab type is.
-
-Mon Jan 5 23:22:49 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/opts.c: added support for new variable $cachedir.
-
- * include/am_utils.h: added opt_cachedir field to struct am_opts.
-
-Sat Jan 3 01:43:57 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/ops_nfsl.c (nfsl_ffserver, nfsl_match): also check if the
- local hostname does not match $rhost, and if so, also assume
- type:=nfs.
-
-Fri Jan 2 01:00:40 1998 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * updated all source files to add 1998 as a copyright year.
-
- * amd/ops_nfsl.c: new amd meta file system "type:=nfsl". Behaves
- like type:=linkx if the pathname denoted by $fs exists, and like
- type:=nfs if it does not. A convenient shortcut for the most
- popular amd map entry.
-
- * amd/amd.c (main): amd should chdir to / before starting, to
- avoid hanging on other NFS server if started elsewhere.
-
- * amd/ops_TEMPLATE.c: added an empty template file for developers
- who wish to write new amd pseudo file systems.
-
-Thu Jan 1 00:27:28 1998 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/homedir.c (plt_init): make function exported, to save on
- the unnecessary init_homedir() function which was removed.
- (table_add): don't use xmalloc() when you can use strdup()
- instead.
-
-Thu Jan 1 00:15:58 1998 Erez Zadok <ezk@chestnut.mcl.cs.columbia.edu>
-
- * hlfsd/homedir.c (hlfsd_endpwent): Don't actually run this
- because we will be making more passwd calls afterwards. On
- Solaris 2.5.1, making getpwent() calls after calling endpwent()
- results in a memory leak! (and no, even Purify didn't detect
- it...)
-
-Tue Dec 23 18:23:47 1997 Erez Zadok <ezk@chestnut.mcl.cs.columbia.edu>
-
- * hlfsd/hlfsd.c (main): Bug fix. Don't try to free() an
- automatically allocated address.
-
- * amd/ops_afs.c (mount_toplvl): Bug fix. Don't try to free() an
- automatically allocated address.
-
- * ALL SOURCES: change every direct call to free() to xfree(), so
- it can be mapped to the right debugging function as needed.
-
- * include/am_utils.h: new free() policy. If debugging memory,
- call dxfree(), which will print the file name and line number
- where the free occurred and the pointer address. if only regular
- debugging, then free() and reset the pointer to NULL so it cannot
- be used afterwards inadvertently. If not DEBUG at all, then just
- run free(). Three different #define macros set the right mapping.
-
- * libamu/xutil.c (dxfree): renamed function to dxfree(), so it can
- be called only when debugging the memory.
-
-Tue Dec 23 04:24:28 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * wire-test/wire-test.c (main): use xmalloc() not malloc().
-
- * conf/transp/transp_tli.c (get_knetconfig): use xzalloc() not
- calloc().
-
- * conf/mtab/mtab_mach3.c (convert): use xzalloc() not calloc().
-
- * conf/mount/mount_linux.c (parse_opts): use xmalloc() not
- malloc().
-
- * amd/info_ldap.c: use xmalloc() not malloc().
-
- * libamu/xutil.c (xzalloc): new function to allocate memory and
- zero its bytes.
-
- * amq/amq.c: amq does not need its own definition of xfree().
-
- * aux/macros/opt_debug.m4: if used --enable-debug=mem, then also
- look for function malloc_verify() in libmapmalloc.a, and function
- mallinfo() in libmalloc.
-
- * libamu/xutil.c (checkup_mem): do not use mallinfo field
- uordbytes, because it does not always exist. Rather, compute it
- from other fields..
-
- * include/am_utils.h: add external definition to xfree() function
- used when debugging memory references.
-
-Mon Dec 22 03:01:30 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_afs.c (afs_readdir_browsable): reduce the number of
- bytes heuristically computed to be returned to the kernel.
- Otherwise browsable_dirs fails on OpenBSD 2.2.
-
- * amd/mntfs.c (uninit_mntfs): bug fix. Moved freeing of
- mf_private field to AFTER it gets used.
-
-Sat Dec 20 00:51:21 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_host.c (host_umounted): don't use clnt_spcreateerror()
- on systems that don't support it.
-
- * include/am_defs.h: add missing extern definition for free().
-
- * aux/configure.in: check for external definition for free().
-
- * libamu/Makefile.am: add to comment a mention of strstr as an
- optional function.
-
- * libamu/xutil.c (switch_to_logfile): use openlog() options only
- if they exist.
-
- * conf/transp/transp_sockets.c (get_nfs_version): don't use
- clnt_spcreateerror if it does not exist.
-
- * aux/configure.in: check for missing functions clnt_create and
- clnt_spcreateerror. Check for missing strstr, and complete
- its code. Check for missing external definition for strstr.
-
- * aux/macros/host_macros.m4: normalize sun3* names.
-
- * Makefile.am: updates for new sunos3 files distributed.
-
- * conf/nfs_prot/nfs_prot_sunos3.h: new file.
-
- * conf/fh_dref/fh_dref_sunos3.h: new file.
-
- * aux/macros/check_nfs_prot_headers.m4: added sunos3 case.
-
- * aux/macros/check_nfs_fh_dref.m4: added sunos3 case.
-
- * doc/am-utils.texi (wire Selector Variable): updated manual for
- adjusted variables wire, network, and netnumber, all using the
- in_network() function.
-
-Fri Dec 19 04:37:36 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/opts.c: allow options to be processed by executing arbitrary
- functions. Converted wire, network, and netnumber all to use the
- nomadic function in_network. So from now on they perform a match
- against all networks, not just primary.
-
- * initial port to alpha-unknown-linux-gnu, probably works, but
- untested yet.
-
- * conf/nfs_prot/nfs_prot_linux.h: add special definitions for
- __FD_* macros which for som strange reason do not get included
- from <selectbits.h> on redhat alpha linux. Also turn off usage of
- <rpc/des_auth.h> because it is incomplete on the same systems.
-
- * hlfsd/homedir.c (table_add): cast uid field to int, for
- comparison.
-
- * include/am_defs.h: more coflicts with redhat alpha linux
- "resolved".
-
- * aux/macros/{mount_headers,try_compile_anyfs,try_compile_nfs}.m4:
- There's a conflict of definitions on redhat alpha linux between
- <netinet/in.h> and <linux/fs.h> which must be avoided.
-
- * aux/configure.in: check for <socketbits.h>, which is in use on
- redhat alpha linux.
-
- * doc/am-utils.texi (Selectors): added documentation to describe
- the new "!" (negated) nomadic functions.
-
- * amd/opts.c (f_in_network): print debugging info that is correct,
- rather than saying that any ARG is on a local network.
- (eval_opts): added support for negating nomadic functions, by
- prepending "!" to their name. Example, !exists(/foo/bar).
-
-Thu Dec 18 20:57:19 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_compat.h: ensure that all NFS3 systems have the mount
- table entries (and amd opts switches) "proto" and "vers".
-
- * hlfsd/homedir.c (table_add): added some debugging info to try
- and track down a serious memory leak in hlfsd.
-
-1997-12-18 Erez Zadok <ezk@t-rex.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (compute_nfs_args): OpenBSD 2.2 requires that
- you do NOT set the noconn option, and use connected sockets
- always. So I'm now forced not to set it at all, and have the user
- specify it as "conn" or "noconn" in their /default entry. Argh...
- Finally, it looks as if OpenBSD 2.2's NFS 3 implementation may be
- buggy (TCP hangs with "short receive" kernel errors). I'd better
- wait until they get it working in their version of the automounter
- first. So I'm putting the "noconn" option back.
-
-Thu Dec 18 02:39:39 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (compute_nfs_args): use maxgrps option and set
- nfs_args field maxgrouplist accordingly.
-
- * include/am_compat.h (MNTTAB_OPT_MAXGROUPS): complete definition
- for mount table entry for maxgroups based on NFS mount option
- maxgrp.
-
- * aux/configure.in: put back testing for NFS mount option
- "maxgrps". Added test for mount table entry "maxgroups".
-
- * libamu/mount_fs.c (compute_nfs_args): perform more careful tests
- on nfs_proto, because it could be NULL.
-
- * doc/am-utils.texi (Selectors): added example of in_network()
- selector.
-
- * aux/macros/check_hide_mount_type.m4: all hpux versions,
- including 9.x, should use "ignore" as the mount type to hide from
- amd.
-
-Wed Dec 17 13:09:21 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_utils.h (NSTREQ): use new macro instead of strncmp()
- every where in the sources.
-
-Wed Dec 17 01:15:01 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * libamu/mount_fs.c (print_nfs_args): if -D trace is on, will
- print as much info that is given in struct nfs_args as possible.
- useful for detecting internal flags and options, as well as the
- file handle used.
-
- * scripts/ctl-amd.in: look for amd.conf file in ${prefix}/etc
- after /etc and before /etc/local.
-
-Tue Dec 16 18:51:36 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in, libamu/Makefile.am: added support for linking
- with specific versions of libamu. Upped shared library version of
- libamu to 1 (libamu.so.1.0.0)
-
- * include/am_defs.h: added external definition for mkstemp() as
- needed.
-
- * minor new port to i386-unknown-netbsd1.3 (BETA version of
- netbsd).
-
- * aux/config.guess: don't leave a trailing '.' on the system name
- for NetBSD-1.3_BETA and similarly for OpenBSD.
-
- * conf/nfs_prot/nfs_prot_netbsd1_3.h: new header for the slight
- differences in ypall calling conventions.
-
- * mk-amd-map/mk-amd-map.c (main): use mkstemp() whenever possible
- in preference over mktemp(), b/c it is more secure.
-
- * aux/configure.in: check for mkstemp(), a more secure version of
- mktemp().
-
-Mon Dec 15 02:32:14 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_nfs.c (mount_nfs_fh): Systems that include the mount
- table "vers" option generally do not set the mnttab entry to
- "nfs3", but to "nfs" and then they set "vers=3". Setting it to
- "nfs3" works, but it may break some things like "df -t nfs" and
- the "quota" program (esp. on Solaris and Irix). So on those
- systems, set it to "nfs".
-
-Sat Dec 13 01:36:27 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Distrib): updates for new ports, location of
- am-utils' home page, and URL cross references (now supported by my
- version of texi2html).
-
- * aux/macros/check_mtype_type.m4: also use string type for file
- system mount types under nextstep for mount(2).
-
- * aux/macros/check_mtype_printf_type.m4}: nextstep can handle both
- integer and string types for file system mount types in mount(2),
- but it is better to use string types.
-
- * conf/nfs_prot/nfs_prot_nextstep.h: set emum nfsstat's NFS_OK to
- 0, not 1! Otherwise, all NFS calls (esp. mount) return errno 1
- (EPERM) instead of 0 (OK). Fixes m68k-next-nextstep3 which now
- works.
-
- * conf/nfs_prot/nfs_prot_bsdi2.h: set emum nfsstat's NFS_OK to 0,
- not 1! Otherwise, all NFS calls (esp. mount) return errno 1
- (EPERM) instead of 0 (OK).
-
- * libamu/xdr_func.c (xdr_*): add debugging calls that are optioned
- by -D trace (protocol trace).
-
-1997-12-11 Erez Zadok <ezk@bach.cs.columbia.edu>
-
- * A.m68k-next-nextstep3/amu_nfs_prot.h: define missing S_ISDIR
- macro based on existence on others, and include <sys/stat.h>.
-
-Thu Dec 11 14:14:38 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/try_compile_nfs.m4 (AC_TRY_COMPILE): turn off
- inclusion of <nfs/nfs_mount.h> which only affects nextstep3, on
- which this header is broken (it tries to include non-existing
- headers).
-
-Wed Dec 10 16:09:07 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (mnt_flags): support either nfs or generic
- mount option for grpid.
-
- * aux/configure.in: turn back on NFS mount option grpid.
-
-Sat Dec 6 04:36:05 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/Makefile.am (install-ps): added target to install postscript
- file in the am-utils' home page, as well as a few other useful
- files for the new am-utils Web page.
-
-Mon Nov 17 05:22:56 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a14 ***
- *******************************************************************
-
-Sun Nov 16 21:56:16 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Supported Platforms): updated table of new
- ports.
-
-Sat Nov 15 06:36:27 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (compute_automounter_nfs_args): pass mnttab
- options so that they can be printed in logs as needed.
-
- * doc/am-utils.texi (osver Parameter): updated for the correct
- usage of the -o/-O options.
-
- * scripts/amd.conf.5: corrected info for -o/-O options.
-
- * amd/amd.8: updated man page for new -O op_sys_name option, and
- corrected the usage of the -o op_sys_ver option
-
- * amd/get_args.c (get_args): added new amd option -O to override
- OS name.
- (get_args): updated usage string. Removed old -m option. Added
- -o and -O options.
-
- * conf/nfs_prot/nfs_prot_irix5.h: add definition to FHSIZE in case
- it is not there. Reportedly, irix 5.2 does not define it.
-
- * scripts/lostaltmail.in: removed references to unused $hack
- variable.
-
- * aux/macros/check_nfs_prot_headers.m4: Patch from Chris Metcalf
- <metcalf@cag.lcs.mit.edu> to correctly set the nfs_prot headers
- for solaris2.5.
-
- * doc/am-utils.texi (Distrib): typo in the subscription
- instructions to amd-dev. Patch from Stefan Vogel
- <vogel@physik-rzu.unizh.ch>.
-
-1997-11-15 Erez Zadok <ezk@amtrak.cs.columbia.edu>
-
- * NFS3 works on powerpc-ibm-aix4.2.1.0.
-
- * libamu/mount_fs.c (compute_nfs_args): set fh3 variable to
- static. Some compilers (gcc from egcs on aix 4.2.1) corrupt the
- stack of an automatic variable when pointer to it is passed around
- several times.
-
-Fri Nov 14 20:09:28 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/xutil.c (real_plog): syslog like behavior for normal
- logging. Will not print repeated strings, only a count "last
- message repeated N times", but will always print something if
- message is repeated more than 100 times.
-
- * scripts/lostaltmail.in: look for lostaltmail.conf files also in
- /etc/global, /etc/os, and /etc/local (in that order).
-
-Mon Nov 10 03:03:17 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * conf/mount/mount_aix.c (mount_aix3): add support for NFS V.3
- mounts.
-
- * aux/macros/struct_nfs_args.m4 (AC_TRY_COMPILE_NFS): test for
- aix42_nfs_args, specially set in conf/nfs_prot/nfs_prot_aix4_2.h
-
- * conf/sa_dref/sa_dref_*.h: from now on, the "dst" argument to the
- NFS_SA_DREF macro is a pointer to the structure that used to be
- passed to it before. So now I have to dereference the pointer
- before accessing its values.
-
- * hlfsd/hlfsd.c (main): use the new and cleaner
- compute_nfs_args() and compute_automounter_nfs_args() functions.
-
- * amd/ops_nfs.c (mount_nfs_fh): use the new and cleaner
- compute_nfs_args() and compute_automounter_nfs_args() functions.
-
- * amd/ops_afs.c (mount_toplvl): MAJOR CODE REVISION. Use the new
- and cleaner compute_nfs_args() and compute_automounter_nfs_args()
- functions.
-
- * libamu/mount_fs.c (compute_nfs_args): major code cleanup that
- relates for struct nfs_args. A new function sets the numerous
- possible flags and fields of nfs_args_t in an orderly fashion.
- Code cleaned up, organized, and moved from amd/hlfsd into
- libamu. This saves on overall size of code.
- (compute_automounter_nfs_args): A variant of compute_nfs_args()
- which sets special options/flags that need to be used when NFS
- mounting an automounter's mount point. Used by hlfsd and amd.
-
- * amq/amq.c (get_secure_amd_client): don't print any more
- "get_secure_amd_client: using TCP, port 12345". It's more
- annoying than useful a message, even when assumed to be compiled
- under DEBUG only.
-
-Thu Oct 30 14:33:38 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_mnttab_type.m4: MAJOR BUG fixed for non-nfs
- mount table entries. The code used to define the /etc/mnttab name
- for file systems based on physical media (disk, cdrom, floppy) to
- the generic name, rather than the OS specific name. For example
- autoconf searches for all these types of mount table entries for a
- floppy based file system: vfat pcfs pc msdos msdosfs fat. But if
- it found any, it hard-coded the mnttab name to "pcfs" rather than
- the actual name found! Same for ufs, cdfs, pcfs, tmpfs, lofs,
- nullfs, unionfs, and umapfs.
-
- * aux/configure.in: also test for xfs (for newer Irix) when
- looking for mount type names, numbers, etc of a disk-based ufs.
-
-Sun Oct 26 19:32:57 1997 Erez Zadok <ezk@defiant.soscorp.com>
-
- * amq/amq.c (main): use pmap_ping() to test if remote host is up.
- This works better on bsdi2 and bsdi3, because their portmapper
- does not appear to like forwarding operations (it is generaly
- insecure).
-
-Sat Oct 25 04:55:56 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a13 ***
- *******************************************************************
-
-Fri Oct 24 05:04:37 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_ncr2.h: added missing definition for
- struct datum typedef.
-
- * conf/nfs_prot/nfs_prot_netbsd.h: corrected typedef for
- ypall_callback_fxn_t for netbsd.
-
- * aux/macros/type_auth_create_gidlist.m4: hpux10.10 uses int for
- the 5th arg to authunix_create(), while before and after they used
- gid_t.
-
- * conf/transp/transp_tli.c (amu_clnt_create_best_vers): don't use
- clnt_create_timed() on older Solaris 2.3 systems that did not have
- it.
-
- * conf/nfs_prot/nfs_prot_bsdi2.h: <msdosfs/msdosfsmount.h> is for
- kernel only on bsdi2, so do not include it.
-
-Fri Oct 24 00:29:42 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * hlfsd/stubs.c (nfsproc_readlink_2_svc): avoid logging repeated
- messages about resolution of mailboxes based on uid/gid.
-
- * scripts/ctl-hlfsd.in: check for alternate password file in
- ${prefix}/etc/passwd and use it in hlfsd's startup.
-
-Thu Oct 23 22:48:50 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * hlfsd/homedir.c (hlfsd_getpwent): added support for -P
- passwdfile option. If hlfsd is started with -P passwdfile, then
- the passwdfile is read and parsed just as a standard unix
- passwd(4) file. Only the username, uid, and homedir fields are
- read and checked. All the rest are ignored. No NIS/netgroup
- support!
-
- * hlfsd/hlfsd.c (main): check if hlfsd is run as root after
- parsing command line options, so that usage() can be printed when
- -h is invoked.
-
-Wed Oct 22 00:16:39 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/nfs_start.c (mount_automounter): if autofs service listener
- fails to initialize it is OK if using a test amd.
-
- * amd/opts.c (f_in_network): new nomadic function in_network(arg),
- which returns TRUE if 'arg' is any one of this host's networks.
-
- * libamu/wire.c (getwire): rewritten parts of function, to store
- all networks names and numbers in the order of the interface (not
- in reverse).
-
-Mon Oct 20 01:59:25 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: don't add ops_ufs.o on AIX twice. My code
- would have worked had it not been due to AIX's buggy /bin/sh.
-
- * doc/Makefile.am (EXTRA_DIST): include am-utils.dvi and
- am-utils.ps in the distribution sources.
- (html): generate html documentation for
- http://www.am-utils.org
-
-Sun Oct 19 12:35:49 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_netbsd.h: override the definition of
- ypall_callback_fxn_t. The NetBSD team compiles all sources with
- gcc -Wall -Wmissing-prototypes -Wstrict-prototypes.
-
- * amd/info_nis.c: allow for override of ypall_callback_fxn_t
- function typedef.
-
- * libamu/xutil.c (amu_release_controlling_tty): new function to
- release the controlling tty in a clean and sane manner. No longer
- using setpgid() b/c it may not work. Uses setsid(),
- and ioctl() (in order). This new function is used in amd/amd.c
- and hlfsd/hlfsd.c. Also avoid setpgrp(), because it works on some
- systems, but on others it is the same as setpgid().
-
-Sat Oct 18 23:42:40 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/acconfig.h: check for nfs mount option 'fsname'. Code for
- it was in amd/ops_afs.c, amd/ops_nfs.c, and hlfsd/hlfsd.c, but
- never used, because the configure test for fsname flag wasn't
- used. This fixed a bug in HPUX 10, where syncer and manual mounts
- left blank lines in /etc/mnttab.
-
- * aux/configure.in: check for nfs mount option 'fsname'.
-
-Fri Oct 17 13:30:27 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_afs.c (mount_toplvl): turn on 'ignore' option in nfs
- mount flags of toplvl mounts. Important esp. for HPUX 10. Now
- hpux-10 will mount amd's mounts points as 'ignore' (by df).
-
- * aux/configure.in: check for NFS mount option 'ignore', useful in
- HPUX 10.
-
-Thu Oct 16 03:28:33 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_hide_mount_type.m4: hpux 10 should use "ignore"
- mount type and not NFS, for the amd mount points.
-
- * conf/transp/transp_tli.c (amu_clnt_create_best_vers): don't log
- an RPC timeout as an error, but just an info message. From
- Andreas Stolcke <stolcke@speech.sri.com>
-
- * If the NFS server is down or does not support the portmapper
- call (such as certain Novell NFS servers) we mark it as version 2
- and we let the nfs code deal with the case that is down. If when
- the server comes back up, it can support NFS V.3 and/or TCP, it
- will use those. From christos@deshaw.com (Christos Zoulas).
-
- * hlfsd/homedir.c (plt_print): various compile time cleanups to
- printfs that take a long, but pass an int to print. From
- christos@deshaw.com (Christos Zoulas).
-
- * aux/macros/func_bad_yp_all.m4 (ac_cv_func_yp_all_clean,): new
- macro to determine if the OS has a bad yp_all(), based on the host
- OS name. So far only irix (all versions) have a bad yp_all, so
- they will use am_yp_all() instead (which is slower as it
- enumerates manually all of the map's entries).
-
-Thu Oct 16 03:14:37 1997 Erez Zadok <ezk@subzero.cs.columbia.edu>
-
- * amd/info_nis.c (am_yp_all): code for a replacement yp_all that
- avoids using a file-descriptor leaking yp_all() on some systems
- like irix.
-
-Wed Oct 15 21:52:35 1997 Erez Zadok <ezk>
-
- * fsinfo/fsinfo.h: avoid redefining yywrap incorrectly on DU-4.x
- systems using /usr/bin/flex.
-
- * amd/conf_tok.l (yywrap): avoid redefining yywrap for systems
- that have a modified GNU flex which does define yywrap (DU-4.x).
-
-Fri Sep 26 14:25:29 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/checkmount/checkmount_bsd44.c: include prototype.
-
-Fri Sep 26 01:26:24 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a12 ***
- *******************************************************************
-
-Fri Sep 26 00:13:48 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_irix6.h: completely turn off all autofs
- code in irix6 until it can be tested correctly
-
- * conf/transp/transp_tli.c (amu_clnt_create_best_vers): time out
- on clnt_create for 3 seconds, rather than wait for the much longer
- default.
-
- * conf/nfs_prot/nfs_prot_aix4_2.h: port to powerpc-ibm-aix4.2.1.0.
- Includes NFS3, untested.
-
-Thu Sep 25 11:03:11 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_pcfs.c (mount_pcfs): fill in uid/gid fields of
- pcfs_args_t if they exist.
-
- * amd/ops_cdfs.c (mount_cdfs): fill in ssector field of
- cdfs_args_t if it exists.
-
- * new minor ports hppa1.1-hp-hpux10.10, hppa1.1-hp-hpux9.05,
- hppa1.1-hp-hpux9.07, m68k-hp-hpux9.00, and sparc-sun-sunos4.1.4.
-
-Wed Sep 24 00:48:05 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (wire-test): updated documentation for the new
- option.
-
- * wire-test/wire-test.8: updated man page for new option.
-
- * wire-test/wire-test.c (main): added a test for various
- combinations of NFS proto/vers to a remote/local host.
-
- * aux/macros/try_compile_anyfs.m4 (AC_TRY_COMPILE): include
- <isofs/cd9660/cd9660_mount.h> and <msdosfs/msdosfsmount.h> so that
- freebsd will correctly set mount options for pcfs and cdfs.
-
- * amd/ops_pcfs.c (mount_pcfs): set mask field of pcfs_args to
- 0777 (if field exists).
-
- * aux/macros/try_compile_anyfs.m4 (AC_TRY_COMPILE): include
- <msdosfs/msdosfsmount.h> if available.
-
- * minor new port: rs6000-ibm-aix4.1.4.0.
-
- * libamu/mount_fs.c (mount_fs): fixed bug that caused HPUX not to
- write the "time" field in /etc/mnttab.
-
- * conf/mtab/mtab_file.c (mnt_dup): fixed typo in macro names for
- detecting mnt_time field of mntent_t.
-
- * libamu/mtab.c (mnt_free): fixed typo in macro names for
- detecting mnt_time field of mntent_t.
-
-Tue Sep 23 15:30:03 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mtab/mtab_file.c (lock): Use flock() in preference over
- fcntl() to lock the mtab file.
-
-Mon Sep 22 23:04:58 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/transp/transp_sockets.c (get_nfs_version): define
- the try_again goto label only for NFS3.
- (pmap_ping): assume timeout failure of clnt_stat.
-
- * libamu/xdr_func.c (xdr_groupnode, xdr_exportnode): cast to
- "groups *".
-
-Mon Sep 22 20:34:33 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * conf/transp/transp_sockets.c (pmap_ping): patch from Dan Riley
- <dsr@mail.lns.cornell.edu> to make sure that amd works with more
- secure portmappers that do not allow forwarding of RPC messages to
- other services.
-
- * */Makefile.am: all source files should also depend on the new
- include/am_xdr_func.h header.
-
- * include/am_xdr_func.h: new file as part of the code cleanup from
- Christos Zoulas <christos@deshaw.com>.
-
- * Lots of fixes from Christos Zoulas <christos@deshaw.com> that
- involved missing prototypes, cleaned up ones, and removal of
- unused variables.
-
- * libamu/xdr_func.c (xdr_mountres3): some code cleanup. A switch
- statement with only one case is unclean.
-
-Mon Sep 22 17:26:38 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_<FOO>fs.c (mount_<FOO>fs): initialize mntent_t fields to
- 0 so that all fields are initialized to zero at first. This way
- SunOS 4.x and other systems don't get /etc/mtab entries with
- random integers for the fsck/freq fields. Patch from Andreas
- Stolcke <stolcke@speech.sri.com>.
-
-Mon Sep 22 00:34:19 1997 Erez Zadok <ezk@americas.psl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos4.h: include <nfs/nfs_clnt.h> so
- that the important definition for HOSTNAMESZ will be found.
-
- * amd/ops_afs.c (mount_toplvl): limit hostname size to HOSTNAMESZ
- (inside the nfs_args structure) if the system uses that macro.
- Otherwise systems like SunOS refuse to NFS mount long pathnames
- and result in ENAMETOOLONG errno's.
-
-Wed Sep 17 04:56:11 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * doc/am-utils.texi (Supported Platforms): specify new support for
- solaris 2.6, and hlfsd running on 2.5.1 too.
-
-Wed Sep 17 03:55:02 1997 Erez Zadok <ezk@amsterdam.psl.cs.columbia.edu>
-
- * conf/mount/mount_svr4.c (mount_svr4): don't attemt an autofs
- mount if it is not supported or was turned off.
-
-Wed Sep 17 03:19:36 1997 Erez Zadok <ezk@americas.psl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos4.h: fixed so that it will nfs mount
- again. Apparently at some previous release SunOS 4 supported was
- broken and all nfs mounts resulted in ESTALE.
-
-Wed Sep 17 00:26:25 1997 Erez Zadok <ezk@amsterdam.psl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos5_6.h: nfs protocol headers for
- solaris 2.6.
-
- * aux/macros/check_nfs_prot_headers.m4: added solaris 2.6 nfs
- protocol header selection.
-
-Sat Sep 13 14:31:51 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/transp/transp_tli.c (amu_clnt_create_best_vers): avoid
- infinite loop.
-
-Sun Sep 7 18:23:23 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a11 ***
- *******************************************************************
-
-Fri Sep 5 11:55:10 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/amd.c (main): if plock() succeeded, don't try to display
- errno message. Patch from Chris Metcalf
- <metcalf@catfish.lcs.mit.edu.
-
-Thu Sep 4 19:17:58 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/homedir.c (table_add): make sure duplicate passwd entries
- are ignored. Only the first entry should ever be used, because
- that's how lookup in passwd database works.
-
- * conf/transp/transp_sockets.c (get_nfs_version): when determining
- if a remote host is up or down, use NFS v.2. Fix suggested by
- Enami Tsugutomo <enami@cv.sony.co.jp>.
-
- * conf/transp/transp_tli.c (amu_clnt_create_best_vers): new
- function to get the best possible NFS version, but also timeout
- faster than normal defaults, so remote hosts which are down can be
- detected in a reasonable time.
- (get_nfs_version): use the new "best" function.
-
-Tue Sep 2 00:41:00 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a10 ***
- *******************************************************************
-
-Mon Sep 1 15:39:51 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/transp/transp_tli.c (get_nfs_version): don't use
- clnt_tp_create_timed() on systems that don'e have it (Solaris 2.4
- and earlier).
-
- * aux/configure.in: test for existence of clnt_tp_create_timed(),
- since Solaris 2.4 (and possibly earlier) do not have it.
-
-Mon Sep 1 15:23:18 1997 Erez Zadok <ezk@felix.psl.cs.columbia.edu>
-
- * amd/ops_autofs.c (autofs_unmount_1_svc): only display rdevid
- field if it exists (solaris 2.4's autofs does not have it).
-
-Mon Sep 1 14:45:09 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/type_auth_create_gidlist.m4: a new test to determine
- the correct type to the 5th argument of authunix_create().
-
-Mon Sep 1 03:44:32 1997 Erez Zadok <ezk@felix.psl.cs.columbia.edu>
-
- * libamu/xdr_func.c (xdr_umntrequest): add test for autofs
- structure umntrequest, if it has the field rdevid. Seems Solaris
- 2.4 and earlier didn't have it.
-
-Mon Sep 1 01:10:53 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/hlfsd.c (hlfsd_init): moved initialization upwards, so it
- can be done before primary process forks.
- (main): bug fix: wait a bit to give child a chance to initialize.
- Without this, hlfsd got into a busy infinite loop while, never
- completing the mount.
-
- * amd/info_nis.c: patch from Jason Thorpe <thorpej@nas.nasa.gov>
- to make amd works when talking to NIS+ servers in NIS
- compatibility mode.
-
-Mon Sep 1 00:46:56 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/mapc.c (MAX_CHAIN): increased maximum chain size to 1024.
-
-Sun Aug 31 20:20:40 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/conf.c (gopt_fully_qualified_hosts): a new function to
- process another new global variable.
-
- * amd/ops_nfs.c (make_nfs_auth): if a new global variable
- fully_qualified_hosts is on, use FQHN in RPC/NFS authentications.
- Patch from Chris Metcalf <metcalf@catfish.lcs.mit.edu>.
-
- * amd/conf.c (process_last_regular_map): If the amd.conf file only
- has a [global] section (pretty useless IMHO), do not try to
- process a map that does not exist.
-
- * scripts/amd.conf.5: fixed typos (repeated 'as' word).
-
- * doc/am-utils.texi: MAJOR DOCUMENTATION REVISION COMPLETED!!!
-
- * amd/conf.c (reset_cf_map): Bug fix. Reset 'tag' field of cfm
- structure, so it does not carry over from map entry to another.
-
-Sat Aug 30 18:39:21 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/amd.c (main): fixed the meaning of the plock option. A bug
- caused it to be reversed.
-
-Sat Aug 30 15:13:18 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/stubs.c: don't initialize some statics here. They are
- better initialized in hlfsd_init_filehandles().
-
-Fri Aug 22 14:47:16 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/conf.c (gopt_show_statfs_entries): new function and a global
- amd.conf key show_statfs_entries. Defaults to 'no'. If 'yes',
- then all maps flagged as browsable will also show a count of the
- number of entries (keys) in that map.
-
- * amd/nfs_subr.c (count_map_entries): new function to count number
- of entries in a map. Now used if browsable is turned on in a map,
- to return a count of available keys in a given map.
-
- * hlfsd/stubs.c (eq_fh): use correct memcmp(). BUG fixed! hlfsd
- confused the file handles for ".", "..", and the symlink, causing
- mess.
-
- * aux/macros/func_bad_memcmp.m4: new test, based on autoconf 2.12,
- but also defines HAVE_BAD_MEMCMP, so I avoid linkage conflicts
- with bad memcmp() in libc's (nextstep3).
-
-Thu Aug 21 17:38:41 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: check if autofs_args_t has a field named
- addr. Solaris has it for specifying the address of the daemon,
- but Irix does not. So how does irix tell the kernel the daemon's
- address? I suspect that it is hardcoded to "localhost" using a
- "private well-known port" (#define AUTOFS_PORT 2048).
-
- * conf/nfs_prot/nfs_prot_linux.h: added missing autofs
- definitions.
-
- * README.autofs: new file listing autofs support notes
-
- * very preliminary autofs code working. Call it pre-alpha
- quality.
-
-Sun Aug 17 02:25:09 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/conf.c (ropt_mount_type, gopt_mount_type): don't accept
- "autofs" if system does not support it.
-
- * amd/amd.c (main): log am-utils version string (same as amd -v)
- at start of run.
-
- * conf/transp/transp_sockets.c (get_nfs_version): in order to tell
- if a remote host is available, try to contact its portmapper and
- timeout if no answer is received in 3 seconds.
-
-Thu Aug 14 16:12:04 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_extern.m4 (pattern): use a simpler pattern for
- match for external function definitions. The function could span
- multiple lines, so only match the opening parenthesis, not the
- closing one too.
-
- * aux/macros/os_cpp-flags.m4 (ac_cv_os_cppflags,): do NOT turn on
- posix mode for nextstep3. It is broken.
-
- * amd/amd.c (init_global_options): run uname() only if
- <sys/utsname.h> and uname(2) exist.
-
- * amd/rpc_fwd.c (fwd_packet): if remote host is down, the
- forwarding socket is null, so declare this an error.
-
- * include/am_utils.h (AM_ERRNO_HOST_DOWN): find best errno to set
- for when a remote host is down. Try, in order, "host down", "host
- unreachable", "invalid argument".
-
- * amd/ops_nfs.c (discard_fh): don't dereference a null pointer
- (happens when remote host is down, and fp->fh_fs is NULL).
- (prime_nfs_fhandle_cache): ditto, and set fs flags to !FSF_VALID
- and FSF_DOWN.
-
- * amd/sched.c: nobody uses "union wait" any more, or so it
- appears, so clean up that code.
-
- * conf/transp/transp_tli.c (get_nfs_version): if remote host is
- down, time it out faster than default (3 seconds).
- (get_mount_client): free netconfig entry when done with it.
-
- * conf/nfs_prot/nfs_prot_nextstep.h: initial (and somewhat ugly)
- port to nextstep3 (m68k-next-nextstep3).
-
- * fsinfo/Makefile.am (LDADD): needs to link with libamu in case
- system does not have strdup().
-
- * include/am_defs.h: complete external definition for getlogin()
- if needed.
-
- * conf/transp/transp_tli.c (get_nfs_version): no need to keep
- static versout variable.
-
- * amd/rpc_fwd.c (fwd_packet): if fwdto packet is null, remote
- server is probably down. Don't use sendto() in that case.
-
- * buildall (default): run gmake if found, before trying plain
- make. GNU make is always preferable.
-
-Tue Aug 12 21:23:58 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/host_macros.m4: cleanup of os_version and os
- overrides. Solaris 2.5.1 for example will come up as solaris2 and
- 2.5.1, rather than sunos5 and 5.5.1. Both can be overridden in
- the amd.conf file.
-
-Fri Aug 8 14:37:30 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a9 ***
- *******************************************************************
-
-Thu Aug 7 00:52:14 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_ncr2.h: new file, for NCR2
- (i486-ncr-sysv4.3.03) headers. Needed to complete missing stuff
- from <ndbm.h> and <sys/resource.h>.
-
- * scripts/amd.conf.5: new map page.
-
- * amd/info_hesiod.c: define extern for hesiod_resolve, since bsdi3
- does not.
-
- * amd/amd.8: updated man page.
-
- * amd/get_args.c (get_args): removed defunct -h option to amd.
-
- * amq/amq.8: updated man page.
-
- * amd/info_nisplus.c (nisplus_search): prototype fixes so Sun
- SparcCompiler CC won't complain.
-
- * amd/info_hesiod.c (hesiod_search): small fixes to compile with
- hesiod-1.3, as per Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>.
-
- * aux/macros/opt_ldflags.m4: new option added to configure
- --enable-ldflags, to specify -L option for configuring/compiling.
- The older one --enable-libs is now to be used only for -l options.
-
- * amd/ops_nfs.c (mount_nfs_fh): bug fixed. Should initialize
- nc_protoname from nfs_proto if available for all TLI systems, not
- just those that have NFS V3.
-
- * amd/info_ldap.c: ldap patches from Leif Johansson
- <leifj@matematik.su.se>, adding two new amd.conf ldap variables:
- ldap_cache_seconds and ldap_cache_maxmem.
-
- * hlfsd/hlfsd.c (main): bug fixed. port number must be wrapped in
- htons().
-
-Sun Aug 3 17:20:05 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/nfs_start.c (mount_automounter): register amd with the rpc
- program number that may have been overridden by amd.conf.
-
- * libamu/xutil.c (set_amd_program_number, get_amd_program_number):
- allow storing and retrieving alternate amd program numbers.
-
- * amd/conf.c (gopt_portmap_program): new function to parse
- amd.conf entry portmap_program=1234.
-
- * amq/amq.c (main): allow specifying an alternate rpc program
- number for amd via -P prognum.
-
- * new amq RPC to get the process id of the running amd. This is
- used in ctl-amd to quickly find the pid of the amd that is to be
- killed.
-
- * expanded shared libraries support. Using GNU libtool-1.0,
- am-utils now builds shared libraries on many platforms that have
- support for it and proper compilers/linkers. See "INSTALL" file
- for compatibility chart.
-
-Thu Jul 31 13:07:23 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * fsinfo/fsi_lex.l: removed code that was in support of very old
- versions of flex. No longer needed.
-
-Tue Jul 29 12:00:13 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/amd.c (init_global_options): find the kernel architecture
- from uname() if possible.
-
-Mon Jul 28 03:53:59 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * new working port: i386-unknown-openbsd2.1
-
-Fri Jul 25 03:16:31 1997 Erez Zadok <ezk@felix.psl.cs.columbia.edu>
-
- * working port: sparc-sun-solaris2.4. Had to fix fhandle_t from
- structure to actual char[], because the structure was passed to
- xdr_fhandle as data and not a pointer. Surprisingly, gcc
- -fpcc-struct-return did not help.
-
- * conf/nfs_prot/nfs_prot_sunos5_4.h: special nfs protocol
- definitions for solaris 2.4 have to be different from 2.3, and
- different from 2.5.
-
- * libamu/xdr_fhstatus.c (xdr_fhstatus): minor code cleanup.
-
-Thu Jul 24 16:22:39 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mount/mount_svr4.c (mount_svr4): use STREQ to compare mount
- types, not ==. Fix from Christos Zoulas <christos@deshaw.com>.
-
- * mk-amd-map/mk-amd-map.8: man page taken from bsd44.
-
-Thu Jul 24 00:01:55 1997 Erez Zadok <ezk@moisil.cs.columbia.edu>
-
- * conf/mount/mount_linux.c: made the nfs error mapping code into a
- small function.
-
-Wed Jul 23 16:11:49 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_linux.h (NFS_ERROR_MAPPING): special
- error mappings from errno numbers to NFS errors. From Debian
- Linux.
-
- * scripts/am-eject.in (fs): new script (taken from Debian Linux
- folks) to auto-unmount floppy/cd devices before ejecting them.
-
- * fsinfo/wr_exportfs.c (write_exportfs): from Debian folks, pass
- '5' as second arg to show_area_being_processed. I'm not sure why.
-
- * fsinfo/wr_atab.c (write_atab): from Debian folks, pass '5' as
- second arg to show_area_being_processed. I'm not sure why.
-
- * conf/mount/mount_linux.c (parse_opts): as per Debian Linux,
- ensure that you have a buffer in *xopts to strcat onto.
- (mount_linux): fixed from Debian folks to ensure that NFS mount
- sockets are connected only for kernels prior to 1.3.10 (avoids
- hangs for multi-homed hosts).
-
- * amd/mapc.c (make_entry_chain): from Debian folks: don't skip
- over amd map keys that have a prefix, and include the prefix in
- the returned readdir().
-
- * amd/info_passwd.c (passwd_init, passwd_search): format
- enhancements from the Debian Linux folks. They added
- - var0:=pw-prefix:=anydir
- - var1:=pw-rhost:=dom3.dom2.dom1
- - var2:=pw-user:=user
- - var3:=pw-home:=/anydir/dom1/dom2/dom3/user
-
- * new ports: sparc-sun-solaris2.4 and sparc-sun-sunos4.1.1.
-
- * amd/ops_afs.c (afs_retry): patches from Debian Linux. If
- afs_mount timed out, then explicitly forbid further retries after
- the timeout. (afs_bgmount): bug fix from Debian Linux. Timeout
- values (17 and 5) were mistakenly swapped.
-
-Wed Jul 23 15:53:25 1997 Erez Zadok <ezk@felix.psl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos5_3.h: turn off non-existent NFS V.3
- support for Solaris 2.4 (the header files incorrectly define parts
- of the NFS V.3 protocol, but the kernel does not support it).
-
-Wed Jul 23 00:07:12 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_hesiod.c: minor cleanup to use hes_init and hesiod_init
- for determining if using old or new hesiod libraries,
- respectively.
-
- * amd/ops_nfs.c (mount_nfs_fh): If "noconn" option exists in NFS
- V.3 then use non-connected sockets (both TCP and UDP). Otherwise
- they cause hangs of mounts from multi-homed hosts when the return
- route is not the same as the outgoing route (esp. on NetBSD
- 1.2.1). If "conn" option was supplied, then don't turn on the
- "noconn" mount option. Otherwise default to "noconn" mount
- option.
-
- * aux/configure.in: better check for systems that need libgdbm and
- <ndbm.h>
-
-Tue Jul 22 04:02:05 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/hlfsd.c (main), amd/ops_afs.c (mount_toplvl): ensure that
- mounts are hidden from df(1) on systems that keep mount tables in
- kernel, such as osf1.
-
-Tue Jul 22 02:26:55 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a8 ***
- *******************************************************************
-
-Mon Jul 21 21:33:19 1997 Erez Zadok <ezk@stone.mcl.cs.columbia.edu>
-
- * hlfsd/hlfsd.c (main): bug fixed: forgot to set sin_family to
- AF_INET when hlfsd mounts itself, thus getting an errno "protocol
- family not supported".
-
-Mon Jul 21 20:46:59 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * verified that amd on NetBSD 1.2.1 (i386) works, but the OS
- itself is flaky.
-
- * verified that amd AIX 3 works w/ the new readdir() code.
-
-Mon Jul 21 18:59:30 1997 Erez Zadok <ezk@chestnut.mcl.cs.columbia.edu>
-
- * amd/mapc.c (maptypes): changed the default map caching type for
- nis and ndbm maps to "MAPC_ALL", so that all possible entries will
- be available to amd for browsable_dirs=yes.
-
-Mon Jul 21 18:04:16 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_afs.c (afs_readdir, afs_readdir_browsable): split
- afs_readdir into a browsable version and a non-browsable one.
- Fixed bugs that resulted in an infinite nfs_readdir loop on the
- localhost for some operating systems.
-
-Sat Jul 19 19:38:38 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_afs.c (afs_readdir): fixed up the browsable code to
- comply with nfs_readdir specs. It was returning all entries at
- once, even if there was not enough space in the RPC packet. Now,
- it sends a reasonably sized chunk, and sets static state to resume
- it for the next continuation RPC of readdir.
-
- * amd/conf.c (set_conf_kv): fixed bug that resulted in the first
- regular map not getting all of the [global] options defaulted from.
-
-Fri Jul 18 00:45:12 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amq/amq.c (main): fixed so that portmapper "ping" will only fail
- upon an RPC timeout
-
- * scripts/ctl-{amd,hlfsd}.in (killproc): better method to find the
- amd/hlfsd process to kill.
-
- * amd/ops_afs.c (mount_toplvl), hlfsd/hlfsd.c (main): code to
- determine how to avoid df from seeing amd's toplvl mounts. Moved
- from libamu/mount_fs.c and include/am_utils.h. Ensure that hlfsd
- is hidden from df.
- (mount_toplvl): fixed df types for irix.
-
-Thu Jul 17 21:59:45 1997 Erez Zadok <ezk@americas.psl.cs.columbia.edu>
-
- * amq/amq.c (main): fixed bug that caused the 5 second timeout for
- TLI amq using udp to be ignored.
- (main): if amq cannot contact remote host's portmapper within 5
- seconds, timeout and fail faster than the default longer timeout
- (this is for non-TLI systems).
-
-Thu Jul 17 17:08:13 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amq/amq.c (get_secure_amd_client): if amq cannot contact
- remote host's portmapper within 5 seconds, timeout and fail faster
- than the default TLI timeout of over 4 minutes.
-
- * amd/am_ops.c (ops_showfstypes): added styles for new bsd44
- file systems nullfs, unionfs, and umapfs.
- (ops_show1): cleanup code and and reuse this function.
- (vops): empty placeholders for nullfs, unionfs, and umapfs.
-
- * amd/ops_{nullfs, unionfs, umapfs}.c: 3 new empty templates for
- bsd44 style file systems.
-
- * fsinfo/fsinfo.8: man page for fsinfo rewritten from bsd44
- sources.
-
- * amd/conf_tok.l, fsinof/fsi_lex.c: undefine ECHO to avoid
- conflict with systems that define it in <sys/ioctl.h> and also
- define a conflicting one via lex. Newer versions of f/lex are ok.
-
-Wed Jul 16 00:17:45 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/ops_nfs.c (mount_nfs_fh): fill in nfs_args' fields
- acdirmin/max and acregmin/max only if they exist.
-
- * aux/configure.in: test for nfs_args fields acdirmin and
- acregmin.
-
-Tue Jul 15 17:24:09 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: commented out checking for MNT2_GEN_OPT_* for
- "nondev" and commented back in checking for "nodev". This was a
- typo.
-
- * include/am_compat.h: more compatibility options: define "ro"
- mnttab option all the time. Define "overlay" as needed. Added
- more fillers of mnttab options (as per Daniel S. Riley
- <dsr@mail.lns.cornell.edu>), for acdirmax, acdirmin, acregmax,
- acregmin, noac, grpid, nosuid, and actimo.
-
- * libamu/mount_fs.c (mnt_flags): fixed a typo in "ro" option as
- per dsr@mail.lns.cornell.edu (Daniel S. Riley). Then cleaned up
- the same code for other options in struct opt_tab.
-
-Mon Jul 14 22:36:37 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/get_args.c (get_args): moved amd.conf file parsing to before
- the switching the default log/debug options. Suggested by
- dsr@mail.lns.cornell.edu (Daniel S. Riley).
-
- * aux/update_build_version: new script to record the build version
- of amd, along with the rest of the info thet comes up with amd -v.
-
-Sun Jul 13 00:30:24 1997 Erez Zadok <ezk@decca.damtp.cam.ac.uk>
-
- * aux/macros/os_cflags.m4: new macro, to add additional
- compilation options (also used during configuration), based on the
- OS and the compiler. Used for solaris-2.6, osf, and irix6.
-
-Fri Jul 11 10:15:11 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/conf_tok.l, conf_parse.y: allow values of keys to include
- white spaces, if they are double-quoted (key="some value")
-
- * amd/info_hesiod.c (hesiod_search): cleanup and minor bug fixes
- of hesiod from Danny Braniss <danny@cs.huji.ac.il>.
-
-Fri Jul 11 02:16:06 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a7 ***
- *******************************************************************
-
-Thu Jul 10 12:19:25 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * include/am_defs.h: fill in extern definition of innetgr() in
- case system headers don't.
-
- * aux/macros/path_prog_lex.m4 aux/configure.in: using macros that
- will show the full pathname to yacc/bison and f/lex. Some systems
- have older or bad versions of those and this way the user will
- know for sure what is being invoked.
-
- * tasks: file populated with todo items.
-
- * scripts/amd2ldif.in: Script to convert amd maps to plain text
- LDAP object files. Contributed by Leif Johansson
- <leifj@matematik.su.se>.
-
- * aux/config.guess: added recognition for sun3's running 4.2bsd,
- from Tom Schmidt <tschmidt@micron.com>. Fixed one small typo.
-
- * amd/conf.c: several variables that were local to a map, were
- also added to [global], where they apply to all maps. Each map
- can then individually override those defaults. Flags
- affected: browsable_dirs and mount_type. Options affected:
- map_type, map_options, and search_path.
-
- * amd/amd.h: eliminated several global flags each of which took an
- int, in favor of one global flags variable used as a bit field.
-
- * amd/amd.c (init_global_options): moved all global variables into
- a single struct amu_global_options, so it is easier to add new
- ones and/or identify existing ones.
-
- * amd/get_args.c (get_args): removed unused amd -m option.
-
- * amd/conf.c (gopt_cluster): added new amd.conf option for cluster
- name, same as amd -C.
-
- * amd/info_ldap.c: LDAP info map functions from Leif Johansson
- <leifj@matematik.su.se>.
-
- * amd/conf.c (gopt_ldap_base, gopt_ldap_hostports): put in global
- amd.conf options for ldap_base and ldap_hostports.
-
- * amd/opts.c (f_netgrp): new amd map function netgrp(ARG) to test
- if the current host is in the ARG host netgroup.
-
- * aux/configure.in: some systems replaced dbm in libc with GNU's
- libgdbm, so check for libgdbm, but only if dbm_open is not in
- libc already. This was a recommendation from Tom Schmidt
- <tschmidt@micron.com>.
-
- * conf/nfs_prot/nfs_prot_sunos5_3.h: port to sparc-sun-solaris2.3
- completed.
-
-Wed Jul 9 18:14:59 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * port to sparc-unknown-netbsd1.2E done, not tested. Includes NFS
- V.3.
-
-Tue Jul 8 17:35:07 1997 Erez Zadok <ezk@elk.mcl.cs.columbia.edu>
-
- * port to i386-unknown-freebsd3.0 done and working. Includes NFS
- V.3.
-
- * aux/macros/check_nfs_fh_dref.m4: freebsd3 should use
- file handle dereferencing style similar to freebsd22.
-
- * include/am_defs.h: need to include <net/if_var.h> before
- <netinet/if_ether.h> on freebsd3.
-
- * conf/nfs_prot/nfs_prot_freebsd3.h: new protocol header additions
- for freeBSD 3.0.
-
-Tue Jul 8 16:53:41 1997 Erez Zadok <ezk@moisil.cs.columbia.edu>
-
- * amd/info_nis.c (nis_reload): cast nis' callback function so
- picky compilers won't complain.
-
- * libamu/xdr_mountres3.c (xdr_mountres3): make sure this function
- gets compiled only if the system has NFS V3 and does not have
- xdr_mountres3.
-
-Tue Jul 8 12:42:03 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * COPYING: put in some legal stuff in this file.
-
-Mon Jul 7 19:10:44 1997 Erez Zadok <ezk@prometheus.soscorp.com>
-
- * NFS V3 now works under Irix5, thanks to patches from
- Andreas Stolcke <stolcke@speech.sri.com>.
-
- * conf/mount/mount_irix5.c: sparate mount_irix.c into an irix5
- version and an irix6 version, since irix5's NFS V3 code is broken
- and hacky.
-
- * amd/info_hesiod.c (hs_zone_transfer): minor fixes to buffer
- sizes for some hesiod queries. Patch from Danny Braniss
- <danny@cs.huji.ac.il>.
-
-Mon Jul 7 19:04:14 1997 Erez Zadok <ezk@glory.soscorp.com>
-
- * amd/ops_nfs.c (mount_nfs_fh): fixed NFS V.3 support for bsdi3.
-
-Sun Jul 6 14:22:24 1997 Erez Zadok <ezk@glory.soscorp.com>
-
- * aux/{configure.in,acconfig.h}: added checks for struct
- nfs_args's fields proto and sotype (bsdi3).
-
- * amd/ops_nfs.c (mount_nfs_fh): added nfsv3 option to
- nfs_args.flags for bsdi3. Set field proto to 0. Set sotype field
- to SOCK_STREAM or SOCK_DGRAM.
-
- * aux/macros/check_mount_style.m4: add case for bsdi3.
-
- * amd/info_hesiod.c: got hesiod support for bsdi3.
-
-Sun Jul 6 11:14:47 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: look for hesiod on libc (bsdi3)
-
- * amd/get_args.c (get_args): reformat usage so it fits in 80
- columns.
-
- * scripts/ctl-amd.in: changed directory name for optional tftpboot
- map to /tftpboot/.amd.
-
-Sat Jul 5 17:46:45 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a6 ***
- *******************************************************************
-
-Sat Jul 5 03:17:09 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-amd.in: include -T tag for tftpboot.
-
- * new port: mips-sgi-irix5.3. Compiled with gcc, but NFS V3 code
- is broken and needs work on the specific nfs_args that irix5 uses
- for V3 mounts.
-
-Sat Jul 5 01:44:25 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/get_args.c (get_args): new options amd -T tag. A map with
- tag=foo matching the -T tag will be processed. All untagged maps
- get processed all the time.
-
-Fri Jul 4 16:19:26 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: need to check for strcasecmp in libucb (ncr2)
-
- * aux/macros/check_os_libs.m4: a new macro to set the usage of
- libnsl and libsocket based on the OS.
-
- * libamu/mount_fs.c (mnt_flags): used MNTTAB_OPT_GRPID if it is
- defined (problem on osf4).
-
- * conf/nfs_prot/nfs_prot_irix5.h: new file for irix5 headers.
-
- * include/am_defs.h, aux/macros/try_compile_nfs.m4,
- aux/macros/mount_headers.m4: do include <sys/proc.h> because it
- failes on irix5. Rather, put in the individual
- conf/nfs_prot/nfs_prot_*.h headers.
-
- * amd/conf.c: AIX3 doesn't like strdup() being passed a constant
- char*, so cast all strdup()'s args to a non-const char*.
-
- * amd/mapc.c (root_newmap): don't try to strdup only a "const
- char *".
-
-Fri Jul 4 15:47:10 1997 Erez Zadok <ezk@americas.psl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos4.h: added rpc/rpc.h and
- sys/errno.h.
-
-Thu Jul 3 17:49:00 1997 Erez Zadok <ezk@prometheus.soscorp.com>
-
- * made sure am-utils compiles, links, and runs properly on Irix
- 6.2 using "cc -32 -Wl,-woff,"
-
- * aux/macros/check_lib2.m4: a bug fix version to autoconf 2.12
- AC_CHECK_LIB. If OTHER-LIBRARIES are defined and used, then add
- them to $LIBS.
-
- * aux/configure.in: some cleanup of which libraries are needed.
- Espectially ensure that libnsl is included only on Solaris, where
- so far it is the only system on which it is absolutely necessary.
- Also no longer need to include libc explicitly.
-
- * amd/amd.c,wire-test/wire-test.c (main): convert IP address to
- network-long order before printing it.
-
- * wire-test/wire-test.c (main): also check and report on the IP
- address of the local host, since some systems have bad versions of
- get_myaddress, or ones that conflict with other versions in
- multiple libraries (SunOS 4 and Irix especially).
-
-Wed Jul 2 18:19:02 1997 Erez Zadok <ezk@starblazers.soscorp.com>
-
- * scripts/ctl-amd.in: don't use full pathname so killproc() works
- better. Also run bsd44 and irix style ps programs.
-
- * aux/macros/check_lib_funcs.m4: bug fixed: used to define usage
- of library no matter if it was found or not.
-
-Wed Jul 2 02:11:48 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/macros/check_mnt2_gen_opt.m4: turned back on the checking
- for M_* macros, but ensure that <sys/stream.h> is not included at
- all so it won't conflict with other M_* macros.
-
-Tue Jul 1 21:16:51 1997 Erez Zadok <ezk@mako.cs.columbia.edu>
-
- * conf/mount/mount_irix.c (mount_irix): first arg to mount(2) on
- irix should be "spec" (host:/path), not the dir of the mnt point.
-
- * amd/ops_afs.c (afs_lookuppn): bug in enable_default_selectors
- fixed. If on, it essentially ignored the setting in a
- selector-controlled /defaults if there were 2 or more entries in it.
-
-Tue Jul 1 12:23:38 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/ctl-{amd,hlfsd}.in (killproc): if failed to find process
- using BSD style ps, then try SVR4 style ps.
-
- * include/am_utils.h (amuDebug): renamed Debug macro to amuDebug
- etc., to avoid conflicts with similar named macros in <ldap.h>.
-
- * aux/configure.in, amd/info_ldap.c, etc.: put in all the autoconf
- support needed for LDAP. Now the code has to be written mostly in
- amd/info_ldap.c.
-
- * Included additional patches from Andreas Stolcke
- <stolcke@speech.sri.com> to support using the best possible
- combination of NFS version (2,3) and protocol (udp,tcp) for any
- given host, since it appears that some Irix versions have NFS V3,
- but do not support TCP.
-
- * scripts/ctl-amd.in: updated amd control script to look for and
- use amd.conf file.
-
-Tue Jul 1 00:28:23 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/mapc.c (mapc_create): now, each map in the amd.conf can be
- initialized off of a different type, or default to cycling through
- all maps until one of them matches.
-
-Mon Jun 30 20:49:13 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/ops_afs.c (afs_readdir): per-map browsing (readdir) done.
- if browsable_dirs=yes is set in the map section in amd.conf, that
- map will return all entries back to a readdir(2).
-
-Sun Jun 29 16:22:11 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * rudimentary amd.conf file support included. You may even
- override things like os=sos5, to get "backwards" compatibility with
- upl102.
-
-Sat Jun 28 13:35:02 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/conf.c: new file to process amd.conf file.
-
- * amd/get_args.c (get_args): new options -H to print help.
-
- * moved enable_default_selectors to be amd.conf controlled, and
- not compiler controlled.
-
- * amd/get_args.c (get_args): new options -F <conf-file> to parse an
- amd configuration file.
-
-Wed Jun 25 23:15:42 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * converted all files that used strcmp() == 0 or != 0 to using
- the STREQ() macro.
-
-Mon Jun 23 22:31:14 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * aux/macros/check_lib_funcs.m4: new M4 macro that can be used to
- search for any number of functions in any given library.
-
-Mon Jun 23 01:04:23 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/mapc.c: Included patch from Leif Johansson
- <leifj@matematik.su.se> to ensure that systems without an RE
- library can compile.
-
- * libamu/mount_fs.c (mount_fs): Included patch from Andreas
- Stolcke <stolcke@speech.sri.com>, to ensure that mount options on
- table are properly delimited by a comma.
-
- * amd/ops_nfs.c (mount_nfs_fh): Included patch from Andreas
- Stolcke <stolcke@speech.sri.com>, to allow users to override the
- proto= and vers= mount options.
-
-Sun Jun 22 01:00:11 1997 Eric Dana (edana@ncr2.bgs.com)
-
- * conf/nfs_prot/nfs_prot_svr4.h: port completed to
- i486-ncr-sysv4.3.03. Assorted source cleanups done.
-
- * include/am_defs.h, aux/macros/mount_headers.m4: don't include
- mnttab.h if sys/mnttab.h was already included, because on ncr2,
- they contain conflicting entries for struct mnttab.
-
-Sat Jun 21 23:52:15 1997 Eric Dana (edana@ncr2.bgs.com)
-
- * aux/macros/check_nfs_prot_headers.m4: added support for ncr2.
-
-Fri Jun 20 06:14:17 1997 Erez Zadok <ezk>
-
- * amd/*.c: lots of 64-bit "ugly" ports like casts to long ints.
-
- * aux/macros/struct_nfs_fh.m4: check for "struct nfssvcfh" because
- on DU-4.0 it is better than the next one to be picked (nfsv2fh_t).
-
-Wed Jun 18 18:59:49 1997 Erez Zadok <ezk@defiant.soscorp.com>
-
- * aux/macros/struct_nfs_fh.m4 (AC_TRY_COMPILE_NFS): check for
- nfsv2fh_t before fhandle_t becasue on bsdi2.1 the former is
- better.
-
-Tue Jun 10 17:06:58 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/rpc_fwd.c (fwd_packet): TLI bug fix. if fwdto socket is
- NULL, set the maxlen and len fields in netbuf to zero.
-
-Wed May 28 22:52:28 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/fix-amd-map.in (name): replace all matching patterns on
- line.
-
-Sun May 25 19:33:41 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a5 ***
- *******************************************************************
-
-Sun May 25 13:37:24 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/amq_subr.c (amqproc_getvers_1_svc): amq's RPC service
- procedure now returns the full string that amd -v returns.
-
- * amd/get_args.c (get_version_string): new function to return
- complete version/info string so it could be used more flexibly.
-
- * amd/am_ops.c (ops_showamfstypes, ops_showfstypes): put the list
- of Fs types into a string buffer, rather than a FILE*.
-
- * amd/mapc.c (mapc_showtypes): put the list of map types into a
- string buffer, rather than a FILE*.
-
-Sun May 25 01:25:36 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/get_args.c (get_args): amd -v also prints user who built
- amd, hostname built on, and date of configuration.
-
-Sat May 24 13:40:50 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * scripts/lostaltmail.conf-sample: sample lostaltmail
- configuration file.
-
- * scripts/lostaltmail.in: new script lostaltmail used to redeliver
- "lost" mail that hlfsd redirected to a temp location because the
- primary home file system of the user was full.
-
- * scripts/amd2sun.in: new script amd2sun. Used to convert Sub
- automount maps to amd maps.
-
- * scripts/ctl-hlfsd.in: new script ctl-hlfsd. Used to start,
- stop, or restart hlfsd.
-
- * scripts/expn.1: man page for expn command.
-
- * scripts/ctl-amd.in: new script ctl-amd. Used to start, stop, or
- restart amd.
-
- * scripts/expn.in: new script expn. Actually taken from David
- Muir Sharnoff <muir@idiom.com>. Used by hlfsd's mail re-delivery
- script.
-
- * scripts/wait4amd.in: new script wait4amd added. Waits for amd
- to come up on a host, and then runs a command (rsh $hostname by
- default).
-
- * scripts/Makefile.am: new directory now holds all shell/perl
- scripts that belong to am-utils.
-
- * conf/mount/mount_linux.c (parse_opts): new parser for
- linux-specific mounts. Handles fs-type specific mount-options
- correctly. Currently implemented: msdos, iso9660.
-
- * amd/ops_pcfs.c (pcfs_ops): don't timeout pcfs mounts by default
- (fix for linux).
-
- * amd/ops_cdfs.c (cdfs_ops): don't timeout cdfs mounts by default
- (fix for linux).
-
- * amd/mapc.c (make_entry_chain): fixed bug that resulted in amd
- core dumps upon "ls" of a mount point; an invalid pointer was
- being returned and dereferenced.
-
- * port to Linux sparc working!
-
- * hlfsd/homedir.c (hlfsd_diskspace): close file descriptor if
- failed to write test file, or else the fd will leak.
-
-Sun May 18 00:42:41 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_hesiod.c (hs_strip_our_domain): use strcasecmp()
- instead of strcmp().
-
- * Port to Digital Unix 4.0 (OSF) done.
-
- * hlfsd/hlfsd.c: renamed dirname to dir_name to avoid conflicts
- with dirname() function in <string.h> on OSF systems.
-
- * fsinfo/fsi_util.c (set_ether_if): take out extern definition of
- inet_addr(). It should come from <arpa/inet.h> instead.
-
- * conf/mtab/mtab_osf.c: fixed macros and added NFS V3 specs.
-
- * include/am_utils.h: renamed FIRST/LAST to AM_FIRST/AM_LAST to
- avoid conflicts with DU 4.0 system header.
-
-Thu May 15 22:49:12 1997 Erez Zadok <ezk@subzero.cs.columbia.edu>
-
- * libamu/mount_fs.c (mount_fs): pass along NFS version so I can
- determine if to include additional options in the mount table file
- entry (such as proto=tcp, and vers=3).
-
-Thu May 15 00:42:12 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * libamu/mount_fs.c (mount_fs): include NFS version number in the
- mount table options, as well as proto={tcp,udp}.
-
-Wed May 14 14:30:19 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * NFS V3 code ported to most other systems, so it compiles for V2
- and V3 NFS systems.
-
- * NFS VERSION 3 support, first pass. Working for Solaris and
- using TCP.
-
-Sun May 11 01:14:29 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * amq/amq.c: many newline characters were missing from various
- stderr printfs.
-
-Sat May 10 13:09:06 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_sunos5.h: protocol defintions for
- Solaris, which include NFS V3 support.
-
- * conf/nfs_prot/nfs_prot_default.h: default NFS protocol headers.
-
- * conf/transp/transp_{tli,sockets}.c (get_mount_client): use NFS
- protocol version while getting a mount client.
-
- * amd/ops_nfs.c (mount_nfs_fh): set the mount types, mnttab types,
- file handle size, and proper file handle based on the correct NFS
- version number.
-
- * conf/mount/mount_svr4.c (mount_svr4): support NFS3 mounts under
- Solaris and other SVR4 systems.
-
- * amd/ops_nfs.c: store NFS file handle version and version
- specific handle in struct fh_cache.
- (got_nfs_fh): pick the correct RPC reply based on the NFS version
- of the server.
- (prime_nfs_fhandle_cache): figure out the right NFS file handle
- for a node, but now include NFS protocol version information.
- (call_mountd): set the correct version for the mount protocol,
- based on the NFS protocol version.
- (nfs_init): use the NFS protocol generic structure
- am_nfs_handle_t.
-
- * include/am_utils.h: new structure am_nfs_handle_t to contain all
- possible versions of NFS file handles.
-
- * amd/srvr_nfs.c (start_ping): ping program performs NFS version
- specific pings.
- (recompute_portmap): figure out the correct portmap version mount.
- (nfs_keepalive): call start_ping() with the correct NFS version.
- (find_nfs_srvr): if mount option "vers=" is given, use it. Get
- the NFS server version and verify that it is up.
-
- * conf/transp/transp_{tli,sockets}.c (get_nfs_version): a new
- function to find the best NFS version for a particular host.
-
- * libamu/amu.h: determine what is the highest version of NFS we
- should try.
-
- * include/am_utils.h (NFS_VERSION3): added definition for NFS V3
- protocol number.
- Added field fs_version to struct fserver, so we can now store the
- server protocol version.
-
-Fri May 9 01:09:45 1997 Erez Zadok <ezk@lorien.cs.columbia.edu>
-
- * aux/macros/check_field.m4 (AC_MOUNT_HEADERS): map '.' (dot) into
- underscores too, so I can test for sub-fields.
-
- * libamu/wire.c: use test that checks for sub-fields of struct
- ifreq.
-
-Sat May 6 10:20:17 2000 Erez Zadok <ezk@glory.soscorp.com>
-
- * port to BSD/OS 3.0 completed! Many xdr_ functions were broken
- into smaller files. M4 macros fixed to test for existence of
- file systems using getvfsbyname().
-
- * amd/sched.c (sigchld): signal handler must waitpid() for all
- possible children.
-
- * hlfsd/homedir.c: signal handler must waitpid() for all possible
- children.
-
- * aux/macros/check_restartable_signals.m4: new macro to determine
- if need to reinstall signal handlers per OS is better than trying
- to figure these out based on system macros.
-
-Fri May 5 19:23:28 2000 Erez Zadok <ezk@glory.soscorp.com>
-
- * amd/ops_nfs.c (mount_nfs_fh): set nfs_args_t version number.
-
- * amd/ops_afs.c (mount_toplvl): set nfs_args_t version number.
-
- * amd/ops_nfs.c (mount_nfs_fh): process nfs mount option resvport
- (must be supplied for bsdi 3.0)
-
- * libamu/wire.c: use HAVE_FIELD_STRUCT_IFREQ_IFR_ADDR (and
- associated new macro) for determining the right way to compute the
- size of the interface structure.
-
-Fri Apr 11 15:56:13 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * aux/configure.in: need to include libc before libnsl if
- get_myaddress() is available because on irix libnsl has a buggy
- get_myaddress().
-
- * include/am_defs.h: make sure REINSTATE_SIGNAL_HANDLER is defined
- on Irix 6 (an SVR4 variant)
-
-Thu Mar 27 02:28:40 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a4 ***
- *******************************************************************
-
-Wed Mar 26 21:15:36 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/amq_subr.c (ok_security): turned off insecure code unless
- user explicitly runs configure --enable-amq-mount.
-
- * hlfsd/hlfsd.c (main): use new protoypes dor create_nfs_service().
-
- * amd/nfs_start.c (mount_automounter): use code that separately
- creates the NFS and the amq service. Register tcp and udp
- services for amd.
-
- * conf/transp/transp_*.c (create_amq_service): new function to
- separately create the amq service for amd. Simplified prototypes
- for create_nfs_service().
-
-Wed Mar 19 20:40:56 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a3 ***
- *******************************************************************
-
-Wed Mar 19 17:49:18 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * new port: rs6000-ibm-aix3.2.5 and rs6000-ibm-aix4.1.5.0. Lots
- of small changes to support these two.
-
-Wed Mar 19 14:33:30 1997 Erez Zadok <ezk@grande.cs.columbia.edu>
-
- * conf/umount/umount_default.c (umount_fs): bug: unlock_mntlist()
- should run if MOUNT_TABLE_ON_FILE, not otherwise.
-
-Mon Mar 17 22:02:43 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * hlfsd/hlfsd.c (main): fill in fhsize field if exists
- (freebsd-2.2).
-
- * amd/ops_{nfs,afs}.c (mount_toplvl): fill in fhsize field if
- exists (freebsd-2.2).
-
-Sat Mar 15 19:37:48 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * new port: i386-unknown-freebsd2.2. FreeBSD 2.2 and higher
- changed the filehandle type in struct nfs_args from nfsv2fh_t to
- u_char.
-
-Sat Mar 14 10:11:03 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * SHARED LIBRARIES: too many changes to list individually. Now,
- libamu can be built as a shared library, and other programs link
- with it.
-
-Tue Mar 11 22:24:09 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * aux/macros/opt_shared.m4: new macro for setting options for
- building shared am-utils libraries.
-
-Sun Mar 9 19:17:46 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * fixmount/fixrmtab: cleaned up the script.
-
- * fixmount/Makefile.am (EXTRA_DIST): adde $(sbin_SCRIPTS) so that
- fixrmtab gets distributed too.
-
- * conf/nfs_prot/nfs_prot_bsdi2.h: added support for MOUNTPROC_DUMP.
- Added extern for xdr_mountlist().
-
- * aux/configure.in: trimmed down many tests for MNT2_GEN_OPT,
- MNT2_NFS_OPT, and MNTTAB_OPT that were not referenced anywhere in
- the sources.
-
-Sat Mar 8 00:23:58 1997 Erez Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * fixmount/hlfsd ported to bsd44, hpux, and linux systems.
-
- * aux/macros/check_fixmount_style.m4: add check for bsd44 systems.
-
- * conf/fixmount/fixmount_default.c: use lockf() if flock() is
- unavailable.
-
- * include/am_defs.h: include <string.h> even if don't have
- STDC_HEADERS defined (sunos4).
- (seteuid): define seteuid() to be setresuid() for systems that
- have but not the other (hpux).
-
- * aux/macros/check_extern.m4: test should include <strings.h>.
-
-Tue Mar 4 17:16:52 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * lib/xutil.c (debug_option): moved from amd/getargs.c to this
- more proper file.
-
- * include/am_utils.h: put in structure for debug options, for all
- progams to use.
-
- * amd/get_args.c: moved structure for debug options out.
-
-Sun Mar 2 00:13:07 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * ported fixmount.
-
- * lib/ualarm.c: replacement function for systems that don't have a
- ualarm().
-
- * ported fsinfo.
-
-Sun Mar 1 10:23:34 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * ported mk-amd-map.
-
- * buildall: added -K option to buildall, to run mkconf.
-
-Fri Feb 28 01:10:25 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a2 ***
- *******************************************************************
-
-Thu Feb 27 13:58:59 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * all *.[hcyl] files: add copyright line.
-
- * aux/macros/check_mount_type.m4: test for mount type for
- linux-like systems, by checking for loadable or statically linked
- kernel filesystem modules.
-
- * aux/macros/check_mnttab_type.m4: test for mount table entry
- for linux-like systems, by checking for loadable or statically
- linked kernel filesystem modules.
-
- * aux/configure.in: pcfs filesystems can use vfat type (linux)
-
- * aux/macros/check_fs_mntent.m4: test for filesystem existence for
- linux-like systems, by checking for loadable or statically linked
- kernel filesystem modules.
-
- * conf/trap/trap_hpux.h: ugly hack added because of stupide HPUX
- 9.0 header files. This should be removed when HPUX 9.0 is deemed
- defunct.
-
- * aux/acconfig.h: set an undefined variable for having an extern
- to clnt_sperrno().
-
- * include/am_defs.h: define extern for clnt_sperrno() if needed.
-
- * aux/configure.in: test for extern clnt_sperrno().
-
- * aux/macros/check_nfs_fh_dref.m4: HPUX's NFS fhandle dref is
- similar to irix.
-
- * aux/macros/check_mount_style.m4: use mount helper on HPUX.
-
- * aux/macros/check_mtype_type.m4: hpux's mount type is a char*,
- not integer (but may be mapped to one later).
-
- * conf/mount/mount_hpux.c (mount_hpux): HPUX has confusing header
- files. They have mount(2) and vfsmount(2) which don't take same
- arguments, and they have string mount types MNTTYPE_* as well as
- integer types MOUNT_*. So I need this new mount function to map
- from string types to integer types for the vfsmount() function.
-
- * conf/trap/trap_hpux.h (MOUNT_TRAP): instead of calling
- vfsmount(), call mount_hpux().
-
-Thu Feb 27 03:34:14 1997 Erez "HWank1" Zadok <ezk@okeeffe.cs.columbia.edu>
-
- * lib/mount_fs.c (mnt_flags): make sure SYNC option is on only if
- both MNTTAB_OPT_SYNC and MNT2_GEN_OPT_SYNC are defined.
-
-Thu Feb 27 00:26:00 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/nfs_prot/nfs_prot_hpux.h: NFS protocol definitions for
- hpux.
-
- * include/am_defs.h: no need to include rpc/auth.h or rpc/clnt.h.
-
- * aux/configure.in: no need to test for rpc/auth.h and rpc/clnt.h.
-
- * buildall: added ability to configure using other shells than
- /bin/sh, on those systems where /bin/sh is buggy or limited
- (HPUX).
-
- * aux/macros/struct_nfs_fh.m4: reinstated the macro but have it
- defined am_nfs_fh, and also test for plain typedef "nfs_fh".
-
- * aux/acconfig.h: #undef am_nfs_fh, which is being defined by a
- reinstated macro.
-
- * aux/configure.in: check for <nfs/export.h>
-
- * include/am_defs.h: include <nfs/export.h> (HPUX) if exists.
-
- * aux/macros/try_compile_nfs.m4: include <nfs/export.h> (HPUX) if
- exists.
-
- * aux/macros/mount_headers.m4 (define): removed some non-working
- (on HPUX) code that attempts to recreate the fhandle_t rather than
- load it up from system headers. Also added some NFS protocol
- header inclusion. include <nfs/export.h> (HPUX) if exists.
-
-Wed Feb 26 00:32:35 1997 Erez "HWank1" Zadok <ezk@okeeffe.cs.columbia.edu>
-
- * aux/macros/mount_headers.m4 (define): Use M4 changequote to
- ensure [] brackets are correctly used.
-
- * aux/macros/expand_cpp_{string,hex,int}.m4: encapsulate
- multi-line M4 inclusions in [].
-
-Tue Feb 25 22:19:44 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * conf/mtab/mtab_bsd.c (mnt_dup): use statfs field f_fstypename if
- it exists.
-
- * aux/acconfig.h: HAVE_FIELD_STRUCT_STATFS_F_FSTYPENAME, new
- config.h macro for field f_fstypename of struct statfs.
-
- * aux/configure.in: testing for field f_fstypename field of struct
- statfs (NetBSD).
-
- * aux/acconfig.h: moved all of the "static" definitions out to a
- fixed file called include/am_defs.h. Added to all */Makefile.am
- files a dependency on am_defs.h. Created am_defs.h of course, and
- then added #include <amd_defs.h> to all of the source and header
- files that required it.
-
-Mon Feb 24 01:27:02 1997 Erez Zadok <ezk@defiant.soscorp.com>
-
- * aux/acconfig.h: two more externals for xdr functions that may be
- implemented by libamu.
-
- * conf/nfs_prot/nfs_prot_bsdi2.h: added missing RPC and XDR
- definitions.
-
-Sun Feb 23 15:25:26 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * buildall (default): added -D option for turning on even stricker
- developer options.
-
- * */Makefile.am: make sure @AMU_NFS_PROT_HEADERS@ is used to
- determine dependencies on optional NFS protocol headers.
-
- * aux/acconfig.h: define and use HAVE_NFS_PROT_HEADERS as needed.
-
- * aux/macros/check_nfs_prot_header.m4: new test to determine what
- NFS protocol headers to use.
-
- * conf/nfs_prot/nfs_prot_{irix6,sunos4,bsdi2}.h: new headers to
- complete missing system headers for NFS protocol definitions.
-
-Sun Feb 16 15:58:42 1997 Erez "HWank1" Zadok <ezk@vir.cs.columbia.edu>
-
- * amd/ops_nfs.c (mount_nfs_fh): encapsulated some more code in
- #ifdef's as needed.
-
- * amd/ops_afs.c (mount_toplvl): make sure TIMEO/RETRANS code is
- suitable #ifdef'ed.
-
- * include/am_compat.h: a couple more mnttab options
- (timeo/retrans) setting just in case.
-
- * amd/autil.c (host_normalize): make sure hostent->h_name is
- passed a non-const char *.
-
- * conf/mount/mount_linux.c (mount_linux): cleaned up a block of code.
-
- * {lib,amq,amd}/*.c (many functions): cast xdr_entry to
- XDRPROC_T_TYPE.
-
- * lib/nfs_prot_svc.c (nfs_program_2): cast xdr_entry to
- XDRPROC_T_TYPE.
-
- * lib/nfs_prot_xdr.c (xdr_entry): cast xdr_entry to
- XDRPROC_T_TYPE.
-
- * lib/wire.c (getwire): Make sure safe assignment from const to
- none is done.
-
-Sat Feb 15 19:38:51 1997 Erez "HWank1" Zadok <ezk@vir.cs.columbia.edu>
-
- * aux/macros/expand_cpp_int.m4: new macro for expanding integers.
-
- * aux/configure.in: added linux/fs.h support in configure and
- several M4 macros.
-
- * conf/mount/mount_linux.c (mount_linux): use macro instead of
- "ugly" fixed hex number for mount() arguments.
-
-Sat Feb 15 02:09:47 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/info_hesiod.c: removed macro HAVE_HS_ZONE_TRANSFER and
- turned all of its code always on. That code always seems to
- compile, as long as you have hesiod and libresolv.
-
- * amd/mapc.c: removed macro HAVE_HS_ZONE_TRANSFER and turned all
- of its code always on.
-
- * aux/configure.in: removed superfluous test for hs_zone_transfer
- function (will never find it because it is an amd-internal
- function).
-
- * amd/mapc.c (maptypes): must used correct new name for am-utils'
- hesiod initialization function: hesiod_am_init.
-
- * amd/info_hesiod.c (hesiod_am_init): renamed hesiod_init to
- hesiod_am_init so as not to conflict with libhesiod's
- hesiod_init() function.
-
- * aux/configure.in: added test and explicit inclusion of
- libresolv.a for later resolution of library references with
- libhesiod.
-
- * aux/macros/opt_cppflags.m4: new file. configure/compile C
- preprocessor flags.
-
- * aux/macros/opt_libs.m4: new file. configure/compile library
- flags.
-
- * Makefile.am (EXTRA_DIST_AUX): include two new macros
- opt_cppflags.m4 and opt_libs.m4.
-
- * aux/configure.in: test for libhesiod needs to additional
- libresolv to link completely. Additional configuration time
- options added for setting initial CPPFLAGS and LIBS.
-
-Tue Feb 10 02:15:40 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- *******************************************************************
- *** Released am-utils-6.0a1 ***
- *******************************************************************
-
-Thu Feb 6 02:55:19 1997 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * amd/info_ndbm.c (ndbm_search,ndbm_init): fixed the code so that
- it works on freebsd, where they map dbm_pagfno a non-existing
- macro on purpose, to force you to port the code to Berkeley DB.
-
-Fri Jan 31 01:35:09 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/ops_afs.c (mount_toplvl): added a sleep(1) right before the
- actual mount_toplvl, to avoid some possible race conditions.
-
-Thu Jan 30 02:31:49 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/rpc_fwd.c: removed all TLI (HAVE_T_OPEN) code.
-
-Wed Jan 29 18:25:07 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * lib/wire.c (getwire): removed HAVE_T_OPEN (TLI code)
-
- * amd/amd.c (main): fix local address using htonl(). Free up
- buffers allocated by netdir_*() functions.
-
-Wed Jan 22 23:53:24 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/fix-amd-map.in: new script that will convert old-style amd
- maps to new one.
-
-Tue Jan 21 01:18:16 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * FIRST AMD IN AM-UTILS FINALLY WORKS (mounts itself as toplvl,
- and replies back to simple nfs/link type mount queries).
-
- * conf/mtab/mtab_svr4.c: reorganized the code in this file to be
- easier to read, and fixed a few bugs with un/setting the lock file
- descriptor.
-
-Wed Jan 8 15:27:49 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/sched.c: removed HAS_SVR3_SIGNALS code to handle older
- signals in Svr3 systems. Only stellix ever used this.
-
- * amd/rpc_fwd.c (fwd_reply): removed all code that was triggered
- by DYNAMIC_BUFFERS, since it was not in use.
-
-Tue Jan 7 00:45:59 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/opts.c (eval_opts): removed AMD_COMPAT code. Amd no longer
- takes '=' sign as old selector. Fix your maps.
- (deslashify): removed APOLLO code that treated two '//' as one.
-
-Sun Jan 5 01:25:09 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/ops_nfsx.c (nfsx_init): removed HARD_NFSX_ERRORS, code which
- was not used. It made any submount error fail the whole group.
-
- * amd/ops_nfs.c (make_nfs_auth): removed code dependent on
- HAS_NFS_QUALIFIED_NAMES.
- (mount_nfs_fh): removed macro for NFS_ARGS_NEEDS_PATH, assuming it
- is never on. So code that was triggered by #ifndef
- NFS_ARGS_NEEDS_PATH (osf1, aix3, and bsd44 variants) may have to
- be fixed later.
- Removed all ULTRIX_HACK code. Ultrix is DEAD!
- removed all PRESET_AC code, which was only on for Linux to preset
- the attribute cache values (otherwise they default to zero).
- (nfs_umounted): revobed KICK_KERNEL code (IRIX systems). Will
- have to fixed up later.
- (mount_nfs_fh): removed code that was never included, which
- attempted to set the port on which amd's nfs mounts on. This
- isn't supported by the ping algorithm yet. In any case, it is all
- done in nfs_init().
-
- * amd/srvr_nfs.c (find_nfs_srvr), amd/ops_nfs.c (mount_nfs_fh):
- removed HAS_TCP_NFS code. The whole use of NFS V.3 with TCP or
- specially hacked NFS V.2 that uses TCP (BSD 4.4 variants) will
- have to be addressed later.
-
- * amd/nfs_subr.c (nfsproc_getattr_2): removed all code dependent
- on PRECISE_SYMLINKS.
-
- * amd/mapc.c (mapc_meta_search): removed code that depended on
- HAS_DEPOT. It is known buggy code. The whole DEPOT support needs
- to be rethought.
- (mapc_add_kv): ported code to use standard regular expression
- (regexp) library.
-
- * amd/{map.c,ops_sfs.c,ops_ufs.c}: removed all code dependent on
- FLUSH_KERNEL_NAME_CACHE and the macro itself.
-
-Sat Jan 4 15:46:58 1997 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/map.c (exported_ap_alloc): removed all code triggered by
- SHRINK_EXPORTED_AP and the macro itself.
-
- * amd/info_nis.c: removed HAS_NIS_RELOAD macro, and left the code
- in all the time. Assuming that there is always NIS realod
- available.
- (yp_all_fixed): removed code for BROKEN_YP_ALL. If your yp_all()
- function is broken such that it does not release filedescriptors
- it created, then you are hosed. Get a fix for yp_all from your
- vendor or switch operating systems.
-
-Tue Dec 31 15:34:36 1996 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/info_hesiod.c: renamed macro HAS_HESIOD_RELOAD to
- HAVE_HS_ZONE_TRANSFER.
-
-Mon Dec 30 17:33:23 1996 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/{nfs,host}_ops.cremoved INFORM_MOUNTD macro, so its code is
- always included. We should always try to inform the remove mount
- daemon of mounts we performed. If we want an option for this, it
- should be a run-time option.
-
- * amd/host_ops.c: removed all that optionally did not make the
- directory mount points for amd.
-
- * HOST_EXEC code removed from everywhere. There is no indication
- that it was used anywhere. If it needs to be used, then a
- run-time switch should control it.
-
-Thu Dec 26 00:06:52 1996 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amd/*_ops.c: removed all references to mntent_t's fields
- mnt_freq and mnt_passno, since they are no longe rused (and never
- have been).
-
- * amd/am_ops.c: removed function sunos4_match, which was off
- anyway. This was one of the places where an '=' sign was allowed
- as an assignment operator (which is now ':=').
-
- * amd/afs_ops.c (afs_bgmount): removed SUNOS4_COMPAT code which
- was off anyway. This was one of the places where an '=' sign was
- allowed as an assignment operator (which is now ':=').
-
-Tue Dec 24 01:53:52 1996 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * amq/amq.c: ported to am-utils. Working.
-
- * conf/mount/mount_svr4.c (mount_svr4): changed mount type on svr4
- to be string, as it should be (rather than a string mapped to int
- and back mapped to string).
-
-Sun Dec 22 13:26:05 1996 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * lib/mount_fs.c (mount_fs): removed MNTINFO_PREF code.
-
- * lib/umount_fs.c: split this into three files: default, osf, and
- bsd44, that are in conf/umount/umount_*.c.
-
-Thu Dec 19 17:33:46 1996 Erez "HWank1" Zadok <ezk@lorien.cs.columbia.edu>
-
- * aux/configure.in, aux/aclocal.m4, aux/acconfig.h: added new
- macro to automatically figure out if an external definition for
- sys_errlist[] exists.
-
- * lib/xutil.c (xfree): removed "#undef free" because it's not
- needed there. Any system that redefines free() needs help.
-
- * conf/mtab/mtab_file.c (REWRITE_MTAB_IN_PLACE): removed code that
- was dependent on REWRITE_MTAB_IN_PLACE. It does not appear to be
- in active use anywhere. If added later, it should be a run-time
- configuration option.
-
- * conf/mtab/mtab_mach3.c: removed code that was #ifdef'ed not to
- be MOUNT_TABLE_ON_FILE, since mach2 always stores its mount tables
- in a file in /etc.
-
- * lib/util.c (str3cat): removed _AIX code. AIX should have a
- working realloc, or else find a cleaner solution to this.
- (mkdirs): removed SUNOS4_WORKAROUND code. This was to do a sync()
- after immediately making directories so that fsck will be able to
- fix the filesystem in the event of an immediate crash. This was
- because a bug in UFS which is fixed by now.
-
- * lib/hutil.c (domain_strip): removed PARTIAL_DOMAINS triggered
- code. Does not appear to be on and used anywhere.
- (dofork): removed MACH3 code, b/c mach3 NFS bugs are fixed by now.
-
- * lib/resvport.c: split the binding of reserved ports code to a
- separate file. A #define (HAVE_T_OPEN) separates the TLI (SVR4)
- from the BSD code.
-
-Thu Dec 19 02:08:35 1996 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * lib/Makefile.am (amu_LIBADD): includs @LIBOBJS@ now, auto-filled
- in by automake and configure, for optional sources that need to be
- built as part of libamu.a.
-
- * aux/aclocal.m4: Make sure AC_CHECK_MOUNT_STYLE adds mountutil.o
- to LIBOBJS.
-
- * lib/memcmp.c (memcmp): new file added to replace a possible bad
- implementation of memcmp.
-
-Wed Dec 18 22:20:23 1996 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * converted the sources to use memset/memmove/memcmp instead of
- bzero/bcopy/bcmp.
-
- * ran all sources through gnu Indent w/ options specified in
- aux/amindent.
-
-Wed Dec 11 22:19:29 1996 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- * At this point the initial generation of config.h via autoconf and
- some preliminary makefiles via automake is done. I will not begin
- modifying sources, so it's a good time to document from here.
-
-Wed Dec 10 22:19:29 1996 Erez "HWank1" Zadok <ezk@shekel.mcl.cs.columbia.edu>
-
- *******************************************************************
- *** Initial ChangeLog Entry ***
- *******************************************************************
diff --git a/contrib/amd/FAQ b/contrib/amd/FAQ
deleted file mode 100644
index 18e73a3fab20..000000000000
--- a/contrib/amd/FAQ
+++ /dev/null
@@ -1,69 +0,0 @@
- Am-utils Frequently Asked Questions
-
-Note: we started this FAQ only on March 15, 2005; so it's not long or
-comprehensive, yet. Amd is much older than that, and so there's a lot of
-information that's already available in other forms. If this FAQ doesn't
-answer your questions, see information in the following sources:
-
-1. The Am-utils book: http://www.am-utils.org/docs/amd-book/
-
-2. The Am-utils user manual, which is part of the distribution and is also
- available from www.am-utils.org.
-
-3. The www.am-utils.org Web site resources, especially the "am-utils" mailing
- list (and its archives).
-
-4. In the am-utils distribution (always use the latest ones), see all of the
- various README files (README, README.autofs, README.ldap, README.osx, and
- README.y2k). The "BUGS" file also lists useful information about bugs
- and problems with specific OSs which affect Amd. All of these text files
- are also available from www.am-utils.org.
-
-5. Some FAQ questions (including newbie questions) are available here:
- http://www.kernelcorp.com/resources_faqs.html
-
-6. Some problems are known bugs but have not been fixed yet: this are
- listed in bugzilla in https://bugzilla.am-utils.org/
-
-If you have additions to this FAQ, please let us know at
-am-utils@am-utils.org.
-
-Thank you,
-The Am-utils development team.
-
-<FAQ>
-
-*** Linux Questions
-
-Q1. When I use Amd with Autofs and I restart Amd, how come it cannot remount
- the Autofs partitions?
-
-A1. This is a limitation of the Linux Autofs kernel module (for both autofs
- v2. and v3). The Linux Autofs does not allow restarting automounted
- points. There's nothing Amd can do about this. In fact, the same
- problem exists if you use the userland "automount" daemon instead of
- Amd. Hopefully Autofs-v4 or the separate effort of Autofs-NG will
- address this serious problem.
-
- Note that Amd itself can restart autofs automounted points just fine on
- OSs that support it, for example Solaris.
-
-
-Q2. When I use Amd, I get this console message frequently: "mount version
- older than kernel." Is it a problem?
-
-A2. No, it's a harmless warning message that the Linux kernel prints for NFS
- mounts. The intent was to alert administrators that the kernel has
- supposedly a different version of the mount(2) code than a userland
- program used. This happens if you compile Amd against kernel headers
- that are different than the kernel you're running. If the message
- really bothers you, then one way to "fix" the problem is to recompile
- Amd against the same kernel headers as the running kernel.
-
- Nevertheless, it is a relatively useless message because as far as we
- know, the NFS v2 and v3 mount codes have been in perfect sync between
- the userland and kernel sides, and were "standardized" for years
- already. This warning message caused more unnecessary worry among
- administrators than helping alert them to legitimate problems.
-
-</FAQ>
diff --git a/contrib/amd/INSTALL b/contrib/amd/INSTALL
deleted file mode 100644
index 273fe02f4548..000000000000
--- a/contrib/amd/INSTALL
+++ /dev/null
@@ -1,124 +0,0 @@
- am-utils 6.1 compatibility list
-
-For each system, list if it autoconfigures, compiles, or runs. Fill in
-email id of person who confirms the fact. A missing entry means unverified.
-A 'no' or 'X' means verified broken or nonexistent (static library).
-
-SYSTEM CONFIG COMPILE RUN SHLIB AUTOFS
-========================= ======= ======= ======= ======= ======
-alpha-dec-osf4.0f ro ro ro - -
-alpha-dec-osf5.1 ro ro ro - -
-alpha-unknown-linux-gentoo1.4.16 ezk ezk ezk ezk -
-alphaev56-dec-osf4.0f ezk ezk ezk ezk -
-i386-apple-darwin6.0 ezk ezk ezk ezk -
-i386-pc-bsdi2.1 ion ion ion ion[X] ion[X]
-i386-pc-linux-deb3.0 ezk ezk ezk ezk -
-i386-pc-linux-deb3.1 ezk ezk ezk ezk -
-i386-pc-linux-fc1 ezk ezk ezk ezk -
-i386-pc-linux-fc2 ezk ezk ezk ezk -
-i386-pc-linux-fc3 ezk ezk ezk ezk -
-i386-pc-linux-fc4 ezk ezk ezk ezk -
-i386-pc-linux-gentoo1.4.16 ezk ezk ezk ezk -
-i386-pc-linux-rh6.2 ion ion ion ion ion
-i386-pc-linux-rh7.1 ion ion ion ion ion
-i386-pc-linux-rh7.2 ion ion ion ion ion
-i386-pc-linux-rh7.3 ion ion ion ion ion
-i386-pc-linux-rh8.0 ezk ezk ezk ezk -
-i386-pc-linux-rh9 ion ion ion ion ion
-i386-pc-linux-rhel3 ezk ezk ezk ezk -
-i386-pc-linux-rhel4 ezk ezk ezk ezk -
-i386-pc-linux-suse8.2 ezk ezk ezk ezk -
-i386-pc-linux-suse9.1 ezk ezk ezk ezk -
-i386-pc-linux-suse9.2 ezk ezk ezk ezk -
-i386-pc-linux-suse9.3 ezk ezk ezk ezk -
-i386-pc-solaris2.10 ro ro ro - -
-i386-pc-solaris2.9 ro ro ro - -
-i386-unknown-freebsd4.10 ezk ezk ezk ezk -
-i386-unknown-freebsd4.11 ezk ezk ezk ezk -
-i386-unknown-freebsd4.8 ezk ezk ezk ezk -
-i386-unknown-freebsd4.9 ezk ezk ezk ezk -
-i386-unknown-freebsd5.0 ezk ezk - ezk -
-i386-unknown-freebsd5.1 ezk ezk ezk ezk -
-i386-unknown-freebsd5.2 ezk ezk ezk ezk -
-i386-unknown-freebsd5.2.1 ezk ezk ezk ezk -
-i386-unknown-freebsd5.3 ezk ezk ezk ezk -
-i386-unknown-freebsd5.4 ezk ezk ezk ezk -
-i386-unknown-freebsd6 (BETA5) ezk ezk ezk ezk -
-i386-unknown-netbsd1.6A ezk ezk ezk ezk -
-i386-unknown-netbsdelf1.6.1 ezk ezk ezk ezk -
-i386-unknown-netbsdelf1.6.2 ezk ezk ezk ezk -
-i386-unknown-netbsdelf2.0 ezk ezk ezk ezk -
-i386-unknown-netbsdelf2.0.2 ezk ezk ezk ezk -
-i386-unknown-netbsdelf3.0 ezk ezk ezk ezk -
-i386-unknown-openbsd3.3 ezk ezk ezk ezk -
-i386-unknown-openbsd3.6 ezk ezk ezk ezk -
-i386-unknown-openbsd3.7 ezk ezk ezk ezk -
-i686-apple-darwin6.6 ezk ezk ezk ezk -
-ia64-hp-hpux11.20 ezk ezk ezk ezk -
-ia64-unknown-linux-rh2.1AS ezk ezk - ezk -
-ia64-unknown-linux-rh2.1AW ezk ezk ezk ezk -
-ia64-unknown-linux-rhel4 ezk ezk ezk ezk -
-mips-sgi-irix6.2 ro ro ro - -[3]
-mips-sgi-irix6.5 ro ro ro - -[3]
-mips-unknown-linux-gentoo1.4.16 ezk ezk ezk ezk -
-mipsel-unknown-linux-rhPS2 ezk ezk ezk ezk -
-powerpc-apple-darwin7.6.0 ezk ezk ezk ezk -
-powerpc-apple-darwin7.7.0 ezk ezk ezk ezk -
-powerpc-apple-darwin7.8.0 ezk ezk ezk ezk -
-powerpc-apple-darwin7.9.0 ezk ezk ezk ezk -
-powerpc-apple-darwin8.2.0 ezk ezk ezk ezk -
-powerpc-ibm-aix5.1.0.0 ion ion ion ion[X] ion[1,2]
-powerpc-ibm-aix5.2.0.0 ezk ezk ezk ezk -
-powerpc-ibm-aix5.3.0.0 ezk ezk ezk ezk -
-powerpc-unknown-linux-yellowdog2.3 ezk ezk ezk ezk -
-sparc-sun-solaris2.10 ro ro ro - -
-sparc-sun-solaris2.5.1 ion ion ion ion ion[1]
-sparc-sun-solaris2.6 ion ion ion ion ion
-sparc-sun-solaris2.7 ion ion ion ion ion
-sparc-sun-solaris2.8 ion ion ion ion ion
-sparc-sun-solaris2.9 ro ro ro - -
-sparc-unknown-linux-rh62 ion ion ion ion ion
-sparc64-unknown-linux-aurora10 ion ion ion ion ion
-sparc64-unknown-linux-deb3.0 ezk ezk ezk ezk -
-sparc64-unknown-linux-gentoo1.4.16 ezk ezk ezk ezk -
-sparc64-unknown-linux-rh62 ion ion ion ion ion
-sparc64-unknown-linux-suse7.3 ezk ezk - ezk -
-x86_64-unknown-linux-rh2.9.5AS ezk ezk ezk ezk -
-x86_64-unknown-linux-rh3.0.0AS ion ion ion ion ion
-
-
-EMAIL ID LEGEND:
-
-bking: Bevis R W King <B.King@ee.surrey.ac.uk>
-dsr: Dan Riley <dsr@mail.lns.cornell.edu>
-ezk: Erez Zadok <ezk@cs.columbia.edu>
-finkel: Raphael Finkel <raphael@cs.uky.edu>
-ion: Ion Badulescu <ion@cs.columbia.edu>
-jose: Jose Nazario <jose@biocserver.BIOC.CWRU.Edu>
-nrh: Nick Hall <nrh@dcs.ed.ac.uk>
-ro: Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-stolke: Andreas Stolcke <stolcke@speech.sri.com>
-wpaul: Bill Paul <wpaul@ctr.columbia.edu>
-
-
-FOOTNOTES:
-
-[1] Due to limitations in the Sun autofs v1 implementation, some amd features
-cannot be properly supported. More precisely, trying to access a link mount
-pointing to another amd entry will result in failure and/or deadlock.
-Ordinary nfs and link mounts work well, however.
-
-[2] AIX autofs appears to be a variant of the Sun autofs v1 protocol, but
-IBM don't provide any sort of documentation or even header files from it.
-It is currently unsupported; we may add some experimental support for it at
-some point, though it won't be pretty. Assistance from IBM-ers would be
-highly appreciated, hint hint.
-
-[3] IRIX 6 autofs uses the Sun autofs v1 protocol, too. The header files
-are part of the onc3_eoe.sw.autofs (IRIX 6.2) or nfs.sw.autofs (IRIX 6.5)
-package, which may not be installed. The autofs code is known to compile,
-but hasn't been run yet. SGI's autofsd uses a barely documented system
-call, syssgi(SGI_AUTOFS_SYS, ...), which may be required to get working
-autofs support. Additional help from SGI would be highly appreciated.
-
-Erez & Ion
diff --git a/contrib/amd/MIRRORS.html b/contrib/amd/MIRRORS.html
deleted file mode 100644
index 0deeefe32c77..000000000000
--- a/contrib/amd/MIRRORS.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
- <META NAME="Author" CONTENT="Erez Zadok">
- <TITLE>Am-Utils 6.x Mirror Sites</TITLE>
-</HEAD>
-<BODY BGCOLOR="#FFFFFF">
-
-<CENTER>
-<H1> Am-Utils 6.x Software Mirror Sites</H1></CENTER>
-
-Note: in case of any problems accessing the individual FTP sites, please
-contact their respective maintainers. If you wish to be added to the
-official mirror list, please send mail to <A
-HREF="mailto:am-utils-developers@am-utils.org">am-utils-developers@am-utils.org</A> with the
-full URL, maintainer's email, and geographical location.
-
-<P>
-
-<H2>North America</H2>
-<UL>
-
-<LI> New York (Stony Brook, Primary Site)
- <UL>
- <LI> FTP: <A
- HREF="ftp://ftp.am-utils.org/pub/am-utils">ftp.am-utils.org</A>.
- Contact person in case of problems <A
- HREF="mailto:am-utils-developers@am-utils.org">am-utils-developers@am-utils.org</A>.
- </LI>
- </UL>
-
-<LI> Minnesota
- <UL>
- <LI> FTP: <A
- HREF="ftp://ftp.cs.umn.edu/pub/am-utils">ftp.cs.umn.edu</A>.
- Maintainer <A HREF="mailto:dokas@cs.umn.edu">dokas@cs.umn.edu</A>.
- </LI>
- </UL>
-
-<LI> Florida (University of Florida)
- <UL>
- <LI> FTP: <A HREF="ftp://ftp.cise.ufl.edu/pub/mirrors/am-utils">ftp.cise.ufl.edu</A>.
- Maintainer <A HREF="mailto:mirror@cise.ufl.edu">mirror@cise.ufl.edu</A>.
- </LI>
- </UL>
-
-</UL>
-
-<H2>Europe</H2>
-<UL>
-
-<LI> Germany
- <UL>
- <LI> FTP: <A HREF="ftp://ftp.fu-berlin.de/unix/network/am-utils">ftp.fu-berlin.de</A>.
- Maintainer <A HREF="mailto:ftp-adm@ftp.fu-berlin.de">ftp-adm@ftp.fu-berlin.de</A>.
- </LI>
- <LI> FTP: <A HREF="ftp://ftp.tu-darmstadt.de/pub/networking/filesystems/am-utils/">ftp.tu-darmstadt.de</A>.
- Maintainer <A HREF="mailto:networking@ftp.tu-darmstadt.de">networking@ftp.tu-darmstadt.de</A>.
- </LI>
- </UL>
-
-<LI> Sweden
- <UL>
- <LI> FTP: <A HREF="ftp://ftp.sunet.se/pub/unix/admin/am-utils">ftp.sunet.se</A>.
- Maintainer <A HREF="mailto:archive@ftp.sunet.se">archive@ftp.sunet.se</A>.
- </LI>
- </UL>
-
-<LI> UK
- <UL>
- <LI> FTP: <A HREF="ftp://sunsite.org.uk/package/am-utils">sunsite.org.uk</A>.
- Maintainer <A HREF="mailto:lmjm@icparc.ic.ac.uk">lmjm@icparc.ic.ac.uk</A>.
- </LI>
- </UL>
-
-</UL>
-
-<H2>Asia</H2>
-<UL>
-
-<LI> Japan
- <UL>
- <LI> FTP: <A HREF="ftp://ftp.u-aizu.ac.jp/pub/net/amd/am-utils">ftp.u-aizu.ac.jp</A>.
- Maintainer <A HREF="mailto:ftp-admin@u-aizu.ac.jp">ftp-admin@u-aizu.ac.jp</A>.
- </LI>
-
- <LI> FTP: <A HREF="ftp://core.ring.gr.jp/pub/net/am-utils/">core.ring.gr.jp</A>.
- Maintainer <A HREF="mailto:ftpadmin@ring.gr.jp">ftpadmin@ring.gr.jp</A>.
- </LI>
-
- <LI> FTP: <A HREF="ftp://ftp.ring.gr.jp/pub/net/am-utils/">ftp.ring.gr.jp</A>.
- Maintainer <A HREF="mailto:ftpadmin@ring.gr.jp">ftpadmin@ring.gr.jp</A>.
- </LI>
- </UL>
-</UL>
-
-<HR>
-<I> Last updated: Jan 5, 2004</I>
-
-</BODY>
-</HTML>
-
-<!---
- <LI> FTP: <A HREF="X">X</A>.
- Maintainer <A HREF="mailto:X">X</A>.
--->
diff --git a/contrib/amd/MIRRORS.txt b/contrib/amd/MIRRORS.txt
deleted file mode 100644
index b5093e8f4aa4..000000000000
--- a/contrib/amd/MIRRORS.txt
+++ /dev/null
@@ -1,60 +0,0 @@
- AM-UTILS-6.x MIRRORS
-
-Note: in case of any problems accessing the individual FTP sites, please
-contact their respective maintainers. If you wish to be added to the
-official mirror list, please send mail to am-utils-developers@am-utils.org
-with the full URL, maintainer's email, and geographical location.
-
-U.S.A:
- New York (Stony Brook, Primary Site):
- ftp://ftp.am-utils.org/pub/am-utils
- Maintainer: ezk@am-utils.org
- Minnesota:
- ftp://ftp.cs.umn.edu/pub/am-utils
- Maintainer: dokas@cs.umn.edu
-#Avoid for now: empty directory
-# Virginia (Newport News):
-# ftp://ftp.ferginc.com/pub/unix/am-utils
-# Maintainer: Branson.Matheson@FergInc.com
-#server gone? (Jan 5, 2004)
-# Ohio (Kent State University):
-# ftp://info.mcs.kent.edu/pub/am-utils
-# Maintainer: root@mcs.kent.edu
- Florida (University of Florida)
- ftp://ftp.cise.ufl.edu/pub/mirrors/am-utils
- Maintainer: mirror@cise.ufl.edu
-
-Europe:
- Germany:
- ftp://ftp.fu-berlin.de/unix/network/am-utils
- Maintainer: ftp-adm@ftp.fu-berlin.de
- Germany:
- ftp://ftp.tu-darmstadt.de/pub/networking/filesystems/am-utils/
- Maintainer: networking@ftp.tu-darmstadt.de
- Sweden:
- ftp://ftp.sunet.se/pub/unix/admin/am-utils
- Maintainer: archive@ftp.sunet.se
-# not responding (Jan 5, 2004)
-# Sweden (Stockholm University, Math Depat):
-# ftp://mirror.matematik.su.se/pub/am-utils
-# Maintainer: leifj@matematik.su.se
- UK:
- ftp://sunsite.org.uk/package/am-utils
- Maintainer: lmjm@icparc.ic.ac.uk
-
-Asia:
- Japan:
- ftp://ftp.u-aizu.ac.jp/pub/net/amd/am-utils
- Maintainer: ftp-admin@u-aizu.ac.jp
- Japan:
- ftp://core.ring.gr.jp/pub/net/am-utils/
- Maintainer: ftpadmin@ring.gr.jp
- Japan:
- ftp://ftp.ring.gr.jp/pub/net/am-utils/
- Maintainer: ftpadmin@ring.gr.jp
-
-# gone? (Jan 5, 2004)
-# Australia:
-# Melbourne:
-# ftp://ftp.sage-au.org.au/pub/network/filesystem/am-utils
-# Maintainer: mirror@ftp.sage-au.org.au
diff --git a/contrib/amd/NEWS b/contrib/amd/NEWS
deleted file mode 100644
index 5cde984ed518..000000000000
--- a/contrib/amd/NEWS
+++ /dev/null
@@ -1,1489 +0,0 @@
-*** Notes specific to am-utils version 6.1.5
-
-New amd.conf global parameter: nfs_allow_any_interface. By default it is
-set to 'no' which means that Amd accepts local NFS packets only from
-127.0.0.1. If set to 'yes' then Amd will accept local NFS packets from any
-local interface; this is useful on hosts that may have multiple interfaces
-where the system is forced to send all outgoing packets (even those bound to
-the same host) via an address other than 127.0.0.1.
-
-Add support for specifying the host to match in the mount selectors netgrp
-and netgrpd. Now one can use either netgrp(<group-name>) or
-netgrp(<group-name>,<host-name>).
-
-- Bugs fixed:
- * handle old-style filehandles correctly (for mount points longer
- than 28 chars)
- * don't turn off attribute cache for regular NFS mounts (improves
- performance)
- * detect G/DBM support via gdbm_compat library (Debian)
- * detect NDBM support in libc (FreeBSD 6)
-
-- minor new ports:
- i386-unknown-freebsd6.1 (RELEASE)
- i386-unknown-openbsd3.9
- powerpc-apple-darwin8.6.0
-
-*** Notes specific to am-utils version 6.1.4
-
-Support new mount options for type:=pcfs mounts: longname, nowin95,
-shortname, user=N, group=N, mask=N, and dirmask=N.
-
-Two new amd.conf [global] parameters: nfs_retry_interval_toplvl and
-nfs_retransmit_counter_toplvl. They are similar to nfs_retry_interval and
-nfs_retransmit_counter, and allow you to set the "timeo" and "retrans" NFS
-mount parameters, respectively, but ONLY for Amd's top-level mounts (which
-are NFSv2/UDP currently). This is useful because on some systems you may
-wish to set these parameters differently than the OS default, so as to
-better tune Amd's responsiveness under heavy scheduler loads.
-
-- minor new ports:
- i386-pc-linux-fc5 (Fedora Core 5)
- i386-pc-linux-suse10.1 (beta 8)
- i386-unknown-freebsd6.0 (RELEASE)
- i386-unknown-netbsdelf2.1
- i386-unknown-netbsdelf3.0 (RELEASE)
- i386-unknown-openbsd3.8
- powerpc-apple-darwin8.5.0
-
-- Bugs fixed:
- * one serious memory leak in amfs_generic (caught by Coverity)
- * assorted potential (but rare) NULL pointer dereferences (Coverity)
- * correctly print nfs_args->addr info (sin_family/port/addr)
- * pawd should resolve path repeatedly until no more to do
- * use-after-free bug in amfs_lookup_mntfs (Coverity)
-
-*** Notes specific to am-utils version 6.1.3
-
-- Bugs fixed:
- * amq should de-register properly on exit
- * convert all sprintf to safer xsnprintf
- * convert all strcat to safer xstrlcat
- * convert all strcpy to safer xstrlcpy
- * fix three buffer overruns in expand_op (amd/opts.c)
- * pawd was trying UDP only, now try TCP if UDP failed
-
-Moved pawd's path-matching functionality into Amd, where it can be done a
-lot more efficiently (we no longer need to construct and send the whole
-mounted tree, only to match small parts of it). This will lessen the CPU
-and network load on systems that use pawd heavily, and also minimize the
-chance that we exceed default or hard-coded UDP/TCP RPC packet sizes.
-
-*** Notes specific to am-utils version 6.1.2.1
-
-- Bugs fixed:
- * properly turn off the attrcache in freebsd and openbsd
- * can turn off attrcache on netbsd, but need kernel patch, see
- README.attrcache
- * pawd goes into an infinite loop on type:=auto
- * consistent search for file system mnttab/mount names
-
-*** Notes specific to am-utils version 6.1.2
-
-MAJOR BUG FIXES: Synchronize Amd's view of its file systems with the
-kernel's NFS client-side DNLC/dcache. Amd changes its view when it reloads
-maps (automatically or via "amq -f") because new map entries could be added,
-old one removed, or existing ones changed. Amd also changes its view when a
-simple entry has expired and was flushed, or was forced out via "amq -u".
-Amd was not updating the mtime of its parent directory (often the amd
-automount point): this resulted in the kernel re-using cached entries, which
-are now possibly stale. Many users had seen this problem in the form of
-occasional ESTALE errors, or dangling/broken automounted symlinks,
-especially on systems under heavy use. To tell the kernel to ignore (flush)
-its old entries for an directory, the mtime of the directory must be updated
-(monotonically incremented). Amd was indeed doing so in several places, but
-unfortunately it was using time(2) which only provides a one-second
-resolution clock: this was fine a decade ago, but not good enough on today's
-fast systems; using only a one-second resolution clock meant that on busy
-systems that invoke Amd many times a second, some rapidly changing entries
-do not get flushed from the kernel, and the kernel thus uses stale entries.
-The solution to all of these was to rework the whole clock timer updates to
-use gettimeofday(), using a micro-second resolution timer, and to use that
-time whenever Amd needs to update an mtime/atime/ctime of any node.
-Finally, we now update the mtime in places that were never updated before
-(when a whole map is flushed or a single entry times out).
-
-Warning: some OSs, we discovered, are incapable of turning off their
-NFS attribute cache entirely. This means that Amd cannot work fully
-reliability on these systems, not under heavy load. This is documented in
-detail in the README.attrcache file included with this distribution.
-
-Include test-attrcache script to test the NFS attribute cache behavior using
-Amd.
-
-Tell syslog not to log automatically to /dev/console; it's unfriendly. If
-user really wants to, they can set it in /etc/syslog.conf.
-
-- minor new ports:
- i386-pc-linux-deb3.1
- i386-unknown-netbsdelf3.0
- powerpc-apple-darwin8.2.0
-
-- bugs fixed:
- * minor documentation corrections
-
-*** Notes specific to am-utils version 6.1.1
-
-New amd.conf global parameter: forced_unmounts (default to "no"). If set to
-"yes," and the client OS supports forced or lazy unmounts, then Amd will
-attempt to use them if it gets any of three serious error conditions when
-trying to unmount an existing mount point or mount on top of one: EIO,
-ESTALE, or EBUSY. This could be useful to recover from serious conditions
-such as hardware failure of mounted disks, or NFS servers which are down
-permanently, were migrated, or changed their IP address. Only
-"type:=toplvl" mounts hung with EBUSY are forcibly unmounted using this
-option: this is useful to ensure that a new Amd can mount itself even if a
-previous Amd died and left its mount points hung, or to force Amd to
-shutdown cleanly, even if some processes (i.e., user shells) have their CWD
-on Amd's own mount point. This functionality is available for Linux, BSD44
-systems, Solaris, OSF/1, and partially for AIX.
-
-New amd.conf global parameter: truncate_log (default to "no"). If set to
-"yes", then Amd will truncate the log file (if it's a regular file) on
-startup. This could be useful when conducting extensive testing on Amd maps
-(or Amd itself) and you don't want to see log data from a previous run in
-the same file.
-
-- minor new ports:
- i386-pc-linux-fc4
- i386-pc-linux-suse9.3
- i386-pc-linuxoldld-deb3.1
-
-- bugs fixed:
- * safer mtab handling for Linux (locks + handles /proc/mounts)
- * small compile problems on Solaris 6 (rpcvers_t)
- * small compile problems on HPUX 10 (h_errno)
- * possibly missing definition of INADDR_NONE in wire.c
- * extern for sleep(3) may be missing on older gcc systems
- * updated nfs_args structure on aix4.
- * possible running off end of exported_ap[] array.
- * buffer overflow in pawd.
- * aix4 clean build.
- * use strlcat/snprintf in a few places for safety.
- * recover from IP address change of a down NFS server
- * don't discard restarted mntfs that was used.
-
-*** Notes specific to am-utils version 6.1
-
-- bugs fixed:
- * set timeo/retrans for type:=nfs only if user asked
-
-Also, if you want to know what's new in 6.1 compared to 6.0.x, it's
-EVERYTHING below this line, up to "6.0.4." Yes, that's a lot of stuff.
-
-*** Notes specific to am-utils version 6.1-rc7
-
-Remove alloca from am-utils, and rewrite code that used it.
-
-Assorted minor code cleanups.
-
-- minor new ports:
- alpha-unknown-linux-gentoo1.4.16
- alphaev56-dec-osf4.0f (using both cc and gcc)
- mips-sgi-irix6.5 (using both cc and gcc)
- mips-unknown-linux-gentoo1.4.16
- sparc64-unknown-linux-gentoo1.4.16
-
-- bugs fixed:
- * getwire() detects networks correctly on OSF/1
-
-*** Notes specific to am-utils version 6.1-rc6
-
-- minor new ports:
- i386-pc-linux-deb3.0
- i386-pc-linux-gentoo1.4.16
- i386-pc-linux-suse9.2
- i386-unknown-freebsd5.4
- i386-unknown-netbsdelf2.0.2
- i386-unknown-openbsd3.7
- powerpc-unknown-linux-yellowdog2.3
-
-- bugs fixed:
- * minor compile error of nfs_subr.c on some systems.
- * AIX 5.2/5.3 PPC compile fixes.
-
-*** Notes specific to am-utils version 6.1-rc5
-
-For NetBSD systems, $os used to say "netbsdelf1" or "netbsdelf2." Now it
-just says "netbsd."
-
-- minor new ports:
- powerpc-apple-darwin7.9.0
-
-- bugs fixed:
- * silly (but nasty) null pointer dereferencing
- * improved fix for '-opts' syntax for resetting map options
-
-*** Notes specific to am-utils version 6.1-rc4
-
-- bugs fixed:
- * check for "macosx" in M4 macros properly
- * minor memory leaks (thanks to Valgrind)
-
-*** Notes specific to am-utils version 6.1-rc3
-
-Minor fix to configure.in. Reran bootstrap to get a working configure
-script that indeed checks for certain Linux nfs/autofs headers.
-
-*** Notes specific to am-utils version 6.1-rc2
-
-New amd.conf global parameter: normalize_slashes (default to "yes"). If set
-to "no," then Amd will not condense repeated slashes or remove trailing ones
-from strings representing pathnames. This is sometimes useful with SMB
-mounts, which often require multiple slash characters in pathnames.
-
-Using a custom version of strlcpy instead of strncpy (but only where it
-makes sense), to minimize string overflow changes. Audited all use of
-strncpy/strlcpy to ensure safety.
-
-On Apple machines, use "powerpc" for $arch, instead of "Power Macintosh".
-Also, use sw_vers to find out more appropriate OS name (macosx) and OS
-version (10.3.x) than uname(3) reports.
-
-- minor new ports:
- powerpc64-unknown-linux-rhel4
- powerpc64-unknown-linux-sles9
-
-- bugs fixed:
- * pawd handles all file systems
- * fix double-free in type:=nfsx
- * timeo and retrans shouldn't be set for type:=toplvl
- * fix inconsistency in handling filehandle generation number
- * document proper use of hosts.allow (don't spawn)
- * single dash '-' map entry now resets the defaults
-
-*** Notes specific to am-utils version 6.1-rc1
-
-- minor new ports:
- i386-pc-linux-fc2 (Fedora Core 2).
- i386-pc-linux-fc3 (Fedora Core 3).
- i386-pc-linux-rhel3
- i386-pc-linux-rhel4
- i386-pc-linux-suse8.2
- i386-pc-linux-suse9.1
- i386-pc-solaris2.10
- i386-unknown-freebsd4.8
- i386-unknown-freebsd4.9
- i386-unknown-freebsd4.10
- i386-unknown-freebsd4.11
- i386-unknown-freebsd5.1 (5.1-RELEASE)
- i386-unknown-freebsd5.2 (5.2-RELEASE)
- i386-unknown-freebsd5.2.1 (5.2.1-RELEASE)
- i386-unknown-freebsd5.3 (5.3-RELEASE)
- i386-unknown-freebsd6.0 (6.0-CURRENT-SNAP001)
- i386-unknown-netbsdelf1.6.1
- i386-unknown-netbsdelf2.0
- i386-unknown-openbsd3.6
- ia64-hp-hpux11.20
- ia64-unknown-linux-rhel4
- mipsel-unknown-linux-rhPS2 (Linux on Sony PlayStation 2)
- powerpc-apple-darwin7.6.0
- powerpc-apple-darwin7.7.0
- powerpc-apple-darwin7.8.0
- powerpc-ibm-aix5.2.0.0
- powerpc-ibm-aix5.3.0.0
- sparc-sun-solaris2.10
- sparc64-unknown-linux-deb3.0
- x86_64-unknown-linux-rh2.9.5AS
-
-- support for executable maps ala Sun automounter. Set map_type=exec in
- amd.conf, and map_name to a program/script that takes a key as argv[1],
- and returns key-value pair on stdout. See also exec_map_timeout [global]
- parameter which defines how many seconds (default 10 sec) Amd will wait
- for an executable map program to return output before timing out. See
- am-utils manual for full details.
-
-- new amd.conf parameter "nfs_allow_insecure_port". Used to work around
- bugs in certain kernels, which cause them to try and talk to amd from
- unprivileged ports.
-
-- new amd.conf parameter: localhost_address. Used to override the localhost
- (often 127.0.0.1) address Amd uses to connect to for the local NFS server
- and RPC server.
-
-- new amd.conf [global] parameter: domain_strip (default "yes"). If set to
- "no," Amd won't strip domain names from host names, which is useful if
- your Amd maps are served by multiple domains and you want to tell from the
- logs which exact host did what.
-
-- new amd.conf [global] parameter: auto_attrcache (default to 0). Sets
- Amd's own NFS attribute-cache timeout in seconds. A value of 0 turns off
- attribute caching, meaning that Amd will be consulted via a kernel-RPC
- each time someone stat's the mount point (which could be abused as a
- denial-of-service attack). If you're concerned, set this to something
- greater than zero (a value of 1 second is currently recommended).
- Warning: if you set this option to any non-zero value, especially a large
- value, and you get ESTALE errors on your particular OS, then set this
- value back to 0 seconds.
-
-- four new amd.conf [global] parameters, similar to nfs_retry_interval and
- nfs_retransmit_counter, which allow you to set the "timeo" and "retrans"
- NFS mount parameters, respectively. Now you can set those parameters
- globally and separately for UDP vs. TCP, using any of these:
- nfs_retry_interval_udp, nfs_retransmit_counter_udp nfs_retry_interval_tcp,
- and nfs_retransmit_counter_tcp.
-
-- new amd.conf [global] parameter: preferred_amq_port. Allows you to select
- the UDP+TCP port that Amd's amq service will use with the RPC portmapper.
- Useful with firewalls and NAT'ed environments.
-
-- new amd.conf option "debug_mtab_file". Allows user to define the mtab
- file during debug-mtab mode. The default path is "/tmp/mnttab".
-
-- new function selector xhost(ARG) which will match ARG against the current
- host name. This works even if ARG is a CNAME (unlike the host==ARG
- selector).
-
-- support restarting the automounter's own mount points (only over NFS,
- for now).
-
-- fully support WebNFS as per RFC 2054. It now tries v3/TCP first, falling
- back to v2/UDP if this doesn't work. The "webnfs" pseudo-mount options
- has been renamed (again) to "public" to match Solaris 2.
-
-- restructured the restarting of already-mounted filesystems, in the process
- also fixing a problem with restarting nfsx components.
-
-- support escaped slashes, needed for SMB mounts. Use '\\\/\\\/' in a
- string to get a double slash.
-
-- amd -v now prints domain, host, and hostd values: foo, example.com, and
- foo.example.com, respectively.
-
-- On Linux, if umount(2) failed with EIO or ESTALE, try the new umount2(2)
- system call with MNT_FORCE+MNT_DETACH. This could be quite helpful to
- unmounting hung mount points that otherwise cannot be fixed without a
- reboot.
-
-- The ping=N mount option now works. N defaults to 30 seconds for all NFS
- servers. It can now be set to any value for each server separately.
- Setting it to a large value can reduce the amount of NFS_NULL chatter on
- your network considerably, especially in large sites. Setting this to -1
- will turn off pings for that server (useful in NFS-HA setups). Setting N
- to 0 will pick the default ping value in Amd (currently 30 seconds). Note
- that if you have multiple Amd entries using the same file server, and each
- entry sets a different value of N, then each time Amd mounts a new entry,
- the ping value will be re-evaluated (and updated, turned off, or turned
- back on as needed). Note that NFS_NULL pings are sent for both UDP and
- TCP mounts, because even a hung TCP mount can cause user processes to
- hang.
-
-- file system inheritance code restructured, so it's no longer a pseudo file
- system, but actually integrated into Amd (as it should have been).
-
-- for type:=program, the "umount" program doesn't have to be defined; it'll
- default to "unmount ${fs}".
-
-- "amd -v" now prints the distribution name if it's known (e.g., rh9, fc3,
- suse8, etc.).
-
-- bugs fixed:
- * various memory management problems (leaks, etc)
- * fixed nfsx support
- * fixed a race involving late replies to network queries which
- arrive after the file system has already been mounted
- * recognize pcfs_args_t fields in FreeBSD 5
- * recognize other mount types in pawd: host, linkx, and nfsx
- * allow exactly one of umount and unmount in type:=program
- * race condition between calls to mntctl() on AIX
- * plock/mlockall wasn't inherited by fork(); moved after
- daemonizing.
- * fix inconsistency between Socket and TLI RPC timeouts.
- * don't warn when couldn't rmdir a dir with a readonly ancestor.
- * avoid hangs of amd in ctl-amd (must chdir to /)
- * workaround occasional daemonizing problems (parent won't die)
- * don't hang on exit if debug_options=mtab was used
- * utimeout=N mount option works with non-nfs types (ufs, pcfs, etc.)
- * SEGV (null pointer deref) in type:=program and type:=cachefs
- * unmount_on_exit of type:=program caused amd to hang
- * match amd2ldif output with ldap.schema
-
-*** Notes specific to am-utils version 6.1b4
-
-- minor new ports:
- i686-apple-darwin6.6
-
-- speed up the recovery of inherited (restarted) filesystems by using the
- proper waiting channels
-
-- added support for mounting webnfs filesystems, see entry below. It doesn't
- do any probing currently, so it will default to v2/UDP unless another
- version and/or protocol are explicitly specified.
-
-- pseudo-mount option "ignore_portmapper" renamed to "webnfs"
-
-- bugs fixed:
- * properly time out autofs filesystems on Linux
- * link mounts with relative targets weren't working on autofs
- * the link side of the nfsl file system wasn't working on autofs
- * umount code was accidentally turning all symlinks into directories
- during attempted umounts, causing stale filehandles
- * various minor build fixes for "impossible" configurations
- * prevent ldap code from dereferencing a null pointer
-
-*** Notes specific to am-utils version 6.1b3
-
-- new amd.conf option autofs_use_lofs, set by default to "yes". "yes" means
- using in-place mounts (lofs, bind mounts, etc.), thus utilizing one of
- Autofs's main advantages. "no" means using symlinks instead, which has
- the "/bin/pwd" problem and certain efficiency issues on Solaris 2.6+ and
- is also not supported on Solaris Autofs v1 and derivatives; however, the
- autofs code that uses symlinks is simpler and more thoroughly tested.
-
-- new amd.conf option map_default (can be used in [global] and overwritten
- in the per-map section). This will overwrite the /defaults entry of the
- map itself, to allow people to set defaults in amd.conf (useful when you
- cannot control your amd maps, or you'd rather not modify them globally).
-
-- for type:=program, you can use either unmount:=XXX or umount:=XXX (but not
- both). This new 'unmount' name is an alias for convenience.
-
-- fixed the "multiple matching sub-entries in a map entry" semantics to try
- mounting those sub-entries one by one, until either one succeeds or all
- fail. The old semantics of trying to mount everything in parallel and use
- the one that mounted fastest hasn't worked in a long time; in fact, 6.0
- currently simply ignores all but the first matching sub-entry.
-
-- made amd fail much faster (instantly, in fact) if the remote server
- doesn't have a functional portmapper or NFS service. Also reduced the
- total timeout to 3 seconds for a completely downed server.
-
-- new pseudo-mount option "ignore_portmapper"; not very useful currently,
- will make more sense when we also accept hard-coded ports for mountd and
- nfsd.
-
-- amd will no longer query the portmapper for all possible NFS versions and
- protocols if the user requested to use specific ones.
-
-- increased the major number for the library, so that 6.0 and 6.1 can't
- share libraries anymore.
-
-- support tcpd/libwrap tcpwrappers. If your system supports libwrap, then
- you can use /etc/hosts.allow and /etc/hosts.deny to control remote Amq
- access to Amd. The new amd.conf parameter use_tcpwrappers is set to "yes"
- by default.
-
-- support NULL entries in Hesiod maps, if they start with a ".".
-
-- code reorganization
-
-- documentation cleanup, corrections, and general updates. Better
- references to all man pages. Support newer texi2html. Proper building of
- DVI and PSI files. Allow building of am-utils manual in one long Web
- page.
-
-- minor new ports:
-
- ia64-unknown-linux-rh2.1AS (Red Hat Itanium Advanced Server)
- i386-unknown-freebsd5.0 (5.0-RELEASE)
- sparc64-unknown-linux-suse7.3
- i386-unknown-netbsdelf1.6.1
- i386-unknown-openbsd3.3
- i386-pc-solaris2.9
-
-- bugs fixed:
-
- * autofs mode on Linux was segfaulting on a silly error (and noone
- complained, which proves that I'm probably the only one testing
- these beta releases, tsk tsk).
- * fixed handling of host entries over autofs.
- * fixed handling of nfsl entries over autofs.
- * the matching in find_mntfs() was causing problems for inherited
- filesystems, so make an exception for them. Tighten the
- matching even more, to take into account the f/s type as well.
- * recognize xlatecookie mnttab option on netbsd
- * document Solaris lex bug (use flex)
- * document AIX 5.x NFS bug (need patch)
- * document Solaris 8 autofs version change (need to fix system
- header file)
- * ensure lex doesn't run out of output slots
- * support GNU flex-2.5.31+
- * force version.texi to be rebuilt unconditionally
- * mk-amd-map open db file exclusively (security)
- * turn off maintainer-only rules in distros
- * don't core dump if log_file is NULL (Solaris)
- * don't include malloc.h if stdlib.h exists
- * recognize file system failures (EIO) upon reading file maps
-
-*** Notes specific to am-utils version 6.1b2
-
-- new mount flag "softlookup", which determines how amd will respond to
- lookups of NFS shares already mounted (return a valid symlink or return
- EIO). The default, if "softlookup" is not specified, depends on whether the
- mount is "soft" or "hard".
-
-- return EIO instead of ENOENT if amd thinks the server is down; this allows
- well-written applications to sleep and retry the operation.
-
-- minor new ports:
-
- i386-apple-darwin6.0
- i386-pc-linux-rh8.0
- ia64-unknown-linux-rh2.1AW
- sparc-sun-solaris2.9
-
-- automatic support for loop mounts on Linux (deprecates the "loop" mount
- option)
-
-- new amd.conf parameter ldap_proto_version (default 2) for setting the LDAP
- protocol version to use.
-
-- bugs fixed:
-
- * redundancy mode (multiple servers for the same share) wasn't working
- * non-autofs mode had some rather nasty hangs on downed file servers
- * double-free'ing problem in assign_error_mntfs and free_continuation
- * free'ing non-malloc'ed memory in amfs_auto_mount
- * late server ping replies were not ignored
- * amfs_auto_lookup_mntfs wasn't propagating errors up to callers
- * autofs-v4 on Solaris 9 works
- * handle std{in,out,err} correctly when releasing controlling tty
- (for real this time)
- * don't cast pointers between enum_t and u_long, it doesn't work on
- 64-bit big-endian platforms
- * fix compile problem with mlockall() on Darwin
-
-*** Notes specific to am-utils version 6.1b1
-
-- Major Autofs work
- Partial support for Sun Autofs v1
- Documented known problems with Sun Autofs v1 (possible deadlocks)
- Fixes for Sun Autofs v2/v3
- Preliminary support for Sun Autofs v4 (Solaris 9)
- Kernel-based expirations for Linux Autofs
-
-- Minor new ports:
- powerpc-ibm-aix5.1.0.0
- i386-unknown-netbsd1.6A
-
-- Work around IBM's NFSv3 ABI change in aix4.3
-
-- trivial regression test suite started: run "make check" on a built
- am-utils to execute tests. Currently only one test which checks to see if
- "amd -v" executes correctly.
-
-- new command line option "amd -A arch" to overwrite the value of $arch.
-
-- bugs fixed:
-
- * Linux loop mounts of ISO images
- * assorted LDAP fixes
- * strerror not found on some systems
- * small fixes for hpux9 and aix43
- * exclude ldap/hesiod support unless both libraries+headers exist
- * fully support "xlatecookie" mount option
- * security: if -D noamq option, don't listen on socket.
-
-*** Notes specific to am-utils version 6.1a5:
-
-- browsable_dirs support for Solaris autofs, *without* mount storms!
-
-- new amd.conf global parameter: map_reload_interval (default 1 hour).
- Determines how often Amd checks to see if maps have changed at the source
- (and then reloading only those that have changed).
-
-- "amd -v" now lists bug-reporting address.
-
-- assorted code cleanups and porting to use latest versions of GNU
- Autotools.
-
-- opts:=loop works for type:=cdfs, for mounting ISO-9660 files on Linux.
-
-- bugs fixed:
-
- * fixed sublink support in Linux autofs (broken in a4)
- * hlfsd takes uid 0's home from root's passwd entry instead of
- defaulting to '/'
- * (not really our bug) Linux ignores the microseconds field in
- mtime, so hlfsd and amd need to increment the seconds field all
- the time to prevent symlink caching
- * generic map parsing bug which was rejecting a numerical mount
- option if it was the last option in the string.
- * file descriptor leak in Linux autofs.
- * "nolock" is an NFS mount option, not a generic one.
- * use mlockall(2) on systems that have it, for plock=yes. Now
- pinning Amd's pages in memory works on Linux.
- * ctl-amd/ctl-hlfsd correctly refer to @sysconfdir@ for alternate
- location of configuration files.
-
-*** Notes specific to am-utils version 6.1a4:
-
-- full autofs support for Solaris 2.[67], including symlinks, sublinks and
- direct mounts
-
-- fixed mount/umount deadlock in Linux autofs
-
-- fixed sublinks in Linux autofs
-
-- support for network/netmask pairs in the in_network() selector
-
-- support disabling LDAP and Hesiod support using configure
-
-- forward-ported all the fixes from the stable branch (MacOS X support,
- minor Linux fixes)
-
-- bind-mount support for type==link and type==lofs with Linux 2.4+
-
-- FiST lofs support under Linux (also in 6.0.6s2)
-
-*** Notes specific to am-utils version 6.1a3:
-
-- various things from the 6.0 branch:
- compile fixes for Linux 2.4-ac and 2.2.19pre+
- Darwin/Rhapsody/OS X support
- much reduced configure script (works around a bug in Darwin's cpp)
-
-*** Notes specific to am-utils version 6.1a2:
-
-- working autofs support for Solaris 2.[67], but incomplete
-
-- forward-ported all the changes up to 6.0.5s2
-
-- removed support for amq -M
-
-- known bugs
- nfsx support is broken
- linux NFS codes fixes
- NFS cache aliasing fixes
- lots of stuff ported from 6.0 branch
-
-*** Notes specific to am-utils version 6.1a1:
-
-- working autofs (v3 and v4) support for Linux!
-
-- forward-ported all the changes in 6.0.4s4
-
-- bugs fixed
- client-side fail-over to NFSv2/UDP
-
-- known bugs
- autofs v3 will probably break with host maps
-
-*** Notes specific to am-utils version 6.0.4:
-
-- NFSv3 support for Linux and HPUX-11
-
-- new amd.conf [global] options:
- nfs_vers: force all NFS mounts to version 2 or 3
- nfs_proto: force all NFS mounts to udp or tcp
-
-- new debug_options (amd -D):
- hrtime: turns on high-resolution timer if available
- readdir: traces browsable_dirs code
- xdrtrace: traces XDR routines
- (trace: only traces NFS and RPC)
-
-- new amq options:
- -H: shows usage
- -w: translate getpwd() into an Amd path
-
-- new map syntax:
- ${dollar}: to include a literal '$' in assignments
-
-- new "opts:=" options:
- ver3: turns on NFS version 3 on some systems (linux)
-
-- updated or minor new ports:
- alpha-dec-osf4.0f
- alphaev6-dec-osf5.0
- i386-pc-linux-rh6.2
- i386-unknown-freebsd3.4
-
-- bugs fixed:
- symlink mtime fixes to avoid u/mount race conditions
- update amq -s failed umounts count correctly
- linux compiles even if efs is available
- linux works with mount(2) option "intr"
- linux works with pcfs and cdfs
- handle std{in,out,err} correctly when releasing controlling tty
- browsable_readdir works on 64-bit kernel architectures
- irs/wire routines compile for bsdi{2,3,4}
-
-*** Notes specific to am-utils version 6.0.3:
-
-- updated or minor new ports:
- hppa1.0-hp-hpux11.00
- i386-pc-bsdi4.1
- i386-unknown-netbsd1.4.1
- sparc-sun-solaris2.8
- i*86-pc-linux-gnu-rh6.1
- (some preparations for Compaq Tru64)
-
-- new variables ${uid} and ${gid}, return the numeric UID/GID of the user
- (not root) who invokes an amd pathname. Similar to what hlfsd does.
-
-- automake now uses automatic dependency tracking
-
-- new mount options: optionstr, noexec, nomnttab
-
-- maps of type:=auto are now browsable (using map option "browsable")
-
-- ctl-amd has "status" argument (same as RedHat)
-
-- bugs fixed:
- document buggy AIX 4.3 plock() behavior
- fixes to stale file handle on symlinks
- reduce race conditions upon rapid umount/mount sequences
- use vsnprintf, more secure than vsprintf
- more assorted and smaller bugs
-
-*** Notes specific to am-utils version 6.0.2:
-
-- safe map reloads: when a map needs to be reloaded, it is reloaded into a
- temporary copy first. Only if the reload was completely successful, Amd
- discards the old map and uses the new one. Otherwise Amd continues to use
- the old maps. This should help a lot with transient NIS problems.
-
-- amq -f now also forces a (safe) map reload, but only if the timestamp on
- the maps was updated.
-
-- two new selector variables: ${vendor} and ${full_os}, which are the same
- as the output seen in "amd -v".
-
-- documentation fixes and updates
-
-- updated or minor new ports:
- i386-unknown-freebsdelf3.3
-
-- support 'ignore' flags (automntfs) in bsdi-4.1
-
-- bugs fixed:
- expn.pl uses correct sockaddr_in() not, pack()
- make sure configure --enable-*args take an argument
- don't busy-loop trying to rebind to ldap servers
- use vsnprintf, not vsprintf (security)
-
-*** Notes specific to am-utils version 6.0.1:
-
-- updated or minor new ports:
- i386-pc-bsdi4.0.1
- i386-unknown-freebsdelf3.0
- i386-unknown-freebsdelf3.1
- i386-unknown-freebsdelf3.2
- i386-unknown-freebsdelf4.0
- i386-unknown-netbsd1.4
- i386-unknown-openbsd2.5
- powerpc-unknown-linux-gnu
-
-- automount2amd added, a new script to convert Sun automount maps to Amd maps
-
-- new map function netgrpd(ARG), same as netgrp() but matches FQHN
-
-- 'ignore' is a generic mount option
-
-- hesiod info service isup() function to check if service is up
-
-- more Y2K fixes (see README.y2k for the full story)
-
-- using alloca.c on systems that don't have it (hpux9 with /bin/cc)
-
-- configure script reduced in size by using M4/sh loops instead of repeated
- entries
-
-- documentation updates
-
-- too many bugs fixed to list here:
- 'addopts' option works with 'remopts' as well as 'opts'
- AIX can perform NFS V.3 mounts explicitly
- NIS is_up fixed, especially for NIS+ running in compatibility mode
- amd -v incorrectly listing file systems that don't really work
- amd's own mounts use reserved ports if possible
- browsable directories works for Linux 2.3 (NFS cookies)
- bsd44 systems check for isofs flags
- bsd44 systems check for new options: norrio, gens, and extatt
- buildall works better on Ultrix's /bin/sh
- compile and build on Linux kernels 2.2 and newer
- compile and build on RedHat Linux 6.0 (glibc 2.1)
- compile and build on Solaris 7 (with or without vendor LDAP)
- completely eliminate all of amd's amq -M code, when not enabled
- correctly interpret failure code of unmount of type:=program
- don't create autofs listener service unless used
- don't list or process amq's -M option unless feature was turned on
- don't turn on/off noconn option if it was already in that state
- ldap info service: don't strcmp null strings
- lostaltmail correctly sets struct sockaddr_in
- make sure Linux systems have configured kernel headers
- test for bsize/namlen fields in nfs_args (linux mount versions 2/3)
- turn off broken NFS V.3 support for HPUX
- use getifaddrs() on bsd44 systems makes wire.c more reliable
- use matching NFS rsize/wsize on Linux 2.0 and 2.[123] kernels.
- verify that RPC requests come from reserved, privileged local ports
- warn when Linux kernel headers mismatch with running kernel
- pawd works for type:=nfsl too
-
-*** Notes specific to am-utils version 6.0:
-
-- updated or minor new ports:
- hppa2.0w-hp-hpux11.00,
- i386-pc-bsdi4.0
- i386-unknown-freebsd2.2.8
- i386-unknown-netbsd1.3.3
- i386-unknown-openbsd2.4
- mips-sgi-irix6.5
- powerpc-ibm-aix4.3.1.0
- i386-unknown-freebsd3.0 now supports nfs v.3
-
-- ctl-amd and ctl-hlfsd now compatible with RedHat's chkconfig utility
-
-- ctl-amd stop will now wait until amd is down
-
-- libamu.so completely self contained --- does not export any symbols which
- must be defined by the process linking with it. This is so shared
- libraries could be supported on systems that have restrictive shared
- libraries.
-
-- use latest autoconf, automake, and libtool (off of cygnus' CVS server) to
- support shared libraries on many more platforms.
-
-- posix code cleanups
-
-- bugs fixed:
- case insensitive host match in type:=nfsl
- correct swapped args to kill(2)
- try to avoid a race condition b/t mounting and unmounting
- yp_all support is found in libnsl in RH-5.1 systems
-
-*** Notes specific to am-utils version 6.0b1:
-
-- updated or minor new ports:
- - *-pc-linux-gnu (glibc2 systems such as RedHat 5.1)
- - sparc-sun-solaris2.7
- - i386-pc-solaris2.7
- - i386-unknown-freebsd3.0 (official release, post 4.4lite port)
- - sparc64-unknown-linux-gnu (RH 5.1 on Sun Sparc Ultra)
-
-- bugs fixed:
- - major memory leak in processing of /defaults
- - core dump if map_type given in amd.conf doesn't exist
- - memory leak in replacement yp_all
- - don't access uninitialized memory in DU 4.0
- - other smaller bugs, see ChangeLog
-
-*** Notes specific to am-utils version 6.0a16:
-
-- new ports:
- hppa1.0-hp-hpux11.00 (works, not NFS V.3 due to missing headers)
- mips-dec-ultrix4.3 (working, unverified)
-
-- new minor ports:
- i386-pc-bsdi3.1
- i386-unknown-netbsd1.3.1
- alpha-dec-osf2.1
-
-- new options addopt:=ARG will "smartly" add and override options specified
-in opts:=
-
-- new amd.conf options:
- pid_file: specifies the file to store the PID
- hesiod_base: specifies the base for the Hesiod service
- unmount_on_exit: if 'yes' will attempt to unmount all file systems
- when amd exits.
-
-- amd.conf file is parsed after all other command line options. If no
-options specified at all, then use /etc/amd.conf by default.
-
-- some variables' values are now compared case-insensitive as per specs,
-such as host names, domain names, and more.
-
-- NIS service uses a new isup() function to detect if the service is up
-before using it. Used to ensure amd doesn't clear the existing maps before
-reloading them, unless the remote info service is working.
-
-- new cdfs mount options: rrip, noversion, defperm, nodefperm (OSF)
-
-- support efs/xfs separately on irix
-
-- new -D info trace option to turn on info specific debugging, such as
-RES_DEBUG for hesiod services.
-
-- document updates and fixes
-
-- new file MIRRORS lists official mirror sites (also in am-utils home page)
-
-- new file BUGS lists known amd/OS bugs
-
-- source restructuring: rename all Amd file-systems' sources to amfs_ARG.c
-such that it matches the type:=ARG as well. Free names afs/dfs for Andrew
-F/S and Distributed F/S.
-
-- checkpoint config.guess several times during the long configure, so that
-if it is aborted midway, the bulk of the features discovered will be re-read
-from the config.cache file.
-
-- more systems support shared libraries (libtool 1.2)
-
-- using automake 1.3 + more fixes
-
-- bugs fixed:
- use dynamic buffer for list of interfaces, not fixed size
- output of amd -H duplicated if >2 interfaces
- -D mem for hlfsd not on by default (so it will daemonize)
- linux looks for ext2fs before ufs
- CDFS looks for 'isofs' mount type as well
- compile on Solaris 2.6 with /opt/SUNWspro/bin/cc
- various additional fixes which gcc 2.8.x reported
- print syslog help string based on what's supported
- correctly ignore loopback interface on SunOS 3.x
- don't use -lucb for strcasecmp
- hlfsd's dump file securely written in /usr/tmp/hlfsd.dump.XXXXXX
- inherit NFS V.3 mounts correctly
- write pid file securely
-
-*** Notes specific to am-utils version 6.0a15:
-
-- new ports:
- alpha-unknown-linux-gnu: works
- i386-unknown-netbsd1.3: fully working
- *-sun-sunos3: compiles, not tested
-
-- updated ports:
- m68k-next-nextstep3: cleaner compile, works.
-
-- new file system type nfsl (NFS Link). Uses nfs if file system is remote,
-and link if it is local (based on if $rhost equals the host name).
-
-- support for Solaris cachefs. Requires setting fs, rfs, and a new variable
-cachedir. See documentation for explanation, examples, and caveats.
-
-- support negated selector functions such as !exists(/foo/bar)
-
-- wire, network, netnumber, in_network() selectors now match against all
-locally attached networks (by either name or number), not just the first two
-interfaces.
-
-- new program pawd (and man page for it) --- Print Automounter Working
-Directory, to print the proper pathname of the cwd or any other pathname,
-adjusted for automounter paths, while avoiding mount points.
-
-- two new switches to amq: -U will force using UDP only; -T will force using
-only TCP to communicate with amd. If neither (or both) are specified, amq
-will try TCP first, and if that failed, will try UDP.
-
-- support syslog facilities, using "amd -l syslog:facility". Old behavior
-when using only -l syslog is to use the LOG_DAEMON facility.
-
-- you may specify browsable_dirs=full, to get a listing of all entries
-(other than /default), including those with '*' wildcard and '/'
-characters.
-
-- amd -D trace now also includes as much of struct nfs_args as can be
-displayed. Useful in figuring out what the kernel really gets during a
-mount(2), as opposed to what the /etc/mnttab file says. -D trace also
-traces the xdr_* functions.
-
-- support for versions of shared libamu version. upped version from 0.0.0
-to 1.0.0. each am-utils release that will change the library will also
-update its version.
-
-- amd/ops_TEMPLATE.c: a new template file for those brave enough to try and
-implement a new amd file system. Includes comments and other info useful
-for developers.
-
-- if localconfig.h exists in the current directory during the run of
-configure, it is included in all am-utils sources. This allows courageous
-developers to make certain modifications during compilations, and especially
-turn off undesired features (not very recommended).
-
-- documentation types and updates for all new features, ports, etc.
-
-- bugs fixed:
- support NFS mount options grpid and maxgrps
- nextstep: set NFS success code to 0 (NFS_OK), not 1 (EPERM)
- bsdi2: set NFS success code to 0 (NFS_OK), not 1 (EPERM)
- set NFS V.3 mount table names to "nfs" if vers/proto exist
- use mkstemp() if possible (more secure)
- ctl-amd looks for amd.conf in ${prefix}/etc after /etc
- hpux: use "ignore" mount table type
- openbsd2.2: turn off "noconn" mount option, so only connected used
- fixed memory leak in hlfsd (don't setpwent after endpwent)
- all NFS3 systems should have proto/vers mount/amd options
- DEBUG_MEM compiles and prints something more useful
- uninit_mntfs(): free() mf_private *after* it is used
- browsable_readdir: fewer bytes sent back to kernel for each chunk
- mount_toplvl: don't free() an automatic variable!
- amd should chdir() to / before daemonzing (for core dumps etc)
- cdfs should be called 'cdfs' not whatever the mnttab type is
- amd -v: don't print "FS:" list twice when >=2 net interfaces
-
-*** Notes specific to am-utils version 6.0a14:
-
-- updated ports:
- powerpc-ibm-aix4.2.1.0: NFS V.3 works
-
-- minor new ports:
- sparc-sun-sunos4.1.3C
- m68k-sun-sunos4.1.1 (sun3)
- mips-sgi-irix5.2
-
-- new option to amd, -O ARG, will override the operating systems *name* with
-ARG. Corrected documentation for amd -o ARG --- it overrides the operating
-system *version* and not the name as the docs incorrectly stated.
-
-- logging now behave more like syslog: will not print repeated strings, but
-rather a count such as "last message repeated N times". (N will not exceed
-100.)
-
-- restructured the code which deals with the numerous possible fields and
-flags that are set in struct nfs_args. That code was moved to libamu as
-the functions compute_nfs_args() and compute_automounter_nfs_args().
-
-- bugs fixed:
- mnttab name ufs/cdfs/pcfs/etc filesystems corrected
- use pmap_ping for amq (a must for secure portmappers, bsdi2/3)
- test for xfs (irix) as a disk-based file system
- set correct nfs_prot headers for Solaris 2.5
- removed stale code from lostaltmail.in
- lostaltmail will look for conf file in multiple locations
- assorted documentation corrections
- amq does not print "get_secure_amd_client" if run as root
-
-*** Notes specific to am-utils version 6.0a13:
-
-- new in_network(ARG) nomadic selector, true if ARG is the name (or number)
-of any of this host's network interfaces.
-
-- removed variables primnetname, primnetnum, subsnetname, and subsnetnum.
-(Kept "wire" and its alias "network", and "netnumber".)
-
-- include am-utils.dvi and am-utils.ps in distribution.
-
-- hlfsd supports new option -P ARG, for reading password map off of file
-ARG. Allows you to use the hlfs redirector using paths other than user's
-home directories.
-
-- use a replacement yp_all for some systems (irix) known to have a broken
-one which leaks a file descriptor each time called.
-
-- if remote NFS server is down or does not support portmap, downgrade
-machine to NFS V.2 and retry again later.
-
-- bugs:
- don't redefine yywrap on systems using a modified flex
- use correct "ignore" mnttab/mount option on hpux for df(1)
- use nfs_args' fsname field (hpux) to avoid syncer/mount(1) problems
- don't add ops_ufs.o twice to Makefile's $(OBJS)
- don't fail if autofs listener fails to initialize
- hlfsd should test if run as root after usage() and getopt
-
-- minor code cleanups for netbsd
-
-- html docs now in http://www.am-utils.org
-
-- added README file in binaries ftp directory
-
-*** Notes specific to am-utils version 6.0a12:
-
-- minor or updated/broken ports fixed:
- hppa1.1-hp-hpux10.10: compiles, untested (probably works).
- hppa1.1-hp-hpux9.05: compiles, untested (probably works).
- hppa1.1-hp-hpux9.07: compiles, untested (probably works).
- m68k-hp-hpux9.00: compiles, untested (probably works).
- rs6000-ibm-aix4.1.4.0: compiles, untested.
- sparc-sun-solaris2.6: works w/ NFS V.3.
- sparc-sun-sunos4.1.4: compiles, untested (probably works).
-
-- new ports:
- powerpc-ibm-aix4.2.1.0: compiles w/ NFS V.3, untested.
-
-- wire-test also checks for combinations of NFS protocol/version from the
-client to a remote (or local) host.
-
-- conf/mtab/mtab_file.c: use flock() to lock the file, and fcntl() if
-flock() is not available. (Used to prefer fcntl() over flock().)
-
-- bug fixes:
- tli get_nfs_version() gets into an infinite loop
- tli get_nfs_version() should time out faster
- sockets get_nfs_version() should work w/ secure portmappers
- ESTALE returned for NFS mounts for SunOS 4.x fixed
- do not exceed HOSTNAMESZ for nfs_args.hostname (get ENAMETOOLONG)
- properly initialize some mntent_t fields (fsck, freq, mnt_time)
- properly initialize some pcfs_args fields (mask, uid, gid)
- properly initialize some cdfs_args fields (ssector)
-
-*** Notes specific to am-utils version 6.0a11:
-
-- bug fixes:
- amd could not NFS mount v.2 servers from v.3 clients
- hlfsd will only use first occurrence of home dir for same uid
-
-*** Notes specific to am-utils version 6.0a10:
-
-- MAJOR DOCUMENTATION UPDATE! (first time in 6 years)
-
-- new ports:
- m68k-next-nextstep3: configures, compiles, not tested.
-
-- preliminary autofs support. See README.autofs for details.
-
-- new amd.conf [global] yes/no keywords:
- show_statfs_entries: shows number of entries for df(1)
- fully_qualified_hosts: use FQHN for NFS/RPC authentication
-
-- detect down remote hosts faster
-
-- log output of "amd -v" at startup
-
-- removed $osver override for solaris: now it is 2.5.1, not 5.5.1
-
-- buildall will use gmake first if available
-
-- bugs fixed:
- amd core dumped when remote host was down
- allow up to 1024 entries back from readdir()
- amd.conf works even if only [global] option defined
- avoid using bad memcmp() implementations
- fixed meaning of plock [global] option (was reversed)
- hlfsd infinite loop unless compiled with --enable-debug
- NIS code works with NIS+ servers in NIS compatibility mode
- reset tag fields in amd.conf so they don't carry to other entries
-
-*** Notes specific to am-utils version 6.0a9:
-
-- new ports:
- sparc-sun-solaris2.4:
- configures/compiles, and runs (no NFS V3)
- i386-unknown-openbsd2.1:
- configures/compiles, runs (NFS V3)
-
-- updated ports:
- i486-ncr-sysv4.3.03: configures/compiles, not tested
-
-- Multiple amd support: new amd.conf [global] key "portmap_program" can be
-used to specify an alternate RPC program number for amd to un/register.
-Allowed numbers range from 300019 to 300029. A matching new option for amq:
--P prognum, will use an alternate program number to contact.
-
-- man pages:
- amd.conf.5 new
- mk-amd-map.8 new
- amd.8 updated
- amq.8 updated
- (other man pages required minor updates)
-
-- shared libraries support expanded. Using GNU libtool-1.0. You can build
-a shared version of libamu, and link with it accordingly, by specifying
---enable-shared to configure. Default is --enable-static --disable-shared,
-and you can mix and match. See "INSTALL" file for listing of systems on
-which shared libraries seem to build and work fine.
-
-- new option: amq -p, will return the PID of the running amd (local or
-remote). Uses a new RPC message. Useful especially in "ctl-amd stop".
-
-- new configure script options --enable-ldflags, for specifying -L flags.
-The older --enable-libs is to be used only for -l options.
-
-- two new LDAP map options for amd.conf: ldap_cache_seconds and
-ldap_cache_maxmem.
-
-- new script, am-eject from Debian linux's version of amd-upl102.
-
-- additional passwd map support using var[0-3], from Debian folks.
-
-- hesiod code cleanup. works for hesiod 1.3 as well as 3.0.
-
-- removed defunct -h option from amd.
-
-- started using automake-1.2. This fixed several bugs that caused some
-versions of yacc/lex and non-GNU make to fail.
-
-- bug fixes:
- amd/hlfsd mounts should be hidden from df(1)
- use "noconn" option for nfs mounts (multi-homed hosts)
- don't use connected sockets on linux before 1.3.10 (from Debian)
- better checks for [gn]dbm
- forbid excessive retries after timeouts (from Debian)
- readdir(): don't skip over map entries with prefix, and include it
- more assorted linux fixes from Debian folks
- lofs mount on svr4 was broken
- find default value of $karch from uname() not $arch
- hlfsd failed to mount itself on some little-endians
-
-
-*** Notes specific to am-utils version 6.0a8:
-
-- new ports:
- i386-unknown-netbsd1.2.1: configures/compiles (with NFS V.3), works,
- but some OS stability problems exist.
-
-- updated ports:
- hppa1.1-hp-hpux9.01:
- now tested and working
- rs6000-ibm-aix3.2 and rs6000-ibm-aix3.2.5:
- now tested and working
-
-- fixed browsable directories (readdir) code.
-
-- better methods to find amd/hlfsd pid to kill in ctl-{amd,hlfsd}
-
-- "ignore/auto" mount types fixed for irix, sunos, and others, so "df" does not
-show amd mounts by default (but GNU df -a does).
-
-- each time amd is built, a new "build" version is incremented. See amd -v.
-
-- man page for fsinfo added
-
-- empty fillers for new file (bsd44) systems: nullfs, unionfs, umapfs.
-
-- when amd is not running, or portmapper is down, make amq timeout faster (5
-sec) than system default, usually 4-5 minutes.
-
-- bug fixes:
- hlfsd mount got "protocol not supported"
- first regular map in amd.conf didn't inherit global options
- make "bad" versions of lex still work with amd/conf_parse.l
- check for 'nodev' option, not 'nondev'
- typo in "ro" option, and fillers to ac{reg,dir}{min,max} and others
- amd.conf parsing done before switching default log/debug options
- allow doubly-quoted values in amd.conf
- hesiod-reload code cleanup
-
-- assorted code cleanup
-
-
-*** Notes specific to am-utils version 6.0a7:
-
-- new ports:
- i386-unknown-freebsd3.0:
- fully functional with NFS V.3
- sparc-sun-solaris2.3:
- fully functional (should work for 2.4)
- sparc-unknown-netbsd1.2E:
- configures/compiles (with NFS V.3), untested
-
-- updated ports:
- i386-pc-bsdi3.0:
- NFS V.3 works
- look for hesiod in libc
- mips-sgi-irix5.3:
- fully functional with NFS V.3
-
-- LDAP support! New [global] amd.conf options ldap_base and ldap_hostports.
-Also includes a new script amd2ldif to convert amd maps into plain text LDAP
-object files.
-
-- the following amd.conf variables: browsable_dirs, map_options, map_type,
-mount_type, and search_path --- can now be specified in [global] as well as
-the map entry itself. That way you can declare them only once in [global],
-and override them as needed per map.
-
-- option "cluster" added to [global] (HPUX clusters ala "amd -C").
-
-- assorted info_hesiod map fixes and cleanup. removed HESIOD_RELOAD code.
-
-- added netgrp(name) function to amd map syntax to see if current host is in
-the <name> netgroup.
-
-- removed unused option "amd -m".
-
-- filled in "tasks" file with todo items.
-
-- filled "COPYING" file with legal stuff.
-
-- cleanup: all global variables are now in one big structure (struct
-amu_global_options) that's easy to identify and enhance. Also migrated
-several flags that used be an integer each into one unsigned integer that's
-used as a bit-flag.
-
-- big fixes:
- xdr_mountres3 should compile only if has NFS V3
- lex/yacc macros show full pathname (to tell if correct one runs)
- misc fixes/cleanup
-
-
-*** Notes specific to am-utils version 6.0a6:
-
-- amd configuration file!
-
-See scripts/amd.conf-sample for help and some explanation. This new conf
-file allows for the following new features:
-
- default selectors can be turned on/off globally.
- browsable_dirs/readdir() support can be turned on per map.
- search paths for file type maps.
- can force the map type to file, nis, ndbm, etc. rather than default
- to looking at all of them.
- tag each map for "amd -T tag", useful for grouping maps.
- can override $os and others (so if you don't like "sunos5" default
- naming, set os=sos5 and it will work with your old maps).
- and more goodies...
-
-- enable-default-selectors: No longer turned on by the configure script or
-optionally compiled. Code made dynamic and can be turned on or off from the
-amd.conf file. This code is off by default, and must be turned on by
-amd.conf's [global] section.
-
-- new ports:
- mips-sgi-irix5.3: configure/compile, not tested
- i486-ncr-sysv4.3.03: configure/compile, not tested
-
-- updated ports:
- alpha-dec-osf4.0: major code redone
- sparc-sun-sunos4.1.3: fixed and working
- mips-sgi-irix6.2: tested with gcc and "cc -32 -Wl,-woff,84"
- mips-sgi-irix6.4: tested with gcc and "cc -32 -Wl,-woff,84"
-
-- better NFS3 port, including more support for proto= and vers=, and
-automatic determination of proto/vers combination.
-
-- conf/nfs_prot/nfs_prot_*.h: all of the NFS protocol header files had to be
-redone, because of the osf4 port. OSF used very different names for these,
-and they conflicted with am-utils'. The only solution was to more or less
-conform to OSF4's naming, and change all the others.
-
-- ctl-amd script:
- improved to look for amd.conf in $prefix/etc and /etc
- better methods for finding the pid of amd to kill
-
-- autoconf support for LDAP. amd/info_ldap.c needs to be written.
-
-- wire-test also reports the local IP address. Some systems have multiple,
-buggy version of get_myaddress(), esp. SunOS and Irix. Note that Solaris
-x86 has a buggy htonl().
-
-- amd -H prints usage.
-
-- bugs fixed:
- minor TLI problem in fwd_socket
- mount options properly comma delimited
- LIBS is set only to the right set of libraries to include
- selectors-on-default code ignored last selector ent in /defaults
- assorted code cleanups
-
-
-*** Notes specific to am-utils version 6.0a5:
-
-- NFS Version 3 support!!!
-
- Works on Solaris 2.5.1.
- Minimal testing done on Irix 6.
- Compiles cleanly on DU-4.0 but no tests performed.
-
-Will fall back to V2 mounts when V3 is not available. Will also use TCP if
-possible, UDP otherwise.
-
-- Ports to new platforms:
-
- alpha-dec-osf4.0 (not tested)
- i386-pc-bsdi3.0 (tested and working)
- i386-unknown-freebsd2.2.1 (tested and working)
- sparc-unknown-linux-gnu (tested and working)
-
-- New scripts added:
-
- amd2sun: convert amd maps to Sun automount maps
- ctl-amd: script to start/stop/restart amd
- ctl-hlfsd: script to start/stop/restart hlfsd
- expn: expand mail alias (used by hlfsd)
- lostaltmail: redeliver "lost" mail redirected by hlfsd
- lostaltmail.conf-sample: sample conf file for lostaltmail
- wait4amd: run a command once amd is up on a host
- wait4amd2die: wait for an amd process to die before returning
-
-- "amd -v" now includes more info and "amq -v" lists all of it.
-
-- new parser for linux specific mount options.
-
-- Main bugs fixed:
-
- "new toplvl readdir" bug caused amd to dump core
- handler for SIGCHLD didn't check for all possible children
- hlfsd leaking file descriptors when home file system was full
- cdfs/pcfs mounts should not timeout by default
- hesiod domain names should be compared in case-insensitive manner
- several printfs in amq were missing \n
-
-
-*** Notes specific to am-utils version 6.0a4:
-
-- amd services both TCP and UDP amq requests. This will help because of the
-limited UDP message size.
-
-- "amq -M" code is disabled by default because it is insecure. It is
-rarely used. Users who wish to use it should run
-"configure --enable-amq-mount".
-
-
-*** Notes specific to am-utils version 6.0a3:
-
-- New tested ports (configures, compiles, and runs):
-
- i386-unknown-freebsd2.2
-
-- New ports (configures and compiles correctly, not tested):
-
- rs6000-ibm-aix3.2.5
- rs6000-ibm-aix4.1.5.0
-
-- More am-utils programs ported to all existing platforms: hlfsd, fsinfo,
-mk-amd-map, and fixmount.
-
-- Shared libraries: a new configure option --enable-shared will build a
-shared libamu.so, link applications with it, and use it. Reduces binary
-sizes by 20-30%. This is the first step towards loadable modules, as many
-changes had to be done to be able to compile and use PIC code. This is code
-that obviously needs to be generalized to be able to build shared libraries
-on many other platforms. It was only tested on Solaris 5.5.1.
-
-- the file INSTALL contains the latest compatibility table of which
-platforms am-utils configures, compiles and runs on.
-
-- Trimmed down the size of the configure script. Some tests that are not
-used anywhere were removed.
-
-
-*** Notes specific to am-utils version 6.0a2:
-
-- New ports (configures and compiles correctly, not tested):
-
- i386-pc-bsdi2.1
- hppa1.1-hp-hpux9.01
- hppa1.1-hp-hpux10.20
-
-- new configure options:
-
- --enable-cppflags[=ARG]
- configure/compile with ARG (-I) preprocessor flags
- --enable-libs[=ARG]
- configure/compile with ARG (-L/-l) library flags
-
-- file system, mount table entries, and mount type tests can now look in
-/lib/modules and /proc/filesystems for statically/dyadically loadable kernel
-modules (linux)
-
-- prefer vfat over msdos/pc/etc file system for PCFS.
-
-- moved all fixed headers to include/am_defs. Left only #define/#undef
-entries in aux/acconfig.h.
-
-- make more sense of systems that have full, partial, or no NFS protocol
-headers.
-
-- minor fixes for NetBSD (untested platform).
-
-- hesiod map fixed.
-
-- buildall -D: new option to run even stricter developer options.
-
-- lots of other bugs fixed (see ChangeLog).
-
-
-*** Notes specific to am-utils version 6.0a1:
-
-I have it configure and build correctly for the following systems:
-
- i386-pc-solaris2.5.1
- i386-unknown-freebsd2.1.0
- mips-sgi-irix6.2
- sparc-sun-solaris2.5.1
- sparc-sun-sunos4.1.3
-
-Amq, wire-test, and "amd -v" work on all of the above. A real running amd
-was only tested and confirmed working on
-
- i386-pc-solaris2.5.1
- sparc-sun-solaris2.5.1
-
-Many things are still missing: options, features, etc. But for now, let's
-concentrate on getting the basic functionality working on the more popular
-systems.
diff --git a/contrib/amd/README b/contrib/amd/README
deleted file mode 100644
index 0b3ce46beb63..000000000000
--- a/contrib/amd/README
+++ /dev/null
@@ -1,104 +0,0 @@
-This is the official version of am-utils.
-
-See the file NEWS for news on this and previous releases.
-
-*** General Notes to alpha/beta testers:
-
-[A] as alpha/beta testers, I expect you to be able to find certain things on
-your own (especially look at the sources to figure out how things work).
-
-[B] if you intend to modify any files, first find out if the file you want
-to modify gets autogenerated from some other place. If so, modify it at the
-source.
-
-You can adjust some of the configuration of am-utils after it has been
-auto-configured by putting whatever definitions you wish in a file called
-localconfig.h, located in the top build directory (the same one where
-config.h is created for you).
-
-[C] there are several ways you can build am-utils:
-
-(1) run the buildall script as follows:
-
- ./buildall
-
-This would build all the applications inside a special directory relative to
-the root of the source tree, called A.<cpu-company-system>, where the <>
-part is filled in by GNU's config.guess script. This is the preferred
-method, for it will separate the build from the sources, and allow you to
-run buildall for multiple architectures concurrently.
-
-You can run "buildall -h" to see what options it takes.
-
-(2) run the configure script such as:
-
- ./configure
-
-and then run
-
- make
-
-This would configure amd in the directory you've run the configure script
-in, and the built it there. Run "make install" to install all the necessary
-files.
-
-Note that this is good for building only one version of amd on one
-architecture! Don't try this for multiple architectures. If you must, then
-after doing one such build, run "make distclean" and then reconfigure for
-another architecture.
-
-(3) run the configure script for build in a different location. Let's say
-that /src/am-utils-6.0 is where you unpacked the sources. So you could
-
- mkdir /src/build/sunos5
- cd /src/build/sunos5
- /src/am-utils-6.0/configure --srcdir=/src/am-utils-6.0
- make
-
-This is a manual method that will let you build in any directory outside the
-am-utils source tree. It requires that your "make" program understand
-VPATH. This can be used multiple times to build am-utils concurrently in
-multiple (but different) directories. In fact, the buildall script
-described above does precisely that, using the A.* subdirectories.
-
-(4) If you need to configure am-utils with extra libraries and/or headers,
-for example to add hesiod support, do so as follows:
-
- configure --enable-libs="-lhesiod -lresolv" \
- --enable-ldflags="-L/usr/local/hesiod/lib" \
- --enable-cppflags="-I/usr/local/hesiod/include"
-
-[D] If you modify any of the *.[chyl] sources in the directories amd, amq,
-hlfsd, lib, etc, all you need to do to get a new version of am-utils is run
-make.
-
-If you modify any of the files in the m4/ or conf/ directories, or any *.in
-or *.am file, then you must rebuild the configure script, Makefile.in files,
-aclocal.m4, etc. The best way to do so is to run
-
- ./bootstrap
-or
- ./buildall -K
-
-To be a developer and be able to run "bootstrap", you must have
-autoconf-2.50, automake-1.5, and libtool 1.4 installed on your system (or
-later versions thereof). You no longer need to get my special version of
-automake. Contact me if you'd like to be a maintainer and get access to the
-CVS server.
-
-After you've remade the basic configuration files you must rerun the
-buildall script to rerun configure and then remake the binaries.
-
-Modifying M4 macros may not be very intuitive to anyone that has not done so
-before. Let me know if you are having any problems with them. I fully
-expect, at least initially, to have to be the sole developers of the M4
-macros and let others concentrate on C sources.
-
-[E] Report all bugs to am-utils@am-utils.org. Avoid reporting to my
-personal email address. It is important to involve the whole list in bug
-fixes etc.
-
-Good luck.
-
-Erez Zadok,
-Maintainer, am-utils.
diff --git a/contrib/amd/README.attrcache b/contrib/amd/README.attrcache
deleted file mode 100644
index e8522d226ebe..000000000000
--- a/contrib/amd/README.attrcache
+++ /dev/null
@@ -1,129 +0,0 @@
- NFS Attribute Caching OS Problems and Amd
- Last updated September 18, 2005
-
-* Summary:
-
-Some OSs don't seem to have a way to turn off the NFS attribute cache, which
-breaks the Amd automounter so badly that it is not recommend using Amd on
-such OS for heavy use, not until this is fixed.
-
-
-* Details:
-
-Amd is a user-level NFSv2 server that manages automounts of all other file
-systems. The kernel contacts Amd via RPCs, and Amd in turn performs the
-actual mounts, and then responds back to the kernel's RPCs. Every kernel
-caches attributes of files, in a cache called the Directory Name Lookup
-Cache (DNLC), or a Directory Cache (dcache).
-
-Amd manages its namespace in the user level, but the kernel caches names
-itself. So the two must coordinate to ensure that both namespaces are in
-sync. If the kernel uses a cached entry from the DNLC, without consulting
-Amd, users may see corruption of the automounter namespace (symlinks
-pointing to the wrong places, ESTALE errors, and more). For example,
-suppose Amd timed out an entry and removed the entry from Amd's namespace.
-Amd has to tell the kernel to purge its corresponding DNLC entry too. The
-way Amd often does that is by incrementing the last modification time
-(mtime) of the parent directory. This is the most common method for kernels
-to check if their DNLC entries are stale: if the parent directory mtime is
-newer, the kernel will discard all cached entries for that directory, and
-will re-issue lookup methods. Those lookups will result in
-NFS_GETATTR/NFS_LOOKUP calls sent from the kernel down to Amd, and Amd can
-then properly inform the kernel of the new state of automounted entries.
-
-In order to ensure that Amd is "in charge" of its namespace without
-interference from the kernel, Amd will try to turn off the NFS attribute
-cache. It does so by using the NFSMNT_NOAC flag, if it exists, or by
-setting various "cache timeout" fields in struct nfs_args to 0 (acregmin,
-acregmax, acdirmin, or acdirmax).
-
-We have released a major new version of am-utils, version 6.1, in June 2005.
-Since then, a lot of people have experimented with Amd, in anticipation of
-migrating from the very old am-utils 6.0 to the new 6.1. For a couple of
-months since the release of 6.1, we have received reports of problems with
-Amd, especially under heavy use. Users reported getting ESTALE errors from
-time to time, or seeing automounted entries whose symlinks don't point to
-where it should be. After much debugging, we traced it to a few places in
-Amd where it wasn't updating the parent directory mtime as it should have;
-in some places where Amd was indeed updating the mtime, it was using a
-resolution of only 1 second, which was not fine enough under heavy load. We
-fixed this problem and switched to using a microsecond resolution mtime.
-
-After fixing this in Amd, we went on to verify that things work for other
-OSs. When we got to test certain BSDs, we found out that they always cache
-directory entries, and there is no way to turn it off completely.
-Specifically, if we set the ac{reg,dir}{min,max} fields in struct nfs_args
-all to zero, the kernel seems to cache the entries for a default number of
-seconds (something like 5-30 seconds). On some OSs, setting these four
-fields to 0 turns off the attribute cache, but not on some BSDs. We were
-able to verify this using Amd and a script that exercises the interaction of
-the kernel's attrcache and Amd. (If you're interested, the script can be
-made available.)
-
-We then experimented by setting the ac{reg,dir}{min,max} fields in struct
-nfs_args all to 1, the smallest non-zero value we could. When we ran the
-Amd exercising script, we found that the value of 1 reduced the race between
-the DNLC and Amd, and the script took a little longer to run before it
-detected an incoherency. That makes sense: the smaller the DNLC cache
-interval is, the shorter the window of vulnerability is. (BTW, the man
-pages on some OSs say that the ac{reg,dir}{min,max} fields use a 1 second
-resolution, but experimentation indicated it was in 0.1 second units.)
-
-Clearly, setting the ac{reg,dir}{min,max} fields to 0 is worse than setting
-it to 1 on those OSs that don't have a way to turn off the attribute cache.
-So the current workaround I've implemented in am-utils is to create a
-configuration parameter called "broken_attrcache" which, if turned on, will
-set these nfs_args fields to 1 instead of 0. I wish I didn't have to create
-such ugly workaround features in Amd, but I've got no choice.
-
-The near term solution is for every OS to support a true 'noac' flag, which
-can be added fairly easily. This'd make Amd work reliably.
-
-The long term solution is to implement Autofs support for all OSs and to
-support it in Amd. Currently, Amd supports autofs on Solaris and Linux;
-FreeBSD is next. Still, we found that even with autofs support, many
-sysadmins still prefer to use the good 'ol non-autofs mode.
-
-
-* Confirmed Status
-
-This is the confirmed status of various OSs' vulnerability to this attribute
-cache bug. We are slowly checking the status of other OSs. The status of
-any OS not listed is unknown as of the date at the top of this file.
-
-** Not Vulnerable (support a proper "noac" flag):
-
-Sun Solaris 8 and 9 (10 probably works fine)
-Linux: 2.6.11 kernel (2.4.latest probably works fine)
-FreeBSD 5.4 and 6.0-SNAP001 (older versions probably work fine)
-OpenBSD 3.7 (older versions probably work fine)
-
-** Vulnerable (don't support a proper "noac" flag natively):
-
-NetBSD 2.0.2 (older versions are also probably affected)
-
-Note: NetBSD has promised to support a noac flag hopefully after 2.1.0 is
-released (maybe in 3.0 or 2.2). In the mean time, you can apply one of
-these two kernel patchs to support a 'noac' flag in NetBSD 2.x or 3.x:
- ftp://ftp.netbsd.org/pub/NetBSD/misc/christos/2x.nfs.noac.diff
- ftp://ftp.netbsd.org/pub/NetBSD/misc/christos/3x.nfs.noac.diff
-After applying this patch and rebuilding your kernel, reboot with the new
-kernel. Then copy the new nfs.h and nfsmount.h from /sys/nfs/ to
-/usr/include/nfs/, and finally rebuild am-utils from scratch.
-
-** Testing
-
-When you build am-utils, a script named scripts/test-attrcache is built,
-which can be used to test the NFS attribute cache behavior of the current
-OS. You can run this script as root as follows:
-
-# make install
-# cd scripts
-# sh test-attrcache
-
-If you run this script on an OS whose status is known (and not listed
-above), please report it to am-utils@am-utils.org, so we can record it in
-this file.
-
-Sincerely,
-Erez.
diff --git a/contrib/amd/README.ldap b/contrib/amd/README.ldap
deleted file mode 100644
index 715113442552..000000000000
--- a/contrib/amd/README.ldap
+++ /dev/null
@@ -1,57 +0,0 @@
-LDAP support for am-utils was originally done by Leif Johansson
-<leifj@it.su.se>. He no longer maintains it.
-
-The current LDAP support for am-utils is for LDAPv2 only. Reportedly,
-LDAPv3 mostly works. Volunteers and patches are welcome.
-
-The IANA has assigned the following Private Enterprise Number to:
-
- 10180 Am-utils Organization Erez Zadok ezk@am-utils.org
-
-There are three files in this directory that relate to LDAP:
-
-ldap.schema:
-
- This is the most current schema.
-
-ldap-id.txt:
-
- This is an experimental schema for amd mount maps in LDAP. Since
- LDAP isn't maintained now, this code may not match with either the
- current ldap_info.c code or with Amd mount maps in general.
-
- The schema is written in the form of an internet-draft but it has
- not been published as such. We need volunteers who know and use
- LDAP to clean it up and further its process of submission.
-
-ldap-id.ms:
-
- This is the NROFF source of the draft. To generate the text from
- it, run "nroff -ms ldap-id.ms > ldap-id.txt"
-
-Erez.
-
-------- Forwarded Message
-
-From: "IANA Private Enterprise Number" <iana-pen@icann.org>
-To: "Erez Zadok" <ezk@cs.columbia.edu>
-Subject: RE: Application for Enterprise-number (10180)
-Date: Sun, 15 Jul 2001 14:43:45 -0700
-
-Dear Erez,
-
-The IANA has assigned the following Private Enterprise
-Number to:
-
-10180 Am-utils Organization Erez Zadok ezk@am-utils.org
-
-Please notify the IANA if there is a change in your contact
-or company information.
-
-Thank you,
-
-Bill Huang
-IANA - Private Enterprise Numbers
-
-------- End of Forwarded Message
-
diff --git a/contrib/amd/README.y2k b/contrib/amd/README.y2k
deleted file mode 100644
index e75bd122590e..000000000000
--- a/contrib/amd/README.y2k
+++ /dev/null
@@ -1,27 +0,0 @@
- AM-UTILS YEAR-2000 COMPLIANCE
-
-Most likely am-utils is y2k compliant.
-
-I do not know for sure because I have not certified am-utils myself, nor do
-I have the time for it. I do not think that amd will be affected by y2k at
-all, because it does not do anything with dates other than print the date on
-the log file, in whatever format is provided by your os/libc --- especially
-the ctime(3) call.
-
-However, on Friday, September 18th 1998, Matthew Crosby <mcrosby@ms.com>
-reported that they evaluated 6.0a16 and found it to be compliant.
-
-On March 26, 1999, Paul Balyoz <pbalyoz@sedona.ch.intel.com> submitted a
-patch to lostaltmail which makes it print Y2K compliant dates. He used a
-code scanner and manually "eyeballed" the code and could not find any more
-problems. Paul's patch is included in am-utils-6.0.1s7 and newer versions.
-Paul also said that other 2-digit years used in am-utils are "harmless."
-
-NOTE: NONE OF THE PERSONS MENTIONED HERE, AUTHOR INCLUDED, ARE WILLING TO
-CERTIFY AM-UTILS AS Y2K COMPLIANT. USE AT YOUR OWN RISK.
-
----
-Erez Zadok.
-Maintainer, am-utils package and am-utils list.
-Email: am-utils@am-utils.org
-WWW: http://www.am-utils.org
diff --git a/contrib/amd/TODO b/contrib/amd/TODO
deleted file mode 100644
index 07fb5559678c..000000000000
--- a/contrib/amd/TODO
+++ /dev/null
@@ -1,177 +0,0 @@
-# -*- text -*-
-
-Make a tasks file that people can pick jobs off of.
-
-take a look at am_compat.h and fix everything there...
-
-fix all $Id bla bla bla $ on every file.
-add my own copyright 1997 etc.
-
-NOT NEEDED: convert DEBUG symbol to ENABLE_DEBUG
-NOT NEEDED: convert DEBUG_MEM symbol to ENABLE_DEBUG_MEM
-
-Use these two somewhere:
-AC_DEFINE(AM_UTILS_NAME_PACKAGE, "am-utils")
-AC_DEFINE(AM_UTILS_VERSION, "6.0a1)
-
-check all "dnl XXX: in configure.in
-
-check for: INLINE, Const->const, P_void, VOIDP
-
-rename DEBUG_MTAB to DEBUG_MNTTAB
-rename UPDATE_MTAB to MOUNT_TABLE_ON_FILE
-rename HAS_NIS_MAPS to HAVE_MAP_NIS
-rename HAS_TFS to HAVE_FS_TFS
-rename SIG_HNDL_TYP to RETSIGTYPE
-
-remove HOST_EXEC #define from everywhere. add to am_ops.c a static flag
-initialized_vops, which if not true, should set the host_ops vector field to
-0 or host_umounted. This way let the feature be turned on if -h option to
-amd is given.
-
-nuke all code that is ifdef'd SUNOS4_COMPAT
-
-rename NEED_MNTOPT_PARSER to HAVE_HASMNTOPT and cleanup the code. also take
-the supplied code in amd/mount_fs.c and include it as the library function
-libamd/hasmntopt.c
-
-TLI code needs to be fixed.
-
-a way to include a site-specific configuration file IFF it exists from
-directory local/<${target}.h>
-
-replace #include WAIT with nothing (HAVE_SYS_WAIT_H?)
-
-replace SYS5_SIGNALS with HAVE_SYS_WAIT_H (which is on only if it sys/wait.h
-exists and is using the newer "int" for type, not "union wait". The macro
-AC_HEADER_SYS_WAIT turns on HAVE_SYS_WAIT_H iff wait*() functions are
-posix.1 compliant. Make sure you don't remove SYS5_SIGNALS ifdef's that are
-not related to wait*() syscalls.
-
-add username, hostname, and date at which time amd was compiled.
-
-No more need for MOUNT_HELPER_SOURCE.
-
-any code which is included by NEED_UMOUNT_FS, should be on iff
-MOUNT_TABLE_ON_FILE is on.
-
-replace NFS_FH_FIELD with references fo ".fh" in calls to
-NFS_FH_DREF(src, dst) macro
-
-For *EVERY* M4 Macro with case/esac, check that the $host_os case entries
-are correct.
-
-I'm not using amd's regexp code. Instead, use generic system code. If the
-system has posix style regexp functions, then change amd/map.c to use
-correct new prototype.
-
-use HAVE_SVC_GETREQSET instead of RPC_4.
-
-replace all "jsp" in *.[hc] $Id: TODO,v 1.1.1.1 1998/11/05 02:04:19 ezk Exp $ with ezk.
-
-use MNTTAB_FILE_NAME instead of MOUNTED
-
-use MOUNT_TABLE_ON_FILE instead of READ_MTAB_FROM_FILE
-
-no more HAS_EMPTY_AUTOMOUNTS, which was used if a df(1) divide by zero bug
-was invoked. Instead, change nfs_statfs() code to always return non-zero
-values. Then nuke HAS_EMPTY_AUTOMOUNTS.
-
-REGEXP: use whatever regular expressionlibrary you have on the system,
-including regexp.h if available, and using regcomp/regexec. Amd was written
-with BSD regexps in mind, not Sys V, so if I use any of those, I have to
-watch for correct usage. Otherwise, I can include the older include/re.h
-and amd/re.c. Replace HAS_REGEXP with HAVE_REGEXEC.
-
-The regex code in amd/mapc.c has changed a lot. It probably has bugs. Must
-test and debug it!!!
-
-# string name of filesystem in /etc/mnttab file
-Use MNTTAB_TYPE_FOO instead of MTAB_TYPE_FOO.
-# string name of mount option in /etc/mnttab file
-Use MNTTAB_OPT_FOO instead of MNTOPT_FOO.
-# string (or integer?) name of filesystem type in mount(2) syscall
-Use MOUNT_TYPE_FOO instead of MNTTYPE_FOO or MOUNT_FOO.
-# hex/number of FS mount option in nfs_args passed to mount(2) syscall
-Use MNT2_NFS_OPT_FOO instead NFSMNT_FOO.
-# hex/number of generic FS mount option directly passed to mount(2) syscall
-Use MNT2_GEN_OPT_FOO instead of MS_FOO or M_FOO.
-
-
-update AMD_COMPAT to 6.0 in include/am_utils.h
-
-convert all mem* functions b* functions (memset to bzero, etc.) or vice
-verse.
-
-put my name/copyright on every src file
-
-change all struct mnttab/mntent to "mntent_t"
-
-cleanup lib/resvport.c (TLI vs. Sockets). TLI code is #defin'ed
-HAVE_T_OPEN.
-[
-setting MTAB_LOCK_FILE (mtab_svr4.c) should be an amd run-time configuration
-option.
-
-change all UMOUNT_FS macros to umount_fs() fxn calls.
-
-remove getnetbyaddr() from lib/getnetbyaddr.c and then link w/ -lsocket
-
-take care of various (hlfsd et al) scripts in Makefile.am files.
-
-rename HOSTNAMESZ to MAXHOSTNAMELEN
-
-turn on all the NEW_TOPLVL_READDIR code (for "ls" to work in an amd point)
-
-change all NEW_DEFAULTS to ENABLE_DEFAULT_SELECTOTS (which is now on by
-default)
-
-remove refereces to mnt_freq and mnt_passno in mntent_t since it's not in
-use any more.
-
-remove all the (lint?) comments /*ARGSUSED */
-
-change HAS_FOOFS to HAVE_AM_FS_FOO (for example HAS_NFSX -> HAVE_AM_FS_FOO),
-but change HAS_UNION_FS to HAVE_AM_FS_UNION.
-
-some code uses #ifdef M_NEWTYPE to tell if mount(2)'s type field is "char *"
-or int. Use MTYPE_TYPE declaration instead (not ifdef macro!)
-
-change DEBUG_MTAB to DEBUG_MNTTAB
-
-deal with the changes in values of $os, $arch, and $osver!
-
-replace SYS5_SIGNALS with REINSTATE_SIGNAL_HANDLER
-
-figure out how to auto-conf HAS_HESIOD_RELOAD (amd/info_hesiod.c). For now
-I've used the macro HAVE_HS_ZONE_TRANSFER.
-
-
-
-
-******************************************************************************
-PERL SCRIPT TO FIX OLD AMD MAPS:
-- fix '=' to ':='
-- fix sos5 -> solaris2, etc.
-
-******************************************************************************
-USE AS IS:
-
-- SVC_IN_ARG_TYPE (change from SVC_IN_ARGS_TYPE, with an 'S')
-- NFS_FH_TYPE
-- MTYPE_TYPE
-- MOUNT_TYPE_* NO!!!
-
-******************************************************************************
-NEW FEATURES:
-
-- autofs
-- cachefs
-- dbm/gdbm/db file maps
-- add amd option -O (override) to override $os, $osver, $arch, $karch, etc.
-
-******************************************************************************
-DONE:
-
-HAS_TFS is gone and all of it's code too.
-major code cleanup, removed if 0 code and if notdef
diff --git a/contrib/amd/amd/am_ops.c b/contrib/amd/amd/am_ops.c
deleted file mode 100644
index 5a5c33650eca..000000000000
--- a/contrib/amd/amd/am_ops.c
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/am_ops.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/*
- * The order of these entries matters, since lookups in this table are done
- * on a first-match basis. The entries below are a mixture of native
- * filesystems supported by the OS (HAVE_FS_FOO), and some meta-filesystems
- * supported by amd (HAVE_AMU_FS_FOO). The order is set here in expected
- * match-hit such that more popular filesystems are listed first (nfs is the
- * most popular, followed by a symlink F/S)
- */
-static am_ops *vops[] =
-{
-#ifdef HAVE_FS_NFS
- &nfs_ops, /* network F/S (version 2) */
-#endif /* HAVE_FS_NFS */
-#ifdef HAVE_AMU_FS_LINK
- &amfs_link_ops, /* symlink F/S */
-#endif /* HAVE_AMU_FS_LINK */
-
- /*
- * Other amd-supported meta-filesystems.
- */
-#ifdef HAVE_AMU_FS_NFSX
- &amfs_nfsx_ops, /* multiple-nfs F/S */
-#endif /* HAVE_AMU_FS_NFSX */
-#ifdef HAVE_AMU_FS_NFSL
- &amfs_nfsl_ops, /* NFS with local link existence check */
-#endif /* HAVE_AMU_FS_NFSL */
-#ifdef HAVE_AMU_FS_HOST
- &amfs_host_ops, /* multiple exported nfs F/S */
-#endif /* HAVE_AMU_FS_HOST */
-#ifdef HAVE_AMU_FS_LINKX
- &amfs_linkx_ops, /* symlink F/S with link target verify */
-#endif /* HAVE_AMU_FS_LINKX */
-#ifdef HAVE_AMU_FS_PROGRAM
- &amfs_program_ops, /* program F/S */
-#endif /* HAVE_AMU_FS_PROGRAM */
-#ifdef HAVE_AMU_FS_UNION
- &amfs_union_ops, /* union F/S */
-#endif /* HAVE_AMU_FS_UNION */
-
- /*
- * A few more native filesystems.
- */
-#ifdef HAVE_FS_UFS
- &ufs_ops, /* Unix F/S */
-#endif /* HAVE_FS_UFS */
-#ifdef HAVE_FS_XFS
- &xfs_ops, /* Unix (irix) F/S */
-#endif /* HAVE_FS_XFS */
-#ifdef HAVE_FS_EFS
- &efs_ops, /* Unix (irix) F/S */
-#endif /* HAVE_FS_EFS */
-#ifdef HAVE_FS_LOFS
- &lofs_ops, /* loopback F/S */
-#endif /* HAVE_FS_LOFS */
-#ifdef HAVE_FS_CDFS
- &cdfs_ops, /* CDROM/HSFS/ISO9960 F/S */
-#endif /* HAVE_FS_CDFS */
-#ifdef HAVE_FS_PCFS
- &pcfs_ops, /* Floppy/MSDOS F/S */
-#endif /* HAVE_FS_PCFS */
-#ifdef HAVE_FS_CACHEFS
- &cachefs_ops, /* caching F/S */
-#endif /* HAVE_FS_CACHEFS */
-#ifdef HAVE_FS_NULLFS
-/* FILL IN */ /* null (loopback) F/S */
-#endif /* HAVE_FS_NULLFS */
-#ifdef HAVE_FS_UNIONFS
-/* FILL IN */ /* union (bsd44) F/S */
-#endif /* HAVE_FS_UNIONFS */
-#ifdef HAVE_FS_UMAPFS
-/* FILL IN */ /* uid/gid mapping F/S */
-#endif /* HAVE_FS_UMAPFS */
-
- /*
- * These 4 should be last, in the order:
- * (1) amfs_auto
- * (2) amfs_direct
- * (3) amfs_toplvl
- * (4) amfs_error
- */
-#ifdef HAVE_AMU_FS_AUTO
- &amfs_auto_ops, /* Automounter F/S */
-#endif /* HAVE_AMU_FS_AUTO */
-#ifdef HAVE_AMU_FS_DIRECT
- &amfs_direct_ops, /* direct-mount F/S */
-#endif /* HAVE_AMU_FS_DIRECT */
-#ifdef HAVE_AMU_FS_TOPLVL
- &amfs_toplvl_ops, /* top-level mount F/S */
-#endif /* HAVE_AMU_FS_TOPLVL */
-#ifdef HAVE_AMU_FS_ERROR
- &amfs_error_ops, /* error F/S */
-#endif /* HAVE_AMU_FS_ERROR */
- 0
-};
-
-
-void
-ops_showamfstypes(char *buf, size_t l)
-{
- struct am_ops **ap;
- int linesize = 0;
-
- buf[0] = '\0';
- for (ap = vops; *ap; ap++) {
- xstrlcat(buf, (*ap)->fs_type, l);
- if (ap[1])
- xstrlcat(buf, ", ", l);
- linesize += strlen((*ap)->fs_type) + 2;
- if (linesize > 62) {
- linesize = 0;
- xstrlcat(buf, "\n ", l);
- }
- }
-}
-
-
-static void
-ops_show1(char *buf, size_t l, int *linesizep, const char *name)
-{
- xstrlcat(buf, name, l);
- xstrlcat(buf, ", ", l);
- *linesizep += strlen(name) + 2;
- if (*linesizep > 60) {
- xstrlcat(buf, "\t\n", l);
- *linesizep = 0;
- }
-}
-
-
-void
-ops_showfstypes(char *buf, size_t l)
-{
- int linesize = 0;
-
- buf[0] = '\0';
-
-#ifdef MNTTAB_TYPE_AUTOFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_AUTOFS);
-#endif /* MNTTAB_TYPE_AUTOFS */
-
-#ifdef MNTTAB_TYPE_CACHEFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_CACHEFS);
-#endif /* MNTTAB_TYPE_CACHEFS */
-
-#ifdef MNTTAB_TYPE_CDFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_CDFS);
-#endif /* MNTTAB_TYPE_CDFS */
-
-#ifdef MNTTAB_TYPE_CFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_CFS);
-#endif /* MNTTAB_TYPE_CFS */
-
-#ifdef MNTTAB_TYPE_LOFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_LOFS);
-#endif /* MNTTAB_TYPE_LOFS */
-
-#ifdef MNTTAB_TYPE_EFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_EFS);
-#endif /* MNTTAB_TYPE_EFS */
-
-#ifdef MNTTAB_TYPE_MFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_MFS);
-#endif /* MNTTAB_TYPE_MFS */
-
-#ifdef MNTTAB_TYPE_NFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_NFS);
-#endif /* MNTTAB_TYPE_NFS */
-
-#ifdef MNTTAB_TYPE_NFS3
- ops_show1(buf, l, &linesize, "nfs3"); /* always hard-code as nfs3 */
-#endif /* MNTTAB_TYPE_NFS3 */
-
-#ifdef MNTTAB_TYPE_NULLFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_NULLFS);
-#endif /* MNTTAB_TYPE_NULLFS */
-
-#ifdef MNTTAB_TYPE_PCFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_PCFS);
-#endif /* MNTTAB_TYPE_PCFS */
-
-#ifdef MNTTAB_TYPE_TFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_TFS);
-#endif /* MNTTAB_TYPE_TFS */
-
-#ifdef MNTTAB_TYPE_TMPFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_TMPFS);
-#endif /* MNTTAB_TYPE_TMPFS */
-
-#ifdef MNTTAB_TYPE_UFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_UFS);
-#endif /* MNTTAB_TYPE_UFS */
-
-#ifdef MNTTAB_TYPE_UMAPFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_UMAPFS);
-#endif /* MNTTAB_TYPE_UMAPFS */
-
-#ifdef MNTTAB_TYPE_UNIONFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_UNIONFS);
-#endif /* MNTTAB_TYPE_UNIONFS */
-
-#ifdef MNTTAB_TYPE_XFS
- ops_show1(buf, l, &linesize, MNTTAB_TYPE_XFS);
-#endif /* MNTTAB_TYPE_XFS */
-
- /* terminate with a period, newline, and NULL */
- if (buf[strlen(buf)-1] == '\n')
- buf[strlen(buf) - 4] = '\0';
- else
- buf[strlen(buf) - 2] = '\0';
- xstrlcat(buf, ".\n", l);
-}
-
-
-/*
- * return string option which is the reverse of opt.
- * nosuid -> suid
- * quota -> noquota
- * ro -> rw
- * etc.
- * may return pointer to static buffer or subpointer within opt.
- */
-static char *
-reverse_option(const char *opt)
-{
- static char buf[80];
-
- /* sanity check */
- if (!opt)
- return NULL;
-
- /* check special cases */
- /* XXX: if this gets too long, rewrite the code more flexibly */
- if (STREQ(opt, "ro")) return "rw";
- if (STREQ(opt, "rw")) return "ro";
- if (STREQ(opt, "bg")) return "fg";
- if (STREQ(opt, "fg")) return "bg";
- if (STREQ(opt, "soft")) return "hard";
- if (STREQ(opt, "hard")) return "soft";
-
- /* check if string starts with 'no' and chop it */
- if (NSTREQ(opt, "no", 2)) {
- xstrlcpy(buf, &opt[2], sizeof(buf));
- } else {
- /* finally return a string prepended with 'no' */
- xstrlcpy(buf, "no", sizeof(buf));
- xstrlcat(buf, opt, sizeof(buf));
- }
- return buf;
-}
-
-
-/*
- * start with an empty string. for each opts1 option that is not
- * in opts2, add it to the string (make sure the reverse of it
- * isn't in either). finally add opts2. return new string.
- * Both opts1 and opts2 must not be null!
- * Caller must eventually free the string being returned.
- */
-static char *
-merge_opts(const char *opts1, const char *opts2)
-{
- mntent_t mnt2; /* place holder for opts2 */
- char *newstr; /* new string to return (malloc'ed) */
- char *tmpstr; /* temp */
- char *eq; /* pointer to whatever follows '=' within temp */
- char oneopt[80]; /* one option w/o value if any */
- char *revoneopt; /* reverse of oneopt */
- size_t len = strlen(opts1) + strlen(opts2) + 2; /* space for "," and NULL */
- char *s1 = strdup(opts1); /* copy of opts1 to munge */
-
- /* initialization */
- mnt2.mnt_opts = (char *) opts2;
- newstr = xmalloc(len);
- newstr[0] = '\0';
-
- for (tmpstr = strtok(s1, ",");
- tmpstr;
- tmpstr = strtok(NULL, ",")) {
- /* copy option to temp buffer */
- xstrlcpy(oneopt, tmpstr, 80);
- /* if option has a value such as rsize=1024, chop the value part */
- if ((eq = haseq(oneopt)))
- *eq = '\0';
- /* find reverse option of oneopt */
- revoneopt = reverse_option(oneopt);
- /* if option orits reverse exist in opts2, ignore it */
- if (amu_hasmntopt(&mnt2, oneopt) || amu_hasmntopt(&mnt2, revoneopt))
- continue;
- /* add option to returned string */
- if (newstr[0]) {
- xstrlcat(newstr, ",", len);
- xstrlcat(newstr, tmpstr, len);
- } else {
- xstrlcpy(newstr, tmpstr, len);
- }
- }
-
- /* finally, append opts2 itself */
- if (newstr[0]) {
- xstrlcat(newstr, ",", len);
- xstrlcat(newstr, opts2, len);
- } else {
- xstrlcpy(newstr, opts2, len);
- }
-
- XFREE(s1);
- return newstr;
-}
-
-
-am_ops *
-ops_search(char *type)
-{
- am_ops **vp;
- am_ops *rop = 0;
- for (vp = vops; (rop = *vp); vp++)
- if (STREQ(rop->fs_type, type))
- break;
- return rop;
-}
-
-
-am_ops *
-ops_match(am_opts *fo, char *key, char *g_key, char *path, char *keym, char *map)
-{
- am_ops *rop = 0;
- char *link_dir;
-
- /*
- * First crack the global opts and the local opts
- */
- if (!eval_fs_opts(fo, key, g_key, path, keym, map)) {
- rop = &amfs_error_ops;
- } else if (fo->opt_type == 0) {
- plog(XLOG_USER, "No fs type specified (key = \"%s\", map = \"%s\")", keym, map);
- rop = &amfs_error_ops;
- } else {
- /*
- * Next find the correct filesystem type
- */
- rop = ops_search(fo->opt_type);
- if (!rop) {
- plog(XLOG_USER, "fs type \"%s\" not recognized", fo->opt_type);
- rop = &amfs_error_ops;
- }
- }
-
- /*
- * Make sure we have a default mount option.
- * Otherwise skip past any leading '-'.
- */
- if (fo->opt_opts == 0)
- fo->opt_opts = strdup("rw,defaults");
- else if (*fo->opt_opts == '-') {
- /*
- * We cannot simply do fo->opt_opts++ here since the opts
- * module will try to free the pointer fo->opt_opts later.
- * So just reallocate the thing -- stolcke 11/11/94
- */
- char *old = fo->opt_opts;
- fo->opt_opts = strdup(old + 1);
- XFREE(old);
- }
-
- /*
- * If addopts option was used, then append it to the
- * current options and remote mount options.
- */
- if (fo->opt_addopts) {
- if (STREQ(fo->opt_opts, fo->opt_remopts)) {
- /* optimize things for the common case where opts==remopts */
- char *mergedstr;
- mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts);
- plog(XLOG_INFO, "merge rem/opts \"%s\" add \"%s\" => \"%s\"",
- fo->opt_opts, fo->opt_addopts, mergedstr);
- XFREE(fo->opt_opts);
- XFREE(fo->opt_remopts);
- fo->opt_opts = mergedstr;
- fo->opt_remopts = strdup(mergedstr);
- } else {
- char *mergedstr, *remmergedstr;
- mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts);
- plog(XLOG_INFO, "merge opts \"%s\" add \"%s\" => \"%s\"",
- fo->opt_opts, fo->opt_addopts, mergedstr);
- XFREE(fo->opt_opts);
- fo->opt_opts = mergedstr;
- remmergedstr = merge_opts(fo->opt_remopts, fo->opt_addopts);
- plog(XLOG_INFO, "merge remopts \"%s\" add \"%s\" => \"%s\"",
- fo->opt_remopts, fo->opt_addopts, remmergedstr);
- XFREE(fo->opt_remopts);
- fo->opt_remopts = remmergedstr;
- }
- }
-
- /*
- * Initialize opt_mount_type to "nfs", if it's not initialized already
- */
- if (!fo->opt_mount_type)
- fo->opt_mount_type = "nfs";
-
- /* Normalize the sublink and make it absolute */
- link_dir = fo->opt_sublink;
- if (link_dir && link_dir[0] && link_dir[0] != '/') {
- link_dir = str3cat((char *) 0, fo->opt_fs, "/", link_dir);
- normalize_slash(link_dir);
- XFREE(fo->opt_sublink);
- fo->opt_sublink = link_dir;
- }
-
- /*
- * Check the filesystem is happy
- */
- if (fo->fs_mtab)
- XFREE(fo->fs_mtab);
-
- fo->fs_mtab = rop->fs_match(fo);
- if (fo->fs_mtab)
- return rop;
-
- /*
- * Return error file system
- */
- fo->fs_mtab = amfs_error_ops.fs_match(fo);
- return &amfs_error_ops;
-}
diff --git a/contrib/amd/amd/amd.8 b/contrib/amd/amd/amd.8
deleted file mode 100644
index 565a5505b8c2..000000000000
--- a/contrib/amd/amd/amd.8
+++ /dev/null
@@ -1,371 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1989 Jan-Simon Pendry
-.\" Copyright (c) 1989 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1989 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: amd.8,v 1.14.2.1 2006/01/02 18:48:23 ezk Exp $
-.\"
-.TH AMD 8 "3 November 1989"
-.SH NAME
-amd \- automatically mount file systems
-.SH SYNOPSIS
-.B amd
-.B \-H
-.br
-.B amd
-[
-.BI \-F " conf_file"
-]
-.br
-.B amd
-[
-.B \-nprvHS
-] [
-.BI \-a " mount_point"
-] [
-.BI \-c " duration"
-] [
-.BI \-d " domain"
-] [
-.BI \-k " kernel-arch"
-] [
-.BI \-l " logfile"
-] [
-.BI \-o " op_sys_ver"
-] [
-.BI \-t " interval.interval"
-] [
-.BI \-w " interval"
-] [
-.BI \-x " log-option"
-] [
-.BI \-y " YP-domain"
-] [
-.BI \-A " arch"
-] [
-.BI \-C " cluster-name"
-] [
-.BI \-D " option"
-] [
-.BI \-F " conf_file"
-] [
-.BI \-O " op_sys_name"
-] [
-.BI \-T " tag"
-]
-[
-.I directory
-.I mapname
-.RI [ " \-map-options " ]
-] .\|.\|.
-.SH DESCRIPTION
-.B Amd
-is a daemon that automatically mounts filesystems
-whenever a file or directory
-within that filesystem is accessed.
-Filesystems are automatically unmounted when they
-appear to have become quiescent.
-.LP
-.B Amd
-operates by attaching itself as an
-.SM NFS
-server to each of the specified
-.IB directories .
-Lookups within the specified directories
-are handled by
-.BR amd ,
-which uses the map defined by
-.I mapname
-to determine how to resolve the lookup.
-Generally, this will be a host name, some filesystem information
-and some mount options for the given filesystem.
-.LP
-In the first form depicted above,
-.B amd
-will print a short help string. In the second form, if no options are
-specified, or the
-.B -F
-is used,
-.B amd
-will read configuration parameters from the file
-.I conf_file
-which defaults to
-.BR /etc/amd.conf .
-The last form is described below.
-.SH OPTIONS
-
-.\"*******************************************************"
-
-.TP
-.BI \-a " temporary-directory"
-Specify an alternative location for the real mount points.
-The default is
-.BR /a .
-
-.TP
-.BI \-c " duration"
-Specify a
-.IR duration ,
-in seconds, that a looked up name remains
-cached when not in use. The default is 5 minutes.
-
-.TP
-.BI \-d " domain"
-Specify the local domain name. If this option is not
-given the domain name is determined from the hostname.
-
-.TP
-.BI \-k " kernel-arch"
-Specifies the kernel architecture. This is used solely
-to set the ${karch} selector.
-
-.TP
-.BI \-l " logfile"
-Specify a logfile in which to record mount and unmount events.
-If
-.I logfile
-is the string
-.B syslog
-then the log messages will be sent to the system log daemon by
-.IR syslog (3).
-The default syslog facility used is LOG_DAEMON. If you
-wish to change it, append its name to the log file name, delimited by a
-single colon. For example, if
-.I logfile
-is the string
-.B syslog:local7
-then
-.B Amd
-will log messages via
-.IR syslog (3)
-using the LOG_LOCAL7 facility (if it exists on the system).
-
-.TP
-.B \-n
-Normalize hostnames.
-The name refereed to by ${rhost} is normalized relative to the
-host database before being used. The effect is to translate
-aliases into ``official'' names.
-
-.TP
-.BI \-o " op_sys_ver"
-Override the compiled-in version number of the operating system. Useful
-when the built in version is not desired for backward compatibility reasons.
-For example, if the build in version is ``2.5.1'', you can override it to
-``5.5.1'', and use older maps that were written with the latter in mind.
-
-.TP
-.B \-p
-Print PID.
-Outputs the process-id of
-.B amd
-to standard output where it can be saved into a file.
-
-.TP
-.B \-r
-Restart existing mounts.
-.B Amd
-will scan the mount file table to determine which filesystems
-are currently mounted. Whenever one of these would have
-been auto-mounted,
-.B amd
-.I inherits
-it.
-
-.TP
-.BI \-t " timeout.retransmit"
-Specify the NFS timeout
-.IR interval ,
-in tenths of a second, between NFS/RPC retries (for UDP only). The default
-is 0.8 seconds. The second value alters the retransmit counter, which
-defaults to 11 retransmissions. Both of these values are used by the kernel
-to communicate with amd. Useful defaults are supplied if either or both
-values are missing.
-
-Amd relies on the kernel RPC retransmit mechanism to trigger mount retries.
-The values of these parameters change the overall retry interval. Too long
-an interval gives poor interactive response; too short an interval causes
-excessive retries.
-
-.TP
-.B \-v
-Version. Displays version and configuration information on standard error.
-
-.TP
-.BI \-w " interval"
-Specify an
-.IR interval ,
-in seconds, between attempts to dismount
-filesystems that have exceeded their cached times.
-The default is 2 minutes.
-
-.TP
-.BI \-x " options"
-Specify run-time logging options. The options are a comma separated
-list chosen from: fatal, error, user, warn, info, map, stats, all.
-
-.TP
-.BI \-y " domain"
-Specify an alternative NIS domain from which to fetch the NIS maps.
-The default is the system domain name. This option is ignored if NIS
-support is not available.
-
-.TP
-.BI \-A " arch"
-Specifies the OS architecture. This is used solely to set the ${arch}
-selector.
-
-.TP
-.BI \-C " cluster-name"
-Specify an alternative HP-UX cluster name to use.
-
-.TP
-.BI \-D " option"
-Select from a variety of debug options. Prefixing an
-option with the strings
-.B no
-reverses the effect of that option. Options are cumulative.
-The most useful option is
-.BR all .
-Since
-.I \-D
-is only used for debugging other options are not documented here:
-the current supported set of options is listed by the \-v option
-and a fuller description is available in the program source.
-
-.TP
-.BI \-F " conf_file"
-Specify an amd configuration file to use. See
-.BR amd.conf (5)
-for description of this file's format. This configuration file is used to
-specify any options in lieu of typing many of them on the command line. The
-.I amd.conf
-file includes directives for every command line option amd has, and many
-more that are only available via the configuration file facility. The
-configuration file specified by this option is processed after all other
-options had been processed, regardless of the actual location of this option
-on the command line.
-
-.TP
-.B \-H
-Print help and usage string.
-
-.TP
-.BI \-O " op_sys_name"
-Override the compiled-in name of the operating system. Useful when the
-built in name is not desired for backward compatibility reasons. For
-example, if the build in name is ``sunos5'', you can override it to
-``sos5'', and use older maps which were written with the latter in mind.
-
-.TP
-.B \-S
-Do not lock the running executable pages of amd into memory. To improve
-amd's performance, systems that support the
-.BR plock (3)
-call, could lock the amd process into memory. This way there is less chance
-the operating system will schedule, page out, and swap the amd process as
-needed. This tends improves amd's performance, at the cost of reserving the
-memory used by the amd process (making it unavailable for other processes).
-If this behavior is not desired, use the
-.B \-S
-option.
-
-.TP
-.BI \-T " tag"
-Specify a tag to use with
-.BR amd.conf (5).
-All map entries tagged with
-.I tag
-will be processed. Map entries that are not tagged are always processed.
-Map entries that are tagged with a tag other than
-.I tag
-will not be processed.
-
-.SH FILES
-.TP 5
-.B /a
-directory under which filesystems are dynamically mounted
-.TP 5
-.B /etc/amd.conf
-default configuration file
-.SH CAVEATS
-Some care may be required when creating a mount map.
-.LP
-Symbolic links on an NFS filesystem can be incredibly inefficient.
-In most implementations of NFS, their interpolations are not cached
-by the kernel and each time a symlink is encountered during a
-.I lookuppn
-translation it costs an RPC call to the NFS server.
-It would appear that a large improvement in real-time
-performance could be gained by adding a cache somewhere.
-Replacing symlinks with a suitable incarnation of the auto-mounter
-results in a large real-time speedup, but also causes a large
-number of process context switches.
-.LP
-A weird imagination is most useful to gain full advantage of all
-the features.
-.SH "SEE ALSO"
-.BR amd.conf (5),
-.BR amq (8),
-.BR domainname (1),
-.BR hostname (1),
-.BR automount (8),
-.BR mount (8),
-.BR umount (8),
-.BR mtab (5),
-.BR syslog (3).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH AUTHORS
-Jan-Simon Pendry <jsp@doc.ic.ac.uk>, Department of Computing, Imperial College, London, UK.
-.P
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/amd/amd.c b/contrib/amd/amd/amd.c
deleted file mode 100644
index 37eab5d8442c..000000000000
--- a/contrib/amd/amd/amd.c
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amd.c
- *
- */
-
-/*
- * Automounter
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-struct amu_global_options gopt; /* where global options are stored */
-
-char pid_fsname[SIZEOF_PID_FSNAME]; /* "kiska.southseas.nz:(pid%d)" */
-char *hostdomain = "unknown.domain";
-#define SIZEOF_HOSTD (2 * MAXHOSTNAMELEN + 1) /* Host+domain */
-char hostd[SIZEOF_HOSTD]; /* Host+domain */
-char *endian = ARCH_ENDIAN; /* Big or Little endian */
-char *cpu = HOST_CPU; /* CPU type */
-char *PrimNetName; /* name of primary network */
-char *PrimNetNum; /* number of primary network */
-
-int immediate_abort; /* Should close-down unmounts be retried */
-int orig_umask = 022;
-int select_intr_valid;
-
-jmp_buf select_intr;
-struct amd_stats amd_stats; /* Server statistics */
-struct in_addr myipaddr; /* (An) IP address of this host */
-time_t do_mapc_reload = 0; /* mapc_reload() call required? */
-
-#ifdef HAVE_FS_AUTOFS
-int amd_use_autofs = 0;
-#endif /* HAVE_FS_AUTOFS */
-
-#ifdef HAVE_SIGACTION
-sigset_t masked_sigs;
-#endif /* HAVE_SIGACTION */
-
-
-/*
- * Signal handler:
- * SIGINT - tells amd to do a full shutdown, including unmounting all
- * filesystem.
- * SIGTERM - tells amd to shutdown now. Just unmounts the automount nodes.
- */
-static RETSIGTYPE
-sigterm(int sig)
-{
-#ifdef REINSTALL_SIGNAL_HANDLER
- signal(sig, sigterm);
-#endif /* REINSTALL_SIGNAL_HANDLER */
-
- switch (sig) {
- case SIGINT:
- immediate_abort = 15;
- break;
-
- case SIGTERM:
- immediate_abort = -1;
- /* fall through... */
-
- default:
- plog(XLOG_WARNING, "WARNING: automounter going down on signal %d", sig);
- break;
- }
- if (select_intr_valid)
- longjmp(select_intr, sig);
-}
-
-
-/*
- * Hook for cache reload.
- * When a SIGHUP arrives it schedules a call to mapc_reload
- */
-static RETSIGTYPE
-sighup(int sig)
-{
-#ifdef REINSTALL_SIGNAL_HANDLER
- signal(sig, sighup);
-#endif /* REINSTALL_SIGNAL_HANDLER */
-
- if (sig != SIGHUP)
- dlog("spurious call to sighup");
- /*
- * Force a reload by zero'ing the timer
- */
- if (amd_state == Run)
- do_mapc_reload = 0;
-}
-
-
-static RETSIGTYPE
-parent_exit(int sig)
-{
- /*
- * This signal handler is called during Amd initialization. The parent
- * forks a child to do all the hard automounting work, and waits for a
- * SIGQUIT signal from the child. When the parent gets the signal it's
- * supposed to call this handler and exit(3), thus completing the
- * daemonizing process. Alas, on some systems, especially Linux 2.4/2.6
- * with Glibc, exit(3) doesn't always terminate the parent process.
- * Worse, the parent process now refuses to accept any more SIGQUIT
- * signals -- they are blocked. What's really annoying is that this
- * doesn't happen all the time, suggesting a race condition somewhere.
- * (This happens even if I change the logic to use another signal.) I
- * traced this to something which exit(3) does in addition to exiting the
- * process, probably some atexit() stuff or other side-effects related to
- * signal handling. Either way, since at this stage the parent process
- * just needs to terminate, I'm simply calling _exit(2). Note also that
- * the OpenGroup doesn't list exit(3) as a recommended "Base Interface"
- * but they do list _exit(2) as one. This fix seems to work reliably all
- * the time. -Erez (2/27/2005)
- */
- _exit(0);
-}
-
-
-static int
-daemon_mode(void)
-{
- int bgpid;
-
-#ifdef HAVE_SIGACTION
- struct sigaction sa, osa;
-
- memset(&sa, 0, sizeof(sa));
- sa.sa_handler = parent_exit;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGQUIT);
- sigaction(SIGQUIT, &sa, &osa);
-#else /* not HAVE_SIGACTION */
- signal(SIGQUIT, parent_exit);
-#endif /* not HAVE_SIGACTION */
-
- bgpid = background();
-
- if (bgpid != 0) {
- /*
- * Now wait for the automount points to
- * complete.
- */
- for (;;)
- pause();
- /* should never reach here */
- }
-#ifdef HAVE_SIGACTION
- sigaction(SIGQUIT, &osa, NULL);
-#else /* not HAVE_SIGACTION */
- signal(SIGQUIT, SIG_DFL);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * Record our pid to make it easier to kill the correct amd.
- */
- if (gopt.flags & CFM_PRINT_PID) {
- if (STREQ(gopt.pid_file, "/dev/stdout")) {
- printf("%ld\n", (long) am_mypid);
- /* flush stdout, just in case */
- fflush(stdout);
- } else {
- FILE *f;
- mode_t prev_umask = umask(0022); /* set secure temporary umask */
-
- f = fopen(gopt.pid_file, "w");
- if (f) {
- fprintf(f, "%ld\n", (long) am_mypid);
- (void) fclose(f);
- } else {
- fprintf(stderr, "cannot open %s (errno=%d)\n", gopt.pid_file, errno);
- }
- umask(prev_umask); /* restore umask */
- }
- }
-
- /*
- * Pretend we are in the foreground again
- */
- foreground = 1;
-
- /*
- * Dissociate from the controlling terminal
- */
- amu_release_controlling_tty();
-
- return getppid();
-}
-
-
-/*
- * Initialize global options structure.
- */
-static void
-init_global_options(void)
-{
-#if defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME)
- static struct utsname un;
-#endif /* defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME) */
- int i;
-
- memset(&gopt, 0, sizeof(struct amu_global_options));
-
- /* name of current architecture */
- gopt.arch = HOST_ARCH;
-
- /* automounter temp dir */
- gopt.auto_dir = "/a";
-
- /* toplevel attribute cache timeout */
- gopt.auto_attrcache = 0;
-
- /* cluster name */
- gopt.cluster = NULL;
-
- /* executable map timeout */
- gopt.exec_map_timeout = AMFS_EXEC_MAP_TIMEOUT;
-
- /*
- * kernel architecture: this you must get from uname() if possible.
- */
-#if defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME)
- if (uname(&un) >= 0)
- gopt.karch = un.machine;
- else
-#endif /* defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME) */
- gopt.karch = HOST_ARCH;
-
- /* amd log file */
- gopt.logfile = NULL;
-
- /* operating system name */
- gopt.op_sys = HOST_OS_NAME;
-
- /* OS version */
- gopt.op_sys_ver = HOST_OS_VERSION;
-
- /* full OS name and version */
- gopt.op_sys_full = HOST_OS;
-
- /* OS version */
- gopt.op_sys_vendor = HOST_VENDOR;
-
- /* pid file */
- gopt.pid_file = "/dev/stdout";
-
- /* local domain */
- gopt.sub_domain = NULL;
-
- /* reset NFS (and toplvl) retransmit counter and retry interval */
- for (i=0; i<AMU_TYPE_MAX; ++i) {
- gopt.amfs_auto_retrans[i] = -1; /* -1 means "never set before" */
- gopt.amfs_auto_timeo[i] = -1; /* -1 means "never set before" */
- }
-
- /* cache duration */
- gopt.am_timeo = AM_TTL;
-
- /* dismount interval */
- gopt.am_timeo_w = AM_TTL_W;
-
- /* map reload intervl */
- gopt.map_reload_interval = ONE_HOUR;
-
- /*
- * various CFM_* flags that are on by default.
- */
- gopt.flags = CFM_DEFAULT_FLAGS;
-
-#ifdef HAVE_MAP_HESIOD
- /* Hesiod rhs zone */
- gopt.hesiod_base = "automount";
-#endif /* HAVE_MAP_HESIOD */
-
-#ifdef HAVE_MAP_LDAP
- /* LDAP base */
- gopt.ldap_base = NULL;
-
- /* LDAP host ports */
- gopt.ldap_hostports = NULL;
-
- /* LDAP cache */
- gopt.ldap_cache_seconds = 0;
- gopt.ldap_cache_maxmem = 131072;
-
- /* LDAP protocol version */
- gopt.ldap_proto_version = 2;
-#endif /* HAVE_MAP_LDAP */
-
-#ifdef HAVE_MAP_NIS
- /* YP domain name */
- gopt.nis_domain = NULL;
-#endif /* HAVE_MAP_NIS */
-}
-
-
-/*
- * Lock process text and data segment in memory (after forking the daemon)
- */
-static void
-do_memory_locking(void)
-{
-#if defined(HAVE_PLOCK) || defined(HAVE_MLOCKALL)
- int locked_ok = 0;
-#else /* not HAVE_PLOCK and not HAVE_MLOCKALL */
- plog(XLOG_WARNING, "Process memory locking not supported by the OS");
-#endif /* not HAVE_PLOCK and not HAVE_MLOCKALL */
-#ifdef HAVE_PLOCK
-# ifdef _AIX
- /*
- * On AIX you must lower the stack size using ulimit() before calling
- * plock. Otherwise plock will reserve a lot of memory space based on
- * your maximum stack size limit. Since it is not easily possible to
- * tell what should the limit be, I print a warning before calling
- * plock(). See the manual pages for ulimit(1,3,4) on your AIX system.
- */
- plog(XLOG_WARNING, "AIX: may need to lower stack size using ulimit(3) before calling plock");
-# endif /* _AIX */
- if (!locked_ok && plock(PROCLOCK) != 0)
- plog(XLOG_WARNING, "Couldn't lock process pages in memory using plock(): %m");
- else
- locked_ok = 1;
-#endif /* HAVE_PLOCK */
-#ifdef HAVE_MLOCKALL
- if (!locked_ok && mlockall(MCL_CURRENT|MCL_FUTURE) != 0)
- plog(XLOG_WARNING, "Couldn't lock process pages in memory using mlockall(): %m");
- else
- locked_ok = 1;
-#endif /* HAVE_MLOCKALL */
-#if defined(HAVE_PLOCK) || defined(HAVE_MLOCKALL)
- if (locked_ok)
- plog(XLOG_INFO, "Locked process pages in memory");
-#endif /* HAVE_PLOCK || HAVE_MLOCKALL */
-
-#if defined(HAVE_MADVISE) && defined(MADV_PROTECT)
- madvise(0, 0, MADV_PROTECT); /* may be redundant of the above worked out */
-#endif /* defined(HAVE_MADVISE) && defined(MADV_PROTECT) */
-}
-
-
-int
-main(int argc, char *argv[])
-{
- char *domdot, *verstr, *vertmp;
- int ppid = 0;
- int error;
- char *progname = NULL; /* "amd" */
- char hostname[MAXHOSTNAMELEN + 1] = "localhost"; /* Hostname */
-
- /*
- * Make sure some built-in assumptions are true before we start
- */
- assert(sizeof(nfscookie) >= sizeof(u_int));
- assert(sizeof(int) >= 4);
-
- /*
- * Set processing status.
- */
- amd_state = Start;
-
- /*
- * Determine program name
- */
- if (argv[0]) {
- progname = strrchr(argv[0], '/');
- if (progname && progname[1])
- progname++;
- else
- progname = argv[0];
- }
- if (!progname)
- progname = "amd";
- am_set_progname(progname);
-
- /*
- * Initialize process id. This is kept
- * cached since it is used for generating
- * and using file handles.
- */
- am_set_mypid();
-
- /*
- * Get local machine name
- */
- if (gethostname(hostname, sizeof(hostname)) < 0) {
- plog(XLOG_FATAL, "gethostname: %m");
- going_down(1);
- }
- hostname[sizeof(hostname) - 1] = '\0';
-
- /*
- * Check it makes sense
- */
- if (!*hostname) {
- plog(XLOG_FATAL, "host name is not set");
- going_down(1);
- }
-
- /*
- * Initialize global options structure.
- */
- init_global_options();
-
- /*
- * Partially initialize hostd[]. This
- * is completed in get_args().
- */
- if ((domdot = strchr(hostname, '.'))) {
- /*
- * Hostname already contains domainname.
- * Split out hostname and domainname
- * components
- */
- *domdot++ = '\0';
- hostdomain = domdot;
- }
- xstrlcpy(hostd, hostname, sizeof(hostd));
- am_set_hostname(hostname);
-
- /*
- * Setup signal handlers
- */
- /* SIGINT: trap interrupts for shutdowns */
- setup_sighandler(SIGINT, sigterm);
- /* SIGTERM: trap terminate so we can shutdown cleanly (some chance) */
- setup_sighandler(SIGTERM, sigterm);
- /* SIGHUP: hangups tell us to reload the cache */
- setup_sighandler(SIGHUP, sighup);
- /*
- * SIGCHLD: trap Death-of-a-child. These allow us to pick up the exit
- * status of backgrounded mounts. See "sched.c".
- */
- setup_sighandler(SIGCHLD, sigchld);
-#ifdef HAVE_SIGACTION
- /* construct global "masked_sigs" used in nfs_start.c */
- sigemptyset(&masked_sigs);
- sigaddset(&masked_sigs, SIGINT);
- sigaddset(&masked_sigs, SIGTERM);
- sigaddset(&masked_sigs, SIGHUP);
- sigaddset(&masked_sigs, SIGCHLD);
-#endif /* HAVE_SIGACTION */
-
- /*
- * Fix-up any umask problems. Most systems default
- * to 002 which is not too convenient for our purposes
- */
- orig_umask = umask(0);
-
- /*
- * Figure out primary network name
- */
- getwire(&PrimNetName, &PrimNetNum);
-
- /*
- * Determine command-line arguments
- */
- get_args(argc, argv);
-
- /*
- * Log version information.
- */
- vertmp = get_version_string();
- verstr = strtok(vertmp, "\n");
- plog(XLOG_INFO, "AM-UTILS VERSION INFORMATION:");
- while (verstr) {
- plog(XLOG_INFO, "%s", verstr);
- verstr = strtok(NULL, "\n");
- }
- XFREE(vertmp);
-
- /*
- * Get our own IP address so that we can mount the automounter. We pass
- * localhost_address which could be used as the default localhost
- * name/address in amu_get_myaddress().
- */
- amu_get_myaddress(&myipaddr, gopt.localhost_address);
- plog(XLOG_INFO, "My ip addr is %s", inet_ntoa(myipaddr));
-
- /* avoid hanging on other NFS servers if started elsewhere */
- if (chdir("/") < 0)
- plog(XLOG_INFO, "cannot chdir to /: %m");
-
- /*
- * Now check we are root.
- */
- if (geteuid() != 0) {
- plog(XLOG_FATAL, "Must be root to mount filesystems (euid = %ld)", (long) geteuid());
- going_down(1);
- }
-
-#ifdef HAVE_MAP_NIS
- /*
- * If the domain was specified then bind it here
- * to circumvent any default bindings that may
- * be done in the C library.
- */
- if (gopt.nis_domain && yp_bind(gopt.nis_domain)) {
- plog(XLOG_FATAL, "Can't bind to NIS domain \"%s\"", gopt.nis_domain);
- going_down(1);
- }
-#endif /* HAVE_MAP_NIS */
-
- if (!amuDebug(D_DAEMON))
- ppid = daemon_mode();
-
- /*
- * Lock process text and data segment in memory.
- */
- if (gopt.flags & CFM_PROCESS_LOCK) {
- do_memory_locking();
- }
-
- do_mapc_reload = clocktime(NULL) + gopt.map_reload_interval;
-
- /*
- * Register automounter with system.
- */
- error = mount_automounter(ppid);
- if (error && ppid)
- kill(ppid, SIGALRM);
-
-#ifdef HAVE_FS_AUTOFS
- /*
- * XXX this should be part of going_down(), but I can't move it there
- * because it would be calling non-library code from the library... ugh
- */
- if (amd_use_autofs)
- destroy_autofs_service();
-#endif /* HAVE_FS_AUTOFS */
-
- going_down(error);
-
- abort();
- return 1; /* should never get here */
-}
diff --git a/contrib/amd/amd/amd.h b/contrib/amd/amd/amd.h
deleted file mode 100644
index 0e371b72a5b0..000000000000
--- a/contrib/amd/amd/amd.h
+++ /dev/null
@@ -1,867 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amd.h
- *
- */
-
-#ifndef _AMD_H
-#define _AMD_H
-
-
-/*
- * MACROS:
- */
-
-/*
- * Define a default debug mtab path for systems
- * that support mtab on file.
- */
-#ifdef MOUNT_TABLE_ON_FILE
-# define DEBUG_MNTTAB_FILE "/tmp/mnttab"
-#endif /* MOUNT_TABLE_ON_FILE */
-
-/* options for amd.conf */
-#define CFM_BROWSABLE_DIRS 0x00000001
-#define CFM_MOUNT_TYPE_AUTOFS 0x00000002 /* use kernel autofs support */
-#define CFM_SELECTORS_IN_DEFAULTS 0x00000004
-#define CFM_NORMALIZE_HOSTNAMES 0x00000008
-#define CFM_PROCESS_LOCK 0x00000010
-#define CFM_PRINT_PID 0x00000020
-#define CFM_RESTART_EXISTING_MOUNTS 0x00000040
-#define CFM_SHOW_STATFS_ENTRIES 0x00000080
-#define CFM_FULLY_QUALIFIED_HOSTS 0x00000100
-#define CFM_BROWSABLE_DIRS_FULL 0x00000200 /* allow '/' in readdir() */
-#define CFM_UNMOUNT_ON_EXIT 0x00000400 /* when amd finishing */
-#define CFM_USE_TCPWRAPPERS 0x00000800
-#define CFM_AUTOFS_USE_LOFS 0x00001000
-#define CFM_NFS_INSECURE_PORT 0x00002000
-#define CFM_DOMAIN_STRIP 0x00004000
-#define CFM_NORMALIZE_SLASHES 0x00008000 /* normalize slashes? */
-#define CFM_FORCED_UNMOUNTS 0x00010000 /* forced unmounts? */
-#define CFM_TRUNCATE_LOG 0x00020000 /* truncate log file? */
-#if 0
-/* XXX: reserved to sync up with am-utils-6.2 */
-#define CFM_SUN_MAP_SYNTAX 0x00040000 /* Sun map syntax? */
-#endif
-#define CFM_NFS_ANY_INTERFACE 0x00080000 /* all interfaces are acceptable */
-
-/* defaults global flags: plock, tcpwrappers, and autofs/lofs */
-#define CFM_DEFAULT_FLAGS (CFM_PROCESS_LOCK|CFM_USE_TCPWRAPPERS|CFM_AUTOFS_USE_LOFS|CFM_DOMAIN_STRIP|CFM_NORMALIZE_SLASHES)
-
-/*
- * macro definitions for automounter vfs/vnode operations.
- */
-#define VLOOK_CREATE 0x1
-#define VLOOK_DELETE 0x2
-#define VLOOK_LOOKUP 0x3
-
-/*
- * macro definitions for automounter vfs capabilities
- */
-#define FS_DIRECTORY 0x0001 /* This looks like a dir, not a link */
-#define FS_MBACKGROUND 0x0002 /* Should background this mount */
-#define FS_NOTIMEOUT 0x0004 /* Don't bother with timeouts */
-#define FS_MKMNT 0x0008 /* Need to make the mount point */
-#define FS_UBACKGROUND 0x0010 /* Unmount in background */
-#define FS_BACKGROUND (FS_MBACKGROUND|FS_UBACKGROUND)
-#define FS_DISCARD 0x0020 /* Discard immediately on last reference */
-#define FS_AMQINFO 0x0040 /* Amq is interested in this fs type */
-#define FS_AUTOFS 0x0080 /* This filesystem can be an autofs f/s */
-#define FS_DIRECT 0x0100 /* Direct mount */
-#define FS_ON_AUTOFS 0x0200 /* This filesystem can be mounted directly
- onto an autofs mountpoint */
-
-/*
- * macros for struct am_node (map of auto-mount points).
- */
-#define AMF_NOTIMEOUT 0x0001 /* This node never times out */
-#define AMF_ROOT 0x0002 /* This is a root node */
-#define AMF_AUTOFS 0x0004 /* This node is part of an autofs filesystem */
-#define AMF_REMOUNT 0x0008 /* This node needs to be remounted */
-#define AMF_SOFTLOOKUP 0x0010 /* This node returns EIO if server is down */
-
-/*
- * macros for struct mntfs (list of mounted filesystems)
- */
-#define MFF_MOUNTED 0x0001 /* Node is mounted */
-#define MFF_MOUNTING 0x0002 /* Mount is in progress */
-#define MFF_UNMOUNTING 0x0004 /* Unmount is in progress */
-#define MFF_RESTART 0x0008 /* Restarted node */
-#define MFF_MKMNT 0x0010 /* Delete this node's am_mount */
-#define MFF_ERROR 0x0020 /* This node failed to mount */
-#define MFF_LOGDOWN 0x0040 /* Logged that this mount is down */
-#define MFF_RSTKEEP 0x0080 /* Don't timeout this filesystem - restarted */
-#define MFF_WANTTIMO 0x0100 /* Need a timeout call when not busy */
-#define MFF_NFSLINK 0x0200 /* nfsl type, and deemed a link */
-#define MFF_IS_AUTOFS 0x0400 /* this filesystem is of type autofs */
-#define MFF_NFS_SCALEDOWN 0x0800 /* the mount failed, retry with v2/UDP */
-#define MFF_ON_AUTOFS 0x1000 /* autofs has a lofs/link to this f/s */
-#define MFF_WEBNFS 0x2000 /* use public filehandle */
-
-/*
- * macros for struct fserver.
- */
-#define FSF_VALID 0x0001 /* Valid information available */
-#define FSF_DOWN 0x0002 /* This fileserver is thought to be down */
-#define FSF_ERROR 0x0004 /* Permanent error has occurred */
-#define FSF_WANT 0x0008 /* Want a wakeup call */
-#define FSF_PINGING 0x0010 /* Already doing pings */
-#define FSF_WEBNFS 0x0020 /* Don't try to contact portmapper */
-#define FSF_PING_UNINIT 0x0040 /* ping values have not been initilized */
-#define FSF_FORCE_UNMOUNT 0x0080 /* force umount of this fserver */
-#define FSRV_ERROR(fs) ((fs) && (((fs)->fs_flags & FSF_ERROR) == FSF_ERROR))
-#define FSRV_ISDOWN(fs) ((fs) && (((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_DOWN|FSF_VALID)))
-#define FSRV_ISUP(fs) (!(fs) || (((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_VALID)))
-
-/* some systems (SunOS 4.x) neglect to define the mount null message */
-#ifndef MOUNTPROC_NULL
-# define MOUNTPROC_NULL ((u_long)(0))
-#endif /* not MOUNTPROC_NULL */
-
-/*
- * Error to return if remote host is not available.
- * Try, in order, "host down", "host unreachable", "invalid argument".
- */
-#ifdef EHOSTDOWN
-# define AM_ERRNO_HOST_DOWN EHOSTDOWN
-#else /* not EHOSTDOWN */
-# ifdef EHOSTUNREACH
-# define AM_ERRNO_HOST_DOWN EHOSTUNREACH
-# else /* not EHOSTUNREACH */
-# define AM_ERRNO_HOST_DOWN EINVAL
-# endif /* not EHOSTUNREACH */
-#endif /* not EHOSTDOWN */
-
-/* Hash table size */
-#define NKVHASH (1 << 2) /* Power of two */
-
-/* Max entries to return in one call */
-#define MAX_READDIR_ENTRIES 16
-
-/*
- * default amfs_auto retrans - 1/10th seconds
- */
-#define AMFS_AUTO_RETRANS(x) ((ALLOWED_MOUNT_TIME*10+5*gopt.amfs_auto_timeo[(x)])/gopt.amfs_auto_timeo[(x)] * 2)
-
-/*
- * The following values can be tuned...
- */
-#define AM_TTL (300) /* Default cache period (5 min) */
-#define AM_TTL_W (120) /* Default unmount interval (2 min) */
-#define AM_PINGER 30 /* NFS ping interval for live systems */
-#define AMFS_AUTO_TIMEO 8 /* Default amfs_auto timeout - .8s */
-#define AMFS_EXEC_MAP_TIMEOUT 10 /* default 10sec exec map timeout */
-
-/* interval between forced retries of a mount */
-#define RETRY_INTERVAL 2
-
-#ifndef ROOT_MAP
-# define ROOT_MAP "\"root\""
-#endif /* not ROOT_MAP */
-
-#define ereturn(x) do { *error_return = x; return 0; } while (0)
-
-#define NEVER (time_t) 0
-
-#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP)
-# define AMD_SERVICE_NAME "amd" /* for tcpwrappers */
-#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
-
-/*
- * TYPEDEFS:
- */
-
-typedef struct cf_map cf_map_t;
-typedef struct kv kv;
-typedef struct am_node am_node;
-typedef struct mntfs mntfs;
-typedef struct am_opts am_opts;
-typedef struct am_ops am_ops;
-typedef struct am_stats am_stats;
-typedef struct fserver fserver;
-
-typedef voidp wchan_t;
-typedef voidp opaque_t;
-
-/*
- * Cache map operations
- */
-typedef void add_fn(mnt_map *, char *, char *);
-typedef int init_fn(mnt_map *, char *, time_t *);
-typedef int mtime_fn(mnt_map *, char *, time_t *);
-typedef int isup_fn(mnt_map *, char *);
-typedef int reload_fn(mnt_map *, char *, add_fn *);
-typedef int search_fn(mnt_map *, char *, char *, char **, time_t *);
-typedef int task_fun(opaque_t);
-typedef void cb_fun(int, int, opaque_t);
-typedef void fwd_fun(voidp, int, struct sockaddr_in *,
- struct sockaddr_in *, opaque_t, int);
-typedef int key_fun(char *, opaque_t);
-typedef void callout_fun(opaque_t);
-
-/*
- * automounter vfs/vnode operations.
- */
-typedef char *(*vfs_match) (am_opts *);
-typedef int (*vfs_init) (mntfs *);
-typedef int (*vmount_fs) (am_node *, mntfs *);
-typedef int (*vumount_fs) (am_node *, mntfs *);
-typedef am_node *(*vlookup_child) (am_node *, char *, int *, int);
-typedef am_node *(*vmount_child) (am_node *, int *);
-typedef int (*vreaddir) (am_node *, nfscookie, nfsdirlist *, nfsentry *, u_int);
-typedef am_node *(*vreadlink) (am_node *, int *);
-typedef void (*vmounted) (mntfs *);
-typedef void (*vumounted) (mntfs *);
-typedef fserver *(*vffserver) (mntfs *);
-typedef wchan_t (*vget_wchan) (mntfs *);
-
-
-
-/*
- * STRUCTURES:
- */
-
-/* global amd options that are manipulated by conf.c */
-struct amu_global_options {
- char *arch; /* name of current architecture */
- char *auto_dir; /* automounter temp dir */
- int auto_attrcache; /* attribute cache timeout for auto dirs */
- char *cluster; /* cluster name */
- char *karch; /* kernel architecture */
- char *logfile; /* amd log file */
- char *op_sys; /* operating system name ${os} */
- char *op_sys_ver; /* OS version ${osver} */
- char *op_sys_full; /* full OS name ${full_os} */
- char *op_sys_vendor; /* name of OS vendor ${vendor} */
- char *pid_file; /* PID file */
- char *sub_domain; /* local domain */
- char *localhost_address; /* localhost address (NULL means use 127.0.0.1) */
- char *map_defaults; /* global map /default options */
- char *map_options; /* global map options */
- int map_reload_interval; /* map reload interval */
- char *map_type; /* global map type */
- char *search_path; /* search path for maps */
- char *mount_type; /* mount type for map */
- char *debug_mtab_file; /* path for the mtab file during debug mode */
- u_int flags; /* various CFM_* flags */
-
-#define AMU_TYPE_NONE -1 /* for amfs_auto_{timeo,retrans,toplvl} */
-#define AMU_TYPE_UDP 0 /* for amfs_auto_{timeo,retrans,toplvl} */
-#define AMU_TYPE_TCP 1 /* for amfs_auto_{timeo,retrans,toplvl} */
- /*
- * Note: toplvl is only UDP, but we want to separate it from regular
- * NFS mounts which Amd makes, because the toplvl mount is a localhost
- * mount for which different timeo/retrans parameters may be desired.
- */
-#define AMU_TYPE_TOPLVL 2 /* for amfs_auto_{timeo,retrans,toplvl} */
-#define AMU_TYPE_MAX 3 /* for amfs_auto_{timeo,retrans,toplvl} */
- int amfs_auto_retrans[AMU_TYPE_MAX]; /* NFS retransmit counter */
- int amfs_auto_timeo[AMU_TYPE_MAX]; /* NFS retry interval */
-
- int am_timeo; /* cache duration */
- int am_timeo_w; /* dismount interval */
- u_long portmap_program; /* amd RPC program number */
- u_short preferred_amq_port; /* preferred amq service RPC port number (0 means "any") */
-#ifdef HAVE_MAP_HESIOD
- char *hesiod_base; /* Hesiod rhs */
-#endif /* HAVE_MAP_HESIOD */
-#ifdef HAVE_MAP_LDAP
- char *ldap_base; /* LDAP base */
- char *ldap_hostports; /* LDAP host ports */
- long ldap_cache_seconds; /* LDAP internal cache - keep seconds */
- long ldap_cache_maxmem; /* LDAP internal cache - max memory (bytes) */
- long ldap_proto_version; /* LDAP protocol version */
-#endif /* HAVE_MAP_LDAP */
-#ifdef HAVE_MAP_NIS
- char *nis_domain; /* YP domain name */
-#endif /* HAVE_MAP_NIS */
- char *nfs_proto; /* NFS protocol (NULL, udp, tcp) */
- int nfs_vers; /* NFS version (0, 2, 3, 4) */
- u_int exec_map_timeout; /* timeout (seconds) for executable maps */
-};
-
-/* if you add anything here, update conf.c:reset_cf_map() */
-struct cf_map {
- char *cfm_dir; /* /home, /u, /src */
- char *cfm_name; /* amd.home, /etc/amd.home ... */
- char *cfm_type; /* file, hesiod, ndbm, nis ... */
- char *cfm_defaults; /* map /defaults options in amd.conf */
- char *cfm_opts; /* -cache:=all, etc. */
- char *cfm_search_path; /* /etc/local:/etc/amdmaps:/misc/yp */
- char *cfm_tag; /* optional map tag for amd -T */
- u_int cfm_flags; /* browsable_dirs? mount_type? */
- struct cf_map *cfm_next; /* pointer to next in list (if any) */
-};
-
-/*
- * Key-value pair
- */
-struct kv {
- kv *next;
- char *key;
-#ifdef HAVE_REGEXEC
- regex_t re; /* store the regexp from regcomp() */
-#endif /* HAVE_REGEXEC */
- char *val;
-};
-
-struct mnt_map {
- qelem hdr;
- int refc; /* Reference count */
- short flags; /* Allocation flags */
- short alloc; /* Allocation mode */
- time_t modify; /* Modify time of map */
- u_int reloads; /* Number of times map was reloaded */
- char *map_name; /* Name of this map */
- char *wildcard; /* Wildcard value */
- reload_fn *reload; /* Function to be used for reloads */
- isup_fn *isup; /* Is service up or not? (1=up, 0=down) */
- search_fn *search; /* Function to be used for searching */
- mtime_fn *mtime; /* Modify time function */
- kv *kvhash[NKVHASH]; /* Cached data */
- cf_map_t *cfm; /* pointer to per-map amd.conf opts, if any */
- void *map_data; /* Map data black box */
-};
-
-/*
- * Options
- */
-struct am_opts {
- char *fs_glob; /* Smashed copy of global options */
- char *fs_local; /* Expanded copy of local options */
- char *fs_mtab; /* Mount table entry */
- /* Other options ... */
- char *opt_dev;
- char *opt_delay;
- char *opt_dir;
- char *opt_fs;
- char *opt_group;
- char *opt_mount;
- char *opt_opts;
- char *opt_remopts;
- char *opt_pref;
- char *opt_cache;
- char *opt_rfs;
- char *opt_rhost;
- char *opt_sublink;
- char *opt_type;
- char *opt_mount_type; /* "nfs" or "autofs" */
- char *opt_unmount;
- char *opt_umount; /* an "alias" for opt_unmount (type:=program) */
- char *opt_user;
- char *opt_maptype; /* map type: file, nis, hesiod, etc. */
- char *opt_cachedir; /* cache directory */
- char *opt_addopts; /* options to add to opt_opts */
-};
-
-struct am_ops {
- char *fs_type; /* type of filesystems e.g. "nfsx" */
- vfs_match fs_match; /* fxn: match */
- vfs_init fs_init; /* fxn: initialization */
- vmount_fs mount_fs; /* fxn: mount my own vnode */
- vumount_fs umount_fs; /* fxn: unmount my own vnode */
- vlookup_child lookup_child; /* fxn: lookup path-name */
- vmount_child mount_child; /* fxn: mount path-name */
- vreaddir readdir; /* fxn: read directory */
- vreadlink readlink; /* fxn: read link */
- vmounted mounted; /* fxn: after-mount extra actions */
- vumounted umounted; /* fxn: after-umount extra actions */
- vffserver ffserver; /* fxn: find a file server */
- vget_wchan get_wchan; /* fxn: get the waiting channel */
- int nfs_fs_flags; /* filesystem flags FS_* for nfs mounts */
-#ifdef HAVE_FS_AUTOFS
- int autofs_fs_flags;/* filesystem flags FS_* for autofs mounts */
-#endif /* HAVE_FS_AUTOFS */
-};
-
-/*
- * List of mounted filesystems
- */
-struct mntfs {
- qelem mf_q; /* List of mounted filesystems */
- am_ops *mf_ops; /* Operations on this mountpoint */
- am_opts *mf_fo; /* File opts */
- char *mf_mount; /* "/a/kiska/home/kiska" */
- char *mf_info; /* Mount info */
- char *mf_auto; /* Automount opts */
- char *mf_mopts; /* FS mount opts */
- char *mf_remopts; /* Remote FS mount opts */
- char *mf_loopdev; /* loop device name for /dev/loop mounts */
- fserver *mf_server; /* File server */
- int mf_fsflags; /* Flags FS_* copied from mf_ops->*_fs_flags */
- int mf_flags; /* Flags MFF_* */
- int mf_error; /* Error code from background mount */
- int mf_refc; /* Number of references to this node */
- int mf_cid; /* Callout id */
- void (*mf_prfree) (opaque_t); /* Free private space */
- opaque_t mf_private; /* Private - per-fs data */
-};
-
-/*
- * List of fileservers
- */
-struct fserver {
- qelem fs_q; /* List of fileservers */
- int fs_refc; /* Number of references to this server */
- char *fs_host; /* Normalized hostname of server */
- struct sockaddr_in *fs_ip; /* Network address of server */
- int fs_cid; /* Callout id */
- int fs_pinger; /* Ping (keepalive) interval */
- int fs_flags; /* Flags */
- char *fs_type; /* File server type */
- u_long fs_version; /* NFS version of server (2, 3, etc.)*/
- char *fs_proto; /* NFS protocol of server (tcp, udp, etc.) */
- opaque_t fs_private; /* Private data */
- void (*fs_prfree) (opaque_t); /* Free private data */
-};
-
-/*
- * Per-mountpoint statistics
- */
-struct am_stats {
- time_t s_mtime; /* Mount time */
- u_short s_uid; /* Uid of mounter */
- int s_getattr; /* Count of getattrs */
- int s_lookup; /* Count of lookups */
- int s_readdir; /* Count of readdirs */
- int s_readlink; /* Count of readlinks */
- int s_statfs; /* Count of statfs */
-};
-
-/*
- * System statistics
- */
-struct amd_stats {
- int d_drops; /* Dropped requests */
- int d_stale; /* Stale NFS handles */
- int d_mok; /* Successful mounts */
- int d_merr; /* Failed mounts */
- int d_uerr; /* Failed unmounts */
-};
-extern struct amd_stats amd_stats;
-
-/*
- * Map of auto-mount points.
- */
-struct am_node {
- int am_mapno; /* Map number */
- mntfs *am_mnt; /* Mounted filesystem */
- mntfs **am_mfarray; /* Filesystem sources to try to mount */
- char *am_name; /* "kiska": name of this node */
- char *am_path; /* "/home/kiska": path of this node's mount point */
- char *am_link; /* "/a/kiska/home/kiska/this/that": link to sub-dir */
- am_node *am_parent; /* Parent of this node */
- am_node *am_ysib; /* Younger sibling of this node */
- am_node *am_osib; /* Older sibling of this node */
- am_node *am_child; /* First child of this node */
- nfsattrstat am_attr; /* File attributes */
-#define am_fattr am_attr.ns_u.ns_attr_u
- int am_flags; /* Boolean flags AMF_* */
- int am_error; /* Specific mount error */
- time_t am_ttl; /* Time to live */
- int am_timeo_w; /* Dismount wait interval */
- int am_timeo; /* Cache timeout interval */
- u_int am_gen; /* Generation number */
- char *am_pref; /* Mount info prefix */
- am_stats am_stats; /* Statistics gathering */
- SVCXPRT *am_transp; /* Info for quick reply */
- dev_t am_dev; /* Device number */
- dev_t am_rdev; /* Remote/real device number */
-#ifdef HAVE_FS_AUTOFS
- autofs_fh_t *am_autofs_fh;
- time_t am_autofs_ttl; /* Time to expire autofs nodes */
-#endif /* HAVE_FS_AUTOFS */
-};
-
-/*
- * EXTERNALS:
- */
-
-/*
- * Amq server global functions
- */
-extern amq_mount_info_list *amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp);
-extern amq_mount_stats *amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp);
-extern amq_mount_tree_list *amqproc_export_1_svc(voidp argp, struct svc_req *rqstp);
-extern amq_mount_tree_p *amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp);
-extern amq_string *amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp);
-extern amq_string *amqproc_pawd_1_svc(voidp argp, struct svc_req *rqstp);
-extern int *amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp);
-extern int *amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp);
-extern int *amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp);
-extern voidp amqproc_null_1_svc(voidp argp, struct svc_req *rqstp);
-extern voidp amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp);
-
-/* other external definitions */
-extern am_nfs_fh *get_root_nfs_fh(char *dir);
-extern am_node *find_ap(char *);
-extern am_node *get_ap_child(am_node *, char *);
-extern bool_t xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead);
-extern fserver *find_nfs_srvr(mntfs *mf);
-extern int mount_nfs_fh(am_nfs_handle_t *fhp, char *mntdir, char *fs_name, mntfs *mf);
-extern int process_all_regular_maps(void);
-extern cf_map_t *find_cf_map(const char *name);
-extern int set_conf_kv(const char *section, const char *k, const char *v);
-extern int mount_node(opaque_t arg);
-extern int unmount_mp(am_node *mp);
-extern int yyparse (void);
-
-extern void amfs_mkcacheref(mntfs *mf);
-extern int amfs_mount(am_node *mp, mntfs *mf, char *opts);
-extern void assign_error_mntfs(am_node *mp);
-extern am_node *next_nonerror_node(am_node *xp);
-extern void flush_srvr_nfs_cache(fserver *fs);
-extern void am_mounted(am_node *);
-extern void mf_mounted(mntfs *mf, bool_t call_free_opts);
-extern void am_unmounted(am_node *);
-extern am_node *get_exported_ap(int index);
-extern am_node *get_first_exported_ap(int *index);
-extern am_node *get_next_exported_ap(int *index);
-extern am_node *path_to_exported_ap(char *path);
-extern am_node *exported_ap_alloc(void);
-extern am_node *find_mf(mntfs *);
-extern am_node *next_map(int *);
-extern am_ops *ops_match(am_opts *, char *, char *, char *, char *, char *);
-extern am_ops *ops_search(char *);
-extern fserver *dup_srvr(fserver *);
-extern void srvrlog(fserver *, char *);
-extern int get_mountd_port(fserver *, u_short *, wchan_t);
-extern void flush_nfs_fhandle_cache(fserver *);
-
-extern mntfs *dup_mntfs(mntfs *);
-extern mntfs *find_mntfs(am_ops *, am_opts *, char *, char *, char *, char *, char *);
-extern mntfs *locate_mntfs(am_ops *, am_opts *, char *, char *, char *, char *, char *);
-extern mntfs *new_mntfs(void);
-extern mntfs *realloc_mntfs(mntfs *, am_ops *, am_opts *, char *, char *, char *, char *, char *);
-extern void flush_mntfs(void);
-extern void free_mntfs(voidp);
-
-
-extern void amq_program_1(struct svc_req *rqstp, SVCXPRT *transp);
-extern int background(void);
-extern void deslashify(char *);
-extern void do_task_notify(void);
-extern int eval_fs_opts(am_opts *, char *, char *, char *, char *, char *);
-extern void forcibly_timeout_mp(am_node *);
-extern void free_map(am_node *);
-extern void free_opts(am_opts *);
-extern void free_srvr(fserver *);
-extern int fwd_init(void);
-extern int fwd_packet(int, char *, int, struct sockaddr_in *, struct sockaddr_in *, opaque_t, fwd_fun *);
-extern void fwd_reply(void);
-extern void get_args(int argc, char *argv[]);
-extern wchan_t get_mntfs_wchan(mntfs *mf);
-extern void host_normalize(char **);
-extern void init_map(am_node *, char *);
-extern void ins_que(qelem *, qelem *);
-extern void insert_am(am_node *, am_node *);
-extern int make_nfs_auth(void);
-extern void make_root_node(void);
-extern void map_flush_srvr(fserver *);
-extern void mapc_add_kv(mnt_map *, char *, char *);
-extern mnt_map *mapc_find(char *, char *, const char *);
-extern void mapc_free(opaque_t);
-extern int mapc_keyiter(mnt_map *, key_fun, opaque_t);
-extern void mapc_reload(void);
-extern int mapc_search(mnt_map *, char *, char **);
-extern void mapc_showtypes(char *buf, size_t l);
-extern int mapc_type_exists(const char *type);
-extern void mk_fattr(nfsfattr *, nfsftype);
-extern int mount_auto_node(char *, opaque_t);
-extern int mount_automounter(int);
-extern int mount_exported(void);
-extern void mp_to_fh(am_node *, am_nfs_fh *);
-extern void new_ttl(am_node *);
-extern void nfs_quick_reply(am_node *mp, int error);
-extern void normalize_slash(char *);
-extern void ops_showamfstypes(char *buf, size_t l);
-extern void ops_showfstypes(char *outbuf, size_t l);
-extern void rem_que(qelem *);
-extern void reschedule_timeout_mp(void);
-extern void restart(void);
-extern void restart_automounter_nodes(void);
-extern int root_keyiter(key_fun *, opaque_t);
-extern void root_newmap(const char *, const char *, const char *, const cf_map_t *);
-extern void run_task(task_fun *, opaque_t, cb_fun *, opaque_t);
-extern void sched_task(cb_fun *, opaque_t, wchan_t);
-extern int softclock(void);
-extern int timeout(u_int, void (*fn)(opaque_t), opaque_t);
-extern void timeout_mp(opaque_t);
-extern void untimeout(int);
-extern void umount_exported(void);
-extern int valid_key(char *);
-extern void wakeup(wchan_t);
-extern void wakeup_srvr(fserver *);
-extern void wakeup_task(int, int, wchan_t);
-#define SIZEOF_PID_FSNAME (16 + MAXHOSTNAMELEN)
-extern char pid_fsname[SIZEOF_PID_FSNAME]; /* "kiska.southseas.nz:(pid%d)" */
-#define SIZEOF_HOSTD (2 * MAXHOSTNAMELEN + 1)
-extern char hostd[SIZEOF_HOSTD]; /* Host+domain */
-#define SIZEOF_OPTS 256 /* used for char opts[] and preopts[] */
-
-/*
- * Global variables.
- */
-extern FILE *yyin;
-extern SVCXPRT *current_transp; /* For nfs_quick_reply() */
-extern char *conf_tag;
-#define SIZEOF_UID_STR 12
-#define SIZEOF_GID_STR 12
-extern char *opt_gid, gid_str[SIZEOF_GID_STR];
-extern char *opt_uid, uid_str[SIZEOF_UID_STR];
-extern int NumChildren;
-extern int fwd_sock;
-extern int select_intr_valid;
-extern int immediate_abort; /* Should close-down unmounts be retried */
-extern int usage;
-extern int use_conf_file; /* use amd configuration file */
-extern int task_notify_todo; /* Task notifier needs running */
-extern jmp_buf select_intr;
-extern qelem mfhead;
-extern struct amu_global_options gopt; /* where global options are stored */
-extern time_t do_mapc_reload; /* Flush & reload mount map cache */
-extern time_t next_softclock; /* Time to call softclock() */
-
-#ifdef HAVE_SIGACTION
-extern sigset_t masked_sigs;
-#endif /* HAVE_SIGACTION */
-
-#if defined(HAVE_AMU_FS_LINK) || defined(HAVE_AMU_FS_LINKX)
-extern char *amfs_link_match(am_opts *fo);
-#endif /* defined(HAVE_AMU_FS_LINK) || defined(HAVE_AMU_FS_LINKX) */
-
-#ifdef HAVE_FS_AUTOFS
-extern int amd_use_autofs;
-
-extern int autofs_get_fh(am_node *mp);
-extern void autofs_release_fh(am_node *mp);
-extern void autofs_get_mp(am_node *mp);
-extern void autofs_release_mp(am_node *mp);
-extern void autofs_add_fdset(fd_set *readfds);
-extern int autofs_handle_fdset(fd_set *readfds, int nsel);
-extern void autofs_mounted(am_node *mp);
-extern void autofs_mount_succeeded(am_node *mp);
-extern void autofs_mount_failed(am_node *mp);
-extern int autofs_umount_succeeded(am_node *mp);
-extern int autofs_umount_failed(am_node *mp);
-extern int autofs_mount_fs(am_node *mp, mntfs *mf);
-extern int autofs_umount_fs(am_node *mp, mntfs *mf);
-extern void autofs_get_opts(char *opts, size_t l, autofs_fh_t *fh);
-extern int autofs_compute_mount_flags(mntent_t *);
-extern void autofs_timeout_mp(am_node *);
-extern int create_autofs_service(void);
-extern int destroy_autofs_service(void);
-#endif /* HAVE_FS_AUTOFS */
-
-/**************************************************************************/
-/*** Generic file-system types, implemented as part of the native O/S. ***/
-/**************************************************************************/
-
-/*
- * Loopback File System
- * Many systems can't support this, and in any case most of the
- * functionality is available with Symlink FS.
- */
-#ifdef HAVE_FS_LOFS
-extern am_ops lofs_ops;
-extern int mount_lofs(char *mntdir, char *fs_name, char *opts, int on_autofs);
-#endif /* HAVE_FS_LOFS */
-
-/*
- * CD-ROM File System (CD-ROM)
- * (HSFS: High Sierra F/S on some machines)
- * Many systems can't support this, and in any case most of the
- * functionality is available with program FS.
- */
-#ifdef HAVE_FS_CDFS
-extern am_ops cdfs_ops;
-#endif /* HAVE_FS_CDFS */
-
-/*
- * PC File System (MS-DOS)
- * Many systems can't support this, and in any case most of the
- * functionality is available with program FS.
- */
-#ifdef HAVE_FS_PCFS
-extern am_ops pcfs_ops;
-#endif /* HAVE_FS_PCFS */
-
-/*
- * Caching File System (Solaris)
- */
-#ifdef HAVE_FS_CACHEFS
-extern am_ops cachefs_ops;
-#endif /* HAVE_FS_CACHEFS */
-
-/*
- * Network File System
- * Good, slow, NFS V.2.
- */
-#ifdef HAVE_FS_NFS
-extern am_ops nfs_ops; /* NFS */
-extern fserver *find_nfs_srvr (mntfs *);
-extern qelem nfs_srvr_list;
-#endif /* HAVE_FS_NFS */
-
-/*
- * Un*x File System
- * Normal local disk file system.
- */
-#ifdef HAVE_FS_UFS
-extern am_ops ufs_ops; /* Un*x file system */
-#endif /* HAVE_FS_UFS */
-
-/* Unix file system (irix) */
-#ifdef HAVE_FS_XFS
-extern am_ops xfs_ops; /* Un*x file system */
-#endif /* HAVE_FS_XFS */
-
-/* Unix file system (irix) */
-#ifdef HAVE_FS_EFS
-extern am_ops efs_ops; /* Un*x file system */
-#endif /* HAVE_FS_EFS */
-
-/**************************************************************************/
-/*** Automounter file-system types, implemented by amd. ***/
-/**************************************************************************/
-
-/*
- * Root AMD File System
- */
-extern am_ops amfs_root_ops; /* Root file system */
-
-/*
- * Generic amfs helper methods
- */
-extern am_node *amfs_generic_lookup_child(am_node *mp, char *fname, int *error_return, int op);
-extern am_node *amfs_generic_mount_child(am_node *ap, int *error_return);
-extern int amfs_generic_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count);
-extern int amfs_generic_umount(am_node *mp, mntfs *mf);
-extern void amfs_generic_mounted(mntfs *mf);
-extern char *amfs_generic_match(am_opts *fo);
-extern fserver *amfs_generic_find_srvr(mntfs *);
-
-/*
- * Automount File System
- */
-#ifdef HAVE_AMU_FS_AUTO
-extern am_ops amfs_auto_ops; /* Automount file system (this!) */
-#endif /* HAVE_AMU_FS_AUTO */
-
-/*
- * Toplvl Automount File System
- */
-#ifdef HAVE_AMU_FS_TOPLVL
-extern am_ops amfs_toplvl_ops; /* Toplvl Automount file system */
-extern int amfs_toplvl_mount(am_node *mp, mntfs *mf);
-extern int amfs_toplvl_umount(am_node *mp, mntfs *mf);
-#endif /* HAVE_AMU_FS_TOPLVL */
-
-/*
- * Direct Automount File System
- */
-#ifdef HAVE_AMU_FS_DIRECT
-extern am_ops amfs_direct_ops; /* Direct Automount file system (this too) */
-#endif /* HAVE_AMU_FS_DIRECT */
-
-/*
- * Error File System
- */
-#ifdef HAVE_AMU_FS_ERROR
-extern am_ops amfs_error_ops; /* Error file system */
-extern am_node *amfs_error_lookup_child(am_node *mp, char *fname, int *error_return, int op);
-extern am_node *amfs_error_mount_child(am_node *ap, int *error_return);
-extern int amfs_error_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count);
-#endif /* HAVE_AMU_FS_ERROR */
-
-/*
- * NFS mounts with local existence check.
- */
-#ifdef HAVE_AMU_FS_NFSL
-extern am_ops amfs_nfsl_ops; /* NFSL */
-#endif /* HAVE_AMU_FS_NFSL */
-
-/*
- * Multi-nfs mounts.
- */
-#ifdef HAVE_AMU_FS_NFSX
-extern am_ops amfs_nfsx_ops; /* NFSX */
-#endif /* HAVE_AMU_FS_NFSX */
-
-/*
- * NFS host - a whole tree.
- */
-#ifdef HAVE_AMU_FS_HOST
-extern am_ops amfs_host_ops; /* NFS host */
-#endif /* HAVE_AMU_FS_HOST */
-
-/*
- * Program File System
- * This is useful for things like RVD.
- */
-#ifdef HAVE_AMU_FS_PROGRAM
-extern am_ops amfs_program_ops; /* Program File System */
-#endif /* HAVE_AMU_FS_PROGRAM */
-
-/*
- * Symbolic-link file system.
- * A "filesystem" which is just a symbol link.
- */
-#ifdef HAVE_AMU_FS_LINK
-extern am_ops amfs_link_ops; /* Symlink FS */
-#endif /* HAVE_AMU_FS_LINK */
-
-/*
- * Symbolic-link file system, which also checks that the target of
- * the symlink exists.
- * A "filesystem" which is just a symbol link.
- */
-#ifdef HAVE_AMU_FS_LINKX
-extern am_ops amfs_linkx_ops; /* Symlink FS with existence check */
-#endif /* HAVE_AMU_FS_LINKX */
-
-/*
- * Union file system
- */
-#ifdef HAVE_AMU_FS_UNION
-extern am_ops amfs_union_ops; /* Union FS */
-#endif /* HAVE_AMU_FS_UNION */
-
-#endif /* not _AMD_H */
diff --git a/contrib/amd/amd/amfs_auto.c b/contrib/amd/amd/amfs_auto.c
deleted file mode 100644
index 75a451fd111d..000000000000
--- a/contrib/amd/amd/amfs_auto.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_auto.c
- *
- */
-
-/*
- * Automount file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/****************************************************************************
- *** MACROS ***
- ****************************************************************************/
-
-
-/****************************************************************************
- *** STRUCTURES ***
- ****************************************************************************/
-
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static int amfs_auto_mount(am_node *mp, mntfs *mf);
-
-
-/****************************************************************************
- *** OPS STRUCTURES ***
- ****************************************************************************/
-am_ops amfs_auto_ops =
-{
- "auto",
- amfs_generic_match,
- 0, /* amfs_auto_init */
- amfs_auto_mount,
- amfs_generic_umount,
- amfs_generic_lookup_child,
- amfs_generic_mount_child,
- amfs_generic_readdir,
- 0, /* amfs_auto_readlink */
- amfs_generic_mounted,
- 0, /* amfs_auto_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_auto_get_wchan */
- FS_AMQINFO | FS_DIRECTORY,
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_AUTO_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-/*
- * Mount a sub-mount
- */
-static int
-amfs_auto_mount(am_node *mp, mntfs *mf)
-{
- /*
- * Pseudo-directories are used to provide some structure
- * to the automounted directories instead
- * of putting them all in the top-level automount directory.
- *
- * Here, just increment the parent's link count.
- */
- mp->am_parent->am_fattr.na_nlink++;
-
- /*
- * Info field of . means use parent's info field.
- * Historical - not documented.
- */
- if (mf->mf_info[0] == '.' && mf->mf_info[1] == '\0')
- mf->mf_info = strealloc(mf->mf_info, mp->am_parent->am_mnt->mf_info);
-
- /*
- * Compute prefix:
- *
- * If there is an option prefix then use that else
- * If the parent had a prefix then use that with name
- * of this node appended else
- * Use the name of this node.
- *
- * That means if you want no prefix you must say so
- * in the map.
- */
- if (mf->mf_fo->opt_pref) {
- /* allow pref:=null to set a real null prefix */
- if (STREQ(mf->mf_fo->opt_pref, "null")) {
- mp->am_pref = strdup("");
- } else {
- /*
- * the prefix specified as an option
- */
- mp->am_pref = strdup(mf->mf_fo->opt_pref);
- }
- } else {
- /*
- * else the parent's prefix
- * followed by the name
- * followed by /
- */
- char *ppref = mp->am_parent->am_pref;
- if (ppref == 0)
- ppref = "";
- mp->am_pref = str3cat((char *) 0, ppref, mp->am_name, "/");
- }
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS) {
- char opts[SIZEOF_OPTS];
- int error;
-
- autofs_get_opts(opts, sizeof(opts), mp->am_autofs_fh);
-
- /* now do the mount */
- error = amfs_mount(mp, mf, opts);
- if (error) {
- errno = error;
- plog(XLOG_FATAL, "amfs_auto_mount: amfs_mount failed: %m");
- return error;
- }
- }
-#endif /* HAVE_FS_AUTOFS */
-
- /*
- * Attach a map cache
- */
- amfs_mkcacheref(mf);
-
- return 0;
-}
diff --git a/contrib/amd/amd/amfs_direct.c b/contrib/amd/amd/amfs_direct.c
deleted file mode 100644
index dbef743d0d7e..000000000000
--- a/contrib/amd/amd/amfs_direct.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_direct.c
- *
- */
-
-/*
- * Direct file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static am_node *amfs_direct_readlink(am_node *mp, int *error_return);
-
-/****************************************************************************
- *** OPS STRUCTURES ***
- ****************************************************************************/
-am_ops amfs_direct_ops =
-{
- "direct",
- amfs_generic_match,
- 0, /* amfs_direct_init */
- amfs_toplvl_mount,
- amfs_toplvl_umount,
- amfs_generic_lookup_child,
- amfs_generic_mount_child,
- amfs_error_readdir,
- amfs_direct_readlink,
- amfs_generic_mounted,
- 0, /* amfs_direct_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_direct_get_wchan */
- FS_DIRECT | FS_MKMNT | FS_NOTIMEOUT | FS_BACKGROUND | FS_AMQINFO,
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_DIRECT_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-
-static am_node *
-amfs_direct_readlink(am_node *mp, int *error_return)
-{
- am_node *xp;
- int rc = 0;
-
- xp = next_nonerror_node(mp->am_child);
- if (!xp) {
- if (!mp->am_mnt->mf_private)
- amfs_mkcacheref(mp->am_mnt); /* XXX */
- xp = amfs_generic_lookup_child(mp, mp->am_path + 1, &rc, VLOOK_CREATE);
- if (xp && rc < 0)
- xp = amfs_generic_mount_child(xp, &rc);
- }
- if (xp) {
- new_ttl(xp); /* (7/12/89) from Rein Tollevik */
- return xp;
- }
- if (amd_state == Finishing)
- rc = ENOENT;
- *error_return = rc;
- return 0;
-}
diff --git a/contrib/amd/amd/amfs_error.c b/contrib/amd/amd/amfs_error.c
deleted file mode 100644
index 51bdaa6db14d..000000000000
--- a/contrib/amd/amd/amfs_error.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_error.c
- *
- */
-
-/*
- * Error file system.
- * This is used as a last resort catchall if
- * nothing else worked. EFS just returns lots
- * of error codes, except for unmount which
- * always works of course.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-static char *amfs_error_match(am_opts *fo);
-static int amfs_error_mount(am_node *am, mntfs *mf);
-static int amfs_error_umount(am_node *am, mntfs *mf);
-
-
-/*
- * Ops structure
- */
-am_ops amfs_error_ops =
-{
- "error",
- amfs_error_match,
- 0, /* amfs_error_init */
- amfs_error_mount,
- amfs_error_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_error_readlink */
- 0, /* amfs_error_mounted */
- 0, /* amfs_error_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_error_get_wchan */
- FS_DISCARD, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_ERROR_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-
-/*
- * EFS file system always matches
- */
-static char *
-amfs_error_match(am_opts *fo)
-{
- return strdup("(error-hook)");
-}
-
-
-static int
-amfs_error_mount(am_node *am, mntfs *mf)
-{
- return ENOENT;
-}
-
-
-static int
-amfs_error_umount(am_node *am, mntfs *mf)
-{
- /*
- * Always succeed
- */
- return 0;
-}
-
-
-/*
- * EFS interface to RPC lookup() routine.
- * Should never get here in the automounter.
- * If we do then just give an error.
- */
-am_node *
-amfs_error_lookup_child(am_node *mp, char *fname, int *error_return, int op)
-{
- *error_return = ESTALE;
- return 0;
-}
-
-
-/*
- * EFS interface to RPC lookup() routine.
- * Should never get here in the automounter.
- * If we do then just give an error.
- */
-am_node *
-amfs_error_mount_child(am_node *ap, int *error_return)
-{
- *error_return = ESTALE;
- return 0;
-}
-
-
-/*
- * EFS interface to RPC readdir() routine.
- * Should never get here in the automounter.
- * If we do then just give an error.
- */
-int
-amfs_error_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count)
-{
- return ESTALE;
-}
diff --git a/contrib/amd/amd/amfs_generic.c b/contrib/amd/amd/amfs_generic.c
deleted file mode 100644
index 3e7c365a7593..000000000000
--- a/contrib/amd/amd/amfs_generic.c
+++ /dev/null
@@ -1,1262 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_generic.c
- *
- */
-
-/*
- * generic functions used by amfs filesystems, ripped out of amfs_auto.c.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/****************************************************************************
- *** MACROS ***
- ****************************************************************************/
-#define IN_PROGRESS(cp) ((cp)->mp->am_mnt->mf_flags & MFF_MOUNTING)
-
-
-/****************************************************************************
- *** STRUCTURES ***
- ****************************************************************************/
-/*
- * Mounting a file system may take a significant period of time. The
- * problem is that if this is done in the main process thread then the
- * entire automounter could be blocked, possibly hanging lots of processes
- * on the system. Instead we use a continuation scheme to allow mounts to
- * be attempted in a sub-process. When the sub-process exits we pick up the
- * exit status (by convention a UN*X error number) and continue in a
- * notifier. The notifier gets handed a data structure and can then
- * determine whether the mount was successful or not. If not, it updates
- * the data structure and tries again until there are no more ways to try
- * the mount, or some other permanent error occurs. In the mean time no RPC
- * reply is sent, even after the mount is successful. We rely on the RPC
- * retry mechanism to resend the lookup request which can then be handled.
- */
-struct continuation {
- am_node *mp; /* Node we are trying to mount */
- int retry; /* Try again? */
- time_t start; /* Time we started this mount */
- int callout; /* Callout identifier */
- mntfs **mf; /* Current mntfs */
-};
-
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static am_node *amfs_lookup_node(am_node *mp, char *fname, int *error_return);
-static mntfs *amfs_lookup_one_mntfs(am_node *new_mp, mntfs *mf, char *ivec,
- char *def_opts, char *pfname);
-static mntfs **amfs_lookup_mntfs(am_node *new_mp, int *error_return);
-static void amfs_cont(int rc, int term, opaque_t arg);
-static void amfs_retry(int rc, int term, opaque_t arg);
-static void free_continuation(struct continuation *cp);
-static int amfs_bgmount(struct continuation *cp);
-static char *amfs_parse_defaults(am_node *mp, mntfs *mf, char *def_opts);
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-static am_node *
-amfs_lookup_node(am_node *mp, char *fname, int *error_return)
-{
- am_node *new_mp;
- int error = 0; /* Error so far */
- int in_progress = 0; /* # of (un)mount in progress */
- mntfs *mf;
- char *expanded_fname = 0;
-
- dlog("in amfs_lookup_node");
-
- /*
- * If the server is shutting down
- * then don't return information
- * about the mount point.
- */
- if (amd_state == Finishing) {
- if (mp->am_mnt == 0 || mp->am_mnt->mf_fsflags & FS_DIRECT) {
- dlog("%s mount ignored - going down", fname);
- } else {
- dlog("%s/%s mount ignored - going down", mp->am_path, fname);
- }
- ereturn(ENOENT);
- }
-
- /*
- * Handle special case of "." and ".."
- */
- if (fname[0] == '.') {
- if (fname[1] == '\0')
- return mp; /* "." is the current node */
- if (fname[1] == '.' && fname[2] == '\0') {
- if (mp->am_parent) {
- dlog(".. in %s gives %s", mp->am_path, mp->am_parent->am_path);
- return mp->am_parent; /* ".." is the parent node */
- }
- ereturn(ESTALE);
- }
- }
-
- /*
- * Check for valid key name.
- * If it is invalid then pretend it doesn't exist.
- */
- if (!valid_key(fname)) {
- plog(XLOG_WARNING, "Key \"%s\" contains a disallowed character", fname);
- ereturn(ENOENT);
- }
-
- /*
- * Expand key name.
- * expanded_fname is now a private copy.
- */
- expanded_fname = expand_selectors(fname);
-
- /*
- * Search children of this node
- */
- for (new_mp = mp->am_child; new_mp; new_mp = new_mp->am_osib) {
- if (FSTREQ(new_mp->am_name, expanded_fname)) {
- if (new_mp->am_error) {
- error = new_mp->am_error;
- continue;
- }
-
- /*
- * If the error code is undefined then it must be
- * in progress.
- */
- mf = new_mp->am_mnt;
- if (mf->mf_error < 0)
- goto in_progrss;
-
- /*
- * If there was a previous error with this node
- * then return that error code.
- */
- if (mf->mf_flags & MFF_ERROR) {
- error = mf->mf_error;
- continue;
- }
- if (!(mf->mf_flags & MFF_MOUNTED) || (mf->mf_flags & MFF_UNMOUNTING)) {
- in_progrss:
- /*
- * If the fs is not mounted or it is unmounting then there
- * is a background (un)mount in progress. In this case
- * we just drop the RPC request (return nil) and
- * wait for a retry, by which time the (un)mount may
- * have completed.
- */
- dlog("ignoring mount of %s in %s -- %smounting in progress, flags %x",
- expanded_fname, mf->mf_mount,
- (mf->mf_flags & MFF_UNMOUNTING) ? "un" : "", mf->mf_flags);
- in_progress++;
- if (mf->mf_flags & MFF_UNMOUNTING) {
- dlog("will remount later");
- new_mp->am_flags |= AMF_REMOUNT;
- }
- continue;
- }
-
- /*
- * Otherwise we have a hit: return the current mount point.
- */
- dlog("matched %s in %s", expanded_fname, new_mp->am_path);
- XFREE(expanded_fname);
- return new_mp;
- }
- }
-
- if (in_progress) {
- dlog("Waiting while %d mount(s) in progress", in_progress);
- XFREE(expanded_fname);
- ereturn(-1);
- }
-
- /*
- * If an error occurred then return it.
- */
- if (error) {
- dlog("Returning error: %s", strerror(error));
- XFREE(expanded_fname);
- ereturn(error);
- }
-
- /*
- * If the server is going down then just return,
- * don't try to mount any more file systems
- */
- if ((int) amd_state >= (int) Finishing) {
- dlog("not found - server going down anyway");
- ereturn(ENOENT);
- }
-
- /*
- * Allocate a new map
- */
- new_mp = get_ap_child(mp, expanded_fname);
- XFREE(expanded_fname);
- if (new_mp == 0)
- ereturn(ENOSPC);
-
- *error_return = -1;
- return new_mp;
-}
-
-
-
-static mntfs *
-amfs_lookup_one_mntfs(am_node *new_mp, mntfs *mf, char *ivec,
- char *def_opts, char *pfname)
-{
- am_ops *p;
- am_opts *fs_opts;
- mntfs *new_mf;
- char *mp_dir = 0;
-#ifdef HAVE_FS_AUTOFS
- int on_autofs = 1;
-#endif /* HAVE_FS_AUTOFS */
-
- /* match the operators */
- fs_opts = CALLOC(am_opts);
- p = ops_match(fs_opts, ivec, def_opts, new_mp->am_path,
- pfname, mf->mf_info);
-#ifdef HAVE_FS_AUTOFS
- /* XXX: this should be factored out into an autofs-specific function */
- if (new_mp->am_flags & AMF_AUTOFS) {
- /* ignore user-provided fs if we're using autofs */
- if (fs_opts->opt_sublink) {
- /*
- * For sublinks we need to use a hack with autofs:
- * mount the filesystem on the original opt_fs (which is NOT an
- * autofs mountpoint) and symlink (or lofs-mount) to it from
- * the autofs mountpoint.
- */
- on_autofs = 0;
- mp_dir = fs_opts->opt_fs;
- } else {
- if (p->autofs_fs_flags & FS_ON_AUTOFS) {
- mp_dir = new_mp->am_path;
- } else {
- mp_dir = fs_opts->opt_fs;
- on_autofs = 0;
- }
- }
- } else
-#endif /* HAVE_FS_AUTOFS */
- mp_dir = fs_opts->opt_fs;
-
- /*
- * Find or allocate a filesystem for this node.
- */
- new_mf = find_mntfs(p, fs_opts,
- mp_dir,
- fs_opts->fs_mtab,
- def_opts,
- fs_opts->opt_opts,
- fs_opts->opt_remopts);
-
- /*
- * See whether this is a real filesystem
- */
- p = new_mf->mf_ops;
- if (p == &amfs_error_ops) {
- plog(XLOG_MAP, "Map entry %s for %s did not match", ivec, new_mp->am_path);
- free_mntfs(new_mf);
- return NULL;
- }
-
- dlog("Got a hit with %s", p->fs_type);
-
-#ifdef HAVE_FS_AUTOFS
- if (new_mp->am_flags & AMF_AUTOFS && on_autofs) {
- new_mf->mf_flags |= MFF_ON_AUTOFS;
- new_mf->mf_fsflags = new_mf->mf_ops->autofs_fs_flags;
- }
- /*
- * A new filesystem is an autofs filesystems if:
- * 1. it claims it can be one (has the FS_AUTOFS flag)
- * 2. autofs is enabled system-wide
- * 3. either has an autofs parent,
- * or it is explicitly requested to be autofs.
- */
- if (new_mf->mf_ops->autofs_fs_flags & FS_AUTOFS &&
- amd_use_autofs &&
- ((mf->mf_flags & MFF_IS_AUTOFS) ||
- (new_mf->mf_fo && new_mf->mf_fo->opt_mount_type &&
- STREQ(new_mf->mf_fo->opt_mount_type, "autofs"))))
- new_mf->mf_flags |= MFF_IS_AUTOFS;
-#endif /* HAVE_FS_AUTOFS */
-
- return new_mf;
-}
-
-
-static mntfs **
-amfs_lookup_mntfs(am_node *new_mp, int *error_return)
-{
- am_node *mp;
- char *info; /* Mount info - where to get the file system */
- char **ivecs, **cur_ivec; /* Split version of info */
- int num_ivecs;
- char *orig_def_opts; /* Original Automount options */
- char *def_opts; /* Automount options */
- int error = 0; /* Error so far */
- char path_name[MAXPATHLEN]; /* General path name buffer */
- char *pfname; /* Path for database lookup */
- mntfs *mf, **mf_array;
- int count;
-
- dlog("in amfs_lookup_mntfs");
-
- mp = new_mp->am_parent;
-
- /*
- * If we get here then this is a reference to an,
- * as yet, unknown name so we need to search the mount
- * map for it.
- */
- if (mp->am_pref) {
- if (strlen(mp->am_pref) + strlen(new_mp->am_name) >= sizeof(path_name))
- ereturn(ENAMETOOLONG);
- xsnprintf(path_name, sizeof(path_name), "%s%s", mp->am_pref, new_mp->am_name);
- pfname = path_name;
- } else {
- pfname = new_mp->am_name;
- }
-
- mf = mp->am_mnt;
-
- dlog("will search map info in %s to find %s", mf->mf_info, pfname);
- /*
- * Consult the oracle for some mount information.
- * info is malloc'ed and belongs to this routine.
- * It ends up being free'd in free_continuation().
- *
- * Note that this may return -1 indicating that information
- * is not yet available.
- */
- error = mapc_search((mnt_map *) mf->mf_private, pfname, &info);
- if (error) {
- if (error > 0)
- plog(XLOG_MAP, "No map entry for %s", pfname);
- else
- plog(XLOG_MAP, "Waiting on map entry for %s", pfname);
- ereturn(error);
- }
- dlog("mount info is %s", info);
-
- /*
- * Split info into an argument vector.
- * The vector is malloc'ed and belongs to
- * this routine. It is free'd further down.
- *
- * Note: the vector pointers point into info, so don't free it!
- */
- ivecs = strsplit(info, ' ', '\"');
-
- if (mf->mf_auto)
- def_opts = mf->mf_auto;
- else
- def_opts = "";
-
- orig_def_opts = amfs_parse_defaults(mp, mf, strdup(def_opts));
- def_opts = strdup(orig_def_opts);
-
- /* first build our defaults */
- num_ivecs = 0;
- for (cur_ivec = ivecs; *cur_ivec; cur_ivec++) {
- if (**cur_ivec == '-') {
- /*
- * Pick up new defaults
- */
- char *new_def_opts = str3cat(NULL, def_opts, ";", *cur_ivec + 1);
- XFREE(def_opts);
- def_opts = new_def_opts;
- dlog("Setting def_opts to \"%s\"", def_opts);
- continue;
- } else
- num_ivecs++;
- }
-
- mf_array = calloc(num_ivecs + 1, sizeof(mntfs *));
-
- /* construct the array of struct mntfs for this mount point */
- for (count = 0, cur_ivec = ivecs; *cur_ivec; cur_ivec++) {
- mntfs *new_mf;
-
- if (**cur_ivec == '-') {
- XFREE(def_opts);
- if ((*cur_ivec)[1] == '\0') {
- /*
- * If we have a single dash '-' than we need to reset the
- * default options.
- */
- def_opts = strdup(orig_def_opts);
- dlog("Resetting the default options, a single dash '-' was found.");
- } else {
- /* append options to /default options */
- def_opts = str3cat((char *) 0, orig_def_opts, ";", *cur_ivec + 1);
- dlog("Resetting def_opts to \"%s\"", def_opts);
- }
- continue;
- }
-
- /*
- * If a mntfs has already been found, and we find
- * a cut then don't try any more locations.
- *
- * XXX: we do not know when the "/" was added as an equivalent for "||".
- * It's undocumented, it might go away at any time. Caveat emptor.
- */
- if (STREQ(*cur_ivec, "/") || STREQ(*cur_ivec, "||")) {
- if (count > 0) {
- dlog("Cut: not trying any more locations for %s", mp->am_path);
- break;
- }
- continue;
- }
-
- new_mf = amfs_lookup_one_mntfs(new_mp, mf, *cur_ivec, def_opts, pfname);
- if (new_mf == NULL)
- continue;
- mf_array[count++] = new_mf;
- }
-
- /* We're done with ivecs */
- XFREE(ivecs);
- XFREE(info);
- XFREE(orig_def_opts);
- XFREE(def_opts);
- if (count == 0) { /* no match */
- XFREE(mf_array);
- ereturn(ENOENT);
- }
-
- return mf_array;
-}
-
-
-/*
- * The continuation function. This is called by
- * the task notifier when a background mount attempt
- * completes.
- */
-static void
-amfs_cont(int rc, int term, opaque_t arg)
-{
- struct continuation *cp = (struct continuation *) arg;
- am_node *mp = cp->mp;
- mntfs *mf = mp->am_mnt;
-
- dlog("amfs_cont: '%s'", mp->am_path);
-
- /*
- * Definitely not trying to mount at the moment
- */
- mf->mf_flags &= ~MFF_MOUNTING;
-
- /*
- * While we are mounting - try to avoid race conditions
- */
- new_ttl(mp);
-
- /*
- * Wakeup anything waiting for this mount
- */
- wakeup(get_mntfs_wchan(mf));
-
- /*
- * Check for termination signal or exit status...
- */
- if (rc || term) {
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS &&
- !(mf->mf_flags & MFF_MOUNTED))
- autofs_release_fh(mp);
-#endif /* HAVE_FS_AUTOFS */
-
- if (term) {
- /*
- * Not sure what to do for an error code.
- */
- mf->mf_error = EIO; /* XXX ? */
- mf->mf_flags |= MFF_ERROR;
- plog(XLOG_ERROR, "mount for %s got signal %d", mp->am_path, term);
- } else {
- /*
- * Check for exit status...
- */
-#ifdef __linux__
- /*
- * HACK ALERT!
- *
- * On Linux (and maybe not only) it's possible to run
- * an amd which "knows" how to mount certain combinations
- * of nfs_proto/nfs_version which the kernel doesn't grok.
- * So if we got an EINVAL and we have a server that's not
- * using NFSv2/UDP, try again with NFSv2/UDP.
- *
- * Too bad that there is no way to dynamically determine
- * what combinations the _client_ supports, as opposed to
- * what the _server_ supports...
- */
- if (rc == EINVAL &&
- mf->mf_server &&
- (mf->mf_server->fs_version != 2 ||
- !STREQ(mf->mf_server->fs_proto, "udp")))
- mf->mf_flags |= MFF_NFS_SCALEDOWN;
- else
-#endif /* __linux__ */
- {
- mf->mf_error = rc;
- mf->mf_flags |= MFF_ERROR;
- errno = rc; /* XXX */
- if (!STREQ(mp->am_mnt->mf_ops->fs_type, "linkx"))
- plog(XLOG_ERROR, "%s: mount (amfs_cont): %m", mp->am_path);
- }
- }
-
- if (!(mf->mf_flags & MFF_NFS_SCALEDOWN)) {
- /*
- * If we get here then that attempt didn't work, so
- * move the info vector pointer along by one and
- * call the background mount routine again
- */
- amd_stats.d_merr++;
- cp->mf++;
- }
- amfs_bgmount(cp);
- if (mp->am_error > 0)
- assign_error_mntfs(mp);
- } else {
- /*
- * The mount worked.
- */
- dlog("Mounting %s returned success", cp->mp->am_path);
- am_mounted(cp->mp);
- free_continuation(cp);
- }
-
- reschedule_timeout_mp();
-}
-
-
-/*
- * Retry a mount
- */
-static void
-amfs_retry(int rc, int term, opaque_t arg)
-{
- struct continuation *cp = (struct continuation *) arg;
- am_node *mp = cp->mp;
- int error = 0;
-
- dlog("Commencing retry for mount of %s", mp->am_path);
-
- new_ttl(mp);
-
- if ((cp->start + ALLOWED_MOUNT_TIME) < clocktime(NULL)) {
- /*
- * The entire mount has timed out. Set the error code and skip past all
- * the mntfs's so that amfs_bgmount will not have any more
- * ways to try the mount, thus causing an error.
- */
- plog(XLOG_INFO, "mount of \"%s\" has timed out", mp->am_path);
- error = ETIMEDOUT;
- while (*cp->mf)
- cp->mf++;
- /* explicitly forbid further retries after timeout */
- cp->retry = FALSE;
- }
- if (error || !IN_PROGRESS(cp))
- error = amfs_bgmount(cp);
-
- reschedule_timeout_mp();
-}
-
-
-/*
- * Discard an old continuation
- */
-static void
-free_continuation(struct continuation *cp)
-{
- mntfs **mfp;
-
- dlog("free_continuation");
- if (cp->callout)
- untimeout(cp->callout);
- /*
- * we must free the mntfs's in the list.
- * so free all of them if there was an error,
- * or free all but the used one, if the mount succeeded.
- */
- for (mfp = cp->mp->am_mfarray; *mfp; mfp++) {
- free_mntfs(*mfp);
- }
- XFREE(cp->mp->am_mfarray);
- cp->mp->am_mfarray = 0;
- XFREE(cp);
-}
-
-
-/*
- * Pick a file system to try mounting and
- * do that in the background if necessary
- *
-For each location:
- discard previous mount location if required
- fetch next mount location
- if the filesystem failed to be mounted then
- this_error = error from filesystem
- goto failed
- if the filesystem is mounting or unmounting then
- goto retry;
- if the fileserver is down then
- this_error = EIO
- continue;
- if the filesystem is already mounted
- break
- fi
-
- this_error = initialize mount point
-
- if no error on this mount and mount is delayed then
- this_error = -1
- fi
- if this_error < 0 then
- retry = true
- fi
- if no error on this mount then
- if mount in background then
- run mount in background
- return -1
- else
- this_error = mount in foreground
- fi
- fi
- if an error occurred on this mount then
- update stats
- save error in mount point
- fi
-endfor
- */
-static int
-amfs_bgmount(struct continuation *cp)
-{
- am_node *mp = cp->mp;
- mntfs *mf; /* Current mntfs */
- int this_error = -1; /* Per-mount error */
- int hard_error = -1; /* Cumulative per-node error */
-
- if (mp->am_mnt)
- free_mntfs(mp->am_mnt);
-
- /*
- * Try to mount each location.
- * At the end:
- * hard_error == 0 indicates something was mounted.
- * hard_error > 0 indicates everything failed with a hard error
- * hard_error < 0 indicates nothing could be mounted now
- */
- for (mp->am_mnt = *cp->mf; *cp->mf; cp->mf++, mp->am_mnt = *cp->mf) {
- am_ops *p;
-
- mf = dup_mntfs(mp->am_mnt);
- p = mf->mf_ops;
-
- if (hard_error < 0)
- hard_error = this_error;
- this_error = 0;
-
- if (mf->mf_error > 0) {
- this_error = mf->mf_error;
- goto failed;
- }
-
- if (mf->mf_flags & (MFF_MOUNTING | MFF_UNMOUNTING)) {
- /*
- * Still mounting - retry later
- */
- dlog("mount of \"%s\" already pending", mf->mf_info);
- goto retry;
- }
-
- if (FSRV_ISDOWN(mf->mf_server)) {
- /*
- * Would just mount from the same place
- * as a hung mount - so give up
- */
- dlog("%s is already hung - giving up", mf->mf_server->fs_host);
- this_error = EIO;
- goto failed;
- }
-
- if (mp->am_link) {
- XFREE(mp->am_link);
- mp->am_link = NULL;
- }
- if (mf->mf_fo && mf->mf_fo->opt_sublink)
- mp->am_link = strdup(mf->mf_fo->opt_sublink);
-
- /*
- * Will usually need to play around with the mount nodes
- * file attribute structure. This must be done here.
- * Try and get things initialized, even if the fileserver
- * is not known to be up. In the common case this will
- * progress things faster.
- */
-
- /*
- * Fill in attribute fields.
- */
- if (mf->mf_fsflags & FS_DIRECTORY)
- mk_fattr(&mp->am_fattr, NFDIR);
- else
- mk_fattr(&mp->am_fattr, NFLNK);
-
- if (mf->mf_flags & MFF_MOUNTED) {
- dlog("duplicate mount of \"%s\" ...", mf->mf_info);
- /*
- * Skip initial processing of the mountpoint if already mounted.
- * This could happen if we have multiple sublinks into the same f/s,
- * or if we are restarting an already-mounted filesystem.
- */
- goto already_mounted;
- }
-
- if (mf->mf_fo && mf->mf_fo->fs_mtab) {
- plog(XLOG_MAP, "Trying mount of %s on %s fstype %s mount_type %s",
- mf->mf_fo->fs_mtab, mf->mf_mount, p->fs_type,
- mp->am_flags & AMF_AUTOFS ? "autofs" : "non-autofs");
- }
-
- if (p->fs_init && !(mf->mf_flags & MFF_RESTART))
- this_error = p->fs_init(mf);
-
- if (this_error > 0)
- goto failed;
- if (this_error < 0)
- goto retry;
-
- if (mf->mf_fo && mf->mf_fo->opt_delay) {
- /*
- * If there is a delay timer on the mount
- * then don't try to mount if the timer
- * has not expired.
- */
- int i = atoi(mf->mf_fo->opt_delay);
- time_t now = clocktime(NULL);
- if (i > 0 && now < (cp->start + i)) {
- dlog("Mount of %s delayed by %lds", mf->mf_mount, (long) (i - now + cp->start));
- goto retry;
- }
- }
-
- /*
- * If the directory is not yet made and it needs to be made, then make it!
- */
- if (!(mf->mf_flags & MFF_MKMNT) && mf->mf_fsflags & FS_MKMNT) {
- plog(XLOG_INFO, "creating mountpoint directory '%s'", mf->mf_mount);
- this_error = mkdirs(mf->mf_mount, 0555);
- if (this_error) {
- plog(XLOG_ERROR, "mkdirs failed: %s", strerror(this_error));
- goto failed;
- }
- mf->mf_flags |= MFF_MKMNT;
- }
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS)
- if ((this_error = autofs_get_fh(mp)))
- goto failed;
-#endif /* HAVE_FS_AUTOFS */
-
- already_mounted:
- mf->mf_flags |= MFF_MOUNTING;
- if (mf->mf_fsflags & FS_MBACKGROUND) {
- dlog("backgrounding mount of \"%s\"", mf->mf_mount);
- if (cp->callout) {
- untimeout(cp->callout);
- cp->callout = 0;
- }
-
- /* actually run the task, backgrounding as necessary */
- run_task(mount_node, (opaque_t) mp, amfs_cont, (opaque_t) cp);
- return -1;
- } else {
- dlog("foreground mount of \"%s\" ...", mf->mf_mount);
- this_error = mount_node((opaque_t) mp);
- }
-
- mf->mf_flags &= ~MFF_MOUNTING;
- if (this_error > 0)
- goto failed;
- if (this_error == 0) {
- am_mounted(mp);
- break; /* Success */
- }
-
- retry:
- if (!cp->retry)
- continue;
- dlog("will retry ...\n");
-
- /*
- * Arrange that amfs_bgmount is called
- * after anything else happens.
- */
- dlog("Arranging to retry mount of %s", mp->am_path);
- sched_task(amfs_retry, (opaque_t) cp, get_mntfs_wchan(mf));
- if (cp->callout)
- untimeout(cp->callout);
- cp->callout = timeout(RETRY_INTERVAL, wakeup,
- (opaque_t) get_mntfs_wchan(mf));
-
- mp->am_ttl = clocktime(NULL) + RETRY_INTERVAL;
-
- /*
- * Not done yet - so don't return anything
- */
- return -1;
-
- failed:
- amd_stats.d_merr++;
- mf->mf_error = this_error;
- mf->mf_flags |= MFF_ERROR;
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_autofs_fh)
- autofs_release_fh(mp);
-#endif /* HAVE_FS_AUTOFS */
- if (mf->mf_flags & MFF_MKMNT) {
- rmdirs(mf->mf_mount);
- mf->mf_flags &= ~MFF_MKMNT;
- }
- /*
- * Wakeup anything waiting for this mount
- */
- wakeup(get_mntfs_wchan(mf));
- free_mntfs(mf);
- /* continue */
- }
-
- /*
- * If we get here, then either the mount succeeded or
- * there is no more mount information available.
- */
- if (this_error) {
- mp->am_mnt = mf = new_mntfs();
-
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_flags & AMF_AUTOFS)
- autofs_mount_failed(mp);
- else
-#endif /* HAVE_FS_AUTOFS */
- nfs_quick_reply(mp, this_error);
-
- if (hard_error <= 0)
- hard_error = this_error;
- if (hard_error < 0)
- hard_error = ETIMEDOUT;
-
- /*
- * Set a small(ish) timeout on an error node if
- * the error was not a time out.
- */
- switch (hard_error) {
- case ETIMEDOUT:
- case EWOULDBLOCK:
- case EIO:
- mp->am_timeo = 17;
- break;
- default:
- mp->am_timeo = 5;
- break;
- }
- new_ttl(mp);
- } else {
- mf = mp->am_mnt;
- /*
- * Wakeup anything waiting for this mount
- */
- wakeup(get_mntfs_wchan(mf));
- hard_error = 0;
- }
-
- /*
- * Make sure that the error value in the mntfs has a
- * reasonable value.
- */
- if (mf->mf_error < 0) {
- mf->mf_error = hard_error;
- if (hard_error)
- mf->mf_flags |= MFF_ERROR;
- }
-
- /*
- * In any case we don't need the continuation any more
- */
- free_continuation(cp);
-
- return hard_error;
-}
-
-
-static char *
-amfs_parse_defaults(am_node *mp, mntfs *mf, char *def_opts)
-{
- char *dflts;
- char *dfl;
- char **rvec = NULL;
- struct mnt_map *mm = (mnt_map *) mf->mf_private;
-
- dlog("determining /defaults entry value");
-
- /*
- * Find out if amd.conf overrode any map-specific /defaults.
- *
- * HACK ALERT: there's no easy way to find out what the map mount point is
- * at this point, so I am forced to initialize the mnt_map->cfm field here
- * for the first time, upon the very first search for a /defaults entry in
- * this map. This initialization is much better done in mapc_create(),
- * but it's impossible to do that there with the current code structure.
- */
- if (mm->cfm == NULL) { /* then initialize it for first time */
- mm->cfm = find_cf_map(mf->mf_mount);
- }
- if (mm->cfm && mm->cfm->cfm_defaults) {
- dlog("map %s map_defaults override: %s", mf->mf_mount, mm->cfm->cfm_defaults);
- dflts = strdup(mm->cfm->cfm_defaults);
- } else if (mapc_search(mm, "/defaults", &dflts) == 0) {
- dlog("/defaults gave %s", dflts);
- } else {
- return def_opts; /* if nothing found */
- }
-
- /* trim leading '-' in case thee's one */
- if (*dflts == '-')
- dfl = dflts + 1;
- else
- dfl = dflts;
-
- /*
- * Chop the defaults up
- */
- rvec = strsplit(dfl, ' ', '\"');
-
- if (gopt.flags & CFM_SELECTORS_IN_DEFAULTS) {
- /*
- * Pick whichever first entry matched the list of selectors.
- * Strip the selectors from the string, and assign to dfl the
- * rest of the string.
- */
- if (rvec) {
- am_opts ap;
- am_ops *pt;
- char **sp = rvec;
- while (*sp) { /* loop until you find something, if any */
- memset((char *) &ap, 0, sizeof(am_opts));
- /*
- * This next routine cause many spurious "expansion of ... is"
- * messages, which are ignored, b/c all we need out of this
- * routine is to match selectors. These spurious messages may
- * be wrong, esp. if they try to expand ${key} b/c it will
- * get expanded to "/defaults"
- */
- pt = ops_match(&ap, *sp, "", mp->am_path, "/defaults",
- mp->am_parent->am_mnt->mf_info);
- free_opts(&ap); /* don't leak */
- if (pt == &amfs_error_ops) {
- plog(XLOG_MAP, "did not match defaults for \"%s\"", *sp);
- } else {
- dfl = strip_selectors(*sp, "/defaults");
- plog(XLOG_MAP, "matched default selectors \"%s\"", dfl);
- break;
- }
- ++sp;
- }
- }
- } else { /* not selectors_in_defaults */
- /*
- * Extract first value
- */
- dfl = rvec[0];
- }
-
- /*
- * If there were any values at all...
- */
- if (dfl) {
- /*
- * Log error if there were other values
- */
- if (!(gopt.flags & CFM_SELECTORS_IN_DEFAULTS) && rvec[1]) {
- dlog("/defaults chopped into %s", dfl);
- plog(XLOG_USER, "More than a single value for /defaults in %s", mf->mf_info);
- }
-
- /*
- * Prepend to existing defaults if they exist,
- * otherwise just use these defaults.
- */
- if (*def_opts && *dfl) {
- size_t l = strlen(def_opts) + strlen(dfl) + 2;
- char *nopts = (char *) xmalloc(l);
- xsnprintf(nopts, l, "%s;%s", dfl, def_opts);
- XFREE(def_opts);
- def_opts = nopts;
- } else if (*dfl) {
- def_opts = strealloc(def_opts, dfl);
- }
- }
-
- XFREE(dflts);
-
- /* don't need info vector any more */
- if (rvec)
- XFREE(rvec);
-
- return def_opts;
-}
-
-
-am_node *
-amfs_generic_mount_child(am_node *new_mp, int *error_return)
-{
- int error;
- struct continuation *cp; /* Continuation structure if need to mount */
-
- dlog("in amfs_generic_mount_child");
-
- *error_return = error = 0; /* Error so far */
-
- /* we have an errorfs attached to the am_node, free it */
- free_mntfs(new_mp->am_mnt);
- new_mp->am_mnt = 0;
-
- /*
- * Construct a continuation
- */
- cp = ALLOC(struct continuation);
- cp->callout = 0;
- cp->mp = new_mp;
- cp->retry = TRUE;
- cp->start = clocktime(NULL);
- cp->mf = new_mp->am_mfarray;
-
- /*
- * Try and mount the file system. If this succeeds immediately (possible
- * for a ufs file system) then return the attributes, otherwise just
- * return an error.
- */
- error = amfs_bgmount(cp);
- reschedule_timeout_mp();
- if (!error)
- return new_mp;
-
- /*
- * Code for quick reply. If current_transp is set, then it's the
- * transp that's been passed down from nfs_program_2() or from
- * autofs_program_[123]().
- * If new_mp->am_transp is not already set, set it by copying in
- * current_transp. Once am_transp is set, nfs_quick_reply() and
- * autofs_mount_succeeded() can use it to send a reply to the
- * client that requested this mount.
- */
- if (current_transp && !new_mp->am_transp) {
- dlog("Saving RPC transport for %s", new_mp->am_path);
- new_mp->am_transp = (SVCXPRT *) xmalloc(sizeof(SVCXPRT));
- *(new_mp->am_transp) = *current_transp;
- }
- if (error && (new_mp->am_mnt->mf_ops == &amfs_error_ops))
- new_mp->am_error = error;
-
- if (new_mp->am_error > 0)
- assign_error_mntfs(new_mp);
-
- ereturn(error);
-}
-
-
-/*
- * Automount interface to RPC lookup routine
- * Find the corresponding entry and return
- * the file handle for it.
- */
-am_node *
-amfs_generic_lookup_child(am_node *mp, char *fname, int *error_return, int op)
-{
- am_node *new_mp;
- mntfs **mf_array;
- int mp_error;
-
- dlog("in amfs_generic_lookup_child");
-
- *error_return = 0;
- new_mp = amfs_lookup_node(mp, fname, error_return);
-
- /* return if we got an error */
- if (!new_mp || *error_return > 0)
- return new_mp;
-
- /* also return if it's already mounted and known to be up */
- if (*error_return == 0 && FSRV_ISUP(new_mp->am_mnt->mf_server))
- return new_mp;
-
- switch (op) {
- case VLOOK_DELETE:
- /*
- * If doing a delete then don't create again!
- */
- ereturn(ENOENT);
- case VLOOK_LOOKUP:
- return new_mp;
- }
-
- /* save error_return */
- mp_error = *error_return;
-
- mf_array = amfs_lookup_mntfs(new_mp, error_return);
- if (!mf_array) {
- new_mp->am_error = new_mp->am_mnt->mf_error = *error_return;
- free_map(new_mp);
- return NULL;
- }
-
- /*
- * Already mounted but known to be down:
- * check if we have any alternatives to mount
- */
- if (mp_error == 0) {
- mntfs **mfp;
- for (mfp = mf_array; *mfp; mfp++)
- if (*mfp != new_mp->am_mnt)
- break;
- if (*mfp != NULL) {
- /*
- * we found an alternative, so try mounting again.
- */
- *error_return = -1;
- } else {
- for (mfp = mf_array; *mfp; mfp++)
- free_mntfs(*mfp);
- XFREE(mf_array);
- if (new_mp->am_flags & AMF_SOFTLOOKUP) {
- ereturn(EIO);
- } else {
- *error_return = 0;
- return new_mp;
- }
- }
- }
-
- /* store the array inside the am_node */
- new_mp->am_mfarray = mf_array;
-
- /*
- * Note: while it might seem like a good idea to prioritize
- * the list of mntfs's we got here, it probably isn't.
- * It would ignore the ordering of entries specified by the user,
- * which is counterintuitive and confusing.
- */
- return new_mp;
-}
-
-
-void
-amfs_generic_mounted(mntfs *mf)
-{
- amfs_mkcacheref(mf);
-}
-
-
-/*
- * Unmount an automount sub-node
- */
-int
-amfs_generic_umount(am_node *mp, mntfs *mf)
-{
- int error = 0;
-
-#ifdef HAVE_FS_AUTOFS
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
- if (mf->mf_flags & MFF_IS_AUTOFS)
- error = UMOUNT_FS(mp->am_path, mnttab_file_name, unmount_flags);
-#endif /* HAVE_FS_AUTOFS */
-
- return error;
-}
-
-
-char *
-amfs_generic_match(am_opts *fo)
-{
- char *p;
-
- if (!fo->opt_rfs) {
- plog(XLOG_USER, "amfs_generic_match: no mount point named (rfs:=)");
- return 0;
- }
- if (!fo->opt_fs) {
- plog(XLOG_USER, "amfs_generic_match: no map named (fs:=)");
- return 0;
- }
-
- /*
- * Swap round fs:= and rfs:= options
- * ... historical (jsp)
- */
- p = fo->opt_rfs;
- fo->opt_rfs = fo->opt_fs;
- fo->opt_fs = p;
-
- /*
- * mtab entry turns out to be the name of the mount map
- */
- return strdup(fo->opt_rfs ? fo->opt_rfs : ".");
-}
diff --git a/contrib/amd/amd/amfs_host.c b/contrib/amd/amd/amfs_host.c
deleted file mode 100644
index 55423c46ea33..000000000000
--- a/contrib/amd/amd/amfs_host.c
+++ /dev/null
@@ -1,709 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_host.c
- *
- */
-
-/*
- * NFS host file system.
- * Mounts all exported filesystems from a given host.
- * This has now degenerated into a mess but will not
- * be rewritten. Amd 6 will support the abstractions
- * needed to make this work correctly.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-static char *amfs_host_match(am_opts *fo);
-static int amfs_host_init(mntfs *mf);
-static int amfs_host_mount(am_node *am, mntfs *mf);
-static int amfs_host_umount(am_node *am, mntfs *mf);
-static void amfs_host_umounted(mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops amfs_host_ops =
-{
- "host",
- amfs_host_match,
- amfs_host_init,
- amfs_host_mount,
- amfs_host_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_host_readlink */
- 0, /* amfs_host_mounted */
- amfs_host_umounted,
- find_nfs_srvr,
- 0, /* amfs_host_get_wchan */
- FS_MKMNT | FS_BACKGROUND | FS_AMQINFO,
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_HOST_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * Determine the mount point:
- *
- * The next change we put in to better handle PCs. This is a bit
- * disgusting, so you'd better sit down. We change the make_mntpt function
- * to look for exported file systems without a leading '/'. If they don't
- * have a leading '/', we add one. If the export is 'a:' through 'z:'
- * (without a leading slash), we change it to 'a%' (or b% or z%). This
- * allows the entire PC disk to be mounted.
- */
-static void
-make_mntpt(char *mntpt, size_t l, const exports ex, const char *mf_mount)
-{
- if (ex->ex_dir[0] == '/') {
- if (ex->ex_dir[1] == 0)
- xstrlcpy(mntpt, mf_mount, l);
- else
- xsnprintf(mntpt, l, "%s%s", mf_mount, ex->ex_dir);
- } else if (ex->ex_dir[0] >= 'a' &&
- ex->ex_dir[0] <= 'z' &&
- ex->ex_dir[1] == ':' &&
- ex->ex_dir[2] == '/' &&
- ex->ex_dir[3] == 0)
- xsnprintf(mntpt, l, "%s/%c%%", mf_mount, ex->ex_dir[0]);
- else
- xsnprintf(mntpt, l, "%s/%s", mf_mount, ex->ex_dir);
-}
-
-
-/*
- * Execute needs the same as NFS plus a helper command
- */
-static char *
-amfs_host_match(am_opts *fo)
-{
- extern am_ops nfs_ops;
-
- /*
- * Make sure rfs is specified to keep nfs_match happy...
- */
- if (!fo->opt_rfs)
- fo->opt_rfs = "/";
-
- return (*nfs_ops.fs_match) (fo);
-}
-
-
-static int
-amfs_host_init(mntfs *mf)
-{
- u_short mountd_port;
-
- if (strchr(mf->mf_info, ':') == 0)
- return ENOENT;
-
- /*
- * This is primarily to schedule a wakeup so that as soon
- * as our fileserver is ready, we can continue setting up
- * the host filesystem. If we don't do this, the standard
- * amfs_auto code will set up a fileserver structure, but it will
- * have to wait for another nfs request from the client to come
- * in before finishing. Our way is faster since we don't have
- * to wait for the client to resend its request (which could
- * take a second or two).
- */
- /*
- * First, we find the fileserver for this mntfs and then call
- * get_mountd_port with our mntfs passed as the wait channel.
- * get_mountd_port will check some things and then schedule
- * it so that when the fileserver is ready, a wakeup is done
- * on this mntfs. amfs_cont() is already sleeping on this mntfs
- * so as soon as that wakeup happens amfs_cont() is called and
- * this mount is retried.
- */
- if (mf->mf_server)
- /*
- * We don't really care if there's an error returned.
- * Since this is just to help speed things along, the
- * error will get handled properly elsewhere.
- */
- get_mountd_port(mf->mf_server, &mountd_port, get_mntfs_wchan(mf));
-
- return 0;
-}
-
-
-static int
-do_mount(am_nfs_handle_t *fhp, char *mntdir, char *fs_name, mntfs *mf)
-{
- struct stat stb;
-
- dlog("amfs_host: mounting fs %s on %s\n", fs_name, mntdir);
-
- (void) mkdirs(mntdir, 0555);
- if (stat(mntdir, &stb) < 0 || (stb.st_mode & S_IFMT) != S_IFDIR) {
- plog(XLOG_ERROR, "No mount point for %s - skipping", mntdir);
- return ENOENT;
- }
-
- return mount_nfs_fh(fhp, mntdir, fs_name, mf);
-}
-
-
-static int
-sortfun(const voidp x, const voidp y)
-{
- exports *a = (exports *) x;
- exports *b = (exports *) y;
-
- return strcmp((*a)->ex_dir, (*b)->ex_dir);
-}
-
-
-/*
- * Get filehandle
- */
-static int
-fetch_fhandle(CLIENT *client, char *dir, am_nfs_handle_t *fhp, u_long nfs_version)
-{
- struct timeval tv;
- enum clnt_stat clnt_stat;
- struct fhstatus res;
-#ifdef HAVE_FS_NFS3
- struct am_mountres3 res3;
-#endif /* HAVE_FS_NFS3 */
-
- /*
- * Pick a number, any number...
- */
- tv.tv_sec = 20;
- tv.tv_usec = 0;
-
- dlog("Fetching fhandle for %s", dir);
-
- /*
- * Call the mount daemon on the remote host to
- * get the filehandle. Use NFS version specific call.
- */
-
- plog(XLOG_INFO, "fetch_fhandle: NFS version %d", (int) nfs_version);
-#ifdef HAVE_FS_NFS3
- if (nfs_version == NFS_VERSION3) {
- memset((char *) &res3, 0, sizeof(res3));
- clnt_stat = clnt_call(client,
- MOUNTPROC_MNT,
- (XDRPROC_T_TYPE) xdr_dirpath,
- (SVC_IN_ARG_TYPE) &dir,
- (XDRPROC_T_TYPE) xdr_am_mountres3,
- (SVC_IN_ARG_TYPE) &res3,
- tv);
- if (clnt_stat != RPC_SUCCESS) {
- plog(XLOG_ERROR, "mountd rpc failed: %s", clnt_sperrno(clnt_stat));
- return EIO;
- }
- /* Check the status of the filehandle */
- if ((errno = res3.fhs_status)) {
- dlog("fhandle fetch for mount version 3 failed: %m");
- return errno;
- }
- memset((voidp) &fhp->v3, 0, sizeof(am_nfs_fh3));
- fhp->v3.am_fh3_length = res3.mountres3_u.mountinfo.fhandle.fhandle3_len;
- memmove(fhp->v3.am_fh3_data,
- res3.mountres3_u.mountinfo.fhandle.fhandle3_val,
- fhp->v3.am_fh3_length);
- } else { /* not NFS_VERSION3 mount */
-#endif /* HAVE_FS_NFS3 */
- clnt_stat = clnt_call(client,
- MOUNTPROC_MNT,
- (XDRPROC_T_TYPE) xdr_dirpath,
- (SVC_IN_ARG_TYPE) &dir,
- (XDRPROC_T_TYPE) xdr_fhstatus,
- (SVC_IN_ARG_TYPE) &res,
- tv);
- if (clnt_stat != RPC_SUCCESS) {
- plog(XLOG_ERROR, "mountd rpc failed: %s", clnt_sperrno(clnt_stat));
- return EIO;
- }
- /* Check status of filehandle */
- if (res.fhs_status) {
- errno = res.fhs_status;
- dlog("fhandle fetch for mount version 1 failed: %m");
- return errno;
- }
- memmove(&fhp->v2, &res.fhs_fh, NFS_FHSIZE);
-#ifdef HAVE_FS_NFS3
- } /* end of "if (nfs_version == NFS_VERSION3)" statement */
-#endif /* HAVE_FS_NFS3 */
-
- /* all is well */
- return 0;
-}
-
-
-/*
- * Scan mount table to see if something already mounted
- */
-static int
-already_mounted(mntlist *mlist, char *dir)
-{
- mntlist *ml;
-
- for (ml = mlist; ml; ml = ml->mnext)
- if (STREQ(ml->mnt->mnt_dir, dir))
- return 1;
- return 0;
-}
-
-
-static int
-amfs_host_mount(am_node *am, mntfs *mf)
-{
- struct timeval tv2;
- CLIENT *client;
- enum clnt_stat clnt_stat;
- int n_export;
- int j, k;
- exports exlist = 0, ex;
- exports *ep = 0;
- am_nfs_handle_t *fp = 0;
- char *host;
- int error = 0;
- struct sockaddr_in sin;
- int sock = RPC_ANYSOCK;
- int ok = FALSE;
- mntlist *mlist;
- char fs_name[MAXPATHLEN], *rfs_dir;
- char mntpt[MAXPATHLEN];
- struct timeval tv;
- u_long mnt_version;
-
- /*
- * WebNFS servers don't necessarily run mountd.
- */
- if (mf->mf_flags & MFF_WEBNFS) {
- plog(XLOG_ERROR, "amfs_host_mount: cannot support WebNFS");
- return EIO;
- }
-
- /*
- * Read the mount list
- */
- mlist = read_mtab(mf->mf_mount, mnttab_file_name);
-
-#ifdef MOUNT_TABLE_ON_FILE
- /*
- * Unlock the mount list
- */
- unlock_mntlist();
-#endif /* MOUNT_TABLE_ON_FILE */
-
- /*
- * Take a copy of the server hostname, address, and nfs version
- * to mount version conversion.
- */
- host = mf->mf_server->fs_host;
- sin = *mf->mf_server->fs_ip;
- plog(XLOG_INFO, "amfs_host_mount: NFS version %d", (int) mf->mf_server->fs_version);
-#ifdef HAVE_FS_NFS3
- if (mf->mf_server->fs_version == NFS_VERSION3)
- mnt_version = AM_MOUNTVERS3;
- else
-#endif /* HAVE_FS_NFS3 */
- mnt_version = MOUNTVERS;
-
- /*
- * The original 10 second per try timeout is WAY too large, especially
- * if we're only waiting 10 or 20 seconds max for the response.
- * That would mean we'd try only once in 10 seconds, and we could
- * lose the transmit or receive packet, and never try again.
- * A 2-second per try timeout here is much more reasonable.
- * 09/28/92 Mike Mitchell, mcm@unx.sas.com
- */
- tv.tv_sec = 2;
- tv.tv_usec = 0;
-
- /*
- * Create a client attached to mountd
- */
- client = get_mount_client(host, &sin, &tv, &sock, mnt_version);
- if (client == NULL) {
-#ifdef HAVE_CLNT_SPCREATEERROR
- plog(XLOG_ERROR, "get_mount_client failed for %s: %s",
- host, clnt_spcreateerror(""));
-#else /* not HAVE_CLNT_SPCREATEERROR */
- plog(XLOG_ERROR, "get_mount_client failed for %s", host);
-#endif /* not HAVE_CLNT_SPCREATEERROR */
- error = EIO;
- goto out;
- }
- if (!nfs_auth) {
- error = make_nfs_auth();
- if (error)
- goto out;
- }
- client->cl_auth = nfs_auth;
-
- dlog("Fetching export list from %s", host);
-
- /*
- * Fetch the export list
- */
- tv2.tv_sec = 10;
- tv2.tv_usec = 0;
- clnt_stat = clnt_call(client,
- MOUNTPROC_EXPORT,
- (XDRPROC_T_TYPE) xdr_void,
- 0,
- (XDRPROC_T_TYPE) xdr_exports,
- (SVC_IN_ARG_TYPE) & exlist,
- tv2);
- if (clnt_stat != RPC_SUCCESS) {
- const char *msg = clnt_sperrno(clnt_stat);
- plog(XLOG_ERROR, "host_mount rpc failed: %s", msg);
- /* clnt_perror(client, "rpc"); */
- error = EIO;
- goto out;
- }
-
- /*
- * Figure out how many exports were returned
- */
- for (n_export = 0, ex = exlist; ex; ex = ex->ex_next) {
- n_export++;
- }
-
- /*
- * Allocate an array of pointers into the list
- * so that they can be sorted. If the filesystem
- * is already mounted then ignore it.
- */
- ep = (exports *) xmalloc(n_export * sizeof(exports));
- for (j = 0, ex = exlist; ex; ex = ex->ex_next) {
- make_mntpt(mntpt, sizeof(mntpt), ex, mf->mf_mount);
- if (already_mounted(mlist, mntpt))
- /* we have at least one mounted f/s, so don't fail the mount */
- ok = TRUE;
- else
- ep[j++] = ex;
- }
- n_export = j;
-
- /*
- * Sort into order.
- * This way the mounts are done in order down the tree,
- * instead of any random order returned by the mount
- * daemon (the protocol doesn't specify...).
- */
- qsort(ep, n_export, sizeof(exports), sortfun);
-
- /*
- * Allocate an array of filehandles
- */
- fp = (am_nfs_handle_t *) xmalloc(n_export * sizeof(am_nfs_handle_t));
-
- /*
- * Try to obtain filehandles for each directory.
- * If a fetch fails then just zero out the array
- * reference but discard the error.
- */
- for (j = k = 0; j < n_export; j++) {
- /* Check and avoid a duplicated export entry */
- if (j > k && ep[k] && STREQ(ep[j]->ex_dir, ep[k]->ex_dir)) {
- dlog("avoiding dup fhandle requested for %s", ep[j]->ex_dir);
- ep[j] = 0;
- } else {
- k = j;
- error = fetch_fhandle(client, ep[j]->ex_dir, &fp[j],
- mf->mf_server->fs_version);
- if (error)
- ep[j] = 0;
- }
- }
-
- /*
- * Mount each filesystem for which we have a filehandle.
- * If any of the mounts succeed then mark "ok" and return
- * error code 0 at the end. If they all fail then return
- * the last error code.
- */
- xstrlcpy(fs_name, mf->mf_info, MAXPATHLEN);
- if ((rfs_dir = strchr(fs_name, ':')) == (char *) 0) {
- plog(XLOG_FATAL, "amfs_host_mount: mf_info has no colon");
- error = EINVAL;
- goto out;
- }
- ++rfs_dir;
- for (j = 0; j < n_export; j++) {
- ex = ep[j];
- if (ex) {
- /*
- * Note: the sizeof space left in rfs_dir is what's left in fs_name
- * after strchr() above returned a pointer _inside_ fs_name. The
- * calculation below also takes into account that rfs_dir was
- * incremented by the ++ above.
- */
- xstrlcpy(rfs_dir, ex->ex_dir, sizeof(fs_name) - (rfs_dir - fs_name));
- make_mntpt(mntpt, sizeof(mntpt), ex, mf->mf_mount);
- if (do_mount(&fp[j], mntpt, fs_name, mf) == 0)
- ok = TRUE;
- }
- }
-
- /*
- * Clean up and exit
- */
-out:
- discard_mntlist(mlist);
- if (ep)
- XFREE(ep);
- if (fp)
- XFREE(fp);
- if (sock != RPC_ANYSOCK)
- (void) amu_close(sock);
- if (client)
- clnt_destroy(client);
- if (exlist)
- xdr_pri_free((XDRPROC_T_TYPE) xdr_exports, (caddr_t) &exlist);
- if (ok)
- return 0;
- return error;
-}
-
-
-/*
- * Return true if pref is a directory prefix of dir.
- *
- * XXX TODO:
- * Does not work if pref is "/".
- */
-static int
-directory_prefix(char *pref, char *dir)
-{
- int len = strlen(pref);
-
- if (!NSTREQ(pref, dir, len))
- return FALSE;
- if (dir[len] == '/' || dir[len] == '\0')
- return TRUE;
- return FALSE;
-}
-
-
-/*
- * Unmount a mount tree
- */
-static int
-amfs_host_umount(am_node *am, mntfs *mf)
-{
- mntlist *ml, *mprev;
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
- int xerror = 0;
-
- /*
- * Read the mount list
- */
- mntlist *mlist = read_mtab(mf->mf_mount, mnttab_file_name);
-
-#ifdef MOUNT_TABLE_ON_FILE
- /*
- * Unlock the mount list
- */
- unlock_mntlist();
-#endif /* MOUNT_TABLE_ON_FILE */
-
- /*
- * Reverse list...
- */
- ml = mlist;
- mprev = 0;
- while (ml) {
- mntlist *ml2 = ml->mnext;
- ml->mnext = mprev;
- mprev = ml;
- ml = ml2;
- }
- mlist = mprev;
-
- /*
- * Unmount all filesystems...
- */
- for (ml = mlist; ml && !xerror; ml = ml->mnext) {
- char *dir = ml->mnt->mnt_dir;
- if (directory_prefix(mf->mf_mount, dir)) {
- int error;
- dlog("amfs_host: unmounts %s", dir);
- /*
- * Unmount "dir"
- */
- error = UMOUNT_FS(dir, mnttab_file_name, unmount_flags);
- /*
- * Keep track of errors
- */
- if (error) {
- /*
- * If we have not already set xerror and error is not ENOENT,
- * then set xerror equal to error and log it.
- * 'xerror' is the return value for this function.
- *
- * We do not want to pass ENOENT as an error because if the
- * directory does not exists our work is done anyway.
- */
- if (!xerror && error != ENOENT)
- xerror = error;
- if (error != EBUSY) {
- errno = error;
- plog(XLOG_ERROR, "Tree unmount of %s failed: %m", ml->mnt->mnt_dir);
- }
- } else {
- (void) rmdirs(dir);
- }
- }
- }
-
- /*
- * Throw away mount list
- */
- discard_mntlist(mlist);
-
- /*
- * Try to remount, except when we are shutting down.
- */
- if (xerror && amd_state != Finishing) {
- xerror = amfs_host_mount(am, mf);
- if (!xerror) {
- /*
- * Don't log this - it's usually too verbose
- plog(XLOG_INFO, "Remounted host %s", mf->mf_info);
- */
- xerror = EBUSY;
- }
- }
- return xerror;
-}
-
-
-/*
- * Tell mountd we're done.
- * This is not quite right, because we may still
- * have other filesystems mounted, but the existing
- * mountd protocol is badly broken anyway.
- */
-static void
-amfs_host_umounted(mntfs *mf)
-{
- char *host;
- CLIENT *client;
- enum clnt_stat clnt_stat;
- struct sockaddr_in sin;
- int sock = RPC_ANYSOCK;
- struct timeval tv;
- u_long mnt_version;
-
- if (mf->mf_error || mf->mf_refc > 1 || !mf->mf_server)
- return;
-
- /*
- * WebNFS servers shouldn't ever get here.
- */
- if (mf->mf_flags & MFF_WEBNFS) {
- plog(XLOG_ERROR, "amfs_host_umounted: cannot support WebNFS");
- return;
- }
-
- /*
- * Take a copy of the server hostname, address, and NFS version
- * to mount version conversion.
- */
- host = mf->mf_server->fs_host;
- sin = *mf->mf_server->fs_ip;
- plog(XLOG_INFO, "amfs_host_umounted: NFS version %d", (int) mf->mf_server->fs_version);
-#ifdef HAVE_FS_NFS3
- if (mf->mf_server->fs_version == NFS_VERSION3)
- mnt_version = AM_MOUNTVERS3;
- else
-#endif /* HAVE_FS_NFS3 */
- mnt_version = MOUNTVERS;
-
- /*
- * Create a client attached to mountd
- */
- tv.tv_sec = 10;
- tv.tv_usec = 0;
- client = get_mount_client(host, &sin, &tv, &sock, mnt_version);
- if (client == NULL) {
-#ifdef HAVE_CLNT_SPCREATEERROR
- plog(XLOG_ERROR, "get_mount_client failed for %s: %s",
- host, clnt_spcreateerror(""));
-#else /* not HAVE_CLNT_SPCREATEERROR */
- plog(XLOG_ERROR, "get_mount_client failed for %s", host);
-#endif /* not HAVE_CLNT_SPCREATEERROR */
- goto out;
- }
-
- if (!nfs_auth) {
- if (make_nfs_auth())
- goto out;
- }
- client->cl_auth = nfs_auth;
-
- dlog("Unmounting all from %s", host);
-
- clnt_stat = clnt_call(client,
- MOUNTPROC_UMNTALL,
- (XDRPROC_T_TYPE) xdr_void,
- 0,
- (XDRPROC_T_TYPE) xdr_void,
- 0,
- tv);
- if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_SYSTEMERROR) {
- /* RPC_SYSTEMERROR seems to be returned for no good reason ... */
- const char *msg = clnt_sperrno(clnt_stat);
- plog(XLOG_ERROR, "unmount all from %s rpc failed: %s", host, msg);
- goto out;
- }
-
-out:
- if (sock != RPC_ANYSOCK)
- (void) amu_close(sock);
- if (client)
- clnt_destroy(client);
-}
diff --git a/contrib/amd/amd/amfs_link.c b/contrib/amd/amd/amfs_link.c
deleted file mode 100644
index e75ab862f8bc..000000000000
--- a/contrib/amd/amd/amfs_link.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_link.c
- *
- */
-
-/*
- * Symbol-link file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static int amfs_link_mount(am_node *mp, mntfs *mf);
-static int amfs_link_umount(am_node *mp, mntfs *mf);
-
-/*
- * Ops structures
- */
-am_ops amfs_link_ops =
-{
- "link",
- amfs_link_match,
- 0, /* amfs_link_init */
- amfs_link_mount,
- amfs_link_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_link_readlink */
- 0, /* amfs_link_mounted */
- 0, /* amfs_link_umounted */
- amfs_generic_find_srvr,
- 0, /* nfs_fs_flags */
- 0, /* amfs_link_get_wchan */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_LINK_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * SFS needs a link.
- */
-char *
-amfs_link_match(am_opts *fo)
-{
-
- if (!fo->opt_fs) {
- plog(XLOG_USER, "link: no fs specified");
- return 0;
- }
-
- /*
- * If the link target points to another mount point, then we could
- * end up with an unpleasant situation, where the link f/s simply
- * "assumes" the mntfs of that mount point.
- *
- * For example, if the link points to /usr, and /usr is a real ufs
- * filesystem, then the link f/s will use the inherited ufs mntfs,
- * and the end result will be that it will become unmountable.
- *
- * To prevent this, we use a hack: we prepend a dot ('.') to opt_fs if
- * its original value was an absolute path, so that it will never match
- * any other mntfs.
- *
- * XXX: a less hacky solution should be used...
- */
- if (fo->opt_fs[0] == '/') {
- char *link_hack = str3cat(NULL, ".", fo->opt_fs, "");
- if (!fo->opt_sublink)
- fo->opt_sublink = strdup(fo->opt_fs);
- XFREE(fo->opt_fs);
- fo->opt_fs = link_hack;
- }
-
- return strdup(fo->opt_fs);
-}
-
-
-static int
-amfs_link_mount(am_node *mp, mntfs *mf)
-{
- return 0;
-}
-
-
-static int
-amfs_link_umount(am_node *mp, mntfs *mf)
-{
- return 0;
-}
diff --git a/contrib/amd/amd/amfs_linkx.c b/contrib/amd/amd/amfs_linkx.c
deleted file mode 100644
index e306eda91d3b..000000000000
--- a/contrib/amd/amd/amfs_linkx.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_linkx.c
- *
- */
-
-/*
- * Symbol-link file system, with test that the target of the link exists.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static int amfs_linkx_mount(am_node *mp, mntfs *mf);
-static int amfs_linkx_umount(am_node *mp, mntfs *mf);
-
-/*
- * linkx operations
- */
-struct am_ops amfs_linkx_ops =
-{
- "linkx",
- amfs_link_match,
- 0, /* amfs_linkx_init */
- amfs_linkx_mount,
- amfs_linkx_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_linkx_readlink */
- 0, /* amfs_linkx_mounted */
- 0, /* amfs_linkx_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_linkx_get_wchan */
- FS_MBACKGROUND,
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_LINKX_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-static int
-amfs_linkx_mount(am_node *mp, mntfs *mf)
-{
- /*
- * Check for existence of target.
- */
- struct stat stb;
- char *ln;
-
- if (mp->am_link)
- ln = mp->am_link;
- else /* should never occur */
- ln = mf->mf_mount;
-
- /*
- * Use lstat, not stat, since we don't
- * want to know if the ultimate target of
- * a symlink chain exists, just the first.
- */
- if (lstat(ln, &stb) < 0)
- return errno;
-
- return 0;
-}
-
-
-static int
-amfs_linkx_umount(am_node *mp, mntfs *mf)
-{
- return 0;
-}
diff --git a/contrib/amd/amd/amfs_nfsl.c b/contrib/amd/amd/amfs_nfsl.c
deleted file mode 100644
index bb48f0efd255..000000000000
--- a/contrib/amd/amd/amfs_nfsl.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_nfsl.c
- *
- */
-
-/*
- * NFSL: Network file system with local existence check. If the local
- * path denoted by $rfs exists, it behaves as type:=link.
- *
- * Example:
- * pkg type:=nfsl;rhost:=jonny;rfs:=/n/johnny/src/pkg;fs:=${rfs}
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/* forward declarations */
-static char *amfs_nfsl_match(am_opts *fo);
-static int amfs_nfsl_init(mntfs *mf);
-static int amfs_nfsl_mount(am_node *mp, mntfs *mf);
-static int amfs_nfsl_umount(am_node *mp, mntfs *mf);
-static void amfs_nfsl_umounted(mntfs *mf);
-static fserver *amfs_nfsl_ffserver(mntfs *mf);
-
-/*
- * NFS-Link operations
- */
-am_ops amfs_nfsl_ops =
-{
- "nfsl",
- amfs_nfsl_match,
- amfs_nfsl_init,
- amfs_nfsl_mount,
- amfs_nfsl_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_nfsl_readlink */
- 0, /* amfs_nfsl_mounted */
- amfs_nfsl_umounted,
- amfs_nfsl_ffserver,
- 0, /* amfs_nfsl_get_wchan */
- FS_MKMNT | FS_BACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_NFSL_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * Check that f/s has all needed fields.
- * Returns: matched string if found, NULL otherwise.
- */
-static char *
-amfs_nfsl_match(am_opts *fo)
-{
- char *cp;
- char *ho = fo->opt_rhost;
- char *retval;
- struct stat stb;
-
- if (fo->opt_sublink)
- cp = fo->opt_sublink;
- else
- cp = fo->opt_fs;
-
- if (!cp || !ho) {
- plog(XLOG_USER, "amfs_nfsl: host $fs and $rhost must be specified");
- return NULL;
- }
-
- /*
- * If this host is not the same as $rhost, or if link does not exist,
- * call nfs_ops.fs_match().
- * If link value exists (or same host), call amfs_link_ops.fs_match().
- */
- if (!STRCEQ(ho, am_get_hostname())) {
- plog(XLOG_INFO, "amfs_nfsl: \"%s\" is not local host, using type:=nfs", ho);
- retval = nfs_ops.fs_match(fo);
- } else if (lstat(cp, &stb) < 0) {
- plog(XLOG_INFO, "amfs_nfsl: \"%s\" does not exist, using type:=nfs", cp);
- retval = nfs_ops.fs_match(fo);
- } else {
- plog(XLOG_INFO, "amfs_nfsl: \"%s\" exists, using type:=link", cp);
- retval = amfs_link_ops.fs_match(fo);
- }
- return retval;
-}
-
-
-/*
- * Initialize.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-amfs_nfsl_init(mntfs *mf)
-{
- int ret = 0;
- if (mf->mf_flags & MFF_NFSLINK) {
- if (amfs_link_ops.fs_init)
- ret = amfs_link_ops.fs_init(mf);
- } else {
- if (nfs_ops.fs_init)
- ret = nfs_ops.fs_init(mf);
- }
- return ret;
-}
-
-
-/*
- * Mount vfs.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-amfs_nfsl_mount(am_node *mp, mntfs *mf)
-{
- int ret = 0;
- if (mf->mf_flags & MFF_NFSLINK) {
- if (amfs_link_ops.mount_fs)
- ret = amfs_link_ops.mount_fs(mp, mf);
- } else {
- if (nfs_ops.mount_fs)
- ret = nfs_ops.mount_fs(mp, mf);
- }
- return ret;
-}
-
-
-/*
- * Unmount VFS.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-amfs_nfsl_umount(am_node *mp, mntfs *mf)
-{
- int ret = 0;
- if (mf->mf_flags & MFF_NFSLINK) {
- if (amfs_link_ops.umount_fs)
- ret = amfs_link_ops.umount_fs(mp, mf);
- } else {
- if (nfs_ops.umount_fs)
- ret = nfs_ops.umount_fs(mp, mf);
- }
- return ret;
-}
-
-
-/*
- * Async unmount callback function.
- * After the base umount() succeeds, we may want to take extra actions,
- * such as informing remote mount daemons that we've unmounted them.
- * See amfs_auto_umounted(), host_umounted(), nfs_umounted().
- */
-static void
-amfs_nfsl_umounted(mntfs *mf)
-{
- if (mf->mf_flags & MFF_NFSLINK) {
- if (amfs_link_ops.umounted)
- amfs_link_ops.umounted(mf);
- } else {
- if (nfs_ops.umounted)
- nfs_ops.umounted(mf);
- }
-}
-
-
-/*
- * Find a file server.
- * Returns: fserver of found server, or NULL if not found.
- */
-static fserver *
-amfs_nfsl_ffserver(mntfs *mf)
-{
- char *cp;
- char *ho = mf->mf_fo->opt_rhost;
- struct stat stb;
-
- if (mf->mf_fo->opt_sublink)
- cp = mf->mf_fo->opt_sublink;
- else
- cp = mf->mf_fo->opt_fs;
-
- /*
- * If this host is not the same as $rhost, or if link does not exist,
- * call amfs_link_ops.ffserver().
- * If link value exists (or same host), then call ops_nfs.ffserver().
- */
- if (!STRCEQ(ho, am_get_hostname()) || lstat(cp, &stb) < 0) {
- return nfs_ops.ffserver(mf);
- } else {
- mf->mf_flags |= MFF_NFSLINK;
- /* remove the FS_MKMNT flag, we don't want amd touching the mountpoint */
- mf->mf_fsflags &= ~FS_MKMNT;
- return amfs_link_ops.ffserver(mf);
- }
-}
diff --git a/contrib/amd/amd/amfs_nfsx.c b/contrib/amd/amd/amfs_nfsx.c
deleted file mode 100644
index 91be8af47e11..000000000000
--- a/contrib/amd/amd/amfs_nfsx.c
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_nfsx.c
- *
- */
-
-/*
- * NFS hierarchical mounts
- *
- * TODO: Re-implement.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * The rfs field contains a list of mounts to be done from
- * the remote host.
- */
-typedef struct amfs_nfsx_mnt {
- mntfs *n_mnt;
- int n_error;
-} amfs_nfsx_mnt;
-
-struct amfs_nfsx {
- int nx_c; /* Number of elements in nx_v */
- amfs_nfsx_mnt *nx_v; /* Underlying mounts */
- amfs_nfsx_mnt *nx_try;
- am_node *nx_mp;
-};
-
-/* forward definitions */
-static char *amfs_nfsx_match(am_opts *fo);
-static int amfs_nfsx_mount(am_node *am, mntfs *mf);
-static int amfs_nfsx_umount(am_node *am, mntfs *mf);
-static int amfs_nfsx_init(mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops amfs_nfsx_ops =
-{
- "nfsx",
- amfs_nfsx_match,
- amfs_nfsx_init,
- amfs_nfsx_mount,
- amfs_nfsx_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_nfsx_readlink */
- 0, /* amfs_nfsx_mounted */
- 0, /* amfs_nfsx_umounted */
- find_nfs_srvr, /* XXX */
- 0, /* amfs_nfsx_get_wchan */
- /* FS_UBACKGROUND| */ FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_NFSX_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-static char *
-amfs_nfsx_match(am_opts *fo)
-{
- char *xmtab;
- char *ptr;
- int len;
-
- if (!fo->opt_rfs) {
- plog(XLOG_USER, "amfs_nfsx: no remote filesystem specified");
- return FALSE;
- }
-
- if (!fo->opt_rhost) {
- plog(XLOG_USER, "amfs_nfsx: no remote host specified");
- return FALSE;
- }
-
- /* set default sublink */
- if (fo->opt_sublink == 0) {
- ptr = strchr(fo->opt_rfs, ',');
- if (ptr && ptr > (fo->opt_rfs + 1))
- fo->opt_sublink = strnsave(fo->opt_rfs + 1, ptr - fo->opt_rfs - 1);
- }
-
- /*
- * Remove trailing ",..." from ${fs}
- * After deslashifying, overwrite the end of ${fs} with "/"
- * to make sure it is unique.
- */
- if ((ptr = strchr(fo->opt_fs, ',')))
- *ptr = '\0';
- deslashify(fo->opt_fs);
-
- /*
- * Bump string length to allow trailing /
- */
- len = strlen(fo->opt_fs);
- fo->opt_fs = xrealloc(fo->opt_fs, len + 1 + 1);
- ptr = fo->opt_fs + len;
-
- /*
- * Make unique...
- */
- *ptr++ = '/';
- *ptr = '\0';
-
- /*
- * Determine magic cookie to put in mtab
- */
- xmtab = str3cat((char *) 0, fo->opt_rhost, ":", fo->opt_rfs);
- dlog("NFSX: mounting remote server \"%s\", remote fs \"%s\" on \"%s\"",
- fo->opt_rhost, fo->opt_rfs, fo->opt_fs);
-
- return xmtab;
-}
-
-
-static void
-amfs_nfsx_prfree(opaque_t vp)
-{
- struct amfs_nfsx *nx = (struct amfs_nfsx *) vp;
- int i;
-
- for (i = 0; i < nx->nx_c; i++) {
- mntfs *m = nx->nx_v[i].n_mnt;
- if (m)
- free_mntfs(m);
- }
-
- XFREE(nx->nx_v);
- XFREE(nx);
-}
-
-
-static int
-amfs_nfsx_init(mntfs *mf)
-{
- /*
- * mf_info has the form:
- * host:/prefix/path,sub,sub,sub
- */
- int i;
- int glob_error;
- struct amfs_nfsx *nx;
- int asked_for_wakeup = 0;
-
- nx = (struct amfs_nfsx *) mf->mf_private;
-
- if (nx == 0) {
- char **ivec;
- char *info = 0;
- char *host;
- char *pref;
- int error = 0;
-
- info = strdup(mf->mf_info);
- host = strchr(info, ':');
- if (!host) {
- error = EINVAL;
- goto errexit;
- }
- pref = host + 1;
- host = info;
-
- /*
- * Split the prefix off from the suffices
- */
- ivec = strsplit(pref, ',', '\'');
-
- /*
- * Count array size
- */
- for (i = 0; ivec[i]; i++)
- /* nothing */;
-
- nx = ALLOC(struct amfs_nfsx);
- mf->mf_private = (opaque_t) nx;
- mf->mf_prfree = amfs_nfsx_prfree;
-
- nx->nx_c = i - 1; /* i-1 because we don't want the prefix */
- nx->nx_v = (amfs_nfsx_mnt *) xmalloc(nx->nx_c * sizeof(amfs_nfsx_mnt));
- nx->nx_mp = 0;
- {
- char *mp = 0;
- char *xinfo = 0;
- char *fs = mf->mf_fo->opt_fs;
- char *rfs = 0;
- for (i = 0; i < nx->nx_c; i++) {
- char *path = ivec[i + 1];
- rfs = str3cat(rfs, pref, "/", path);
- /*
- * Determine the mount point.
- * If this is the root, then don't remove
- * the trailing slash to avoid mntfs name clashes.
- */
- mp = str3cat(mp, fs, "/", rfs);
- normalize_slash(mp);
- deslashify(mp);
- /*
- * Determine the mount info
- */
- xinfo = str3cat(xinfo, host, *path == '/' ? "" : "/", path);
- normalize_slash(xinfo);
- if (pref[1] != '\0')
- deslashify(xinfo);
- dlog("amfs_nfsx: init mount for %s on %s", xinfo, mp);
- nx->nx_v[i].n_error = -1;
- nx->nx_v[i].n_mnt = find_mntfs(&nfs_ops, mf->mf_fo, mp, xinfo, "", mf->mf_mopts, mf->mf_remopts);
- /* propagate the on_autofs flag */
- nx->nx_v[i].n_mnt->mf_flags |= mf->mf_flags & MFF_ON_AUTOFS;
- }
- if (rfs)
- XFREE(rfs);
- if (mp)
- XFREE(mp);
- if (xinfo)
- XFREE(xinfo);
- }
-
- XFREE(ivec);
- errexit:
- if (info)
- XFREE(info);
- if (error)
- return error;
- }
-
- /*
- * Iterate through the mntfs's and call
- * the underlying init routine on each
- */
- glob_error = 0;
-
- for (i = 0; i < nx->nx_c; i++) {
- amfs_nfsx_mnt *n = &nx->nx_v[i];
- mntfs *m = n->n_mnt;
- int error = 0;
- if (m->mf_ops->fs_init && !(mf->mf_flags & MFF_RESTART))
- error = m->mf_ops->fs_init(m);
- /*
- * if you just "return error" here, you will have made a failure
- * in any submounts to fail the whole group. There was old unused code
- * here before.
- */
- if (error > 0)
- n->n_error = error;
-
- else if (error < 0) {
- glob_error = -1;
- if (!asked_for_wakeup) {
- asked_for_wakeup = 1;
- sched_task(wakeup_task, (opaque_t) mf, get_mntfs_wchan(m));
- }
- }
- }
-
- return glob_error;
-}
-
-
-static void
-amfs_nfsx_cont(int rc, int term, opaque_t arg)
-{
- mntfs *mf = (mntfs *) arg;
- struct amfs_nfsx *nx = (struct amfs_nfsx *) mf->mf_private;
- am_node *mp = nx->nx_mp;
- amfs_nfsx_mnt *n = nx->nx_try;
-
- n->n_mnt->mf_flags &= ~(MFF_ERROR | MFF_MOUNTING);
- mf->mf_flags &= ~MFF_ERROR;
-
- /*
- * Wakeup anything waiting for this mount
- */
- wakeup(get_mntfs_wchan(n->n_mnt));
-
- if (rc || term) {
- if (term) {
- /*
- * Not sure what to do for an error code.
- */
- plog(XLOG_ERROR, "mount for %s got signal %d", n->n_mnt->mf_mount, term);
- n->n_error = EIO;
- } else {
- /*
- * Check for exit status
- */
- errno = rc; /* XXX */
- plog(XLOG_ERROR, "%s: mount (amfs_nfsx_cont): %m", n->n_mnt->mf_mount);
- n->n_error = rc;
- }
- free_mntfs(n->n_mnt);
- n->n_mnt = new_mntfs();
- n->n_mnt->mf_error = n->n_error;
- n->n_mnt->mf_flags |= MFF_ERROR;
- } else {
- /*
- * The mount worked.
- */
- mf_mounted(n->n_mnt, FALSE); /* FALSE => don't free the n_mnt->am_opts */
- n->n_error = 0;
- }
-
- /*
- * Do the remaining bits
- */
- if (amfs_nfsx_mount(mp, mf) >= 0)
- wakeup(get_mntfs_wchan(mf));
-}
-
-
-static int
-try_amfs_nfsx_mount(opaque_t mv)
-{
- mntfs *mf = (mntfs *) mv;
- struct amfs_nfsx *nx = (struct amfs_nfsx *) mf->mf_private;
- am_node *mp = nx->nx_mp;
- int error;
-
- error = mf->mf_ops->mount_fs(mp, mf);
-
- return error;
-}
-
-
-static int
-amfs_nfsx_remount(am_node *am, mntfs *mf, int fg)
-{
- struct amfs_nfsx *nx = (struct amfs_nfsx *) mf->mf_private;
- amfs_nfsx_mnt *n;
- int glob_error = -1;
-
- /* Save the am_node pointer for later use */
- nx->nx_mp = am;
-
- /*
- * Iterate through the mntfs's and mount each filesystem
- * which is not yet mounted.
- */
- for (n = nx->nx_v; n < nx->nx_v + nx->nx_c; n++) {
- mntfs *m = n->n_mnt;
-
- if (m->mf_flags & MFF_MOUNTING)
- break;
-
- if (m->mf_flags & MFF_MOUNTED) {
- mf_mounted(m, FALSE); /* FALSE => don't free the m->am_opts */
- n->n_error = glob_error = 0;
- continue;
- }
-
- if (n->n_error < 0) {
- /* Create the mountpoint, if and as required */
- if (!(m->mf_flags & MFF_MKMNT) && m->mf_fsflags & FS_MKMNT) {
- if (!mkdirs(m->mf_mount, 0555))
- m->mf_flags |= MFF_MKMNT;
- }
-
- dlog("calling underlying mount on %s", m->mf_mount);
- if (!fg && foreground && (m->mf_fsflags & FS_MBACKGROUND)) {
- m->mf_flags |= MFF_MOUNTING;
- dlog("backgrounding mount of \"%s\"", m->mf_info);
- nx->nx_try = n;
- run_task(try_amfs_nfsx_mount, (opaque_t) m, amfs_nfsx_cont, (opaque_t) mf);
- n->n_error = -1;
- return -1;
- } else {
- dlog("foreground mount of \"%s\" ...", mf->mf_info);
- n->n_error = m->mf_ops->mount_fs(am, m);
- }
-
- if (n->n_error > 0)
- dlog("underlying fmount of %s failed: %s", m->mf_mount, strerror(n->n_error));
-
- if (n->n_error == 0) {
- glob_error = 0;
- } else if (glob_error < 0) {
- glob_error = n->n_error;
- }
- }
- }
-
- return glob_error < 0 ? 0 : glob_error;
-}
-
-
-static int
-amfs_nfsx_mount(am_node *am, mntfs *mf)
-{
- return amfs_nfsx_remount(am, mf, FALSE);
-}
-
-
-/*
- * Unmount an NFS hierarchy.
- * Note that this is called in the foreground
- * and so may hang under extremely rare conditions.
- */
-static int
-amfs_nfsx_umount(am_node *am, mntfs *mf)
-{
- struct amfs_nfsx *nx = (struct amfs_nfsx *) mf->mf_private;
- amfs_nfsx_mnt *n;
- int glob_error = 0;
-
- /*
- * Iterate in reverse through the mntfs's and unmount each filesystem
- * which is mounted.
- */
- for (n = nx->nx_v + nx->nx_c - 1; n >= nx->nx_v; --n) {
- mntfs *m = n->n_mnt;
- /*
- * If this node has not been messed with
- * and there has been no error so far
- * then try and unmount.
- * If an error had occurred then zero
- * the error code so that the remount
- * only tries to unmount those nodes
- * which had been successfully unmounted.
- */
- if (n->n_error == 0) {
- dlog("calling underlying fumount on %s", m->mf_mount);
- n->n_error = m->mf_ops->umount_fs(am, m);
- if (n->n_error) {
- glob_error = n->n_error;
- n->n_error = 0;
- } else {
- /*
- * Make sure remount gets this node
- */
- n->n_error = -1;
- }
- }
- }
-
- /*
- * If any unmounts failed then remount the
- * whole lot...
- */
- if (glob_error) {
- glob_error = amfs_nfsx_remount(am, mf, TRUE);
- if (glob_error) {
- errno = glob_error; /* XXX */
- plog(XLOG_USER, "amfs_nfsx: remount of %s failed: %m", mf->mf_mount);
- }
- glob_error = EBUSY;
- } else {
- /*
- * Remove all the mount points
- */
- for (n = nx->nx_v; n < nx->nx_v + nx->nx_c; n++) {
- mntfs *m = n->n_mnt;
- dlog("calling underlying umounted on %s", m->mf_mount);
- if (m->mf_ops->umounted)
- m->mf_ops->umounted(m);
-
- if (n->n_error < 0) {
- if (m->mf_fsflags & FS_MKMNT) {
- (void) rmdirs(m->mf_mount);
- m->mf_flags &= ~MFF_MKMNT;
- }
- }
- free_mntfs(m);
- n->n_mnt = 0;
- n->n_error = -1;
- }
- }
-
- return glob_error;
-}
diff --git a/contrib/amd/amd/amfs_program.c b/contrib/amd/amd/amfs_program.c
deleted file mode 100644
index 843e8050c11b..000000000000
--- a/contrib/amd/amd/amfs_program.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_program.c
- *
- */
-
-/*
- * Program file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward definitions */
-static char *amfs_program_match(am_opts *fo);
-static int amfs_program_mount(am_node *am, mntfs *mf);
-static int amfs_program_umount(am_node *am, mntfs *mf);
-static int amfs_program_init(mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops amfs_program_ops =
-{
- "program",
- amfs_program_match,
- amfs_program_init,
- amfs_program_mount,
- amfs_program_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* amfs_program_readlink */
- 0, /* amfs_program_mounted */
- 0, /* amfs_program_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_program_get_wchan */
- FS_MKMNT | FS_BACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_PROGRAM_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * Execute needs a mount and unmount command.
- */
-static char *
-amfs_program_match(am_opts *fo)
-{
- char *prog;
-
- if (fo->opt_unmount && fo->opt_umount) {
- plog(XLOG_ERROR, "program: cannot specify both unmount and umount options");
- return 0;
- }
- if (!fo->opt_mount) {
- plog(XLOG_ERROR, "program: must specify mount command");
- return 0;
- }
- if (!fo->opt_unmount && !fo->opt_umount) {
- fo->opt_unmount = str3cat(NULL, UNMOUNT_PROGRAM, " umount ", fo->opt_fs);
- plog(XLOG_INFO, "program: un/umount not specified; using default \"%s\"",
- fo->opt_unmount);
- }
- prog = strchr(fo->opt_mount, ' ');
-
- return strdup(prog ? prog + 1 : fo->opt_mount);
-}
-
-
-static int
-amfs_program_init(mntfs *mf)
-{
- /* check if already saved value */
- if (mf->mf_private != NULL)
- return 0;
-
- /* save unmount (or umount) command */
- if (mf->mf_fo->opt_unmount != NULL)
- mf->mf_private = (opaque_t) strdup(mf->mf_fo->opt_unmount);
- else
- mf->mf_private = (opaque_t) strdup(mf->mf_fo->opt_umount);
- mf->mf_prfree = (void (*)(opaque_t)) free;
-
- return 0;
-}
-
-
-static int
-amfs_program_exec(char *info)
-{
- char **xivec;
- int error;
-
- /*
- * Split copy of command info string
- */
- info = strdup(info);
- if (info == 0)
- return ENOBUFS;
- xivec = strsplit(info, ' ', '\'');
-
- /*
- * Put stdout to stderr
- */
- (void) fclose(stdout);
- if (!logfp)
- logfp = stderr; /* initialize before possible first use */
- (void) dup(fileno(logfp));
- if (fileno(logfp) != fileno(stderr)) {
- (void) fclose(stderr);
- (void) dup(fileno(logfp));
- }
-
- /*
- * Try the exec
- */
- if (amuDebug(D_FULL)) {
- char **cp = xivec;
- plog(XLOG_DEBUG, "executing (un)mount command...");
- while (*cp) {
- plog(XLOG_DEBUG, "arg[%ld] = '%s'", (long) (cp - xivec), *cp);
- cp++;
- }
- }
-
- if (xivec[0] == 0 || xivec[1] == 0) {
- errno = EINVAL;
- plog(XLOG_USER, "1st/2nd args missing to (un)mount program");
- } else {
- (void) execv(xivec[0], xivec + 1);
- }
-
- /*
- * Save error number
- */
- error = errno;
- plog(XLOG_ERROR, "exec failed: %m");
-
- /*
- * Free allocate memory
- */
- XFREE(info);
- XFREE(xivec);
-
- /*
- * Return error
- */
- return error;
-}
-
-
-static int
-amfs_program_mount(am_node *am, mntfs *mf)
-{
- return amfs_program_exec(mf->mf_fo->opt_mount);
-}
-
-
-static int
-amfs_program_umount(am_node *am, mntfs *mf)
-{
- return amfs_program_exec((char *) mf->mf_private);
-}
diff --git a/contrib/amd/amd/amfs_root.c b/contrib/amd/amd/amfs_root.c
deleted file mode 100644
index 243267e71e86..000000000000
--- a/contrib/amd/amd/amfs_root.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_root.c
- *
- */
-
-/*
- * Root file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static int amfs_root_mount(am_node *mp, mntfs *mf);
-
-/****************************************************************************
- *** OPS STRUCTURES ***
- ****************************************************************************/
-am_ops amfs_root_ops =
-{
- "root",
- 0, /* amfs_root_match */
- 0, /* amfs_root_init */
- amfs_root_mount,
- amfs_generic_umount,
- amfs_generic_lookup_child,
- amfs_generic_mount_child,
- amfs_generic_readdir,
- 0, /* amfs_root_readlink */
- 0, /* amfs_root_mounted */
- 0, /* amfs_root_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_root_get_wchan */
- FS_NOTIMEOUT | FS_AMQINFO | FS_DIRECTORY, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_ROOT_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-
-/*
- * Mount the root...
- */
-static int
-amfs_root_mount(am_node *mp, mntfs *mf)
-{
- mf->mf_mount = strealloc(mf->mf_mount, pid_fsname);
- mf->mf_private = (opaque_t) mapc_find(mf->mf_info, "", NULL);
- mf->mf_prfree = mapc_free;
-
- return 0;
-}
diff --git a/contrib/amd/amd/amfs_toplvl.c b/contrib/amd/amd/amfs_toplvl.c
deleted file mode 100644
index 1b968f197f55..000000000000
--- a/contrib/amd/amd/amfs_toplvl.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_toplvl.c
- *
- */
-
-/*
- * Top-level file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static int amfs_toplvl_init(mntfs *mf);
-
-/****************************************************************************
- *** OPS STRUCTURES ***
- ****************************************************************************/
-am_ops amfs_toplvl_ops =
-{
- "toplvl",
- amfs_generic_match,
- amfs_toplvl_init, /* amfs_toplvl_init */
- amfs_toplvl_mount,
- amfs_toplvl_umount,
- amfs_generic_lookup_child,
- amfs_generic_mount_child,
- amfs_generic_readdir,
- 0, /* amfs_toplvl_readlink */
- amfs_generic_mounted,
- 0, /* amfs_toplvl_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_toplvl_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_BACKGROUND |
- FS_AMQINFO | FS_DIRECTORY, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_TOPLVL_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-
-static void
-set_auto_attrcache_timeout(char *preopts, char *opts, size_t l)
-{
-
-#ifdef MNTTAB_OPT_NOAC
- /*
- * Don't cache attributes - they are changing under the kernel's feet.
- * For example, IRIX5.2 will dispense with nfs lookup calls and hand stale
- * filehandles to getattr unless we disable attribute caching on the
- * automount points.
- */
- if (gopt.auto_attrcache == 0) {
- xsnprintf(preopts, l, ",%s", MNTTAB_OPT_NOAC);
- xstrlcat(opts, preopts, l);
- }
-#endif /* MNTTAB_OPT_NOAC */
-
- /*
- * XXX: note that setting these to 0 in the past resulted in an error on
- * some systems, which is why it's better to use "noac" if possible. For
- * now, we're setting everything possible, but if this will cause trouble,
- * then we'll have to condition the remainder of this on OPT_NOAC.
- */
-#ifdef MNTTAB_OPT_ACTIMEO
- xsnprintf(preopts, l, ",%s=%d", MNTTAB_OPT_ACTIMEO, gopt.auto_attrcache);
- xstrlcat(opts, preopts, l);
-#else /* MNTTAB_OPT_ACTIMEO */
-# ifdef MNTTAB_OPT_ACDIRMIN
- xsnprintf(preopts, l, ",%s=%d", MNTTAB_OPT_ACTDIRMIN, gopt.auto_attrcache);
- xstrlcat(opts, preopts, l);
-# endif /* MNTTAB_OPT_ACDIRMIN */
-# ifdef MNTTAB_OPT_ACDIRMAX
- xsnprintf(preopts, l, ",%s=%d", MNTTAB_OPT_ACTDIRMAX, gopt.auto_attrcache);
- xstrlcat(opts, preopts, l);
-# endif /* MNTTAB_OPT_ACDIRMAX */
-# ifdef MNTTAB_OPT_ACREGMIN
- xsnprintf(preopts, l, ",%s=%d", MNTTAB_OPT_ACTREGMIN, gopt.auto_attrcache);
- xstrlcat(opts, preopts, l);
-# endif /* MNTTAB_OPT_ACREGMIN */
-# ifdef MNTTAB_OPT_ACREGMAX
- xsnprintf(preopts, l, ",%s=%d", MNTTAB_OPT_ACTREGMAX, gopt.auto_attrcache);
- xstrlcat(opts, preopts, l);
-# endif /* MNTTAB_OPT_ACREGMAX */
-#endif /* MNTTAB_OPT_ACTIMEO */
-}
-
-
-/*
- * Initialize a top-level mount. In our case, if the user asked for
- * forced_unmounts, and the OS supports it, then we try forced/lazy unmounts
- * on any previous toplvl mounts. This is useful if a previous Amd died and
- * left behind toplvl mount points (this Amd will clean them up).
- *
- * WARNING: Don't use forced/lazy unmounts if you have another valid Amd
- * running, because this code WILL force those valid toplvl mount points to
- * be detached as well!
- */
-static int
-amfs_toplvl_init(mntfs *mf)
-{
- int error = 0;
-
-#if defined(MNT2_GEN_OPT_FORCE) || defined(MNT2_GEN_OPT_DETACH)
- if (gopt.flags & CFM_FORCED_UNMOUNTS) {
- plog(XLOG_INFO, "amfs_toplvl_init: trying forced/lazy unmount of %s",
- mf->mf_mount);
- error = umount2_fs(mf->mf_mount, AMU_UMOUNT_FORCE | AMU_UMOUNT_DETACH);
- if (error)
- plog(XLOG_INFO, "amfs_toplvl_init: forced/lazy unmount failed: %m");
- else
- dlog("amfs_toplvl_init: forced/lazy unmount succeeded");
- }
-#endif /* MNT2_GEN_OPT_FORCE || MNT2_GEN_OPT_DETACH */
- return error;
-}
-
-
-/*
- * Mount the top-level
- */
-int
-amfs_toplvl_mount(am_node *mp, mntfs *mf)
-{
- struct stat stb;
- char opts[SIZEOF_OPTS], preopts[SIZEOF_OPTS], toplvl_opts[40];
- int error;
-
- /*
- * Mounting the automounter.
- * Make sure the mount directory exists, construct
- * the mount options and call the mount_amfs_toplvl routine.
- */
-
- if (stat(mp->am_path, &stb) < 0) {
- return errno;
- } else if ((stb.st_mode & S_IFMT) != S_IFDIR) {
- plog(XLOG_WARNING, "%s is not a directory", mp->am_path);
- return ENOTDIR;
- }
-
- /*
- * Construct some mount options:
- *
- * Tack on magic map=<mapname> option in mtab to emulate
- * SunOS automounter behavior.
- */
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS) {
- autofs_get_opts(opts, sizeof(opts), mp->am_autofs_fh);
- } else
-#endif /* HAVE_FS_AUTOFS */
- {
- preopts[0] = '\0';
-#ifdef MNTTAB_OPT_INTR
- xstrlcat(preopts, MNTTAB_OPT_INTR, sizeof(preopts));
- xstrlcat(preopts, ",", sizeof(preopts));
-#endif /* MNTTAB_OPT_INTR */
-#ifdef MNTTAB_OPT_IGNORE
- xstrlcat(preopts, MNTTAB_OPT_IGNORE, sizeof(preopts));
- xstrlcat(preopts, ",", sizeof(preopts));
-#endif /* MNTTAB_OPT_IGNORE */
- /* write most of the initial options + preopts */
- xsnprintf(opts, sizeof(opts), "%s%s,%s=%d,%s,map=%s",
- preopts,
- MNTTAB_OPT_RW,
- MNTTAB_OPT_PORT, nfs_port,
- mf->mf_ops->fs_type, mf->mf_info);
-
- /* process toplvl timeo/retrans options, if any */
- if (gopt.amfs_auto_timeo[AMU_TYPE_TOPLVL] > 0) {
- xsnprintf(toplvl_opts, sizeof(toplvl_opts), ",%s=%d",
- MNTTAB_OPT_TIMEO, gopt.amfs_auto_timeo[AMU_TYPE_TOPLVL]);
- xstrlcat(opts, toplvl_opts, sizeof(opts));
- }
- if (gopt.amfs_auto_retrans[AMU_TYPE_TOPLVL] > 0) {
- xsnprintf(toplvl_opts, sizeof(toplvl_opts), ",%s=%d",
- MNTTAB_OPT_RETRANS, gopt.amfs_auto_retrans[AMU_TYPE_TOPLVL]);
- xstrlcat(opts, toplvl_opts, sizeof(opts));
- }
-
-#ifdef MNTTAB_OPT_NOAC
- if (gopt.auto_attrcache == 0) {
- xstrlcat(opts, ",", sizeof(opts));
- xstrlcat(opts, MNTTAB_OPT_NOAC, sizeof(opts));
- } else
-#endif /* MNTTAB_OPT_NOAC */
- set_auto_attrcache_timeout(preopts, opts, sizeof(preopts));
- }
-
- /* now do the mount */
- error = amfs_mount(mp, mf, opts);
- if (error) {
- errno = error;
- plog(XLOG_FATAL, "amfs_toplvl_mount: amfs_mount failed: %m");
- return error;
- }
- return 0;
-}
-
-
-/*
- * Unmount a top-level automount node
- */
-int
-amfs_toplvl_umount(am_node *mp, mntfs *mf)
-{
- struct stat stb;
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
- int error;
- int count = 0; /* how many times did we try to unmount? */
-
-again:
- /*
- * The lstat is needed if this mount is type=direct.
- * When that happens, the kernel cache gets confused
- * between the underlying type (dir) and the mounted
- * type (link) and so needs to be re-synced before
- * the unmount. This is all because the unmount system
- * call follows links and so can't actually unmount
- * a link (stupid!). It was noted that doing an ls -ld
- * of the mount point to see why things were not working
- * actually fixed the problem - so simulate an ls -ld here.
- */
- if (lstat(mp->am_path, &stb) < 0) {
- error = errno;
- dlog("lstat(%s): %m", mp->am_path);
- goto out;
- }
- if ((stb.st_mode & S_IFMT) != S_IFDIR) {
- plog(XLOG_ERROR, "amfs_toplvl_umount: %s is not a directory, aborting.", mp->am_path);
- error = ENOTDIR;
- goto out;
- }
-
- error = UMOUNT_FS(mp->am_path, mnttab_file_name, unmount_flags);
- if (error == EBUSY) {
-#ifdef HAVE_FS_AUTOFS
- /*
- * autofs mounts are "in place", so it is possible
- * that we can't just unmount our mount points and go away.
- * If that's the case, just give up.
- */
- if (mf->mf_flags & MFF_IS_AUTOFS)
- return error;
-#endif /* HAVE_FS_AUTOFS */
- plog(XLOG_WARNING, "amfs_toplvl_unmount retrying %s in 1s", mp->am_path);
- count++;
- sleep(1);
- /*
- * If user wants forced/lazy unmount semantics, then set those flags,
- * but only after we've tried normal lstat/umount a few times --
- * otherwise forced unmounts may hang this very same Amd (by preventing
- * it from achieving a clean unmount).
- */
- if (gopt.flags & CFM_FORCED_UNMOUNTS) {
- if (count == 5) { /* after 5 seconds, try MNT_FORCE */
- dlog("enabling forced unmounts for toplvl node %s", mp->am_path);
- unmount_flags |= AMU_UMOUNT_FORCE;
- }
- if (count == 10) { /* after 10 seconds, try MNT_DETACH */
- dlog("enabling detached unmounts for toplvl node %s", mp->am_path);
- unmount_flags |= AMU_UMOUNT_DETACH;
- }
- }
- goto again;
- }
-out:
- return error;
-}
diff --git a/contrib/amd/amd/amfs_union.c b/contrib/amd/amd/amfs_union.c
deleted file mode 100644
index 6adb5b0bd9cb..000000000000
--- a/contrib/amd/amd/amfs_union.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amfs_union.c
- *
- */
-
-/*
- * Union automounter file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static int create_amfs_union_node(char *dir, opaque_t arg);
-static void amfs_union_mounted(mntfs *mf);
-
-
-/****************************************************************************
- *** OPS STRUCTURES ***
- ****************************************************************************/
-am_ops amfs_union_ops =
-{
- "union",
- amfs_generic_match,
- 0, /* amfs_union_init */
- amfs_toplvl_mount,
- amfs_toplvl_umount,
- amfs_generic_lookup_child,
- amfs_generic_mount_child,
- amfs_generic_readdir,
- 0, /* amfs_union_readlink */
- amfs_union_mounted,
- 0, /* amfs_union_umounted */
- amfs_generic_find_srvr,
- 0, /* amfs_union_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_BACKGROUND | FS_AMQINFO | FS_DIRECTORY,
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_UNION_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * Create a reference to a union'ed entry
- * XXX: this function may not be used anywhere...
- */
-static int
-create_amfs_union_node(char *dir, opaque_t arg)
-{
- if (!STREQ(dir, "/defaults")) {
- int error = 0;
- am_node *am;
- am = amfs_generic_lookup_child(arg, dir, &error, VLOOK_CREATE);
- if (am && error < 0)
- am = amfs_generic_mount_child(am, &error);
- if (error > 0) {
- errno = error; /* XXX */
- plog(XLOG_ERROR, "unionfs: could not mount %s: %m", dir);
- }
- return error;
- }
- return 0;
-}
-
-
-static void
-amfs_union_mounted(mntfs *mf)
-{
- int index;
- am_node *mp;
-
- amfs_mkcacheref(mf);
-
- /*
- * Having made the union mount point,
- * populate all the entries...
- */
- for (mp = get_first_exported_ap(&index);
- mp;
- mp = get_next_exported_ap(&index)) {
- if (mp->am_mnt == mf) {
- /* return value from create_amfs_union_node is ignored by mapc_keyiter */
- (void) mapc_keyiter((mnt_map *) mp->am_mnt->mf_private,
- create_amfs_union_node,
- mp);
- break;
- }
- }
-}
diff --git a/contrib/amd/amd/amq_subr.c b/contrib/amd/amd/amq_subr.c
deleted file mode 100644
index 79ecafc3d9b3..000000000000
--- a/contrib/amd/amd/amq_subr.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amq_subr.c
- *
- */
-/*
- * Auxiliary routines for amq tool
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward definitions */
-bool_t xdr_amq_mount_tree_node(XDR *xdrs, amq_mount_tree *objp);
-bool_t xdr_amq_mount_subtree(XDR *xdrs, amq_mount_tree *objp);
-
-
-voidp
-amqproc_null_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-/*
- * Return a sub-tree of mounts
- */
-amq_mount_tree_p *
-amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static am_node *mp;
-
- mp = find_ap(*(char **) argp);
- return (amq_mount_tree_p *) ((void *)&mp);
-}
-
-
-/*
- * Unmount a single node
- */
-voidp
-amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
- am_node *mp = find_ap(*(char **) argp);
-
- if (mp)
- forcibly_timeout_mp(mp);
-
- return (voidp) &res;
-}
-
-
-/*
- * Return global statistics
- */
-amq_mount_stats *
-amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp)
-{
- return (amq_mount_stats *) ((void *)&amd_stats);
-}
-
-
-/*
- * Return the entire tree of mount nodes
- */
-amq_mount_tree_list *
-amqproc_export_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static amq_mount_tree_list aml;
- static am_node *mp;
-
- mp = get_exported_ap(0);
- aml.amq_mount_tree_list_val = (amq_mount_tree_p *) ((void *) &mp);
- aml.amq_mount_tree_list_len = 1; /* XXX */
-
- return &aml;
-}
-
-
-int *
-amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static int rc;
- amq_setopt *opt = (amq_setopt *) argp;
-
- rc = 0;
-
- switch (opt->as_opt) {
-
- case AMOPT_DEBUG:
- if (debug_option(opt->as_str))
- rc = EINVAL;
- break;
-
- case AMOPT_LOGFILE:
- if (gopt.logfile && opt->as_str
- && STREQ(gopt.logfile, opt->as_str)) {
- if (switch_to_logfile(opt->as_str, orig_umask, 0))
- rc = EINVAL;
- } else {
- rc = EACCES;
- }
- break;
-
- case AMOPT_XLOG:
- if (switch_option(opt->as_str))
- rc = EINVAL;
- break;
-
- case AMOPT_FLUSHMAPC:
- if (amd_state == Run) {
- plog(XLOG_INFO, "amq says flush cache");
- do_mapc_reload = 0;
- flush_nfs_fhandle_cache((fserver *) NULL);
- flush_srvr_nfs_cache((fserver *) NULL);
- }
- break;
- }
-
- return &rc;
-}
-
-
-amq_mount_info_list *
-amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp)
-{
- return (amq_mount_info_list *) ((void *)&mfhead); /* XXX */
-}
-
-
-amq_string *
-amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static amq_string res;
-
- res = get_version_string();
- return &res;
-}
-
-
-/* get PID of remote amd */
-int *
-amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static int res;
-
- res = getpid();
- return &res;
-}
-
-
-/*
- * Process PAWD string of remote pawd tool.
- *
- * We repeat the resolution of the string until the resolved string resolves
- * to itself. This ensures that we follow path resolutions through all
- * possible Amd mount points until we reach some sort of convergence. To
- * prevent possible infinite loops, we break out of this loop if the strings
- * do not converge after MAX_PAWD_TRIES times.
- */
-amq_string *
-amqproc_pawd_1_svc(voidp argp, struct svc_req *rqstp)
-{
- static amq_string res;
-#define MAX_PAWD_TRIES 10
- int index, len, maxagain = MAX_PAWD_TRIES;
- am_node *mp;
- char *mountpoint;
- char *dir = *(char **) argp;
- static char tmp_buf[MAXPATHLEN];
- char prev_buf[MAXPATHLEN];
-
- tmp_buf[0] = prev_buf[0] = '\0'; /* default is empty string: no match */
- do {
- for (mp = get_first_exported_ap(&index);
- mp;
- mp = get_next_exported_ap(&index)) {
- if (STREQ(mp->am_mnt->mf_ops->fs_type, "toplvl"))
- continue;
- if (STREQ(mp->am_mnt->mf_ops->fs_type, "auto"))
- continue;
- mountpoint = (mp->am_link ? mp->am_link : mp->am_mnt->mf_mount);
- len = strlen(mountpoint);
- if (len == 0)
- continue;
- if (!NSTREQ(mountpoint, dir, len))
- continue;
- if (dir[len] != '\0' && dir[len] != '/')
- continue;
- xstrlcpy(tmp_buf, mp->am_path, sizeof(tmp_buf));
- xstrlcat(tmp_buf, &dir[len], sizeof(tmp_buf));
- break;
- } /* end of "for" loop */
- /* once tmp_buf and prev_buf are equal, break out of "do" loop */
- if (STREQ(tmp_buf, prev_buf))
- break;
- else
- xstrlcpy(prev_buf, tmp_buf, sizeof(prev_buf));
- } while (--maxagain);
- /* check if we couldn't resolve the string after MAX_PAWD_TRIES times */
- if (maxagain <= 0)
- plog(XLOG_WARNING, "path \"%s\" did not resolve after %d tries",
- tmp_buf, MAX_PAWD_TRIES);
-
- res = tmp_buf;
- return &res;
-}
-
-
-/*
- * XDR routines.
- */
-
-
-bool_t
-xdr_amq_setopt(XDR *xdrs, amq_setopt *objp)
-{
- if (!xdr_enum(xdrs, (enum_t *) ((voidp) &objp->as_opt))) {
- return (FALSE);
- }
- if (!xdr_string(xdrs, &objp->as_str, AMQ_STRLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-/*
- * More XDR routines - Should be used for OUTPUT ONLY.
- */
-bool_t
-xdr_amq_mount_tree_node(XDR *xdrs, amq_mount_tree *objp)
-{
- am_node *mp = (am_node *) objp;
- long mtime;
-
- if (!xdr_amq_string(xdrs, &mp->am_mnt->mf_info)) {
- return (FALSE);
- }
- if (!xdr_amq_string(xdrs, &mp->am_path)) {
- return (FALSE);
- }
- if (!xdr_amq_string(xdrs, mp->am_link ? &mp->am_link : &mp->am_mnt->mf_mount)) {
- return (FALSE);
- }
- if (!xdr_amq_string(xdrs, &mp->am_mnt->mf_ops->fs_type)) {
- return (FALSE);
- }
- mtime = mp->am_stats.s_mtime;
- if (!xdr_long(xdrs, &mtime)) {
- return (FALSE);
- }
- if (!xdr_u_short(xdrs, &mp->am_stats.s_uid)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mp->am_stats.s_getattr)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mp->am_stats.s_lookup)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mp->am_stats.s_readdir)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mp->am_stats.s_readlink)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mp->am_stats.s_statfs)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_subtree(XDR *xdrs, amq_mount_tree *objp)
-{
- am_node *mp = (am_node *) objp;
-
- if (!xdr_amq_mount_tree_node(xdrs, objp)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs,
- (char **) ((voidp) &mp->am_osib),
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs,
- (char **) ((voidp) &mp->am_child),
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_tree(XDR *xdrs, amq_mount_tree *objp)
-{
- am_node *mp = (am_node *) objp;
- am_node *mnil = NULL;
-
- if (!xdr_amq_mount_tree_node(xdrs, objp)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs,
- (char **) ((voidp) &mnil),
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs,
- (char **) ((voidp) &mp->am_child),
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_tree_p(XDR *xdrs, amq_mount_tree_p *objp)
-{
- if (!xdr_pointer(xdrs, (char **) objp, sizeof(amq_mount_tree), (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_stats(XDR *xdrs, amq_mount_stats *objp)
-{
- if (!xdr_int(xdrs, &objp->as_drops)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &objp->as_stale)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &objp->as_mok)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &objp->as_merr)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &objp->as_uerr)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-
-bool_t
-xdr_amq_mount_tree_list(XDR *xdrs, amq_mount_tree_list *objp)
-{
- if (!xdr_array(xdrs,
- (char **) ((voidp) &objp->amq_mount_tree_list_val),
- (u_int *) &objp->amq_mount_tree_list_len,
- ~0,
- sizeof(amq_mount_tree_p),
- (XDRPROC_T_TYPE) xdr_amq_mount_tree_p)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-
-/*
- * Compute length of list
- */
-bool_t
-xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead)
-{
- mntfs *mf;
- u_int len = 0;
-
- for (mf = AM_LAST(mntfs, qhead); mf != HEAD(mntfs, qhead); mf = PREV(mntfs, mf)) {
- if (!(mf->mf_fsflags & FS_AMQINFO))
- continue;
- len++;
- }
- xdr_u_int(xdrs, &len);
-
- /*
- * Send individual data items
- */
- for (mf = AM_LAST(mntfs, qhead); mf != HEAD(mntfs, qhead); mf = PREV(mntfs, mf)) {
- int up;
- if (!(mf->mf_fsflags & FS_AMQINFO))
- continue;
-
- if (!xdr_amq_string(xdrs, &mf->mf_ops->fs_type)) {
- return (FALSE);
- }
- if (!xdr_amq_string(xdrs, &mf->mf_mount)) {
- return (FALSE);
- }
- if (!xdr_amq_string(xdrs, &mf->mf_info)) {
- return (FALSE);
- }
- if (!xdr_amq_string(xdrs, &mf->mf_server->fs_host)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mf->mf_error)) {
- return (FALSE);
- }
- if (!xdr_int(xdrs, &mf->mf_refc)) {
- return (FALSE);
- }
- if (FSRV_ERROR(mf->mf_server) || FSRV_ISDOWN(mf->mf_server))
- up = 0;
- else if (FSRV_ISUP(mf->mf_server))
- up = 1;
- else
- up = -1;
- if (!xdr_int(xdrs, &up)) {
- return (FALSE);
- }
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_pri_free(XDRPROC_T_TYPE xdr_args, caddr_t args_ptr)
-{
- XDR xdr;
-
- xdr.x_op = XDR_FREE;
- return ((*xdr_args) (&xdr, (caddr_t *) args_ptr));
-}
diff --git a/contrib/amd/amd/amq_svc.c b/contrib/amd/amd/amq_svc.c
deleted file mode 100644
index 6fadb160c121..000000000000
--- a/contrib/amd/amd/amq_svc.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/amq_svc.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* typedefs */
-typedef char *(*amqsvcproc_t)(voidp, struct svc_req *);
-
-#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP)
-# ifdef NEED_LIBWRAP_SEVERITY_VARIABLES
-/*
- * Some systems that define libwrap already define these two variables
- * in libwrap, while others don't: so I need to know precisely iff
- * to define these two severity variables.
- */
-int allow_severity=0, deny_severity=0;
-# endif /* NEED_LIBWRAP_SEVERITY_VARIABLES */
-
-/*
- * check if remote amq is authorized to access this amd.
- * Returns: 1=allowed, 0=denied.
- */
-static int
-amqsvc_is_client_allowed(const struct sockaddr_in *addr, char *remote)
-{
- struct hostent *h;
- char *name = NULL, **ad;
- int ret = 0; /* default is 0==denied */
-
- /* Check IP address */
- if (hosts_ctl(AMD_SERVICE_NAME, "", remote, "")) {
- ret = 1;
- goto out;
- }
- /* Get address */
- if (!(h = gethostbyaddr((const char *)&(addr->sin_addr),
- sizeof(addr->sin_addr),
- AF_INET)))
- goto out;
- if (!(name = strdup(h->h_name)))
- goto out;
- /* Paranoia check */
- if (!(h = gethostbyname(name)))
- goto out;
- for (ad = h->h_addr_list; *ad; ad++)
- if (!memcmp(*ad, &(addr->sin_addr), h->h_length))
- break;
- if (!*ad)
- goto out;
- if (hosts_ctl(AMD_SERVICE_NAME, "", h->h_name, "")) {
- return 1;
- goto out;
- }
- /* Check aliases */
- for (ad = h->h_aliases; *ad; ad++)
- if (hosts_ctl(AMD_SERVICE_NAME, "", *ad, "")) {
- return 1;
- goto out;
- }
-
- out:
- if (name)
- XFREE(name);
- return ret;
-}
-#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
-
-
-void
-amq_program_1(struct svc_req *rqstp, SVCXPRT *transp)
-{
- union {
- amq_string amqproc_mnttree_1_arg;
- amq_string amqproc_umnt_1_arg;
- amq_setopt amqproc_setopt_1_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- amqsvcproc_t local;
-
-#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP)
- if (gopt.flags & CFM_USE_TCPWRAPPERS) {
- struct sockaddr_in *remote_addr = svc_getcaller(rqstp->rq_xprt);
- char *remote_hostname = inet_ntoa(remote_addr->sin_addr);
-
- if (!amqsvc_is_client_allowed(remote_addr, remote_hostname)) {
- plog(XLOG_WARNING, "Amd denied remote amq service to %s", remote_hostname);
- svcerr_auth(transp, AUTH_FAILED);
- return;
- } else {
- dlog("Amd allowed remote amq service to %s", remote_hostname);
- }
- }
-#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
-
- switch (rqstp->rq_proc) {
-
- case AMQPROC_NULL:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (amqsvcproc_t) amqproc_null_1_svc;
- break;
-
- case AMQPROC_MNTTREE:
- xdr_argument = (xdrproc_t) xdr_amq_string;
- xdr_result = (xdrproc_t) xdr_amq_mount_tree_p;
- local = (amqsvcproc_t) amqproc_mnttree_1_svc;
- break;
-
- case AMQPROC_UMNT:
- xdr_argument = (xdrproc_t) xdr_amq_string;
- xdr_result = (xdrproc_t) xdr_void;
- local = (amqsvcproc_t) amqproc_umnt_1_svc;
- break;
-
- case AMQPROC_STATS:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_amq_mount_stats;
- local = (amqsvcproc_t) amqproc_stats_1_svc;
- break;
-
- case AMQPROC_EXPORT:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_amq_mount_tree_list;
- local = (amqsvcproc_t) amqproc_export_1_svc;
- break;
-
- case AMQPROC_SETOPT:
- xdr_argument = (xdrproc_t) xdr_amq_setopt;
- xdr_result = (xdrproc_t) xdr_int;
- local = (amqsvcproc_t) amqproc_setopt_1_svc;
- break;
-
- case AMQPROC_GETMNTFS:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_amq_mount_info_qelem;
- local = (amqsvcproc_t) amqproc_getmntfs_1_svc;
- break;
-
- case AMQPROC_GETVERS:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_amq_string;
- local = (amqsvcproc_t) amqproc_getvers_1_svc;
- break;
-
- case AMQPROC_GETPID:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_int;
- local = (amqsvcproc_t) amqproc_getpid_1_svc;
- break;
-
- case AMQPROC_PAWD:
- xdr_argument = (xdrproc_t) xdr_amq_string;
- xdr_result = (xdrproc_t) xdr_amq_string;
- local = (amqsvcproc_t) amqproc_pawd_1_svc;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
-
- memset((char *) &argument, 0, sizeof(argument));
- if (!svc_getargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) & argument)) {
- svcerr_decode(transp);
- return;
- }
-
- result = (*local) (&argument, rqstp);
-
- if (result != NULL && !svc_sendreply(transp,
- (XDRPROC_T_TYPE) xdr_result,
- result)) {
- svcerr_systemerr(transp);
- }
-
- if (!svc_freeargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) & argument)) {
- plog(XLOG_FATAL, "unable to free rpc arguments in amqprog_1");
- going_down(1);
- }
-}
diff --git a/contrib/amd/amd/autil.c b/contrib/amd/amd/autil.c
deleted file mode 100644
index a5ecd6d0d1f3..000000000000
--- a/contrib/amd/amd/autil.c
+++ /dev/null
@@ -1,783 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/autil.c
- *
- */
-
-/*
- * utilities specified to amd, taken out of the older amd/util.c.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-int NumChildren = 0; /* number of children of primary amd */
-static char invalid_keys[] = "\"'!;@ \t\n";
-
-/****************************************************************************
- *** MACROS ***
- ****************************************************************************/
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
-# define PARENT_USLEEP_TIME 100000 /* 0.1 seconds */
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static void domain_strip(char *otherdom, char *localdom);
-static int dofork(void);
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-
-/*
- * Copy s into p, reallocating p if necessary
- */
-char *
-strealloc(char *p, char *s)
-{
- size_t len = strlen(s) + 1;
-
- p = (char *) xrealloc((voidp) p, len);
-
- xstrlcpy(p, s, len);
-#ifdef DEBUG_MEM
-# if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY)
- malloc_verify();
-# endif /* not defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY) */
-#endif /* DEBUG_MEM */
- return p;
-}
-
-
-/*
- * Strip off the trailing part of a domain
- * to produce a short-form domain relative
- * to the local host domain.
- * Note that this has no effect if the domain
- * names do not have the same number of
- * components. If that restriction proves
- * to be a problem then the loop needs recoding
- * to skip from right to left and do partial
- * matches along the way -- ie more expensive.
- */
-static void
-domain_strip(char *otherdom, char *localdom)
-{
- char *p1, *p2;
-
- if ((p1 = strchr(otherdom, '.')) &&
- (p2 = strchr(localdom, '.')) &&
- STREQ(p1 + 1, p2 + 1))
- *p1 = '\0';
-}
-
-
-/*
- * Normalize a host name: replace cnames with real names, and decide if to
- * strip domain name or not.
- */
-void
-host_normalize(char **chp)
-{
- /*
- * Normalize hosts is used to resolve host name aliases
- * and replace them with the standard-form name.
- * Invoked with "-n" command line option.
- */
- if (gopt.flags & CFM_NORMALIZE_HOSTNAMES) {
- struct hostent *hp;
- hp = gethostbyname(*chp);
- if (hp && hp->h_addrtype == AF_INET) {
- dlog("Hostname %s normalized to %s", *chp, hp->h_name);
- *chp = strealloc(*chp, (char *) hp->h_name);
- }
- }
- if (gopt.flags & CFM_DOMAIN_STRIP) {
- domain_strip(*chp, hostd);
- }
-}
-
-
-/*
- * Keys are not allowed to contain " ' ! or ; to avoid
- * problems with macro expansions.
- */
-int
-valid_key(char *key)
-{
- while (*key)
- if (strchr(invalid_keys, *key++))
- return FALSE;
- return TRUE;
-}
-
-
-void
-forcibly_timeout_mp(am_node *mp)
-{
- mntfs *mf = mp->am_mnt;
- /*
- * Arrange to timeout this node
- */
- if (mf && ((mp->am_flags & AMF_ROOT) ||
- (mf->mf_flags & (MFF_MOUNTING | MFF_UNMOUNTING)))) {
- if (mf->mf_flags & MFF_UNMOUNTING)
- plog(XLOG_WARNING, "node %s is currently being unmounted, ignoring timeout request", mp->am_path);
- else
- plog(XLOG_WARNING, "ignoring timeout request for active node %s", mp->am_path);
- } else {
- plog(XLOG_INFO, "\"%s\" forcibly timed out", mp->am_path);
- mp->am_flags &= ~AMF_NOTIMEOUT;
- mp->am_ttl = clocktime(NULL);
- /*
- * Force mtime update of parent dir, to prevent DNLC/dcache from caching
- * the old entry, which could result in ESTALE errors, bad symlinks, and
- * more.
- */
- clocktime(&mp->am_parent->am_fattr.na_mtime);
- reschedule_timeout_mp();
- }
-}
-
-
-void
-mf_mounted(mntfs *mf, bool_t call_free_opts)
-{
- int quoted;
- int wasmounted = mf->mf_flags & MFF_MOUNTED;
-
- if (!wasmounted) {
- /*
- * If this is a freshly mounted
- * filesystem then update the
- * mntfs structure...
- */
- mf->mf_flags |= MFF_MOUNTED;
- mf->mf_error = 0;
-
- /*
- * Do mounted callback
- */
- if (mf->mf_ops->mounted)
- mf->mf_ops->mounted(mf);
-
- /*
- * Be careful when calling free_ops and XFREE here. Some pseudo file
- * systems like nfsx call this function (mf_mounted), even though it
- * would be called by the lower-level amd file system functions. nfsx
- * needs to call this function because of the other actions it takes.
- * So we pass a boolean from the caller (yes, not so clean workaround)
- * to determine if we should free or not. If we're not freeing (often
- * because we're called from a callback function), then just to be sure,
- * we'll zero out the am_opts structure and set the pointer to NULL.
- * The parent mntfs node owns this memory and is going to free it with a
- * call to mf_mounted(mntfs,TRUE) (see comment in the am_mounted code).
- */
- if (call_free_opts) {
- free_opts(mf->mf_fo); /* this free is needed to prevent leaks */
- XFREE(mf->mf_fo); /* (also this one) */
- } else {
- memset(mf->mf_fo, 0, sizeof(am_opts));
- mf->mf_fo = NULL;
- }
- }
-
- if (mf->mf_flags & MFF_RESTART) {
- mf->mf_flags &= ~MFF_RESTART;
- dlog("Restarted filesystem %s, flags 0x%x", mf->mf_mount, mf->mf_flags);
- }
-
- /*
- * Log message
- */
- quoted = strchr(mf->mf_info, ' ') != 0;
- plog(XLOG_INFO, "%s%s%s %s fstype %s on %s",
- quoted ? "\"" : "",
- mf->mf_info,
- quoted ? "\"" : "",
- wasmounted ? "referenced" : "mounted",
- mf->mf_ops->fs_type, mf->mf_mount);
-}
-
-
-void
-am_mounted(am_node *mp)
-{
- int notimeout = 0; /* assume normal timeouts initially */
- mntfs *mf = mp->am_mnt;
-
- /*
- * This is the parent mntfs which does the mf->mf_fo (am_opts type), and
- * we're passing TRUE here to tell mf_mounted to actually free the
- * am_opts. See a related comment in mf_mounted().
- */
- mf_mounted(mf, TRUE);
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS)
- autofs_mounted(mp);
-#endif /* HAVE_FS_AUTOFS */
-
- /*
- * Patch up path for direct mounts
- */
- if (mp->am_parent && mp->am_parent->am_mnt->mf_fsflags & FS_DIRECT)
- mp->am_path = str3cat(mp->am_path, mp->am_parent->am_path, "/", ".");
-
- /*
- * Check whether this mount should be cached permanently or not,
- * and handle user-requested timeouts.
- */
- /* first check if file system was set to never timeout */
- if (mf->mf_fsflags & FS_NOTIMEOUT)
- notimeout = 1;
- /* next, alter that decision by map flags */
- if (mf->mf_mopts) {
- mntent_t mnt;
- mnt.mnt_opts = mf->mf_mopts;
-
- /* umount option: user wants to unmount this entry */
- if (amu_hasmntopt(&mnt, "unmount") || amu_hasmntopt(&mnt, "umount"))
- notimeout = 0;
- /* noumount option: user does NOT want to unmount this entry */
- if (amu_hasmntopt(&mnt, "nounmount") || amu_hasmntopt(&mnt, "noumount"))
- notimeout = 1;
- /* utimeout=N option: user wants to unmount this option AND set timeout */
- if ((mp->am_timeo = hasmntval(&mnt, "utimeout")) == 0)
- mp->am_timeo = gopt.am_timeo; /* otherwise use default timeout */
- else
- notimeout = 0;
- /* special case: don't try to unmount "/" (it can never succeed) */
- if (mf->mf_mount[0] == '/' && mf->mf_mount[1] == '\0')
- notimeout = 1;
- }
- /* finally set actual flags */
- if (notimeout) {
- mp->am_flags |= AMF_NOTIMEOUT;
- plog(XLOG_INFO, "%s set to never timeout", mp->am_path);
- } else {
- mp->am_flags &= ~AMF_NOTIMEOUT;
- plog(XLOG_INFO, "%s set to timeout in %d seconds", mp->am_path, mp->am_timeo);
- }
-
- /*
- * If this node is a symlink then
- * compute the length of the returned string.
- */
- if (mp->am_fattr.na_type == NFLNK)
- mp->am_fattr.na_size = strlen(mp->am_link ? mp->am_link : mf->mf_mount);
-
- /*
- * Record mount time, and update am_stats at the same time.
- */
- mp->am_stats.s_mtime = clocktime(&mp->am_fattr.na_mtime);
- new_ttl(mp);
-
- /*
- * Update mtime of parent node (copying "struct nfstime" in '=' below)
- */
- if (mp->am_parent && mp->am_parent->am_mnt)
- mp->am_parent->am_fattr.na_mtime = mp->am_fattr.na_mtime;
-
- /*
- * This is ugly, but essentially unavoidable
- * Sublinks must be treated separately as type==link
- * when the base type is different.
- */
- if (mp->am_link && mf->mf_ops != &amfs_link_ops)
- amfs_link_ops.mount_fs(mp, mf);
-
- /*
- * Now, if we can, do a reply to our client here
- * to speed things up.
- */
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_flags & AMF_AUTOFS)
- autofs_mount_succeeded(mp);
- else
-#endif /* HAVE_FS_AUTOFS */
- nfs_quick_reply(mp, 0);
-
- /*
- * Update stats
- */
- amd_stats.d_mok++;
-}
-
-
-/*
- * Replace mount point with a reference to an error filesystem.
- * The mount point (struct mntfs) is NOT discarded,
- * the caller must do it if it wants to _before_ calling this function.
- */
-void
-assign_error_mntfs(am_node *mp)
-{
- int error;
- dlog("assign_error_mntfs");
- /*
- * Save the old error code
- */
- error = mp->am_error;
- if (error <= 0)
- error = mp->am_mnt->mf_error;
- /*
- * Allocate a new error reference
- */
- mp->am_mnt = new_mntfs();
- /*
- * Put back the error code
- */
- mp->am_mnt->mf_error = error;
- mp->am_mnt->mf_flags |= MFF_ERROR;
- /*
- * Zero the error in the mount point
- */
- mp->am_error = 0;
-}
-
-
-/*
- * Build a new map cache for this node, or re-use
- * an existing cache for the same map.
- */
-void
-amfs_mkcacheref(mntfs *mf)
-{
- char *cache;
-
- if (mf->mf_fo && mf->mf_fo->opt_cache)
- cache = mf->mf_fo->opt_cache;
- else
- cache = "none";
- mf->mf_private = (opaque_t) mapc_find(mf->mf_info,
- cache,
- (mf->mf_fo ? mf->mf_fo->opt_maptype : NULL));
- mf->mf_prfree = mapc_free;
-}
-
-
-/*
- * Locate next node in sibling list which is mounted
- * and is not an error node.
- */
-am_node *
-next_nonerror_node(am_node *xp)
-{
- mntfs *mf;
-
- /*
- * Bug report (7/12/89) from Rein Tollevik <rein@ifi.uio.no>
- * Fixes a race condition when mounting direct automounts.
- * Also fixes a problem when doing a readdir on a directory
- * containing hung automounts.
- */
- while (xp &&
- (!(mf = xp->am_mnt) || /* No mounted filesystem */
- mf->mf_error != 0 || /* There was a mntfs error */
- xp->am_error != 0 || /* There was a mount error */
- !(mf->mf_flags & MFF_MOUNTED) || /* The fs is not mounted */
- (mf->mf_server->fs_flags & FSF_DOWN)) /* The fs may be down */
- )
- xp = xp->am_osib;
-
- return xp;
-}
-
-
-/*
- * Mount an automounter directory.
- * The automounter is connected into the system
- * as a user-level NFS server. amfs_mount constructs
- * the necessary NFS parameters to be given to the
- * kernel so that it will talk back to us.
- *
- * NOTE: automounter mounts in themselves are using NFS Version 2 (UDP).
- *
- * NEW: on certain systems, mounting can be done using the
- * kernel-level automount (autofs) support. In that case,
- * we don't need NFS at all here.
- */
-int
-amfs_mount(am_node *mp, mntfs *mf, char *opts)
-{
- char fs_hostname[MAXHOSTNAMELEN + MAXPATHLEN + 1];
- int retry, error = 0, genflags;
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- char *dir = mf->mf_mount;
- mntent_t mnt;
- MTYPE_TYPE type;
- int forced_unmount = 0; /* are we using forced unmounts? */
-
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = dir;
- mnt.mnt_fsname = pid_fsname;
- mnt.mnt_opts = opts;
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS) {
- type = MOUNT_TYPE_AUTOFS;
- /*
- * Make sure that amd's top-level autofs mounts are hidden by default
- * from df.
- * XXX: It works ok on Linux, might not work on other systems.
- */
- mnt.mnt_type = "autofs";
- } else
-#endif /* HAVE_FS_AUTOFS */
- {
- type = MOUNT_TYPE_NFS;
- /*
- * Make sure that amd's top-level NFS mounts are hidden by default
- * from df.
- * If they don't appear to support the either the "ignore" mnttab
- * option entry, or the "auto" one, set the mount type to "nfs".
- */
- mnt.mnt_type = HIDE_MOUNT_TYPE;
- }
-
- retry = hasmntval(&mnt, MNTTAB_OPT_RETRY);
- if (retry <= 0)
- retry = 2; /* XXX: default to 2 retries */
-
- /*
- * SET MOUNT ARGS
- */
-
- /*
- * Make a ``hostname'' string for the kernel
- */
- xsnprintf(fs_hostname, sizeof(fs_hostname), "pid%ld@%s:%s",
- get_server_pid(), am_get_hostname(), dir);
- /*
- * Most kernels have a name length restriction (64 bytes)...
- */
- if (strlen(fs_hostname) >= MAXHOSTNAMELEN)
- xstrlcpy(fs_hostname + MAXHOSTNAMELEN - 3, "..",
- sizeof(fs_hostname) - MAXHOSTNAMELEN + 3);
-#ifdef HOSTNAMESZ
- /*
- * ... and some of these restrictions are 32 bytes (HOSTNAMESZ)
- * If you need to get the definition for HOSTNAMESZ found, you may
- * add the proper header file to the conf/nfs_prot/nfs_prot_*.h file.
- */
- if (strlen(fs_hostname) >= HOSTNAMESZ)
- xstrlcpy(fs_hostname + HOSTNAMESZ - 3, "..",
- sizeof(fs_hostname) - HOSTNAMESZ + 3);
-#endif /* HOSTNAMESZ */
-
- /*
- * Finally we can compute the mount genflags set above,
- * and add any automounter specific flags.
- */
- genflags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- genflags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
- genflags |= compute_automounter_mount_flags(&mnt);
-
-again:
- if (!(mf->mf_flags & MFF_IS_AUTOFS)) {
- nfs_args_t nfs_args;
- am_nfs_fh *fhp;
- am_nfs_handle_t anh;
-#ifndef HAVE_TRANSPORT_TYPE_TLI
- u_short port;
- struct sockaddr_in sin;
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*
- * get fhandle of remote path for automount point
- */
- fhp = get_root_nfs_fh(dir);
- if (!fhp) {
- plog(XLOG_FATAL, "Can't find root file handle for %s", dir);
- return EINVAL;
- }
-
-#ifndef HAVE_TRANSPORT_TYPE_TLI
- /*
- * Create sockaddr to point to the local machine.
- */
- memset((voidp) &sin, 0, sizeof(sin));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- sin.sin_family = AF_INET;
- sin.sin_addr = myipaddr;
- port = hasmntval(&mnt, MNTTAB_OPT_PORT);
- if (port) {
- sin.sin_port = htons(port);
- } else {
- plog(XLOG_ERROR, "no port number specified for %s", dir);
- return EINVAL;
- }
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /* setup the many fields and flags within nfs_args */
- memmove(&anh.v2, fhp, sizeof(*fhp));
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- compute_nfs_args(&nfs_args,
- &mnt,
- genflags,
- nfsncp,
- NULL, /* remote host IP addr is set below */
- NFS_VERSION, /* version 2 */
- "udp",
- &anh,
- fs_hostname,
- pid_fsname);
- /*
- * IMPORTANT: set the correct IP address AFTERWARDS. It cannot
- * be done using the normal mechanism of compute_nfs_args(), because
- * that one will allocate a new address and use NFS_SA_DREF() to copy
- * parts to it, while assuming that the ip_addr passed is always
- * a "struct sockaddr_in". That assumption is incorrect on TLI systems,
- * because they define a special macro HOST_SELF which is DIFFERENT
- * than localhost (127.0.0.1)!
- */
- nfs_args.addr = &nfsxprt->xp_ltaddr;
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- compute_nfs_args(&nfs_args,
- &mnt,
- genflags,
- NULL,
- &sin,
- NFS_VERSION, /* version 2 */
- "udp",
- &anh,
- fs_hostname,
- pid_fsname);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*************************************************************************
- * NOTE: while compute_nfs_args() works ok for regular NFS mounts *
- * the toplvl one is not quite regular, and so some options must be *
- * corrected by hand more carefully, *after* compute_nfs_args() runs. *
- *************************************************************************/
- compute_automounter_nfs_args(&nfs_args, &mnt);
-
- if (amuDebug(D_TRACE)) {
- print_nfs_args(&nfs_args, 0);
- plog(XLOG_DEBUG, "Generic mount flags 0x%x", genflags);
- }
-
- /* This is it! Here we try to mount amd on its mount points */
- error = mount_fs(&mnt, genflags, (caddr_t) &nfs_args,
- retry, type, 0, NULL, mnttab_file_name, on_autofs);
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- free_knetconfig(nfs_args.knconf);
- /*
- * local automounter mounts do not allocate a special address, so
- * no need to XFREE(nfs_args.addr) under TLI.
- */
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
-#ifdef HAVE_FS_AUTOFS
- } else {
- /* This is it! Here we try to mount amd on its mount points */
- error = mount_fs(&mnt, genflags, (caddr_t) mp->am_autofs_fh,
- retry, type, 0, NULL, mnttab_file_name, on_autofs);
-#endif /* HAVE_FS_AUTOFS */
- }
- if (error == 0 || forced_unmount)
- return error;
-
- /*
- * If user wants forced/lazy unmount semantics, then try it iff the
- * current mount failed with EIO or ESTALE.
- */
- if (gopt.flags & CFM_FORCED_UNMOUNTS) {
- switch (errno) {
- case ESTALE:
- case EIO:
- forced_unmount = errno;
- plog(XLOG_WARNING, "Mount %s failed (%m); force unmount.", mp->am_path);
- if ((error = UMOUNT_FS(mp->am_path, mnttab_file_name,
- AMU_UMOUNT_FORCE | AMU_UMOUNT_DETACH)) < 0) {
- plog(XLOG_WARNING, "Forced umount %s failed: %m.", mp->am_path);
- errno = forced_unmount;
- } else
- goto again;
- default:
- break;
- }
- }
-
- return error;
-}
-
-
-void
-am_unmounted(am_node *mp)
-{
- mntfs *mf = mp->am_mnt;
-
- if (!foreground) /* firewall - should never happen */
- return;
-
- /*
- * Do unmounted callback
- */
- if (mf->mf_ops->umounted)
- mf->mf_ops->umounted(mf);
-
- /*
- * This is ugly, but essentially unavoidable.
- * Sublinks must be treated separately as type==link
- * when the base type is different.
- */
- if (mp->am_link && mf->mf_ops != &amfs_link_ops)
- amfs_link_ops.umount_fs(mp, mf);
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS)
- autofs_release_fh(mp);
- if (mp->am_flags & AMF_AUTOFS)
- autofs_umount_succeeded(mp);
-#endif /* HAVE_FS_AUTOFS */
-
- /*
- * Clean up any directories that were made
- *
- * If we remove the mount point of a pending mount, any queued access
- * to it will fail. So don't do it in that case.
- * Also don't do it if the refcount is > 1.
- */
- if (mf->mf_flags & MFF_MKMNT &&
- mf->mf_refc == 1 &&
- !(mp->am_flags & AMF_REMOUNT)) {
- plog(XLOG_INFO, "removing mountpoint directory '%s'", mf->mf_mount);
- rmdirs(mf->mf_mount);
- mf->mf_flags &= ~MFF_MKMNT;
- }
-
- /*
- * If this is a pseudo-directory then adjust the link count
- * in the parent
- */
- if (mp->am_parent && mp->am_fattr.na_type == NFDIR)
- --mp->am_parent->am_fattr.na_nlink;
-
- /*
- * Update mtime of parent node
- */
- if (mp->am_parent && mp->am_parent->am_mnt)
- clocktime(&mp->am_parent->am_fattr.na_mtime);
-
- if (mp->am_parent && (mp->am_flags & AMF_REMOUNT)) {
- char *fname = strdup(mp->am_name);
- am_node *mp_parent = mp->am_parent;
- mntfs *mf_parent = mp_parent->am_mnt;
- int error = 0;
-
- free_map(mp);
- plog(XLOG_INFO, "am_unmounted: remounting %s", fname);
- mp = mf_parent->mf_ops->lookup_child(mp_parent, fname, &error, VLOOK_CREATE);
- if (mp && error < 0)
- mp = mf_parent->mf_ops->mount_child(mp, &error);
- if (error > 0) {
- errno = error;
- plog(XLOG_ERROR, "am_unmounted: could not remount %s: %m", fname);
- }
- XFREE(fname);
- } else
- /*
- * We have a race here.
- * If this node has a pending mount and amd is going down (unmounting
- * everything in the process), then we could potentially free it here
- * while a struct continuation still has a reference to it. So when
- * amfs_cont is called, it blows up.
- * We avoid the race by refusing to free any nodes that have
- * pending mounts (defined as having a non-NULL am_mfarray).
- */
- if (!mp->am_mfarray)
- free_map(mp);
-}
-
-
-/*
- * Fork the automounter
- *
- * TODO: Need a better strategy for handling errors
- */
-static int
-dofork(void)
-{
- int pid;
-
-top:
- pid = fork();
-
- if (pid < 0) { /* fork error, retry in 1 second */
- sleep(1);
- goto top;
- }
- if (pid == 0) { /* child process (foreground==false) */
- am_set_mypid();
- foreground = 0;
- } else { /* parent process, has one more child */
- NumChildren++;
- }
-
- return pid;
-}
-
-
-int
-background(void)
-{
- int pid = dofork();
-
- if (pid == 0) {
- dlog("backgrounded");
- foreground = 0;
- } else
- dlog("forked process %d", pid);
- return pid;
-}
diff --git a/contrib/amd/amd/clock.c b/contrib/amd/amd/clock.c
deleted file mode 100644
index 0caa7dff2c73..000000000000
--- a/contrib/amd/amd/clock.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/clock.c
- *
- */
-
-/*
- * Callouts.
- *
- * Modeled on kernel object of the same name.
- * See usual references.
- *
- * Use of a heap-based mechanism was rejected:
- * 1. more complex implementation needed.
- * 2. not obvious that a list is too slow for Amd.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-void reschedule_timeouts(time_t now, time_t then);
-
-typedef struct callout callout;
-struct callout {
- callout *c_next; /* List of callouts */
- callout_fun *c_fn; /* Function to call */
- opaque_t c_arg; /* Argument to pass to call */
- time_t c_time; /* Time of call */
- int c_id; /* Unique identifier */
-};
-
-static callout callouts; /* List of pending callouts */
-static callout *free_callouts; /* Cache of free callouts */
-static int nfree_callouts; /* Number on free list */
-static int callout_id; /* Next free callout identifier */
-
-time_t next_softclock; /* Time of next call to softclock() */
-
-
-/*
- * Number of callout slots we keep on the free list
- */
-#define CALLOUT_FREE_SLOP 10
-
-/*
- * Global assumption: valid id's are non-zero.
- */
-#define CID_ALLOC() (++callout_id)
-#define CID_UNDEF (0)
-
-
-static callout *
-alloc_callout(void)
-{
- callout *cp = free_callouts;
-
- if (cp) {
- --nfree_callouts;
- free_callouts = free_callouts->c_next;
- return cp;
- }
- return ALLOC(struct callout);
-}
-
-
-static void
-free_callout(callout *cp)
-{
- if (nfree_callouts > CALLOUT_FREE_SLOP) {
- XFREE(cp);
- } else {
- cp->c_next = free_callouts;
- free_callouts = cp;
- nfree_callouts++;
- }
-}
-
-
-/*
- * Schedule a callout.
- *
- * (*fn)(fn_arg) will be called at clocktime(NULL) + secs
- */
-int
-timeout(u_int secs, callout_fun *fn, opaque_t fn_arg)
-{
- callout *cp, *cp2;
- time_t t = clocktime(NULL) + secs;
-
- /*
- * Allocate and fill in a new callout structure
- */
- callout *cpnew = alloc_callout();
- cpnew->c_arg = fn_arg;
- cpnew->c_fn = fn;
- cpnew->c_time = t;
- cpnew->c_id = CID_ALLOC();
-
- if (t < next_softclock)
- next_softclock = t;
-
- /*
- * Find the correct place in the list
- */
- for (cp = &callouts; (cp2 = cp->c_next); cp = cp2)
- if (cp2->c_time >= t)
- break;
-
- /*
- * And link it in
- */
- cp->c_next = cpnew;
- cpnew->c_next = cp2;
-
- /*
- * Return callout identifier
- */
- return cpnew->c_id;
-}
-
-
-/*
- * De-schedule a callout
- */
-void
-untimeout(int id)
-{
- callout *cp, *cp2;
- for (cp = &callouts; (cp2 = cp->c_next); cp = cp2) {
- if (cp2->c_id == id) {
- cp->c_next = cp2->c_next;
- free_callout(cp2);
- break;
- }
- }
-}
-
-
-/*
- * Reschedule after clock changed
- */
-void
-reschedule_timeouts(time_t now, time_t then)
-{
- callout *cp;
-
- for (cp = callouts.c_next; cp; cp = cp->c_next) {
- if (cp->c_time >= now && cp->c_time <= then) {
- plog(XLOG_WARNING, "job %d rescheduled to run immediately", cp->c_id);
- dlog("rescheduling job %d back %ld seconds",
- cp->c_id, (long) (cp->c_time - now));
- next_softclock = cp->c_time = now;
- }
- }
-}
-
-
-/*
- * Clock handler
- */
-int
-softclock(void)
-{
- time_t now;
- callout *cp;
-
- do {
- if (task_notify_todo)
- do_task_notify();
-
- now = clocktime(NULL);
-
- /*
- * While there are more callouts waiting...
- */
- while ((cp = callouts.c_next) && cp->c_time <= now) {
- /*
- * Extract first from list, save fn & fn_arg and
- * unlink callout from list and free.
- * Finally call function.
- *
- * The free is done first because
- * it is quite common that the
- * function will call timeout()
- * and try to allocate a callout
- */
- callout_fun *fn = cp->c_fn;
- opaque_t fn_arg = cp->c_arg;
-
- callouts.c_next = cp->c_next;
- free_callout(cp);
- (*fn) (fn_arg);
- }
-
- } while (task_notify_todo);
-
- /*
- * Return number of seconds to next event,
- * or 0 if there is no event.
- */
- if ((cp = callouts.c_next))
- return cp->c_time - now;
- return 0;
-}
diff --git a/contrib/amd/amd/conf.c b/contrib/amd/amd/conf.c
deleted file mode 100644
index 2fc587b0cadb..000000000000
--- a/contrib/amd/amd/conf.c
+++ /dev/null
@@ -1,1406 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/conf.c
- *
- */
-
-/*
- * Functions to handle the configuration file.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/*
- * MACROS:
- */
-/* Turn on to show some info about maps being configured */
-/* #define DEBUG_CONF */
-
-/*
- * TYPEDEFS:
- */
-typedef int (*OptFuncPtr)(const char *);
-
-/*
- * STRUCTURES:
- */
-struct _func_map {
- char *name;
- OptFuncPtr func;
-};
-
-/*
- * FORWARD DECLARATIONS:
- */
-static int gopt_arch(const char *val);
-static int gopt_auto_attrcache(const char *val);
-static int gopt_auto_dir(const char *val);
-static int gopt_autofs_use_lofs(const char *val);
-static int gopt_browsable_dirs(const char *val);
-static int gopt_cache_duration(const char *val);
-static int gopt_cluster(const char *val);
-static int gopt_debug_mtab_file(const char *val);
-static int gopt_debug_options(const char *val);
-static int gopt_dismount_interval(const char *val);
-static int gopt_domain_strip(const char *val);
-static int gopt_exec_map_timeout(const char *val);
-static int gopt_forced_unmounts(const char *val);
-static int gopt_full_os(const char *val);
-static int gopt_fully_qualified_hosts(const char *val);
-static int gopt_hesiod_base(const char *val);
-static int gopt_karch(const char *val);
-static int gopt_ldap_base(const char *val);
-static int gopt_ldap_cache_maxmem(const char *val);
-static int gopt_ldap_cache_seconds(const char *val);
-static int gopt_ldap_hostports(const char *val);
-static int gopt_ldap_proto_version(const char *val);
-static int gopt_local_domain(const char *val);
-static int gopt_localhost_address(const char *val);
-static int gopt_log_file(const char *val);
-static int gopt_log_options(const char *val);
-static int gopt_map_defaults(const char *val);
-static int gopt_map_options(const char *val);
-static int gopt_map_reload_interval(const char *val);
-static int gopt_map_type(const char *val);
-static int gopt_mount_type(const char *val);
-static int gopt_pid_file(const char *val);
-static int gopt_portmap_program(const char *val);
-static int gopt_preferred_amq_port(const char *val);
-static int gopt_nfs_allow_any_interface(const char *val);
-static int gopt_nfs_allow_insecure_port(const char *val);
-static int gopt_nfs_proto(const char *val);
-static int gopt_nfs_retransmit_counter(const char *val);
-static int gopt_nfs_retransmit_counter_udp(const char *val);
-static int gopt_nfs_retransmit_counter_tcp(const char *val);
-static int gopt_nfs_retransmit_counter_toplvl(const char *val);
-static int gopt_nfs_retry_interval(const char *val);
-static int gopt_nfs_retry_interval_udp(const char *val);
-static int gopt_nfs_retry_interval_tcp(const char *val);
-static int gopt_nfs_retry_interval_toplvl(const char *val);
-static int gopt_nfs_vers(const char *val);
-static int gopt_nis_domain(const char *val);
-static int gopt_normalize_hostnames(const char *val);
-static int gopt_normalize_slashes(const char *val);
-static int gopt_os(const char *val);
-static int gopt_osver(const char *val);
-static int gopt_plock(const char *val);
-static int gopt_print_pid(const char *val);
-static int gopt_print_version(const char *val);
-static int gopt_restart_mounts(const char *val);
-static int gopt_search_path(const char *val);
-static int gopt_selectors_in_defaults(const char *val);
-static int gopt_show_statfs_entries(const char *val);
-static int gopt_truncate_log(const char *val);
-static int gopt_unmount_on_exit(const char *val);
-static int gopt_use_tcpwrappers(const char *val);
-static int gopt_vendor(const char *val);
-static int process_global_option(const char *key, const char *val);
-static int process_one_regular_map(const cf_map_t *cfm);
-static int process_regular_option(const char *section, const char *key, const char *val, cf_map_t *cfm);
-static int ropt_browsable_dirs(const char *val, cf_map_t *cfm);
-static int ropt_map_name(const char *val, cf_map_t *cfm);
-static int ropt_map_defaults(const char *val, cf_map_t *cfm);
-static int ropt_map_options(const char *val, cf_map_t *cfm);
-static int ropt_map_type(const char *val, cf_map_t *cfm);
-static int ropt_mount_type(const char *val, cf_map_t *cfm);
-static int ropt_search_path(const char *val, cf_map_t *cfm);
-static int ropt_tag(const char *val, cf_map_t *cfm);
-static void init_cf_map(cf_map_t *cfm);
-
-
-/*
- * STATIC VARIABLES:
- */
-static cf_map_t *head_map, *cur_map;
-
-static struct _func_map glob_functable[] = {
- {"arch", gopt_arch},
- {"auto_attrcache", gopt_auto_attrcache},
- {"auto_dir", gopt_auto_dir},
- {"autofs_use_lofs", gopt_autofs_use_lofs},
- {"browsable_dirs", gopt_browsable_dirs},
- {"cache_duration", gopt_cache_duration},
- {"cluster", gopt_cluster},
- {"debug_mtab_file", gopt_debug_mtab_file},
- {"debug_options", gopt_debug_options},
- {"dismount_interval", gopt_dismount_interval},
- {"domain_strip", gopt_domain_strip},
- {"exec_map_timeout", gopt_exec_map_timeout},
- {"forced_unmounts", gopt_forced_unmounts},
- {"fully_qualified_hosts", gopt_fully_qualified_hosts},
- {"full_os", gopt_full_os},
- {"hesiod_base", gopt_hesiod_base},
- {"karch", gopt_karch},
- {"ldap_base", gopt_ldap_base},
- {"ldap_cache_maxmem", gopt_ldap_cache_maxmem},
- {"ldap_cache_seconds", gopt_ldap_cache_seconds},
- {"ldap_hostports", gopt_ldap_hostports},
- {"ldap_proto_version", gopt_ldap_proto_version},
- {"local_domain", gopt_local_domain},
- {"localhost_address", gopt_localhost_address},
- {"log_file", gopt_log_file},
- {"log_options", gopt_log_options},
- {"map_defaults", gopt_map_defaults},
- {"map_options", gopt_map_options},
- {"map_reload_interval", gopt_map_reload_interval},
- {"map_type", gopt_map_type},
- {"mount_type", gopt_mount_type},
- {"pid_file", gopt_pid_file},
- {"portmap_program", gopt_portmap_program},
- {"preferred_amq_port", gopt_preferred_amq_port},
- {"nfs_allow_any_interface", gopt_nfs_allow_any_interface},
- {"nfs_allow_insecure_port", gopt_nfs_allow_insecure_port},
- {"nfs_proto", gopt_nfs_proto},
- {"nfs_retransmit_counter", gopt_nfs_retransmit_counter},
- {"nfs_retransmit_counter_udp", gopt_nfs_retransmit_counter_udp},
- {"nfs_retransmit_counter_tcp", gopt_nfs_retransmit_counter_tcp},
- {"nfs_retransmit_counter_toplvl", gopt_nfs_retransmit_counter_toplvl},
- {"nfs_retry_interval", gopt_nfs_retry_interval},
- {"nfs_retry_interval_udp", gopt_nfs_retry_interval_udp},
- {"nfs_retry_interval_tcp", gopt_nfs_retry_interval_tcp},
- {"nfs_retry_interval_toplvl", gopt_nfs_retry_interval_toplvl},
- {"nfs_vers", gopt_nfs_vers},
- {"nis_domain", gopt_nis_domain},
- {"normalize_hostnames", gopt_normalize_hostnames},
- {"normalize_slashes", gopt_normalize_slashes},
- {"os", gopt_os},
- {"osver", gopt_osver},
- {"plock", gopt_plock},
- {"print_pid", gopt_print_pid},
- {"print_version", gopt_print_version},
- {"restart_mounts", gopt_restart_mounts},
- {"search_path", gopt_search_path},
- {"selectors_on_default", gopt_selectors_in_defaults},
- {"selectors_in_defaults", gopt_selectors_in_defaults},
- {"show_statfs_entries", gopt_show_statfs_entries},
- {"truncate_log", gopt_truncate_log},
- {"unmount_on_exit", gopt_unmount_on_exit},
- {"use_tcpwrappers", gopt_use_tcpwrappers},
- {"vendor", gopt_vendor},
- {NULL, NULL}
-};
-
-
-/*
- * Initialize a map from [global] defaults.
- */
-static void
-init_cf_map(cf_map_t *cfm)
-{
- if (!cfm)
- return;
-
- /*
- * Initialize a regular map's flags and other variables from the
- * global ones, so that they are applied to all maps. Of course, each map
- * can then override the flags individually.
- *
- * NOTES:
- * (1): Will only work for maps that appear after [global].
- * (2): I'm assigning pointers directly from the global map.
- */
-
- /* initialize map_type from [global] */
- cfm->cfm_type = gopt.map_type;
-
- /* initialize map_defaults from [global] */
- cfm->cfm_defaults = gopt.map_defaults;
-
- /* initialize map_opts from [global] */
- cfm->cfm_opts = gopt.map_options;
-
- /* initialize search_path from [global] */
- cfm->cfm_search_path = gopt.search_path;
-
- /*
- * Initialize flags that are common both to [global] and a local map.
- */
- cfm->cfm_flags = gopt.flags & (CFM_BROWSABLE_DIRS |
- CFM_BROWSABLE_DIRS_FULL |
- CFM_MOUNT_TYPE_AUTOFS |
- CFM_SELECTORS_IN_DEFAULTS);
-}
-
-
-/*
- * Process configuration file options (called from YACC parser).
- * Return 0 if OK, 1 otherwise.
- */
-int
-set_conf_kv(const char *section, const char *key, const char *val)
-{
- int ret;
-
-#ifdef DEBUG_CONF
- fprintf(stderr, "set_conf_kv: section=%s, key=%s, val=%s\n",
- section, key, val);
-#endif /* DEBUG_CONF */
-
- /*
- * If global section, process kv pairs one at a time.
- */
- if (STREQ(section, "global")) {
- /*
- * Check if a regular map was configured before "global",
- * and warn about it.
- */
- if (cur_map && cur_map->cfm_dir) {
- static short printed_this_error;
- if (!printed_this_error) {
- fprintf(stderr, "found regular map \"%s\" before global one.\n",
- cur_map->cfm_dir);
- printed_this_error = 1;
- }
- }
-
- /* process the global option first */
- ret = process_global_option(key, val);
-
- /* return status from the processing of the global option */
- return ret;
- }
-
- /*
- * Otherwise we found a non-global option: store it after some testing.
- */
-
- /* initialize (static) global list head and current map pointer */
- if (!head_map && !cur_map) {
- cur_map = CALLOC(cf_map_t);
- if (!cur_map) {
- perror("calloc");
- exit(1);
- }
- /* initialize first head map from global defaults */
- init_cf_map(cur_map);
- head_map = cur_map;
- }
-
- /* check if we found a new map, then allocate and initialize it */
- if (cur_map->cfm_dir && !STREQ(cur_map->cfm_dir, section)) {
- /* allocate new map struct */
- cf_map_t *tmp_map = CALLOC(cf_map_t);
- if (!tmp_map) {
- perror("calloc");
- exit(1);
- }
- /* initialize it from global defaults */
- init_cf_map(tmp_map);
- /* append it to end of linked list */
- cur_map->cfm_next = tmp_map;
- cur_map = tmp_map;
- }
-
- /* now process a single entry of a regular map */
- return process_regular_option(section, key, val, cur_map);
-}
-
-
-/*
- * Process global section of configuration file options.
- * Return 0 upon success, 1 otherwise.
- */
-static int
-process_global_option(const char *key, const char *val)
-{
- struct _func_map *gfp;
-
- /* ensure that val is valid */
- if (!val || val[0] == '\0')
- return 1;
-
- /*
- * search for global function.
- */
- for (gfp = glob_functable; gfp->name; gfp++)
- if (FSTREQ(gfp->name, key))
- return (gfp->func)(val);
-
- fprintf(stderr, "conf: unknown global key: \"%s\"\n", key);
- return 1; /* failed to match any command */
-}
-
-
-static int
-gopt_arch(const char *val)
-{
- gopt.arch = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_auto_attrcache(const char *val)
-{
- gopt.auto_attrcache = atoi(val);
- if (gopt.auto_attrcache < 0) {
- fprintf(stderr, "conf: bad attrcache value: \"%s\"\n", val);
- return 1;
- }
- return 0;
-}
-
-
-static int
-gopt_auto_dir(const char *val)
-{
- gopt.auto_dir = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_autofs_use_lofs(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_AUTOFS_USE_LOFS;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_AUTOFS_USE_LOFS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to autofs_use_lofs \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_browsable_dirs(const char *val)
-{
- if (STREQ(val, "full")) {
- gopt.flags |= CFM_BROWSABLE_DIRS_FULL;
- return 0;
- } else if (STREQ(val, "yes")) {
- gopt.flags |= CFM_BROWSABLE_DIRS;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_BROWSABLE_DIRS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to browsable_dirs \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_cache_duration(const char *val)
-{
- gopt.am_timeo = atoi(val);
- if (gopt.am_timeo <= 0)
- gopt.am_timeo = AM_TTL;
- return 0;
-}
-
-
-static int
-gopt_cluster(const char *val)
-{
- gopt.cluster = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_debug_mtab_file(const char *val)
-{
- gopt.debug_mtab_file = strdup((char*)val);
- return 0;
-}
-
-
-static int
-gopt_debug_options(const char *val)
-{
-#ifdef DEBUG
- usage += debug_option((char *)val);
- return 0;
-#else /* not DEBUG */
- fprintf(stderr, "%s: not compiled with DEBUG option -- sorry.\n",
- am_get_progname());
- return 1;
-#endif /* not DEBUG */
-}
-
-
-static int
-gopt_dismount_interval(const char *val)
-{
- gopt.am_timeo_w = atoi(val);
- if (gopt.am_timeo_w <= 0)
- gopt.am_timeo_w = AM_TTL_W;
- return 0;
-}
-
-
-static int
-gopt_domain_strip(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_DOMAIN_STRIP;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_DOMAIN_STRIP;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to domain_strip \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_exec_map_timeout(const char *val)
-{
- gopt.exec_map_timeout = atoi(val);
- if (gopt.exec_map_timeout <= 0)
- gopt.exec_map_timeout = AMFS_EXEC_MAP_TIMEOUT; /* default exec map timeout */
- return 0;
-}
-
-
-static int
-gopt_forced_unmounts(const char *val)
-{
- if (STREQ(val, "yes")) {
-#if !defined(MNT2_GEN_OPT_DETACH) && !defined(MNT2_GEN_OPT_FORCE)
- fprintf(stderr, "conf: forced_unmounts unsupported on this system.\n");
- return 1;
-#else /* defined(MNT2_GEN_OPT_DETACH) || defined(MNT2_GEN_OPT_FORCE) */
-# ifdef __linux__
- /*
- * HACK ALERT: Linux has had MNT_FORCE since 2.2, but it hasn't gotten
- * stable until 2.4. And it had MNT_DETACH since 2.4, but it hasn't
- * gotten stable since 2.6. So alert users if they're trying to use a
- * feature that may not work well on their older kernel.
- */
- {
- struct utsname un;
- if (uname(&un) >= 0) {
-# ifdef MNT2_GEN_OPT_FORCE
- if (strcmp(un.release, "2.4.0") < 0)
- fprintf(stderr, "warning: forced-unmounts (MNT_FORCE) may not work well before 2.4.0\n");
-# endif /* MNT2_GEN_OPT_FORCE */
-# ifdef MNT2_GEN_OPT_DETACH
- if (strcmp(un.release, "2.6.0") < 0)
- fprintf(stderr, "warning: lazy-unmounts (MNT_DETACH) may not work well before 2.6.0\n");
-# endif /* MNT2_GEN_OPT_DETACH */
- }
- }
-# endif /* __linux__ */
- gopt.flags |= CFM_FORCED_UNMOUNTS;
- return 0;
-#endif /* defined(MNT2_GEN_OPT_DETACH) || defined(MNT2_GEN_OPT_FORCE) */
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_FORCED_UNMOUNTS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to unmount_on_exit \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_full_os(const char *val)
-{
- gopt.op_sys_full = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_fully_qualified_hosts(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_FULLY_QUALIFIED_HOSTS;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_FULLY_QUALIFIED_HOSTS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to fully_qualified_hosts \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_hesiod_base(const char *val)
-{
-#ifdef HAVE_MAP_HESIOD
- gopt.hesiod_base = strdup((char *)val);
- return 0;
-#else /* not HAVE_MAP_HESIOD */
- fprintf(stderr, "conf: hesiod_base option ignored. No Hesiod support available.\n");
- return 1;
-#endif /* not HAVE_MAP_HESIOD */
-}
-
-
-static int
-gopt_karch(const char *val)
-{
- gopt.karch = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_pid_file(const char *val)
-{
- gopt.pid_file = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_local_domain(const char *val)
-{
- gopt.sub_domain = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_localhost_address(const char *val)
-{
- gopt.localhost_address = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_ldap_base(const char *val)
-{
-#ifdef HAVE_MAP_LDAP
- gopt.ldap_base = strdup((char *)val);
- return 0;
-#else /* not HAVE_MAP_LDAP */
- fprintf(stderr, "conf: ldap_base option ignored. No LDAP support available.\n");
- return 1;
-#endif /* not HAVE_MAP_LDAP */
-}
-
-
-static int
-gopt_ldap_cache_seconds(const char *val)
-{
-#ifdef HAVE_MAP_LDAP
- char *end;
-
- gopt.ldap_cache_seconds = strtol((char *)val, &end, 10);
- if (end == val) {
- fprintf(stderr, "conf: bad LDAP cache (seconds) option: %s\n",val);
- return 1;
- }
- return 0;
-#else /* not HAVE_MAP_LDAP */
- fprintf(stderr, "conf: ldap_cache_seconds option ignored. No LDAP support available.\n");
- return 1;
-#endif /* not HAVE_MAP_LDAP */
-}
-
-
-static int
-gopt_ldap_cache_maxmem(const char *val)
-{
-#ifdef HAVE_MAP_LDAP
- char *end;
-
- gopt.ldap_cache_maxmem = strtol((char *)val, &end, 10);
- if (end == val) {
- fprintf(stderr, "conf: bad LDAP cache (maxmem) option: %s\n",val);
- return 1;
- }
- return 0;
-#else /* not HAVE_MAP_LDAP */
- fprintf(stderr, "conf: ldap_cache_maxmem option ignored. No LDAP support available.\n");
- return 1;
-#endif /* not HAVE_MAP_LDAP */
-}
-
-
-static int
-gopt_ldap_hostports(const char *val)
-{
-#ifdef HAVE_MAP_LDAP
- gopt.ldap_hostports = strdup((char *)val);
- return 0;
-#else /* not HAVE_MAP_LDAP */
- fprintf(stderr, "conf: ldap_hostports option ignored. No LDAP support available.\n");
- return 1;
-#endif /* not HAVE_MAP_LDAP */
-
-}
-
-
-static int
-gopt_ldap_proto_version(const char *val)
-{
-#ifdef HAVE_MAP_LDAP
- char *end;
-
- gopt.ldap_proto_version = strtol((char *)val, &end, 10);
- if (end == val) {
- fprintf(stderr, "conf: bad ldap_proto_version option: %s\n",val);
- return 1;
- }
-
- if (gopt.ldap_proto_version < 0 || gopt.ldap_proto_version > LDAP_VERSION_MAX) {
- fprintf(stderr, "conf: bad ldap_proto_version option value: %s\n",val);
- return 1;
- }
- switch (gopt.ldap_proto_version) {
- /* XXX: what about LDAP_VERSION1? */
- case LDAP_VERSION2:
-#ifdef LDAP_VERSION3
- case LDAP_VERSION3:
-#endif /* LDAP_VERSION3 */
-#ifdef LDAP_VERSION4
- case LDAP_VERSION4:
-#endif /* LDAP_VERSION4 */
- break;
- default:
- fprintf(stderr, "conf: unsupported ldap_proto_version option value: %s\n",val);
- return 1;
- }
- return 0;
-#else /* not HAVE_MAP_LDAP */
- fprintf(stderr, "conf: ldap_proto_version option ignored. No LDAP support available.\n");
- return 1;
-#endif /* not HAVE_MAP_LDAP */
-}
-
-
-static int
-gopt_log_file(const char *val)
-{
- gopt.logfile = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_log_options(const char *val)
-{
- usage += switch_option((char *)val);
- return 0;
-}
-
-
-static int
-gopt_map_defaults(const char *val)
-{
- gopt.map_defaults = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_map_options(const char *val)
-{
- gopt.map_options = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_map_reload_interval(const char *val)
-{
- gopt.map_reload_interval = atoi(val);
- if (gopt.map_reload_interval <= 0)
- gopt.map_reload_interval = ONE_HOUR;
- return 0;
-}
-
-
-static int
-gopt_map_type(const char *val)
-{
- /* check if map type exist */
- if (!mapc_type_exists(val)) {
- fprintf(stderr, "conf: no such map type \"%s\"\n", val);
- return 1;
- }
- gopt.map_type = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_mount_type(const char *val)
-{
- if (STREQ(val, "autofs")) {
-#ifdef HAVE_FS_AUTOFS
- gopt.flags |= CFM_MOUNT_TYPE_AUTOFS;
- amd_use_autofs++;
- return 0;
-#else /* not HAVE_FS_AUTOFS */
- fprintf(stderr, "conf: no autofs support available\n");
- return 1;
-#endif /* not HAVE_FS_AUTOFS */
- } else if (STREQ(val, "nfs")) {
- gopt.flags &= ~CFM_MOUNT_TYPE_AUTOFS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to mount_type \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_portmap_program(const char *val)
-{
- gopt.portmap_program = atol(val);
- /*
- * allow alternate program numbers to be no more than 10 offset from
- * official amd program number (300019).
- */
- if (gopt.portmap_program < AMQ_PROGRAM ||
- gopt.portmap_program > AMQ_PROGRAM + 10) {
- gopt.portmap_program = AMQ_PROGRAM;
- set_amd_program_number(gopt.portmap_program);
- fprintf(stderr, "conf: illegal amd program number \"%s\"\n", val);
- return 1;
- }
-
- set_amd_program_number(gopt.portmap_program);
- return 0; /* all is OK */
-}
-
-
-static int
-gopt_preferred_amq_port(const char *val)
-{
- gopt.preferred_amq_port = atoi(val);
-
- /*
- * No need to check value: preferred_amq_port is an unsigned short and 0
- * is a valid number, meaning "any port".
- */
- return 0; /* all is OK */
-}
-
-
-static int
-gopt_nfs_allow_any_interface(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_NFS_ANY_INTERFACE;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_NFS_ANY_INTERFACE;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to nfs_allow_insecure_port \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_nfs_allow_insecure_port(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_NFS_INSECURE_PORT;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_NFS_INSECURE_PORT;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to nfs_allow_insecure_port \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_nfs_proto(const char *val)
-{
- if (STREQ(val, "udp") || STREQ(val, "tcp")) {
- gopt.nfs_proto = strdup((char *)val);
- return 0;
- }
- fprintf(stderr, "conf: illegal nfs_proto \"%s\"\n", val);
- return 1;
-}
-
-
-static int
-gopt_nfs_retransmit_counter(const char *val)
-{
- int i;
-
- for (i=0; i<AMU_TYPE_MAX; ++i)
- gopt.amfs_auto_retrans[i] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retransmit_counter_udp(const char *val)
-{
- gopt.amfs_auto_retrans[AMU_TYPE_UDP] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retransmit_counter_tcp(const char *val)
-{
- gopt.amfs_auto_retrans[AMU_TYPE_TCP] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retransmit_counter_toplvl(const char *val)
-{
- gopt.amfs_auto_retrans[AMU_TYPE_TOPLVL] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retry_interval(const char *val)
-{
- int i;
-
- for (i=0; i<AMU_TYPE_MAX; ++i)
- gopt.amfs_auto_timeo[i] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retry_interval_udp(const char *val)
-{
- gopt.amfs_auto_timeo[AMU_TYPE_UDP] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retry_interval_tcp(const char *val)
-{
- gopt.amfs_auto_timeo[AMU_TYPE_TCP] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_retry_interval_toplvl(const char *val)
-{
- gopt.amfs_auto_timeo[AMU_TYPE_TOPLVL] = atoi(val);
- return 0;
-}
-
-
-static int
-gopt_nfs_vers(const char *val)
-{
- int i = atoi(val);
-
- if (i == 2 || i == 3) {
- gopt.nfs_vers = i;
- return 0;
- }
- fprintf(stderr, "conf: illegal nfs_vers \"%s\"\n", val);
- return 1;
-}
-
-
-static int
-gopt_nis_domain(const char *val)
-{
-#ifdef HAVE_MAP_NIS
- gopt.nis_domain = strdup((char *)val);
- return 0;
-#else /* not HAVE_MAP_NIS */
- fprintf(stderr, "conf: nis_domain option ignored. No NIS support available.\n");
- return 1;
-#endif /* not HAVE_MAP_NIS */
-}
-
-
-static int
-gopt_normalize_hostnames(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_NORMALIZE_HOSTNAMES;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_NORMALIZE_HOSTNAMES;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to normalize_hostnames \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_normalize_slashes(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_NORMALIZE_SLASHES;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_NORMALIZE_SLASHES;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to normalize_slashes \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_os(const char *val)
-{
- gopt.op_sys = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_osver(const char *val)
-{
- gopt.op_sys_ver = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_plock(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_PROCESS_LOCK;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_PROCESS_LOCK;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to plock \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_print_pid(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_PRINT_PID;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_PRINT_PID;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to print_pid \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_print_version(const char *val)
-{
- if (STREQ(val, "yes")) {
- char *vers = get_version_string();
- fputs(vers, stderr);
- XFREE(vers);
- return 0;
- } else if (STREQ(val, "no")) {
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to print_version \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_restart_mounts(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_RESTART_EXISTING_MOUNTS;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_RESTART_EXISTING_MOUNTS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to restart_mounts \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_search_path(const char *val)
-{
- gopt.search_path = strdup((char *)val);
- return 0;
-}
-
-
-static int
-gopt_selectors_in_defaults(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_SELECTORS_IN_DEFAULTS;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_SELECTORS_IN_DEFAULTS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to enable_default_selectors \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_show_statfs_entries(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_SHOW_STATFS_ENTRIES;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_SHOW_STATFS_ENTRIES;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to show_statfs_entries \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_truncate_log(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_TRUNCATE_LOG;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_TRUNCATE_LOG;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to truncate_log \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_unmount_on_exit(const char *val)
-{
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_UNMOUNT_ON_EXIT;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_UNMOUNT_ON_EXIT;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to unmount_on_exit \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_use_tcpwrappers(const char *val)
-{
-#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP)
- if (STREQ(val, "yes")) {
- gopt.flags |= CFM_USE_TCPWRAPPERS;
- return 0;
- } else if (STREQ(val, "no")) {
- gopt.flags &= ~CFM_USE_TCPWRAPPERS;
- return 0;
- }
-#else /* not defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
- fprintf(stderr, "conf: no tcpd/libwrap support available\n");
- return 1;
-#endif /* not defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
-
- fprintf(stderr, "conf: unknown value to use_tcpwrappers \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-gopt_vendor(const char *val)
-{
- gopt.op_sys_vendor = strdup((char *)val);
- return 0;
-}
-
-
-/*
- * Collect one entry for a regular map
- */
-static int
-process_regular_option(const char *section, const char *key, const char *val, cf_map_t *cfm)
-{
- /* ensure that val is valid */
- if (!section || section[0] == '\0' ||
- !key || key[0] == '\0' ||
- !val || val[0] == '\0' ||
- !cfm) {
- fprintf(stderr, "conf: process_regular_option: null entries\n");
- return 1;
- }
-
- /* check if initializing a new map */
- if (!cfm->cfm_dir)
- cfm->cfm_dir = strdup((char *)section);
-
- /* check for each possible field */
- if (STREQ(key, "browsable_dirs"))
- return ropt_browsable_dirs(val, cfm);
-
- if (STREQ(key, "map_name"))
- return ropt_map_name(val, cfm);
-
- if (STREQ(key, "map_defaults"))
- return ropt_map_defaults(val, cfm);
-
- if (STREQ(key, "map_options"))
- return ropt_map_options(val, cfm);
-
- if (STREQ(key, "map_type"))
- return ropt_map_type(val, cfm);
-
- if (STREQ(key, "mount_type"))
- return ropt_mount_type(val, cfm);
-
- if (STREQ(key, "search_path"))
- return ropt_search_path(val, cfm);
-
- if (STREQ(key, "tag"))
- return ropt_tag(val, cfm);
-
- fprintf(stderr, "conf: unknown regular key \"%s\" for section \"%s\"\n",
- key, section);
- return 1; /* failed to match any command */
-}
-
-
-static int
-ropt_browsable_dirs(const char *val, cf_map_t *cfm)
-{
- if (STREQ(val, "full")) {
- cfm->cfm_flags |= CFM_BROWSABLE_DIRS_FULL;
- return 0;
- } else if (STREQ(val, "yes")) {
- cfm->cfm_flags |= CFM_BROWSABLE_DIRS;
- return 0;
- } else if (STREQ(val, "no")) {
- cfm->cfm_flags &= ~CFM_BROWSABLE_DIRS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to browsable_dirs \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-ropt_map_name(const char *val, cf_map_t *cfm)
-{
- cfm->cfm_name = strdup((char *)val);
- return 0;
-}
-
-
-static int
-ropt_map_defaults(const char *val, cf_map_t *cfm)
-{
- cfm->cfm_defaults = strdup((char *)val);
- return 0;
-}
-
-
-static int
-ropt_map_options(const char *val, cf_map_t *cfm)
-{
- cfm->cfm_opts = strdup((char *)val);
- return 0;
-}
-
-
-static int
-ropt_map_type(const char *val, cf_map_t *cfm)
-{
- /* check if map type exist */
- if (!mapc_type_exists(val)) {
- fprintf(stderr, "conf: no such map type \"%s\"\n", val);
- return 1;
- }
- cfm->cfm_type = strdup((char *)val);
- return 0;
-}
-
-
-static int
-ropt_mount_type(const char *val, cf_map_t *cfm)
-{
- if (STREQ(val, "autofs")) {
-#ifdef HAVE_FS_AUTOFS
- cfm->cfm_flags |= CFM_MOUNT_TYPE_AUTOFS;
- amd_use_autofs++;
- return 0;
-#else /* not HAVE_FS_AUTOFS */
- fprintf(stderr, "conf: no autofs support available\n");
- return 1;
-#endif /* not HAVE_FS_AUTOFS */
- } else if (STREQ(val, "nfs")) {
- cfm->cfm_flags &= ~CFM_MOUNT_TYPE_AUTOFS;
- return 0;
- }
-
- fprintf(stderr, "conf: unknown value to mount_type \"%s\"\n", val);
- return 1; /* unknown value */
-}
-
-
-static int
-ropt_search_path(const char *val, cf_map_t *cfm)
-{
- cfm->cfm_search_path = strdup((char *)val);
- return 0;
-}
-
-
-static int
-ropt_tag(const char *val, cf_map_t *cfm)
-{
- cfm->cfm_tag = strdup((char *)val);
- return 0;
-}
-
-
-/*
- * Process one collected map.
- */
-static int
-process_one_regular_map(const cf_map_t *cfm)
-{
- if (!cfm->cfm_name) {
- fprintf(stderr, "conf: map_name must be defined for map \"%s\"\n", cfm->cfm_dir);
- return 1;
- }
- /*
- * If map has no tag defined, process the map.
- * If no conf_tag was set in amd -T, process all untagged entries.
- * If a tag is defined, then process it only if it matches the map tag.
- */
- if (!cfm->cfm_tag ||
- (conf_tag && STREQ(cfm->cfm_tag, conf_tag))) {
-#ifdef DEBUG_CONF
- fprintf(stderr, "processing map %s (flags=0x%x)...\n",
- cfm->cfm_dir, cfm->cfm_flags);
-#endif /* DEBUG_CONF */
- root_newmap(cfm->cfm_dir,
- cfm->cfm_opts ? cfm->cfm_opts : "",
- cfm->cfm_name,
- cfm);
- } else {
- fprintf(stderr, "skipping map %s...\n", cfm->cfm_dir);
- }
-
- return 0;
-}
-
-
-/*
- * Process all regular maps in conf file (if any)
- */
-int
-process_all_regular_maps(void)
-{
- cf_map_t *tmp_map = head_map;
-
- /*
- * If the amd.conf file only has a [global] section (pretty useless
- * IMHO), there's nothing to process
- */
- if (!tmp_map)
- return 0;
-
- while (tmp_map) {
- if (process_one_regular_map(tmp_map) != 0)
- return 1;
- tmp_map = tmp_map->cfm_next;
- }
- return 0;
-}
-
-
-/*
- * Find a cf_map_t for a given map name.
- * Return NULL if not found.
- */
-cf_map_t *
-find_cf_map(const char *name)
-{
-
- cf_map_t *tmp_map = head_map;
-
- if (!tmp_map || !name)
- return NULL;
-
- while (tmp_map) {
- if (STREQ(tmp_map->cfm_dir,name)) {
- return tmp_map;
- }
- tmp_map = tmp_map->cfm_next;
- }
- return NULL;
-}
diff --git a/contrib/amd/amd/conf_parse.y b/contrib/amd/amd/conf_parse.y
deleted file mode 100644
index b397b0573242..000000000000
--- a/contrib/amd/amd/conf_parse.y
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/conf_parse.y
- *
- */
-
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-extern char *yytext;
-extern int ayylineno;
-extern int yylex(void);
-
-static int yyerror(const char *s);
-static int retval;
-static char *header_section = NULL; /* start with no header section */
-
-#define YYDEBUG 1
-
-#define PARSE_DEBUG 0
-
-#if PARSE_DEBUG
-# define dprintf(f,s) fprintf(stderr, (f), ayylineno, (s))
-# define amu_return(v)
-#else /* not PARSE_DEBUG */
-# define dprintf(f,s)
-# define amu_return(v) return((v))
-#endif /* not PARSE_DEBUG */
-
-%}
-
-%union {
-char *strtype;
-}
-
-%token LEFT_BRACKET RIGHT_BRACKET EQUAL
-%token NEWLINE
-%token <strtype> NONWS_STRING
-%token <strtype> NONWSEQ_STRING
-%token <strtype> QUOTED_NONWSEQ_STRING
-
-%start file
-%%
-
-/****************************************************************************/
-file : { yydebug = PARSE_DEBUG; } newlines map_sections
- | { yydebug = PARSE_DEBUG; } map_sections
- ;
-
-newlines : NEWLINE
- | NEWLINE newlines
- ;
-
-map_sections : map_section
- | map_section map_sections
- ;
-
-map_section : sec_header kv_pairs
- ;
-
-sec_header : LEFT_BRACKET NONWS_STRING RIGHT_BRACKET NEWLINE
- {
- if (yydebug)
- fprintf(stderr, "sec_header1 = \"%s\"\n", $2);
- header_section = $2;
- }
- ;
-
-kv_pairs : kv_pair
- | kv_pair kv_pairs
- ;
-
-kv_pair : NONWS_STRING EQUAL NONWS_STRING NEWLINE
- {
- if (yydebug)
- fprintf(stderr,"parse1: key=\"%s\", val=\"%s\"\n", $1, $3);
- retval = set_conf_kv(header_section, $1, $3);
- if (retval != 0) {
- yyerror("syntax error");
- YYABORT;
- }
- }
- | NONWS_STRING EQUAL NONWSEQ_STRING NEWLINE
- {
- if (yydebug)
- fprintf(stderr,"parse2: key=\"%s\", val=\"%s\"\n", $1, $3);
- retval = set_conf_kv(header_section, $1, $3);
- if (retval != 0) {
- yyerror("syntax error");
- YYABORT;
- }
- }
- | NONWS_STRING EQUAL QUOTED_NONWSEQ_STRING NEWLINE
- {
- if (yydebug)
- fprintf(stderr,"parse3: key=\"%s\", val=\"%s\"\n", $1, $3);
- retval = set_conf_kv(header_section, $1, $3);
- if (retval != 0) {
- yyerror("syntax error");
- YYABORT;
- }
- }
- | NEWLINE
- ;
-
-/****************************************************************************/
-%%
-
-static int
-yyerror(const char *s)
-{
- fprintf(stderr, "AMDCONF: %s on line %d (section %s)\n",
- s, ayylineno,
- (header_section ? header_section : "null"));
- exit(1);
- return 1; /* to full compilers that insist on a return statement */
-}
diff --git a/contrib/amd/amd/conf_tok.l b/contrib/amd/amd/conf_tok.l
deleted file mode 100644
index b572e4d7d5a3..000000000000
--- a/contrib/amd/amd/conf_tok.l
+++ /dev/null
@@ -1,192 +0,0 @@
-%{
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/conf_tok.l
- *
- */
-
-/*
- * Lexical analyzer for AMD configuration parser.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-/*
- * Some systems include a definition for the macro ECHO in <sys/ioctl.h>,
- * and their (bad) version of lex defines it too at the very beginning of
- * the generated lex.yy.c file (before it can be easily undefined),
- * resulting in a conflict. So undefine it here before needed.
- * Luckily, it does not appear that this macro is actually used in the rest
- * of the generated lex.yy.c file.
- */
-#ifdef ECHO
-# undef ECHO
-#endif /* ECHO */
-#include <am_defs.h>
-#include <amd.h>
-#include <conf_parse.h>
-/* and once again undefine this, just in case */
-#ifdef ECHO
-# undef ECHO
-#endif /* ECHO */
-
-/*
- * There are some things that need to be defined only if using GNU flex.
- * These must not be defined if using standard lex
- */
-#ifdef FLEX_SCANNER
-# ifndef ECHO
-# define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-# endif /* not ECHO */
-#endif /* FLEX_SCANNER */
-
-int ayylineno = 0;
-
-int yylex(void);
-/*
- * some systems such as DU-4.x have a different GNU flex in /usr/bin
- * which automatically generates yywrap macros and symbols. So I must
- * distinguish between them and when yywrap is actually needed.
- */
-#ifndef yywrap
-int yywrap(void);
-#endif /* not yywrap */
-
-#define TOK_DEBUG 0
-
-#if TOK_DEBUG
-# define dprintf(f,s) fprintf(stderr, (f), ayylineno, (s))
-# define amu_return(v)
-#else /* not TOK_DEBUG */
-# define dprintf(f,s)
-# define amu_return(v) return((v))
-#endif /* not TOK_DEBUG */
-
-/* no need to use yywrap() */
-#define YY_SKIP_YYWRAP
-
-%}
-
-/* This option causes Solaris lex to fail. Use flex. See BUGS file */
-/* no need to use yyunput() */
-%option nounput
-
-/* allocate more output slots so lex scanners don't run out of mem */
-%o 1024
-
-DIGIT [0-9]
-ALPHA [A-Za-z]
-ALPHANUM [A-Za-z0-9]
-SYMBOL [A-Za-z0-9_-]
-PATH [A-Za-z0-9_-/]
-NONWSCHAR [^ \t\n\[\]=]
-NONWSEQCHAR [^ \t\n\[\]]
-NONNL [^\n]
-NONQUOTE [^\"]
-
-%%
-
-\n {
- ayylineno++;
- amu_return(NEWLINE);
- }
-
-\[ {
- dprintf("%8d: Left bracket \"%s\"\n", yytext);
- yylval.strtype = strdup((char *)yytext);
- amu_return(LEFT_BRACKET);
- }
-
-\] {
- dprintf("%8d: Right bracket \"%s\"\n", yytext);
- yylval.strtype = strdup((char *)yytext);
- amu_return(RIGHT_BRACKET);
- }
-
-= {
- dprintf("%8d: Equal \"%s\"\n", yytext);
- yylval.strtype = strdup((char *)yytext);
- amu_return(EQUAL);
- }
-
-[ \t]* {
- dprintf("%8d: Whitespace \"%s\"\n", yytext);
- }
-"#"[^\n]*\n {
- /* a comment line includes the terminating \n */
- ayylineno++;
- yytext[strlen((char *)yytext)-1] = '\0';
- dprintf("%8d: Comment \"%s\"\n", yytext);
- }
-
-{NONWSCHAR}{NONWSCHAR}* {
- dprintf("%8d: Non-WS string \"%s\"\n", yytext);
- yylval.strtype = strdup((char *)yytext);
- amu_return(NONWS_STRING);
- }
-
-\"{NONQUOTE}{NONQUOTE}*\" {
- dprintf("%8d: QUOTED-Non-WS-EQ string \"%s\"\n", yytext);
- /* must strip quotes */
- yytext[strlen((char *)yytext)-1] = '\0';
- yylval.strtype = strdup((char *)&yytext[1]);
- amu_return(QUOTED_NONWSEQ_STRING);
- }
-
-{NONWSEQCHAR}{NONWSEQCHAR}* {
- dprintf("%8d: Non-WS-EQ string \"%s\"\n", yytext);
- yylval.strtype = strdup((char *)yytext);
- amu_return(NONWSEQ_STRING);
- }
-
-%%
-
-/*
- * some systems such as DU-4.x have a different GNU flex in /usr/bin
- * which automatically generates yywrap macros and symbols. So I must
- * distinguish between them and when yywrap is actually needed.
- */
-#ifndef yywrap
-int yywrap(void)
-{
- return 1;
-}
-#endif /* not yywrap */
diff --git a/contrib/amd/amd/get_args.c b/contrib/amd/amd/get_args.c
deleted file mode 100644
index 12a7d07efd59..000000000000
--- a/contrib/amd/amd/get_args.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/get_args.c
- *
- */
-
-/*
- * Argument decode
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* include auto-generated version file */
-#include <build_version.h>
-
-char *amu_conf_file = "/etc/amd.conf"; /* default amd configuration file */
-char *conf_tag = NULL; /* default conf file tags to use */
-int usage = 0;
-int use_conf_file = 0; /* default don't use amd.conf file */
-char *mnttab_file_name = NULL; /* symbol must be available always */
-
-
-/*
- * Return the version string (dynamic buffer)
- */
-char *
-get_version_string(void)
-{
- char *vers = NULL;
- char tmpbuf[1024];
- char *wire_buf;
- int wire_buf_len = 0;
- size_t len; /* max allocated length (to avoid buf overflow) */
-
- /*
- * First get dynamic string listing all known networks.
- * This could be a long list, if host has lots of interfaces.
- */
- wire_buf = print_wires();
- if (wire_buf)
- wire_buf_len = strlen(wire_buf);
-
- len = 2048 + wire_buf_len;
- vers = xmalloc(len);
- xsnprintf(vers, len, "%s\n%s\n%s\n%s\n",
- "Copyright (c) 1997-2006 Erez Zadok",
- "Copyright (c) 1990 Jan-Simon Pendry",
- "Copyright (c) 1990 Imperial College of Science, Technology & Medicine",
- "Copyright (c) 1990 The Regents of the University of California.");
- xsnprintf(tmpbuf, sizeof(tmpbuf), "%s version %s (build %d).\n",
- PACKAGE_NAME, PACKAGE_VERSION, AMU_BUILD_VERSION);
- strlcat(vers, tmpbuf, len);
- xsnprintf(tmpbuf, sizeof(tmpbuf), "Report bugs to %s.\n", PACKAGE_BUGREPORT);
- strlcat(vers, tmpbuf, len);
- xsnprintf(tmpbuf, sizeof(tmpbuf), "Configured by %s@%s on date %s.\n",
- USER_NAME, HOST_NAME, CONFIG_DATE);
- strlcat(vers, tmpbuf, len);
- xsnprintf(tmpbuf, sizeof(tmpbuf), "Built by %s@%s on date %s.\n",
- BUILD_USER, BUILD_HOST, BUILD_DATE);
- strlcat(vers, tmpbuf, len);
- xsnprintf(tmpbuf, sizeof(tmpbuf), "cpu=%s (%s-endian), arch=%s, karch=%s.\n",
- cpu, endian, gopt.arch, gopt.karch);
- strlcat(vers, tmpbuf, len);
- xsnprintf(tmpbuf, sizeof(tmpbuf), "full_os=%s, os=%s, osver=%s, vendor=%s, distro=%s.\n",
- gopt.op_sys_full, gopt.op_sys, gopt.op_sys_ver, gopt.op_sys_vendor, DISTRO_NAME);
- strlcat(vers, tmpbuf, len);
- xsnprintf(tmpbuf, sizeof(tmpbuf), "domain=%s, host=%s, hostd=%s.\n",
- hostdomain, am_get_hostname(), hostd);
- strlcat(vers, tmpbuf, len);
-
- strlcat(vers, "Map support for: ", len);
- mapc_showtypes(tmpbuf, sizeof(tmpbuf));
- strlcat(vers, tmpbuf, len);
- strlcat(vers, ".\nAMFS: ", len);
- ops_showamfstypes(tmpbuf, sizeof(tmpbuf));
- strlcat(vers, tmpbuf, len);
- strlcat(vers, ", inherit.\nFS: ", len); /* hack: "show" that we support type:=inherit */
- ops_showfstypes(tmpbuf, sizeof(tmpbuf));
- strlcat(vers, tmpbuf, len);
-
- /* append list of networks if available */
- if (wire_buf) {
- strlcat(vers, wire_buf, len);
- XFREE(wire_buf);
- }
-
- return vers;
-}
-
-
-static void
-show_usage(void)
-{
- fprintf(stderr,
- "Usage: %s [-nprvHS] [-a mount_point] [-c cache_time] [-d domain]\n\
-\t[-k kernel_arch] [-l logfile%s\n\
-\t[-t timeout.retrans] [-w wait_timeout] [-A arch] [-C cluster_name]\n\
-\t[-o op_sys_ver] [-O op_sys_name]\n\
-\t[-F conf_file] [-T conf_tag]", am_get_progname(),
-#ifdef HAVE_SYSLOG
-# ifdef LOG_DAEMON
- "|\"syslog[:facility]\"]"
-# else /* not LOG_DAEMON */
- "|\"syslog\"]"
-# endif /* not LOG_DAEMON */
-#else /* not HAVE_SYSLOG */
- "]"
-#endif /* not HAVE_SYSLOG */
- );
-
-#ifdef HAVE_MAP_NIS
- fputs(" [-y nis-domain]\n", stderr);
-#else /* not HAVE_MAP_NIS */
- fputc('\n', stderr);
-#endif /* HAVE_MAP_NIS */
-
- show_opts('x', xlog_opt);
-#ifdef DEBUG
- show_opts('D', dbg_opt);
-#endif /* DEBUG */
- fprintf(stderr, "\t[directory mapname [-map_options]] ...\n");
-}
-
-
-void
-get_args(int argc, char *argv[])
-{
- int opt_ch, i;
- FILE *fp = stdin;
- char getopt_arguments[] = "+nprvSa:c:d:k:l:o:t:w:x:y:C:D:F:T:O:HA:";
- char *getopt_args;
- int print_version = 0; /* 1 means we should print version info */
-
-#ifdef HAVE_GNU_GETOPT
- getopt_args = getopt_arguments;
-#else /* ! HAVE_GNU_GETOPT */
- getopt_args = &getopt_arguments[1];
-#endif /* HAVE_GNU_GETOPT */
-
- /* if no arguments were passed, try to use /etc/amd.conf file */
- if (argc <= 1)
- use_conf_file = 1;
-
- while ((opt_ch = getopt(argc, argv, getopt_args)) != -1)
- switch (opt_ch) {
-
- case 'a':
- if (*optarg != '/') {
- fprintf(stderr, "%s: -a option must begin with a '/'\n",
- am_get_progname());
- exit(1);
- }
- gopt.auto_dir = optarg;
- break;
-
- case 'c':
- gopt.am_timeo = atoi(optarg);
- if (gopt.am_timeo <= 0)
- gopt.am_timeo = AM_TTL;
- break;
-
- case 'd':
- gopt.sub_domain = optarg;
- break;
-
- case 'k':
- gopt.karch = optarg;
- break;
-
- case 'l':
- gopt.logfile = optarg;
- break;
-
- case 'n':
- gopt.flags |= CFM_NORMALIZE_HOSTNAMES;
- break;
-
- case 'o':
- gopt.op_sys_ver = optarg;
- break;
-
- case 'p':
- gopt.flags |= CFM_PRINT_PID;
- break;
-
- case 'r':
- gopt.flags |= CFM_RESTART_EXISTING_MOUNTS;
- break;
-
- case 't':
- /* timeo.retrans (also affects toplvl mounts) */
- {
- char *dot = strchr(optarg, '.');
- int i;
- if (dot)
- *dot = '\0';
- if (*optarg) {
- for (i=0; i<AMU_TYPE_MAX; ++i)
- gopt.amfs_auto_timeo[i] = atoi(optarg);
- }
- if (dot) {
- for (i=0; i<AMU_TYPE_MAX; ++i)
- gopt.amfs_auto_retrans[i] = atoi(dot + 1);
- *dot = '.';
- }
- }
- break;
-
- case 'v':
- /*
- * defer to print version info after every variable had been
- * initialized.
- */
- print_version++;
- break;
-
- case 'w':
- gopt.am_timeo_w = atoi(optarg);
- if (gopt.am_timeo_w <= 0)
- gopt.am_timeo_w = AM_TTL_W;
- break;
-
- case 'x':
- usage += switch_option(optarg);
- break;
-
- case 'y':
-#ifdef HAVE_MAP_NIS
- gopt.nis_domain = optarg;
-#else /* not HAVE_MAP_NIS */
- plog(XLOG_USER, "-y: option ignored. No NIS support available.");
-#endif /* not HAVE_MAP_NIS */
- break;
-
- case 'A':
- gopt.arch = optarg;
- break;
-
- case 'C':
- gopt.cluster = optarg;
- break;
-
- case 'D':
-#ifdef DEBUG
- usage += debug_option(optarg);
-#else /* not DEBUG */
- fprintf(stderr, "%s: not compiled with DEBUG option -- sorry.\n",
- am_get_progname());
-#endif /* not DEBUG */
- break;
-
- case 'F':
- amu_conf_file = optarg;
- use_conf_file = 1;
- break;
-
- case 'H':
- show_usage();
- exit(1);
- break;
-
- case 'O':
- gopt.op_sys = optarg;
- break;
-
- case 'S':
- gopt.flags &= ~CFM_PROCESS_LOCK; /* turn process locking off */
- break;
-
- case 'T':
- conf_tag = optarg;
- break;
-
- default:
- usage = 1;
- break;
- }
-
- /*
- * amd.conf file: if not command-line arguments were used, or if -F was
- * specified, then use that amd.conf file. If the file cannot be opened,
- * abort amd. If it can be found, open it, parse it, and then close it.
- */
- if (use_conf_file && amu_conf_file) {
- fp = fopen(amu_conf_file, "r");
- if (!fp) {
- char buf[128];
- xsnprintf(buf, sizeof(buf), "Amd configuration file (%s)",
- amu_conf_file);
- perror(buf);
- exit(1);
- }
- yyin = fp;
- yyparse();
- fclose(fp);
- if (process_all_regular_maps() != 0)
- exit(1);
- }
-
- /* make sure there are some default options defined */
- if (xlog_level_init == ~0) {
- switch_option("");
- }
-#ifdef DEBUG
- usage += switch_option("debug");
-#endif /* DEBUG */
-
- /* log information regarding amd.conf file */
- if (use_conf_file && amu_conf_file)
- plog(XLOG_INFO, "using configuration file %s", amu_conf_file);
-
-#ifdef HAVE_MAP_LDAP
- /* ensure that if ldap_base is specified, that also ldap_hostports is */
- if (gopt.ldap_hostports && !gopt.ldap_base) {
- fprintf(stderr, "must specify both ldap_hostports and ldap_base\n");
- exit(1);
- }
-#endif /* HAVE_MAP_LDAP */
-
- if (usage) {
- show_usage();
- exit(1);
- }
-
- while (optind <= argc - 2) {
- char *dir = argv[optind++];
- char *map = argv[optind++];
- char *opts = "";
- if (argv[optind] && *argv[optind] == '-')
- opts = &argv[optind++][1];
-
- root_newmap(dir, opts, map, NULL);
- }
-
- if (optind == argc) {
- /*
- * Append domain name to hostname.
- * sub_domain overrides hostdomain
- * if given.
- */
- if (gopt.sub_domain)
- hostdomain = gopt.sub_domain;
- if (*hostdomain == '.')
- hostdomain++;
- xstrlcat(hostd, ".", sizeof(hostd));
- xstrlcat(hostd, hostdomain, sizeof(hostd));
-
-#ifdef MOUNT_TABLE_ON_FILE
- if (amuDebug(D_MTAB))
- if (gopt.debug_mtab_file)
- mnttab_file_name = gopt.debug_mtab_file; /* user supplied debug mtab path */
- else
- mnttab_file_name = DEBUG_MNTTAB_FILE; /* default debug mtab path */
- else
- mnttab_file_name = MNTTAB_FILE_NAME;
-#else /* not MOUNT_TABLE_ON_FILE */
- if (amuDebug(D_MTAB))
- dlog("-D mtab option ignored");
-# ifdef MNTTAB_FILE_NAME
- mnttab_file_name = MNTTAB_FILE_NAME;
-# endif /* MNTTAB_FILE_NAME */
-#endif /* not MOUNT_TABLE_ON_FILE */
-
- /*
- * If the kernel architecture was not specified
- * then use the machine architecture.
- */
- if (gopt.karch == NULL)
- gopt.karch = gopt.arch;
-
- if (gopt.cluster == NULL)
- gopt.cluster = hostdomain;
-
- /* sanity checking, normalize values just in case (toplvl too) */
- for (i=0; i<AMU_TYPE_MAX; ++i) {
- if (gopt.amfs_auto_timeo[i] == 0)
- gopt.amfs_auto_timeo[i] = AMFS_AUTO_TIMEO;
- if (gopt.amfs_auto_retrans[i] == 0)
- gopt.amfs_auto_retrans[i] = AMFS_AUTO_RETRANS(i);
- if (gopt.amfs_auto_retrans[i] == 0)
- gopt.amfs_auto_retrans[i] = 3; /* under very unusual circumstances, could be zero */
- }
- }
-
- /* finally print version string and exit, if asked for */
- if (print_version) {
- fputs(get_version_string(), stderr);
- exit(0);
- }
-
- if (switch_to_logfile(gopt.logfile, orig_umask,
- (gopt.flags & CFM_TRUNCATE_LOG)) != 0)
- plog(XLOG_USER, "Cannot switch logfile");
-
- return;
-}
diff --git a/contrib/amd/amd/info_exec.c b/contrib/amd/amd/info_exec.c
deleted file mode 100644
index 8ccab9aee579..000000000000
--- a/contrib/amd/amd/info_exec.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_exec.c
- *
- */
-
-/*
- * Get info from executable map
- *
- * Original from Erik Kline, 2004.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define MAX_LINE_LEN 1500
-
-/* forward declarations */
-int exec_init(mnt_map *m, char *map, time_t *tp);
-int exec_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp);
-
-
-/*
- * a timed fgets()
- */
-static char *
-fgets_timed(char *s, int size, int rdfd, int secs)
-{
- fd_set fds;
- struct timeval timeo;
- time_t start, now;
- int rval=0, i=0;
-
- if (!s || size < 0 || rdfd < 0)
- return 0;
-
- s[0] = 0;
- if (size == 0)
- return s;
-
- start = clocktime(NULL);
- while (s[i] != '\n' && i < size-1) {
- s[i+1] = 0; /* places the requisite trailing '\0' */
-
- /* ready for reading */
- rval = read(rdfd, (void *)(s+i), 1);
- if (rval == 1) {
- if (s[i] == 0) {
- rval = 0;
- break;
- }
- i++;
- continue;
- } else if (rval == 0) {
- break;
- } else if (rval < 0 && errno != EAGAIN && errno != EINTR) {
- plog(XLOG_WARNING, "fgets_timed read error: %m");
- break;
- }
-
- timeo.tv_usec = 0;
- now = clocktime(NULL) - start;
- if (secs <= 0)
- timeo.tv_sec = 0;
- else if (now < secs)
- timeo.tv_sec = secs - now;
- else {
- /* timed out (now>=secs) */
- plog(XLOG_WARNING, "executable map read timed out (> %d secs)", secs);
- rval = -1;
- break;
- }
-
- FD_ZERO(&fds);
- FD_SET(rdfd, &fds);
-
- rval = select(rdfd+1, &fds, 0, 0, &timeo);
- if (rval < 0) {
- /* error selecting */
- plog(XLOG_WARNING, "fgets_timed select error: %m");
- if (errno == EINTR)
- continue;
- rval = -1;
- break;
- } else if (rval == 0) {
- /* timed out */
- plog(XLOG_WARNING, "executable map read timed out (> %d secs)", secs);
- rval = -1;
- break;
- }
- }
-
- if (rval > 0)
- return s;
-
- close(rdfd);
- return (rval == 0 ? s : 0);
-}
-
-
-static int
-read_line(char *buf, int size, int fd)
-{
- int done = 0;
-
- while (fgets_timed(buf, size, fd, gopt.exec_map_timeout)) {
- int len = strlen(buf);
- done += len;
- if (len > 1 && buf[len - 2] == '\\' &&
- buf[len - 1] == '\n') {
- buf += len - 2;
- size -= len - 2;
- *buf = '\n';
- buf[1] = '\0';
- } else {
- return done;
- }
- }
-
- return done;
-}
-
-
-/*
- * Try to locate a value in a query answer
- */
-static int
-exec_parse_qanswer(int fd, char *map, char *key, char **pval, time_t *tp)
-{
- char qanswer[MAX_LINE_LEN], *dc = 0;
- int chuck = 0;
- int line_no = 0;
-
- while (read_line(qanswer, sizeof(qanswer), fd)) {
- char *cp;
- char *hash;
- int len = strlen(qanswer);
- line_no++;
-
- /*
- * Make sure we got the whole line
- */
- if (qanswer[len - 1] != '\n') {
- plog(XLOG_WARNING, "line %d in \"%s\" is too long", line_no, map);
- chuck = 1;
- } else {
- qanswer[len - 1] = '\0';
- }
-
- /*
- * Strip comments
- */
- hash = strchr(qanswer, '#');
- if (hash)
- *hash = '\0';
-
- /*
- * Find beginning of value (query answer)
- */
- for (cp = qanswer; *cp && !isascii((int)*cp) && !isspace((int)*cp); cp++)
- ;;
-
- /* Ignore blank lines */
- if (!*cp)
- goto again;
-
- /*
- * Return a copy of the data
- */
- dc = strdup(cp);
- *pval = dc;
- dlog("%s returns %s", key, dc);
-
- close(fd);
- return 0;
-
- again:
- /*
- * If the last read didn't get a whole line then
- * throw away the remainder before continuing...
- */
- if (chuck) {
- while (fgets_timed(qanswer, sizeof(qanswer), fd, gopt.exec_map_timeout) &&
- !strchr(qanswer, '\n')) ;
- chuck = 0;
- }
- }
-
- return ENOENT;
-}
-
-
-static int
-set_nonblock(int fd)
-{
- int val;
-
- if (fd < 0)
- return 0;
-
- if ((val = fcntl(fd, F_GETFL, 0)) < 0) {
- plog(XLOG_WARNING, "set_nonblock fcntl F_GETFL error: %m");
- return 0;
- }
-
- val |= O_NONBLOCK;
- if (fcntl(fd, F_SETFL, val) < 0) {
- plog(XLOG_WARNING, "set_nonblock fcntl F_SETFL error: %m");
- return 0;
- }
-
- return 1;
-}
-
-
-static int
-exec_map_open(char *emap, char *key)
-{
- pid_t p1, p2;
- int pdes[2], nullfd, i;
- char *argv[3];
-
- if (!emap)
- return 0;
-
- argv[0] = emap;
- argv[1] = key;
- argv[2] = NULL;
-
- if ((nullfd = open("/dev/null", O_WRONLY|O_NOCTTY)) < 0)
- return -1;
-
- if (pipe(pdes) < 0) {
- close(nullfd);
- return -1;
- }
-
- switch ((p1 = vfork())) {
- case -1:
- /* parent: fork error */
- close(nullfd);
- close(pdes[0]);
- close(pdes[1]);
- return -1;
- case 0:
- /* child #1 */
- p2 = vfork();
- switch (p2) {
- case -1:
- /* child #1: fork error */
- exit(errno);
- case 0:
- /* child #2: init will reap our status */
- if (pdes[1] != STDOUT_FILENO) {
- dup2(pdes[1], STDOUT_FILENO);
- close(pdes[1]);
- }
-
- if (nullfd != STDERR_FILENO) {
- dup2(nullfd, STDERR_FILENO);
- close(nullfd);
- }
-
- for (i=0; i<FD_SETSIZE; i++)
- if (i != STDOUT_FILENO && i != STDERR_FILENO)
- close(i);
-
- /* make the write descriptor non-blocking */
- if (!set_nonblock(STDOUT_FILENO)) {
- close(STDOUT_FILENO);
- exit(-1);
- }
-
- execve(emap, argv, NULL);
- exit(errno); /* in case execve failed */
- }
-
- /* child #1 */
- exit(0);
- }
-
- /* parent */
- close(nullfd);
- close(pdes[1]);
-
- /* anti-zombie insurance */
- while (waitpid(p1,0,0) < 0)
- if (errno != EINTR)
- exit(errno);
-
- /* make the read descriptor non-blocking */
- if (!set_nonblock(pdes[0])) {
- close(pdes[0]);
- return -1;
- }
-
- return pdes[0];
-}
-
-
-/*
- * Check for various permissions on executable map without trying to
- * fork a new executable-map process.
- *
- * return: >0 (errno) if failed
- * 0 if ok
- */
-static int
-exec_check_perm(char *map)
-{
- struct stat sb;
-
- /* sanity and permission checks */
- if (!map) {
- dlog("exec_check_permission got a NULL map");
- return EINVAL;
- }
- if (stat(map, &sb)) {
- plog(XLOG_ERROR, "map \"%s\" stat failure: %m", map);
- return errno;
- }
- if (!S_ISREG(sb.st_mode)) {
- plog(XLOG_ERROR, "map \"%s\" should be regular file", map);
- return EINVAL;
- }
- if (sb.st_uid != 0) {
- plog(XLOG_ERROR, "map \"%s\" owned by uid %u (must be 0)", map, (u_int) sb.st_uid);
- return EACCES;
- }
- if (!(sb.st_mode & S_IXUSR)) {
- plog(XLOG_ERROR, "map \"%s\" should be executable", map);
- return EACCES;
- }
- if (sb.st_mode & (S_ISUID|S_ISGID)) {
- plog(XLOG_ERROR, "map \"%s\" should not be setuid/setgid", map);
- return EACCES;
- }
- if (sb.st_mode & S_IWOTH) {
- plog(XLOG_ERROR, "map \"%s\" should not be world writeable", map);
- return EACCES;
- }
-
- return 0; /* all is well */
-}
-
-
-int
-exec_init(mnt_map *m, char *map, time_t *tp)
-{
- /*
- * Basically just test that the executable map can be found
- * and has proper permissions.
- */
- return exec_check_perm(map);
-}
-
-
-int
-exec_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- int mapfd, ret;
-
- if ((ret = exec_check_perm(map)) != 0) {
- return ret;
- }
-
- if (!key)
- return 0;
-
- if (logfp)
- fflush(logfp);
- dlog("exec_search \"%s\", key: \"%s\"", map, key);
- mapfd = exec_map_open(map, key);
-
- if (mapfd >= 0) {
- if (tp)
- *tp = clocktime(NULL);
-
- return exec_parse_qanswer(mapfd, map, key, pval, tp);
- }
-
- return errno;
-}
diff --git a/contrib/amd/amd/info_file.c b/contrib/amd/amd/info_file.c
deleted file mode 100644
index 3777a2aebe94..000000000000
--- a/contrib/amd/amd/info_file.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_file.c
- *
- */
-
-/*
- * Get info from file
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define MAX_LINE_LEN 1500
-
-/* forward declarations */
-int file_init_or_mtime(mnt_map *m, char *map, time_t *tp);
-int file_reload(mnt_map *m, char *map, void (*fn) (mnt_map *, char *, char *));
-int file_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp);
-
-
-static int
-read_line(char *buf, int size, FILE *fp)
-{
- int done = 0;
-
- do {
- while (fgets(buf, size, fp)) {
- int len = strlen(buf);
- done += len;
- if (len > 1 && buf[len - 2] == '\\' &&
- buf[len - 1] == '\n') {
- int ch;
- buf += len - 2;
- size -= len - 2;
- *buf = '\n';
- buf[1] = '\0';
- /*
- * Skip leading white space on next line
- */
- while ((ch = getc(fp)) != EOF &&
- isascii(ch) && isspace(ch)) ;
- (void) ungetc(ch, fp);
- } else {
- return done;
- }
- }
- } while (size > 0 && !feof(fp) && !ferror(fp));
-
- return done;
-}
-
-
-/*
- * Try to locate a key in a file
- */
-static int
-file_search_or_reload(FILE *fp,
- char *map,
- char *key,
- char **val,
- mnt_map *m,
- void (*fn) (mnt_map *m, char *, char *))
-{
- char key_val[MAX_LINE_LEN];
- int chuck = 0;
- int line_no = 0;
-
- while (read_line(key_val, sizeof(key_val), fp)) {
- char *kp;
- char *cp;
- char *hash;
- int len = strlen(key_val);
- line_no++;
-
- /*
- * Make sure we got the whole line
- */
- if (key_val[len - 1] != '\n') {
- plog(XLOG_WARNING, "line %d in \"%s\" is too long", line_no, map);
- chuck = 1;
- } else {
- key_val[len - 1] = '\0';
- }
-
- /*
- * Strip comments
- */
- hash = strchr(key_val, '#');
- if (hash)
- *hash = '\0';
-
- /*
- * Find start of key
- */
- for (kp = key_val; *kp && isascii(*kp) && isspace((int)*kp); kp++) ;
-
- /*
- * Ignore blank lines
- */
- if (!*kp)
- goto again;
-
- /*
- * Find end of key
- */
- for (cp = kp; *cp && (!isascii(*cp) || !isspace((int)*cp)); cp++) ;
-
- /*
- * Check whether key matches
- */
- if (*cp)
- *cp++ = '\0';
-
- if (fn || (*key == *kp && STREQ(key, kp))) {
- while (*cp && isascii(*cp) && isspace((int)*cp))
- cp++;
- if (*cp) {
- /*
- * Return a copy of the data
- */
- char *dc = strdup(cp);
- if (fn) {
- (*fn) (m, strdup(kp), dc);
- } else {
- *val = dc;
- dlog("%s returns %s", key, dc);
- }
- if (!fn)
- return 0;
- } else {
- plog(XLOG_USER, "%s: line %d has no value field", map, line_no);
- }
- }
-
- again:
- /*
- * If the last read didn't get a whole line then
- * throw away the remainder before continuing...
- */
- if (chuck) {
- while (fgets(key_val, sizeof(key_val), fp) &&
- !strchr(key_val, '\n')) ;
- chuck = 0;
- }
- }
-
- return fn ? 0 : ENOENT;
-}
-
-
-static FILE *
-file_open(char *map, time_t *tp)
-{
- FILE *mapf = fopen(map, "r");
-
- if (mapf && tp) {
- struct stat stb;
- if (fstat(fileno(mapf), &stb) < 0)
- *tp = clocktime(NULL);
- else
- *tp = stb.st_mtime;
- }
- return mapf;
-}
-
-
-int
-file_init_or_mtime(mnt_map *m, char *map, time_t *tp)
-{
- FILE *mapf = file_open(map, tp);
-
- if (mapf) {
- fclose(mapf);
- return 0;
- }
- return errno;
-}
-
-
-int
-file_reload(mnt_map *m, char *map, void (*fn) (mnt_map *, char *, char *))
-{
- FILE *mapf = file_open(map, (time_t *) 0);
-
- if (mapf) {
- int error = file_search_or_reload(mapf, map, 0, 0, m, fn);
- (void) fclose(mapf);
- return error;
- }
- return errno;
-}
-
-
-int
-file_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- time_t t;
- FILE *mapf = file_open(map, &t);
-
- if (mapf) {
- int error;
- if (*tp < t) {
- *tp = t;
- error = -1;
- } else {
- error = file_search_or_reload(mapf, map, key, pval, 0, 0);
- }
- (void) fclose(mapf);
- return error;
- }
- return errno;
-}
diff --git a/contrib/amd/amd/info_hesiod.c b/contrib/amd/amd/info_hesiod.c
deleted file mode 100644
index e345c9961508..000000000000
--- a/contrib/amd/amd/info_hesiod.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_hesiod.c
- *
- */
-
-/*
- * Get info from Hesiod
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define HES_PREFIX "hesiod."
-#define HES_PREFLEN 7
-
-#ifdef HAVE_HESIOD_INIT
-/* bsdi3 does not define this extern in any header file */
-extern char **hesiod_resolve(void *context, const char *name, const char *type);
-extern int hesiod_init(void **context);
-static voidp hesiod_context;
-#endif /* HAVE_HESIOD_INIT */
-
-/* forward declarations */
-int amu_hesiod_init(mnt_map *m, char *map, time_t *tp);
-int hesiod_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp);
-int hesiod_isup(mnt_map *m, char *map);
-
-/*
- * No easy way to probe the server - check the map name begins with "hesiod."
- * Note: this name includes 'amu_' so as to not conflict with libhesiod's
- * hesiod_init() function.
- */
-int
-amu_hesiod_init(mnt_map *m, char *map, time_t *tp)
-{
- dlog("amu_hesiod_init(%s)", map);
- *tp = 0;
-
-#ifdef HAVE_HESIOD_INIT
- if (!hesiod_context && hesiod_init(&hesiod_context) != 0)
- return ENOENT;
-#endif /* HAVE_HESIOD_INIT */
-
- return NSTREQ(map, HES_PREFIX, HES_PREFLEN) ? 0 : ENOENT;
-}
-
-
-/*
- * Do a Hesiod nameserver call.
- * Modify time is ignored by Hesiod - XXX
- */
-int
-hesiod_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- char hes_key[MAXPATHLEN];
- char **rvec;
-#ifndef HAVE_HESIOD_INIT
- int error;
-#endif /* not HAVE_HESIOD_INIT */
-
- dlog("hesiod_search(m=%lx, map=%s, key=%s, pval=%lx tp=%lx)",
- (unsigned long) m, map, key, (unsigned long) pval, (unsigned long) tp);
-
- if (key[0] == '.')
- return ENOENT;
-
- xsnprintf(hes_key, sizeof(hes_key), "%s.%s", key, map + HES_PREFLEN);
-
- /*
- * Call the resolver
- */
- dlog("Hesiod base is: %s\n", gopt.hesiod_base);
- dlog("hesiod_search: hes_resolve(%s, %s)", hes_key, gopt.hesiod_base);
- if (amuDebug(D_INFO))
- _res.options |= RES_DEBUG;
-
-#ifdef HAVE_HESIOD_INIT
- /* new style hesiod */
- rvec = hesiod_resolve(hesiod_context, hes_key, gopt.hesiod_base);
-#else /* not HAVE_HESIOD_INIT */
- rvec = hes_resolve(hes_key, gopt.hesiod_base);
-#endif /* not HAVE_HESIOD_INIT */
-
- /*
- * If a reply was forthcoming then return
- * it (and free subsequent replies)
- */
- if (rvec && *rvec) {
- *pval = *rvec;
- while (*++rvec)
- XFREE(*rvec);
- return 0;
- }
-
-#ifdef HAVE_HESIOD_INIT
- /* new style hesiod */
- return errno;
-#else /* not HAVE_HESIOD_INIT */
- /*
- * Otherwise reflect the hesiod error into a Un*x error
- */
- dlog("hesiod_search: Error: %d", hes_error());
- switch (hes_error()) {
- case HES_ER_NOTFOUND:
- error = ENOENT;
- break;
- case HES_ER_CONFIG:
- error = EIO;
- break;
- case HES_ER_NET:
- error = ETIMEDOUT;
- break;
- default:
- error = EINVAL;
- break;
- }
- dlog("hesiod_search: Returning: %d", error);
- return error;
-#endif /* not HAVE_HESIOD_INIT */
-}
-
-
-/*
- * Check if Hesiod is up, so we can determine if to clear the map or not.
- * Test it by querying for /defaults.
- * Returns: 0 if Hesiod is down, 1 if it is up.
- */
-int
-hesiod_isup(mnt_map *m, char *map)
-{
- int error;
- char *val;
- time_t mtime;
- static int last_status = 1; /* assume up by default */
-
- error = hesiod_search(m, map, "/defaults", &val, &mtime);
- dlog("hesiod_isup(%s): %s", map, strerror(error));
- if (error != 0 && error != ENOENT) {
- plog(XLOG_ERROR,
- "hesiod_isup: error getting `/defaults' entry in map %s: %m", map);
- last_status = 0;
- return 0; /* Hesiod is down */
- }
- if (last_status == 0) { /* if was down before */
- plog(XLOG_INFO, "hesiod_isup: Hesiod came back up for map %s", map);
- last_status = 1;
- }
- return 1; /* Hesiod is up */
-}
diff --git a/contrib/amd/amd/info_ldap.c b/contrib/amd/amd/info_ldap.c
deleted file mode 100644
index 36ce1c8693d3..000000000000
--- a/contrib/amd/amd/info_ldap.c
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_ldap.c
- *
- */
-
-
-/*
- * Get info from LDAP (Lightweight Directory Access Protocol)
- * LDAP Home Page: http://www.umich.edu/~rsug/ldap/
- */
-
-/*
- * WARNING: as of Linux Fedora Core 5 (which comes with openldap-2.3.9), the
- * ldap.h headers deprecate several functions used in this file, such as
- * ldap_unbind. You get compile errors about missing extern definitions.
- * Those externs are still in <ldap.h>, but surrounded by an ifdef
- * LDAP_DEPRECATED. I am turning on that ifdef here, under the assumption
- * that the functions may be deprecated, but they still work for this
- * (older?) version of the LDAP API. It gets am-utils to compile, but it is
- * not clear if it will work perfectly.
- */
-#ifndef LDAP_DEPRECATED
-# define LDAP_DEPRECATED 1
-#endif /* not LDAP_DEPRECATED */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/*
- * MACROS:
- */
-#define AMD_LDAP_TYPE "ldap"
-/* Time to live for an LDAP cached in an mnt_map */
-#define AMD_LDAP_TTL 3600
-#define AMD_LDAP_RETRIES 5
-#define AMD_LDAP_HOST "ldap"
-#ifndef LDAP_PORT
-# define LDAP_PORT 389
-#endif /* LDAP_PORT */
-
-/* How timestamps are searched */
-#define AMD_LDAP_TSFILTER "(&(objectClass=amdmapTimestamp)(amdmapName=%s))"
-/* How maps are searched */
-#define AMD_LDAP_FILTER "(&(objectClass=amdmap)(amdmapName=%s)(amdmapKey=%s))"
-/* How timestamps are stored */
-#define AMD_LDAP_TSATTR "amdmaptimestamp"
-/* How maps are stored */
-#define AMD_LDAP_ATTR "amdmapvalue"
-
-/*
- * TYPEDEFS:
- */
-typedef struct ald_ent ALD;
-typedef struct cr_ent CR;
-typedef struct he_ent HE_ENT;
-
-/*
- * STRUCTURES:
- */
-struct ald_ent {
- LDAP *ldap;
- HE_ENT *hostent;
- CR *credentials;
- time_t timestamp;
-};
-
-struct cr_ent {
- char *who;
- char *pw;
- int method;
-};
-
-struct he_ent {
- char *host;
- int port;
- struct he_ent *next;
-};
-
-/*
- * FORWARD DECLARATIONS:
- */
-static int amu_ldap_rebind(ALD *a);
-static int get_ldap_timestamp(ALD *a, char *map, time_t *ts);
-
-
-/*
- * FUNCTIONS:
- */
-
-static void
-he_free(HE_ENT *h)
-{
- XFREE(h->host);
- if (h->next != NULL)
- he_free(h->next);
- XFREE(h);
-}
-
-
-static HE_ENT *
-string2he(char *s_orig)
-{
- char *c, *p;
- char *s;
- HE_ENT *new, *old = NULL;
-
- if (NULL == s_orig || NULL == (s = strdup(s_orig)))
- return NULL;
- for (p = s; p; p = strchr(p, ',')) {
- if (old != NULL) {
- new = ALLOC(HE_ENT);
- old->next = new;
- old = new;
- } else {
- old = ALLOC(HE_ENT);
- old->next = NULL;
- }
- c = strchr(p, ':');
- if (c) { /* Host and port */
- *c++ = '\0';
- old->host = strdup(p);
- old->port = atoi(c);
- } else
- old->host = strdup(p);
-
- }
- XFREE(s);
- return (old);
-}
-
-
-static void
-cr_free(CR *c)
-{
- XFREE(c->who);
- XFREE(c->pw);
- XFREE(c);
-}
-
-
-/*
- * Special ldap_unbind function to handle SIGPIPE.
- * We first ignore SIGPIPE, in case a remote LDAP server was
- * restarted, then we reinstall the handler.
- */
-static int
-amu_ldap_unbind(LDAP *ld)
-{
- int e;
-#ifdef HAVE_SIGACTION
- struct sigaction sa;
-#else /* not HAVE_SIGACTION */
- void (*handler)(int);
-#endif /* not HAVE_SIGACTION */
-
- dlog("amu_ldap_unbind()\n");
-
-#ifdef HAVE_SIGACTION
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGPIPE);
- sigaction(SIGPIPE, &sa, &sa); /* set IGNORE, and get old action */
-#else /* not HAVE_SIGACTION */
- handler = signal(SIGPIPE, SIG_IGN);
-#endif /* not HAVE_SIGACTION */
-
- e = ldap_unbind(ld);
-
-#ifdef HAVE_SIGACTION
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGPIPE);
- sigaction(SIGPIPE, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- (void) signal(SIGPIPE, handler);
-#endif /* not HAVE_SIGACTION */
-
- return e;
-}
-
-
-static void
-ald_free(ALD *a)
-{
- he_free(a->hostent);
- cr_free(a->credentials);
- if (a->ldap != NULL)
- amu_ldap_unbind(a->ldap);
- XFREE(a);
-}
-
-
-int
-amu_ldap_init(mnt_map *m, char *map, time_t *ts)
-{
- ALD *aldh;
- CR *creds;
-
- dlog("-> amu_ldap_init: map <%s>\n", map);
-
- /*
- * XXX: by checking that map_type must be defined, aren't we
- * excluding the possibility of automatic searches through all
- * map types?
- */
- if (!gopt.map_type || !STREQ(gopt.map_type, AMD_LDAP_TYPE)) {
- dlog("amu_ldap_init called with map_type <%s>\n",
- (gopt.map_type ? gopt.map_type : "null"));
- } else {
- dlog("Map %s is ldap\n", map);
- }
-
- aldh = ALLOC(ALD);
- creds = ALLOC(CR);
- aldh->ldap = NULL;
- aldh->hostent = string2he(gopt.ldap_hostports);
- if (aldh->hostent == NULL) {
- plog(XLOG_USER, "Unable to parse hostport %s for ldap map %s",
- gopt.ldap_hostports ? gopt.ldap_hostports : "(null)", map);
- XFREE(creds);
- XFREE(aldh);
- return (ENOENT);
- }
- creds->who = "";
- creds->pw = "";
- creds->method = LDAP_AUTH_SIMPLE;
- aldh->credentials = creds;
- aldh->timestamp = 0;
- aldh->ldap = NULL;
- dlog("Trying for %s:%d\n", aldh->hostent->host, aldh->hostent->port);
- if (amu_ldap_rebind(aldh)) {
- ald_free(aldh);
- return (ENOENT);
- }
- m->map_data = (void *) aldh;
- dlog("Bound to %s:%d\n", aldh->hostent->host, aldh->hostent->port);
- if (get_ldap_timestamp(aldh, map, ts))
- return (ENOENT);
- dlog("Got timestamp for map %s: %ld\n", map, (u_long) *ts);
-
- return (0);
-}
-
-
-static int
-amu_ldap_rebind(ALD *a)
-{
- LDAP *ld;
- HE_ENT *h;
- CR *c = a->credentials;
- time_t now = clocktime(NULL);
- int try;
-
- dlog("-> amu_ldap_rebind\n");
-
- if (a->ldap != NULL) {
- if ((a->timestamp - now) > AMD_LDAP_TTL) {
- dlog("Re-establishing ldap connection\n");
- amu_ldap_unbind(a->ldap);
- a->timestamp = now;
- a->ldap = NULL;
- } else {
- /* Assume all is OK. If it wasn't we'll be back! */
- dlog("amu_ldap_rebind: timestamp OK\n");
- return (0);
- }
- }
-
- for (try=0; try<10; try++) { /* XXX: try up to 10 times (makes sense?) */
- for (h = a->hostent; h != NULL; h = h->next) {
- if ((ld = ldap_open(h->host, h->port)) == NULL) {
- plog(XLOG_WARNING, "Unable to ldap_open to %s:%d\n", h->host, h->port);
- break;
- }
-#if LDAP_VERSION_MAX > LDAP_VERSION2
- /* handle LDAPv3 and heigher, if available and amd.conf-igured */
- if (gopt.ldap_proto_version > LDAP_VERSION2) {
- if (!ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &gopt.ldap_proto_version)) {
- dlog("amu_ldap_rebind: LDAP protocol version set to %ld\n",
- gopt.ldap_proto_version);
- } else {
- plog(XLOG_WARNING, "Unable to set ldap protocol version to %ld\n",
- gopt.ldap_proto_version);
- break;
- }
- }
-#endif /* LDAP_VERSION_MAX > LDAP_VERSION2 */
- if (ldap_bind_s(ld, c->who, c->pw, c->method) != LDAP_SUCCESS) {
- plog(XLOG_WARNING, "Unable to ldap_bind to %s:%d as %s\n",
- h->host, h->port, c->who);
- break;
- }
- if (gopt.ldap_cache_seconds > 0) {
-#if defined(HAVE_LDAP_ENABLE_CACHE) && defined(HAVE_EXTERN_LDAP_ENABLE_CACHE)
- ldap_enable_cache(ld, gopt.ldap_cache_seconds, gopt.ldap_cache_maxmem);
-#else /* not defined(HAVE_LDAP_ENABLE_CACHE) && defined(HAVE_EXTERN_LDAP_ENABLE_CACHE) */
- plog(XLOG_WARNING, "ldap_enable_cache(%ld) is not available on this system!\n", gopt.ldap_cache_seconds);
-#endif /* not defined(HAVE_LDAP_ENABLE_CACHE) && defined(HAVE_EXTERN_LDAP_ENABLE_CACHE) */
- }
- a->ldap = ld;
- a->timestamp = now;
- return (0);
- }
- plog(XLOG_WARNING, "Exhausted list of ldap servers, looping.\n");
- }
-
- plog(XLOG_USER, "Unable to (re)bind to any ldap hosts\n");
- return (ENOENT);
-}
-
-
-static int
-get_ldap_timestamp(ALD *a, char *map, time_t *ts)
-{
- struct timeval tv;
- char **vals, *end;
- char filter[MAXPATHLEN];
- int i, err = 0, nentries = 0;
- LDAPMessage *res = NULL, *entry;
-
- dlog("-> get_ldap_timestamp: map <%s>\n", map);
-
- tv.tv_sec = 3;
- tv.tv_usec = 0;
- xsnprintf(filter, sizeof(filter), AMD_LDAP_TSFILTER, map);
- dlog("Getting timestamp for map %s\n", map);
- dlog("Filter is: %s\n", filter);
- dlog("Base is: %s\n", gopt.ldap_base);
- for (i = 0; i < AMD_LDAP_RETRIES; i++) {
- err = ldap_search_st(a->ldap,
- gopt.ldap_base,
- LDAP_SCOPE_SUBTREE,
- filter,
- 0,
- 0,
- &tv,
- &res);
- if (err == LDAP_SUCCESS)
- break;
- if (res) {
- ldap_msgfree(res);
- res = NULL;
- }
- plog(XLOG_USER, "Timestamp LDAP search attempt %d failed: %s\n",
- i + 1, ldap_err2string(err));
- if (err != LDAP_TIMEOUT) {
- dlog("get_ldap_timestamp: unbinding...\n");
- amu_ldap_unbind(a->ldap);
- a->ldap = NULL;
- if (amu_ldap_rebind(a))
- return (ENOENT);
- }
- dlog("Timestamp search failed, trying again...\n");
- }
-
- if (err != LDAP_SUCCESS) {
- *ts = 0;
- plog(XLOG_USER, "LDAP timestamp search failed: %s\n",
- ldap_err2string(err));
- if (res)
- ldap_msgfree(res);
- return (ENOENT);
- }
-
- nentries = ldap_count_entries(a->ldap, res);
- if (nentries == 0) {
- plog(XLOG_USER, "No timestamp entry for map %s\n", map);
- *ts = 0;
- ldap_msgfree(res);
- return (ENOENT);
- }
-
- entry = ldap_first_entry(a->ldap, res);
- vals = ldap_get_values(a->ldap, entry, AMD_LDAP_TSATTR);
- if (ldap_count_values(vals) == 0) {
- plog(XLOG_USER, "Missing timestamp value for map %s\n", map);
- *ts = 0;
- ldap_value_free(vals);
- ldap_msgfree(res);
- return (ENOENT);
- }
- dlog("TS value is:%s:\n", vals[0]);
-
- if (vals[0]) {
- *ts = (time_t) strtol(vals[0], &end, 10);
- if (end == vals[0]) {
- plog(XLOG_USER, "Unable to decode ldap timestamp %s for map %s\n",
- vals[0], map);
- err = ENOENT;
- }
- if (!*ts > 0) {
- plog(XLOG_USER, "Nonpositive timestamp %ld for map %s\n",
- (u_long) *ts, map);
- err = ENOENT;
- }
- } else {
- plog(XLOG_USER, "Empty timestamp value for map %s\n", map);
- *ts = 0;
- err = ENOENT;
- }
-
- ldap_value_free(vals);
- ldap_msgfree(res);
- dlog("The timestamp for %s is %ld (err=%d)\n", map, (u_long) *ts, err);
- return (err);
-}
-
-
-int
-amu_ldap_search(mnt_map *m, char *map, char *key, char **pval, time_t *ts)
-{
- char **vals, filter[MAXPATHLEN], filter2[2 * MAXPATHLEN];
- char *f1, *f2;
- struct timeval tv;
- int i, err = 0, nvals = 0, nentries = 0;
- LDAPMessage *entry, *res = NULL;
- ALD *a = (ALD *) (m->map_data);
-
- dlog("-> amu_ldap_search: map <%s>, key <%s>\n", map, key);
-
- tv.tv_sec = 2;
- tv.tv_usec = 0;
- if (a == NULL) {
- plog(XLOG_USER, "LDAP panic: no map data\n");
- return (EIO);
- }
- if (amu_ldap_rebind(a)) /* Check that's the handle is still valid */
- return (ENOENT);
-
- xsnprintf(filter, sizeof(filter), AMD_LDAP_FILTER, map, key);
- /* "*" is special to ldap_search(); run through the filter escaping it. */
- f1 = filter; f2 = filter2;
- while (*f1) {
- if (*f1 == '*') {
- *f2++ = '\\'; *f2++ = '2'; *f2++ = 'a';
- f1++;
- } else {
- *f2++ = *f1++;
- }
- }
- *f2 = '\0';
- dlog("Search with filter: <%s>\n", filter2);
- for (i = 0; i < AMD_LDAP_RETRIES; i++) {
- err = ldap_search_st(a->ldap,
- gopt.ldap_base,
- LDAP_SCOPE_SUBTREE,
- filter2,
- 0,
- 0,
- &tv,
- &res);
- if (err == LDAP_SUCCESS)
- break;
- if (res) {
- ldap_msgfree(res);
- res = NULL;
- }
- plog(XLOG_USER, "LDAP search attempt %d failed: %s\n",
- i + 1, ldap_err2string(err));
- if (err != LDAP_TIMEOUT) {
- dlog("amu_ldap_search: unbinding...\n");
- amu_ldap_unbind(a->ldap);
- a->ldap = NULL;
- if (amu_ldap_rebind(a))
- return (ENOENT);
- }
- }
-
- switch (err) {
- case LDAP_SUCCESS:
- break;
- case LDAP_NO_SUCH_OBJECT:
- dlog("No object\n");
- if (res)
- ldap_msgfree(res);
- return (ENOENT);
- default:
- plog(XLOG_USER, "LDAP search failed: %s\n",
- ldap_err2string(err));
- if (res)
- ldap_msgfree(res);
- return (EIO);
- }
-
- nentries = ldap_count_entries(a->ldap, res);
- dlog("Search found %d entries\n", nentries);
- if (nentries == 0) {
- ldap_msgfree(res);
- return (ENOENT);
- }
- entry = ldap_first_entry(a->ldap, res);
- vals = ldap_get_values(a->ldap, entry, AMD_LDAP_ATTR);
- nvals = ldap_count_values(vals);
- if (nvals == 0) {
- plog(XLOG_USER, "Missing value for %s in map %s\n", key, map);
- ldap_value_free(vals);
- ldap_msgfree(res);
- return (EIO);
- }
- dlog("Map %s, %s => %s\n", map, key, vals[0]);
- if (vals[0]) {
- *pval = strdup(vals[0]);
- err = 0;
- } else {
- plog(XLOG_USER, "Empty value for %s in map %s\n", key, map);
- err = ENOENT;
- }
- ldap_msgfree(res);
- ldap_value_free(vals);
-
- return (err);
-}
-
-
-int
-amu_ldap_mtime(mnt_map *m, char *map, time_t *ts)
-{
- ALD *aldh = (ALD *) (m->map_data);
-
- if (aldh == NULL) {
- dlog("LDAP panic: unable to find map data\n");
- return (ENOENT);
- }
- if (amu_ldap_rebind(aldh)) {
- return (ENOENT);
- }
- if (get_ldap_timestamp(aldh, map, ts)) {
- return (ENOENT);
- }
- return (0);
-}
diff --git a/contrib/amd/amd/info_ndbm.c b/contrib/amd/amd/info_ndbm.c
deleted file mode 100644
index 8a52ba9e201d..000000000000
--- a/contrib/amd/amd/info_ndbm.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_ndbm.c
- *
- */
-
-/*
- * Get info from NDBM map
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-int ndbm_init(mnt_map *m, char *map, time_t *tp);
-int ndbm_mtime(mnt_map *m, char *map, time_t *tp);
-int ndbm_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp);
-
-
-static int
-search_ndbm(DBM *db, char *key, char **val)
-{
- datum k, v;
-
- k.dptr = key;
- k.dsize = strlen(key) + 1;
- v = dbm_fetch(db, k);
- if (v.dptr) {
- *val = strdup(v.dptr);
- return 0;
- }
- return ENOENT;
-}
-
-
-int
-ndbm_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- DBM *db;
-
- db = dbm_open(map, O_RDONLY, 0);
- if (db) {
- struct stat stb;
- int error;
-#ifdef DBM_SUFFIX
- char dbfilename[256];
-
- xstrlcpy(dbfilename, map, sizeof(dbfilename));
- xstrlcat(dbfilename, DBM_SUFFIX, sizeof(dbfilename));
- error = stat(dbfilename, &stb);
-#else /* not DBM_SUFFIX */
- error = fstat(dbm_pagfno(db), &stb);
-#endif /* not DBM_SUFFIX */
- if (!error && *tp < stb.st_mtime) {
- *tp = stb.st_mtime;
- error = -1;
- } else {
- error = search_ndbm(db, key, pval);
- }
- (void) dbm_close(db);
- return error;
- }
- return errno;
-}
-
-
-int
-ndbm_init(mnt_map *m, char *map, time_t *tp)
-{
- DBM *db;
-
- db = dbm_open(map, O_RDONLY, 0);
- if (db) {
- struct stat stb;
- int error;
-#ifdef DBM_SUFFIX
- char dbfilename[256];
-
- xstrlcpy(dbfilename, map, sizeof(dbfilename));
- xstrlcat(dbfilename, DBM_SUFFIX, sizeof(dbfilename));
- error = stat(dbfilename, &stb);
-#else /* not DBM_SUFFIX */
- error = fstat(dbm_pagfno(db), &stb);
-#endif /* not DBM_SUFFIX */
- if (error < 0)
- *tp = clocktime(NULL);
- else
- *tp = stb.st_mtime;
- dbm_close(db);
- return 0;
- }
- return errno;
-}
-
-
-int
-ndbm_mtime(mnt_map *m, char *map, time_t *tp)
-{
- return ndbm_init(m,map, tp);
-}
diff --git a/contrib/amd/amd/info_nis.c b/contrib/amd/amd/info_nis.c
deleted file mode 100644
index bcb87d5d02aa..000000000000
--- a/contrib/amd/amd/info_nis.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_nis.c
- *
- */
-
-/*
- * Get info from NIS map
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/*
- * NIS+ servers in NIS compat mode don't have yp_order()
- *
- * has_yp_order = 1 NIS server
- * = 0 NIS+ server
- * = -1 server is down
- */
-static int has_yp_order = -1;
-
-/* forward declarations */
-int nis_reload(mnt_map *m, char *map, void (*fn) (mnt_map *, char *, char *));
-int nis_search(mnt_map *m, char *map, char *key, char **val, time_t *tp);
-int nis_init(mnt_map *m, char *map, time_t *tp);
-int nis_isup(mnt_map *m, char *map);
-int nis_mtime(mnt_map *m, char *map, time_t *tp);
-
-/* typedefs */
-typedef void (*nis_callback_fxn_t)(mnt_map *, char *, char *);
-#ifndef DEFINED_YPALL_CALLBACK_FXN_T
-typedef int (*ypall_callback_fxn_t)();
-#endif /* DEFINED_YPALL_CALLBACK_FXN_T */
-
-struct nis_callback_data {
- mnt_map *ncd_m;
- char *ncd_map;
- nis_callback_fxn_t ncd_fn;
-};
-
-/* Map to the right version of yp_all */
-#ifdef HAVE_BAD_YP_ALL
-# define yp_all am_yp_all
-static int am_yp_all(char *indomain, char *inmap, struct ypall_callback *incallback);
-#endif /* HAVE_BAD_YP_ALL */
-
-
-/*
- * Figure out the nis domain name
- */
-static int
-determine_nis_domain(void)
-{
- static int nis_not_running = 0;
- char default_domain[YPMAXDOMAIN];
-
- if (nis_not_running)
- return ENOENT;
-
- if (getdomainname(default_domain, sizeof(default_domain)) < 0) {
- nis_not_running = 1;
- plog(XLOG_ERROR, "getdomainname: %m");
- return EIO;
- }
- if (!*default_domain) {
- nis_not_running = 1;
- plog(XLOG_WARNING, "NIS domain name is not set. NIS ignored.");
- return ENOENT;
- }
- gopt.nis_domain = strdup(default_domain);
-
- return 0;
-}
-
-
-/*
- * Callback from yp_all
- */
-static int
-callback(int status, char *key, int kl, char *val, int vl, char *data)
-{
- struct nis_callback_data *ncdp = (struct nis_callback_data *) data;
-
- if (status == YP_TRUE) {
-
- /* add to list of maps */
- char *kp = strnsave(key, kl);
- char *vp = strnsave(val, vl);
-
- (*ncdp->ncd_fn) (ncdp->ncd_m, kp, vp);
-
- /* we want more ... */
- return FALSE;
-
- } else {
-
- /* NOMORE means end of map - otherwise log error */
- if (status != YP_NOMORE) {
- /* check what went wrong */
- int e = ypprot_err(status);
-
- plog(XLOG_ERROR, "yp enumeration of %s: %s, status=%d, e=%d",
- ncdp->ncd_map, yperr_string(e), status, e);
- }
- return TRUE;
- }
-}
-
-
-int
-nis_reload(mnt_map *m, char *map, void (*fn) (mnt_map *, char *, char *))
-{
- int error;
- struct nis_callback_data data;
- struct ypall_callback cbinfo;
-
- if (!gopt.nis_domain) {
- error = determine_nis_domain();
- if (error)
- return error;
- }
- data.ncd_m = m;
- data.ncd_map = map;
- data.ncd_fn = fn;
- cbinfo.data = (voidp) &data;
- cbinfo.foreach = (ypall_callback_fxn_t) callback;
-
- /*
- * If you are using NIS and your yp_all function is "broken", you have to
- * get it fixed. The bug in yp_all() is that it does not close a TCP
- * connection to ypserv, and this ypserv runs out of open file descriptors,
- * getting into an infinite loop, thus all YP clients eventually unbind
- * and hang too.
- */
- error = yp_all(gopt.nis_domain, map, &cbinfo);
-
- if (error)
- plog(XLOG_ERROR, "error grabbing nis map of %s: %s", map, yperr_string(ypprot_err(error)));
- return error;
-}
-
-
-/*
- * Check if NIS is up, so we can determine if to clear the map or not.
- * Test it by checking the yp order.
- * Returns: 0 if NIS is down, 1 if it is up.
- */
-int
-nis_isup(mnt_map *m, char *map)
-{
- YP_ORDER_OUTORDER_TYPE order;
- int error;
- char *master;
- static int last_status = 1; /* assume up by default */
-
- switch (has_yp_order) {
- case 1:
- /*
- * NIS server with yp_order
- */
- error = yp_order(gopt.nis_domain, map, &order);
- if (error != 0) {
- plog(XLOG_ERROR,
- "nis_isup: error getting the order of map %s: %s",
- map, yperr_string(ypprot_err(error)));
- last_status = 0;
- return 0; /* NIS is down */
- }
- break;
-
- case 0:
- /*
- * NIS+ server without yp_order
- */
- error = yp_master(gopt.nis_domain, map, &master);
- if (error != 0) {
- plog(XLOG_ERROR,
- "nis_isup: error getting the master of map %s: %s",
- map, yperr_string(ypprot_err(error)));
- last_status = 0;
- return 0; /* NIS+ is down */
- }
- break;
-
- default:
- /*
- * server was down
- */
- last_status = 0;
- }
-
- if (last_status == 0) { /* reinitialize if was down before */
- time_t dummy;
- error = nis_init(m, map, &dummy);
- if (error)
- return 0; /* still down */
- plog(XLOG_INFO, "nis_isup: NIS came back up for map %s", map);
- last_status = 1;
- }
- return 1; /* NIS is up */
-}
-
-
-/*
- * Try to locate a key using NIS.
- */
-int
-nis_search(mnt_map *m, char *map, char *key, char **val, time_t *tp)
-{
- int outlen;
- int res;
- YP_ORDER_OUTORDER_TYPE order;
-
- /*
- * Make sure domain initialized
- */
- if (!gopt.nis_domain) {
- int error = determine_nis_domain();
- if (error)
- return error;
- }
-
-
- switch (has_yp_order) {
- case 1:
- /*
- * NIS server with yp_order
- * Check if map has changed
- */
- if (yp_order(gopt.nis_domain, map, &order))
- return EIO;
- if ((time_t) order > *tp) {
- *tp = (time_t) order;
- return -1;
- }
- break;
-
- case 0:
- /*
- * NIS+ server without yp_order
- * Check if timeout has expired to invalidate the cache
- */
- order = time(NULL);
- if ((time_t)order - *tp > gopt.am_timeo) {
- *tp = (time_t)order;
- return(-1);
- }
- break;
-
- default:
- /*
- * server was down
- */
- if (nis_isup(m, map))
- return -1;
- return EIO;
- }
-
- /*
- * Lookup key
- */
- res = yp_match(gopt.nis_domain, map, key, strlen(key), val, &outlen);
-
- /*
- * Do something interesting with the return code
- */
- switch (res) {
- case 0:
- return 0;
-
- case YPERR_KEY:
- return ENOENT;
-
- default:
- plog(XLOG_ERROR, "nis_search: %s: %s", map, yperr_string(res));
- return EIO;
- }
-}
-
-
-int
-nis_init(mnt_map *m, char *map, time_t *tp)
-{
- YP_ORDER_OUTORDER_TYPE order;
- int yp_order_result;
- char *master;
-
- if (!gopt.nis_domain) {
- int error = determine_nis_domain();
- if (error)
- return error;
- }
-
- /*
- * To see if the map exists, try to find
- * a master for it.
- */
- yp_order_result = yp_order(gopt.nis_domain, map, &order);
- switch (yp_order_result) {
- case 0:
- /* NIS server found */
- has_yp_order = 1;
- *tp = (time_t) order;
- dlog("NIS master for %s@%s has order %lu", map, gopt.nis_domain, (unsigned long) order);
- break;
- case YPERR_YPERR:
- /* NIS+ server found ! */
- has_yp_order = 0;
- /* try yp_master() instead */
- if (yp_master(gopt.nis_domain, map, &master)) {
- return ENOENT;
- } else {
- dlog("NIS master for %s@%s is a NIS+ server", map, gopt.nis_domain);
- /* Use fake timestamps */
- *tp = time(NULL);
- }
- break;
- default:
- /* server is down */
- has_yp_order = -1;
- return ENOENT;
- }
- return 0;
-}
-
-
-int
-nis_mtime(mnt_map *m, char *map, time_t *tp)
-{
- return nis_init(m, map, tp);
-}
-
-
-#ifdef HAVE_BAD_YP_ALL
-/*
- * If you are using NIS and your yp_all function is "broken", use an
- * alternate code which avoids a bug in yp_all(). The bug in yp_all() is
- * that it does not close a TCP connection to ypserv, and this ypserv runs
- * out of open filedescriptors, getting into an infinite loop, thus all YP
- * clients eventually unbind and hang too.
- *
- * Systems known to be plagued with this bug:
- * earlier SunOS 4.x
- * all irix systems (at this time, up to 6.4 was checked)
- *
- * -Erez Zadok <ezk@cs.columbia.edu>
- * -James Tanis <jtt@cs.columbia.edu> */
-static int
-am_yp_all(char *indomain, char *inmap, struct ypall_callback *incallback)
-{
- int i, j;
- char *outkey, *outval;
- int outkeylen, outvallen;
- char *outkey_old;
- int outkeylen_old;
-
- plog(XLOG_INFO, "NIS map %s reloading using am_yp_all", inmap);
-
- i = yp_first(indomain, inmap, &outkey, &outkeylen, &outval, &outvallen);
- if (i) {
- plog(XLOG_ERROR, "yp_first() returned error: %s\n", yperr_string(i));
- }
- do {
- j = (incallback->foreach)(YP_TRUE,
- outkey,
- outkeylen,
- outval,
- outvallen,
- incallback->data);
- if (j != FALSE) /* terminate loop */
- break;
-
- /*
- * We have to manually free all char ** arguments to yp_first/yp_next
- * outval must be freed *before* calling yp_next again, outkey can be
- * freed as outkey_old *after* the call (this saves one call to
- * strnsave).
- */
- XFREE(outval);
- outkey_old = outkey;
- outkeylen_old = outkeylen;
- i = yp_next(indomain,
- inmap,
- outkey_old,
- outkeylen_old,
- &outkey,
- &outkeylen,
- &outval,
- &outvallen);
- XFREE(outkey_old);
- } while (!i);
- if (i) {
- dlog("yp_next() returned error: %s\n", yperr_string(i));
- }
- if (i == YPERR_NOMORE)
- return 0;
- return i;
-}
-#endif /* HAVE_BAD_YP_ALL */
diff --git a/contrib/amd/amd/info_nisplus.c b/contrib/amd/amd/info_nisplus.c
deleted file mode 100644
index d392b48fed6a..000000000000
--- a/contrib/amd/amd/info_nisplus.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_nisplus.c
- *
- */
-
-/*
- * Get info from NIS+ (version 3) map
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define NISPLUS_KEY "key="
-#define NISPLUS_ORGDIR ".org_dir"
-
-struct nis_callback_data {
- mnt_map *ncd_m;
- char *ncd_map;
- void (*ncd_fn)();
-};
-
-struct nisplus_search_callback_data {
- nis_name key;
- char *value;
-};
-
-
-static int
-nisplus_callback(const nis_name key, const nis_object *value, voidp opaquedata)
-{
- char *kp = strnsave(ENTRY_VAL(value, 0), ENTRY_LEN(value, 0));
- char *vp = strnsave(ENTRY_VAL(value, 1), ENTRY_LEN(value, 1));
- struct nis_callback_data *data = (struct nis_callback_data *) opaquedata;
-
- dlog("NISplus callback for <%s,%s>", kp, vp);
-
- (*data->ncd_fn) (data->ncd_m, kp, vp);
-
- /*
- * We want more ...
- */
- return FALSE;
-}
-
-
-int
-nisplus_reload(mnt_map *m, char *map, void (*fn) ())
-{
- int error = 0;
- struct nis_callback_data data;
- nis_result *result;
- char *org; /* if map does not have ".org_dir" then append it */
- nis_name map_name;
- size_t l;
-
- org = strstr(map, NISPLUS_ORGDIR);
- if (org == NULL)
- org = NISPLUS_ORGDIR;
- else
- org = "";
-
- /* make some room for the NIS map_name */
- l = strlen(map) + sizeof(NISPLUS_ORGDIR);
- map_name = xmalloc(l);
- if (map_name == NULL) {
- plog(XLOG_ERROR, "Unable to create map_name %s: %s",
- map, strerror(ENOMEM));
- return ENOMEM;
- }
- xsnprintf(map_name, l, "%s%s", map, org);
-
- data.ncd_m = m;
- data.ncd_map = map_name;
- data.ncd_fn = fn;
-
- dlog("NISplus reload for %s", map);
-
- result = nis_list(map_name,
- EXPAND_NAME | FOLLOW_LINKS | FOLLOW_PATH,
- (int (*)()) nisplus_callback,
- &data);
-
- /* free off the NIS map_name */
- XFREE(map_name);
-
- if (result->status != NIS_SUCCESS && result->status != NIS_CBRESULTS)
- error = 1;
-
- if (error)
- plog(XLOG_ERROR, "error grabbing nisplus map of %s: %s",
- map,
- nis_sperrno(result->status));
-
- nis_freeresult(result);
- return error;
-}
-
-
-static int
-nisplus_search_callback(const nis_name key, const nis_object *value, voidp opaquedata)
-{
- struct nisplus_search_callback_data *data = (struct nisplus_search_callback_data *) opaquedata;
-
- dlog("NISplus search callback for <%s>", ENTRY_VAL(value, 0));
- dlog("NISplus search callback value <%s>", ENTRY_VAL(value, 1));
-
- data->value = strnsave(ENTRY_VAL(value, 1), ENTRY_LEN(value, 1));
- return TRUE;
-}
-
-
-/*
- * Try to locate a key using NIS+.
- */
-int
-nisplus_search(mnt_map *m, char *map, char *key, char **val, time_t *tp)
-{
- nis_result *result;
- int error = 0;
- struct nisplus_search_callback_data data;
- nis_name index;
- char *org; /* if map does not have ".org_dir" then append it */
- size_t l;
-
- org = strstr(map, NISPLUS_ORGDIR);
- if (org == NULL)
- org = NISPLUS_ORGDIR;
- else
- org = "";
-
- /* make some room for the NIS index */
- l = sizeof('[') /* for opening selection criteria */
- + sizeof(NISPLUS_KEY)
- + strlen(key)
- + sizeof(']') /* for closing selection criteria */
- + sizeof(',') /* + 1 for , separator */
- + strlen(map)
- + sizeof(NISPLUS_ORGDIR);
- index = xmalloc(l);
- if (index == NULL) {
- plog(XLOG_ERROR,
- "Unable to create index %s: %s",
- map,
- strerror(ENOMEM));
- return ENOMEM;
- }
- xsnprintf(index, l, "[%s%s],%s%s", NISPLUS_KEY, key, map, org);
-
- data.key = key;
- data.value = NULL;
-
- dlog("NISplus search for %s", index);
-
- result = nis_list(index,
- EXPAND_NAME | FOLLOW_LINKS | FOLLOW_PATH,
- (int (*)()) nisplus_search_callback,
- &data);
-
- /* free off the NIS index */
- XFREE(index);
-
- if (result == NULL) {
- plog(XLOG_ERROR, "nisplus_search: %s: %s", map, strerror(ENOMEM));
- return ENOMEM;
- }
-
- /*
- * Do something interesting with the return code
- */
- switch (result->status) {
- case NIS_SUCCESS:
- case NIS_CBRESULTS:
-
- if (data.value == NULL) {
- nis_object *value = result->objects.objects_val;
- dlog("NISplus search found <nothing>");
- dlog("NISplus search for %s: %s(%d)",
- map, nis_sperrno(result->status), result->status);
-
- if (value != NULL)
- data.value = strnsave(ENTRY_VAL(value, 1), ENTRY_LEN(value, 1));
- }
- *val = data.value;
-
- if (*val) {
- error = 0;
- dlog("NISplus search found %s", *val);
- } else {
- error = ENOENT;
- dlog("NISplus search found nothing");
- }
-
- *tp = 0;
- break;
-
- case NIS_NOSUCHNAME:
- dlog("NISplus search returned %d", result->status);
- error = ENOENT;
- break;
-
- default:
- plog(XLOG_ERROR, "nisplus_search: %s: %s", map, nis_sperrno(result->status));
- error = EIO;
- break;
- }
- nis_freeresult(result);
-
- return error;
-}
-
-
-int
-nisplus_init(mnt_map *m, char *map, time_t *tp)
-{
- nis_result *result;
- char *org; /* if map does not have ".org_dir" then append it */
- nis_name map_name;
- int error = 0;
- size_t l;
-
- org = strstr(map, NISPLUS_ORGDIR);
- if (org == NULL)
- org = NISPLUS_ORGDIR;
- else
- org = "";
-
- /* make some room for the NIS map_name */
- l = strlen(map) + sizeof(NISPLUS_ORGDIR);
- map_name = xmalloc(l);
- if (map_name == NULL) {
- plog(XLOG_ERROR,
- "Unable to create map_name %s: %s",
- map,
- strerror(ENOMEM));
- return ENOMEM;
- }
- xsnprintf(map_name, l, "%s%s", map, org);
-
- result = nis_lookup(map_name, (EXPAND_NAME | FOLLOW_LINKS | FOLLOW_PATH));
-
- /* free off the NIS map_name */
- XFREE(map_name);
-
- if (result == NULL) {
- plog(XLOG_ERROR, "NISplus init <%s>: %s", map, strerror(ENOMEM));
- return ENOMEM;
- }
-
- if (result->status != NIS_SUCCESS) {
- dlog("NISplus init <%s>: %s (%d)",
- map, nis_sperrno(result->status), result->status);
-
- error = ENOENT;
- }
-
- *tp = 0; /* no time */
- nis_freeresult(result);
- return error;
-}
-
-
-int
-nisplus_mtime(mnt_map *m, char *map, time_t *tp)
-{
- return nisplus_init(m,map, tp);
-}
diff --git a/contrib/amd/amd/info_passwd.c b/contrib/amd/amd/info_passwd.c
deleted file mode 100644
index c8bf388b1d65..000000000000
--- a/contrib/amd/amd/info_passwd.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_passwd.c
- *
- */
-
-/*
- * Get info from password "file"
- *
- * This is experimental and probably doesn't do what you expect.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define PASSWD_MAP "/etc/passwd"
-
-/* forward declarations */
-int passwd_init(mnt_map *m, char *map, time_t *tp);
-int passwd_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp);
-
-
-/*
- * Nothing to probe - check the map name is PASSWD_MAP.
- */
-int
-passwd_init(mnt_map *m, char *map, time_t *tp)
-{
- *tp = 0;
-
- /*
- * Recognize the old format "PASSWD_MAP"
- * Uses default return string
- * "type:=nfs;rfs:=/${var0}/${var1};rhost:=${var1};sublink:=${var2};fs:=${autodir}${var3}"
- */
- if (STREQ(map, PASSWD_MAP))
- return 0;
- /*
- * Recognize the new format "PASSWD_MAP:pval-format"
- */
- if (!NSTREQ(map, PASSWD_MAP, sizeof(PASSWD_MAP) - 1))
- return ENOENT;
- if (map[sizeof(PASSWD_MAP)-1] != ':')
- return ENOENT;
-
- return 0;
-}
-
-
-/*
- * Grab the entry via the getpwname routine
- * Modify time is ignored by passwd - XXX
- */
-int
-passwd_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- char *dir = 0;
- struct passwd *pw;
-
- if (STREQ(key, "/defaults")) {
- *pval = strdup("type:=nfs");
- return 0;
- }
- pw = getpwnam(key);
-
- if (pw) {
- /*
- * We chop the home directory up as follows:
- * /anydir/dom1/dom2/dom3/user
- *
- * and return
- * rfs:=/anydir/dom3;rhost:=dom3.dom2.dom1;sublink:=user
- * and now have
- * var0:=pw-prefix:=anydir
- * var1:=pw-rhost:=dom3.dom2.dom1
- * var2:=pw-user:=user
- * var3:=pw-home:=/anydir/dom1/dom2/dom3/user
- *
- * This allows cross-domain entries in your passwd file.
- * ... but forget about security!
- */
- char *user;
- char *p, *q;
- char val[MAXPATHLEN];
- char rhost[MAXHOSTNAMELEN];
- dir = strdup(pw->pw_dir);
-
- /*
- * Find user name. If no / then Invalid...
- */
- user = strrchr(dir, '/');
- if (!user)
- goto enoent;
- *user++ = '\0';
-
- /*
- * Find start of host "path". If no / then Invalid...
- */
- p = strchr(dir + 1, '/');
- if (!p)
- goto enoent;
- *p++ = '\0';
-
- /*
- * At this point, p is dom1/dom2/dom3
- * Copy, backwards, into rhost replacing
- * / with .
- */
- rhost[0] = '\0';
- do {
- q = strrchr(p, '/');
- if (q) {
- xstrlcat(rhost, q + 1, sizeof(rhost));
- xstrlcat(rhost, ".", sizeof(rhost));
- *q = '\0';
- } else {
- xstrlcat(rhost, p, sizeof(rhost));
- }
- } while (q);
-
- /*
- * Sanity check
- */
- if (*rhost == '\0' || *user == '\0' || *dir == '\0')
- goto enoent;
-
- /*
- * Make up return string
- */
- q = strchr(rhost, '.');
- if (q)
- *q = '\0';
- p = strchr(map, ':');
- if (p)
- p++;
- else
- p = "type:=nfs;rfs:=/${var0}/${var1};rhost:=${var1};sublink:=${var2};fs:=${autodir}${var3}";
- xsnprintf(val, sizeof(val), "var0:=%s;var1:=%s;var2:=%s;var3:=%s;%s",
- dir+1, rhost, user, pw->pw_dir, p);
- dlog("passwd_search: map=%s key=%s -> %s", map, key, val);
- if (q)
- *q = '.';
- *pval = strdup(val);
- return 0;
- }
-
-enoent:
- if (dir)
- XFREE(dir);
-
- return ENOENT;
-}
diff --git a/contrib/amd/amd/info_union.c b/contrib/amd/amd/info_union.c
deleted file mode 100644
index 8f0631c64ac9..000000000000
--- a/contrib/amd/amd/info_union.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/info_union.c
- *
- */
-
-/*
- * Get info from the system namespace
- *
- * NOTE: Cannot handle reads back through the automounter.
- * THIS WILL CAUSE A DEADLOCK!
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define UNION_PREFIX "union:"
-#define UNION_PREFLEN 6
-
-/* forward declarations */
-int union_init(mnt_map *m, char *map, time_t *tp);
-int union_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp);
-int union_reload(mnt_map *m, char *map, void (*fn) (mnt_map *, char *, char *));
-
-
-/*
- * No way to probe - check the map name begins with "union:"
- */
-int
-union_init(mnt_map *m, char *map, time_t *tp)
-{
- *tp = 0;
- return NSTREQ(map, UNION_PREFIX, UNION_PREFLEN) ? 0 : ENOENT;
-}
-
-
-int
-union_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- char *mapd = strdup(map + UNION_PREFLEN);
- char **v = strsplit(mapd, ':', '\"');
- char **p;
- size_t l;
-
- for (p = v; p[1]; p++) ;
- l = strlen(*p) + 5;
- *pval = xmalloc(l);
- xsnprintf(*pval, l, "fs:=%s", *p);
- XFREE(mapd);
- XFREE(v);
- return 0;
-}
-
-
-int
-union_reload(mnt_map *m, char *map, void (*fn) (mnt_map *, char *, char *))
-{
- char *mapd = strdup(map + UNION_PREFLEN);
- char **v = strsplit(mapd, ':', '\"');
- char **dir;
-
- /*
- * Add fake /defaults entry
- */
- (*fn) (m, strdup("/defaults"), strdup("type:=link;opts:=nounmount;sublink:=${key}"));
-
- for (dir = v; *dir; dir++) {
- size_t l;
- struct dirent *dp;
-
- DIR *dirp = opendir(*dir);
- if (!dirp) {
- plog(XLOG_USER, "Cannot read directory %s: %m", *dir);
- continue;
- }
- l = strlen(*dir) + 5;
-
- dlog("Reading directory %s...", *dir);
- while ((dp = readdir(dirp))) {
- char *val, *dpname = &dp->d_name[0];
- if (dpname[0] == '.' &&
- (dpname[1] == '\0' ||
- (dpname[1] == '.' && dpname[2] == '\0')))
- continue;
-
- dlog("... gives %s", dp->d_name);
- val = xmalloc(l);
- xsnprintf(val, l + 5, "fs:=%s", *dir);
- (*fn) (m, strdup(dp->d_name), val);
- }
- closedir(dirp);
- }
-
- /*
- * Add wildcard entry
- */
- {
- size_t l = strlen(*(dir-1)) + 5;
- char *val = xmalloc(l);
-
- xsnprintf(val, l, "fs:=%s", *(dir-1));
- (*fn) (m, strdup("*"), val);
- }
- XFREE(mapd);
- XFREE(v);
- return 0;
-}
diff --git a/contrib/amd/amd/map.c b/contrib/amd/amd/map.c
deleted file mode 100644
index 8696dfd6984d..000000000000
--- a/contrib/amd/amd/map.c
+++ /dev/null
@@ -1,1072 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/map.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#define smallest_t(t1, t2) (t1 != NEVER ? (t2 != NEVER ? (t1 < t2 ? t1 : t2) : t1) : t2)
-#define IGNORE_FLAGS (MFF_MOUNTING|MFF_UNMOUNTING|MFF_RESTART)
-#define new_gen() (am_gen++)
-
-/*
- * Generation Numbers.
- *
- * Generation numbers are allocated to every node created
- * by amd. When a filehandle is computed and sent to the
- * kernel, the generation number makes sure that it is safe
- * to reallocate a node slot even when the kernel has a cached
- * reference to its old incarnation.
- * No garbage collection is done, since it is assumed that
- * there is no way that 2^32 generation numbers could ever
- * be allocated by a single run of amd - there is simply
- * not enough cpu time available.
- * Famous last words... -Ion
- */
-static u_int am_gen = 2; /* Initial generation number */
-static int timeout_mp_id; /* Id from last call to timeout */
-
-static am_node *root_node; /* The root of the mount tree */
-static am_node **exported_ap = (am_node **) 0;
-static int exported_ap_size = 0;
-static int first_free_map = 0; /* First available free slot */
-static int last_used_map = -1; /* Last unavailable used slot */
-
-
-/*
- * This is the default attributes field which
- * is copied into every new node to be created.
- * The individual filesystem fs_init() routines
- * patch the copy to represent the particular
- * details for the relevant filesystem type
- */
-static nfsfattr gen_fattr =
-{
- NFLNK, /* type */
- NFSMODE_LNK | 0777, /* mode */
- 1, /* nlink */
- 0, /* uid */
- 0, /* gid */
- 0, /* size */
- 4096, /* blocksize */
- 0, /* rdev */
- 1, /* blocks */
- 0, /* fsid */
- 0, /* fileid */
- {0, 0}, /* atime */
- {0, 0}, /* mtime */
- {0, 0}, /* ctime */
-};
-
-/* forward declarations */
-static int unmount_node(opaque_t arg);
-static void exported_ap_free(am_node *mp);
-static void remove_am(am_node *mp);
-static am_node *get_root_ap(char *dir);
-
-
-/*
- * Iterator functions for exported_ap[]
- */
-am_node *
-get_first_exported_ap(int *index)
-{
- *index = -1;
- return get_next_exported_ap(index);
-}
-
-
-am_node *
-get_next_exported_ap(int *index)
-{
- (*index)++;
- while (*index < exported_ap_size) {
- if (exported_ap[*index] != NULL)
- return exported_ap[*index];
- (*index)++;
- }
- return NULL;
-}
-
-
-/*
- * Get exported_ap by index
- */
-am_node *
-get_exported_ap(int index)
-{
- if (index < 0 || index >= exported_ap_size)
- return 0;
- return exported_ap[index];
-}
-
-
-/*
- * Get exported_ap by path
- */
-am_node *
-path_to_exported_ap(char *path)
-{
- int index;
- am_node *mp;
-
- mp = get_first_exported_ap(&index);
- while (mp != NULL) {
- if (STREQ(mp->am_path, path))
- break;
- mp = get_next_exported_ap(&index);
- }
- return mp;
-}
-
-
-/*
- * Resize exported_ap map
- */
-static int
-exported_ap_realloc_map(int nsize)
-{
- /*
- * this shouldn't happen, but...
- */
- if (nsize < 0 || nsize == exported_ap_size)
- return 0;
-
- exported_ap = (am_node **) xrealloc((voidp) exported_ap, nsize * sizeof(am_node *));
-
- if (nsize > exported_ap_size)
- memset((char *) (exported_ap + exported_ap_size), 0,
- (nsize - exported_ap_size) * sizeof(am_node *));
- exported_ap_size = nsize;
-
- return 1;
-}
-
-
-
-am_node *
-get_ap_child(am_node *mp, char *fname)
-{
- am_node *new_mp;
- mntfs *mf = mp->am_mnt;
-
- /*
- * Allocate a new map
- */
- new_mp = exported_ap_alloc();
- if (new_mp) {
- /*
- * Fill it in
- */
- init_map(new_mp, fname);
-
- /*
- * Put it in the table
- */
- insert_am(new_mp, mp);
-
- /*
- * Fill in some other fields,
- * path and mount point.
- *
- * bugfix: do not prepend old am_path if direct map
- * <wls@astro.umd.edu> William Sebok
- */
- new_mp->am_path = str3cat(new_mp->am_path,
- (mf->mf_fsflags & FS_DIRECT)
- ? ""
- : mp->am_path,
- *fname == '/' ? "" : "/", fname);
- dlog("setting path to %s", new_mp->am_path);
- }
-
- return new_mp;
-}
-
-/*
- * Allocate a new mount slot and create
- * a new node.
- * Fills in the map number of the node,
- * but leaves everything else uninitialized.
- */
-am_node *
-exported_ap_alloc(void)
-{
- am_node *mp, **mpp;
-
- /*
- * First check if there are any slots left, realloc if needed
- */
- if (first_free_map >= exported_ap_size)
- if (!exported_ap_realloc_map(exported_ap_size + NEXP_AP))
- return 0;
-
- /*
- * Grab the next free slot
- */
- mpp = exported_ap + first_free_map;
- mp = *mpp = ALLOC(struct am_node);
- memset((char *) mp, 0, sizeof(struct am_node));
-
- mp->am_mapno = first_free_map++;
-
- /*
- * Update free pointer
- */
- while (first_free_map < exported_ap_size && exported_ap[first_free_map])
- first_free_map++;
-
- if (first_free_map > last_used_map)
- last_used_map = first_free_map - 1;
-
- return mp;
-}
-
-
-/*
- * Free a mount slot
- */
-static void
-exported_ap_free(am_node *mp)
-{
- /*
- * Sanity check
- */
- if (!mp)
- return;
-
- /*
- * Zero the slot pointer to avoid double free's
- */
- exported_ap[mp->am_mapno] = 0;
-
- /*
- * Update the free and last_used indices
- */
- if (mp->am_mapno == last_used_map)
- while (last_used_map >= 0 && exported_ap[last_used_map] == 0)
- --last_used_map;
-
- if (first_free_map > mp->am_mapno)
- first_free_map = mp->am_mapno;
-
- /*
- * Free the mount node, and zero out it's internal struct data.
- */
- memset((char *) mp, 0, sizeof(am_node));
- XFREE(mp);
-}
-
-
-/*
- * Insert mp into the correct place,
- * where p_mp is its parent node.
- * A new node gets placed as the youngest sibling
- * of any other children, and the parent's child
- * pointer is adjusted to point to the new child node.
- */
-void
-insert_am(am_node *mp, am_node *p_mp)
-{
- /*
- * If this is going in at the root then flag it
- * so that it cannot be unmounted by amq.
- */
- if (p_mp == root_node)
- mp->am_flags |= AMF_ROOT;
- /*
- * Fill in n-way links
- */
- mp->am_parent = p_mp;
- mp->am_osib = p_mp->am_child;
- if (mp->am_osib)
- mp->am_osib->am_ysib = mp;
- p_mp->am_child = mp;
-#ifdef HAVE_FS_AUTOFS
- if (p_mp->am_mnt->mf_flags & MFF_IS_AUTOFS)
- mp->am_flags |= AMF_AUTOFS;
-#endif /* HAVE_FS_AUTOFS */
-}
-
-
-/*
- * Remove am from its place in the mount tree
- */
-static void
-remove_am(am_node *mp)
-{
- /*
- * 1. Consistency check
- */
- if (mp->am_child && mp->am_parent) {
- plog(XLOG_WARNING, "children of \"%s\" still exist - deleting anyway", mp->am_path);
- }
-
- /*
- * 2. Update parent's child pointer
- */
- if (mp->am_parent && mp->am_parent->am_child == mp)
- mp->am_parent->am_child = mp->am_osib;
-
- /*
- * 3. Unlink from sibling chain
- */
- if (mp->am_ysib)
- mp->am_ysib->am_osib = mp->am_osib;
- if (mp->am_osib)
- mp->am_osib->am_ysib = mp->am_ysib;
-}
-
-
-/*
- * Compute a new time to live value for a node.
- */
-void
-new_ttl(am_node *mp)
-{
- mp->am_timeo_w = 0;
- mp->am_ttl = clocktime(&mp->am_fattr.na_atime);
- mp->am_ttl += mp->am_timeo; /* sun's -tl option */
-}
-
-
-void
-mk_fattr(nfsfattr *fattr, nfsftype vntype)
-{
- switch (vntype) {
- case NFDIR:
- fattr->na_type = NFDIR;
- fattr->na_mode = NFSMODE_DIR | 0555;
- fattr->na_nlink = 2;
- fattr->na_size = 512;
- break;
- case NFLNK:
- fattr->na_type = NFLNK;
- fattr->na_mode = NFSMODE_LNK | 0777;
- fattr->na_nlink = 1;
- fattr->na_size = 0;
- break;
- default:
- plog(XLOG_FATAL, "Unknown fattr type %d - ignored", vntype);
- break;
- }
-}
-
-
-/*
- * Initialize an allocated mount node.
- * It is assumed that the mount node was b-zero'd
- * before getting here so anything that would
- * be set to zero isn't done here.
- */
-void
-init_map(am_node *mp, char *dir)
-{
- /*
- * mp->am_mapno is initialized by exported_ap_alloc
- * other fields don't need to be set to zero.
- */
- mp->am_mnt = new_mntfs();
- mp->am_mfarray = 0;
- mp->am_name = strdup(dir);
- mp->am_path = strdup(dir);
- mp->am_gen = new_gen();
-#ifdef HAVE_FS_AUTOFS
- mp->am_autofs_fh = 0;
-#endif /* HAVE_FS_AUTOFS */
-
- mp->am_timeo = gopt.am_timeo;
- mp->am_attr.ns_status = NFS_OK;
- mp->am_fattr = gen_fattr;
- mp->am_fattr.na_fsid = 42;
- mp->am_fattr.na_fileid = mp->am_gen;
- clocktime(&mp->am_fattr.na_atime);
- /* next line copies a "struct nfstime" among several fields */
- mp->am_fattr.na_mtime = mp->am_fattr.na_ctime = mp->am_fattr.na_atime;
-
- new_ttl(mp);
- mp->am_stats.s_mtime = mp->am_fattr.na_atime.nt_seconds;
- mp->am_dev = -1;
- mp->am_rdev = -1;
-}
-
-
-/*
- * Free a mount node.
- * The node must be already unmounted.
- */
-void
-free_map(am_node *mp)
-{
- remove_am(mp);
-
- if (mp->am_link)
- XFREE(mp->am_link);
- if (mp->am_name)
- XFREE(mp->am_name);
- if (mp->am_path)
- XFREE(mp->am_path);
- if (mp->am_pref)
- XFREE(mp->am_pref);
- if (mp->am_transp)
- XFREE(mp->am_transp);
-
- if (mp->am_mnt)
- free_mntfs(mp->am_mnt);
-
- if (mp->am_mfarray) {
- mntfs **temp_mf;
- for (temp_mf = mp->am_mfarray; *temp_mf; temp_mf++)
- free_mntfs(*temp_mf);
- XFREE(mp->am_mfarray);
- }
-
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_autofs_fh)
- autofs_release_fh(mp);
-#endif /* HAVE_FS_AUTOFS */
-
- exported_ap_free(mp);
-}
-
-
-static am_node *
-find_ap_recursive(char *dir, am_node *mp)
-{
- if (mp) {
- am_node *mp2;
- if (STREQ(mp->am_path, dir))
- return mp;
-
- if ((mp->am_mnt->mf_flags & MFF_MOUNTED) &&
- STREQ(mp->am_mnt->mf_mount, dir))
- return mp;
-
- mp2 = find_ap_recursive(dir, mp->am_osib);
- if (mp2)
- return mp2;
- return find_ap_recursive(dir, mp->am_child);
- }
-
- return 0;
-}
-
-
-/*
- * Find the mount node corresponding to dir. dir can match either the
- * automount path or, if the node is mounted, the mount location.
- */
-am_node *
-find_ap(char *dir)
-{
- int i;
-
- for (i = last_used_map; i >= 0; --i) {
- am_node *mp = exported_ap[i];
- if (mp && (mp->am_flags & AMF_ROOT)) {
- mp = find_ap_recursive(dir, exported_ap[i]);
- if (mp) {
- return mp;
- }
- }
- }
-
- return 0;
-}
-
-
-/*
- * Find the mount node corresponding
- * to the mntfs structure.
- */
-am_node *
-find_mf(mntfs *mf)
-{
- int i;
-
- for (i = last_used_map; i >= 0; --i) {
- am_node *mp = exported_ap[i];
- if (mp && mp->am_mnt == mf)
- return mp;
- }
-
- return 0;
-}
-
-
-/*
- * Get the filehandle for a particular named directory.
- * This is used during the bootstrap to tell the kernel
- * the filehandles of the initial automount points.
- */
-am_nfs_fh *
-get_root_nfs_fh(char *dir)
-{
- static am_nfs_fh nfh;
- am_node *mp = get_root_ap(dir);
- if (mp) {
- mp_to_fh(mp, &nfh);
- return &nfh;
- }
-
- /*
- * Should never get here...
- */
- plog(XLOG_ERROR, "Can't find root filehandle for %s", dir);
-
- return 0;
-}
-
-
-static am_node *
-get_root_ap(char *dir)
-{
- am_node *mp = find_ap(dir);
-
- if (mp && mp->am_parent == root_node)
- return mp;
-
- return 0;
-}
-
-
-/*
- * Timeout all nodes waiting on
- * a given Fserver.
- */
-void
-map_flush_srvr(fserver *fs)
-{
- int i;
- int done = 0;
-
- for (i = last_used_map; i >= 0; --i) {
- am_node *mp = exported_ap[i];
- if (mp && mp->am_mnt && mp->am_mnt->mf_server == fs) {
- plog(XLOG_INFO, "Flushed %s; dependent on %s", mp->am_path, fs->fs_host);
- mp->am_ttl = clocktime(NULL);
- done = 1;
- }
- }
- if (done)
- reschedule_timeout_mp();
-}
-
-
-/*
- * Mount a top level automount node
- * by calling lookup in the parent
- * (root) node which will cause the
- * automount node to be automounted.
- */
-int
-mount_auto_node(char *dir, opaque_t arg)
-{
- int error = 0;
- am_node *mp = (am_node *) arg;
- am_node *new_mp;
-
- new_mp = mp->am_mnt->mf_ops->lookup_child(mp, dir, &error, VLOOK_CREATE);
- if (new_mp && error < 0) {
- /*
- * We can't allow the fileid of the root node to change.
- * Should be ok to force it to 1, always.
- */
- new_mp->am_gen = new_mp->am_fattr.na_fileid = 1;
-
- new_mp = mp->am_mnt->mf_ops->mount_child(new_mp, &error);
- }
-
- if (error > 0) {
- errno = error; /* XXX */
- plog(XLOG_ERROR, "Could not mount %s: %m", dir);
- }
- return error;
-}
-
-
-/*
- * Cause all the top-level mount nodes
- * to be automounted
- */
-int
-mount_exported(void)
-{
- /*
- * Iterate over all the nodes to be started
- */
- return root_keyiter(mount_auto_node, root_node);
-}
-
-
-/*
- * Construct top-level node
- */
-void
-make_root_node(void)
-{
- mntfs *root_mnt;
- char *rootmap = ROOT_MAP;
- root_node = exported_ap_alloc();
-
- /*
- * Allocate a new map
- */
- init_map(root_node, "");
-
- /*
- * Allocate a new mounted filesystem
- */
- root_mnt = find_mntfs(&amfs_root_ops, (am_opts *) 0, "", rootmap, "", "", "");
-
- /*
- * Replace the initial null reference
- */
- free_mntfs(root_node->am_mnt);
- root_node->am_mnt = root_mnt;
-
- /*
- * Initialize the root
- */
- if (root_mnt->mf_ops->fs_init)
- (*root_mnt->mf_ops->fs_init) (root_mnt);
-
- /*
- * Mount the root
- */
- root_mnt->mf_error = root_mnt->mf_ops->mount_fs(root_node, root_mnt);
-}
-
-
-/*
- * Cause all the nodes to be unmounted by timing
- * them out.
- */
-void
-umount_exported(void)
-{
- int i;
-
- for (i = last_used_map; i >= 0; --i) {
- am_node *mp = exported_ap[i];
- mntfs *mf;
-
- if (!mp)
- continue;
-
- mf = mp->am_mnt;
- if (mf->mf_flags & MFF_UNMOUNTING) {
- /*
- * If this node is being unmounted then just ignore it. However,
- * this could prevent amd from finishing if the unmount gets blocked
- * since the am_node will never be free'd. am_unmounted needs
- * telling about this possibility. - XXX
- */
- continue;
- }
-
- if (!(mf->mf_fsflags & FS_DIRECTORY))
- /*
- * When shutting down this had better
- * look like a directory, otherwise it
- * can't be unmounted!
- */
- mk_fattr(&mp->am_fattr, NFDIR);
-
- if ((--immediate_abort < 0 &&
- !(mp->am_flags & AMF_ROOT) && mp->am_parent) ||
- (mf->mf_flags & MFF_RESTART)) {
-
- /*
- * Just throw this node away without bothering to unmount it. If
- * the server is not known to be up then don't discard the mounted
- * on directory or Amd might hang...
- */
- if (mf->mf_server &&
- (mf->mf_server->fs_flags & (FSF_DOWN | FSF_VALID)) != FSF_VALID)
- mf->mf_flags &= ~MFF_MKMNT;
- if (gopt.flags & CFM_UNMOUNT_ON_EXIT || mp->am_flags & AMF_AUTOFS) {
- plog(XLOG_INFO, "on-exit attempt to unmount %s", mf->mf_mount);
- /*
- * use unmount_mp, not unmount_node, so that unmounts be
- * backgrounded as needed.
- */
- unmount_mp((opaque_t) mp);
- } else {
- am_unmounted(mp);
- }
- exported_ap[i] = 0;
- } else {
- /*
- * Any other node gets forcibly timed out.
- */
- mp->am_flags &= ~AMF_NOTIMEOUT;
- mp->am_mnt->mf_flags &= ~MFF_RSTKEEP;
- mp->am_ttl = 0;
- mp->am_timeo = 1;
- mp->am_timeo_w = 0;
- }
- }
-}
-
-
-/*
- * Try to mount a file system. Can be called directly or in a sub-process by run_task.
- *
- * Warning: this function might be running in a child process context.
- * Don't expect any changes made here to survive in the parent amd process.
- */
-int
-mount_node(opaque_t arg)
-{
- am_node *mp = (am_node *) arg;
- mntfs *mf = mp->am_mnt;
- int error = 0;
-
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_flags & AMF_AUTOFS)
- error = autofs_mount_fs(mp, mf);
- else
-#endif /* HAVE_FS_AUTOFS */
- if (!(mf->mf_flags & MFF_MOUNTED))
- error = mf->mf_ops->mount_fs(mp, mf);
-
- if (error > 0)
- dlog("mount_node: call to mf_ops->mount_fs(%s) failed: %s",
- mp->am_path, strerror(error));
- return error;
-}
-
-
-static int
-unmount_node(opaque_t arg)
-{
- am_node *mp = (am_node *) arg;
- mntfs *mf = mp->am_mnt;
- int error = 0;
-
- if (mf->mf_flags & MFF_ERROR) {
- /*
- * Just unlink
- */
- dlog("No-op unmount of error node %s", mf->mf_info);
- } else {
- dlog("Unmounting <%s> <%s> (%s) flags %x",
- mp->am_path, mf->mf_mount, mf->mf_info, mf->mf_flags);
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_flags & AMF_AUTOFS)
- error = autofs_umount_fs(mp, mf);
- else
-#endif /* HAVE_FS_AUTOFS */
- if (mf->mf_refc == 1)
- error = mf->mf_ops->umount_fs(mp, mf);
- }
-
- /* do this again, it might have changed */
- mf = mp->am_mnt;
- if (error) {
- errno = error; /* XXX */
- dlog("%s: unmount: %m", mf->mf_mount);
- }
-
- return error;
-}
-
-
-static void
-free_map_if_success(int rc, int term, opaque_t arg)
-{
- am_node *mp = (am_node *) arg;
- mntfs *mf = mp->am_mnt;
- wchan_t wchan = get_mntfs_wchan(mf);
-
- /*
- * Not unmounting any more
- */
- mf->mf_flags &= ~MFF_UNMOUNTING;
-
- /*
- * If a timeout was deferred because the underlying filesystem
- * was busy then arrange for a timeout as soon as possible.
- */
- if (mf->mf_flags & MFF_WANTTIMO) {
- mf->mf_flags &= ~MFF_WANTTIMO;
- reschedule_timeout_mp();
- }
- if (term) {
- plog(XLOG_ERROR, "unmount for %s got signal %d", mp->am_path, term);
-#if defined(DEBUG) && defined(SIGTRAP)
- /*
- * dbx likes to put a trap on exit().
- * Pretend it succeeded for now...
- */
- if (term == SIGTRAP) {
- am_unmounted(mp);
- }
-#endif /* DEBUG */
-#ifdef HAVE_FS_AUTOFS
- if (mp->am_flags & AMF_AUTOFS)
- autofs_umount_failed(mp);
-#endif /* HAVE_FS_AUTOFS */
- amd_stats.d_uerr++;
- } else if (rc) {
- if (mf->mf_ops == &amfs_program_ops || rc == EBUSY)
- plog(XLOG_STATS, "\"%s\" on %s still active", mp->am_path, mf->mf_mount);
- else
- plog(XLOG_ERROR, "%s: unmount: %s", mp->am_path, strerror(rc));
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS)
- autofs_get_mp(mp);
- if (mp->am_flags & AMF_AUTOFS)
- autofs_umount_failed(mp);
-#endif /* HAVE_FS_AUTOFS */
- amd_stats.d_uerr++;
- } else {
- am_unmounted(mp);
- }
-
- /*
- * Wakeup anything waiting for this unmount
- */
- wakeup(wchan);
-}
-
-
-int
-unmount_mp(am_node *mp)
-{
- int was_backgrounded = 0;
- mntfs *mf = mp->am_mnt;
-
-#ifdef notdef
- plog(XLOG_INFO, "\"%s\" on %s timed out (flags 0x%x)",
- mp->am_path, mp->am_mnt->mf_mount, (int) mf->mf_flags);
-#endif /* notdef */
-
-#ifndef MNT2_NFS_OPT_SYMTTL
- /*
- * This code is needed to defeat Solaris 2.4's (and newer) symlink
- * values cache. It forces the last-modified time of the symlink to be
- * current. It is not needed if the O/S has an nfs flag to turn off the
- * symlink-cache at mount time (such as Irix 5.x and 6.x). -Erez.
- *
- * Additionally, Linux currently ignores the nt_useconds field,
- * so we must update the nt_seconds field every time if clocktime(NULL)
- * didn't return a new number of seconds.
- */
- if (mp->am_parent) {
- time_t last = mp->am_parent->am_attr.ns_u.ns_attr_u.na_mtime.nt_seconds;
- clocktime(&mp->am_parent->am_attr.ns_u.ns_attr_u.na_mtime);
- /* defensive programming... can't we assert the above condition? */
- if (last == (time_t) mp->am_parent->am_attr.ns_u.ns_attr_u.na_mtime.nt_seconds)
- mp->am_parent->am_attr.ns_u.ns_attr_u.na_mtime.nt_seconds++;
- }
-#endif /* not MNT2_NFS_OPT_SYMTTL */
-
- if (mf->mf_refc == 1 && !FSRV_ISUP(mf->mf_server)) {
- /*
- * Don't try to unmount from a server that is known to be down
- */
- if (!(mf->mf_flags & MFF_LOGDOWN)) {
- /* Only log this once, otherwise gets a bit boring */
- plog(XLOG_STATS, "file server %s is down - timeout of \"%s\" ignored", mf->mf_server->fs_host, mp->am_path);
- mf->mf_flags |= MFF_LOGDOWN;
- }
- return 0;
- }
-
- dlog("\"%s\" on %s timed out", mp->am_path, mp->am_mnt->mf_mount);
- mf->mf_flags |= MFF_UNMOUNTING;
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS)
- autofs_release_mp(mp);
-#endif /* HAVE_FS_AUTOFS */
-
- if ((mf->mf_fsflags & FS_UBACKGROUND) &&
- (mf->mf_flags & MFF_MOUNTED)) {
- dlog("Trying unmount in background");
- run_task(unmount_node, (opaque_t) mp,
- free_map_if_success, (opaque_t) mp);
- was_backgrounded = 1;
- } else {
- dlog("Trying unmount in foreground");
- free_map_if_success(unmount_node((opaque_t) mp), 0, (opaque_t) mp);
- dlog("unmount attempt done");
- }
-
- return was_backgrounded;
-}
-
-
-void
-timeout_mp(opaque_t v) /* argument not used?! */
-{
- int i;
- time_t t = NEVER;
- time_t now = clocktime(NULL);
- int backoff = NumChildren / 4;
-
- dlog("Timing out automount points...");
-
- for (i = last_used_map; i >= 0; --i) {
- am_node *mp = exported_ap[i];
- mntfs *mf;
-
- /*
- * Just continue if nothing mounted
- */
- if (!mp)
- continue;
-
- /*
- * Pick up mounted filesystem
- */
- mf = mp->am_mnt;
- if (!mf)
- continue;
-
-#ifdef HAVE_FS_AUTOFS
- if (mf->mf_flags & MFF_IS_AUTOFS && mp->am_autofs_ttl != NEVER) {
- if (now >= mp->am_autofs_ttl)
- autofs_timeout_mp(mp);
- t = smallest_t(t, mp->am_autofs_ttl);
- }
-#endif /* HAVE_FS_AUTOFS */
-
- if (mp->am_flags & AMF_NOTIMEOUT)
- continue;
-
- /*
- * Don't delete last reference to a restarted filesystem.
- */
- if ((mf->mf_flags & MFF_RSTKEEP) && mf->mf_refc == 1)
- continue;
-
- /*
- * If there is action on this filesystem then ignore it
- */
- if (!(mf->mf_flags & IGNORE_FLAGS)) {
- int expired = 0;
- mf->mf_flags &= ~MFF_WANTTIMO;
- if (now >= mp->am_ttl) {
- if (!backoff) {
- expired = 1;
-
- /*
- * Move the ttl forward to avoid thrashing effects
- * on the next call to timeout!
- */
- /* sun's -tw option */
- if (mp->am_timeo_w < 4 * gopt.am_timeo_w)
- mp->am_timeo_w += gopt.am_timeo_w;
- mp->am_ttl = now + mp->am_timeo_w;
-
- } else {
- /*
- * Just backoff this unmount for
- * a couple of seconds to avoid
- * many multiple unmounts being
- * started in parallel.
- */
- mp->am_ttl = now + backoff + 1;
- }
- }
-
- /*
- * If the next ttl is smallest, use that
- */
- t = smallest_t(t, mp->am_ttl);
-
- if (!mp->am_child && mf->mf_error >= 0 && expired) {
- /*
- * If the unmount was backgrounded then
- * bump the backoff counter.
- */
- if (unmount_mp(mp)) {
- backoff = 2;
- }
- }
- } else if (mf->mf_flags & MFF_UNMOUNTING) {
- mf->mf_flags |= MFF_WANTTIMO;
- }
- }
-
- if (t == NEVER) {
- dlog("No further timeouts");
- t = now + ONE_HOUR;
- }
-
- /*
- * Sanity check to avoid runaways.
- * Absolutely should never get this but
- * if you do without this trap amd will thrash.
- */
- if (t <= now) {
- t = now + 6; /* XXX */
- plog(XLOG_ERROR, "Got a zero interval in timeout_mp()!");
- }
-
- /*
- * XXX - when shutting down, make things happen faster
- */
- if ((int) amd_state >= (int) Finishing)
- t = now + 1;
- dlog("Next mount timeout in %lds", (long) (t - now));
-
- timeout_mp_id = timeout(t - now, timeout_mp, 0);
-}
-
-
-/*
- * Cause timeout_mp to be called soonest
- */
-void
-reschedule_timeout_mp(void)
-{
- if (timeout_mp_id)
- untimeout(timeout_mp_id);
- timeout_mp_id = timeout(0, timeout_mp, 0);
-}
diff --git a/contrib/amd/amd/mapc.c b/contrib/amd/amd/mapc.c
deleted file mode 100644
index d7efdbcfd217..000000000000
--- a/contrib/amd/amd/mapc.c
+++ /dev/null
@@ -1,1192 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/mapc.c
- *
- */
-
-/*
- * Mount map cache
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * Make a duplicate reference to an existing map
- */
-#define mapc_dup(m) ((m)->refc++, (m))
-
-/*
- * Map cache types
- * default, none, incremental, all, regexp
- * MAPC_RE implies MAPC_ALL and must be numerically
- * greater.
- */
-#define MAPC_DFLT 0x000
-#define MAPC_NONE 0x001
-#define MAPC_INC 0x002
-#define MAPC_ROOT 0x004
-#define MAPC_ALL 0x010
-#define MAPC_CACHE_MASK 0x0ff
-#define MAPC_SYNC 0x100
-
-#ifdef HAVE_REGEXEC
-# define MAPC_RE 0x020
-# define MAPC_ISRE(m) ((m)->alloc == MAPC_RE)
-#else /* not HAVE_REGEXEC */
-# define MAPC_ISRE(m) FALSE
-#endif /* not HAVE_REGEXEC */
-
-/*
- * Lookup recursion
- */
-#define MREC_FULL 2
-#define MREC_PART 1
-#define MREC_NONE 0
-
-static struct opt_tab mapc_opt[] =
-{
- {"all", MAPC_ALL},
- {"default", MAPC_DFLT},
- {"inc", MAPC_INC},
- {"mapdefault", MAPC_DFLT},
- {"none", MAPC_NONE},
-#ifdef HAVE_REGEXEC
- {"re", MAPC_RE},
- {"regexp", MAPC_RE},
-#endif /* HAVE_REGEXEC */
- {"sync", MAPC_SYNC},
- {0, 0}
-};
-
-/*
- * Wildcard key
- */
-static char wildcard[] = "*";
-
-/*
- * Map type
- */
-typedef struct map_type map_type;
-struct map_type {
- char *name; /* Name of this map type */
- init_fn *init; /* Initialization */
- reload_fn *reload; /* Reload or fill */
- isup_fn *isup; /* Is service up or not? (1=up, 0=down) */
- search_fn *search; /* Search for new entry */
- mtime_fn *mtime; /* Find modify time */
- int def_alloc; /* Default allocation mode */
-};
-
-/*
- * Map for root node
- */
-static mnt_map *root_map;
-
-/*
- * List of known maps
- */
-qelem map_list_head = {&map_list_head, &map_list_head};
-
-/*
- * Configuration
- */
-
-/* forward definitions */
-static const char *get_full_path(const char *map, const char *path, const char *type);
-static int mapc_meta_search(mnt_map *, char *, char **, int);
-static void mapc_sync(mnt_map *);
-static void mapc_clear(mnt_map *);
-
-/* ROOT MAP */
-static int root_init(mnt_map *, char *, time_t *);
-
-/* ERROR MAP */
-static int error_init(mnt_map *, char *, time_t *);
-static int error_reload(mnt_map *, char *, add_fn *);
-static int error_search(mnt_map *, char *, char *, char **, time_t *);
-static int error_mtime(mnt_map *, char *, time_t *);
-
-/* PASSWD MAPS */
-#ifdef HAVE_MAP_PASSWD
-extern int passwd_init(mnt_map *, char *, time_t *);
-extern int passwd_search(mnt_map *, char *, char *, char **, time_t *);
-#endif /* HAVE_MAP_PASSWD */
-
-/* HESIOD MAPS */
-#ifdef HAVE_MAP_HESIOD
-extern int amu_hesiod_init(mnt_map *, char *map, time_t *tp);
-extern int hesiod_isup(mnt_map *, char *);
-extern int hesiod_search(mnt_map *, char *, char *, char **, time_t *);
-#endif /* HAVE_MAP_HESIOD */
-
-/* LDAP MAPS */
-#ifdef HAVE_MAP_LDAP
-extern int amu_ldap_init(mnt_map *, char *map, time_t *tp);
-extern int amu_ldap_search(mnt_map *, char *, char *, char **, time_t *);
-extern int amu_ldap_mtime(mnt_map *, char *, time_t *);
-#endif /* HAVE_MAP_LDAP */
-
-/* UNION MAPS */
-#ifdef HAVE_MAP_UNION
-extern int union_init(mnt_map *, char *, time_t *);
-extern int union_search(mnt_map *, char *, char *, char **, time_t *);
-extern int union_reload(mnt_map *, char *, add_fn *);
-#endif /* HAVE_MAP_UNION */
-
-/* Network Information Service PLUS (NIS+) */
-#ifdef HAVE_MAP_NISPLUS
-extern int nisplus_init(mnt_map *, char *, time_t *);
-extern int nisplus_reload(mnt_map *, char *, add_fn *);
-extern int nisplus_search(mnt_map *, char *, char *, char **, time_t *);
-extern int nisplus_mtime(mnt_map *, char *, time_t *);
-#endif /* HAVE_MAP_NISPLUS */
-
-/* Network Information Service (YP, Yellow Pages) */
-#ifdef HAVE_MAP_NIS
-extern int nis_init(mnt_map *, char *, time_t *);
-extern int nis_reload(mnt_map *, char *, add_fn *);
-extern int nis_isup(mnt_map *, char *);
-extern int nis_search(mnt_map *, char *, char *, char **, time_t *);
-extern int nis_mtime(mnt_map *, char *, time_t *);
-#endif /* HAVE_MAP_NIS */
-
-/* NDBM MAPS */
-#ifdef HAVE_MAP_NDBM
-extern int ndbm_init(mnt_map *, char *, time_t *);
-extern int ndbm_search(mnt_map *, char *, char *, char **, time_t *);
-extern int ndbm_mtime(mnt_map *, char *, time_t *);
-#endif /* HAVE_MAP_NDBM */
-
-/* EXECUTABLE MAPS */
-#ifdef HAVE_MAP_EXEC
-extern int exec_init(mnt_map *, char *, time_t *);
-extern int exec_search(mnt_map *, char *, char *, char **, time_t *);
-#endif /* HAVE_MAP_EXEC */
-
-/* FILE MAPS */
-#ifdef HAVE_MAP_FILE
-extern int file_init_or_mtime(mnt_map *, char *, time_t *);
-extern int file_reload(mnt_map *, char *, add_fn *);
-extern int file_search(mnt_map *, char *, char *, char **, time_t *);
-#endif /* HAVE_MAP_FILE */
-
-
-/* note that the choice of MAPC_{INC,ALL} will affect browsable_dirs */
-static map_type maptypes[] =
-{
- {
- "root",
- root_init,
- error_reload,
- NULL, /* isup function */
- error_search,
- error_mtime,
- MAPC_ROOT
- },
-#ifdef HAVE_MAP_PASSWD
- {
- "passwd",
- passwd_init,
- error_reload,
- NULL, /* isup function */
- passwd_search,
- error_mtime,
- MAPC_INC
- },
-#endif /* HAVE_MAP_PASSWD */
-#ifdef HAVE_MAP_HESIOD
- {
- "hesiod",
- amu_hesiod_init,
- error_reload,
- hesiod_isup, /* is Hesiod up or not? */
- hesiod_search,
- error_mtime,
- MAPC_INC
- },
-#endif /* HAVE_MAP_HESIOD */
-#ifdef HAVE_MAP_LDAP
- {
- "ldap",
- amu_ldap_init,
- error_reload,
- NULL, /* isup function */
- amu_ldap_search,
- amu_ldap_mtime,
- MAPC_INC
- },
-#endif /* HAVE_MAP_LDAP */
-#ifdef HAVE_MAP_UNION
- {
- "union",
- union_init,
- union_reload,
- NULL, /* isup function */
- union_search,
- error_mtime,
- MAPC_ALL
- },
-#endif /* HAVE_MAP_UNION */
-#ifdef HAVE_MAP_NISPLUS
- {
- "nisplus",
- nisplus_init,
- nisplus_reload,
- NULL, /* isup function */
- nisplus_search,
- nisplus_mtime,
- MAPC_INC
- },
-#endif /* HAVE_MAP_NISPLUS */
-#ifdef HAVE_MAP_NIS
- {
- "nis",
- nis_init,
- nis_reload,
- nis_isup, /* is NIS up or not? */
- nis_search,
- nis_mtime,
- MAPC_ALL
- },
-#endif /* HAVE_MAP_NIS */
-#ifdef HAVE_MAP_NDBM
- {
- "ndbm",
- ndbm_init,
- error_reload,
- NULL, /* isup function */
- ndbm_search,
- ndbm_mtime,
- MAPC_INC
- },
-#endif /* HAVE_MAP_NDBM */
-#ifdef HAVE_MAP_FILE
- {
- "file",
- file_init_or_mtime,
- file_reload,
- NULL, /* isup function */
- file_search,
- file_init_or_mtime,
- MAPC_ALL
- },
-#endif /* HAVE_MAP_FILE */
-#ifdef HAVE_MAP_EXEC
- {
- "exec",
- exec_init,
- error_reload,
- NULL, /* isup function */
- exec_search,
- error_mtime,
- MAPC_INC
- },
-#endif /* HAVE_MAP_EXEC */
- {
- "error",
- error_init,
- error_reload,
- NULL, /* isup function */
- error_search,
- error_mtime,
- MAPC_NONE
- },
-};
-
-
-/*
- * Hash function
- */
-static u_int
-kvhash_of(char *key)
-{
- u_int i, j;
-
- for (i = 0; (j = *key++); i += j) ;
-
- return i % NKVHASH;
-}
-
-
-void
-mapc_showtypes(char *buf, size_t l)
-{
- map_type *mt=NULL, *lastmt;
- int linesize = 0, i;
-
- i = sizeof(maptypes) / sizeof(maptypes[0]);
- lastmt = maptypes + i;
- buf[0] = '\0';
- for (mt = maptypes; mt < lastmt; mt++) {
- xstrlcat(buf, mt->name, l);
- if (mt == (lastmt-1))
- break; /* if last one, don't do xstrlcat's that follows */
- linesize += strlen(mt->name);
- if (--i > 0) {
- xstrlcat(buf, ", ", l);
- linesize += 2;
- }
- if (linesize > 54) {
- linesize = 0;
- xstrlcat(buf, "\n\t\t ", l);
- }
- }
-}
-
-
-/*
- * Check if a map of a certain type exists.
- * Return 1 (true) if exists, 0 (false) if not.
- */
-int
-mapc_type_exists(const char *type)
-{
- map_type *mt;
-
- if (!type)
- return 0;
- for (mt = maptypes;
- mt < maptypes + sizeof(maptypes) / sizeof(maptypes[0]);
- mt++) {
- if (STREQ(type, mt->name))
- return 1;
- }
- return 0; /* not found anywhere */
-}
-
-
-/*
- * Add key and val to the map m.
- * key and val are assumed to be safe copies
- */
-void
-mapc_add_kv(mnt_map *m, char *key, char *val)
-{
- kv **h;
- kv *n;
- int hash = kvhash_of(key);
-#ifdef HAVE_REGEXEC
- regex_t re;
-#endif /* HAVE_REGEXEC */
-
- dlog("add_kv: %s -> %s", key, val);
-
-#ifdef HAVE_REGEXEC
- if (MAPC_ISRE(m)) {
- char pattern[MAXPATHLEN];
- int retval;
-
- /*
- * Make sure the string is bound to the start and end
- */
- xsnprintf(pattern, sizeof(pattern), "^%s$", key);
- retval = regcomp(&re, pattern, REG_ICASE);
- if (retval != 0) {
- char errstr[256];
-
- /* XXX: this code was recently ported, and must be tested -Erez */
- errstr[0] = '\0';
- regerror(retval, &re, errstr, 256);
- plog(XLOG_USER, "error compiling RE \"%s\": %s", pattern, errstr);
- return;
- }
- }
-#endif /* HAVE_REGEXEC */
-
- h = &m->kvhash[hash];
- n = ALLOC(struct kv);
- n->key = key;
-#ifdef HAVE_REGEXEC
- memcpy(&n->re, &re, sizeof(regex_t));
-#endif /* HAVE_REGEXEC */
- n->val = val;
- n->next = *h;
- *h = n;
-}
-
-
-static void
-mapc_repl_kv(mnt_map *m, char *key, char *val)
-{
- kv *k;
-
- /*
- * Compute the hash table offset
- */
- k = m->kvhash[kvhash_of(key)];
-
- /*
- * Scan the linked list for the key
- */
- while (k && !FSTREQ(k->key, key))
- k = k->next;
-
- if (k) {
- XFREE(k->val);
- k->val = val;
- } else {
- mapc_add_kv(m, key, val);
- }
-}
-
-
-/*
- * Search a map for a key.
- * Calls map specific search routine.
- * While map is out of date, keep re-syncing.
- */
-static int
-search_map(mnt_map *m, char *key, char **valp)
-{
- int rc;
-
- do {
- rc = (*m->search) (m, m->map_name, key, valp, &m->modify);
- if (rc < 0) {
- plog(XLOG_MAP, "Re-synchronizing cache for map %s", m->map_name);
- mapc_sync(m);
- }
- } while (rc < 0);
-
- return rc;
-}
-
-
-/*
- * Do a wildcard lookup in the map and
- * save the result.
- */
-static void
-mapc_find_wildcard(mnt_map *m)
-{
- /*
- * Attempt to find the wildcard entry
- */
- int rc = search_map(m, wildcard, &m->wildcard);
-
- if (rc != 0)
- m->wildcard = 0;
-}
-
-
-/*
- * Do a map reload.
- * Attempt to reload without losing current data by switching the hashes
- * round.
- * If reloading was needed and succeeded, return 1; else return 0.
- */
-static int
-mapc_reload_map(mnt_map *m)
-{
- int error, ret = 0;
- kv *maphash[NKVHASH], *tmphash[NKVHASH];
- time_t t;
-
- error = (*m->mtime) (m, m->map_name, &t);
- if (error) {
- t = m->modify;
- }
-
- /*
- * skip reloading maps that have not been modified, unless
- * amq -f was used (do_mapc_reload is 0)
- */
- if (m->reloads != 0 && do_mapc_reload != 0) {
- if (t <= m->modify) {
- plog(XLOG_INFO, "reload of map %s is not needed (in sync)", m->map_name);
- dlog("map %s last load time is %d, last modify time is %d",
- m->map_name, (int) m->modify, (int) t);
- return ret;
- }
- }
-
- /* copy the old hash and zero the map */
- memcpy((voidp) maphash, (voidp) m->kvhash, sizeof(m->kvhash));
- memset((voidp) m->kvhash, 0, sizeof(m->kvhash));
-
- dlog("calling map reload on %s", m->map_name);
- error = (*m->reload) (m, m->map_name, mapc_add_kv);
- if (error) {
- if (m->reloads == 0)
- plog(XLOG_FATAL, "first time load of map %s failed!", m->map_name);
- else
- plog(XLOG_ERROR, "reload of map %s failed - using old values",
- m->map_name);
- mapc_clear(m);
- memcpy((voidp) m->kvhash, (voidp) maphash, sizeof(m->kvhash));
- } else {
- if (m->reloads++ == 0)
- plog(XLOG_INFO, "first time load of map %s succeeded", m->map_name);
- else
- plog(XLOG_INFO, "reload #%d of map %s succeeded",
- m->reloads, m->map_name);
- memcpy((voidp) tmphash, (voidp) m->kvhash, sizeof(m->kvhash));
- memcpy((voidp) m->kvhash, (voidp) maphash, sizeof(m->kvhash));
- mapc_clear(m);
- memcpy((voidp) m->kvhash, (voidp) tmphash, sizeof(m->kvhash));
- m->modify = t;
- ret = 1;
- }
- m->wildcard = 0;
-
- dlog("calling mapc_search for wildcard");
- error = mapc_search(m, wildcard, &m->wildcard);
- if (error)
- m->wildcard = 0;
- return ret;
-}
-
-
-/*
- * Create a new map
- */
-static mnt_map *
-mapc_create(char *map, char *opt, const char *type)
-{
- mnt_map *m = ALLOC(struct mnt_map);
- map_type *mt;
- time_t modify = 0;
- int alloc = 0;
-
- cmdoption(opt, mapc_opt, &alloc);
-
- /*
- * If using a configuration file, and the map_type is defined, then look
- * for it, in the maptypes array. If found, initialize the map using that
- * map_type. If not found, return error. If no map_type was defined,
- * default to cycling through all maptypes.
- */
- if (use_conf_file && type) {
- /* find what type of map this one is */
- for (mt = maptypes;
- mt < maptypes + sizeof(maptypes) / sizeof(maptypes[0]);
- mt++) {
- if (STREQ(type, mt->name)) {
- plog(XLOG_INFO, "initializing amd.conf map %s of type %s", map, type);
- if ((*mt->init) (m, map, &modify) == 0) {
- break;
- } else {
- plog(XLOG_ERROR, "failed to initialize map %s", map);
- error_init(m, map, &modify);
- break;
- }
- }
- } /* end of "for (mt =" loop */
-
- } else { /* cycle through all known maptypes */
-
- /*
- * not using amd conf file or using it by w/o specifying map type
- */
- for (mt = maptypes;
- mt < maptypes + sizeof(maptypes) / sizeof(maptypes[0]);
- mt++) {
- dlog("trying to initialize map %s of type %s ...", map, mt->name);
- if ((*mt->init) (m, map, &modify) == 0) {
- break;
- }
- }
- } /* end of "if (use_conf_file && (colpos = strchr ..." statement */
-
- /* assert: mt in maptypes */
-
- m->flags = alloc & ~MAPC_CACHE_MASK;
- alloc &= MAPC_CACHE_MASK;
-
- if (alloc == MAPC_DFLT)
- alloc = mt->def_alloc;
-
- switch (alloc) {
- default:
- plog(XLOG_USER, "Ambiguous map cache type \"%s\"; using \"inc\"", opt);
- alloc = MAPC_INC;
- /* fall-through... */
- case MAPC_NONE:
- case MAPC_INC:
- case MAPC_ROOT:
- break;
-
- case MAPC_ALL:
- /*
- * If there is no support for reload and it was requested
- * then back off to incremental instead.
- */
- if (mt->reload == error_reload) {
- plog(XLOG_WARNING, "Map type \"%s\" does not support cache type \"all\"; using \"inc\"", mt->name);
- alloc = MAPC_INC;
- }
- break;
-
-#ifdef HAVE_REGEXEC
- case MAPC_RE:
- if (mt->reload == error_reload) {
- plog(XLOG_WARNING, "Map type \"%s\" does not support cache type \"re\"", mt->name);
- mt = &maptypes[sizeof(maptypes) / sizeof(maptypes[0]) - 1];
- /* assert: mt->name == "error" */
- }
- break;
-#endif /* HAVE_REGEXEC */
- }
-
- dlog("Map for %s coming from maptype %s", map, mt->name);
-
- m->alloc = alloc;
- m->reload = mt->reload;
- m->isup = mt->isup;
- m->modify = modify;
- m->search = alloc >= MAPC_ALL ? error_search : mt->search;
- m->mtime = mt->mtime;
- memset((voidp) m->kvhash, 0, sizeof(m->kvhash));
- m->map_name = strdup(map);
- m->refc = 1;
- m->wildcard = 0;
- m->reloads = 0;
- /* Unfortunately with current code structure, this cannot be initialized here */
- m->cfm = NULL;
-
- /*
- * synchronize cache with reality
- */
- mapc_sync(m);
-
- return m;
-}
-
-
-/*
- * Free the cached data in a map
- */
-static void
-mapc_clear(mnt_map *m)
-{
- int i;
-
- /*
- * For each of the hash slots, chain
- * along free'ing the data.
- */
- for (i = 0; i < NKVHASH; i++) {
- kv *k = m->kvhash[i];
- while (k) {
- kv *n = k->next;
- XFREE(k->key);
- if (k->val)
- XFREE(k->val);
- XFREE(k);
- k = n;
- }
- }
-
- /*
- * Zero the hash slots
- */
- memset((voidp) m->kvhash, 0, sizeof(m->kvhash));
-
- /*
- * Free the wildcard if it exists
- */
- if (m->wildcard) {
- XFREE(m->wildcard);
- m->wildcard = 0;
- }
-}
-
-
-/*
- * Find a map, or create one if it does not exist
- */
-mnt_map *
-mapc_find(char *map, char *opt, const char *maptype)
-{
- mnt_map *m;
-
- /*
- * Search the list of known maps to see if
- * it has already been loaded. If it is found
- * then return a duplicate reference to it.
- * Otherwise make a new map as required and
- * add it to the list of maps
- */
- ITER(m, mnt_map, &map_list_head)
- if (STREQ(m->map_name, map))
- return mapc_dup(m);
- m = mapc_create(map, opt, maptype);
- ins_que(&m->hdr, &map_list_head);
-
- return m;
-}
-
-
-/*
- * Free a map.
- */
-void
-mapc_free(opaque_t arg)
-{
- mnt_map *m = (mnt_map *) arg;
-
- /*
- * Decrement the reference count.
- * If the reference count hits zero
- * then throw the map away.
- */
- if (m && --m->refc == 0) {
- mapc_clear(m);
- XFREE(m->map_name);
- rem_que(&m->hdr);
- XFREE(m);
- }
-}
-
-
-/*
- * Search the map for the key. Put a safe (malloc'ed) copy in *pval or
- * return an error code
- */
-static int
-mapc_meta_search(mnt_map *m, char *key, char **pval, int recurse)
-{
- int error = 0;
- kv *k = 0;
-
- /*
- * Firewall
- */
- if (!m) {
- plog(XLOG_ERROR, "Null map request for %s", key);
- return ENOENT;
- }
-
- if (m->flags & MAPC_SYNC) {
- /*
- * Get modify time...
- */
- time_t t;
- error = (*m->mtime) (m, m->map_name, &t);
- if (error || t > m->modify) {
- plog(XLOG_INFO, "Map %s is out of date", m->map_name);
- mapc_sync(m);
- }
- }
-
- if (!MAPC_ISRE(m)) {
- /*
- * Compute the hash table offset
- */
- k = m->kvhash[kvhash_of(key)];
-
- /*
- * Scan the linked list for the key
- */
- while (k && !FSTREQ(k->key, key))
- k = k->next;
-
- }
-
-#ifdef HAVE_REGEXEC
- else if (recurse == MREC_FULL) {
- /*
- * Try for an RE match against the entire map.
- * Note that this will be done in a "random"
- * order.
- */
- int i;
-
- for (i = 0; i < NKVHASH; i++) {
- k = m->kvhash[i];
- while (k) {
- int retval;
-
- /* XXX: this code was recently ported, and must be tested -Erez */
- retval = regexec(&k->re, key, 0, 0, 0);
- if (retval == 0) { /* succeeded */
- break;
- } else { /* failed to match, log error */
- char errstr[256];
-
- errstr[0] = '\0';
- regerror(retval, &k->re, errstr, 256);
- plog(XLOG_USER, "error matching RE \"%s\" against \"%s\": %s",
- key, k->key, errstr);
- }
- k = k->next;
- }
- if (k)
- break;
- }
- }
-#endif /* HAVE_REGEXEC */
-
- /*
- * If found then take a copy
- */
- if (k) {
- if (k->val)
- *pval = strdup(k->val);
- else
- error = ENOENT;
- } else if (m->alloc >= MAPC_ALL) {
- /*
- * If the entire map is cached then this
- * key does not exist.
- */
- error = ENOENT;
- } else {
- /*
- * Otherwise search the map. If we are
- * in incremental mode then add the key
- * to the cache.
- */
- error = search_map(m, key, pval);
- if (!error && m->alloc == MAPC_INC)
- mapc_add_kv(m, strdup(key), strdup(*pval));
- }
-
- /*
- * If an error, and a wildcard exists,
- * and the key is not internal then
- * return a copy of the wildcard.
- */
- if (error > 0) {
- if (recurse == MREC_FULL && !MAPC_ISRE(m)) {
- char wildname[MAXPATHLEN];
- char *subp;
- if (*key == '/')
- return error;
- /*
- * Keep chopping sub-directories from the RHS
- * and replacing with "/ *" and repeat the lookup.
- * For example:
- * "src/gnu/gcc" -> "src / gnu / *" -> "src / *"
- */
- xstrlcpy(wildname, key, sizeof(wildname));
- while (error && (subp = strrchr(wildname, '/'))) {
- /*
- * sizeof space left in subp is sizeof wildname minus what's left
- * after the strchr above returned a pointer inside wildname into
- * subp.
- */
- xstrlcpy(subp, "/*", sizeof(wildname) - (subp - wildname));
- dlog("mapc recurses on %s", wildname);
- error = mapc_meta_search(m, wildname, pval, MREC_PART);
- if (error)
- *subp = 0;
- }
-
- if (error > 0 && m->wildcard) {
- *pval = strdup(m->wildcard);
- error = 0;
- }
- }
- }
- return error;
-}
-
-
-int
-mapc_search(mnt_map *m, char *key, char **pval)
-{
- return mapc_meta_search(m, key, pval, MREC_FULL);
-}
-
-
-/*
- * Get map cache in sync with physical representation
- */
-static void
-mapc_sync(mnt_map *m)
-{
- int need_mtime_update = 0;
-
- if (m->alloc == MAPC_ROOT)
- return; /* nothing to do */
-
- /* do not clear map if map service is down */
- if (m->isup) {
- if (!((*m->isup)(m, m->map_name))) {
- plog(XLOG_ERROR, "mapc_sync: map %s is down: not clearing map", m->map_name);
- return;
- }
- }
-
- if (m->alloc >= MAPC_ALL) {
- /* mapc_reload_map() always works */
- need_mtime_update = mapc_reload_map(m);
- } else {
- mapc_clear(m);
- /*
- * Attempt to find the wildcard entry
- */
- mapc_find_wildcard(m);
- need_mtime_update = 1; /* because mapc_clear always works */
- }
-
- /*
- * To be safe, update the mtime of the mnt_map's own node, so that the
- * kernel will flush all of its cached entries.
- */
- if (need_mtime_update && m->cfm) {
- am_node *mp = find_ap(m->cfm->cfm_dir);
- if (mp) {
- clocktime(&mp->am_fattr.na_mtime);
- } else {
- plog(XLOG_ERROR, "cannot find map %s to update its mtime",
- m->cfm->cfm_dir);
- }
- }
-}
-
-
-/*
- * Reload all the maps
- * Called when Amd gets hit by a SIGHUP.
- */
-void
-mapc_reload(void)
-{
- mnt_map *m;
-
- /*
- * For all the maps,
- * Throw away the existing information.
- * Do a reload
- * Find the wildcard
- */
- ITER(m, mnt_map, &map_list_head)
- mapc_sync(m);
-}
-
-
-/*
- * Root map.
- * The root map is used to bootstrap amd.
- * All the require top-level mounts are added
- * into the root map and then the map is iterated
- * and a lookup is done on all the mount points.
- * This causes the top level mounts to be automounted.
- */
-static int
-root_init(mnt_map *m, char *map, time_t *tp)
-{
- *tp = clocktime(NULL);
- return STREQ(map, ROOT_MAP) ? 0 : ENOENT;
-}
-
-
-/*
- * Add a new entry to the root map
- *
- * dir - directory (key)
- * opts - mount options
- * map - map name
- * cfm - optional amd configuration file map section structure
- */
-void
-root_newmap(const char *dir, const char *opts, const char *map, const cf_map_t *cfm)
-{
- char str[MAXPATHLEN];
-
- /*
- * First make sure we have a root map to talk about...
- */
- if (!root_map)
- root_map = mapc_find(ROOT_MAP, "mapdefault", NULL);
-
- /*
- * Then add the entry...
- */
-
- /*
- * Here I plug in the code to process other amd.conf options like
- * map_type, search_path, and flags (browsable_dirs, mount_type).
- */
-
- if (cfm) {
- if (map) {
- xsnprintf(str, sizeof(str),
- "cache:=mapdefault;type:=toplvl;mount_type:=%s;fs:=\"%s\"",
- cfm->cfm_flags & CFM_MOUNT_TYPE_AUTOFS ? "autofs" : "nfs",
- get_full_path(map, cfm->cfm_search_path, cfm->cfm_type));
- if (opts && opts[0] != '\0') {
- xstrlcat(str, ";", sizeof(str));
- xstrlcat(str, opts, sizeof(str));
- }
- if (cfm->cfm_flags & CFM_BROWSABLE_DIRS_FULL)
- xstrlcat(str, ";opts:=rw,fullybrowsable", sizeof(str));
- if (cfm->cfm_flags & CFM_BROWSABLE_DIRS)
- xstrlcat(str, ";opts:=rw,browsable", sizeof(str));
- if (cfm->cfm_type) {
- xstrlcat(str, ";maptype:=", sizeof(str));
- xstrlcat(str, cfm->cfm_type, sizeof(str));
- }
- } else {
- xstrlcpy(str, opts, sizeof(str));
- }
- } else {
- if (map)
- xsnprintf(str, sizeof(str),
- "cache:=mapdefault;type:=toplvl;fs:=\"%s\";%s",
- map, opts ? opts : "");
- else
- xstrlcpy(str, opts, sizeof(str));
- }
- mapc_repl_kv(root_map, strdup((char *)dir), strdup(str));
-}
-
-
-int
-mapc_keyiter(mnt_map *m, key_fun *fn, opaque_t arg)
-{
- int i;
- int c = 0;
-
- for (i = 0; i < NKVHASH; i++) {
- kv *k = m->kvhash[i];
- while (k) {
- (*fn) (k->key, arg);
- k = k->next;
- c++;
- }
- }
-
- return c;
-}
-
-
-/*
- * Iterate on the root map and call (*fn)() on the key of all the nodes.
- * Returns the number of entries in the root map.
- */
-int
-root_keyiter(key_fun *fn, opaque_t arg)
-{
- if (root_map) {
- int c = mapc_keyiter(root_map, fn, arg);
- return c;
- }
-
- return 0;
-}
-
-
-/*
- * Error map
- */
-static int
-error_init(mnt_map *m, char *map, time_t *tp)
-{
- plog(XLOG_USER, "No source data for map %s", map);
- *tp = 0;
-
- return 0;
-}
-
-
-static int
-error_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp)
-{
- return ENOENT;
-}
-
-
-static int
-error_reload(mnt_map *m, char *map, add_fn *fn)
-{
- return ENOENT;
-}
-
-
-static int
-error_mtime(mnt_map *m, char *map, time_t *tp)
-{
- *tp = 0;
-
- return 0;
-}
-
-
-/*
- * Return absolute path of map, searched in a type-specific path.
- * Note: uses a static buffer for returned data.
- */
-static const char *
-get_full_path(const char *map, const char *path, const char *type)
-{
- char component[MAXPATHLEN], *str;
- static char full_path[MAXPATHLEN];
- int len;
-
- /* for now, only file-type search paths are implemented */
- if (type && !STREQ(type, "file"))
- return map;
-
- /* if null map, return it */
- if (!map)
- return map;
-
- /* if map includes a '/', return it (absolute or relative path) */
- if (strchr(map, '/'))
- return map;
-
- /* if path is empty, return map */
- if (!path)
- return map;
-
- /* now break path into components, and search in each */
- xstrlcpy(component, path, sizeof(component));
-
- str = strtok(component, ":");
- do {
- xstrlcpy(full_path, str, sizeof(full_path));
- len = strlen(full_path);
- if (full_path[len - 1] != '/') /* add trailing "/" if needed */
- xstrlcat(full_path, "/", sizeof(full_path));
- xstrlcat(full_path, map, sizeof(full_path));
- if (access(full_path, R_OK) == 0)
- return full_path;
- str = strtok(NULL, ":");
- } while (str);
-
- return map; /* if found nothing, return map */
-}
diff --git a/contrib/amd/amd/mntfs.c b/contrib/amd/amd/mntfs.c
deleted file mode 100644
index 6021838425c0..000000000000
--- a/contrib/amd/amd/mntfs.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/mntfs.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-qelem mfhead = {&mfhead, &mfhead};
-
-int mntfs_allocated;
-
-
-mntfs *
-dup_mntfs(mntfs *mf)
-{
- if (mf->mf_refc == 0) {
- if (mf->mf_cid)
- untimeout(mf->mf_cid);
- mf->mf_cid = 0;
- }
- mf->mf_refc++;
-
- return mf;
-}
-
-
-static void
-init_mntfs(mntfs *mf, am_ops *ops, am_opts *mo, char *mp, char *info, char *auto_opts, char *mopts, char *remopts)
-{
- mf->mf_ops = ops;
- mf->mf_fsflags = ops->nfs_fs_flags;
- mf->mf_fo = mo;
- mf->mf_mount = strdup(mp);
- mf->mf_info = strdup(info);
- mf->mf_auto = strdup(auto_opts);
- mf->mf_mopts = strdup(mopts);
- mf->mf_remopts = strdup(remopts);
- mf->mf_loopdev = NULL;
- mf->mf_refc = 1;
- mf->mf_flags = 0;
- mf->mf_error = -1;
- mf->mf_cid = 0;
- mf->mf_private = 0;
- mf->mf_prfree = 0;
-
- if (ops->ffserver)
- mf->mf_server = (*ops->ffserver) (mf);
- else
- mf->mf_server = 0;
-}
-
-
-static mntfs *
-alloc_mntfs(am_ops *ops, am_opts *mo, char *mp, char *info, char *auto_opts, char *mopts, char *remopts)
-{
- mntfs *mf = ALLOC(struct mntfs);
-
- init_mntfs(mf, ops, mo, mp, info, auto_opts, mopts, remopts);
- ins_que(&mf->mf_q, &mfhead);
- mntfs_allocated++;
-
- return mf;
-}
-
-
-/* find a matching mntfs in our list */
-mntfs *
-locate_mntfs(am_ops *ops, am_opts *mo, char *mp, char *info, char *auto_opts, char *mopts, char *remopts)
-{
- mntfs *mf;
-
- dlog("Locating mntfs reference to (%s,%s)", mp, info);
-
- ITER(mf, mntfs, &mfhead) {
- /*
- * For backwards compatibility purposes, we treat already-mounted
- * filesystems differently and only require a match of their mount point,
- * not of their server info. After all, there is little we can do if
- * the user asks us to mount two different things onto the same mount: one
- * will always cover the other one.
- */
- if (STREQ(mf->mf_mount, mp) &&
- ((mf->mf_flags & MFF_MOUNTED && !(mf->mf_fsflags & FS_DIRECT))
- || (STREQ(mf->mf_info, info) && mf->mf_ops == ops))) {
- /*
- * Handle cases where error ops are involved
- */
- if (ops == &amfs_error_ops) {
- /*
- * If the existing ops are not amfs_error_ops
- * then continue...
- */
- if (mf->mf_ops != &amfs_error_ops)
- continue;
- return dup_mntfs(mf);
- }
-
- dlog("mf->mf_flags = %#x", mf->mf_flags);
- mf->mf_fo = mo;
- if ((mf->mf_flags & MFF_RESTART) && amd_state < Finishing) {
- /*
- * Restart a previously mounted filesystem.
- */
- dlog("Restarting filesystem %s", mf->mf_mount);
-
- /*
- * If we are restarting an amd internal filesystem,
- * we need to initialize it a bit.
- *
- * We know it's internal because it is marked as toplvl.
- */
- if (mf->mf_ops == &amfs_toplvl_ops) {
- mf->mf_ops = ops;
- mf->mf_info = strealloc(mf->mf_info, info);
- ops->mounted(mf); /* XXX: not right, but will do for now */
- }
-
- return mf;
- }
-
- if (!(mf->mf_flags & (MFF_MOUNTED | MFF_MOUNTING | MFF_UNMOUNTING))) {
- fserver *fs;
- mf->mf_flags &= ~MFF_ERROR;
- mf->mf_error = -1;
- mf->mf_auto = strealloc(mf->mf_auto, auto_opts);
- mf->mf_mopts = strealloc(mf->mf_mopts, mopts);
- mf->mf_remopts = strealloc(mf->mf_remopts, remopts);
- mf->mf_info = strealloc(mf->mf_info, info);
-
- if (mf->mf_private && mf->mf_prfree) {
- mf->mf_prfree(mf->mf_private);
- mf->mf_private = 0;
- }
-
- fs = ops->ffserver ? (*ops->ffserver) (mf) : (fserver *) NULL;
- if (mf->mf_server)
- free_srvr(mf->mf_server);
- mf->mf_server = fs;
- }
- return dup_mntfs(mf);
- } /* end of "if (STREQ(mf-> ..." */
- } /* end of ITER */
-
- return 0;
-}
-
-
-/* find a matching mntfs in our list, create a new one if none is found */
-mntfs *
-find_mntfs(am_ops *ops, am_opts *mo, char *mp, char *info, char *auto_opts, char *mopts, char *remopts)
-{
- mntfs *mf = locate_mntfs(ops, mo, mp, info, auto_opts, mopts, remopts);
- if (mf)
- return mf;
-
- return alloc_mntfs(ops, mo, mp, info, auto_opts, mopts, remopts);
-}
-
-
-mntfs *
-new_mntfs(void)
-{
- return alloc_mntfs(&amfs_error_ops, (am_opts *) 0, "//nil//", ".", "", "", "");
-}
-
-
-static void
-uninit_mntfs(mntfs *mf)
-{
- if (mf->mf_auto)
- XFREE(mf->mf_auto);
- if (mf->mf_mopts)
- XFREE(mf->mf_mopts);
- if (mf->mf_remopts)
- XFREE(mf->mf_remopts);
- if (mf->mf_info)
- XFREE(mf->mf_info);
- if (mf->mf_private && mf->mf_prfree)
- (*mf->mf_prfree) (mf->mf_private);
-
- if (mf->mf_mount)
- XFREE(mf->mf_mount);
-
- /*
- * Clean up the file server
- */
- if (mf->mf_server)
- free_srvr(mf->mf_server);
-
- /*
- * Don't do a callback on this mount
- */
- if (mf->mf_cid) {
- untimeout(mf->mf_cid);
- mf->mf_cid = 0;
- }
-}
-
-
-static void
-discard_mntfs(voidp v)
-{
- mntfs *mf = v;
-
- rem_que(&mf->mf_q);
-
- /*
- * Free memory
- */
- uninit_mntfs(mf);
- XFREE(mf);
-
- --mntfs_allocated;
-}
-
-
-void
-flush_mntfs(void)
-{
- mntfs *mf;
-
- mf = AM_FIRST(mntfs, &mfhead);
- while (mf != HEAD(mntfs, &mfhead)) {
- mntfs *mf2 = mf;
- mf = NEXT(mntfs, mf);
- if (mf2->mf_refc == 0 && mf2->mf_cid)
- discard_mntfs(mf2);
- }
-}
-
-
-void
-free_mntfs(opaque_t arg)
-{
- mntfs *mf = (mntfs *) arg;
-
- dlog("free_mntfs <%s> type %s mf_refc %d flags %x",
- mf->mf_mount, mf->mf_ops->fs_type, mf->mf_refc, mf->mf_flags);
-
- /*
- * We shouldn't ever be called to free something that has
- * a non-positive refcount. Something is badly wrong if
- * we have been! Ignore the request for now...
- */
- if (mf->mf_refc <= 0) {
- plog(XLOG_ERROR, "IGNORING free_mntfs for <%s>: refc %d, flags %x (bug?)",
- mf->mf_mount, mf->mf_refc, mf->mf_flags);
- return;
- }
-
- /* don't discard last reference of a restarted/kept mntfs */
- if (mf->mf_refc == 1 && mf->mf_flags & MFF_RSTKEEP) {
- plog(XLOG_ERROR, "IGNORING free_mntfs for <%s>: refc %d, flags %x (restarted)",
- mf->mf_mount, mf->mf_refc, mf->mf_flags);
- return;
- }
-
- if (--mf->mf_refc == 0) {
- if (mf->mf_flags & MFF_MOUNTED) {
- int quoted;
- mf->mf_flags &= ~MFF_MOUNTED;
-
- /*
- * Record for posterity
- */
- quoted = strchr(mf->mf_info, ' ') != 0; /* cheap */
- plog(XLOG_INFO, "%s%s%s %sed fstype %s from %s",
- quoted ? "\"" : "",
- mf->mf_info,
- quoted ? "\"" : "",
- mf->mf_error ? "discard" : "unmount",
- mf->mf_ops->fs_type, mf->mf_mount);
- }
-
- if (mf->mf_fsflags & FS_DISCARD) {
- dlog("Immediately discarding mntfs for %s", mf->mf_mount);
- discard_mntfs(mf);
-
- } else {
-
- if (mf->mf_flags & MFF_RESTART) {
- dlog("Discarding remount hook for %s", mf->mf_mount);
- } else {
- dlog("Discarding last mntfs reference to %s fstype %s",
- mf->mf_mount, mf->mf_ops->fs_type);
- }
- if (mf->mf_flags & (MFF_MOUNTED | MFF_MOUNTING | MFF_UNMOUNTING))
- dlog("mntfs reference for %s still active", mf->mf_mount);
- mf->mf_cid = timeout(ALLOWED_MOUNT_TIME, discard_mntfs, (voidp) mf);
- }
- }
-}
-
-
-mntfs *
-realloc_mntfs(mntfs *mf, am_ops *ops, am_opts *mo, char *mp, char *info, char *auto_opts, char *mopts, char *remopts)
-{
- mntfs *mf2;
-
- if (mf->mf_refc == 1 &&
- mf->mf_flags & MFF_RESTART &&
- STREQ(mf->mf_mount, mp)) {
- /*
- * If we are inheriting then just return
- * the same node...
- */
- return mf;
- }
-
- /*
- * Re-use the existing mntfs if it is mounted.
- * This traps a race in nfsx.
- */
- if (mf->mf_ops != &amfs_error_ops &&
- (mf->mf_flags & MFF_MOUNTED) &&
- !FSRV_ISDOWN(mf->mf_server)) {
- mf->mf_fo = mo;
- return mf;
- }
-
- mf2 = find_mntfs(ops, mo, mp, info, auto_opts, mopts, remopts);
- free_mntfs(mf);
- return mf2;
-}
diff --git a/contrib/amd/amd/nfs_prot_svc.c b/contrib/amd/amd/nfs_prot_svc.c
deleted file mode 100644
index 0dd6992cf9e7..000000000000
--- a/contrib/amd/amd/nfs_prot_svc.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/nfs_prot_svc.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* external definitions */
-extern voidp nfsproc_null_2_svc(voidp, struct svc_req *);
-extern nfsattrstat *nfsproc_getattr_2_svc(am_nfs_fh *, struct svc_req *);
-extern nfsattrstat *nfsproc_setattr_2_svc(nfssattrargs *, struct svc_req *);
-extern voidp nfsproc_root_2_svc(voidp, struct svc_req *);
-extern nfsdiropres *nfsproc_lookup_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsreadlinkres *nfsproc_readlink_2_svc(am_nfs_fh *, struct svc_req *);
-extern nfsreadres *nfsproc_read_2_svc(nfsreadargs *, struct svc_req *);
-extern voidp nfsproc_writecache_2_svc(voidp, struct svc_req *);
-extern nfsattrstat *nfsproc_write_2_svc(nfswriteargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_create_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_remove_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsstat *nfsproc_rename_2_svc(nfsrenameargs *, struct svc_req *);
-extern nfsstat *nfsproc_link_2_svc(nfslinkargs *, struct svc_req *);
-extern nfsstat *nfsproc_symlink_2_svc(nfssymlinkargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_mkdir_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_rmdir_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsreaddirres *nfsproc_readdir_2_svc(nfsreaddirargs *, struct svc_req *);
-extern nfsstatfsres *nfsproc_statfs_2_svc(am_nfs_fh *, struct svc_req *);
-
-/* global variables */
-SVCXPRT *current_transp;
-
-/* typedefs */
-typedef char *(*nfssvcproc_t)(voidp, struct svc_req *);
-
-
-void
-nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
-{
- union {
- am_nfs_fh nfsproc_getattr_2_arg;
- nfssattrargs nfsproc_setattr_2_arg;
- nfsdiropargs nfsproc_lookup_2_arg;
- am_nfs_fh nfsproc_readlink_2_arg;
- nfsreadargs nfsproc_read_2_arg;
- nfswriteargs nfsproc_write_2_arg;
- nfscreateargs nfsproc_create_2_arg;
- nfsdiropargs nfsproc_remove_2_arg;
- nfsrenameargs nfsproc_rename_2_arg;
- nfslinkargs nfsproc_link_2_arg;
- nfssymlinkargs nfsproc_symlink_2_arg;
- nfscreateargs nfsproc_mkdir_2_arg;
- nfsdiropargs fsproc_rmdir_2_arg;
- nfsreaddirargs nfsproc_readdir_2_arg;
- am_nfs_fh nfsproc_statfs_2_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- nfssvcproc_t local;
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- /*
- * On TLI systems we don't use an INET network type, but a "ticlts" (see
- * /etc/netconfig and conf/transp_tli.c:create_nfs_service). This means
- * that packets could only come from the loopback interface, and we don't
- * need to check them and filter possibly spoofed packets. Therefore we
- * only need to check if the UID caller is correct.
- */
-# ifdef HAVE___RPC_GET_LOCAL_UID
- uid_t u;
- /* extern definition for an internal libnsl function */
- extern int __rpc_get_local_uid(SVCXPRT *transp, uid_t *uid);
- if (__rpc_get_local_uid(transp, &u) >= 0 && u != 0) {
- plog(XLOG_WARNING, "ignoring request from UID %ld, must be 0", (long) u);
- return;
- }
-# else /* not HAVE___RPC_GET_LOCAL_UID */
- dlog("cannot verify local uid for rpc request");
-# endif /* HAVE___RPC_GET_LOCAL_UID */
-#else /* not HAVE_TRANPORT_TYPE_TLI */
- struct sockaddr_in *sinp;
- char dq[20], dq2[28];
- sinp = amu_svc_getcaller(rqstp->rq_xprt);
-# ifdef MNT2_NFS_OPT_RESVPORT
- /* Verify that the request comes from a reserved port */
- if (sinp &&
- ntohs(sinp->sin_port) >= IPPORT_RESERVED &&
- !(gopt.flags & CFM_NFS_INSECURE_PORT)) {
- plog(XLOG_WARNING, "ignoring request from %s:%u, port not reserved",
- inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr),
- ntohs(sinp->sin_port));
- return;
- }
-# endif /* MNT2_NFS_OPT_RESVPORT */
- /* if the address does not match, ignore the request */
- if (sinp && (sinp->sin_addr.s_addr != myipaddr.s_addr)) {
- if (gopt.flags & CFM_NFS_ANY_INTERFACE) {
- if (!is_interface_local(sinp->sin_addr.s_addr)) {
- plog(XLOG_WARNING, "ignoring request from %s:%u, not a local interface",
- inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr),
- ntohs(sinp->sin_port));
- }
- } else {
- plog(XLOG_WARNING, "ignoring request from %s:%u, expected %s",
- inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr),
- ntohs(sinp->sin_port),
- inet_dquad(dq2, sizeof(dq2), myipaddr.s_addr));
- return;
- }
- }
-#endif /* not HAVE_TRANPORT_TYPE_TLI */
-
- current_transp = NULL;
-
- switch (rqstp->rq_proc) {
-
- case NFSPROC_NULL:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (nfssvcproc_t) nfsproc_null_2_svc;
- break;
-
- case NFSPROC_GETATTR:
- xdr_argument = (xdrproc_t) xdr_nfs_fh;
- xdr_result = (xdrproc_t) xdr_attrstat;
- local = (nfssvcproc_t) nfsproc_getattr_2_svc;
- break;
-
- case NFSPROC_SETATTR:
- xdr_argument = (xdrproc_t) xdr_sattrargs;
- xdr_result = (xdrproc_t) xdr_attrstat;
- local = (nfssvcproc_t) nfsproc_setattr_2_svc;
- break;
-
- case NFSPROC_ROOT:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (nfssvcproc_t) nfsproc_root_2_svc;
- break;
-
- case NFSPROC_LOOKUP:
- xdr_argument = (xdrproc_t) xdr_diropargs;
- xdr_result = (xdrproc_t) xdr_diropres;
- local = (nfssvcproc_t) nfsproc_lookup_2_svc;
- /*
- * Cheap way to pass transp down to amfs_auto_lookuppn so it can
- * be stored in the am_node structure and later used for
- * quick_reply().
- */
- current_transp = transp;
- break;
-
- case NFSPROC_READLINK:
- xdr_argument = (xdrproc_t) xdr_nfs_fh;
- xdr_result = (xdrproc_t) xdr_readlinkres;
- local = (nfssvcproc_t) nfsproc_readlink_2_svc;
- break;
-
- case NFSPROC_READ:
- xdr_argument = (xdrproc_t) xdr_readargs;
- xdr_result = (xdrproc_t) xdr_readres;
- local = (nfssvcproc_t) nfsproc_read_2_svc;
- break;
-
- case NFSPROC_WRITECACHE:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (nfssvcproc_t) nfsproc_writecache_2_svc;
- break;
-
- case NFSPROC_WRITE:
- xdr_argument = (xdrproc_t) xdr_writeargs;
- xdr_result = (xdrproc_t) xdr_attrstat;
- local = (nfssvcproc_t) nfsproc_write_2_svc;
- break;
-
- case NFSPROC_CREATE:
- xdr_argument = (xdrproc_t) xdr_createargs;
- xdr_result = (xdrproc_t) xdr_diropres;
- local = (nfssvcproc_t) nfsproc_create_2_svc;
- break;
-
- case NFSPROC_REMOVE:
- xdr_argument = (xdrproc_t) xdr_diropargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_remove_2_svc;
- break;
-
- case NFSPROC_RENAME:
- xdr_argument = (xdrproc_t) xdr_renameargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_rename_2_svc;
- break;
-
- case NFSPROC_LINK:
- xdr_argument = (xdrproc_t) xdr_linkargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_link_2_svc;
- break;
-
- case NFSPROC_SYMLINK:
- xdr_argument = (xdrproc_t) xdr_symlinkargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_symlink_2_svc;
- break;
-
- case NFSPROC_MKDIR:
- xdr_argument = (xdrproc_t) xdr_createargs;
- xdr_result = (xdrproc_t) xdr_diropres;
- local = (nfssvcproc_t) nfsproc_mkdir_2_svc;
- break;
-
- case NFSPROC_RMDIR:
- xdr_argument = (xdrproc_t) xdr_diropargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_rmdir_2_svc;
- break;
-
- case NFSPROC_READDIR:
- xdr_argument = (xdrproc_t) xdr_readdirargs;
- xdr_result = (xdrproc_t) xdr_readdirres;
- local = (nfssvcproc_t) nfsproc_readdir_2_svc;
- break;
-
- case NFSPROC_STATFS:
- xdr_argument = (xdrproc_t) xdr_nfs_fh;
- xdr_result = (xdrproc_t) xdr_statfsres;
- local = (nfssvcproc_t) nfsproc_statfs_2_svc;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
-
- memset((char *) &argument, 0, sizeof(argument));
- if (!svc_getargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) &argument)) {
- plog(XLOG_ERROR,
- "NFS xdr decode failed for %d %d %d",
- (int) rqstp->rq_prog, (int) rqstp->rq_vers, (int) rqstp->rq_proc);
- svcerr_decode(transp);
- return;
- }
- result = (*local) (&argument, rqstp);
-
- current_transp = NULL;
-
- if (result != NULL && !svc_sendreply(transp,
- (XDRPROC_T_TYPE) xdr_result,
- result)) {
- svcerr_systemerr(transp);
- }
- if (!svc_freeargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) & argument)) {
- plog(XLOG_FATAL, "unable to free rpc arguments in nfs_program_2");
- going_down(1);
- }
-}
diff --git a/contrib/amd/amd/nfs_start.c b/contrib/amd/amd/nfs_start.c
deleted file mode 100644
index f6aba94e2b6d..000000000000
--- a/contrib/amd/amd/nfs_start.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/nfs_start.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-#ifndef SELECT_MAXWAIT
-# define SELECT_MAXWAIT 16
-#endif /* not SELECT_MAXWAIT */
-
-SVCXPRT *nfsxprt = NULL;
-u_short nfs_port = 0;
-
-#ifndef HAVE_SIGACTION
-# define MASKED_SIGS (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGCHLD)|sigmask(SIGHUP))
-#endif /* not HAVE_SIGACTION */
-
-#ifdef DEBUG
-/*
- * Check that we are not burning resources
- */
-static void
-checkup(void)
-{
-
- static int max_fd = 0;
- static char *max_mem = 0;
-
- int next_fd = dup(0);
- caddr_t next_mem = sbrk(0);
- close(next_fd);
-
- if (max_fd < next_fd) {
- dlog("%d new fds allocated; total is %d",
- next_fd - max_fd, next_fd);
- max_fd = next_fd;
- }
- if (max_mem < next_mem) {
-#ifdef HAVE_GETPAGESIZE
- dlog("%#lx bytes of memory allocated; total is %#lx (%ld pages)",
- (long) (next_mem - max_mem), (unsigned long) next_mem,
- ((long) next_mem + getpagesize() - 1) / (long) getpagesize());
-#else /* not HAVE_GETPAGESIZE */
- dlog("%#lx bytes of memory allocated; total is %#lx",
- (long) (next_mem - max_mem), (unsigned long) next_mem);
-#endif /* not HAVE_GETPAGESIZE */
- max_mem = next_mem;
-
- }
-}
-#else /* not DEBUG */
-#define checkup()
-#endif /* not DEBUG */
-
-
-static int
-#ifdef HAVE_SIGACTION
-do_select(sigset_t smask, int fds, fd_set *fdp, struct timeval *tvp)
-#else /* not HAVE_SIGACTION */
-do_select(int smask, int fds, fd_set *fdp, struct timeval *tvp)
-#endif /* not HAVE_SIGACTION */
-{
-
- int sig;
- int nsel;
-
- if ((sig = setjmp(select_intr))) {
- select_intr_valid = 0;
- /* Got a signal */
- switch (sig) {
- case SIGINT:
- case SIGTERM:
- amd_state = Finishing;
- reschedule_timeout_mp();
- break;
- }
- nsel = -1;
- errno = EINTR;
- } else {
- select_intr_valid = 1;
- /*
- * Allow interrupts. If a signal
- * occurs, then it will cause a longjmp
- * up above.
- */
-#ifdef HAVE_SIGACTION
- sigprocmask(SIG_SETMASK, &smask, NULL);
-#else /* not HAVE_SIGACTION */
- (void) sigsetmask(smask);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * Wait for input
- */
- nsel = select(fds, fdp, (fd_set *) 0, (fd_set *) 0,
- tvp->tv_sec ? tvp : (struct timeval *) 0);
- }
-
-#ifdef HAVE_SIGACTION
- sigprocmask(SIG_BLOCK, &masked_sigs, NULL);
-#else /* not HAVE_SIGACTION */
- (void) sigblock(MASKED_SIGS);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * Perhaps reload the cache?
- */
- if (do_mapc_reload < clocktime(NULL)) {
- mapc_reload();
- do_mapc_reload = clocktime(NULL) + gopt.map_reload_interval;
- }
- return nsel;
-}
-
-
-/*
- * Determine whether anything is left in
- * the RPC input queue.
- */
-static int
-rpc_pending_now(void)
-{
- struct timeval tvv;
- int nsel;
- fd_set readfds;
-
- FD_ZERO(&readfds);
- FD_SET(fwd_sock, &readfds);
-
- tvv.tv_sec = tvv.tv_usec = 0;
- nsel = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, &tvv);
- if (nsel < 1)
- return (0);
- if (FD_ISSET(fwd_sock, &readfds))
- return (1);
-
- return (0);
-}
-
-
-static serv_state
-run_rpc(void)
-{
-#ifdef HAVE_SIGACTION
- sigset_t smask;
- sigprocmask(SIG_BLOCK, &masked_sigs, &smask);
-#else /* not HAVE_SIGACTION */
- int smask = sigblock(MASKED_SIGS);
-#endif /* not HAVE_SIGACTION */
-
- next_softclock = clocktime(NULL);
-
- amd_state = Run;
-
- /*
- * Keep on trucking while we are in Run mode. This state
- * is switched to Quit after all the file systems have
- * been unmounted.
- */
- while ((int) amd_state <= (int) Finishing) {
- struct timeval tvv;
- int nsel;
- time_t now;
- fd_set readfds;
-
-#ifdef HAVE_SVC_GETREQSET
- memmove(&readfds, &svc_fdset, sizeof(svc_fdset));
-#else /* not HAVE_SVC_GETREQSET */
- FD_ZERO(&readfds);
-# ifdef HAVE_FD_SET_FDS_BITS
- readfds.fds_bits[0] = svc_fds;
-# else /* not HAVE_FD_SET_FDS_BITS */
- readfds = svc_fds;
-# endif /* not HAVE_FD_SET_FDS_BITS */
-#endif /* not HAVE_SVC_GETREQSET */
- FD_SET(fwd_sock, &readfds);
-
- checkup();
-
- /*
- * If the full timeout code is not called,
- * then recompute the time delta manually.
- */
- now = clocktime(NULL);
-
- if (next_softclock <= now) {
- if (amd_state == Finishing)
- umount_exported();
- tvv.tv_sec = softclock();
- } else {
- tvv.tv_sec = next_softclock - now;
- }
- tvv.tv_usec = 0;
-
- if (amd_state == Finishing && get_exported_ap(0) == NULL) {
- flush_mntfs();
- amd_state = Quit;
- break;
- }
-
-#ifdef HAVE_FS_AUTOFS
- autofs_add_fdset(&readfds);
-#endif /* HAVE_FS_AUTOFS */
-
- if (tvv.tv_sec <= 0)
- tvv.tv_sec = SELECT_MAXWAIT;
- if (tvv.tv_sec) {
- dlog("Select waits for %ds", (int) tvv.tv_sec);
- } else {
- dlog("Select waits for Godot");
- }
-
- nsel = do_select(smask, FD_SETSIZE, &readfds, &tvv);
-
- switch (nsel) {
- case -1:
- if (errno == EINTR) {
- dlog("select interrupted");
- continue;
- }
- plog(XLOG_ERROR, "select: %m");
- break;
-
- case 0:
- break;
-
- default:
- /*
- * Read all pending NFS responses at once to avoid having responses
- * queue up as a consequence of retransmissions.
- */
- if (FD_ISSET(fwd_sock, &readfds)) {
- FD_CLR(fwd_sock, &readfds);
- --nsel;
- do {
- fwd_reply();
- } while (rpc_pending_now() > 0);
- }
-
-#ifdef HAVE_FS_AUTOFS
- if (nsel)
- nsel = autofs_handle_fdset(&readfds, nsel);
-#endif /* HAVE_FS_AUTOFS */
-
- if (nsel) {
- /*
- * Anything left must be a normal
- * RPC request.
- */
-#ifdef HAVE_SVC_GETREQSET
- svc_getreqset(&readfds);
-#else /* not HAVE_SVC_GETREQSET */
-# ifdef HAVE_FD_SET_FDS_BITS
- svc_getreq(readfds.fds_bits[0]);
-# else /* not HAVE_FD_SET_FDS_BITS */
- svc_getreq(readfds);
-# endif /* not HAVE_FD_SET_FDS_BITS */
-#endif /* not HAVE_SVC_GETREQSET */
- }
- break;
- }
- }
-
-#ifdef HAVE_SIGACTION
- sigprocmask(SIG_SETMASK, &smask, NULL);
-#else /* not HAVE_SIGACTION */
- (void) sigsetmask(smask);
-#endif /* not HAVE_SIGACTION */
-
- if (amd_state == Quit)
- amd_state = Done;
-
- return amd_state;
-}
-
-
-int
-mount_automounter(int ppid)
-{
- /*
- * Old code replaced by rpc-trash patch.
- * Erez Zadok <ezk@cs.columbia.edu>
- int so = socket(AF_INET, SOCK_DGRAM, 0);
- */
- SVCXPRT *udp_amqp = NULL, *tcp_amqp = NULL;
- int nmount, ret;
- int soNFS;
- int udp_soAMQ, tcp_soAMQ;
- struct netconfig *udp_amqncp, *tcp_amqncp;
-
- /*
- * This must be done first, because it attempts to bind
- * to various UDP ports and we don't want anything else
- * potentially taking over those ports before we get a chance
- * to reserve them.
- */
- if (gopt.flags & CFM_RESTART_EXISTING_MOUNTS)
- restart_automounter_nodes();
-
- /*
- * Start RPC forwarding
- */
- if (fwd_init() != 0)
- return 3;
-
- /*
- * Construct the root automount node
- */
- make_root_node();
-
- /*
- * Pick up the pieces from a previous run
- * This is likely to (indirectly) need the rpc_fwd package
- * so it *must* come after the call to fwd_init().
- */
- if (gopt.flags & CFM_RESTART_EXISTING_MOUNTS)
- restart();
-
- /*
- * Create the nfs service for amd
- * If nfs_port is already initialized, it means we
- * already created the service during restart_automounter_nodes().
- */
- if (nfs_port == 0) {
- ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2);
- if (ret != 0)
- return ret;
- }
- xsnprintf(pid_fsname, sizeof(pid_fsname), "%s:(pid%ld,port%u)",
- am_get_hostname(), (long) am_mypid, nfs_port);
-
- /* security: if user sets -D amq, don't even create listening socket */
- if (!amuDebug(D_AMQ)) {
- ret = create_amq_service(&udp_soAMQ,
- &udp_amqp,
- &udp_amqncp,
- &tcp_soAMQ,
- &tcp_amqp,
- &tcp_amqncp,
- gopt.preferred_amq_port);
- if (ret != 0)
- return ret;
- }
-
-#ifdef HAVE_FS_AUTOFS
- if (amd_use_autofs) {
- /*
- * Create the autofs service for amd.
- */
- ret = create_autofs_service();
- /* if autofs service fails it is OK if using a test amd */
- if (ret != 0) {
- plog(XLOG_WARNING, "autofs service registration failed, turning off autofs support");
- amd_use_autofs = 0;
- }
- }
-#endif /* HAVE_FS_AUTOFS */
-
- /*
- * Mount the top-level auto-mountpoints
- */
- nmount = mount_exported();
-
- /*
- * Now safe to tell parent that we are up and running
- */
- if (ppid)
- kill(ppid, SIGQUIT);
-
- if (nmount == 0) {
- plog(XLOG_FATAL, "No work to do - quitting");
- amd_state = Done;
- return 0;
- }
-
- if (!amuDebug(D_AMQ)) {
- /*
- * Complete registration of amq (first TCP service then UDP)
- */
- unregister_amq();
-
- ret = amu_svc_register(tcp_amqp, get_amd_program_number(), AMQ_VERSION,
- amq_program_1, IPPROTO_TCP, tcp_amqncp);
- if (ret != 1) {
- plog(XLOG_FATAL, "unable to register (AMQ_PROGRAM=%d, AMQ_VERSION, tcp)", get_amd_program_number());
- return 3;
- }
-
- ret = amu_svc_register(udp_amqp, get_amd_program_number(), AMQ_VERSION,
- amq_program_1, IPPROTO_UDP, udp_amqncp);
- if (ret != 1) {
- plog(XLOG_FATAL, "unable to register (AMQ_PROGRAM=%d, AMQ_VERSION, udp)", get_amd_program_number());
- return 4;
- }
- }
-
- /*
- * Start timeout_mp rolling
- */
- reschedule_timeout_mp();
-
- /*
- * Start the server
- */
- if (run_rpc() != Done) {
- plog(XLOG_FATAL, "run_rpc failed");
- amd_state = Done;
- }
- return 0;
-}
diff --git a/contrib/amd/amd/nfs_subr.c b/contrib/amd/amd/nfs_subr.c
deleted file mode 100644
index 80d3ca8e311c..000000000000
--- a/contrib/amd/amd/nfs_subr.c
+++ /dev/null
@@ -1,828 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/nfs_subr.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * Convert from UN*X to NFS error code.
- * Some systems like linux define their own (see
- * conf/mount/mount_linux.h).
- */
-#ifndef nfs_error
-# define nfs_error(e) ((nfsstat)(e))
-#endif /* nfs_error */
-
-/*
- * File Handle structure
- *
- * This is interpreted by indexing the exported array
- * by fhh_id (for old-style filehandles), or by retrieving
- * the node name from fhh_path (for new-style filehandles).
- *
- * The whole structure is mapped onto a standard fhandle_t
- * when transmitted.
- */
-struct am_fh {
- u_int fhh_gen; /* generation number */
- union {
- struct {
- int fhh_type; /* old or new am_fh */
- pid_t fhh_pid; /* process id */
- int fhh_id; /* map id */
- } s;
- char fhh_path[NFS_FHSIZE-sizeof(u_int)]; /* path to am_node */
- } u;
-};
-
-
-/* forward declarations */
-/* converting am-filehandles to mount-points */
-static am_node *fh_to_mp3(am_nfs_fh *fhp, int *rp, int vop);
-static am_node *fh_to_mp(am_nfs_fh *fhp);
-static void count_map_entries(const am_node *mp, u_int *out_blocks, u_int *out_bfree, u_int *out_bavail);
-
-
-static char *
-do_readlink(am_node *mp, int *error_return)
-{
- char *ln;
-
- /*
- * If there is a readlink method then use it,
- * otherwise if a link exists use that,
- * otherwise use the mount point.
- */
- if (mp->am_mnt->mf_ops->readlink) {
- int retry = 0;
- mp = (*mp->am_mnt->mf_ops->readlink) (mp, &retry);
- if (mp == 0) {
- *error_return = retry;
- return 0;
- }
- /* reschedule_timeout_mp(); */
- }
-
- if (mp->am_link) {
- ln = mp->am_link;
- } else {
- ln = mp->am_mnt->mf_mount;
- }
-
- return ln;
-}
-
-
-voidp
-nfsproc_null_2_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-nfsattrstat *
-nfsproc_getattr_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
-{
- static nfsattrstat res;
- am_node *mp;
- int retry;
- time_t now = clocktime(NULL);
-
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "getattr:");
-
- mp = fh_to_mp3(argp, &retry, VLOOK_CREATE);
- if (mp == 0) {
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "\tretry=%d", retry);
-
- if (retry < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res.ns_status = nfs_error(retry);
- return &res;
- }
-
- res = mp->am_attr;
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "\tstat(%s), size = %d, mtime=%ld.%ld",
- mp->am_path,
- (int) res.ns_u.ns_attr_u.na_size,
- (long) res.ns_u.ns_attr_u.na_mtime.nt_seconds,
- (long) res.ns_u.ns_attr_u.na_mtime.nt_useconds);
-
- /* Delay unmount of what was looked up */
- if (mp->am_timeo_w < 4 * gopt.am_timeo_w)
- mp->am_timeo_w += gopt.am_timeo_w;
- mp->am_ttl = now + mp->am_timeo_w;
-
- mp->am_stats.s_getattr++;
- return &res;
-}
-
-
-nfsattrstat *
-nfsproc_setattr_2_svc(nfssattrargs *argp, struct svc_req *rqstp)
-{
- static nfsattrstat res;
-
- if (!fh_to_mp(&argp->sag_fhandle))
- res.ns_status = nfs_error(ESTALE);
- else
- res.ns_status = nfs_error(EROFS);
-
- return &res;
-}
-
-
-voidp
-nfsproc_root_2_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-nfsdiropres *
-nfsproc_lookup_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
-{
- static nfsdiropres res;
- am_node *mp;
- int retry;
- uid_t uid;
- gid_t gid;
-
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "lookup:");
-
- /* finally, find the effective uid/gid from RPC request */
- if (getcreds(rqstp, &uid, &gid, nfsxprt) < 0)
- plog(XLOG_ERROR, "cannot get uid/gid from RPC credentials");
- xsnprintf(opt_uid, sizeof(uid_str), "%d", (int) uid);
- xsnprintf(opt_gid, sizeof(gid_str), "%d", (int) gid);
-
- mp = fh_to_mp3(&argp->da_fhandle, &retry, VLOOK_CREATE);
- if (mp == 0) {
- if (retry < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res.dr_status = nfs_error(retry);
- } else {
- int error;
- am_node *ap;
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "\tlookup(%s, %s)", mp->am_path, argp->da_name);
- ap = mp->am_mnt->mf_ops->lookup_child(mp, argp->da_name, &error, VLOOK_CREATE);
- if (ap && error < 0)
- ap = mp->am_mnt->mf_ops->mount_child(ap, &error);
- if (ap == 0) {
- if (error < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res.dr_status = nfs_error(error);
- } else {
- /*
- * XXX: EXPERIMENTAL! Delay unmount of what was looked up. This
- * should reduce the chance for race condition between unmounting an
- * entry synchronously, and re-mounting it asynchronously.
- */
- if (ap->am_ttl < mp->am_ttl)
- ap->am_ttl = mp->am_ttl;
- mp_to_fh(ap, &res.dr_u.dr_drok_u.drok_fhandle);
- res.dr_u.dr_drok_u.drok_attributes = ap->am_fattr;
- res.dr_status = NFS_OK;
- }
- mp->am_stats.s_lookup++;
- /* reschedule_timeout_mp(); */
- }
-
- return &res;
-}
-
-
-void
-nfs_quick_reply(am_node *mp, int error)
-{
- SVCXPRT *transp = mp->am_transp;
- nfsdiropres res;
- xdrproc_t xdr_result = (xdrproc_t) xdr_diropres;
-
- /*
- * If there's a transp structure then we can reply to the client's
- * nfs lookup request.
- */
- if (transp) {
- if (error == 0) {
- /*
- * Construct a valid reply to a lookup request. Same
- * code as in nfsproc_lookup_2_svc() above.
- */
- mp_to_fh(mp, &res.dr_u.dr_drok_u.drok_fhandle);
- res.dr_u.dr_drok_u.drok_attributes = mp->am_fattr;
- res.dr_status = NFS_OK;
- } else
- /*
- * Return the error that was passed to us.
- */
- res.dr_status = nfs_error(error);
-
- /*
- * Send off our reply
- */
- if (!svc_sendreply(transp, (XDRPROC_T_TYPE) xdr_result, (SVC_IN_ARG_TYPE) & res))
- svcerr_systemerr(transp);
-
- /*
- * Free up transp. It's only used for one reply.
- */
- XFREE(mp->am_transp);
- dlog("Quick reply sent for %s", mp->am_mnt->mf_mount);
- }
-}
-
-
-nfsreadlinkres *
-nfsproc_readlink_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
-{
- static nfsreadlinkres res;
- am_node *mp;
- int retry;
-
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "readlink:");
-
- mp = fh_to_mp3(argp, &retry, VLOOK_CREATE);
- if (mp == 0) {
- readlink_retry:
- if (retry < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res.rlr_status = nfs_error(retry);
- } else {
- char *ln = do_readlink(mp, &retry);
- if (ln == 0)
- goto readlink_retry;
- res.rlr_status = NFS_OK;
- if (amuDebug(D_TRACE) && ln)
- plog(XLOG_DEBUG, "\treadlink(%s) = %s", mp->am_path, ln);
- res.rlr_u.rlr_data_u = ln;
- mp->am_stats.s_readlink++;
- }
-
- return &res;
-}
-
-
-nfsreadres *
-nfsproc_read_2_svc(nfsreadargs *argp, struct svc_req *rqstp)
-{
- static nfsreadres res;
-
- memset((char *) &res, 0, sizeof(res));
- res.rr_status = nfs_error(EACCES);
-
- return &res;
-}
-
-
-voidp
-nfsproc_writecache_2_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-nfsattrstat *
-nfsproc_write_2_svc(nfswriteargs *argp, struct svc_req *rqstp)
-{
- static nfsattrstat res;
-
- if (!fh_to_mp(&argp->wra_fhandle))
- res.ns_status = nfs_error(ESTALE);
- else
- res.ns_status = nfs_error(EROFS);
-
- return &res;
-}
-
-
-nfsdiropres *
-nfsproc_create_2_svc(nfscreateargs *argp, struct svc_req *rqstp)
-{
- static nfsdiropres res;
-
- if (!fh_to_mp(&argp->ca_where.da_fhandle))
- res.dr_status = nfs_error(ESTALE);
- else
- res.dr_status = nfs_error(EROFS);
-
- return &res;
-}
-
-
-static nfsstat *
-unlink_or_rmdir(nfsdiropargs *argp, struct svc_req *rqstp, int unlinkp)
-{
- static nfsstat res;
- int retry;
-
- am_node *mp = fh_to_mp3(&argp->da_fhandle, &retry, VLOOK_DELETE);
- if (mp == 0) {
- if (retry < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res = nfs_error(retry);
- goto out;
- }
-
- if (mp->am_fattr.na_type != NFDIR) {
- res = nfs_error(ENOTDIR);
- goto out;
- }
-
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "\tremove(%s, %s)", mp->am_path, argp->da_name);
-
- mp = mp->am_mnt->mf_ops->lookup_child(mp, argp->da_name, &retry, VLOOK_DELETE);
- if (mp == 0) {
- /*
- * Ignore retries...
- */
- if (retry < 0)
- retry = 0;
- /*
- * Usual NFS workaround...
- */
- else if (retry == ENOENT)
- retry = 0;
- res = nfs_error(retry);
- } else {
- forcibly_timeout_mp(mp);
- res = NFS_OK;
- }
-
-out:
- return &res;
-}
-
-
-nfsstat *
-nfsproc_remove_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
-{
- return unlink_or_rmdir(argp, rqstp, TRUE);
-}
-
-
-nfsstat *
-nfsproc_rename_2_svc(nfsrenameargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res;
-
- if (!fh_to_mp(&argp->rna_from.da_fhandle) || !fh_to_mp(&argp->rna_to.da_fhandle))
- res = nfs_error(ESTALE);
- /*
- * If the kernel is doing clever things with referenced files
- * then let it pretend...
- */
- else if (NSTREQ(argp->rna_to.da_name, ".nfs", 4))
- res = NFS_OK;
- /*
- * otherwise a failure
- */
- else
- res = nfs_error(EROFS);
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_link_2_svc(nfslinkargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res;
-
- if (!fh_to_mp(&argp->la_fhandle) || !fh_to_mp(&argp->la_to.da_fhandle))
- res = nfs_error(ESTALE);
- else
- res = nfs_error(EROFS);
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_symlink_2_svc(nfssymlinkargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res;
-
- if (!fh_to_mp(&argp->sla_from.da_fhandle))
- res = nfs_error(ESTALE);
- else
- res = nfs_error(EROFS);
-
- return &res;
-}
-
-
-nfsdiropres *
-nfsproc_mkdir_2_svc(nfscreateargs *argp, struct svc_req *rqstp)
-{
- static nfsdiropres res;
-
- if (!fh_to_mp(&argp->ca_where.da_fhandle))
- res.dr_status = nfs_error(ESTALE);
- else
- res.dr_status = nfs_error(EROFS);
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_rmdir_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
-{
- return unlink_or_rmdir(argp, rqstp, FALSE);
-}
-
-
-nfsreaddirres *
-nfsproc_readdir_2_svc(nfsreaddirargs *argp, struct svc_req *rqstp)
-{
- static nfsreaddirres res;
- static nfsentry e_res[MAX_READDIR_ENTRIES];
- am_node *mp;
- int retry;
-
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "readdir:");
-
- mp = fh_to_mp3(&argp->rda_fhandle, &retry, VLOOK_CREATE);
- if (mp == 0) {
- if (retry < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res.rdr_status = nfs_error(retry);
- } else {
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "\treaddir(%s)", mp->am_path);
- res.rdr_status = nfs_error((*mp->am_mnt->mf_ops->readdir)
- (mp, argp->rda_cookie,
- &res.rdr_u.rdr_reply_u, e_res, argp->rda_count));
- mp->am_stats.s_readdir++;
- }
-
- return &res;
-}
-
-
-nfsstatfsres *
-nfsproc_statfs_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
-{
- static nfsstatfsres res;
- am_node *mp;
- int retry;
- mntent_t mnt;
-
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "statfs:");
-
- mp = fh_to_mp3(argp, &retry, VLOOK_CREATE);
- if (mp == 0) {
- if (retry < 0) {
- amd_stats.d_drops++;
- return 0;
- }
- res.sfr_status = nfs_error(retry);
- } else {
- nfsstatfsokres *fp;
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "\tstat_fs(%s)", mp->am_path);
-
- /*
- * just return faked up file system information
- */
- fp = &res.sfr_u.sfr_reply_u;
-
- fp->sfrok_tsize = 1024;
- fp->sfrok_bsize = 1024;
-
- /* check if map is browsable and show_statfs_entries=yes */
- if ((gopt.flags & CFM_SHOW_STATFS_ENTRIES) &&
- mp->am_mnt && mp->am_mnt->mf_mopts) {
- mnt.mnt_opts = mp->am_mnt->mf_mopts;
- if (amu_hasmntopt(&mnt, "browsable")) {
- count_map_entries(mp,
- &fp->sfrok_blocks,
- &fp->sfrok_bfree,
- &fp->sfrok_bavail);
- }
- } else {
- fp->sfrok_blocks = 0; /* set to 1 if you don't want empty automounts */
- fp->sfrok_bfree = 0;
- fp->sfrok_bavail = 0;
- }
-
- res.sfr_status = NFS_OK;
- mp->am_stats.s_statfs++;
- }
-
- return &res;
-}
-
-
-/*
- * count how many total entries there are in a map, and how many
- * of them are in use.
- */
-static void
-count_map_entries(const am_node *mp, u_int *out_blocks, u_int *out_bfree, u_int *out_bavail)
-{
- u_int blocks, bfree, bavail, i;
- mntfs *mf;
- mnt_map *mmp;
- kv *k;
-
- blocks = bfree = bavail = 0;
- if (!mp)
- goto out;
- mf = mp->am_mnt;
- if (!mf)
- goto out;
- mmp = (mnt_map *) mf->mf_private;
- if (!mmp)
- goto out;
-
- /* iterate over keys */
- for (i = 0; i < NKVHASH; i++) {
- for (k = mmp->kvhash[i]; k ; k = k->next) {
- if (!k->key)
- continue;
- blocks++;
- /*
- * XXX: Need to count how many are actively in use and recompute
- * bfree and bavail based on it.
- */
- }
- }
-
-out:
- *out_blocks = blocks;
- *out_bfree = bfree;
- *out_bavail = bavail;
-}
-
-
-/*
- * Convert from file handle to automount node.
- */
-static am_node *
-fh_to_mp3(am_nfs_fh *fhp, int *rp, int vop)
-{
- struct am_fh *fp = (struct am_fh *) fhp;
- am_node *ap = 0;
-
- if (fp->u.s.fhh_type != 0) {
- /* New filehandle type */
- int len = sizeof(*fhp) - sizeof(fp->fhh_gen);
- char *path = xmalloc(len+1);
- /*
- * Because fhp is treated as a filehandle we use memcpy
- * instead of xstrlcpy.
- */
- memcpy(path, (char *) fp->u.fhh_path, len);
- path[len] = '\0';
- /* dlog("fh_to_mp3: new filehandle: %s", path); */
-
- ap = path_to_exported_ap(path);
- XFREE(path);
- } else {
- /* dlog("fh_to_mp3: old filehandle: %d", fp->u.s.fhh_id); */
- /*
- * Check process id matches
- * If it doesn't then it is probably
- * from an old kernel-cached filehandle
- * which is now out of date.
- */
- if (fp->u.s.fhh_pid != get_server_pid()) {
- dlog("fh_to_mp3: wrong pid %ld != my pid %ld",
- (long) fp->u.s.fhh_pid, get_server_pid());
- goto drop;
- }
-
- /*
- * Get hold of the supposed mount node
- */
- ap = get_exported_ap(fp->u.s.fhh_id);
- }
-
- /*
- * Check the generation number in the node
- * matches the one from the kernel. If not
- * then the old node has been timed out and
- * a new one allocated.
- */
- if (ap != NULL && ap->am_gen != fp->fhh_gen)
- ap = 0;
-
- /*
- * If it doesn't exists then drop the request
- */
- if (!ap)
- goto drop;
-
-#if 0
- /*
- * If the node is hung then locate a new node
- * for it. This implements the replicated filesystem
- * retries.
- */
- if (ap->am_mnt && FSRV_ISDOWN(ap->am_mnt->mf_server) && ap->am_parent) {
- int error;
- am_node *orig_ap = ap;
-
- dlog("fh_to_mp3: %s (%s) is hung: lookup alternative file server",
- orig_ap->am_path, orig_ap->am_mnt->mf_info);
-
- /*
- * Update modify time of parent node.
- * With any luck the kernel will re-stat
- * the child node and get new information.
- */
- clocktime(&orig_ap->am_fattr.na_mtime);
-
- /*
- * Call the parent's lookup routine for an object
- * with the same name. This may return -1 in error
- * if a mount is in progress. In any case, if no
- * mount node is returned the error code is propagated
- * to the caller.
- */
- if (vop == VLOOK_CREATE) {
- ap = orig_ap->am_parent->am_mnt->mf_ops->lookup_child(orig_ap->am_parent, orig_ap->am_name, &error, vop);
- if (ap && error < 0)
- ap = orig_ap->am_parent->am_mnt->mf_ops->mount_child(ap, &error);
- } else {
- ap = 0;
- error = ESTALE;
- }
- if (ap == 0) {
- if (error < 0 && amd_state == Finishing)
- error = ENOENT;
- *rp = error;
- return 0;
- }
-
- /*
- * Update last access to original node. This
- * avoids timing it out and so sending ESTALE
- * back to the kernel.
- * XXX - Not sure we need this anymore (jsp, 90/10/6).
- */
- new_ttl(orig_ap);
-
- }
-#endif
-
- /*
- * Disallow references to objects being unmounted, unless
- * they are automount points.
- */
- if (ap->am_mnt && (ap->am_mnt->mf_flags & MFF_UNMOUNTING) &&
- !(ap->am_flags & AMF_ROOT)) {
- if (amd_state == Finishing)
- *rp = ENOENT;
- else
- *rp = -1;
- return 0;
- }
- new_ttl(ap);
-
-drop:
- if (!ap || !ap->am_mnt) {
- /*
- * If we are shutting down then it is likely
- * that this node has disappeared because of
- * a fast timeout. To avoid things thrashing
- * just pretend it doesn't exist at all. If
- * ESTALE is returned, some NFS clients just
- * keep retrying (stupid or what - if it's
- * stale now, what's it going to be in 5 minutes?)
- */
- if (amd_state == Finishing)
- *rp = ENOENT;
- else
- *rp = ESTALE;
- amd_stats.d_stale++;
- }
-
- return ap;
-}
-
-
-static am_node *
-fh_to_mp(am_nfs_fh *fhp)
-{
- int dummy;
-
- return fh_to_mp3(fhp, &dummy, VLOOK_CREATE);
-}
-
-
-/*
- * Convert from automount node to file handle.
- */
-void
-mp_to_fh(am_node *mp, am_nfs_fh *fhp)
-{
- u_int pathlen;
- struct am_fh *fp = (struct am_fh *) fhp;
-
- memset((char *) fhp, 0, sizeof(am_nfs_fh));
-
- /* Store the generation number */
- fp->fhh_gen = mp->am_gen;
-
- pathlen = strlen(mp->am_path);
- if (pathlen <= sizeof(*fhp) - sizeof(fp->fhh_gen)) {
- /* dlog("mp_to_fh: new filehandle: %s", mp->am_path); */
-
- /*
- * Because fhp is treated as a filehandle we use memcpy instead of
- * xstrlcpy.
- */
- memcpy(fp->u.fhh_path, mp->am_path, pathlen); /* making a filehandle */
- } else {
- /*
- * Take the process id
- */
- fp->u.s.fhh_pid = get_server_pid();
-
- /*
- * ... the map number
- */
- fp->u.s.fhh_id = mp->am_mapno;
-
- /*
- * ... and the generation number (previously stored)
- * to make a "unique" triple that will never
- * be reallocated except across reboots (which doesn't matter)
- * or if we are unlucky enough to be given the same
- * pid as a previous amd (very unlikely).
- */
- /* dlog("mp_to_fh: old filehandle: %d", fp->u.s.fhh_id); */
- }
-}
diff --git a/contrib/amd/amd/ops_TEMPLATE.c b/contrib/amd/amd/ops_TEMPLATE.c
deleted file mode 100644
index 3f7421984412..000000000000
--- a/contrib/amd/amd/ops_TEMPLATE.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_TEMPLATE.c
- *
- */
-
-/*
- * An empty template for an amd pseudo filesystem "foofs".
- */
-
-/*
- * NOTE: if this is an Amd file system, prepend "amfs_" to all foofs symbols
- * and renamed the file name to amfs_foofs.c. If it is a native file system
- * (such as pcfs, isofs, or ffs), then you can keep the names as is, and
- * just rename the file to ops_foofs.c.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static char *foofs_match(am_opts *fo);
-static int foofs_init(mntfs *mf);
-static int foofs_mount(am_node *mp, mntfs *mf);
-static int foofs_umount(am_node *mp, mntfs *mf);
-static am_node *foofs_lookuppn(am_node *mp, char *fname, int *error_return, int op);
-static int foofs_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count);
-static am_node *foofs_readlink(am_node *mp, int *error_return);
-static void foofs_mounted(am_node *am, mntfs *mf);
-static void foofs_umounted(am_node *mp, mntfs *mf);
-static fserver *foofs_ffserver(mntfs *mf);
-
-
-/*
- * Foofs operations.
- * Define only those you need, others set to 0 (NULL)
- */
-am_ops foofs_ops =
-{
- "foofs", /* name of file system */
- foofs_match, /* match */
- foofs_init, /* initialize */
- foofs_mount, /* mount vnode */
- foofs_umount, /* unmount vnode */
- foofs_lookup_child, /* lookup path-name */
- foofs_mount_child, /* mount path-name */
- foofs_readdir, /* read directory */
- foofs_readlink, /* read link */
- foofs_mounted, /* after-mount extra actions */
- foofs_umounted, /* after-umount extra actions */
- foofs_ffserver, /* find a file server */
- foofs_get_wchan, /* return the waiting channel */
- FS_MKMNT | FS_BACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_TEMPLATE_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * Check that f/s has all needed fields.
- * Returns: matched string if found, NULL otherwise.
- */
-static char *
-foofs_match(am_opts *fo)
-{
- char *cp = "fill this with a way to find the match";
-
- plog(XLOG_INFO, "entering foofs_match...");
-
- if (cp)
- return cp; /* OK */
-
- return NULL; /* not OK */
-}
-
-
-/*
- * Initialize.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-foofs_init(mntfs *mf)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_init...");
-
- error = EPERM; /* XXX: fixme */
- return error;
-}
-
-
-/*
- * Mount vnode.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-foofs_mount(am_node *mp)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_mount...");
-
- error = EPERM; /* XXX: fixme */
- return error;
-}
-
-
-/*
- * Mount vfs.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-foofs_fmount(mntfs *mf)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_fmount...");
-
- error = EPERM; /* XXX: fixme */
- return error;
-}
-
-
-/*
- * Unmount vnode.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-foofs_umount(am_node *mp)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_umount...");
-
- error = EPERM; /* XXX: fixme */
- return error;
-}
-
-
-/*
- * Unmount VFS.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-foofs_fumount(mntfs *mf)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_fumount...");
-
- error = EPERM; /* XXX: fixme */
- return error;
-}
-
-
-/*
- * Lookup path-name.
- * Returns: the am_node that was found, or NULL if failed.
- * If failed, also fills in errno in error_return.
- */
-static am_node *
-foofs_lookuppn(am_node *mp, char *fname, int *error_return, int op)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_lookuppn...");
-
- error = EPERM; /* XXX: fixme */
-
- *error_return = error;
- return NULL;
-}
-
-
-/*
- * Read directory.
- * Returns: 0 if OK, non-zero (errno) if failed.
- * If OK, fills in ep with chain of directory entries.
- */
-static int
-foofs_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_readdir...");
-
- error = EPERM; /* XXX: fixme */
- return error;
-}
-
-
-/*
- * Read link.
- * Returns: am_node found, or NULL if not found.
- * If failed, fills in errno in error_return.
- */
-static am_node *
-foofs_readlink(am_node *mp, int *error_return)
-{
- int error = 0;
-
- plog(XLOG_INFO, "entering foofs_readlink...");
-
- error = EPERM; /* XXX: fixme */
-
- *error_return = error;
- return NULL;
-}
-
-
-/*
- * Async mount callback function.
- * After the base mount went OK, sometimes
- * there are additional actions that are needed. See union_mounted() and
- * toplvl_mounted().
- */
-static void
-foofs_mounted(mntfs *mf)
-{
- plog(XLOG_INFO, "entering foofs_mounted...");
-
- return;
-}
-
-
-/*
- * Async unmount callback function.
- * After the base umount() succeeds, we may want to take extra actions,
- * such as informing remote mount daemons that we've unmounted them.
- * See amfs_auto_umounted(), host_umounted(), nfs_umounted().
- */
-static void
-foofs_umounted(am_node *mp)
-{
- plog(XLOG_INFO, "entering foofs_umounted...");
-
- return;
-}
-
-
-/*
- * Find a file server.
- * Returns: fserver of found server, or NULL if not found.
- */
-static fserver *
-foofs_ffserver(mntfs *mf)
-{
- plog(XLOG_INFO, "entering foofs_ffserver...");
-
- return NULL;
-}
-
-
-/*
- * Normally just return mf. Only inherit needs to do special tricks.
- */
-static wchan_t *
-foofs_get_wchan(mntfs *mf)
-{
- plog(XLOG_INFO, "entering foofs_get_wchan...");
-
- return mf;
-}
diff --git a/contrib/amd/amd/ops_autofs.c b/contrib/amd/amd/ops_autofs.c
deleted file mode 100644
index bd0bb122fe03..000000000000
--- a/contrib/amd/amd/ops_autofs.c
+++ /dev/null
@@ -1,1279 +0,0 @@
-/*
- * Copyright (c) 1997-2001 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: ops_autofs.c,v 1.7.2.4 2001/04/24 06:17:40 ib42 Exp $
- *
- */
-
-/*
- * Automounter filesystem
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * KLUDGE: wrap whole file in HAVE_FS_AUTOFS, because
- * not all systems with an automounter file system are supported
- * by am-utils yet...
- */
-
-#ifdef HAVE_FS_AUTOFS
-
-/*
- * MACROS:
- */
-#ifndef AUTOFS_NULL
-# define AUTOFS_NULL ((u_long)0)
-#endif /* not AUTOFS_NULL */
-
-/*
- * VARIABLES:
- */
-
-/* forward declarations */
-static int mount_autofs(char *dir, char *opts);
-static int autofs_mount_1_svc(struct mntrequest *mr, struct mntres *result, struct authunix_parms *cred);
-static int autofs_unmount_1_svc(struct umntrequest *ur, struct umntres *result, struct authunix_parms *cred);
-
-/* external declarations */
-extern bool_t xdr_mntrequest(XDR *, mntrequest *);
-extern bool_t xdr_mntres(XDR *, mntres *);
-extern bool_t xdr_umntrequest(XDR *, umntrequest *);
-extern bool_t xdr_umntres(XDR *, umntres *);
-
-/*
- * STRUCTURES:
- */
-
-/* Sun's kernel-based automounter-supporting file system */
-am_ops autofs_ops =
-{
- "autofs",
- amfs_auto_match,
- 0, /* amfs_auto_init */
- autofs_mount,
- 0,
- autofs_umount,
- 0,
- amfs_auto_lookuppn,
- amfs_auto_readdir, /* browsable version of readdir() */
- 0, /* autofs_readlink */
- autofs_mounted,
- 0, /* autofs_umounted */
- find_amfs_auto_srvr,
- FS_MKMNT | FS_NOTIMEOUT | FS_BACKGROUND | FS_AMQINFO | FS_DIRECTORY
-};
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-
-/*
- * Mount the top-level using autofs
- */
-int
-autofs_mount(am_node *mp)
-{
- mntfs *mf = mp->am_mnt;
- struct stat stb;
- char opts[256], preopts[256];
- int error;
- char *mnttype;
-
- /*
- * Mounting the automounter.
- * Make sure the mount directory exists, construct
- * the mount options and call the mount_autofs routine.
- */
-
- if (stat(mp->am_path, &stb) < 0) {
- return errno;
- } else if ((stb.st_mode & S_IFMT) != S_IFDIR) {
- plog(XLOG_WARNING, "%s is not a directory", mp->am_path);
- return ENOTDIR;
- }
- if (mf->mf_ops == &autofs_ops)
- mnttype = "indirect";
- else if (mf->mf_ops == &amfs_direct_ops)
- mnttype = "direct";
-#ifdef HAVE_AMU_FS_UNION
- else if (mf->mf_ops == &amfs_union_ops)
- mnttype = "union";
-#endif /* HAVE_AMU_FS_UNION */
- else
- mnttype = "auto";
-
- /*
- * Construct some mount options:
- *
- * Tack on magic map=<mapname> option in mtab to emulate
- * SunOS automounter behavior.
- */
- preopts[0] = '\0';
-#ifdef MNTTAB_OPT_INTR
- strcat(preopts, MNTTAB_OPT_INTR);
- strcat(preopts, ",");
-#endif /* MNTTAB_OPT_INTR */
-#ifdef MNTTAB_OPT_IGNORE
- strcat(preopts, MNTTAB_OPT_IGNORE);
- strcat(preopts, ",");
-#endif /* MNTTAB_OPT_IGNORE */
- sprintf(opts, "%s%s,%s=%d,%s=%d,%s=%d,%s,map=%s",
- preopts,
- MNTTAB_OPT_RW,
- MNTTAB_OPT_PORT, nfs_port,
- MNTTAB_OPT_TIMEO, gopt.amfs_auto_timeo,
- MNTTAB_OPT_RETRANS, gopt.amfs_auto_retrans,
- mnttype, mf->mf_info);
-
- /* now do the mount */
- error = mount_autofs(mf->mf_mount, opts);
- if (error) {
- errno = error;
- plog(XLOG_FATAL, "mount_autofs: %m");
- return error;
- }
- return 0;
-}
-
-
-void
-autofs_mounted(mntfs *mf)
-{
- amfs_auto_mkcacheref(mf);
-}
-
-
-/*
- * Unmount a top-level automount node
- */
-int
-autofs_umount(am_node *mp)
-{
- int error;
- struct stat stb;
-
- /*
- * The lstat is needed if this mount is type=direct. When that happens,
- * the kernel cache gets confused between the underlying type (dir) and
- * the mounted type (link) and so needs to be re-synced before the
- * unmount. This is all because the unmount system call follows links and
- * so can't actually unmount a link (stupid!). It was noted that doing an
- * ls -ld of the mount point to see why things were not working actually
- * fixed the problem - so simulate an ls -ld here.
- */
- if (lstat(mp->am_path, &stb) < 0) {
-#ifdef DEBUG
- dlog("lstat(%s): %m", mp->am_path);
-#endif /* DEBUG */
- }
- error = UMOUNT_FS(mp->am_path, mnttab_file_name);
- if (error == EBUSY && mp->am_flags & AMF_AUTOFS) {
- plog(XLOG_WARNING, "autofs_unmount of %s busy (autofs). exit", mp->am_path);
- error = 0; /* fake unmount was ok */
- }
- return error;
-}
-
-
-/*
- * Mount an automounter directory.
- * The automounter is connected into the system
- * as a user-level NFS server. mount_autofs constructs
- * the necessary NFS parameters to be given to the
- * kernel so that it will talk back to us.
- */
-static int
-mount_autofs(char *dir, char *opts)
-{
- char fs_hostname[MAXHOSTNAMELEN + MAXPATHLEN + 1];
- char *map_opt, buf[MAXHOSTNAMELEN];
- int retry, error, flags;
- struct utsname utsname;
- mntent_t mnt;
- autofs_args_t autofs_args;
- MTYPE_TYPE type = MOUNT_TYPE_AUTOFS;
-
- memset((voidp) &autofs_args, 0, sizeof(autofs_args)); /* Paranoid */
-
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = dir;
- mnt.mnt_fsname = pid_fsname;
- mnt.mnt_opts = opts;
- mnt.mnt_type = type;
-
- retry = hasmntval(&mnt, "retry");
- if (retry <= 0)
- retry = 2; /* XXX */
-
- /*
- * SET MOUNT ARGS
- */
- if (uname(&utsname) < 0) {
- strcpy(buf, "localhost.autofs");
- } else {
- strcpy(buf, utsname.nodename);
- strcat(buf, ".autofs");
- }
-#ifdef HAVE_FIELD_AUTOFS_ARGS_T_ADDR
- autofs_args.addr.buf = buf;
- autofs_args.addr.len = strlen(autofs_args.addr.buf);
- autofs_args.addr.maxlen = autofs_args.addr.len;
-#endif /* HAVE_FIELD_AUTOFS_ARGS_T_ADDR */
-
- autofs_args.path = dir;
- autofs_args.opts = opts;
-
- map_opt = hasmntopt(&mnt, "map");
- if (map_opt) {
- map_opt += sizeof("map="); /* skip the "map=" */
- if (map_opt == NULL) {
- plog(XLOG_WARNING, "map= has a null map name. reset to amd.unknown");
- map_opt = "amd.unknown";
- }
- }
- autofs_args.map = map_opt;
-
- /* XXX: these I set arbitrarily... */
- autofs_args.mount_to = 300;
- autofs_args.rpc_to = 60;
- autofs_args.direct = 0;
-
- /*
- * Make a ``hostname'' string for the kernel
- */
- sprintf(fs_hostname, "pid%ld@%s:%s",
- (long) (foreground ? am_mypid : getppid()),
- am_get_hostname(), dir);
-
- /*
- * Most kernels have a name length restriction.
- */
- if (strlen(fs_hostname) >= MAXHOSTNAMELEN)
- strcpy(fs_hostname + MAXHOSTNAMELEN - 3, "..");
-
- /*
- * Finally we can compute the mount flags set above.
- */
- flags = compute_mount_flags(&mnt);
-
- /*
- * This is it! Here we try to mount amd on its mount points.
- */
- error = mount_fs(&mnt, flags, (caddr_t) &autofs_args, retry, type, 0, NULL, mnttab_file_name);
- return error;
-}
-
-
-/****************************************************************************/
-/* autofs program dispatcher */
-void
-autofs_program_1(struct svc_req *rqstp, SVCXPRT *transp)
-{
- int ret;
- union {
- mntrequest autofs_mount_1_arg;
- umntrequest autofs_umount_1_arg;
- } argument;
- union {
- mntres mount_res;
- umntres umount_res;
- } result;
-
- bool_t (*xdr_argument)(), (*xdr_result)();
- int (*local)();
-
- switch (rqstp->rq_proc) {
-
- case AUTOFS_NULL:
- svc_sendreply(transp,
- (XDRPROC_T_TYPE) xdr_void,
- (SVC_IN_ARG_TYPE) NULL);
- return;
-
- case AUTOFS_MOUNT:
- xdr_argument = xdr_mntrequest;
- xdr_result = xdr_mntres;
- local = (int (*)()) autofs_mount_1_svc;
- break;
-
- case AUTOFS_UNMOUNT:
- xdr_argument = xdr_umntrequest;
- xdr_result = xdr_umntres;
- local = (int (*)()) autofs_unmount_1_svc;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
-
- memset((char *) &argument, 0, sizeof(argument));
- if (!svc_getargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) &argument)) {
- plog(XLOG_ERROR,
- "AUTOFS xdr decode failed for %d %d %d",
- (int) rqstp->rq_prog, (int) rqstp->rq_vers, (int) rqstp->rq_proc);
- svcerr_decode(transp);
- return;
- }
-
- ret = (*local) (&argument, &result, rqstp);
- if (!svc_sendreply(transp,
- (XDRPROC_T_TYPE) xdr_result,
- (SVC_IN_ARG_TYPE) &result)) {
- svcerr_systemerr(transp);
- }
-
- if (!svc_freeargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) &argument)) {
- plog(XLOG_FATAL, "unable to free rpc arguments in autofs_program_1");
- going_down(1);
- }
-}
-
-
-static int
-autofs_mount_1_svc(struct mntrequest *mr, struct mntres *result, struct authunix_parms *cred)
-{
- int err = 0;
- am_node *anp, *anp2;
-
- plog(XLOG_INFO, "XXX: autofs_mount_1_svc: %s:%s:%s:%s",
- mr->map, mr->name, mr->opts, mr->path);
-
- /* look for map (eg. "/home") */
- anp = find_ap(mr->path);
- if (!anp) {
- plog(XLOG_ERROR, "map %s not found", mr->path);
- err = ENOENT;
- goto out;
- }
- /* turn on autofs in map flags */
- if (!(anp->am_flags & AMF_AUTOFS)) {
- plog(XLOG_INFO, "turning on AMF_AUTOFS for node %s", mr->path);
- anp->am_flags |= AMF_AUTOFS;
- }
-
- /*
- * Look for (and create if needed) the new node.
- *
- * If an error occurred, return it. If a -1 was returned, that indicates
- * that a mount is in progress, so sleep a while (while the backgrounded
- * mount is happening), and then signal the autofs to retry the mount.
- *
- * There's something I don't understand. I was thinking that this code
- * here is the one which will succeed eventually and will send an RPC
- * reply to the kernel, but apparently that happens somewhere else, not
- * here. It works though, just that I don't know how. Arg. -Erez.
- * */
- err = 0;
- anp2 = autofs_lookuppn(anp, mr->name, &err, VLOOK_CREATE);
- if (!anp2) {
- if (err == -1) { /* then tell autofs to retry */
- sleep(1);
- err = EAGAIN;
- }
- goto out;
- }
-
-out:
- result->status = err;
- return err;
-}
-
-
-static int
-autofs_unmount_1_svc(struct umntrequest *ur, struct umntres *result, struct authunix_parms *cred)
-{
- int err = 0;
-
-#ifdef HAVE_FIELD_UMNTREQUEST_RDEVID
- plog(XLOG_INFO, "XXX: autofs_unmount_1_svc: %d:%lu:%lu:0x%lx",
- ur->isdirect, (unsigned long) ur->devid, (unsigned long) ur->rdevid,
- (unsigned long) ur->next);
-#else /* HAVE_FIELD_UMNTREQUEST_RDEVID */
- plog(XLOG_INFO, "XXX: autofs_unmount_1_svc: %d:%lu:0x%lx",
- ur->isdirect, (unsigned long) ur->devid,
- (unsigned long) ur->next);
-#endif /* HAVE_FIELD_UMNTREQUEST_RDEVID */
-
- err = EINVAL; /* XXX: not implemented yet */
- goto out;
-
-out:
- result->status = err;
- return err;
-}
-
-
-/*
- * Pick a file system to try mounting and
- * do that in the background if necessary
- *
- For each location:
- if it is new -defaults then
- extract and process
- continue;
- fi
- if it is a cut then
- if a location has been tried then
- break;
- fi
- continue;
- fi
- parse mount location
- discard previous mount location if required
- find matching mounted filesystem
- if not applicable then
- this_error = No such file or directory
- continue
- fi
- if the filesystem failed to be mounted then
- this_error = error from filesystem
- elif the filesystem is mounting or unmounting then
- this_error = -1
- elif the fileserver is down then
- this_error = -1
- elif the filesystem is already mounted
- this_error = 0
- break
- fi
- if no error on this mount then
- this_error = initialize mount point
- fi
- if no error on this mount and mount is delayed then
- this_error = -1
- fi
- if this_error < 0 then
- retry = true
- fi
- if no error on this mount then
- make mount point if required
- fi
- if no error on this mount then
- if mount in background then
- run mount in background
- return -1
- else
- this_error = mount in foreground
- fi
- fi
- if an error occurred on this mount then
- update stats
- save error in mount point
- fi
- endfor
- */
-static int
-autofs_bgmount(struct continuation *cp, int mpe)
-{
- mntfs *mf = cp->mp->am_mnt; /* Current mntfs */
- mntfs *mf_retry = 0; /* First mntfs which needed retrying */
- int this_error = -1; /* Per-mount error */
- int hard_error = -1;
- int mp_error = mpe;
-
- /*
- * Try to mount each location.
- * At the end:
- * hard_error == 0 indicates something was mounted.
- * hard_error > 0 indicates everything failed with a hard error
- * hard_error < 0 indicates nothing could be mounted now
- */
- for (; this_error && *cp->ivec; cp->ivec++) {
- am_ops *p;
- am_node *mp = cp->mp;
- char *link_dir;
- int dont_retry;
-
- if (hard_error < 0)
- hard_error = this_error;
-
- this_error = -1;
-
- if (**cp->ivec == '-') {
- /*
- * Pick up new defaults
- */
- if (cp->auto_opts && *cp->auto_opts)
- cp->def_opts = str3cat(cp->def_opts, cp->auto_opts, ";", *cp->ivec + 1);
- else
- cp->def_opts = strealloc(cp->def_opts, *cp->ivec + 1);
-#ifdef DEBUG
- dlog("Setting def_opts to \"%s\"", cp->def_opts);
-#endif /* DEBUG */
- continue;
- }
- /*
- * If a mount has been attempted, and we find
- * a cut then don't try any more locations.
- */
- if (STREQ(*cp->ivec, "/") || STREQ(*cp->ivec, "||")) {
- if (cp->tried) {
-#ifdef DEBUG
- dlog("Cut: not trying any more locations for %s",
- mp->am_path);
-#endif /* DEBUG */
- break;
- }
- continue;
- }
-
- /* match the operators */
- p = ops_match(&cp->fs_opts, *cp->ivec, cp->def_opts, mp->am_path, cp->key, mp->am_parent->am_mnt->mf_info);
-
- /*
- * Find a mounted filesystem for this node.
- */
- mp->am_mnt = mf = realloc_mntfs(mf, p, &cp->fs_opts,
- cp->fs_opts.opt_fs,
- cp->fs_opts.fs_mtab,
- cp->auto_opts,
- cp->fs_opts.opt_opts,
- cp->fs_opts.opt_remopts);
-
- p = mf->mf_ops;
-#ifdef DEBUG
- dlog("Got a hit with %s", p->fs_type);
-#endif /* DEBUG */
-
- /*
- * Note whether this is a real mount attempt
- */
- if (p == &amfs_error_ops) {
- plog(XLOG_MAP, "Map entry %s for %s did not match", *cp->ivec, mp->am_path);
- if (this_error <= 0)
- this_error = ENOENT;
- continue;
- } else {
- if (cp->fs_opts.fs_mtab) {
- plog(XLOG_MAP, "Trying mount of %s on \"%s\" fstype %s",
- cp->fs_opts.fs_mtab, mp->am_path, p->fs_type);
- }
- cp->tried = TRUE;
- }
-
- this_error = 0;
- dont_retry = FALSE;
-
- if (mp->am_link) {
- XFREE(mp->am_link);
- mp->am_link = 0;
- }
- link_dir = mf->mf_fo->opt_sublink;
-
- if (link_dir && *link_dir) {
- if (*link_dir == '/') {
- mp->am_link = strdup(link_dir);
- } else {
- /*
- * try getting fs option from continuation, not mountpoint!
- * Don't try logging the string from mf, since it may be bad!
- */
- if (cp->fs_opts.opt_fs != mf->mf_fo->opt_fs)
- plog(XLOG_ERROR, "use %s instead of 0x%lx",
- cp->fs_opts.opt_fs, (unsigned long) mf->mf_fo->opt_fs);
-
- mp->am_link = str3cat((char *) 0,
- cp->fs_opts.opt_fs, "/", link_dir);
-
- normalize_slash(mp->am_link);
- }
- }
-
- if (mf->mf_error > 0) {
- this_error = mf->mf_error;
- } else if (mf->mf_flags & (MFF_MOUNTING | MFF_UNMOUNTING)) {
- /*
- * Still mounting - retry later
- */
-#ifdef DEBUG
- dlog("Duplicate pending mount fstype %s", p->fs_type);
-#endif /* DEBUG */
- this_error = -1;
- } else if (FSRV_ISDOWN(mf->mf_server)) {
- /*
- * Would just mount from the same place
- * as a hung mount - so give up
- */
-#ifdef DEBUG
- dlog("%s is already hung - giving up", mf->mf_mount);
-#endif /* DEBUG */
- mp_error = EWOULDBLOCK;
- dont_retry = TRUE;
- this_error = -1;
- } else if (mf->mf_flags & MFF_MOUNTED) {
-#ifdef DEBUG
- dlog("duplicate mount of \"%s\" ...", mf->mf_info);
-#endif /* DEBUG */
-
- /*
- * Just call mounted()
- */
- am_mounted(mp);
-
- this_error = 0;
- break;
- }
-
- /*
- * Will usually need to play around with the mount nodes
- * file attribute structure. This must be done here.
- * Try and get things initialized, even if the fileserver
- * is not known to be up. In the common case this will
- * progress things faster.
- */
- if (!this_error) {
- /*
- * Fill in attribute fields.
- */
- if (mf->mf_ops->fs_flags & FS_DIRECTORY)
- mk_fattr(mp, NFDIR);
- else
- mk_fattr(mp, NFLNK);
-
- if (p->fs_init)
- this_error = (*p->fs_init) (mf);
- }
-
- /*
- * Make sure the fileserver is UP before doing any more work
- */
- if (!FSRV_ISUP(mf->mf_server)) {
-#ifdef DEBUG
- dlog("waiting for server %s to become available", mf->mf_server->fs_host);
-#endif /* DEBUG */
- this_error = -1;
- }
-
- if (!this_error && mf->mf_fo->opt_delay) {
- /*
- * If there is a delay timer on the mount
- * then don't try to mount if the timer
- * has not expired.
- */
- int i = atoi(mf->mf_fo->opt_delay);
- if (i > 0 && clocktime() < (cp->start + i)) {
-#ifdef DEBUG
- dlog("Mount of %s delayed by %lds", mf->mf_mount, i - clocktime() + cp->start);
-#endif /* DEBUG */
- this_error = -1;
- }
- }
-
- if (this_error < 0 && !dont_retry) {
- if (!mf_retry)
- mf_retry = dup_mntfs(mf);
- cp->retry = TRUE;
- }
-
- if (!this_error) {
- if (p->fs_flags & FS_MBACKGROUND) {
- mf->mf_flags |= MFF_MOUNTING; /* XXX */
-#ifdef DEBUG
- dlog("backgrounding mount of \"%s\"", mf->mf_mount);
-#endif /* DEBUG */
- if (cp->callout) {
- untimeout(cp->callout);
- cp->callout = 0;
- }
- run_task(try_mount, (voidp) mp, amfs_auto_cont, (voidp) cp);
- mf->mf_flags |= MFF_MKMNT; /* XXX */
- if (mf_retry)
- free_mntfs(mf_retry);
- return -1;
- } else {
-#ifdef DEBUG
- dlog("foreground mount of \"%s\" ...", mf->mf_info);
-#endif /* DEBUG */
- this_error = try_mount((voidp) mp);
- if (this_error < 0) {
- if (!mf_retry)
- mf_retry = dup_mntfs(mf);
- cp->retry = TRUE;
- }
- }
- }
-
- if (this_error >= 0) {
- if (this_error > 0) {
- amd_stats.d_merr++;
- if (mf != mf_retry) {
- mf->mf_error = this_error;
- mf->mf_flags |= MFF_ERROR;
- }
- }
-
- /*
- * Wakeup anything waiting for this mount
- */
- wakeup((voidp) mf);
- }
- }
-
- if (this_error && cp->retry) {
- free_mntfs(mf);
- mf = cp->mp->am_mnt = mf_retry;
- /*
- * Not retrying again (so far)
- */
- cp->retry = FALSE;
- cp->tried = FALSE;
- /*
- * Start at the beginning.
- * Rewind the location vector and
- * reset the default options.
- */
- cp->ivec = cp->xivec;
- cp->def_opts = strealloc(cp->def_opts, cp->auto_opts);
- /*
- * Arrange that autofs_bgmount is called
- * after anything else happens.
- */
-#ifdef DEBUG
- dlog("Arranging to retry mount of %s", cp->mp->am_path);
-#endif /* DEBUG */
- sched_task(amfs_auto_retry, (voidp) cp, (voidp) mf);
- if (cp->callout)
- untimeout(cp->callout);
- cp->callout = timeout(RETRY_INTERVAL, wakeup, (voidp) mf);
-
- cp->mp->am_ttl = clocktime() + RETRY_INTERVAL;
-
- /*
- * Not done yet - so don't return anything
- */
- return -1;
- }
-
- if (hard_error < 0 || this_error == 0)
- hard_error = this_error;
-
- /*
- * Discard handle on duff filesystem.
- * This should never happen since it
- * should be caught by the case above.
- */
- if (mf_retry) {
- if (hard_error)
- plog(XLOG_ERROR, "discarding a retry mntfs for %s", mf_retry->mf_mount);
- free_mntfs(mf_retry);
- }
-
- /*
- * If we get here, then either the mount succeeded or
- * there is no more mount information available.
- */
- if (hard_error < 0 && mp_error)
- hard_error = cp->mp->am_error = mp_error;
- if (hard_error > 0) {
- /*
- * Set a small(ish) timeout on an error node if
- * the error was not a time out.
- */
- switch (hard_error) {
- case ETIMEDOUT:
- case EWOULDBLOCK:
- cp->mp->am_timeo = 17;
- break;
- default:
- cp->mp->am_timeo = 5;
- break;
- }
- new_ttl(cp->mp);
- }
-
- /*
- * Make sure that the error value in the mntfs has a
- * reasonable value.
- */
- if (mf->mf_error < 0) {
- mf->mf_error = hard_error;
- if (hard_error)
- mf->mf_flags |= MFF_ERROR;
- }
-
- /*
- * In any case we don't need the continuation any more
- */
- free_continuation(cp);
-
- return hard_error;
-}
-
-
-/*
- * Automount interface to RPC lookup routine
- * Find the corresponding entry and return
- * the file handle for it.
- */
-am_node *
-autofs_lookuppn(am_node *mp, char *fname, int *error_return, int op)
-{
- am_node *ap, *new_mp, *ap_hung;
- char *info; /* Mount info - where to get the file system */
- char **ivec, **xivec; /* Split version of info */
- char *auto_opts; /* Automount options */
- int error = 0; /* Error so far */
- char path_name[MAXPATHLEN]; /* General path name buffer */
- char apath[MAXPATHLEN]; /* autofs path (added space) */
- char *pfname; /* Path for database lookup */
- struct continuation *cp; /* Continuation structure if need to mount */
- int in_progress = 0; /* # of (un)mount in progress */
- char *dflts;
- mntfs *mf;
-
-#ifdef DEBUG
- dlog("in autofs_lookuppn");
-#endif /* DEBUG */
-
- /*
- * If the server is shutting down
- * then don't return information
- * about the mount point.
- */
- if (amd_state == Finishing) {
-#ifdef DEBUG
- if ((mf = mp->am_mnt) == 0 || mf->mf_ops == &amfs_direct_ops) {
- dlog("%s mount ignored - going down", fname);
- } else {
- dlog("%s/%s mount ignored - going down", mp->am_path, fname);
- }
-#endif /* DEBUG */
- ereturn(ENOENT);
- }
-
- /*
- * Handle special case of "." and ".."
- */
- if (fname[0] == '.') {
- if (fname[1] == '\0')
- return mp; /* "." is the current node */
- if (fname[1] == '.' && fname[2] == '\0') {
- if (mp->am_parent) {
-#ifdef DEBUG
- dlog(".. in %s gives %s", mp->am_path, mp->am_parent->am_path);
-#endif /* DEBUG */
- return mp->am_parent; /* ".." is the parent node */
- }
- ereturn(ESTALE);
- }
- }
-
- /*
- * Check for valid key name.
- * If it is invalid then pretend it doesn't exist.
- */
- if (!valid_key(fname)) {
- plog(XLOG_WARNING, "Key \"%s\" contains a disallowed character", fname);
- ereturn(ENOENT);
- }
-
- /*
- * Expand key name.
- * fname is now a private copy.
- */
- fname = expand_key(fname);
-
- for (ap_hung = 0, ap = mp->am_child; ap; ap = ap->am_osib) {
- /*
- * Otherwise search children of this node
- */
- if (FSTREQ(ap->am_name, fname)) {
- mf = ap->am_mnt;
- if (ap->am_error) {
- error = ap->am_error;
- continue;
- }
- /*
- * If the error code is undefined then it must be
- * in progress.
- */
- if (mf->mf_error < 0)
- goto in_progrss;
-
- /*
- * Check for a hung node
- */
- if (FSRV_ISDOWN(mf->mf_server)) {
-#ifdef DEBUG
- dlog("server hung");
-#endif /* DEBUG */
- error = ap->am_error;
- ap_hung = ap;
- continue;
- }
- /*
- * If there was a previous error with this node
- * then return that error code.
- */
- if (mf->mf_flags & MFF_ERROR) {
- error = mf->mf_error;
- continue;
- }
- if (!(mf->mf_flags & MFF_MOUNTED) || (mf->mf_flags & MFF_UNMOUNTING)) {
- in_progrss:
- /*
- * If the fs is not mounted or it is unmounting then there
- * is a background (un)mount in progress. In this case
- * we just drop the RPC request (return nil) and
- * wait for a retry, by which time the (un)mount may
- * have completed.
- */
-#ifdef DEBUG
- dlog("ignoring mount of %s in %s -- flags (%x) in progress",
- fname, mf->mf_mount, mf->mf_flags);
-#endif /* DEBUG */
- in_progress++;
- continue;
- }
-
- /*
- * Otherwise we have a hit: return the current mount point.
- */
-#ifdef DEBUG
- dlog("matched %s in %s", fname, ap->am_path);
-#endif /* DEBUG */
- XFREE(fname);
- return ap;
- }
- }
-
- if (in_progress) {
-#ifdef DEBUG
- dlog("Waiting while %d mount(s) in progress", in_progress);
-#endif /* DEBUG */
- XFREE(fname);
- ereturn(-1);
- }
-
- /*
- * If an error occurred then return it.
- */
- if (error) {
-#ifdef DEBUG
- errno = error; /* XXX */
- dlog("Returning error: %m");
-#endif /* DEBUG */
- XFREE(fname);
- ereturn(error);
- }
-
- /*
- * If doing a delete then don't create again!
- */
- switch (op) {
- case VLOOK_DELETE:
- ereturn(ENOENT);
-
- case VLOOK_CREATE:
- break;
-
- default:
- plog(XLOG_FATAL, "Unknown op to autofs_lookuppn: 0x%x", op);
- ereturn(EINVAL);
- }
-
- /*
- * If the server is going down then just return,
- * don't try to mount any more file systems
- */
- if ((int) amd_state >= (int) Finishing) {
-#ifdef DEBUG
- dlog("not found - server going down anyway");
-#endif /* DEBUG */
- XFREE(fname);
- ereturn(ENOENT);
- }
-
- /*
- * If we get there then this is a reference to an,
- * as yet, unknown name so we need to search the mount
- * map for it.
- */
- if (mp->am_pref) {
- sprintf(path_name, "%s%s", mp->am_pref, fname);
- pfname = path_name;
- } else {
- pfname = fname;
- }
-
- mf = mp->am_mnt;
-
-#ifdef DEBUG
- dlog("will search map info in %s to find %s", mf->mf_info, pfname);
-#endif /* DEBUG */
- /*
- * Consult the oracle for some mount information.
- * info is malloc'ed and belongs to this routine.
- * It ends up being free'd in free_continuation().
- *
- * Note that this may return -1 indicating that information
- * is not yet available.
- */
- error = mapc_search((mnt_map *) mf->mf_private, pfname, &info);
- if (error) {
- if (error > 0)
- plog(XLOG_MAP, "No map entry for %s", pfname);
- else
- plog(XLOG_MAP, "Waiting on map entry for %s", pfname);
- XFREE(fname);
- ereturn(error);
- }
-#ifdef DEBUG
- dlog("mount info is %s", info);
-#endif /* DEBUG */
-
- /*
- * Split info into an argument vector.
- * The vector is malloc'ed and belongs to
- * this routine. It is free'd in free_continuation()
- */
- xivec = ivec = strsplit(info, ' ', '\"');
-
- /*
- * Default error code...
- */
- if (ap_hung)
- error = EWOULDBLOCK;
- else
- error = ENOENT;
-
- /*
- * Allocate a new map
- */
- new_mp = exported_ap_alloc();
- if (new_mp == 0) {
- XFREE(xivec);
- XFREE(info);
- XFREE(fname);
- ereturn(ENOSPC);
- }
- if (mf->mf_auto)
- auto_opts = mf->mf_auto;
- else
- auto_opts = "";
-
- auto_opts = strdup(auto_opts);
-
-#ifdef DEBUG
- dlog("searching for /defaults entry");
-#endif /* DEBUG */
- if (mapc_search((mnt_map *) mf->mf_private, "/defaults", &dflts) == 0) {
- char *dfl;
- char **rvec;
-#ifdef DEBUG
- dlog("/defaults gave %s", dflts);
-#endif /* DEBUG */
- if (*dflts == '-')
- dfl = dflts + 1;
- else
- dfl = dflts;
-
- /*
- * Chop the defaults up
- */
- rvec = strsplit(dfl, ' ', '\"');
-
- if (gopt.flags & CFM_SELECTORS_IN_DEFAULTS) {
- /*
- * Pick whichever first entry matched the list of selectors.
- * Strip the selectors from the string, and assign to dfl the
- * rest of the string.
- */
- if (rvec) {
- am_opts ap;
- am_ops *pt;
- char **sp = rvec;
- while (*sp) { /* loop until you find something, if any */
- memset((char *) &ap, 0, sizeof(am_opts));
- pt = ops_match(&ap, *sp, "", mp->am_path, "/defaults",
- mp->am_parent->am_mnt->mf_info);
- free_opts(&ap); /* don't leak */
- if (pt == &amfs_error_ops) {
- plog(XLOG_MAP, "did not match defaults for \"%s\"", *sp);
- } else {
- dfl = strip_selectors(*sp, "/defaults");
- plog(XLOG_MAP, "matched default selectors \"%s\"", dfl);
- break;
- }
- ++sp;
- }
- }
- } else { /* not selectors_in_defaults */
- /*
- * Extract first value
- */
- dfl = rvec[0];
- }
-
- /*
- * If there were any values at all...
- */
- if (dfl) {
- /*
- * Log error if there were other values
- */
- if (!(gopt.flags & CFM_SELECTORS_IN_DEFAULTS) && rvec[1]) {
-# ifdef DEBUG
- dlog("/defaults chopped into %s", dfl);
-# endif /* DEBUG */
- plog(XLOG_USER, "More than a single value for /defaults in %s", mf->mf_info);
- }
-
- /*
- * Prepend to existing defaults if they exist,
- * otherwise just use these defaults.
- */
- if (*auto_opts && *dfl) {
- char *nopts = (char *) xmalloc(strlen(auto_opts) + strlen(dfl) + 2);
- sprintf(nopts, "%s;%s", dfl, auto_opts);
- XFREE(auto_opts);
- auto_opts = nopts;
- } else if (*dfl) {
- auto_opts = strealloc(auto_opts, dfl);
- }
- }
- XFREE(dflts);
- /*
- * Don't need info vector any more
- */
- XFREE(rvec);
- }
-
- /*
- * Fill it in
- */
- init_map(new_mp, fname);
-
- /*
- * Turn on autofs flag if needed.
- */
- if (mp->am_flags & AMF_AUTOFS) {
- new_mp->am_flags |= AMF_AUTOFS;
- }
-
- /*
- * Put it in the table
- */
- insert_am(new_mp, mp);
-
- /*
- * Fill in some other fields,
- * path and mount point.
- *
- * bugfix: do not prepend old am_path if direct map
- * <wls@astro.umd.edu> William Sebok
- */
-
- strcpy(apath, fname);
- strcat(apath, " ");
- new_mp->am_path = str3cat(new_mp->am_path,
- mf->mf_ops == &amfs_direct_ops ? "" : mp->am_path,
- *fname == '/' ? "" : "/",
- apath);
-
-#ifdef DEBUG
- dlog("setting path to \"%s\"", new_mp->am_path);
-#endif /* DEBUG */
-
- /*
- * Take private copy of pfname
- */
- pfname = strdup(pfname);
-
- /*
- * Construct a continuation
- */
- cp = ALLOC(struct continuation);
- cp->callout = 0;
- cp->mp = new_mp;
- cp->xivec = xivec;
- cp->ivec = ivec;
- cp->info = info;
- cp->key = pfname;
- cp->auto_opts = auto_opts;
- cp->retry = FALSE;
- cp->tried = FALSE;
- cp->start = clocktime();
- cp->def_opts = strdup(auto_opts);
- memset((voidp) &cp->fs_opts, 0, sizeof(cp->fs_opts));
-
- /*
- * Try and mount the file system. If this succeeds immediately (possible
- * for a ufs file system) then return the attributes, otherwise just
- * return an error.
- */
- error = autofs_bgmount(cp, error);
- reschedule_timeout_mp();
- if (!error) {
- XFREE(fname);
- return new_mp;
- }
-
- /*
- * Code for quick reply. If nfs_program_2_transp is set, then
- * its the transp that's been passed down from nfs_program_2().
- * If new_mp->am_transp is not already set, set it by copying in
- * nfs_program_2_transp. Once am_transp is set, quick_reply() can
- * use it to send a reply to the client that requested this mount.
- */
- if (nfs_program_2_transp && !new_mp->am_transp) {
- new_mp->am_transp = (SVCXPRT *) xmalloc(sizeof(SVCXPRT));
- *(new_mp->am_transp) = *nfs_program_2_transp;
- }
- if (error && (new_mp->am_mnt->mf_ops == &amfs_error_ops))
- new_mp->am_error = error;
-
- assign_error_mntfs(new_mp);
-
- XFREE(fname);
-
- ereturn(error);
-}
-#endif /* HAVE_FS_AUTOFS */
diff --git a/contrib/amd/amd/ops_cachefs.c b/contrib/amd/amd/ops_cachefs.c
deleted file mode 100644
index d3e303bc2bf9..000000000000
--- a/contrib/amd/amd/ops_cachefs.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_cachefs.c
- *
- */
-
-/*
- * Caching filesystem (Solaris 2.x)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static char *cachefs_match(am_opts *fo);
-static int cachefs_init(mntfs *mf);
-static int cachefs_mount(am_node *am, mntfs *mf);
-static int cachefs_umount(am_node *am, mntfs *mf);
-
-
-/*
- * Ops structure
- */
-am_ops cachefs_ops =
-{
- "cachefs",
- cachefs_match,
- cachefs_init,
- cachefs_mount,
- cachefs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* cachefs_readlink */
- 0, /* cachefs_mounted */
- 0, /* cachefs_umounted */
- amfs_generic_find_srvr,
- 0, /* cachefs_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_CACHEFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * Check that f/s has all needed fields.
- * Returns: matched string if found, NULL otherwise.
- */
-static char *
-cachefs_match(am_opts *fo)
-{
- /* sanity check */
- if (!fo->opt_rfs || !fo->opt_fs || !fo->opt_cachedir) {
- plog(XLOG_USER, "cachefs: must specify cachedir, rfs, and fs");
- return NULL;
- }
-
- dlog("CACHEFS: using cache directory \"%s\"", fo->opt_cachedir);
-
- /* determine magic cookie to put in mtab */
- return strdup(fo->opt_cachedir);
-}
-
-
-/*
- * Initialize.
- * Returns: 0 if OK, non-zero (errno) if failed.
- */
-static int
-cachefs_init(mntfs *mf)
-{
- /*
- * Save cache directory name
- */
- if (!mf->mf_private) {
- mf->mf_private = (voidp) strdup(mf->mf_fo->opt_cachedir);
- mf->mf_prfree = (void (*)(voidp)) free;
- }
-
- return 0;
-}
-
-
-/*
- * mntpt is the mount point ($fs) [XXX: was 'dir']
- * backdir is the mounted pathname ($rfs) [XXX: was 'fs_name']
- * cachedir is the cache directory ($cachedir)
- */
-static int
-mount_cachefs(char *mntdir, char *backdir, char *cachedir,
- char *opts, int on_autofs)
-{
- cachefs_args_t ca;
- mntent_t mnt;
- int flags;
- char *cp;
- MTYPE_TYPE type = MOUNT_TYPE_CACHEFS; /* F/S mount type */
-
- memset((voidp) &ca, 0, sizeof(ca)); /* Paranoid */
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = backdir;
- mnt.mnt_type = MNTTAB_TYPE_CACHEFS;
- mnt.mnt_opts = opts;
-
- flags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- flags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
- /* Fill in cachefs mount arguments */
-
- /*
- * XXX: Caveats
- * (1) cache directory is NOT checked for sanity beforehand, nor is it
- * purged. Maybe it should be purged first?
- * (2) cache directory is NOT locked. Should we?
- */
-
- /* mount flags */
- ca.cfs_options.opt_flags = CFS_WRITE_AROUND | CFS_ACCESS_BACKFS;
- /* cache population size */
- ca.cfs_options.opt_popsize = DEF_POP_SIZE; /* default: 64K */
- /* filegrp size */
- ca.cfs_options.opt_fgsize = DEF_FILEGRP_SIZE; /* default: 256 */
-
- /* CFS ID for file system (must be unique) */
- ca.cfs_fsid = cachedir;
-
- /* CFS fscdir name */
- memset(ca.cfs_cacheid, 0, sizeof(ca.cfs_cacheid));
- /*
- * Append cacheid and mountpoint.
- * sizeof(cfs_cacheid) should be C_MAX_MOUNT_FSCDIRNAME as per
- * <sys/fs/cachefs_fs.h> (checked on Solaris 8).
- */
- xsnprintf(ca.cfs_cacheid, sizeof(ca.cfs_cacheid),
- "%s:%s", ca.cfs_fsid, mntdir);
- /* convert '/' to '_' (Solaris does that...) */
- cp = ca.cfs_cacheid;
- while ((cp = strpbrk(cp, "/")) != NULL)
- *cp = '_';
-
- /* path for this cache dir */
- ca.cfs_cachedir = cachedir;
-
- /* back filesystem dir */
- ca.cfs_backfs = backdir;
-
- /* same as nfs values (XXX: need to handle these options) */
- ca.cfs_acregmin = 0;
- ca.cfs_acregmax = 0;
- ca.cfs_acdirmin = 0;
- ca.cfs_acdirmax = 0;
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, flags, (caddr_t) &ca, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-}
-
-
-static int
-cachefs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_cachefs(mf->mf_mount,
- mf->mf_fo->opt_rfs,
- mf->mf_fo->opt_cachedir,
- mf->mf_mopts,
- on_autofs);
- if (error) {
- errno = error;
- /* according to Solaris, if errno==ESRCH, "options to not match" */
- if (error == ESRCH)
- plog(XLOG_ERROR, "mount_cachefs: options to no match: %m");
- else
- plog(XLOG_ERROR, "mount_cachefs: %m");
- return error;
- }
-
- return 0;
-}
-
-
-static int
-cachefs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
- int error;
-
- error = UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-
- /*
- * In the case of cachefs, we must fsck the cache directory. Otherwise,
- * it will remain inconsistent, and the next cachefs mount will fail
- * with the error "no space left on device" (ENOSPC).
- *
- * XXX: this is hacky! use fork/exec/wait instead...
- */
- if (!error) {
- char *cachedir = NULL;
- char cmd[128];
-
- cachedir = (char *) mf->mf_private;
- plog(XLOG_INFO, "running fsck on cache directory \"%s\"", cachedir);
- xsnprintf(cmd, sizeof(cmd), "fsck -F cachefs %s", cachedir);
- system(cmd);
- }
-
- return error;
-}
diff --git a/contrib/amd/amd/ops_cdfs.c b/contrib/amd/amd/ops_cdfs.c
deleted file mode 100644
index 40355ac5c078..000000000000
--- a/contrib/amd/amd/ops_cdfs.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_cdfs.c
- *
- */
-
-/*
- * High Sierra (CD-ROM) file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static char *cdfs_match(am_opts *fo);
-static int cdfs_mount(am_node *am, mntfs *mf);
-static int cdfs_umount(am_node *am, mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops cdfs_ops =
-{
- "cdfs",
- cdfs_match,
- 0, /* cdfs_init */
- cdfs_mount,
- cdfs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* cdfs_readlink */
- 0, /* cdfs_mounted */
- 0, /* cdfs_umounted */
- amfs_generic_find_srvr,
- 0, /* cdfs_get_wchan */
- FS_MKMNT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_CDFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * CDFS needs remote filesystem.
- */
-static char *
-cdfs_match(am_opts *fo)
-{
- if (!fo->opt_dev) {
- plog(XLOG_USER, "cdfs: no source device specified");
- return 0;
- }
- dlog("CDFS: mounting device \"%s\" on \"%s\"",
- fo->opt_dev, fo->opt_fs);
-
- /*
- * Determine magic cookie to put in mtab
- */
- return strdup(fo->opt_dev);
-}
-
-
-static int
-mount_cdfs(char *mntdir, char *fs_name, char *opts, int on_autofs)
-{
- cdfs_args_t cdfs_args;
- mntent_t mnt;
- int genflags, cdfs_flags, retval;
-
- /*
- * Figure out the name of the file system type.
- */
- MTYPE_TYPE type = MOUNT_TYPE_CDFS;
-
- memset((voidp) &cdfs_args, 0, sizeof(cdfs_args)); /* Paranoid */
- cdfs_flags = 0;
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MNTTAB_TYPE_CDFS;
- mnt.mnt_opts = opts;
-
-#if defined(MNT2_CDFS_OPT_DEFPERM) && defined(MNTTAB_OPT_DEFPERM)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_DEFPERM))
-# ifdef MNT2_CDFS_OPT_DEFPERM
- cdfs_flags |= MNT2_CDFS_OPT_DEFPERM;
-# else /* not MNT2_CDFS_OPT_DEFPERM */
- cdfs_flags &= ~MNT2_CDFS_OPT_NODEFPERM;
-# endif /* not MNT2_CDFS_OPT_DEFPERM */
-#endif /* defined(MNT2_CDFS_OPT_DEFPERM) && defined(MNTTAB_OPT_DEFPERM) */
-
-#if defined(MNT2_CDFS_OPT_NODEFPERM) && defined(MNTTAB_OPT_NODEFPERM)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_NODEFPERM))
- cdfs_flags |= MNT2_CDFS_OPT_NODEFPERM;
-#endif /* MNTTAB_OPT_NODEFPERM */
-
-#if defined(MNT2_CDFS_OPT_NOVERSION) && defined(MNTTAB_OPT_NOVERSION)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_NOVERSION))
- cdfs_flags |= MNT2_CDFS_OPT_NOVERSION;
-#endif /* defined(MNT2_CDFS_OPT_NOVERSION) && defined(MNTTAB_OPT_NOVERSION) */
-
-#if defined(MNT2_CDFS_OPT_RRIP) && defined(MNTTAB_OPT_RRIP)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_RRIP))
- cdfs_flags |= MNT2_CDFS_OPT_RRIP;
-#endif /* defined(MNT2_CDFS_OPT_RRIP) && defined(MNTTAB_OPT_RRIP) */
-#if defined(MNT2_CDFS_OPT_NORRIP) && defined(MNTTAB_OPT_NORRIP)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_NORRIP))
- cdfs_flags |= MNT2_CDFS_OPT_NORRIP;
-#endif /* defined(MNT2_CDFS_OPT_NORRIP) && defined(MNTTAB_OPT_NORRIP) */
-
-#if defined(MNT2_CDFS_OPT_GENS) && defined(MNTTAB_OPT_GENS)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_GENS))
- cdfs_flags |= MNT2_CDFS_OPT_GENS;
-#endif /* defined(MNT2_CDFS_OPT_GENS) && defined(MNTTAB_OPT_GENS) */
-#if defined(MNT2_CDFS_OPT_EXTATT) && defined(MNTTAB_OPT_EXTATT)
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_EXTATT))
- cdfs_flags |= MNT2_CDFS_OPT_EXTATT;
-#endif /* defined(MNT2_CDFS_OPT_EXTATT) && defined(MNTTAB_OPT_EXTATT) */
-
- genflags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- genflags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
-#ifdef HAVE_CDFS_ARGS_T_FLAGS
- cdfs_args.flags = cdfs_flags;
-#endif /* HAVE_CDFS_ARGS_T_FLAGS */
-
-#ifdef HAVE_CDFS_ARGS_T_ISO_FLAGS
- cdfs_args.iso_flags = genflags | cdfs_flags;
-#endif /* HAVE_CDFS_ARGS_T_ISO_FLAGS */
-
-#ifdef HAVE_CDFS_ARGS_T_ISO_PGTHRESH
- cdfs_args.iso_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH);
-#endif /* HAVE_CDFS_ARGS_T_ISO_PGTHRESH */
-
-#ifdef HAVE_CDFS_ARGS_T_NORRIP
- /* XXX: need to provide norrip mount opt */
- cdfs_args.norrip = 0; /* use Rock-Ridge Protocol extensions */
-#endif /* HAVE_CDFS_ARGS_T_NORRIP */
-
-#ifdef HAVE_CDFS_ARGS_T_SSECTOR
- /* XXX: need to provide ssector mount option */
- cdfs_args.ssector = 0; /* use 1st session on disk */
-#endif /* HAVE_CDFS_ARGS_T_SSECTOR */
-
-#ifdef HAVE_CDFS_ARGS_T_FSPEC
- cdfs_args.fspec = fs_name;
-#endif /* HAVE_CDFS_ARGS_T_FSPEC */
-
- /*
- * Call generic mount routine
- */
- retval = mount_fs(&mnt, genflags, (caddr_t) &cdfs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-
- return retval;
-}
-
-
-static int
-cdfs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_cdfs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_cdfs: %m");
- return error;
- }
- return 0;
-}
-
-
-static int
-cdfs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
-
- return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-}
diff --git a/contrib/amd/amd/ops_efs.c b/contrib/amd/amd/ops_efs.c
deleted file mode 100644
index 047fe1e4690c..000000000000
--- a/contrib/amd/amd/ops_efs.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_efs.c
- *
- */
-
-/*
- * Irix UN*X file system: EFS (Extent File System)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static char *efs_match(am_opts *fo);
-static int efs_mount(am_node *am, mntfs *mf);
-static int efs_umount(am_node *am, mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops efs_ops =
-{
- "efs",
- efs_match,
- 0, /* efs_init */
- efs_mount,
- efs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* efs_readlink */
- 0, /* efs_mounted */
- 0, /* efs_umounted */
- amfs_generic_find_srvr,
- 0, /* efs_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_EFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * EFS needs local filesystem and device.
- */
-static char *
-efs_match(am_opts *fo)
-{
-
- if (!fo->opt_dev) {
- plog(XLOG_USER, "efs: no device specified");
- return 0;
- }
-
- dlog("EFS: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs);
-
- /*
- * Determine magic cookie to put in mtab
- */
- return strdup(fo->opt_dev);
-}
-
-
-static int
-mount_efs(char *mntdir, char *fs_name, char *opts, int on_autofs)
-{
- efs_args_t efs_args;
- mntent_t mnt;
- int flags;
-
- /*
- * Figure out the name of the file system type.
- */
- MTYPE_TYPE type = MOUNT_TYPE_EFS;
-
- memset((voidp) &efs_args, 0, sizeof(efs_args)); /* Paranoid */
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MNTTAB_TYPE_EFS;
- mnt.mnt_opts = opts;
-
- flags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- flags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
-#ifdef HAVE_EFS_ARGS_T_FLAGS
- efs_args.flags = 0; /* XXX: fix this to correct flags */
-#endif /* HAVE_EFS_ARGS_T_FLAGS */
-#ifdef HAVE_EFS_ARGS_T_FSPEC
- efs_args.fspec = fs_name;
-#endif /* HAVE_EFS_ARGS_T_FSPEC */
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, flags, (caddr_t) &efs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-}
-
-
-static int
-efs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_efs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_efs: %m");
- return error;
- }
-
- return 0;
-}
-
-
-static int
-efs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
-
- return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-}
-
diff --git a/contrib/amd/amd/ops_lofs.c b/contrib/amd/amd/ops_lofs.c
deleted file mode 100644
index 26fdc9f9b626..000000000000
--- a/contrib/amd/amd/ops_lofs.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_lofs.c
- *
- */
-
-/*
- * Loopback file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward definitions */
-static char *lofs_match(am_opts *fo);
-static int lofs_mount(am_node *am, mntfs *mf);
-static int lofs_umount(am_node *am, mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops lofs_ops =
-{
- "lofs",
- lofs_match,
- 0, /* lofs_init */
- lofs_mount,
- lofs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* lofs_readlink */
- 0, /* lofs_mounted */
- 0, /* lofs_umounted */
- amfs_generic_find_srvr,
- 0, /* lofs_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_LOFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * LOFS needs remote filesystem.
- */
-static char *
-lofs_match(am_opts *fo)
-{
- if (!fo->opt_rfs) {
- plog(XLOG_USER, "lofs: no source filesystem specified");
- return 0;
- }
- dlog("LOFS: mounting fs \"%s\" on \"%s\"",
- fo->opt_rfs, fo->opt_fs);
-
- /*
- * Determine magic cookie to put in mtab
- */
- return strdup(fo->opt_rfs);
-}
-
-
-int
-mount_lofs(char *mntdir, char *fs_name, char *opts, int on_autofs)
-{
- mntent_t mnt;
- int flags;
-
- /*
- * Figure out the name of the file system type.
- */
- MTYPE_TYPE type = MOUNT_TYPE_LOFS;
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MNTTAB_TYPE_LOFS;
- mnt.mnt_opts = opts;
-
- flags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- flags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, flags, NULL, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-}
-
-
-static int
-lofs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_lofs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_lofs: %m");
- return error;
- }
- return 0;
-}
-
-
-static int
-lofs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
-
- return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-}
diff --git a/contrib/amd/amd/ops_mfs.c b/contrib/amd/amd/ops_mfs.c
deleted file mode 100644
index ccaa49c569cd..000000000000
--- a/contrib/amd/amd/ops_mfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_mfs.c
- *
- */
-
-/*
- * Memory file system (RAM filesystem)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_nfs.c b/contrib/amd/amd/ops_nfs.c
deleted file mode 100644
index a6a85858d484..000000000000
--- a/contrib/amd/amd/ops_nfs.c
+++ /dev/null
@@ -1,1042 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_nfs.c
- *
- */
-
-/*
- * Network file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * Convert from nfsstat to UN*X error code
- */
-#define unx_error(e) ((int)(e))
-
-/*
- * FH_TTL is the time a file handle will remain in the cache since
- * last being used. If the file handle becomes invalid, then it
- * will be flushed anyway.
- */
-#define FH_TTL (5 * 60) /* five minutes */
-#define FH_TTL_ERROR (30) /* 30 seconds */
-#define FHID_ALLOC() (++fh_id)
-
-/*
- * The NFS layer maintains a cache of file handles.
- * This is *fundamental* to the implementation and
- * also allows quick remounting when a filesystem
- * is accessed soon after timing out.
- *
- * The NFS server layer knows to flush this cache
- * when a server goes down so avoiding stale handles.
- *
- * Each cache entry keeps a hard reference to
- * the corresponding server. This ensures that
- * the server keepalive information is maintained.
- *
- * The copy of the sockaddr_in here is taken so
- * that the port can be twiddled to talk to mountd
- * instead of portmap or the NFS server as used
- * elsewhere.
- * The port# is flushed if a server goes down.
- * The IP address is never flushed - we assume
- * that the address of a mounted machine never
- * changes. If it does, then you have other
- * problems...
- */
-typedef struct fh_cache fh_cache;
-struct fh_cache {
- qelem fh_q; /* List header */
- wchan_t fh_wchan; /* Wait channel */
- int fh_error; /* Valid data? */
- int fh_id; /* Unique id */
- int fh_cid; /* Callout id */
- u_long fh_nfs_version; /* highest NFS version on host */
- am_nfs_handle_t fh_nfs_handle; /* Handle on filesystem */
- int fh_status; /* Status of last rpc */
- struct sockaddr_in fh_sin; /* Address of mountd */
- fserver *fh_fs; /* Server holding filesystem */
- char *fh_path; /* Filesystem on host */
-};
-
-/* forward definitions */
-static int nfs_init(mntfs *mf);
-static char *nfs_match(am_opts *fo);
-static int nfs_mount(am_node *am, mntfs *mf);
-static int nfs_umount(am_node *am, mntfs *mf);
-static void nfs_umounted(mntfs *mf);
-static int call_mountd(fh_cache *fp, u_long proc, fwd_fun f, wchan_t wchan);
-static int webnfs_lookup(fh_cache *fp, fwd_fun f, wchan_t wchan);
-static int fh_id = 0;
-
-/* globals */
-AUTH *nfs_auth;
-qelem fh_head = {&fh_head, &fh_head};
-
-/*
- * Network file system operations
- */
-am_ops nfs_ops =
-{
- "nfs",
- nfs_match,
- nfs_init,
- nfs_mount,
- nfs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* nfs_readlink */
- 0, /* nfs_mounted */
- nfs_umounted,
- find_nfs_srvr,
- 0, /* nfs_get_wchan */
- FS_MKMNT | FS_BACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_NFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-static fh_cache *
-find_nfs_fhandle_cache(opaque_t arg, int done)
-{
- fh_cache *fp, *fp2 = 0;
- int id = (long) arg; /* for 64-bit archs */
-
- ITER(fp, fh_cache, &fh_head) {
- if (fp->fh_id == id) {
- fp2 = fp;
- break;
- }
- }
-
- if (fp2) {
- dlog("fh cache gives fp %#lx, fs %s", (unsigned long) fp2, fp2->fh_path);
- } else {
- dlog("fh cache search failed");
- }
-
- if (fp2 && !done) {
- fp2->fh_error = ETIMEDOUT;
- return 0;
- }
-
- return fp2;
-}
-
-
-/*
- * Called when a filehandle appears via the mount protocol
- */
-static void
-got_nfs_fh_mount(voidp pkt, int len, struct sockaddr_in *sa, struct sockaddr_in *ia, opaque_t arg, int done)
-{
- fh_cache *fp;
- struct fhstatus res;
-#ifdef HAVE_FS_NFS3
- struct am_mountres3 res3;
-#endif /* HAVE_FS_NFS3 */
-
- fp = find_nfs_fhandle_cache(arg, done);
- if (!fp)
- return;
-
- /*
- * retrieve the correct RPC reply for the file handle, based on the
- * NFS protocol version.
- */
-#ifdef HAVE_FS_NFS3
- if (fp->fh_nfs_version == NFS_VERSION3) {
- memset(&res3, 0, sizeof(res3));
- fp->fh_error = pickup_rpc_reply(pkt, len, (voidp) &res3,
- (XDRPROC_T_TYPE) xdr_am_mountres3);
- fp->fh_status = unx_error(res3.fhs_status);
- memset(&fp->fh_nfs_handle.v3, 0, sizeof(am_nfs_fh3));
- fp->fh_nfs_handle.v3.am_fh3_length = res3.mountres3_u.mountinfo.fhandle.fhandle3_len;
- memmove(fp->fh_nfs_handle.v3.am_fh3_data,
- res3.mountres3_u.mountinfo.fhandle.fhandle3_val,
- fp->fh_nfs_handle.v3.am_fh3_length);
- } else {
-#endif /* HAVE_FS_NFS3 */
- memset(&res, 0, sizeof(res));
- fp->fh_error = pickup_rpc_reply(pkt, len, (voidp) &res,
- (XDRPROC_T_TYPE) xdr_fhstatus);
- fp->fh_status = unx_error(res.fhs_status);
- memmove(&fp->fh_nfs_handle.v2, &res.fhs_fh, NFS_FHSIZE);
-#ifdef HAVE_FS_NFS3
- }
-#endif /* HAVE_FS_NFS3 */
-
- if (!fp->fh_error) {
- dlog("got filehandle for %s:%s", fp->fh_fs->fs_host, fp->fh_path);
- } else {
- plog(XLOG_USER, "filehandle denied for %s:%s", fp->fh_fs->fs_host, fp->fh_path);
- /*
- * Force the error to be EACCES. It's debatable whether it should be
- * ENOENT instead, but the server really doesn't give us any clues, and
- * EACCES is more in line with the "filehandle denied" message.
- */
- fp->fh_error = EACCES;
- }
-
- /*
- * Wakeup anything sleeping on this filehandle
- */
- if (fp->fh_wchan) {
- dlog("Calling wakeup on %#lx", (unsigned long) fp->fh_wchan);
- wakeup(fp->fh_wchan);
- }
-}
-
-
-/*
- * Called when a filehandle appears via WebNFS
- */
-static void
-got_nfs_fh_webnfs(voidp pkt, int len, struct sockaddr_in *sa, struct sockaddr_in *ia, opaque_t arg, int done)
-{
- fh_cache *fp;
- nfsdiropres res;
-#ifdef HAVE_FS_NFS3
- am_LOOKUP3res res3;
-#endif /* HAVE_FS_NFS3 */
-
- fp = find_nfs_fhandle_cache(arg, done);
- if (!fp)
- return;
-
- /*
- * retrieve the correct RPC reply for the file handle, based on the
- * NFS protocol version.
- */
-#ifdef HAVE_FS_NFS3
- if (fp->fh_nfs_version == NFS_VERSION3) {
- memset(&res3, 0, sizeof(res3));
- fp->fh_error = pickup_rpc_reply(pkt, len, (voidp) &res3,
- (XDRPROC_T_TYPE) xdr_am_LOOKUP3res);
- fp->fh_status = unx_error(res3.status);
- memset(&fp->fh_nfs_handle.v3, 0, sizeof(am_nfs_fh3));
- fp->fh_nfs_handle.v3.am_fh3_length = res3.res_u.ok.object.am_fh3_length;
- memmove(fp->fh_nfs_handle.v3.am_fh3_data,
- res3.res_u.ok.object.am_fh3_data,
- fp->fh_nfs_handle.v3.am_fh3_length);
- } else {
-#endif /* HAVE_FS_NFS3 */
- memset(&res, 0, sizeof(res));
- fp->fh_error = pickup_rpc_reply(pkt, len, (voidp) &res,
- (XDRPROC_T_TYPE) xdr_diropres);
- fp->fh_status = unx_error(res.dr_status);
- memmove(&fp->fh_nfs_handle.v2, &res.dr_u.dr_drok_u.drok_fhandle, NFS_FHSIZE);
-#ifdef HAVE_FS_NFS3
- }
-#endif /* HAVE_FS_NFS3 */
-
- if (!fp->fh_error) {
- dlog("got filehandle for %s:%s", fp->fh_fs->fs_host, fp->fh_path);
- } else {
- plog(XLOG_USER, "filehandle denied for %s:%s", fp->fh_fs->fs_host, fp->fh_path);
- /*
- * Force the error to be EACCES. It's debatable whether it should be
- * ENOENT instead, but the server really doesn't give us any clues, and
- * EACCES is more in line with the "filehandle denied" message.
- */
- fp->fh_error = EACCES;
- }
-
- /*
- * Wakeup anything sleeping on this filehandle
- */
- if (fp->fh_wchan) {
- dlog("Calling wakeup on %#lx", (unsigned long) fp->fh_wchan);
- wakeup(fp->fh_wchan);
- }
-}
-
-
-void
-flush_nfs_fhandle_cache(fserver *fs)
-{
- fh_cache *fp;
-
- ITER(fp, fh_cache, &fh_head) {
- if (fp->fh_fs == fs || fs == NULL) {
- /*
- * Only invalidate port info for non-WebNFS servers
- */
- if (!(fp->fh_fs->fs_flags & FSF_WEBNFS))
- fp->fh_sin.sin_port = (u_short) 0;
- fp->fh_error = -1;
- }
- }
-}
-
-
-static void
-discard_fh(opaque_t arg)
-{
- fh_cache *fp = (fh_cache *) arg;
-
- rem_que(&fp->fh_q);
- if (fp->fh_fs) {
- dlog("Discarding filehandle for %s:%s", fp->fh_fs->fs_host, fp->fh_path);
- free_srvr(fp->fh_fs);
- }
- if (fp->fh_path)
- XFREE(fp->fh_path);
- XFREE(fp);
-}
-
-
-/*
- * Determine the file handle for a node
- */
-static int
-prime_nfs_fhandle_cache(char *path, fserver *fs, am_nfs_handle_t *fhbuf, mntfs *mf)
-{
- fh_cache *fp, *fp_save = 0;
- int error;
- int reuse_id = FALSE;
-
- dlog("Searching cache for %s:%s", fs->fs_host, path);
-
- /*
- * First search the cache
- */
- ITER(fp, fh_cache, &fh_head) {
- if (fs != fp->fh_fs || !STREQ(path, fp->fh_path))
- continue; /* skip to next ITER item */
- /* else we got a match */
- switch (fp->fh_error) {
- case 0:
- plog(XLOG_INFO, "prime_nfs_fhandle_cache: NFS version %d", (int) fp->fh_nfs_version);
-
- error = fp->fh_error = fp->fh_status;
-
- if (error == 0) {
- if (mf->mf_flags & MFF_NFS_SCALEDOWN) {
- fp_save = fp;
- /* XXX: why reuse the ID? */
- reuse_id = TRUE;
- break;
- }
-
- if (fhbuf) {
-#ifdef HAVE_FS_NFS3
- if (fp->fh_nfs_version == NFS_VERSION3) {
- memmove((voidp) &(fhbuf->v3), (voidp) &(fp->fh_nfs_handle.v3),
- sizeof(fp->fh_nfs_handle.v3));
- } else
-#endif /* HAVE_FS_NFS3 */
- {
- memmove((voidp) &(fhbuf->v2), (voidp) &(fp->fh_nfs_handle.v2),
- sizeof(fp->fh_nfs_handle.v2));
- }
- }
- if (fp->fh_cid)
- untimeout(fp->fh_cid);
- fp->fh_cid = timeout(FH_TTL, discard_fh, (opaque_t) fp);
- } else if (error == EACCES) {
- /*
- * Now decode the file handle return code.
- */
- plog(XLOG_INFO, "Filehandle denied for \"%s:%s\"",
- fs->fs_host, path);
- } else {
- errno = error; /* XXX */
- plog(XLOG_INFO, "Filehandle error for \"%s:%s\": %m",
- fs->fs_host, path);
- }
-
- /*
- * The error was returned from the remote mount daemon.
- * Policy: this error will be cached for now...
- */
- return error;
-
- case -1:
- /*
- * Still thinking about it, but we can re-use.
- */
- fp_save = fp;
- reuse_id = TRUE;
- break;
-
- default:
- /*
- * Return the error.
- * Policy: make sure we recompute if required again
- * in case this was caused by a network failure.
- * This can thrash mountd's though... If you find
- * your mountd going slowly then:
- * 1. Add a fork() loop to main.
- * 2. Remove the call to innetgr() and don't use
- * netgroups, especially if you don't use YP.
- */
- error = fp->fh_error;
- fp->fh_error = -1;
- return error;
- } /* end of switch statement */
- } /* end of ITER loop */
-
- /*
- * Not in cache
- */
- if (fp_save) {
- fp = fp_save;
- /*
- * Re-use existing slot
- */
- untimeout(fp->fh_cid);
- free_srvr(fp->fh_fs);
- XFREE(fp->fh_path);
- } else {
- fp = ALLOC(struct fh_cache);
- memset((voidp) fp, 0, sizeof(struct fh_cache));
- ins_que(&fp->fh_q, &fh_head);
- }
- if (!reuse_id)
- fp->fh_id = FHID_ALLOC();
- fp->fh_wchan = get_mntfs_wchan(mf);
- fp->fh_error = -1;
- fp->fh_cid = timeout(FH_TTL, discard_fh, (opaque_t) fp);
-
- /*
- * If fs->fs_ip is null, remote server is probably down.
- */
- if (!fs->fs_ip) {
- /* Mark the fileserver down and invalid again */
- fs->fs_flags &= ~FSF_VALID;
- fs->fs_flags |= FSF_DOWN;
- error = AM_ERRNO_HOST_DOWN;
- return error;
- }
-
- /*
- * Either fp has been freshly allocated or the address has changed.
- * Initialize address and nfs version. Don't try to re-use the port
- * information unless using WebNFS where the port is fixed either by
- * the spec or the "port" mount option.
- */
- if (fp->fh_sin.sin_addr.s_addr != fs->fs_ip->sin_addr.s_addr) {
- fp->fh_sin = *fs->fs_ip;
- if (!(mf->mf_flags & MFF_WEBNFS))
- fp->fh_sin.sin_port = 0;
- fp->fh_nfs_version = fs->fs_version;
- }
-
- fp->fh_fs = dup_srvr(fs);
- fp->fh_path = strdup(path);
-
- if (mf->mf_flags & MFF_WEBNFS)
- error = webnfs_lookup(fp, got_nfs_fh_webnfs, get_mntfs_wchan(mf));
- else
- error = call_mountd(fp, MOUNTPROC_MNT, got_nfs_fh_mount, get_mntfs_wchan(mf));
- if (error) {
- /*
- * Local error - cache for a short period
- * just to prevent thrashing.
- */
- untimeout(fp->fh_cid);
- fp->fh_cid = timeout(error < 0 ? 2 * ALLOWED_MOUNT_TIME : FH_TTL_ERROR,
- discard_fh, (opaque_t) fp);
- fp->fh_error = error;
- } else {
- error = fp->fh_error;
- }
-
- return error;
-}
-
-
-int
-make_nfs_auth(void)
-{
- AUTH_CREATE_GIDLIST_TYPE group_wheel = 0;
-
- /* Some NFS mounts (particularly cross-domain) require FQDNs to succeed */
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- if (gopt.flags & CFM_FULLY_QUALIFIED_HOSTS) {
- plog(XLOG_INFO, "Using NFS auth for FQHN \"%s\"", hostd);
- nfs_auth = authsys_create(hostd, 0, 0, 1, &group_wheel);
- } else {
- nfs_auth = authsys_create_default();
- }
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- if (gopt.flags & CFM_FULLY_QUALIFIED_HOSTS) {
- plog(XLOG_INFO, "Using NFS auth for FQHN \"%s\"", hostd);
- nfs_auth = authunix_create(hostd, 0, 0, 1, &group_wheel);
- } else {
- nfs_auth = authunix_create_default();
- }
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- if (!nfs_auth)
- return ENOBUFS;
-
- return 0;
-}
-
-
-static int
-call_mountd(fh_cache *fp, u_long proc, fwd_fun fun, wchan_t wchan)
-{
- struct rpc_msg mnt_msg;
- int len;
- char iobuf[UDPMSGSIZE];
- int error;
- u_long mnt_version;
-
- if (!nfs_auth) {
- error = make_nfs_auth();
- if (error)
- return error;
- }
-
- if (fp->fh_sin.sin_port == 0) {
- u_short mountd_port;
- error = get_mountd_port(fp->fh_fs, &mountd_port, wchan);
- if (error)
- return error;
- fp->fh_sin.sin_port = mountd_port;
- }
-
- /* find the right version of the mount protocol */
-#ifdef HAVE_FS_NFS3
- if (fp->fh_nfs_version == NFS_VERSION3)
- mnt_version = AM_MOUNTVERS3;
- else
-#endif /* HAVE_FS_NFS3 */
- mnt_version = MOUNTVERS;
- plog(XLOG_INFO, "call_mountd: NFS version %d, mount version %d",
- (int) fp->fh_nfs_version, (int) mnt_version);
-
- rpc_msg_init(&mnt_msg, MOUNTPROG, mnt_version, MOUNTPROC_NULL);
- len = make_rpc_packet(iobuf,
- sizeof(iobuf),
- proc,
- &mnt_msg,
- (voidp) &fp->fh_path,
- (XDRPROC_T_TYPE) xdr_nfspath,
- nfs_auth);
-
- if (len > 0) {
- error = fwd_packet(MK_RPC_XID(RPC_XID_MOUNTD, fp->fh_id),
- iobuf,
- len,
- &fp->fh_sin,
- &fp->fh_sin,
- (opaque_t) ((long) fp->fh_id), /* cast to long needed for 64-bit archs */
- fun);
- } else {
- error = -len;
- }
-
- /*
- * It may be the case that we're sending to the wrong MOUNTD port. This
- * occurs if mountd is restarted on the server after the port has been
- * looked up and stored in the filehandle cache somewhere. The correct
- * solution, if we're going to cache port numbers is to catch the ICMP
- * port unreachable reply from the server and cause the portmap request
- * to be redone. The quick solution here is to invalidate the MOUNTD
- * port.
- */
- fp->fh_sin.sin_port = 0;
-
- return error;
-}
-
-
-static int
-webnfs_lookup(fh_cache *fp, fwd_fun fun, wchan_t wchan)
-{
- struct rpc_msg wnfs_msg;
- int len;
- char iobuf[UDPMSGSIZE];
- int error;
- u_long proc;
- XDRPROC_T_TYPE xdr_fn;
- voidp argp;
- nfsdiropargs args;
-#ifdef HAVE_FS_NFS3
- am_LOOKUP3args args3;
-#endif
- char *wnfs_path;
- size_t l;
-
- if (!nfs_auth) {
- error = make_nfs_auth();
- if (error)
- return error;
- }
-
- if (fp->fh_sin.sin_port == 0) {
- /* FIXME: wrong, don't discard sin_port in the first place for WebNFS. */
- plog(XLOG_WARNING, "webnfs_lookup: port == 0 for nfs on %s, fixed",
- fp->fh_fs->fs_host);
- fp->fh_sin.sin_port = htons(NFS_PORT);
- }
-
- /*
- * Use native path like the rest of amd (cf. RFC 2054, 6.1).
- */
- l = strlen(fp->fh_path) + 2;
- wnfs_path = (char *) xmalloc(l);
- wnfs_path[0] = 0x80;
- xstrlcpy(wnfs_path + 1, fp->fh_path, l - 1);
-
- /* find the right program and lookup procedure */
-#ifdef HAVE_FS_NFS3
- if (fp->fh_nfs_version == NFS_VERSION3) {
- proc = AM_NFSPROC3_LOOKUP;
- xdr_fn = (XDRPROC_T_TYPE) xdr_am_LOOKUP3args;
- argp = &args3;
- /* WebNFS public file handle */
- args3.what.dir.am_fh3_length = 0;
- args3.what.name = wnfs_path;
- } else {
-#endif /* HAVE_FS_NFS3 */
- proc = NFSPROC_LOOKUP;
- xdr_fn = (XDRPROC_T_TYPE) xdr_diropargs;
- argp = &args;
- /* WebNFS public file handle */
- memset(&args.da_fhandle, 0, NFS_FHSIZE);
- args.da_name = wnfs_path;
-#ifdef HAVE_FS_NFS3
- }
-#endif /* HAVE_FS_NFS3 */
-
- plog(XLOG_INFO, "webnfs_lookup: NFS version %d", (int) fp->fh_nfs_version);
-
- rpc_msg_init(&wnfs_msg, NFS_PROGRAM, fp->fh_nfs_version, proc);
- len = make_rpc_packet(iobuf,
- sizeof(iobuf),
- proc,
- &wnfs_msg,
- argp,
- (XDRPROC_T_TYPE) xdr_fn,
- nfs_auth);
-
- if (len > 0) {
- error = fwd_packet(MK_RPC_XID(RPC_XID_WEBNFS, fp->fh_id),
- iobuf,
- len,
- &fp->fh_sin,
- &fp->fh_sin,
- (opaque_t) ((long) fp->fh_id), /* cast to long needed for 64-bit archs */
- fun);
- } else {
- error = -len;
- }
-
- XFREE(wnfs_path);
- return error;
-}
-
-
-/*
- * NFS needs the local filesystem, remote filesystem
- * remote hostname.
- * Local filesystem defaults to remote and vice-versa.
- */
-static char *
-nfs_match(am_opts *fo)
-{
- char *xmtab;
- size_t l;
-
- if (fo->opt_fs && !fo->opt_rfs)
- fo->opt_rfs = fo->opt_fs;
- if (!fo->opt_rfs) {
- plog(XLOG_USER, "nfs: no remote filesystem specified");
- return NULL;
- }
- if (!fo->opt_rhost) {
- plog(XLOG_USER, "nfs: no remote host specified");
- return NULL;
- }
-
- /*
- * Determine magic cookie to put in mtab
- */
- l = strlen(fo->opt_rhost) + strlen(fo->opt_rfs) + 2;
- xmtab = (char *) xmalloc(l);
- xsnprintf(xmtab, l, "%s:%s", fo->opt_rhost, fo->opt_rfs);
- dlog("NFS: mounting remote server \"%s\", remote fs \"%s\" on \"%s\"",
- fo->opt_rhost, fo->opt_rfs, fo->opt_fs);
-
- return xmtab;
-}
-
-
-/*
- * Initialize am structure for nfs
- */
-static int
-nfs_init(mntfs *mf)
-{
- int error;
- am_nfs_handle_t fhs;
- char *colon;
-
- if (mf->mf_private) {
- if (mf->mf_flags & MFF_NFS_SCALEDOWN) {
- fserver *fs;
-
- /* tell remote mountd that we're done with this filehandle */
- mf->mf_ops->umounted(mf);
-
- mf->mf_prfree(mf->mf_private);
- fs = mf->mf_ops->ffserver(mf);
- free_srvr(mf->mf_server);
- mf->mf_server = fs;
- } else
- return 0;
- }
-
- colon = strchr(mf->mf_info, ':');
- if (colon == 0)
- return ENOENT;
-
- error = prime_nfs_fhandle_cache(colon + 1, mf->mf_server, &fhs, mf);
- if (!error) {
- mf->mf_private = (opaque_t) ALLOC(am_nfs_handle_t);
- mf->mf_prfree = (void (*)(opaque_t)) free;
- memmove(mf->mf_private, (voidp) &fhs, sizeof(fhs));
- }
- return error;
-}
-
-
-int
-mount_nfs_fh(am_nfs_handle_t *fhp, char *mntdir, char *fs_name, mntfs *mf)
-{
- MTYPE_TYPE type;
- char *colon;
- char *xopts=NULL, transp_timeo_opts[40], transp_retrans_opts[40];
- char host[MAXHOSTNAMELEN + MAXPATHLEN + 2];
- fserver *fs = mf->mf_server;
- u_long nfs_version = fs->fs_version;
- char *nfs_proto = fs->fs_proto; /* "tcp" or "udp" */
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
- int genflags;
- int retry;
- int proto = AMU_TYPE_NONE;
- mntent_t mnt;
- nfs_args_t nfs_args;
-
- /*
- * Extract HOST name to give to kernel.
- * Some systems like osf1/aix3/bsd44 variants may need old code
- * for NFS_ARGS_NEEDS_PATH.
- */
- if (!(colon = strchr(fs_name, ':')))
- return ENOENT;
-#ifdef MOUNT_TABLE_ON_FILE
- *colon = '\0';
-#endif /* MOUNT_TABLE_ON_FILE */
- xstrlcpy(host, fs_name, sizeof(host));
-#ifdef MOUNT_TABLE_ON_FILE
- *colon = ':';
-#endif /* MOUNT_TABLE_ON_FILE */
-#ifdef MAXHOSTNAMELEN
- /* most kernels have a name length restriction */
- if (strlen(host) >= MAXHOSTNAMELEN)
- xstrlcpy(host + MAXHOSTNAMELEN - 3, "..",
- sizeof(host) - MAXHOSTNAMELEN + 3);
-#endif /* MAXHOSTNAMELEN */
-
- /*
- * Create option=VAL for udp/tcp specific timeouts and retrans values, but
- * only if these options were specified.
- */
-
- transp_timeo_opts[0] = transp_retrans_opts[0] = '\0'; /* initialize */
- if (STREQ(nfs_proto, "udp"))
- proto = AMU_TYPE_UDP;
- else if (STREQ(nfs_proto, "tcp"))
- proto = AMU_TYPE_TCP;
- if (proto != AMU_TYPE_NONE) {
- if (gopt.amfs_auto_timeo[proto] > 0)
- xsnprintf(transp_timeo_opts, sizeof(transp_timeo_opts), "%s=%d,",
- MNTTAB_OPT_TIMEO, gopt.amfs_auto_timeo[proto]);
- if (gopt.amfs_auto_retrans[proto] > 0)
- xsnprintf(transp_retrans_opts, sizeof(transp_retrans_opts), "%s=%d,",
- MNTTAB_OPT_RETRANS, gopt.amfs_auto_retrans[proto]);
- }
-
- if (mf->mf_remopts && *mf->mf_remopts &&
- !islocalnet(fs->fs_ip->sin_addr.s_addr)) {
- plog(XLOG_INFO, "Using remopts=\"%s\"", mf->mf_remopts);
- /* use transp_opts first, so map-specific opts will override */
- xopts = str3cat(xopts, transp_timeo_opts, transp_retrans_opts, mf->mf_remopts);
- } else {
- /* use transp_opts first, so map-specific opts will override */
- xopts = str3cat(xopts, transp_timeo_opts, transp_retrans_opts, mf->mf_mopts);
- }
-
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_opts = xopts;
-
- /*
- * Set mount types accordingly
- */
-#ifndef HAVE_FS_NFS3
- type = MOUNT_TYPE_NFS;
- mnt.mnt_type = MNTTAB_TYPE_NFS;
-#else /* HAVE_FS_NFS3 */
- if (nfs_version == NFS_VERSION3) {
- type = MOUNT_TYPE_NFS3;
- /*
- * Systems that include the mount table "vers" option generally do not
- * set the mnttab entry to "nfs3", but to "nfs" and then they set
- * "vers=3". Setting it to "nfs3" works, but it may break some things
- * like "df -t nfs" and the "quota" program (esp. on Solaris and Irix).
- * So on those systems, set it to "nfs".
- * Note: MNTTAB_OPT_VERS is always set for NFS3 (see am_compat.h).
- */
-# if defined(MNTTAB_OPT_VERS) && defined(MOUNT_TABLE_ON_FILE)
- mnt.mnt_type = MNTTAB_TYPE_NFS;
-# else /* defined(MNTTAB_OPT_VERS) && defined(MOUNT_TABLE_ON_FILE) */
- mnt.mnt_type = MNTTAB_TYPE_NFS3;
-# endif /* defined(MNTTAB_OPT_VERS) && defined(MOUNT_TABLE_ON_FILE) */
- } else {
- type = MOUNT_TYPE_NFS;
- mnt.mnt_type = MNTTAB_TYPE_NFS;
- }
-#endif /* HAVE_FS_NFS3 */
- plog(XLOG_INFO, "mount_nfs_fh: NFS version %d", (int) nfs_version);
- plog(XLOG_INFO, "mount_nfs_fh: using NFS transport %s", nfs_proto);
-
- retry = hasmntval(&mnt, MNTTAB_OPT_RETRY);
- if (retry <= 0)
- retry = 1; /* XXX */
-
- genflags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- genflags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
- /* setup the many fields and flags within nfs_args */
- compute_nfs_args(&nfs_args,
- &mnt,
- genflags,
- NULL, /* struct netconfig *nfsncp */
- fs->fs_ip,
- nfs_version,
- nfs_proto,
- fhp,
- host,
- fs_name);
-
- /* finally call the mounting function */
- if (amuDebug(D_TRACE)) {
- print_nfs_args(&nfs_args, nfs_version);
- plog(XLOG_DEBUG, "Generic mount flags 0x%x used for NFS mount", genflags);
- }
- error = mount_fs(&mnt, genflags, (caddr_t) &nfs_args, retry, type,
- nfs_version, nfs_proto, mnttab_file_name, on_autofs);
- XFREE(xopts);
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- free_knetconfig(nfs_args.knconf);
- if (nfs_args.addr)
- XFREE(nfs_args.addr); /* allocated in compute_nfs_args() */
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
- return error;
-}
-
-
-static int
-nfs_mount(am_node *am, mntfs *mf)
-{
- int error = 0;
- mntent_t mnt;
-
- if (!mf->mf_private) {
- plog(XLOG_ERROR, "Missing filehandle for %s", mf->mf_info);
- return EINVAL;
- }
-
- mnt.mnt_opts = mf->mf_mopts;
- if (amu_hasmntopt(&mnt, "softlookup") ||
- (amu_hasmntopt(&mnt, "soft") && !amu_hasmntopt(&mnt, "nosoftlookup")))
- am->am_flags |= AMF_SOFTLOOKUP;
-
- error = mount_nfs_fh((am_nfs_handle_t *) mf->mf_private,
- mf->mf_mount,
- mf->mf_info,
- mf);
-
- if (error) {
- errno = error;
- dlog("mount_nfs: %m");
- }
-
- return error;
-}
-
-
-static int
-nfs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags, new_unmount_flags, error;
-
- unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
- error = UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-
-#if defined(HAVE_UMOUNT2) && (defined(MNT2_GEN_OPT_FORCE) || defined(MNT2_GEN_OPT_DETACH))
- /*
- * If the attempt to unmount failed with EBUSY, and this fserver was
- * marked for forced unmounts, then use forced/lazy unmounts.
- */
- if (error == EBUSY &&
- gopt.flags & CFM_FORCED_UNMOUNTS &&
- mf->mf_server->fs_flags & FSF_FORCE_UNMOUNT) {
- plog(XLOG_INFO, "EZK: nfs_umount: trying forced/lazy unmounts");
- /*
- * XXX: turning off the FSF_FORCE_UNMOUNT may not be perfectly
- * incorrect. Multiple nodes may need to be timed out and restarted for
- * a single hung fserver.
- */
- mf->mf_server->fs_flags &= ~FSF_FORCE_UNMOUNT;
- new_unmount_flags = unmount_flags | AMU_UMOUNT_FORCE | AMU_UMOUNT_DETACH;
- error = UMOUNT_FS(mf->mf_mount, mnttab_file_name, new_unmount_flags);
- }
-#endif /* HAVE_UMOUNT2 && (MNT2_GEN_OPT_FORCE || MNT2_GEN_OPT_DETACH) */
-
- /*
- * Here is some code to unmount 'restarted' file systems.
- * The restarted file systems are marked as 'nfs', not
- * 'host', so we only have the map information for the
- * the top-level mount. The unmount will fail (EBUSY)
- * if there are anything else from the NFS server mounted
- * below the mount-point. This code checks to see if there
- * is anything mounted with the same prefix as the
- * file system to be unmounted ("/a/b/c" when unmounting "/a/b").
- * If there is, and it is a 'restarted' file system, we unmount
- * it.
- * Added by Mike Mitchell, mcm@unx.sas.com, 09/08/93
- */
- if (error == EBUSY) {
- mntfs *new_mf;
- int len = strlen(mf->mf_mount);
- int didsome = 0;
-
- ITER(new_mf, mntfs, &mfhead) {
- if (new_mf->mf_ops != mf->mf_ops ||
- new_mf->mf_refc > 1 ||
- mf == new_mf ||
- ((new_mf->mf_flags & (MFF_MOUNTED | MFF_UNMOUNTING | MFF_RESTART)) == (MFF_MOUNTED | MFF_RESTART)))
- continue;
-
- if (NSTREQ(mf->mf_mount, new_mf->mf_mount, len) &&
- new_mf->mf_mount[len] == '/') {
- new_unmount_flags =
- (new_mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
- UMOUNT_FS(new_mf->mf_mount, mnttab_file_name, new_unmount_flags);
- didsome = 1;
- }
- }
- if (didsome)
- error = UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
- }
- if (error)
- return error;
-
- return 0;
-}
-
-
-static void
-nfs_umounted(mntfs *mf)
-{
- fserver *fs;
- char *colon, *path;
-
- if (mf->mf_error || mf->mf_refc > 1)
- return;
-
- /*
- * No need to inform mountd when WebNFS is in use.
- */
- if (mf->mf_flags & MFF_WEBNFS)
- return;
-
- /*
- * Call the mount daemon on the server to announce that we are not using
- * the fs any more.
- *
- * XXX: This is *wrong*. The mountd should be called when the fhandle is
- * flushed from the cache, and a reference held to the cached entry while
- * the fs is mounted...
- */
- fs = mf->mf_server;
- colon = path = strchr(mf->mf_info, ':');
- if (fs && colon) {
- fh_cache f;
-
- dlog("calling mountd for %s", mf->mf_info);
- *path++ = '\0';
- f.fh_path = path;
- f.fh_sin = *fs->fs_ip;
- f.fh_sin.sin_port = (u_short) 0;
- f.fh_nfs_version = fs->fs_version;
- f.fh_fs = fs;
- f.fh_id = 0;
- f.fh_error = 0;
- prime_nfs_fhandle_cache(colon + 1, mf->mf_server, (am_nfs_handle_t *) 0, mf);
- call_mountd(&f, MOUNTPROC_UMNT, (fwd_fun *) 0, (wchan_t) 0);
- *colon = ':';
- }
-}
diff --git a/contrib/amd/amd/ops_nfs3.c b/contrib/amd/amd/ops_nfs3.c
deleted file mode 100644
index db3c7f9d265d..000000000000
--- a/contrib/amd/amd/ops_nfs3.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_nfs3.c
- *
- */
-
-/*
- * Network file system version 3.0
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_nullfs.c b/contrib/amd/amd/ops_nullfs.c
deleted file mode 100644
index cf621ec33ff5..000000000000
--- a/contrib/amd/amd/ops_nullfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_nullfs.c
- *
- */
-
-/*
- * The null filesystem in BSD-4.4 is similar to the loopback one.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_pcfs.c b/contrib/amd/amd/ops_pcfs.c
deleted file mode 100644
index 527dc926ca77..000000000000
--- a/contrib/amd/amd/ops_pcfs.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_pcfs.c
- *
- */
-
-/*
- * PC (MS-DOS) file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward definitions */
-static char *pcfs_match(am_opts *fo);
-static int pcfs_mount(am_node *am, mntfs *mf);
-static int pcfs_umount(am_node *am, mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops pcfs_ops =
-{
- "pcfs",
- pcfs_match,
- 0, /* pcfs_init */
- pcfs_mount,
- pcfs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* pcfs_readlink */
- 0, /* pcfs_mounted */
- 0, /* pcfs_umounted */
- amfs_generic_find_srvr,
- 0, /* pcfs_get_wchan */
- FS_MKMNT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_PCFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-
-/*
- * PCFS needs remote filesystem.
- */
-static char *
-pcfs_match(am_opts *fo)
-{
- if (!fo->opt_dev) {
- plog(XLOG_USER, "pcfs: no source device specified");
- return 0;
- }
- dlog("PCFS: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs);
-
- /*
- * Determine magic cookie to put in mtab
- */
- return strdup(fo->opt_dev);
-}
-
-
-static int
-mount_pcfs(char *mntdir, char *fs_name, char *opts, int on_autofs)
-{
- pcfs_args_t pcfs_args;
- mntent_t mnt;
- int flags;
-#if defined(HAVE_PCFS_ARGS_T_MASK) || defined(HAVE_PCFS_ARGS_T_DIRMASK)
- int mask;
-#endif /* defined(HAVE_PCFS_ARGS_T_MASK) || defined(HAVE_PCFS_ARGS_T_DIRMASK) */
-#if defined(HAVE_PCFS_ARGS_T_UID) || defined(HAVE_PCFS_ARGS_T_UID)
- char *str;
-#endif /* defined(HAVE_PCFS_ARGS_T_UID) || defined(HAVE_PCFS_ARGS_T_UID) */
-
- /*
- * Figure out the name of the file system type.
- */
- MTYPE_TYPE type = MOUNT_TYPE_PCFS;
-
- memset((voidp) &pcfs_args, 0, sizeof(pcfs_args)); /* Paranoid */
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MNTTAB_TYPE_PCFS;
- mnt.mnt_opts = opts;
-
- flags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- flags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "mount_pcfs: flags=0x%x", (u_int) flags);
-
-#ifdef HAVE_PCFS_ARGS_T_FSPEC
- pcfs_args.fspec = fs_name;
-#endif /* HAVE_PCFS_ARGS_T_FSPEC */
-
-#ifdef HAVE_PCFS_ARGS_T_MASK
- pcfs_args.mask = 0777; /* this may be the msdos file modes */
- if ((mask = hasmntval(&mnt, MNTTAB_OPT_MASK)) > 0)
- pcfs_args.mask = mask;
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "mount_pcfs: mask=%o (octal)", (u_int) pcfs_args.mask);
-#endif /* HAVE_PCFS_ARGS_T_MASK */
-
-#ifdef HAVE_PCFS_ARGS_T_DIRMASK
- pcfs_args.dirmask = 0777; /* this may be the msdos dir modes */
- if ((mask = hasmntval(&mnt, MNTTAB_OPT_DIRMASK)) > 0)
- pcfs_args.dirmask = mask;
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "mount_pcfs: dirmask=%o (octal)", (u_int) pcfs_args.dirmask);
-#endif /* HAVE_PCFS_ARGS_T_DIRMASK */
-
-#ifdef HAVE_PCFS_ARGS_T_UID
- pcfs_args.uid = 0; /* default to root */
- if ((str = hasmntstr(&mnt, MNTTAB_OPT_USER)) != NULL) {
- struct passwd *pw;
- if ((pw = getpwnam(str)) != NULL)
- pcfs_args.uid = pw->pw_uid;
- else /* maybe used passed a UID number, not user name */
- pcfs_args.uid = atoi(str); /* atoi returns '0' if it failed */
- XFREE(str);
- }
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "mount_pcfs: uid=%d", (int) pcfs_args.uid);
-#endif /* HAVE_PCFS_ARGS_T_UID */
-
-#ifdef HAVE_PCFS_ARGS_T_GID
- pcfs_args.gid = 0; /* default to wheel/root group */
- if ((str = hasmntstr(&mnt, MNTTAB_OPT_GROUP)) != NULL) {
- struct group *gr;
- if ((gr = getgrnam(str)) != NULL)
- pcfs_args.gid = gr->gr_gid;
- else /* maybe used passed a GID number, not group name */
- pcfs_args.gid = atoi(str); /* atoi returns '0' if it failed */
- XFREE(str);
- }
- if (amuDebug(D_TRACE))
- plog(XLOG_DEBUG, "mount_pcfs: gid=%d", (int) pcfs_args.gid);
-#endif /* HAVE_PCFS_ARGS_T_GID */
-
-#ifdef HAVE_PCFS_ARGS_T_SECONDSWEST
- pcfs_args.secondswest = 0; /* XXX: fill in correct values */
-#endif /* HAVE_PCFS_ARGS_T_SECONDSWEST */
-#ifdef HAVE_PCFS_ARGS_T_DSTTIME
- pcfs_args.dsttime = 0; /* XXX: fill in correct values */
-#endif /* HAVE_PCFS_ARGS_T_DSTTIME */
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, flags, (caddr_t) & pcfs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-}
-
-
-static int
-pcfs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_pcfs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_pcfs: %m");
- return error;
- }
-
- return 0;
-}
-
-
-static int
-pcfs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
-
- return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-}
diff --git a/contrib/amd/amd/ops_tfs.c b/contrib/amd/amd/ops_tfs.c
deleted file mode 100644
index 142c32022937..000000000000
--- a/contrib/amd/amd/ops_tfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_tfs.c
- *
- */
-
-/*
- * Translucent file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_tmpfs.c b/contrib/amd/amd/ops_tmpfs.c
deleted file mode 100644
index eddd75569e9e..000000000000
--- a/contrib/amd/amd/ops_tmpfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_tmpfs.c
- *
- */
-
-/*
- * TMPFS file system (combines RAM-fs and swap-fs)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_ufs.c b/contrib/amd/amd/ops_ufs.c
deleted file mode 100644
index fd82a5cd2228..000000000000
--- a/contrib/amd/amd/ops_ufs.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_ufs.c
- *
- */
-
-/*
- * UN*X file system
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static char *ufs_match(am_opts *fo);
-static int ufs_mount(am_node *am, mntfs *mf);
-static int ufs_umount(am_node *am, mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops ufs_ops =
-{
- "ufs",
- ufs_match,
- 0, /* ufs_init */
- ufs_mount,
- ufs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* ufs_readlink */
- 0, /* ufs_mounted */
- 0, /* ufs_umounted */
- amfs_generic_find_srvr,
- 0, /* ufs_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_UFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * UFS needs local filesystem and device.
- */
-static char *
-ufs_match(am_opts *fo)
-{
-
- if (!fo->opt_dev) {
- plog(XLOG_USER, "ufs: no device specified");
- return 0;
- }
-
- dlog("UFS: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs);
-
- /*
- * Determine magic cookie to put in mtab
- */
- return strdup(fo->opt_dev);
-}
-
-
-static int
-mount_ufs(char *mntdir, char *fs_name, char *opts, int on_autofs)
-{
- ufs_args_t ufs_args;
- mntent_t mnt;
- int genflags;
-
- /*
- * Figure out the name of the file system type.
- */
- MTYPE_TYPE type = MOUNT_TYPE_UFS;
-
- memset((voidp) &ufs_args, 0, sizeof(ufs_args)); /* Paranoid */
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MNTTAB_TYPE_UFS;
- mnt.mnt_opts = opts;
-
- genflags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- genflags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
-#ifdef HAVE_UFS_ARGS_T_FLAGS
- ufs_args.flags = genflags; /* XXX: is this correct? */
-#endif /* HAVE_UFS_ARGS_T_FLAGS */
-
-#ifdef HAVE_UFS_ARGS_T_UFS_FLAGS
- ufs_args.ufs_flags = genflags;
-#endif /* HAVE_UFS_ARGS_T_UFS_FLAGS */
-
-#ifdef HAVE_UFS_ARGS_T_FSPEC
- ufs_args.fspec = fs_name;
-#endif /* HAVE_UFS_ARGS_T_FSPEC */
-
-#ifdef HAVE_UFS_ARGS_T_UFS_PGTHRESH
- ufs_args.ufs_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH);
-#endif /* HAVE_UFS_ARGS_T_UFS_PGTHRESH */
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, genflags, (caddr_t) &ufs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-}
-
-
-static int
-ufs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_ufs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_ufs: %m");
- return error;
- }
-
- return 0;
-}
-
-
-static int
-ufs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
-
- return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-}
diff --git a/contrib/amd/amd/ops_umapfs.c b/contrib/amd/amd/ops_umapfs.c
deleted file mode 100644
index 5ba735e39c61..000000000000
--- a/contrib/amd/amd/ops_umapfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_umapfs.c
- *
- */
-
-/*
- * uid/gid mapping filesystem.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_unionfs.c b/contrib/amd/amd/ops_unionfs.c
deleted file mode 100644
index 73f8d6676203..000000000000
--- a/contrib/amd/amd/ops_unionfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_unionfs.c
- *
- */
-
-/*
- * Union filesystem (ala BSD-4.4)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* FEEL FREE TO IMPLEMENT THIS... :-) */
diff --git a/contrib/amd/amd/ops_xfs.c b/contrib/amd/amd/ops_xfs.c
deleted file mode 100644
index e0e740bc0a0e..000000000000
--- a/contrib/amd/amd/ops_xfs.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/ops_xfs.c
- *
- */
-
-/*
- * Irix UN*X file system: XFS (Extended File System)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* forward declarations */
-static char *xfs_match(am_opts *fo);
-static int xfs_mount(am_node *am, mntfs *mf);
-static int xfs_umount(am_node *am, mntfs *mf);
-
-/*
- * Ops structure
- */
-am_ops xfs_ops =
-{
- "xfs",
- xfs_match,
- 0, /* xfs_init */
- xfs_mount,
- xfs_umount,
- amfs_error_lookup_child,
- amfs_error_mount_child,
- amfs_error_readdir,
- 0, /* xfs_readlink */
- 0, /* xfs_mounted */
- 0, /* xfs_umounted */
- amfs_generic_find_srvr,
- 0, /* xfs_get_wchan */
- FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
-#ifdef HAVE_FS_AUTOFS
- AUTOFS_XFS_FS_FLAGS,
-#endif /* HAVE_FS_AUTOFS */
-};
-
-
-/*
- * XFS needs local filesystem and device.
- */
-static char *
-xfs_match(am_opts *fo)
-{
-
- if (!fo->opt_dev) {
- plog(XLOG_USER, "xfs: no device specified");
- return 0;
- }
-
- dlog("XFS: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs);
-
- /*
- * Determine magic cookie to put in mtab
- */
- return strdup(fo->opt_dev);
-}
-
-
-static int
-mount_xfs(char *mntdir, char *fs_name, char *opts, int on_autofs)
-{
- xfs_args_t xfs_args;
- mntent_t mnt;
- int flags;
-
- /*
- * Figure out the name of the file system type.
- */
- MTYPE_TYPE type = MOUNT_TYPE_XFS;
-
- memset((voidp) &xfs_args, 0, sizeof(xfs_args)); /* Paranoid */
-
- /*
- * Fill in the mount structure
- */
- memset((voidp) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = mntdir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MNTTAB_TYPE_XFS;
- mnt.mnt_opts = opts;
-
- flags = compute_mount_flags(&mnt);
-#ifdef HAVE_FS_AUTOFS
- if (on_autofs)
- flags |= autofs_compute_mount_flags(&mnt);
-#endif /* HAVE_FS_AUTOFS */
-
-#ifdef HAVE_XFS_ARGS_T_FLAGS
- xfs_args.flags = 0; /* XXX: fix this to correct flags */
-#endif /* HAVE_XFS_ARGS_T_FLAGS */
-#ifdef HAVE_XFS_ARGS_T_FSPEC
- xfs_args.fspec = fs_name;
-#endif /* HAVE_XFS_ARGS_T_FSPEC */
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, flags, (caddr_t) &xfs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
-}
-
-
-static int
-xfs_mount(am_node *am, mntfs *mf)
-{
- int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
- int error;
-
- error = mount_xfs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_xfs: %m");
- return error;
- }
-
- return 0;
-}
-
-
-static int
-xfs_umount(am_node *am, mntfs *mf)
-{
- int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
-
- return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
-}
diff --git a/contrib/amd/amd/opts.c b/contrib/amd/amd/opts.c
deleted file mode 100644
index a3d35343adc0..000000000000
--- a/contrib/amd/amd/opts.c
+++ /dev/null
@@ -1,1519 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/opts.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * MACROS:
- */
-#define NLEN 16 /* Length of longest option name (conservative) */
-#define S(x) (x) , (sizeof(x)-1)
-/*
- * The BUFSPACE macros checks that there is enough space
- * left in the expansion buffer. If there isn't then we
- * give up completely. This is done to avoid crashing the
- * automounter itself (which would be a bad thing to do).
- */
-#define BUFSPACE(ep, len) (((ep) + (len)) < expbuf+MAXPATHLEN)
-
-/*
- * TYPEDEFS:
- */
-typedef int (*IntFuncPtr) (char *);
-typedef struct opt_apply opt_apply;
-enum vs_opt { SelEQ, SelNE, VarAss };
-
-/*
- * STRUCTURES
- */
-struct opt {
- char *name; /* Name of the option */
- int nlen; /* Length of option name */
- char **optp; /* Pointer to option value string */
- char **sel_p; /* Pointer to selector value string */
- int (*fxn_p)(char *); /* Pointer to boolean function */
- int case_insensitive; /* How to do selector comparisons */
-};
-
-struct opt_apply {
- char **opt;
- char *val;
-};
-
-struct functable {
- char *name;
- IntFuncPtr func;
-};
-
-/*
- * FORWARD DEFINITION:
- */
-static int f_in_network(char *);
-static int f_xhost(char *);
-static int f_netgrp(char *);
-static int f_netgrpd(char *);
-static int f_exists(char *);
-static int f_false(char *);
-static int f_true(char *);
-static inline char *expand_options(char *key);
-
-/*
- * STATICS:
- */
-static char NullStr[] = "<NULL>";
-static char nullstr[] = "";
-static char *opt_dkey = NullStr;
-static char *opt_host = nullstr; /* XXX: was the global hostname */
-static char *opt_hostd = hostd;
-static char *opt_key = nullstr;
-static char *opt_keyd = nullstr;
-static char *opt_map = nullstr;
-static char *opt_path = nullstr;
-char uid_str[SIZEOF_UID_STR], gid_str[SIZEOF_GID_STR];
-char *opt_uid = uid_str;
-char *opt_gid = gid_str;
-static char *vars[8];
-static char *literal_dollar = "$"; /* ${dollar}: a literal '$' in maps */
-
-/*
- * GLOBALS
- */
-static struct am_opts fs_static; /* copy of the options to play with */
-
-
-/*
- * Options in some order corresponding to frequency of use so that
- * first-match algorithm is sped up.
- */
-static struct opt opt_fields[] = {
- /* Name and length.
- Option str. Selector str. boolean fxn. case sensitive */
- { S("opts"),
- &fs_static.opt_opts, 0, 0, FALSE },
- { S("host"),
- 0, &opt_host, 0, TRUE },
- { S("hostd"),
- 0, &opt_hostd, 0, TRUE },
- { S("type"),
- &fs_static.opt_type, 0, 0, FALSE },
- { S("rhost"),
- &fs_static.opt_rhost, 0, 0, TRUE },
- { S("rfs"),
- &fs_static.opt_rfs, 0, 0, FALSE },
- { S("fs"),
- &fs_static.opt_fs, 0, 0, FALSE },
- { S("key"),
- 0, &opt_key, 0, FALSE },
- { S("map"),
- 0, &opt_map, 0, FALSE },
- { S("sublink"),
- &fs_static.opt_sublink, 0, 0, FALSE },
- { S("arch"),
- 0, &gopt.arch, 0, TRUE },
- { S("dev"),
- &fs_static.opt_dev, 0, 0, FALSE },
- { S("pref"),
- &fs_static.opt_pref, 0, 0, FALSE },
- { S("path"),
- 0, &opt_path, 0, FALSE },
- { S("autodir"),
- 0, &gopt.auto_dir, 0, FALSE },
- { S("delay"),
- &fs_static.opt_delay, 0, 0, FALSE },
- { S("domain"),
- 0, &hostdomain, 0, TRUE },
- { S("karch"),
- 0, &gopt.karch, 0, TRUE },
- { S("cluster"),
- 0, &gopt.cluster, 0, TRUE },
- { S("wire"),
- 0, 0, f_in_network, TRUE },
- { S("network"),
- 0, 0, f_in_network, TRUE },
- { S("netnumber"),
- 0, 0, f_in_network, TRUE },
- { S("byte"),
- 0, &endian, 0, TRUE },
- { S("os"),
- 0, &gopt.op_sys, 0, TRUE },
- { S("osver"),
- 0, &gopt.op_sys_ver, 0, TRUE },
- { S("full_os"),
- 0, &gopt.op_sys_full, 0, TRUE },
- { S("vendor"),
- 0, &gopt.op_sys_vendor, 0, TRUE },
- { S("remopts"),
- &fs_static.opt_remopts, 0, 0, FALSE },
- { S("mount"),
- &fs_static.opt_mount, 0, 0, FALSE },
- { S("unmount"),
- &fs_static.opt_unmount, 0, 0, FALSE },
- { S("umount"),
- &fs_static.opt_umount, 0, 0, FALSE },
- { S("cache"),
- &fs_static.opt_cache, 0, 0, FALSE },
- { S("user"),
- &fs_static.opt_user, 0, 0, FALSE },
- { S("group"),
- &fs_static.opt_group, 0, 0, FALSE },
- { S(".key"),
- 0, &opt_dkey, 0, FALSE },
- { S("key."),
- 0, &opt_keyd, 0, FALSE },
- { S("maptype"),
- &fs_static.opt_maptype, 0, 0, FALSE },
- { S("cachedir"),
- &fs_static.opt_cachedir, 0, 0, FALSE },
- { S("addopts"),
- &fs_static.opt_addopts, 0, 0, FALSE },
- { S("uid"),
- 0, &opt_uid, 0, FALSE },
- { S("gid"),
- 0, &opt_gid, 0, FALSE },
- { S("mount_type"),
- &fs_static.opt_mount_type, 0, 0, FALSE },
- { S("dollar"),
- &literal_dollar, 0, 0, FALSE },
- { S("var0"),
- &vars[0], 0, 0, FALSE },
- { S("var1"),
- &vars[1], 0, 0, FALSE },
- { S("var2"),
- &vars[2], 0, 0, FALSE },
- { S("var3"),
- &vars[3], 0, 0, FALSE },
- { S("var4"),
- &vars[4], 0, 0, FALSE },
- { S("var5"),
- &vars[5], 0, 0, FALSE },
- { S("var6"),
- &vars[6], 0, 0, FALSE },
- { S("var7"),
- &vars[7], 0, 0, FALSE },
- { 0, 0, 0, 0, 0, FALSE },
-};
-
-static struct functable functable[] = {
- { "in_network", f_in_network },
- { "xhost", f_xhost },
- { "netgrp", f_netgrp },
- { "netgrpd", f_netgrpd },
- { "exists", f_exists },
- { "false", f_false },
- { "true", f_true },
- { 0, 0 },
-};
-
-/*
- * Specially expand the remote host name first
- */
-static opt_apply rhost_expansion[] =
-{
- {&fs_static.opt_rhost, "${host}"},
- {0, 0},
-};
-
-/*
- * List of options which need to be expanded
- * Note that the order here _may_ be important.
- */
-static opt_apply expansions[] =
-{
- {&fs_static.opt_sublink, 0},
- {&fs_static.opt_rfs, "${path}"},
- {&fs_static.opt_fs, "${autodir}/${rhost}${rfs}"},
- {&fs_static.opt_opts, "rw"},
- {&fs_static.opt_remopts, "${opts}"},
- {&fs_static.opt_mount, 0},
- {&fs_static.opt_unmount, 0},
- {&fs_static.opt_umount, 0},
- {&fs_static.opt_cachedir, 0},
- {&fs_static.opt_addopts, 0},
- {0, 0},
-};
-
-/*
- * List of options which need to be free'ed before re-use
- */
-static opt_apply to_free[] =
-{
- {&fs_static.fs_glob, 0},
- {&fs_static.fs_local, 0},
- {&fs_static.fs_mtab, 0},
- {&fs_static.opt_sublink, 0},
- {&fs_static.opt_rfs, 0},
- {&fs_static.opt_fs, 0},
- {&fs_static.opt_rhost, 0},
- {&fs_static.opt_opts, 0},
- {&fs_static.opt_remopts, 0},
- {&fs_static.opt_mount, 0},
- {&fs_static.opt_unmount, 0},
- {&fs_static.opt_umount, 0},
- {&fs_static.opt_cachedir, 0},
- {&fs_static.opt_addopts, 0},
- {&vars[0], 0},
- {&vars[1], 0},
- {&vars[2], 0},
- {&vars[3], 0},
- {&vars[4], 0},
- {&vars[5], 0},
- {&vars[6], 0},
- {&vars[7], 0},
- {0, 0},
-};
-
-
-/*
- * expand backslash escape sequences
- * (escaped slash is handled separately in normalize_slash)
- */
-static char
-backslash(char **p)
-{
- char c;
-
- if ((*p)[1] == '\0') {
- plog(XLOG_USER, "Empty backslash escape");
- return **p;
- }
-
- if (**p == '\\') {
- (*p)++;
- switch (**p) {
- case 'g':
- c = '\007'; /* Bell */
- break;
- case 'b':
- c = '\010'; /* Backspace */
- break;
- case 't':
- c = '\011'; /* Horizontal Tab */
- break;
- case 'n':
- c = '\012'; /* New Line */
- break;
- case 'v':
- c = '\013'; /* Vertical Tab */
- break;
- case 'f':
- c = '\014'; /* Form Feed */
- break;
- case 'r':
- c = '\015'; /* Carriage Return */
- break;
- case 'e':
- c = '\033'; /* Escape */
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- int cnt, val, ch;
-
- for (cnt = 0, val = 0; cnt < 3; cnt++) {
- ch = *(*p)++;
- if (ch < '0' || ch > '7') {
- (*p)--;
- break;
- }
- val = (val << 3) | (ch - '0');
- }
-
- if ((val & 0xffffff00) != 0)
- plog(XLOG_USER,
- "Too large character constant %u\n",
- val);
- c = (char) val;
- --(*p);
- }
- break;
-
- default:
- c = **p;
- break;
- }
- } else
- c = **p;
-
- return c;
-}
-
-
-/*
- * Skip to next option in the string
- */
-static char *
-opt(char **p)
-{
- char *cp = *p;
- char *dp = cp;
- char *s = cp;
-
-top:
- while (*cp && *cp != ';') {
- if (*cp == '"') {
- /*
- * Skip past string
- */
- for (cp++; *cp && *cp != '"'; cp++)
- if (*cp == '\\')
- *dp++ = backslash(&cp);
- else
- *dp++ = *cp;
- if (*cp)
- cp++;
- } else {
- *dp++ = *cp++;
- }
- }
-
- /*
- * Skip past any remaining ';'s
- */
- while (*cp == ';')
- cp++;
-
- /*
- * If we have a zero length string
- * and there are more fields, then
- * parse the next one. This allows
- * sequences of empty fields.
- */
- if (*cp && dp == s)
- goto top;
-
- *dp = '\0';
-
- *p = cp;
- return s;
-}
-
-
-/*
- * These routines add a new style of selector; function-style boolean
- * operators. To add new ones, just define functions as in true, false,
- * exists (below) and add them to the functable, above.
- *
- * Usage example: Some people have X11R5 local, some go to a server. I do
- * this:
- *
- * * exists(/usr/pkg/${key});type:=link;fs:=/usr/pkg/${key} || \
- * -type:=nfs;rfs=/usr/pkg/${key} \
- * rhost:=server1 \
- * rhost:=server2
- *
- * -Rens Troost <rens@imsi.com>
- */
-static IntFuncPtr
-functable_lookup(char *key)
-{
- struct functable *fp;
-
- for (fp = functable; fp->name; fp++)
- if (FSTREQ(fp->name, key))
- return (fp->func);
- return (IntFuncPtr) NULL;
-}
-
-
-/*
- * Fill in the global structure fs_static by
- * cracking the string opts. opts may be
- * scribbled on at will. Does NOT evaluate options.
- * Returns 0 on error, 1 if no syntax errors were discovered.
- */
-static int
-split_opts(char *opts, char *mapkey)
-{
- char *o = opts;
- char *f;
-
- /*
- * For each user-specified option
- */
- for (f = opt(&o); *f; f = opt(&o)) {
- struct opt *op;
- char *eq = strchr(f, '=');
- char *opt = NULL;
-
- if (!eq)
- continue;
-
- if (*(eq-1) == '!' ||
- eq[1] == '=' ||
- eq[1] == '!') { /* != or == or =! */
- continue; /* we don't care about selectors */
- }
-
- if (*(eq-1) == ':') { /* := */
- *(eq-1) = '\0';
- } else {
- /* old style assignment */
- eq[0] = '\0';
- }
- opt = eq + 1;
-
- /*
- * For each recognized option
- */
- for (op = opt_fields; op->name; op++) {
- /*
- * Check whether they match
- */
- if (FSTREQ(op->name, f)) {
- if (op->sel_p) {
- plog(XLOG_USER, "key %s: Can't assign to a selector (%s)",
- mapkey, op->name);
- return 0;
- }
- *op->optp = opt; /* actual assignment into fs_static */
- break; /* break out of for loop */
- } /* end of "if (FSTREQ(op->name, f))" statement */
- } /* end of "for (op = opt_fields..." statement */
-
- if (!op->name)
- plog(XLOG_USER, "key %s: Unrecognized key/option \"%s\"", mapkey, f);
- }
-
- return 1;
-}
-
-
-/*
- * Just evaluate selectors, which were split by split_opts.
- * Returns 0 on error or no match, 1 if matched.
- */
-static int
-eval_selectors(char *opts, char *mapkey)
-{
- char *o, *old_o;
- char *f;
- int ret = 0;
-
- o = old_o = strdup(opts);
-
- /*
- * For each user-specified option
- */
- for (f = opt(&o); *f; f = opt(&o)) {
- struct opt *op;
- enum vs_opt vs_opt;
- char *eq = strchr(f, '=');
- char *fx;
- IntFuncPtr func;
- char *opt = NULL;
- char *arg;
-
- if (!eq) {
- /*
- * No value, is it a function call?
- */
- arg = strchr(f, '(');
-
- if (!arg || arg[1] == '\0' || arg == f) {
- /*
- * No, just continue
- */
- plog(XLOG_USER, "key %s: No value component in \"%s\"", mapkey, f);
- continue;
- }
-
- /* null-terminate the argument */
- *arg++ = '\0';
- fx = strchr(arg, ')');
- if (!arg || fx == arg) {
- plog(XLOG_USER, "key %s: Malformed function in \"%s\"", mapkey, f);
- continue;
- }
- *fx = '\0';
-
- if (f[0] == '!') {
- vs_opt = SelNE;
- f++;
- } else {
- vs_opt = SelEQ;
- }
- /*
- * look up f in functable and pass it arg.
- * func must return 0 on failure, and 1 on success.
- */
- if ((func = functable_lookup(f))) {
- int funok;
-
- /* this allocates memory, don't forget to free */
- arg = expand_options(arg);
- funok = func(arg);
- XFREE(arg);
-
- if (vs_opt == SelNE)
- funok = !funok;
- if (!funok)
- goto out;
-
- continue;
- } else {
- plog(XLOG_USER, "key %s: unknown function \"%s\"", mapkey, f);
- goto out;
- }
- } else {
- if (eq[1] == '\0' || eq == f) {
- /* misformed selector */
- plog(XLOG_USER, "key %s: Bad selector \"%s\"", mapkey, f);
- continue;
- }
- }
-
- /*
- * Check what type of operation is happening
- * !=, =! is SelNE
- * == is SelEQ
- * =, := is VarAss
- */
- if (*(eq-1) == '!') { /* != */
- vs_opt = SelNE;
- *(eq-1) = '\0';
- opt = eq + 1;
- } else if (*(eq-1) == ':') { /* := */
- continue;
- } else if (eq[1] == '=') { /* == */
- vs_opt = SelEQ;
- eq[0] = '\0';
- opt = eq + 2;
- } else if (eq[1] == '!') { /* =! */
- vs_opt = SelNE;
- eq[0] = '\0';
- opt = eq + 2;
- } else {
- /* old style assignment */
- continue;
- }
-
- /*
- * For each recognized option
- */
- for (op = opt_fields; op->name; op++) {
- /*
- * Check whether they match
- */
- if (FSTREQ(op->name, f)) {
- opt = expand_options(opt);
-
- if (op->sel_p != NULL) {
- int selok;
- if (op->case_insensitive) {
- selok = STRCEQ(*op->sel_p, opt);
- } else {
- selok = STREQ(*op->sel_p, opt);
- }
- if (vs_opt == SelNE)
- selok = !selok;
- if (!selok) {
- plog(XLOG_MAP, "key %s: map selector %s (=%s) did not %smatch %s",
- mapkey,
- op->name,
- *op->sel_p,
- vs_opt == SelNE ? "mis" : "",
- opt);
- XFREE(opt);
- goto out;
- }
- XFREE(opt);
- }
- /* check if to apply a function */
- if (op->fxn_p) {
- int funok;
-
- funok = op->fxn_p(opt);
- if (vs_opt == SelNE)
- funok = !funok;
- if (!funok) {
- plog(XLOG_MAP, "key %s: map function %s did not %smatch %s",
- mapkey,
- op->name,
- vs_opt == SelNE ? "mis" : "",
- opt);
- XFREE(opt);
- goto out;
- }
- XFREE(opt);
- }
- break; /* break out of for loop */
- }
- }
-
- if (!op->name)
- plog(XLOG_USER, "key %s: Unrecognized key/option \"%s\"", mapkey, f);
- }
-
- /* all is ok */
- ret = 1;
-
- out:
- free(old_o);
- return ret;
-}
-
-
-/*
- * Skip to next option in the string, but don't scribble over the string.
- * However, *p gets repointed to the start of the next string past ';'.
- */
-static char *
-opt_no_scribble(char **p)
-{
- char *cp = *p;
- char *dp = cp;
- char *s = cp;
-
-top:
- while (*cp && *cp != ';') {
- if (*cp == '\"') {
- /*
- * Skip past string
- */
- cp++;
- while (*cp && *cp != '\"')
- *dp++ = *cp++;
- if (*cp)
- cp++;
- } else {
- *dp++ = *cp++;
- }
- }
-
- /*
- * Skip past any remaining ';'s
- */
- while (*cp == ';')
- cp++;
-
- /*
- * If we have a zero length string
- * and there are more fields, then
- * parse the next one. This allows
- * sequences of empty fields.
- */
- if (*cp && dp == s)
- goto top;
-
- *p = cp;
- return s;
-}
-
-
-/*
- * Strip any selectors from a string. Selectors are all assumed to be
- * first in the string. This is used for the new /defaults method which will
- * use selectors as well.
- */
-char *
-strip_selectors(char *opts, char *mapkey)
-{
- /*
- * Fill in the global structure fs_static by
- * cracking the string opts. opts may be
- * scribbled on at will.
- */
- char *o = opts;
- char *oo = opts;
- char *f;
-
- /*
- * Scan options. Note that the opt() function scribbles on the opt string.
- */
- while (*(f = opt_no_scribble(&o))) {
- enum vs_opt vs_opt = VarAss;
- char *eq = strchr(f, '=');
-
- if (!eq || eq[1] == '\0' || eq == f) {
- /*
- * No option or assignment? Return as is.
- */
- plog(XLOG_USER, "key %s: No option or assignment in \"%s\"", mapkey, f);
- return o;
- }
- /*
- * Check what type of operation is happening
- * !=, =! is SelNE
- * == is SelEQ
- * := is VarAss
- */
- if (*(eq-1) == '!') { /* != */
- vs_opt = SelNE;
- } else if (*(eq-1) == ':') { /* := */
- vs_opt = VarAss;
- } else if (eq[1] == '=') { /* == */
- vs_opt = SelEQ;
- } else if (eq[1] == '!') { /* =! */
- vs_opt = SelNE;
- }
- switch (vs_opt) {
- case SelEQ:
- case SelNE:
- /* Skip this selector, maybe there's another one following it */
- plog(XLOG_USER, "skipping selector to \"%s\"", o);
- /* store previous match. it may have been the first assignment */
- oo = o;
- break;
-
- case VarAss:
- /* found the first assignment, return the string starting with it */
- dlog("found first assignment past selectors \"%s\"", o);
- return oo;
- }
- }
-
- /* return the same string by default. should not happen. */
- return oo;
-}
-
-
-/*****************************************************************************
- *** BOOLEAN FUNCTIONS (return 0 if false, 1 if true): ***
- *****************************************************************************/
-
-/* test if arg is any of this host's network names or numbers */
-static int
-f_in_network(char *arg)
-{
- int status;
-
- if (!arg)
- return 0;
-
- status = is_network_member(arg);
- dlog("%s is %son a local network", arg, (status ? "" : "not "));
- return status;
-}
-
-
-/*
- * Test if arg is any of this host's names or aliases (CNAMES).
- * Note: this function compares against the fully expanded host name (hostd).
- * XXX: maybe we also need to compare against the stripped host name?
- */
-static int
-f_xhost(char *arg)
-{
- struct hostent *hp;
- char **cp;
-
- if (!arg)
- return 0;
-
- /* simple test: does it match main host name? */
- if (STREQ(arg, opt_hostd))
- return 1;
-
- /* now find all of the names of "arg" and compare against opt_hostd */
- hp = gethostbyname(arg);
- if (hp == NULL) {
-#ifdef HAVE_HSTRERROR
- plog(XLOG_ERROR, "gethostbyname xhost(%s): %s", arg, hstrerror(h_errno));
-#else /* not HAVE_HSTRERROR */
- plog(XLOG_ERROR, "gethostbyname xhost(%s): h_errno %d", arg, h_errno);
-#endif /* not HAVE_HSTRERROR */
- return 0;
- }
- /* check primary name */
- if (hp->h_name) {
- dlog("xhost: compare %s==%s", hp->h_name, opt_hostd);
- if (STREQ(hp->h_name, opt_hostd)) {
- plog(XLOG_INFO, "xhost(%s): matched h_name %s", arg, hp->h_name);
- return 1;
- }
- }
- /* check all aliases, if any */
- if (hp->h_aliases == NULL) {
- dlog("gethostbyname(%s) has no aliases", arg);
- return 0;
- }
- cp = hp->h_aliases;
- while (*cp) {
- dlog("xhost: compare alias %s==%s", *cp, opt_hostd);
- if (STREQ(*cp, opt_hostd)) {
- plog(XLOG_INFO, "xhost(%s): matched alias %s", arg, *cp);
- return 1;
- }
- cp++;
- }
- /* nothing matched */
- return 0;
-}
-
-
-/* test if this host (short hostname form) is in netgroup (arg) */
-static int
-f_netgrp(char *arg)
-{
- int status;
- char *ptr, *nhost;
-
- if ((ptr = strchr(arg, ',')) != NULL) {
- *ptr = '\0';
- nhost = ptr + 1;
- } else {
- nhost = opt_host;
- }
- status = innetgr(arg, nhost, NULL, NULL);
- dlog("netgrp = %s status = %d host = %s", arg, status, nhost);
- if (ptr)
- *ptr = ',';
- return status;
-}
-
-
-/* test if this host (fully-qualified name) is in netgroup (arg) */
-static int
-f_netgrpd(char *arg)
-{
- int status;
- char *ptr, *nhost;
-
- if ((ptr = strchr(arg, ',')) != NULL) {
- *ptr = '\0';
- nhost = ptr + 1;
- } else {
- nhost = opt_hostd;
- }
- status = innetgr(arg, nhost, NULL, NULL);
- dlog("netgrp = %s status = %d hostd = %s", arg, status, nhost);
- if (ptr)
- *ptr = ',';
- return status;
-}
-
-
-/* test if file (arg) exists via lstat */
-static int
-f_exists(char *arg)
-{
- struct stat buf;
-
- if (lstat(arg, &buf) < 0)
- return (0);
- else
- return (1);
-}
-
-
-/* always false */
-static int
-f_false(char *arg)
-{
- return (0);
-}
-
-
-/* always true */
-static int
-f_true(char *arg)
-{
- return (1);
-}
-
-
-/*
- * Free an option
- */
-static void
-free_op(opt_apply *p, int b)
-{
- if (*p->opt) {
- XFREE(*p->opt);
- }
-}
-
-
-/*
- * Normalize slashes in the string.
- */
-void
-normalize_slash(char *p)
-{
- char *f, *f0;
-
- if (!(gopt.flags & CFM_NORMALIZE_SLASHES))
- return;
-
- f0 = f = strchr(p, '/');
- if (f) {
- char *t = f;
- do {
- /* assert(*f == '/'); */
- if (f == f0 && f[0] == '/' && f[1] == '/') {
- /* copy double slash iff first */
- *t++ = *f++;
- *t++ = *f++;
- } else {
- /* copy a single / across */
- *t++ = *f++;
- }
-
- /* assert(f[-1] == '/'); */
- /* skip past more /'s */
- while (*f == '/')
- f++;
-
- /* assert(*f != '/'); */
- /* keep copying up to next / */
- while (*f && *f != '/') {
- /* support escaped slashes '\/' */
- if (f[0] == '\\' && f[1] == '/')
- f++; /* skip backslash */
- *t++ = *f++;
- }
-
- /* assert(*f == 0 || *f == '/'); */
-
- } while (*f);
- *t = 0; /* derived from fix by Steven Glassman */
- }
-}
-
-
-/*
- * Macro-expand an option. Note that this does not
- * handle recursive expansions. They will go badly wrong.
- * If sel_p is true then old expand selectors, otherwise
- * don't expand selectors.
- */
-static char *
-expand_op(char *opt, int sel_p)
-{
-#define EXPAND_ERROR "No space to expand \"%s\""
- char expbuf[MAXPATHLEN + 1];
- char nbuf[NLEN + 1];
- char *ep = expbuf;
- char *cp = opt;
- char *dp;
- struct opt *op;
- char *cp_orig = opt;
-
- while ((dp = strchr(cp, '$'))) {
- char ch;
- /*
- * First copy up to the $
- */
- {
- int len = dp - cp;
-
- if (len > 0) {
- if (BUFSPACE(ep, len)) {
- /*
- * We use strncpy (not xstrlcpy) because 'ep' relies on its
- * semantics. BUFSPACE guarantees that ep can hold len.
- */
- strncpy(ep, cp, len);
- ep += len;
- } else {
- plog(XLOG_ERROR, EXPAND_ERROR, opt);
- goto out;
- }
- }
- }
-
- cp = dp + 1;
- ch = *cp++;
- if (ch == '$') {
- if (BUFSPACE(ep, 1)) {
- *ep++ = '$';
- } else {
- plog(XLOG_ERROR, EXPAND_ERROR, opt);
- goto out;
- }
- } else if (ch == '{') {
- /* Expansion... */
- enum {
- E_All, E_Dir, E_File, E_Domain, E_Host
- } todo;
- /*
- * Find closing brace
- */
- char *br_p = strchr(cp, '}');
- int len;
-
- /*
- * Check we found it
- */
- if (!br_p) {
- /*
- * Just give up
- */
- plog(XLOG_USER, "No closing '}' in \"%s\"", opt);
- goto out;
- }
- len = br_p - cp;
-
- /*
- * Figure out which part of the variable to grab.
- */
- if (*cp == '/') {
- /*
- * Just take the last component
- */
- todo = E_File;
- cp++;
- --len;
- } else if (*(br_p-1) == '/') {
- /*
- * Take all but the last component
- */
- todo = E_Dir;
- --len;
- } else if (*cp == '.') {
- /*
- * Take domain name
- */
- todo = E_Domain;
- cp++;
- --len;
- } else if (*(br_p-1) == '.') {
- /*
- * Take host name
- */
- todo = E_Host;
- --len;
- } else {
- /*
- * Take the whole lot
- */
- todo = E_All;
- }
-
- /*
- * Truncate if too long. Since it won't
- * match anyway it doesn't matter that
- * it has been cut short.
- */
- if (len > NLEN)
- len = NLEN;
-
- /*
- * Put the string into another buffer so
- * we can do comparisons.
- *
- * We use strncpy here (not xstrlcpy) because the dest is meant
- * to be truncated and we don't want to log it as an error. The
- * use of the BUFSPACE macro above guarantees the safe use of
- * strncpy with nbuf.
- */
- strncpy(nbuf, cp, len);
- nbuf[len] = '\0';
-
- /*
- * Advance cp
- */
- cp = br_p + 1;
-
- /*
- * Search the option array
- */
- for (op = opt_fields; op->name; op++) {
- /*
- * Check for match
- */
- if (len == op->nlen && STREQ(op->name, nbuf)) {
- char xbuf[NLEN + 3];
- char *val;
- /*
- * Found expansion. Copy
- * the correct value field.
- */
- if (!(!op->sel_p == !sel_p)) {
- /*
- * Copy the string across unexpanded
- */
- xsnprintf(xbuf, sizeof(xbuf), "${%s%s%s}",
- todo == E_File ? "/" :
- todo == E_Domain ? "." : "",
- nbuf,
- todo == E_Dir ? "/" :
- todo == E_Host ? "." : "");
- val = xbuf;
- /*
- * Make sure expansion doesn't
- * munge the value!
- */
- todo = E_All;
- } else if (op->sel_p) {
- val = *op->sel_p;
- } else {
- val = *op->optp;
- }
-
- if (val) {
- /*
- * Do expansion:
- * ${/var} means take just the last part
- * ${var/} means take all but the last part
- * ${.var} means take all but first part
- * ${var.} means take just the first part
- * ${var} means take the whole lot
- */
- int vlen = strlen(val);
- char *vptr = val;
- switch (todo) {
- case E_Dir:
- vptr = strrchr(val, '/');
- if (vptr)
- vlen = vptr - val;
- vptr = val;
- break;
- case E_File:
- vptr = strrchr(val, '/');
- if (vptr) {
- vptr++;
- vlen = strlen(vptr);
- } else
- vptr = val;
- break;
- case E_Domain:
- vptr = strchr(val, '.');
- if (vptr) {
- vptr++;
- vlen = strlen(vptr);
- } else {
- vptr = "";
- vlen = 0;
- }
- break;
- case E_Host:
- vptr = strchr(val, '.');
- if (vptr)
- vlen = vptr - val;
- vptr = val;
- break;
- case E_All:
- break;
- }
-
- if (BUFSPACE(ep, vlen+1)) {
- xstrlcpy(ep, vptr, vlen+1);
- ep += vlen;
- } else {
- plog(XLOG_ERROR, EXPAND_ERROR, opt);
- goto out;
- }
- }
- /*
- * Done with this variable
- */
- break;
- }
- }
-
- /*
- * Check that the search was successful
- */
- if (!op->name) {
- /*
- * If it wasn't then scan the
- * environment for that name
- * and use any value found
- */
- char *env = getenv(nbuf);
-
- if (env) {
- int vlen = strlen(env);
-
- if (BUFSPACE(ep, vlen+1)) {
- xstrlcpy(ep, env, vlen+1);
- ep += vlen;
- } else {
- plog(XLOG_ERROR, EXPAND_ERROR, opt);
- goto out;
- }
- if (amuDebug(D_STR))
- plog(XLOG_DEBUG, "Environment gave \"%s\" -> \"%s\"", nbuf, env);
- } else {
- plog(XLOG_USER, "Unknown sequence \"${%s}\"", nbuf);
- }
- }
- } else {
- /*
- * Error, error
- */
- plog(XLOG_USER, "Unknown $ sequence in \"%s\"", opt);
- }
- }
-
-out:
- /*
- * Handle common case - no expansion
- */
- if (cp == opt) {
- opt = strdup(cp);
- } else {
- /*
- * Finish off the expansion
- */
- int vlen = strlen(cp);
- if (BUFSPACE(ep, vlen+1)) {
- xstrlcpy(ep, cp, vlen+1);
- /* ep += vlen; */
- } else {
- plog(XLOG_ERROR, EXPAND_ERROR, opt);
- }
-
- /*
- * Save the expansion
- */
- opt = strdup(expbuf);
- }
-
- normalize_slash(opt);
-
- if (amuDebug(D_STR)) {
- plog(XLOG_DEBUG, "Expansion of \"%s\"...", cp_orig);
- plog(XLOG_DEBUG, "......... is \"%s\"", opt);
- }
- return opt;
-}
-
-
-/*
- * Wrapper for expand_op
- */
-static void
-expand_opts(opt_apply *p, int sel_p)
-{
- if (*p->opt) {
- *p->opt = expand_op(*p->opt, sel_p);
- } else if (p->val) {
- /*
- * Do double expansion, remembering
- * to free the string from the first
- * expansion...
- */
- char *s = expand_op(p->val, TRUE);
- *p->opt = expand_op(s, sel_p);
- XFREE(s);
- }
-}
-
-
-/*
- * Apply a function to a list of options
- */
-static void
-apply_opts(void (*op) (opt_apply *, int), opt_apply ppp[], int b)
-{
- opt_apply *pp;
-
- for (pp = ppp; pp->opt; pp++)
- (*op) (pp, b);
-}
-
-
-/*
- * Free the option table
- */
-void
-free_opts(am_opts *fo)
-{
- /*
- * Copy in the structure we are playing with
- */
- fs_static = *fo;
-
- /*
- * Free previously allocated memory
- */
- apply_opts(free_op, to_free, FALSE);
-}
-
-
-/*
- * Expand selectors (variables that cannot be assigned to or overridden)
- */
-char *
-expand_selectors(char *key)
-{
- return expand_op(key, TRUE);
-}
-
-
-/*
- * Expand options (i.e. non-selectors, see above for definition)
- */
-static inline char *
-expand_options(char *key)
-{
- return expand_op(key, FALSE);
-}
-
-
-/*
- * Remove trailing /'s from a string
- * unless the string is a single / (Steven Glassman)
- * or unless it is two slashes // (Kevin D. Bond)
- * or unless amd.conf says not to touch slashes.
- */
-void
-deslashify(char *s)
-{
- if (!(gopt.flags & CFM_NORMALIZE_SLASHES))
- return;
-
- if (s && *s) {
- char *sl = s + strlen(s);
-
- while (*--sl == '/' && sl > s)
- *sl = '\0';
- }
-}
-
-
-int
-eval_fs_opts(am_opts *fo, char *opts, char *g_opts, char *path, char *key, char *map)
-{
- int ok = TRUE;
-
- free_opts(fo);
-
- /*
- * Clear out the option table
- */
- memset((voidp) &fs_static, 0, sizeof(fs_static));
- memset((voidp) vars, 0, sizeof(vars));
- memset((voidp) fo, 0, sizeof(*fo));
-
- /* set hostname */
- opt_host = (char *) am_get_hostname();
-
- /*
- * Set key, map & path before expansion
- */
- opt_key = key;
- opt_map = map;
- opt_path = path;
-
- opt_dkey = strchr(key, '.');
- if (!opt_dkey) {
- opt_dkey = NullStr;
- opt_keyd = key;
- } else {
- opt_keyd = strnsave(key, opt_dkey - key);
- opt_dkey++;
- if (*opt_dkey == '\0') /* check for 'host.' */
- opt_dkey = NullStr;
- }
-
- /*
- * Expand global options
- */
- fs_static.fs_glob = expand_selectors(g_opts);
-
- /*
- * Expand local options
- */
- fs_static.fs_local = expand_selectors(opts);
-
- /* break global options into fs_static fields */
- if ((ok = split_opts(fs_static.fs_glob, key))) {
- dlog("global split_opts ok");
- /*
- * evaluate local selectors
- */
- if ((ok = eval_selectors(fs_static.fs_local, key))) {
- dlog("local eval_selectors ok");
- /* if the local selectors matched, then do the local overrides */
- ok = split_opts(fs_static.fs_local, key);
- if (ok)
- dlog("local split_opts ok");
- }
- }
-
- /*
- * Normalize remote host name.
- * 1. Expand variables
- * 2. Normalize relative to host tables
- * 3. Strip local domains from the remote host
- * name before using it in other expansions.
- * This makes mount point names and other things
- * much shorter, while allowing cross domain
- * sharing of mount maps.
- */
- apply_opts(expand_opts, rhost_expansion, FALSE);
- if (ok && fs_static.opt_rhost && *fs_static.opt_rhost)
- host_normalize(&fs_static.opt_rhost);
-
- /*
- * Macro expand the options.
- * Do this regardless of whether we are accepting
- * this mount - otherwise nasty things happen
- * with memory allocation.
- */
- apply_opts(expand_opts, expansions, FALSE);
-
- /*
- * Strip trailing slashes from local pathname...
- */
- deslashify(fs_static.opt_fs);
-
- /*
- * ok... copy the data back out.
- */
- *fo = fs_static;
-
- /*
- * Clear defined options
- */
- if (opt_keyd != key && opt_keyd != nullstr)
- XFREE(opt_keyd);
- opt_keyd = nullstr;
- opt_dkey = NullStr;
- opt_key = opt_map = opt_path = nullstr;
-
- return ok;
-}
diff --git a/contrib/amd/amd/readdir.c b/contrib/amd/amd/readdir.c
deleted file mode 100644
index d025c9118c30..000000000000
--- a/contrib/amd/amd/readdir.c
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/readdir.c
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-/****************************************************************************
- *** MACROS ***
- ****************************************************************************/
-#define DOT_DOT_COOKIE (u_int) 1
-#define MAX_CHAIN 2048
-
-
-/****************************************************************************
- *** FORWARD DEFINITIONS ***
- ****************************************************************************/
-static int key_already_in_chain(char *keyname, const nfsentry *chain);
-static nfsentry *make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable);
-static int amfs_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count, int fully_browsable);
-
-
-/****************************************************************************
- *** FUNCTIONS ***
- ****************************************************************************/
-/*
- * Was: NEW_TOPLVL_READDIR
- * Search a chain for an entry with some name.
- * -Erez Zadok <ezk@cs.columbia.edu>
- */
-static int
-key_already_in_chain(char *keyname, const nfsentry *chain)
-{
- const nfsentry *tmpchain = chain;
-
- while (tmpchain) {
- if (keyname && tmpchain->ne_name && STREQ(keyname, tmpchain->ne_name))
- return 1;
- tmpchain = tmpchain->ne_nextentry;
- }
-
- return 0;
-}
-
-
-/*
- * Create a chain of entries which are not linked.
- * -Erez Zadok <ezk@cs.columbia.edu>
- */
-static nfsentry *
-make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable)
-{
- static u_int last_cookie = (u_int) 2; /* monotonically increasing */
- static nfsentry chain[MAX_CHAIN];
- static int max_entries = MAX_CHAIN;
- char *key;
- int num_entries = 0, i;
- u_int preflen = 0;
- nfsentry *retval = (nfsentry *) NULL;
- mntfs *mf;
- mnt_map *mmp;
-
- if (!mp) {
- plog(XLOG_DEBUG, "make_entry_chain: mp is (NULL)");
- return retval;
- }
- mf = mp->am_mnt;
- if (!mf) {
- plog(XLOG_DEBUG, "make_entry_chain: mp->am_mnt is (NULL)");
- return retval;
- }
- mmp = (mnt_map *) mf->mf_private;
- if (!mmp) {
- plog(XLOG_DEBUG, "make_entry_chain: mp->am_mnt->mf_private is (NULL)");
- return retval;
- }
-
- if (mp->am_pref)
- preflen = strlen(mp->am_pref);
-
- /* iterate over keys */
- for (i = 0; i < NKVHASH; i++) {
- kv *k;
- for (k = mmp->kvhash[i]; k ; k = k->next) {
-
- /*
- * Skip unwanted entries which are either not real entries or
- * very difficult to interpret (wildcards...) This test needs
- * lots of improvement. Any takers?
- */
- key = k->key;
- if (!key)
- continue;
-
- /* Skip '/defaults' */
- if (STREQ(key, "/defaults"))
- continue;
-
- /* Skip '*' */
- if (!fully_browsable && strchr(key, '*'))
- continue;
-
- /*
- * If the map has a prefix-string then check if the key starts with
- * this string, and if it does, skip over this prefix. If it has a
- * prefix and it doesn't match the start of the key, skip it.
- */
- if (preflen) {
- if (preflen > strlen(key))
- continue;
- if (!NSTREQ(key, mp->am_pref, preflen))
- continue;
- key += preflen;
- }
-
- /* no more '/' are allowed, unless browsable_dirs=full was used */
- if (!fully_browsable && strchr(key, '/'))
- continue;
-
- /* no duplicates allowed */
- if (key_already_in_chain(key, current_chain))
- continue;
-
- /* fill in a cell and link the entry */
- if (num_entries >= max_entries) {
- /* out of space */
- plog(XLOG_DEBUG, "make_entry_chain: no more space in chain");
- if (num_entries > 0) {
- chain[num_entries - 1].ne_nextentry = 0;
- retval = &chain[0];
- }
- return retval;
- }
-
- /* we have space. put entry in next cell */
- ++last_cookie;
- chain[num_entries].ne_fileid = (u_int) last_cookie;
- *(u_int *) chain[num_entries].ne_cookie = (u_int) last_cookie;
- chain[num_entries].ne_name = key;
- if (num_entries < max_entries - 1) { /* link to next one */
- chain[num_entries].ne_nextentry = &chain[num_entries + 1];
- }
- ++num_entries;
- } /* end of "while (k)" */
- } /* end of "for (i ... NKVHASH ..." */
-
- /* terminate chain */
- if (num_entries > 0) {
- chain[num_entries - 1].ne_nextentry = 0;
- retval = &chain[0];
- }
-
- return retval;
-}
-
-
-
-/* This one is called only if map is browsable */
-static int
-amfs_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count, int fully_browsable)
-{
- u_int gen = *(u_int *) cookie;
- int chain_length, i;
- static nfsentry *te, *te_next;
- static int j;
-
- dp->dl_eof = FALSE; /* assume readdir not done */
-
- if (amuDebug(D_READDIR))
- plog(XLOG_DEBUG, "amfs_readdir_browsable gen=%u, count=%d",
- gen, count);
-
- if (gen == 0) {
- /*
- * In the default instance (which is used to start a search) we return
- * "." and "..".
- *
- * This assumes that the count is big enough to allow both "." and ".."
- * to be returned in a single packet. If it isn't (which would be
- * fairly unbelievable) then tough.
- */
- dlog("amfs_readdir_browsable: default search");
- /*
- * Check for enough room. This is extremely approximate but is more
- * than enough space. Really need 2 times:
- * 4byte fileid
- * 4byte cookie
- * 4byte name length
- * 4byte name
- * plus the dirlist structure */
- if (count < (2 * (2 * (sizeof(*ep) + sizeof("..") + 4) + sizeof(*dp))))
- return EINVAL;
-
- /*
- * compute # of entries to send in this chain.
- * heuristics: 128 bytes per entry.
- * This is too much probably, but it seems to work better because
- * of the re-entrant nature of nfs_readdir, and esp. on systems
- * like OpenBSD 2.2.
- */
- chain_length = count / 128;
-
- /* reset static state counters */
- te = te_next = NULL;
-
- dp->dl_entries = ep;
-
- /* construct "." */
- ep[0].ne_fileid = mp->am_gen;
- ep[0].ne_name = ".";
- ep[0].ne_nextentry = &ep[1];
- *(u_int *) ep[0].ne_cookie = 0;
-
- /* construct ".." */
- if (mp->am_parent)
- ep[1].ne_fileid = mp->am_parent->am_gen;
- else
- ep[1].ne_fileid = mp->am_gen;
-
- ep[1].ne_name = "..";
- ep[1].ne_nextentry = 0;
- *(u_int *) ep[1].ne_cookie = DOT_DOT_COOKIE;
-
- /*
- * If map is browsable, call a function make_entry_chain() to construct
- * a linked list of unmounted keys, and return it. Then link the chain
- * to the regular list. Get the chain only once, but return
- * chunks of it each time.
- */
- te = make_entry_chain(mp, dp->dl_entries, fully_browsable);
- if (!te)
- return 0;
- if (amuDebug(D_READDIR)) {
- nfsentry *ne;
- for (j = 0, ne = te; ne; ne = ne->ne_nextentry)
- plog(XLOG_DEBUG, "gen1 key %4d \"%s\"", j++, ne->ne_name);
- }
-
- /* return only "chain_length" entries */
- te_next = te;
- for (i=1; i<chain_length; ++i) {
- te_next = te_next->ne_nextentry;
- if (!te_next)
- break;
- }
- if (te_next) {
- nfsentry *te_saved = te_next->ne_nextentry;
- te_next->ne_nextentry = NULL; /* terminate "te" chain */
- te_next = te_saved; /* save rest of "te" for next iteration */
- dp->dl_eof = FALSE; /* tell readdir there's more */
- } else {
- dp->dl_eof = TRUE; /* tell readdir that's it */
- }
- ep[1].ne_nextentry = te; /* append this chunk of "te" chain */
- if (amuDebug(D_READDIR)) {
- nfsentry *ne;
- for (j = 0, ne = te; ne; ne = ne->ne_nextentry)
- plog(XLOG_DEBUG, "gen2 key %4d \"%s\"", j++, ne->ne_name);
- for (j = 0, ne = ep; ne; ne = ne->ne_nextentry)
- plog(XLOG_DEBUG, "gen2+ key %4d \"%s\" fi=%d ck=%d",
- j++, ne->ne_name, ne->ne_fileid, *(u_int *)ne->ne_cookie);
- plog(XLOG_DEBUG, "EOF is %d", dp->dl_eof);
- }
- return 0;
- } /* end of "if (gen == 0)" statement */
-
- dlog("amfs_readdir_browsable: real child");
-
- if (gen == DOT_DOT_COOKIE) {
- dlog("amfs_readdir_browsable: End of readdir in %s", mp->am_path);
- dp->dl_eof = TRUE;
- dp->dl_entries = 0;
- return 0;
- }
-
- /*
- * If browsable directories, then continue serving readdir() with another
- * chunk of entries, starting from where we left off (when gen was equal
- * to 0). Once again, assume last chunk served to readdir.
- */
- dp->dl_eof = TRUE;
- dp->dl_entries = ep;
-
- te = te_next; /* reset 'te' from last saved te_next */
- if (!te) { /* another indicator of end of readdir */
- dp->dl_entries = 0;
- return 0;
- }
- /*
- * compute # of entries to send in this chain.
- * heuristics: 128 bytes per entry.
- */
- chain_length = count / 128;
-
- /* return only "chain_length" entries */
- for (i = 1; i < chain_length; ++i) {
- te_next = te_next->ne_nextentry;
- if (!te_next)
- break;
- }
- if (te_next) {
- nfsentry *te_saved = te_next->ne_nextentry;
- te_next->ne_nextentry = NULL; /* terminate "te" chain */
- te_next = te_saved; /* save rest of "te" for next iteration */
- dp->dl_eof = FALSE; /* tell readdir there's more */
- }
- ep = te; /* send next chunk of "te" chain */
- dp->dl_entries = ep;
- if (amuDebug(D_READDIR)) {
- nfsentry *ne;
- plog(XLOG_DEBUG, "dl_entries=%p, te_next=%p, dl_eof=%d",
- dp->dl_entries, te_next, dp->dl_eof);
- for (ne = te; ne; ne = ne->ne_nextentry)
- plog(XLOG_DEBUG, "gen3 key %4d \"%s\"", j++, ne->ne_name);
- }
- return 0;
-}
-
-
-/*
- * This readdir function which call a special version of it that allows
- * browsing if browsable_dirs=yes was set on the map.
- */
-int
-amfs_generic_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count)
-{
- u_int gen = *(u_int *) cookie;
- am_node *xp;
- mntent_t mnt;
-
- dp->dl_eof = FALSE; /* assume readdir not done */
-
- /* check if map is browsable */
- if (mp->am_mnt && mp->am_mnt->mf_mopts) {
- mnt.mnt_opts = mp->am_mnt->mf_mopts;
- if (amu_hasmntopt(&mnt, "fullybrowsable"))
- return amfs_readdir_browsable(mp, cookie, dp, ep, count, TRUE);
- if (amu_hasmntopt(&mnt, "browsable"))
- return amfs_readdir_browsable(mp, cookie, dp, ep, count, FALSE);
- }
-
- /* when gen is 0, we start reading from the beginning of the directory */
- if (gen == 0) {
- /*
- * In the default instance (which is used to start a search) we return
- * "." and "..".
- *
- * This assumes that the count is big enough to allow both "." and ".."
- * to be returned in a single packet. If it isn't (which would be
- * fairly unbelievable) then tough.
- */
- dlog("amfs_generic_readdir: default search");
- /*
- * Check for enough room. This is extremely approximate but is more
- * than enough space. Really need 2 times:
- * 4byte fileid
- * 4byte cookie
- * 4byte name length
- * 4byte name
- * plus the dirlist structure */
- if (count < (2 * (2 * (sizeof(*ep) + sizeof("..") + 4) + sizeof(*dp))))
- return EINVAL;
-
- xp = next_nonerror_node(mp->am_child);
- dp->dl_entries = ep;
-
- /* construct "." */
- ep[0].ne_fileid = mp->am_gen;
- ep[0].ne_name = ".";
- ep[0].ne_nextentry = &ep[1];
- *(u_int *) ep[0].ne_cookie = 0;
-
- /* construct ".." */
- if (mp->am_parent)
- ep[1].ne_fileid = mp->am_parent->am_gen;
- else
- ep[1].ne_fileid = mp->am_gen;
- ep[1].ne_name = "..";
- ep[1].ne_nextentry = 0;
- *(u_int *) ep[1].ne_cookie = (xp ? xp->am_gen : DOT_DOT_COOKIE);
-
- if (!xp)
- dp->dl_eof = TRUE; /* by default assume readdir done */
-
- if (amuDebug(D_READDIR)) {
- nfsentry *ne;
- int j;
- for (j = 0, ne = ep; ne; ne = ne->ne_nextentry)
- plog(XLOG_DEBUG, "gen1 key %4d \"%s\" fi=%d ck=%d",
- j++, ne->ne_name, ne->ne_fileid, *(u_int *)ne->ne_cookie);
- }
- return 0;
- }
- dlog("amfs_generic_readdir: real child");
-
- if (gen == DOT_DOT_COOKIE) {
- dlog("amfs_generic_readdir: End of readdir in %s", mp->am_path);
- dp->dl_eof = TRUE;
- dp->dl_entries = 0;
- if (amuDebug(D_READDIR))
- plog(XLOG_DEBUG, "end of readdir eof=TRUE, dl_entries=0\n");
- return 0;
- }
-
- /* non-browsable directories code */
- xp = mp->am_child;
- while (xp && xp->am_gen != gen)
- xp = xp->am_osib;
-
- if (xp) {
- int nbytes = count / 2; /* conservative */
- int todo = MAX_READDIR_ENTRIES;
-
- dp->dl_entries = ep;
- do {
- am_node *xp_next = next_nonerror_node(xp->am_osib);
-
- if (xp_next) {
- *(u_int *) ep->ne_cookie = xp_next->am_gen;
- } else {
- *(u_int *) ep->ne_cookie = DOT_DOT_COOKIE;
- dp->dl_eof = TRUE;
- }
-
- ep->ne_fileid = xp->am_gen;
- ep->ne_name = xp->am_name;
- nbytes -= sizeof(*ep) + 1;
- if (xp->am_name)
- nbytes -= strlen(xp->am_name);
-
- xp = xp_next;
-
- if (nbytes > 0 && !dp->dl_eof && todo > 1) {
- ep->ne_nextentry = ep + 1;
- ep++;
- --todo;
- } else {
- todo = 0;
- }
- } while (todo > 0);
-
- ep->ne_nextentry = 0;
-
- if (amuDebug(D_READDIR)) {
- nfsentry *ne;
- int j;
- for (j=0,ne=ep; ne; ne=ne->ne_nextentry)
- plog(XLOG_DEBUG, "gen2 key %4d \"%s\" fi=%d ck=%d",
- j++, ne->ne_name, ne->ne_fileid, *(u_int *)ne->ne_cookie);
- }
- return 0;
- }
- return ESTALE;
-}
diff --git a/contrib/amd/amd/restart.c b/contrib/amd/amd/restart.c
deleted file mode 100644
index 4f71e381e25a..000000000000
--- a/contrib/amd/amd/restart.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/restart.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-static void
-restart_fake_mntfs(mntent_t *me, am_ops *fs_ops)
-{
- mntfs *mf;
- am_opts mo;
- char *cp;
-
- /*
- * Partially fake up an opts structure
- */
- memset(&mo, 0, sizeof(mo));
- mo.opt_rhost = 0;
- mo.opt_rfs = 0;
- cp = strchr(me->mnt_fsname, ':');
- if (cp) {
- *cp = '\0';
- mo.opt_rhost = strdup(me->mnt_fsname);
- mo.opt_rfs = strdup(cp + 1);
- *cp = ':';
- } else if (STREQ(me->mnt_type, MNTTAB_TYPE_NFS)) {
- /*
- * Hacky workaround for mnttab NFS entries that only list the server
- */
- plog(XLOG_WARNING, "NFS server entry assumed to be %s:/", me->mnt_fsname);
- mo.opt_rhost = strdup(me->mnt_fsname);
- mo.opt_rfs = strdup("/");
- me->mnt_fsname = str3cat(me->mnt_fsname, mo.opt_rhost, ":", "/");
- }
- mo.opt_fs = me->mnt_dir;
- mo.opt_opts = me->mnt_opts;
-
- /*
- * Make a new mounted filesystem
- */
- mf = find_mntfs(fs_ops, &mo, me->mnt_dir,
- me->mnt_fsname, "", me->mnt_opts, "");
- if (mf->mf_refc == 1) {
- mf->mf_flags |= MFF_RESTART | MFF_MOUNTED;
- mf->mf_error = 0; /* Already mounted correctly */
- mf->mf_fo = 0;
- /*
- * Only timeout non-NFS entries
- */
- if (!STREQ(me->mnt_type, MNTTAB_TYPE_NFS))
- mf->mf_flags |= MFF_RSTKEEP;
- if (fs_ops->fs_init) {
- /*
- * Don't care whether this worked since
- * it is checked again when the fs is
- * inherited.
- */
- (void) (*fs_ops->fs_init) (mf);
- }
- plog(XLOG_INFO, "%s restarted fstype %s on %s, flags 0x%x",
- me->mnt_fsname, fs_ops->fs_type, me->mnt_dir, mf->mf_flags);
- } else {
- /* Something strange happened - two mounts at the same place! */
- free_mntfs(mf);
- }
- /*
- * Clean up mo
- */
- if (mo.opt_rhost)
- XFREE(mo.opt_rhost);
- if (mo.opt_rfs)
- XFREE(mo.opt_rfs);
-}
-
-
-/*
- * Handle an amd restart.
- *
- * Scan through the mount list finding all "interesting" mount points.
- * Next hack up partial data structures and add the mounted file
- * system to the list of known filesystems.
- *
- * This module relies on internal details of other components. If
- * you change something else make *sure* restart() still works.
- */
-void
-restart(void)
-{
- mntlist *ml, *mlp;
-
- /*
- * Read the existing mount table. For each entry, find nfs, ufs or auto
- * mounts and create a partial am_node to represent it.
- */
- for (mlp = ml = read_mtab("restart", mnttab_file_name);
- mlp;
- mlp = mlp->mnext) {
- mntent_t *me = mlp->mnt;
- am_ops *fs_ops = 0;
-
- if (STREQ(me->mnt_type, MNTTAB_TYPE_NFS)) {
- /*
- * NFS entry, or possibly an Amd entry...
- * The mnt_fsname for daemon mount points is
- * host:(pidXXX)
- * or (seen on Solaris)
- * host:daemon(pidXXX)
- */
- char *colon = strchr(me->mnt_fsname, ':');
- if (colon && strstr(colon, "(pid"))
- continue;
- }
-
- /* Search for the correct filesystem ops */
- fs_ops = ops_search(me->mnt_type);
-
- /*
- * Catch everything else with symlinks to
- * avoid recursive mounts. This is debatable...
- */
- if (!fs_ops)
- fs_ops = &amfs_link_ops;
-
- restart_fake_mntfs(me, fs_ops);
- }
-
- /*
- * Free the mount list
- */
- free_mntlist(ml);
-}
-
-
-/*
- * Handle an amd restart for amd's own mount points.
- *
- * Scan through the mount list finding all daemon mount points
- * (determined by the presence of a pid inside the mount info).
- * Next hack up partial data structures and add the mounted file
- * system to the list of known filesystems.
- *
- * This module relies on internal details of other components. If
- * you change something else make *sure* restart() still works.
- */
-void
-restart_automounter_nodes(void)
-{
- mntlist *ml, *mlp;
- /* reasonably sized list of restarted nfs ports */
- u_short old_ports[256];
-
- memset((voidp) &old_ports, 0, sizeof(u_short) * 256);
-
- /*
- * Read the existing mount table. For each entry, find nfs, ufs or auto
- * mounts and create a partial am_node to represent it.
- */
- for (mlp = ml = read_mtab("restart", mnttab_file_name);
- mlp;
- mlp = mlp->mnext) {
- mntent_t *me = mlp->mnt;
- am_ops *fs_ops = 0;
- char *colon;
- long pid;
- u_short port;
- int err;
-
- if (!STREQ(me->mnt_type, MNTTAB_TYPE_NFS))
- continue; /* to next mlp */
- /*
- * NFS entry, or possibly an Amd entry...
- * The mnt_fsname for daemon mount points is
- * host:(pidXXX)
- * or (seen on Solaris)
- * host:daemon(pidXXX)
- */
- colon = strchr(me->mnt_fsname, ':');
- if (!colon || !strstr(colon, "(pid"))
- continue;
- /* if got here, then we matched an existing Amd mount point */
- err = 1;
-
- plog(XLOG_WARNING, "%s is an existing automount point", me->mnt_dir);
-
- /* Is the old automounter still alive? */
- if (sscanf(colon, "%*[^(](pid%ld%*[,)]", &pid) != 1) {
- plog(XLOG_WARNING, "Can't parse pid in %s", me->mnt_fsname);
- goto give_up;
- }
- if (kill(pid, 0) != -1 || errno != ESRCH) {
- plog(XLOG_WARNING, "Automounter (pid: %ld) still alive", pid);
- goto give_up;
- }
-
- /*
- * Do we have a map for this mount point? Who cares, we'll restart
- * anyway -- getting ESTALE is way better than hanging.
- */
-
- /* Can we restart it? Only if it tells us what port it was using... */
- if (sscanf(colon, "%*[^,],port%hu)", &port) != 1) {
- plog(XLOG_WARNING, "No port specified for %s", me->mnt_fsname);
- goto give_up;
- }
-
- /* Maybe we already own that port... */
- if (port != nfs_port) {
- int i;
- for (i = 0; i < 256; i++) {
- if (old_ports[i] == port ||
- old_ports[i] == 0)
- break;
- }
- if (i == 256) {
- plog(XLOG_WARNING, "Too many open ports (256)");
- goto give_up;
- }
-
- if (old_ports[i] == 0) {
- int soNFS;
- SVCXPRT *nfsxprt;
- if (create_nfs_service(&soNFS, &port, &nfsxprt, nfs_program_2) != 0) {
- plog(XLOG_WARNING, "Can't bind to port %u", port);
- goto give_up;
- }
- old_ports[i] = nfs_port = port;
- }
- }
- err = 0;
-
- give_up:
- if (err) {
- plog(XLOG_WARNING, "Can't restart %s, leaving it alone", me->mnt_dir);
- fs_ops = &amfs_link_ops;
- } else {
- fs_ops = &amfs_toplvl_ops;
- }
-
- restart_fake_mntfs(me, fs_ops);
- } /* end of "for (mlp" */
-
- /* free the mount list */
- free_mntlist(ml);
-}
diff --git a/contrib/amd/amd/rpc_fwd.c b/contrib/amd/amd/rpc_fwd.c
deleted file mode 100644
index b3c8be4fa3b7..000000000000
--- a/contrib/amd/amd/rpc_fwd.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/rpc_fwd.c
- *
- */
-
-/*
- * RPC packet forwarding
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * Note that the ID field in the external packet is only
- * ever treated as a 32 bit opaque data object, so there
- * is no need to convert to and from network byte ordering.
- */
-
-#define XID_ALLOC() (xid++)
-#define MAX_PACKET_SIZE 8192 /* Maximum UDP packet size */
-
-/*
- * Each pending reply has an rpc_forward structure
- * associated with it. These have a 15 second lifespan.
- * If a new structure is required, then an expired
- * one will be re-allocated if available, otherwise a fresh
- * one is allocated. Whenever a reply is received the
- * structure is discarded.
- */
-typedef struct rpc_forward rpc_forward;
-struct rpc_forward {
- qelem rf_q; /* Linked list */
- time_t rf_ttl; /* Time to live */
- u_int rf_xid; /* Packet id */
- u_int rf_oldid; /* Original packet id */
- fwd_fun *rf_fwd; /* Forwarding function */
- voidp rf_ptr;
- struct sockaddr_in rf_sin;
-};
-
-/*
- * Head of list of pending replies
- */
-qelem rpc_head = {&rpc_head, &rpc_head};
-int fwd_sock;
-static u_int xid;
-
-
-/*
- * Allocate a rely structure
- */
-static rpc_forward *
-fwd_alloc(void)
-{
- time_t now = clocktime(NULL);
- rpc_forward *p = 0, *p2;
-
- /*
- * First search for an existing expired one.
- */
- ITER(p2, rpc_forward, &rpc_head) {
- if (p2->rf_ttl <= now) {
- p = p2;
- break;
- }
- }
-
- /*
- * If one couldn't be found then allocate
- * a new structure and link it at the
- * head of the list.
- */
- if (p) {
- /*
- * Call forwarding function to say that
- * this message was junked.
- */
- dlog("Re-using packet forwarding slot - id %#x", p->rf_xid);
- if (p->rf_fwd)
- (*p->rf_fwd) (0, 0, 0, &p->rf_sin, p->rf_ptr, FALSE);
- rem_que(&p->rf_q);
- } else {
- p = ALLOC(struct rpc_forward);
- }
- ins_que(&p->rf_q, &rpc_head);
-
- /*
- * Set the time to live field
- * Timeout in 43 seconds
- */
- p->rf_ttl = now + 43;
-
- return p;
-}
-
-
-/*
- * Free an allocated reply structure.
- * First unlink it from the list, then
- * discard it.
- */
-static void
-fwd_free(rpc_forward *p)
-{
- rem_que(&p->rf_q);
- XFREE(p);
-}
-
-
-/*
- * Initialize the RPC forwarder
- */
-int
-fwd_init(void)
-{
-#ifdef FIONBIO
- int on = 1;
-#endif /* FIONBIO */
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- /*
- * Create ping TLI socket (/dev/tcp and /dev/ticlts did not work)
- * (HPUX-11 does not like using O_NDELAY in flags)
- */
- fwd_sock = t_open("/dev/udp", O_RDWR|O_NONBLOCK, 0);
- if (fwd_sock < 0) {
- plog(XLOG_ERROR, "unable to create RPC forwarding TLI socket: %s",
- t_errlist[t_errno]);
- return errno;
- }
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- /*
- * Create ping socket
- */
- fwd_sock = socket(AF_INET, SOCK_DGRAM, 0);
- if (fwd_sock < 0) {
- plog(XLOG_ERROR, "unable to create RPC forwarding socket: %m");
- return errno;
- }
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*
- * Some things we talk to require a priv port - so make one here
- */
- if (bind_resv_port(fwd_sock, (u_short *) 0) < 0)
- plog(XLOG_ERROR, "can't bind privileged port (rpc_fwd)");
-
- if (fcntl(fwd_sock, F_SETFL, FNDELAY) < 0
-#ifdef FIONBIO
- && ioctl(fwd_sock, FIONBIO, &on) < 0
-#endif /* FIONBIO */
- ) {
- plog(XLOG_ERROR, "Can't set non-block on forwarding socket: %m");
- return errno;
- }
-
- return 0;
-}
-
-
-/*
- * Locate a packet in the forwarding list
- */
-static rpc_forward *
-fwd_locate(u_int id)
-{
- rpc_forward *p;
-
- ITER(p, rpc_forward, &rpc_head) {
- if (p->rf_xid == id)
- return p;
- }
-
- return 0;
-}
-
-
-/*
- * This is called to forward a packet to another
- * RPC server. The message id is changed and noted
- * so that when a reply appears we can tie it up
- * correctly. Just matching the reply's source address
- * would not work because it might come from a
- * different address.
- */
-int
-fwd_packet(int type_id, char *pkt, int len, struct sockaddr_in *fwdto, struct sockaddr_in *replyto, opaque_t cb_arg, fwd_fun cb)
-{
- rpc_forward *p;
- u_int *pkt_int;
- int error;
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- struct t_unitdata ud;
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
- if ((int) amd_state >= (int) Finishing)
- return ENOENT;
-
- /*
- * See if the type_id is fully specified.
- * If so, then discard any old entries
- * for this id.
- * Otherwise make sure the type_id is
- * fully qualified by allocating an id here.
- */
- switch (type_id & RPC_XID_MASK) {
- case RPC_XID_PORTMAP:
- dlog("Sending PORTMAP request %#x", type_id);
- break;
- case RPC_XID_MOUNTD:
- dlog("Sending MOUNTD request %#x", type_id);
- break;
- case RPC_XID_NFSPING:
- dlog("Sending NFS ping %#x", type_id);
- break;
- case RPC_XID_WEBNFS:
- dlog("Sending WebNFS lookup %#x", type_id);
- break;
- default:
- dlog("UNKNOWN RPC XID %#x", type_id);
- break;
- }
-
- if (type_id & ~RPC_XID_MASK) {
- p = fwd_locate(type_id);
- if (p) {
- dlog("Discarding earlier rpc fwd handle");
- fwd_free(p);
- }
- } else {
- dlog("Allocating a new xid...");
- type_id = MK_RPC_XID(type_id, XID_ALLOC());
- }
-
- p = fwd_alloc();
- if (!p)
- return ENOBUFS;
-
- error = 0;
-
- pkt_int = (u_int *) pkt;
-
- /*
- * Get the original packet id
- */
- p->rf_oldid = ntohl(*pkt_int);
-
- /*
- * Replace with newly allocated id
- */
- p->rf_xid = type_id;
- *pkt_int = htonl(type_id);
-
- /*
- * The sendto may fail if, for example, the route
- * to a remote host is lost because an intermediate
- * gateway has gone down. Important to fill in the
- * rest of "p" otherwise nasty things happen later...
- */
-#ifdef DEBUG
- {
- char dq[20];
- if (p && fwdto)
- dlog("Sending packet id %#x to %s:%d",
- p->rf_xid,
- inet_dquad(dq, sizeof(dq), fwdto->sin_addr.s_addr),
- ntohs(fwdto->sin_port));
- }
-#endif /* DEBUG */
-
- /* if NULL, remote server probably down */
- if (!fwdto) {
- error = AM_ERRNO_HOST_DOWN;
- goto out;
- }
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- ud.addr.buf = (char *) fwdto;
- if (fwdto) /* if NULL, set sizes to zero */
- ud.addr.maxlen = ud.addr.len = sizeof(struct sockaddr_in);
- else
- ud.addr.maxlen = ud.addr.len = 0;
- ud.opt.buf = (char *) NULL;
- ud.opt.maxlen = ud.opt.len = 0;
- ud.udata.buf = pkt;
- ud.udata.maxlen = ud.udata.len = len;
- if (t_sndudata(fwd_sock, &ud) < 0) {
- plog(XLOG_ERROR,"fwd_packet failed: t_errno=%d, errno=%d",t_errno,errno);
- error = errno;
- }
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- if (sendto(fwd_sock, (char *) pkt, len, 0,
- (struct sockaddr *) fwdto, sizeof(*fwdto)) < 0)
- error = errno;
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*
- * Save callback function and return address
- */
-out:
- p->rf_fwd = cb;
- if (replyto)
- p->rf_sin = *replyto;
- else
- memset((voidp) &p->rf_sin, 0, sizeof(p->rf_sin));
- p->rf_ptr = cb_arg;
-
- return error;
-}
-
-
-/*
- * Called when some data arrives on the forwarding socket
- */
-void
-fwd_reply(void)
-{
- int len;
- u_int pkt[MAX_PACKET_SIZE / sizeof(u_int) + 1];
- u_int *pkt_int;
- u_int pkt_xid;
- int rc;
- rpc_forward *p;
- struct sockaddr_in src_addr;
- RECVFROM_FROMLEN_TYPE src_addr_len;
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- struct t_unitdata ud;
- int flags = 0;
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
- /*
- * Determine the length of the packet
- */
- len = MAX_PACKET_SIZE;
-
- /*
- * Read the packet and check for validity
- */
-again:
- src_addr_len = sizeof(src_addr);
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- ud.addr.buf = (char *) &src_addr;
- ud.addr.maxlen = ud.addr.len = src_addr_len;
- ud.opt.buf = (char *) NULL;
- ud.opt.maxlen = ud.opt.len = 0;
- ud.udata.buf = (char *) pkt;
- ud.udata.maxlen = ud.udata.len = len;
- /* XXX: use flags accordingly such as if T_MORE set */
- rc = t_rcvudata(fwd_sock, &ud, &flags);
- if (rc == 0) /* success, reset rc to length */
- rc = ud.udata.len;
- else {
- plog(XLOG_ERROR,"fwd_reply failed: t_errno=%d, errno=%d, flags=%d",t_errno,errno, flags);
- /*
- * Clear error indication, otherwise the error condition persists and
- * amd gets into an infinite loop.
- */
- if (t_errno == TLOOK)
- t_rcvuderr(fwd_sock, NULL);
- }
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- rc = recvfrom(fwd_sock,
- (char *) pkt,
- len,
- 0,
- (struct sockaddr *) &src_addr,
- &src_addr_len);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*
- * XXX: in svr4, if the T_MORE bit of flags is set, what do
- * we then do? -Erez
- */
- if (rc < 0 || src_addr_len != sizeof(src_addr) ||
- src_addr.sin_family != AF_INET) {
- if (rc < 0 && errno == EINTR)
- goto again;
- plog(XLOG_ERROR, "Error reading RPC reply: %m");
- goto out;
- }
-
- /*
- * Do no more work if finishing soon
- */
- if ((int) amd_state >= (int) Finishing)
- goto out;
-
- /*
- * Find packet reference
- */
- pkt_int = (u_int *) pkt;
- pkt_xid = ntohl(*pkt_int);
-
- switch (pkt_xid & RPC_XID_MASK) {
- case RPC_XID_PORTMAP:
- dlog("Receiving PORTMAP reply %#x", pkt_xid);
- break;
- case RPC_XID_MOUNTD:
- dlog("Receiving MOUNTD reply %#x", pkt_xid);
- break;
- case RPC_XID_NFSPING:
- dlog("Receiving NFS ping %#x", pkt_xid);
- break;
- case RPC_XID_WEBNFS:
- dlog("Receiving WebNFS lookup %#x", pkt_xid);
- break;
- default:
- dlog("UNKNOWN RPC XID %#x", pkt_xid);
- break;
- }
-
- p = fwd_locate(pkt_xid);
- if (!p) {
- dlog("Can't forward reply id %#x", pkt_xid);
- goto out;
- }
-
- if (p->rf_fwd) {
- /*
- * Put the original message id back
- * into the packet.
- */
- *pkt_int = htonl(p->rf_oldid);
-
- /*
- * Call forwarding function
- */
- (*p->rf_fwd) ((voidp) pkt, rc, &src_addr, &p->rf_sin, p->rf_ptr, TRUE);
- }
-
- /*
- * Free forwarding info
- */
- fwd_free(p);
-
-out:;
-}
diff --git a/contrib/amd/amd/sched.c b/contrib/amd/amd/sched.c
deleted file mode 100644
index 8efe57a3ab81..000000000000
--- a/contrib/amd/amd/sched.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/sched.c
- *
- */
-
-/*
- * Process scheduler
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-
-typedef struct pjob pjob;
-
-struct pjob {
- qelem hdr; /* Linked list */
- int pid; /* Process ID of job */
- cb_fun *cb_fun; /* Callback function */
- opaque_t cb_arg; /* Argument for callback */
- int w; /* everyone these days uses int, not a "union wait" */
- wchan_t wchan; /* Wait channel */
-};
-
-/* globals */
-qelem proc_list_head = {&proc_list_head, &proc_list_head};
-qelem proc_wait_list = {&proc_wait_list, &proc_wait_list};
-int task_notify_todo;
-
-
-void
-ins_que(qelem *elem, qelem *pred)
-{
- qelem *p = pred->q_forw;
-
- elem->q_back = pred;
- elem->q_forw = p;
- pred->q_forw = elem;
- p->q_back = elem;
-}
-
-
-void
-rem_que(qelem *elem)
-{
- qelem *p = elem->q_forw;
- qelem *p2 = elem->q_back;
-
- p2->q_forw = p;
- p->q_back = p2;
-}
-
-
-static pjob *
-sched_job(cb_fun *cf, opaque_t ca)
-{
- pjob *p = ALLOC(struct pjob);
-
- p->cb_fun = cf;
- p->cb_arg = ca;
-
- /*
- * Now place on wait queue
- */
- ins_que(&p->hdr, &proc_wait_list);
-
- return p;
-}
-
-
-/*
- * tf: The task to execute (ta is its arguments)
- * cf: Continuation function (ca is its arguments)
- */
-void
-run_task(task_fun *tf, opaque_t ta, cb_fun *cf, opaque_t ca)
-{
- pjob *p = sched_job(cf, ca);
-#ifdef HAVE_SIGACTION
- sigset_t new, mask;
-#else /* not HAVE_SIGACTION */
- int mask;
-#endif /* not HAVE_SIGACTION */
-
- p->wchan = (wchan_t) p;
-
-#ifdef HAVE_SIGACTION
- sigemptyset(&new); /* initialize signal set we wish to block */
- sigaddset(&new, SIGCHLD); /* only block on SIGCHLD */
- sigprocmask(SIG_BLOCK, &new, &mask);
-#else /* not HAVE_SIGACTION */
- mask = sigblock(sigmask(SIGCHLD));
-#endif /* not HAVE_SIGACTION */
-
- if ((p->pid = background())) {
-#ifdef HAVE_SIGACTION
- sigprocmask(SIG_SETMASK, &mask, NULL);
-#else /* not HAVE_SIGACTION */
- sigsetmask(mask);
-#endif /* not HAVE_SIGACTION */
- return;
- }
-
- /* child code runs here, parent has returned to caller */
-
- exit((*tf) (ta));
- /* firewall... */
- abort();
-}
-
-
-/*
- * Schedule a task to be run when woken up
- */
-void
-sched_task(cb_fun *cf, opaque_t ca, wchan_t wchan)
-{
- /*
- * Allocate a new task
- */
- pjob *p = sched_job(cf, ca);
-
- dlog("SLEEP on %p", wchan);
- p->wchan = wchan;
- p->pid = 0;
- p->w = 0; /* was memset (when ->w was union) */
-}
-
-
-static void
-wakeupjob(pjob *p)
-{
- rem_que(&p->hdr);
- ins_que(&p->hdr, &proc_list_head);
- task_notify_todo++;
-}
-
-
-void
-wakeup(wchan_t wchan)
-{
- pjob *p, *p2;
-
- if (!foreground)
- return;
-
- /*
- * Can't use ITER() here because
- * wakeupjob() juggles the list.
- */
- for (p = AM_FIRST(pjob, &proc_wait_list);
- p2 = NEXT(pjob, p), p != HEAD(pjob, &proc_wait_list);
- p = p2) {
- if (p->wchan == wchan) {
- wakeupjob(p);
- }
- }
-}
-
-
-void
-wakeup_task(int rc, int term, wchan_t wchan)
-{
- wakeup(wchan);
-}
-
-
-wchan_t
-get_mntfs_wchan(mntfs *mf)
-{
- if (mf &&
- mf->mf_ops &&
- mf->mf_ops->get_wchan)
- return mf->mf_ops->get_wchan(mf);
- return mf;
-}
-
-
-/*
- * Run any pending tasks.
- * This must be called with SIGCHLD disabled
- */
-void
-do_task_notify(void)
-{
- /*
- * Keep taking the first item off the list and processing it.
- *
- * Done this way because the callback can, quite reasonably,
- * queue a new task, so no local reference into the list can be
- * held here.
- */
- while (AM_FIRST(pjob, &proc_list_head) != HEAD(pjob, &proc_list_head)) {
- pjob *p = AM_FIRST(pjob, &proc_list_head);
- rem_que(&p->hdr);
- /*
- * This job has completed
- */
- --task_notify_todo;
-
- /*
- * Do callback if it exists
- */
- if (p->cb_fun) {
- /* these two trigraphs will ensure compatibility with strict POSIX.1 */
- p->cb_fun(WIFEXITED(p->w) ? WEXITSTATUS(p->w) : 0,
- WIFSIGNALED(p->w) ? WTERMSIG(p->w) : 0,
- p->cb_arg);
- }
- XFREE(p);
- }
-}
-
-
-RETSIGTYPE
-sigchld(int sig)
-{
- int w; /* everyone these days uses int, not a "union wait" */
- int pid;
-
-#ifdef HAVE_WAITPID
- while ((pid = waitpid((pid_t) -1, &w, WNOHANG)) > 0) {
-#else /* not HAVE_WAITPID */
- while ((pid = wait3( &w, WNOHANG, (struct rusage *) 0)) > 0) {
-#endif /* not HAVE_WAITPID */
- pjob *p, *p2;
-
- if (WIFSIGNALED(w))
- plog(XLOG_ERROR, "Process %d exited with signal %d",
- pid, WTERMSIG(w));
- else
- dlog("Process %d exited with status %d",
- pid, WEXITSTATUS(w));
-
- for (p = AM_FIRST(pjob, &proc_wait_list);
- p2 = NEXT(pjob, p), p != HEAD(pjob, &proc_wait_list);
- p = p2) {
- if (p->pid == pid) {
- p->w = w;
- wakeupjob(p);
- break;
- }
- } /* end of for loop */
-
- if (p == HEAD(pjob, &proc_wait_list))
- dlog("can't locate task block for pid %d", pid);
-
- /*
- * Must count down children inside the while loop, otherwise we won't
- * count them all, and NumChildren (and later backoff) will be set
- * incorrectly. SH/RUNIT 940519.
- */
- if (--NumChildren < 0)
- NumChildren = 0;
- } /* end of "while wait..." loop */
-
-#ifdef REINSTALL_SIGNAL_HANDLER
- signal(sig, sigchld);
-#endif /* REINSTALL_SIGNAL_HANDLER */
-
- if (select_intr_valid)
- longjmp(select_intr, sig);
-}
diff --git a/contrib/amd/amd/srvr_amfs_auto.c b/contrib/amd/amd/srvr_amfs_auto.c
deleted file mode 100644
index 4742cf6f750d..000000000000
--- a/contrib/amd/amd/srvr_amfs_auto.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/srvr_amfs_auto.c
- *
- */
-
-/*
- * Automount FS server ("localhost") modeling
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/* globals */
-
-/* statics */
-static qelem amfs_auto_srvr_list = {&amfs_auto_srvr_list, &amfs_auto_srvr_list};
-static fserver *localhost;
-
-
-/*
- * Find an nfs server for the local host
- */
-fserver *
-amfs_generic_find_srvr(mntfs *mf)
-{
- fserver *fs = localhost;
-
- if (!fs) {
- fs = ALLOC(struct fserver);
- fs->fs_refc = 0;
- fs->fs_host = strdup("localhost");
- fs->fs_ip = 0;
- fs->fs_cid = 0;
- fs->fs_pinger = AM_PINGER;
- fs->fs_flags = FSF_VALID | FSF_PING_UNINIT;
- fs->fs_type = "local";
- fs->fs_private = 0;
- fs->fs_prfree = 0;
-
- ins_que(&fs->fs_q, &amfs_auto_srvr_list);
-
- srvrlog(fs, "starts up");
-
- localhost = fs;
- }
- fs->fs_refc++;
-
- return fs;
-}
-
-
-/*****************************************************************************
- *** GENERIC ROUTINES FOLLOW
- *****************************************************************************/
-
-/*
- * Wakeup anything waiting for this server
- */
-void
-wakeup_srvr(fserver *fs)
-{
- fs->fs_flags &= ~FSF_WANT;
- wakeup((voidp) fs);
-}
-
-
-/*
- * Called when final ttl of server has expired
- */
-static void
-timeout_srvr(voidp v)
-{
- fserver *fs = v;
-
- /*
- * If the reference count is still zero then
- * we are free to remove this node
- */
- if (fs->fs_refc == 0) {
- dlog("Deleting file server %s", fs->fs_host);
- if (fs->fs_flags & FSF_WANT)
- wakeup_srvr(fs);
-
- /*
- * Remove from queue.
- */
- rem_que(&fs->fs_q);
- /*
- * (Possibly) call the private free routine.
- */
- if (fs->fs_private && fs->fs_prfree)
- (*fs->fs_prfree) (fs->fs_private);
-
- /*
- * Free the net address
- */
- if (fs->fs_ip)
- XFREE(fs->fs_ip);
-
- /*
- * Free the host name.
- */
- XFREE(fs->fs_host);
-
- /*
- * Discard the fserver object.
- */
- XFREE(fs);
- }
-}
-
-
-/*
- * Free a file server
- */
-void
-free_srvr(fserver *fs)
-{
- if (--fs->fs_refc == 0) {
- /*
- * The reference count is now zero,
- * so arrange for this node to be
- * removed in AM_TTL seconds if no
- * other mntfs is referencing it.
- */
- int ttl = (FSRV_ERROR(fs) || FSRV_ISDOWN(fs)) ? 19 : AM_TTL;
-
- dlog("Last hard reference to file server %s - will timeout in %ds", fs->fs_host, ttl);
- if (fs->fs_cid) {
- untimeout(fs->fs_cid);
- /*
- * Turn off pinging - XXX
- */
- fs->fs_flags &= ~FSF_PINGING;
- }
-
- /*
- * Keep structure lying around for a while
- */
- fs->fs_cid = timeout(ttl, timeout_srvr, (voidp) fs);
-
- /*
- * Mark the fileserver down and invalid again
- */
- fs->fs_flags &= ~FSF_VALID;
- fs->fs_flags |= FSF_DOWN;
- }
-}
-
-
-/*
- * Make a duplicate fserver reference
- */
-fserver *
-dup_srvr(fserver *fs)
-{
- fs->fs_refc++;
- return fs;
-}
-
-
-/*
- * Log state change
- */
-void
-srvrlog(fserver *fs, char *state)
-{
- plog(XLOG_INFO, "file server %s, type %s, state %s", fs->fs_host, fs->fs_type, state);
-}
diff --git a/contrib/amd/amd/srvr_nfs.c b/contrib/amd/amd/srvr_nfs.c
deleted file mode 100644
index 0c74a658e5ee..000000000000
--- a/contrib/amd/amd/srvr_nfs.c
+++ /dev/null
@@ -1,1042 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amd/srvr_nfs.c
- *
- */
-
-/*
- * NFS server modeling
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amd.h>
-
-/*
- * Number of pings allowed to fail before host is declared down
- * - three-fifths of the allowed mount time...
- */
-#define MAX_ALLOWED_PINGS (3 + /* for luck ... */ 1)
-
-/*
- * How often to ping when starting a new server
- */
-#define FAST_NFS_PING 3
-
-#if (FAST_NFS_PING * MAX_ALLOWED_PINGS) >= ALLOWED_MOUNT_TIME
-# error: sanity check failed in srvr_nfs.c
-/*
- * you cannot do things this way...
- * sufficient fast pings must be given the chance to fail
- * within the allowed mount time
- */
-#endif /* (FAST_NFS_PING * MAX_ALLOWED_PINGS) >= ALLOWED_MOUNT_TIME */
-
-/* structures and typedefs */
-typedef struct nfs_private {
- u_short np_mountd; /* Mount daemon port number */
- char np_mountd_inval; /* Port *may* be invalid */
- int np_ping; /* Number of failed ping attempts */
- time_t np_ttl; /* Time when server is thought dead */
- int np_xid; /* RPC transaction id for pings */
- int np_error; /* Error during portmap request */
-} nfs_private;
-
-/* globals */
-qelem nfs_srvr_list = {&nfs_srvr_list, &nfs_srvr_list};
-
-/* statics */
-static int global_xid; /* For NFS pings */
-#define XID_ALLOC() (++global_xid)
-
-#ifdef HAVE_FS_NFS3
-# define NUM_NFS_VERS 2
-#else /* not HAVE_FS_NFS3 */
-# define NUM_NFS_VERS 1
-#endif /* not HAVE_FS_NFS3 */
-static int ping_len[NUM_NFS_VERS];
-static char ping_buf[NUM_NFS_VERS][sizeof(struct rpc_msg) + 32];
-
-#if defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3)
-/*
- * Protocols we know about, in order of preference.
- *
- * Note that Solaris 8 and newer NetBSD systems are switching to UDP first,
- * so this order may have to be adjusted for Amd in the future once more
- * vendors make that change. -Erez 11/24/2000
- *
- * Or we might simply make this is a platform-specific order. -Ion 09/13/2003
- */
-static char *protocols[] = { "tcp", "udp", NULL };
-#endif /* defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3) */
-
-/* forward definitions */
-static void nfs_keepalive(voidp);
-
-
-/*
- * Flush cached data for an fserver (or for all, if fs==NULL)
- */
-void
-flush_srvr_nfs_cache(fserver *fs)
-{
- fserver *fs2 = NULL;
-
- ITER(fs2, fserver, &nfs_srvr_list) {
- if (fs == NULL || fs == fs2) {
- nfs_private *np = (nfs_private *) fs2->fs_private;
- if (np) {
- np->np_mountd_inval = TRUE;
- np->np_error = -1;
- }
- }
- }
-}
-
-
-/*
- * Startup the NFS ping for a particular version.
- */
-static void
-create_ping_payload(u_long nfs_version)
-{
- XDR ping_xdr;
- struct rpc_msg ping_msg;
-
- /*
- * Non nfs mounts like /afs/glue.umd.edu have ended up here.
- */
- if (nfs_version == 0) {
- nfs_version = NFS_VERSION;
- plog(XLOG_WARNING, "create_ping_payload: nfs_version = 0, changed to 2");
- } else
- plog(XLOG_INFO, "create_ping_payload: nfs_version: %d", (int) nfs_version);
-
- rpc_msg_init(&ping_msg, NFS_PROGRAM, nfs_version, NFSPROC_NULL);
-
- /*
- * Create an XDR endpoint
- */
- xdrmem_create(&ping_xdr, ping_buf[nfs_version - NFS_VERSION], sizeof(ping_buf[0]), XDR_ENCODE);
-
- /*
- * Create the NFS ping message
- */
- if (!xdr_callmsg(&ping_xdr, &ping_msg)) {
- plog(XLOG_ERROR, "Couldn't create ping RPC message");
- going_down(3);
- }
- /*
- * Find out how long it is
- */
- ping_len[nfs_version - NFS_VERSION] = xdr_getpos(&ping_xdr);
-
- /*
- * Destroy the XDR endpoint - we don't need it anymore
- */
- xdr_destroy(&ping_xdr);
-}
-
-
-/*
- * Called when a portmap reply arrives
- */
-static void
-got_portmap(voidp pkt, int len, struct sockaddr_in *sa, struct sockaddr_in *ia, voidp idv, int done)
-{
- fserver *fs2 = (fserver *) idv;
- fserver *fs = 0;
-
- /*
- * Find which fileserver we are talking about
- */
- ITER(fs, fserver, &nfs_srvr_list)
- if (fs == fs2)
- break;
-
- if (fs == fs2) {
- u_long port = 0; /* XXX - should be short but protocol is naff */
- int error = done ? pickup_rpc_reply(pkt, len, (voidp) &port, (XDRPROC_T_TYPE) xdr_u_long) : -1;
- nfs_private *np = (nfs_private *) fs->fs_private;
-
- if (!error && port) {
- dlog("got port (%d) for mountd on %s", (int) port, fs->fs_host);
- /*
- * Grab the port number. Portmap sends back
- * an u_long in native ordering, so it
- * needs converting to a u_short in
- * network ordering.
- */
- np->np_mountd = htons((u_short) port);
- np->np_mountd_inval = FALSE;
- np->np_error = 0;
- } else {
- dlog("Error fetching port for mountd on %s", fs->fs_host);
- dlog("\t error=%d, port=%d", error, (int) port);
- /*
- * Almost certainly no mountd running on remote host
- */
- np->np_error = error ? error : ETIMEDOUT;
- }
-
- if (fs->fs_flags & FSF_WANT)
- wakeup_srvr(fs);
- } else if (done) {
- dlog("Got portmap for old port request");
- } else {
- dlog("portmap request timed out");
- }
-}
-
-
-/*
- * Obtain portmap information
- */
-static int
-call_portmap(fserver *fs, AUTH *auth, u_long prog, u_long vers, u_long prot)
-{
- struct rpc_msg pmap_msg;
- int len;
- char iobuf[UDPMSGSIZE];
- int error;
- struct pmap pmap;
-
- rpc_msg_init(&pmap_msg, PMAPPROG, PMAPVERS, PMAPPROC_NULL);
- pmap.pm_prog = prog;
- pmap.pm_vers = vers;
- pmap.pm_prot = prot;
- pmap.pm_port = 0;
- len = make_rpc_packet(iobuf,
- sizeof(iobuf),
- PMAPPROC_GETPORT,
- &pmap_msg,
- (voidp) &pmap,
- (XDRPROC_T_TYPE) xdr_pmap,
- auth);
- if (len > 0) {
- struct sockaddr_in sin;
- memset((voidp) &sin, 0, sizeof(sin));
- sin = *fs->fs_ip;
- sin.sin_port = htons(PMAPPORT);
- error = fwd_packet(RPC_XID_PORTMAP, iobuf, len,
- &sin, &sin, (voidp) fs, got_portmap);
- } else {
- error = -len;
- }
-
- return error;
-}
-
-
-static void
-recompute_portmap(fserver *fs)
-{
- int error;
- u_long mnt_version;
-
- /*
- * No portmap calls for pure WebNFS servers.
- */
- if (fs->fs_flags & FSF_WEBNFS)
- return;
-
- if (nfs_auth)
- error = 0;
- else
- error = make_nfs_auth();
-
- if (error) {
- nfs_private *np = (nfs_private *) fs->fs_private;
- np->np_error = error;
- return;
- }
-
- if (fs->fs_version == 0)
- plog(XLOG_WARNING, "recompute_portmap: nfs_version = 0 fixed");
-
- plog(XLOG_INFO, "recompute_portmap: NFS version %d on %s",
- (int) fs->fs_version, fs->fs_host);
-#ifdef HAVE_FS_NFS3
- if (fs->fs_version == NFS_VERSION3)
- mnt_version = AM_MOUNTVERS3;
- else
-#endif /* HAVE_FS_NFS3 */
- mnt_version = MOUNTVERS;
-
- plog(XLOG_INFO, "Using MOUNT version: %d", (int) mnt_version);
- call_portmap(fs, nfs_auth, MOUNTPROG, mnt_version, (u_long) IPPROTO_UDP);
-}
-
-
-int
-get_mountd_port(fserver *fs, u_short *port, wchan_t wchan)
-{
- int error = -1;
- if (FSRV_ISDOWN(fs))
- return EWOULDBLOCK;
-
- if (FSRV_ISUP(fs)) {
- nfs_private *np = (nfs_private *) fs->fs_private;
- if (np->np_error == 0) {
- *port = np->np_mountd;
- error = 0;
- } else {
- error = np->np_error;
- }
- /*
- * Now go get the port mapping again in case it changed.
- * Note that it is used even if (np_mountd_inval)
- * is True. The flag is used simply as an
- * indication that the mountd may be invalid, not
- * that it is known to be invalid.
- */
- if (np->np_mountd_inval)
- recompute_portmap(fs);
- else
- np->np_mountd_inval = TRUE;
- }
- if (error < 0 && wchan && !(fs->fs_flags & FSF_WANT)) {
- /*
- * If a wait channel is supplied, and no
- * error has yet occurred, then arrange
- * that a wakeup is done on the wait channel,
- * whenever a wakeup is done on this fs node.
- * Wakeup's are done on the fs node whenever
- * it changes state - thus causing control to
- * come back here and new, better things to happen.
- */
- fs->fs_flags |= FSF_WANT;
- sched_task(wakeup_task, wchan, (wchan_t) fs);
- }
- return error;
-}
-
-
-/*
- * This is called when we get a reply to an RPC ping.
- * The value of id was taken from the nfs_private
- * structure when the ping was transmitted.
- */
-static void
-nfs_keepalive_callback(voidp pkt, int len, struct sockaddr_in *sp, struct sockaddr_in *tsp, voidp idv, int done)
-{
- int xid = (long) idv; /* cast needed for 64-bit archs */
- fserver *fs;
- int found_map = 0;
-
- if (!done)
- return;
-
- /*
- * For each node...
- */
- ITER(fs, fserver, &nfs_srvr_list) {
- nfs_private *np = (nfs_private *) fs->fs_private;
- if (np->np_xid == xid && (fs->fs_flags & FSF_PINGING)) {
- /*
- * Reset the ping counter.
- * Update the keepalive timer.
- * Log what happened.
- */
- if (fs->fs_flags & FSF_DOWN) {
- fs->fs_flags &= ~FSF_DOWN;
- if (fs->fs_flags & FSF_VALID) {
- srvrlog(fs, "is up");
- } else {
- if (np->np_ping > 1)
- srvrlog(fs, "ok");
- else
- srvrlog(fs, "starts up");
- fs->fs_flags |= FSF_VALID;
- }
-
- map_flush_srvr(fs);
- } else {
- if (fs->fs_flags & FSF_VALID) {
- dlog("file server %s type nfs is still up", fs->fs_host);
- } else {
- if (np->np_ping > 1)
- srvrlog(fs, "ok");
- fs->fs_flags |= FSF_VALID;
- }
- }
-
- /*
- * Adjust ping interval
- */
- untimeout(fs->fs_cid);
- fs->fs_cid = timeout(fs->fs_pinger, nfs_keepalive, (voidp) fs);
-
- /*
- * Update ttl for this server
- */
- np->np_ttl = clocktime(NULL) +
- (MAX_ALLOWED_PINGS - 1) * FAST_NFS_PING + fs->fs_pinger - 1;
-
- /*
- * New RPC xid...
- */
- np->np_xid = XID_ALLOC();
-
- /*
- * Failed pings is zero...
- */
- np->np_ping = 0;
-
- /*
- * Recompute portmap information if not known
- */
- if (np->np_mountd_inval)
- recompute_portmap(fs);
-
- found_map++;
- break;
- }
- }
-
- if (found_map == 0)
- dlog("Spurious ping packet");
-}
-
-
-static void
-check_fs_addr_change(fserver *fs)
-{
- struct hostent *hp = NULL;
- struct in_addr ia;
- char *old_ipaddr, *new_ipaddr;
-
- hp = gethostbyname(fs->fs_host);
- if (!hp ||
- hp->h_addrtype != AF_INET ||
- !STREQ((char *) hp->h_name, fs->fs_host) ||
- memcmp((voidp) &fs->fs_ip->sin_addr,
- (voidp) hp->h_addr,
- sizeof(fs->fs_ip->sin_addr)) == 0)
- return;
- /* if got here: downed server changed IP address */
- old_ipaddr = strdup(inet_ntoa(fs->fs_ip->sin_addr));
- memmove((voidp) &ia, (voidp) hp->h_addr, sizeof(struct in_addr));
- new_ipaddr = inet_ntoa(ia); /* ntoa uses static buf */
- plog(XLOG_WARNING, "EZK: down fileserver %s changed ip: %s -> %s",
- fs->fs_host, old_ipaddr, new_ipaddr);
- XFREE(old_ipaddr);
- /* copy new IP addr */
- memmove((voidp) &fs->fs_ip->sin_addr,
- (voidp) hp->h_addr,
- sizeof(fs->fs_ip->sin_addr));
- /* XXX: do we need to un/set these flags? */
- fs->fs_flags &= ~FSF_DOWN;
- fs->fs_flags |= FSF_VALID | FSF_WANT;
- map_flush_srvr(fs); /* XXX: a race with flush_srvr_nfs_cache? */
- flush_srvr_nfs_cache(fs);
- fs->fs_flags |= FSF_FORCE_UNMOUNT;
-
-#if 0
- flush_nfs_fhandle_cache(fs); /* done in caller: nfs_keepalive_timeout */
- /* XXX: need to purge nfs_private so that somehow it will get re-initialized? */
-#endif
-}
-
-
-/*
- * Called when no ping-reply received
- */
-static void
-nfs_keepalive_timeout(voidp v)
-{
- fserver *fs = v;
- nfs_private *np = (nfs_private *) fs->fs_private;
-
- /*
- * Another ping has failed
- */
- np->np_ping++;
- if (np->np_ping > 1)
- srvrlog(fs, "not responding");
-
- /*
- * Not known to be up any longer
- */
- if (FSRV_ISUP(fs))
- fs->fs_flags &= ~FSF_VALID;
-
- /*
- * If ttl has expired then guess that it is dead
- */
- if (np->np_ttl < clocktime(NULL)) {
- int oflags = fs->fs_flags;
- dlog("ttl has expired");
- if ((fs->fs_flags & FSF_DOWN) == 0) {
- /*
- * Server was up, but is now down.
- */
- srvrlog(fs, "is down");
- fs->fs_flags |= FSF_DOWN | FSF_VALID;
- /*
- * Since the server is down, the portmap
- * information may now be wrong, so it
- * must be flushed from the local cache
- */
- flush_nfs_fhandle_cache(fs);
- np->np_error = -1;
- check_fs_addr_change(fs); /* check if IP addr of fserver changed */
- } else {
- /*
- * Known to be down
- */
- if ((fs->fs_flags & FSF_VALID) == 0)
- srvrlog(fs, "starts down");
- fs->fs_flags |= FSF_VALID;
- }
- if (oflags != fs->fs_flags && (fs->fs_flags & FSF_WANT))
- wakeup_srvr(fs);
- /*
- * Reset failed ping count
- */
- np->np_ping = 0;
- } else {
- if (np->np_ping > 1)
- dlog("%d pings to %s failed - at most %d allowed", np->np_ping, fs->fs_host, MAX_ALLOWED_PINGS);
- }
-
- /*
- * New RPC xid, so any late responses to the previous ping
- * get ignored...
- */
- np->np_xid = XID_ALLOC();
-
- /*
- * Run keepalive again
- */
- nfs_keepalive(fs);
-}
-
-
-/*
- * Keep track of whether a server is alive
- */
-static void
-nfs_keepalive(voidp v)
-{
- fserver *fs = v;
- int error;
- nfs_private *np = (nfs_private *) fs->fs_private;
- int fstimeo = -1;
-
- /*
- * Send an NFS ping to this node
- */
-
- if (ping_len[fs->fs_version - NFS_VERSION] == 0)
- create_ping_payload(fs->fs_version);
-
- /*
- * Queue the packet...
- */
- error = fwd_packet(MK_RPC_XID(RPC_XID_NFSPING, np->np_xid),
- ping_buf[fs->fs_version - NFS_VERSION],
- ping_len[fs->fs_version - NFS_VERSION],
- fs->fs_ip,
- (struct sockaddr_in *) 0,
- (voidp) ((long) np->np_xid), /* cast needed for 64-bit archs */
- nfs_keepalive_callback);
-
- /*
- * See if a hard error occurred
- */
- switch (error) {
- case ENETDOWN:
- case ENETUNREACH:
- case EHOSTDOWN:
- case EHOSTUNREACH:
- np->np_ping = MAX_ALLOWED_PINGS; /* immediately down */
- np->np_ttl = (time_t) 0;
- /*
- * This causes an immediate call to nfs_keepalive_timeout
- * whenever the server was thought to be up.
- * See +++ below.
- */
- fstimeo = 0;
- break;
-
- case 0:
- dlog("Sent NFS ping to %s", fs->fs_host);
- break;
- }
-
- /*
- * Back off the ping interval if we are not getting replies and
- * the remote system is known to be down.
- */
- switch (fs->fs_flags & (FSF_DOWN | FSF_VALID)) {
- case FSF_VALID: /* Up */
- if (fstimeo < 0) /* +++ see above */
- fstimeo = FAST_NFS_PING;
- break;
-
- case FSF_VALID | FSF_DOWN: /* Down */
- fstimeo = fs->fs_pinger;
- break;
-
- default: /* Unknown */
- fstimeo = FAST_NFS_PING;
- break;
- }
-
- dlog("NFS timeout in %d seconds", fstimeo);
-
- fs->fs_cid = timeout(fstimeo, nfs_keepalive_timeout, (voidp) fs);
-}
-
-
-static void
-start_nfs_pings(fserver *fs, int pingval)
-{
- if (pingval == 0) /* could be because ping mnt option not found */
- pingval = AM_PINGER;
- /* if pings haven't been initalized, then init them for first time */
- if (fs->fs_flags & FSF_PING_UNINIT) {
- fs->fs_flags &= ~FSF_PING_UNINIT;
- plog(XLOG_INFO, "initializing %s's pinger to %d sec", fs->fs_host, pingval);
- goto do_pings;
- }
-
- if ((fs->fs_flags & FSF_PINGING) && fs->fs_pinger == pingval) {
- dlog("already running pings to %s", fs->fs_host);
- return;
- }
-
- /* if got here, then we need to update the ping value */
- plog(XLOG_INFO, "changing %s's ping value from %d%s to %d%s",
- fs->fs_host,
- fs->fs_pinger, (fs->fs_pinger < 0 ? " (off)" : ""),
- pingval, (pingval < 0 ? " (off)" : ""));
- do_pings:
- fs->fs_pinger = pingval;
-
- if (fs->fs_cid)
- untimeout(fs->fs_cid);
- if (pingval < 0) {
- srvrlog(fs, "wired up (pings disabled)");
- fs->fs_flags |= FSF_VALID;
- fs->fs_flags &= ~FSF_DOWN;
- } else {
- fs->fs_flags |= FSF_PINGING;
- nfs_keepalive(fs);
- }
-}
-
-
-/*
- * Find an nfs server for a host.
- */
-fserver *
-find_nfs_srvr(mntfs *mf)
-{
- char *host = mf->mf_fo->opt_rhost;
- fserver *fs;
- int pingval;
- mntent_t mnt;
- nfs_private *np;
- struct hostent *hp = NULL;
- struct sockaddr_in *ip = NULL;
- u_long nfs_version = 0; /* default is no version specified */
- u_long best_nfs_version = 0;
- char *nfs_proto = NULL; /* no IP protocol either */
- int nfs_port = 0;
- int nfs_port_opt = 0;
- int fserver_is_down = 0;
-
- /*
- * Get ping interval from mount options.
- * Current only used to decide whether pings
- * are required or not. < 0 = no pings.
- */
- mnt.mnt_opts = mf->mf_mopts;
- pingval = hasmntval(&mnt, "ping");
-
- if (mf->mf_flags & MFF_NFS_SCALEDOWN) {
- /*
- * the server granted us a filehandle, but we were unable to mount it.
- * therefore, scale down to NFSv2/UDP and try again.
- */
- nfs_version = NFS_VERSION;
- nfs_proto = "udp";
- plog(XLOG_WARNING, "find_nfs_srvr: NFS mount failed, trying again with NFSv2/UDP");
- mf->mf_flags &= ~MFF_NFS_SCALEDOWN;
- } else {
- /*
- * Get the NFS version from the mount options. This is used
- * to decide the highest NFS version to try.
- */
-#ifdef MNTTAB_OPT_VERS
- nfs_version = hasmntval(&mnt, MNTTAB_OPT_VERS);
-#endif /* MNTTAB_OPT_VERS */
-
-#ifdef MNTTAB_OPT_PROTO
- {
- char *proto_opt = hasmnteq(&mnt, MNTTAB_OPT_PROTO);
- if (proto_opt) {
- char **p;
- for (p = protocols; *p; p++)
- if (NSTREQ(proto_opt, *p, strlen(*p))) {
- nfs_proto = *p;
- break;
- }
- if (*p == NULL)
- plog(XLOG_WARNING, "ignoring unknown protocol option for %s:%s",
- host, mf->mf_fo->opt_rfs);
- }
- }
-#endif /* MNTTAB_OPT_PROTO */
-
-#ifdef HAVE_NFS_NFSV2_H
- /* allow overriding if nfsv2 option is specified in mount options */
- if (amu_hasmntopt(&mnt, "nfsv2")) {
- nfs_version = NFS_VERSION;/* nullify any ``vers=X'' statements */
- nfs_proto = "udp"; /* nullify any ``proto=tcp'' statements */
- plog(XLOG_WARNING, "found compatibility option \"nfsv2\": set options vers=2,proto=udp for host %s", host);
- }
-#endif /* HAVE_NFS_NFSV2_H */
-
- /* check if we've globally overridden the NFS version/protocol */
- if (gopt.nfs_vers) {
- nfs_version = gopt.nfs_vers;
- plog(XLOG_INFO, "find_nfs_srvr: force NFS version to %d",
- (int) nfs_version);
- }
- if (gopt.nfs_proto) {
- nfs_proto = gopt.nfs_proto;
- plog(XLOG_INFO, "find_nfs_srvr: force NFS protocol transport to %s", nfs_proto);
- }
- }
-
- /*
- * lookup host address and canonical name
- */
- hp = gethostbyname(host);
-
- /*
- * New code from Bob Harris <harris@basil-rathbone.mit.edu>
- * Use canonical name to keep track of file server
- * information. This way aliases do not generate
- * multiple NFS pingers. (Except when we're normalizing
- * hosts.)
- */
- if (hp && !(gopt.flags & CFM_NORMALIZE_HOSTNAMES))
- host = (char *) hp->h_name;
-
- if (hp) {
- switch (hp->h_addrtype) {
- case AF_INET:
- ip = ALLOC(struct sockaddr_in);
- memset((voidp) ip, 0, sizeof(*ip));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- ip->sin_family = AF_INET;
- memmove((voidp) &ip->sin_addr, (voidp) hp->h_addr, sizeof(ip->sin_addr));
- break;
-
- default:
- plog(XLOG_USER, "No IP address for host %s", host);
- goto no_dns;
- }
- } else {
- plog(XLOG_USER, "Unknown host: %s", host);
- goto no_dns;
- }
-
- /*
- * This may not be the best way to do things, but it really doesn't make
- * sense to query a file server which is marked as 'down' for any
- * version/proto combination.
- */
- ITER(fs, fserver, &nfs_srvr_list) {
- if (FSRV_ISDOWN(fs) &&
- STREQ(host, fs->fs_host)) {
- plog(XLOG_WARNING, "fileserver %s is already hung - not running NFS proto/version discovery", host);
- fs->fs_refc++;
- if (ip)
- XFREE(ip);
- return fs;
- }
- }
-
- /*
- * Get the NFS Version, and verify server is up.
- * If the client only supports NFSv2, hardcode it but still try to
- * contact the remote portmapper to see if the service is running.
- */
-#ifndef HAVE_FS_NFS3
- nfs_version = NFS_VERSION;
- nfs_proto = "udp";
- plog(XLOG_INFO, "The client supports only NFS(2,udp)");
-#endif /* not HAVE_FS_NFS3 */
-
-
- if (amu_hasmntopt(&mnt, MNTTAB_OPT_PUBLIC)) {
- /*
- * Use WebNFS to obtain file handles.
- */
- mf->mf_flags |= MFF_WEBNFS;
- plog(XLOG_INFO, "%s option used, NOT contacting the portmapper on %s",
- MNTTAB_OPT_PUBLIC, host);
- /*
- * Prefer NFSv3/tcp if the client supports it (cf. RFC 2054, 7).
- */
- if (!nfs_version) {
-#ifdef HAVE_FS_NFS3
- nfs_version = NFS_VERSION3;
-#else /* not HAVE_FS_NFS3 */
- nfs_version = NFS_VERSION;
-#endif /* not HAVE_FS_NFS3 */
- plog(XLOG_INFO, "No NFS version specified, will use NFSv%d",
- (int) nfs_version);
- }
- if (!nfs_proto) {
-#if defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3)
- nfs_proto = "tcp";
-#else /* not defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3) */
- nfs_proto = "udp";
-#endif /* not defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3) */
- plog(XLOG_INFO, "No NFS protocol transport specified, will use %s",
- nfs_proto);
- }
- } else {
- /*
- * Find the best combination of NFS version and protocol.
- * When given a choice, use the highest available version,
- * and use TCP over UDP if available.
- */
- if (check_pmap_up(host, ip)) {
- if (nfs_proto) {
- best_nfs_version = get_nfs_version(host, ip, nfs_version, nfs_proto);
- nfs_port = ip->sin_port;
- }
-#ifdef MNTTAB_OPT_PROTO
- else {
- u_int proto_nfs_version;
- char **p;
-
- for (p = protocols; *p; p++) {
- proto_nfs_version = get_nfs_version(host, ip, nfs_version, *p);
-
- if (proto_nfs_version > best_nfs_version) {
- best_nfs_version = proto_nfs_version;
- nfs_proto = *p;
- nfs_port = ip->sin_port;
- }
- }
- }
-#endif /* MNTTAB_OPT_PROTO */
- } else {
- plog(XLOG_INFO, "portmapper service not running on %s", host);
- }
-
- /* use the portmapper results only nfs_version is not set yet */
- if (!best_nfs_version) {
- /*
- * If the NFS server is down or does not support the portmapper call
- * (such as certain Novell NFS servers) we mark it as version 2 and we
- * let the nfs code deal with the case when it is down. If/when the
- * server comes back up and it can support NFSv3 and/or TCP, it will
- * use those.
- */
- if (nfs_version == 0) {
- nfs_version = NFS_VERSION;
- nfs_proto = "udp";
- }
- plog(XLOG_INFO, "NFS service not running on %s", host);
- fserver_is_down = 1;
- } else {
- if (nfs_version == 0)
- nfs_version = best_nfs_version;
- plog(XLOG_INFO, "Using NFS version %d, protocol %s on host %s",
- (int) nfs_version, nfs_proto, host);
- }
- }
-
- /*
- * Determine the NFS port.
- *
- * A valid "port" mount option overrides anything else.
- * If the port has been determined from the portmapper, use that.
- * Default to NFS_PORT otherwise (cf. RFC 2054, 3).
- */
- nfs_port_opt = hasmntval(&mnt, MNTTAB_OPT_PORT);
- if (nfs_port_opt > 0)
- nfs_port = htons(nfs_port_opt);
- if (!nfs_port)
- nfs_port = htons(NFS_PORT);
-
- dlog("find_nfs_srvr: using port %d for nfs on %s",
- (int) ntohs(nfs_port), host);
- ip->sin_port = nfs_port;
-
-no_dns:
- /*
- * Try to find an existing fs server structure for this host.
- * Note that differing versions or protocols have their own structures.
- * XXX: Need to fix the ping mechanism to actually use the NFS protocol
- * chosen here (right now it always uses datagram sockets).
- */
- ITER(fs, fserver, &nfs_srvr_list) {
- if (STREQ(host, fs->fs_host) &&
- nfs_version == fs->fs_version &&
- STREQ(nfs_proto, fs->fs_proto)) {
- /*
- * fill in the IP address -- this is only needed
- * if there is a chance an IP address will change
- * between mounts.
- * Mike Mitchell, mcm@unx.sas.com, 09/08/93
- */
- if (hp && fs->fs_ip &&
- memcmp((voidp) &fs->fs_ip->sin_addr,
- (voidp) hp->h_addr,
- sizeof(fs->fs_ip->sin_addr)) != 0) {
- struct in_addr ia;
- char *old_ipaddr, *new_ipaddr;
- old_ipaddr = strdup(inet_ntoa(fs->fs_ip->sin_addr));
- memmove((voidp) &ia, (voidp) hp->h_addr, sizeof(struct in_addr));
- new_ipaddr = inet_ntoa(ia); /* ntoa uses static buf */
- plog(XLOG_WARNING, "fileserver %s changed ip: %s -> %s",
- fs->fs_host, old_ipaddr, new_ipaddr);
- XFREE(old_ipaddr);
- flush_nfs_fhandle_cache(fs);
- memmove((voidp) &fs->fs_ip->sin_addr, (voidp) hp->h_addr, sizeof(fs->fs_ip->sin_addr));
- }
-
- /*
- * If the new file systems doesn't use WebNFS, the nfs pings may
- * try to contact the portmapper.
- */
- if (!(mf->mf_flags & MFF_WEBNFS))
- fs->fs_flags &= ~FSF_WEBNFS;
-
- /* check if pingval needs to be updated/set/reset */
- start_nfs_pings(fs, pingval);
-
- /*
- * Following if statement from Mike Mitchell <mcm@unx.sas.com>
- * Initialize the ping data if we aren't pinging now. The np_ttl and
- * np_ping fields are especially important.
- */
- if (!(fs->fs_flags & FSF_PINGING)) {
- np = (nfs_private *) fs->fs_private;
- np->np_mountd_inval = TRUE;
- np->np_xid = XID_ALLOC();
- np->np_error = -1;
- np->np_ping = 0;
- /*
- * Initially the server will be deemed dead
- * after MAX_ALLOWED_PINGS of the fast variety
- * have failed.
- */
- np->np_ttl = MAX_ALLOWED_PINGS * FAST_NFS_PING + clocktime(NULL) - 1;
- start_nfs_pings(fs, pingval);
- if (fserver_is_down)
- fs->fs_flags |= FSF_VALID | FSF_DOWN;
- }
-
- fs->fs_refc++;
- if (ip)
- XFREE(ip);
- return fs;
- }
- }
-
- /*
- * Get here if we can't find an entry
- */
-
- /*
- * Allocate a new server
- */
- fs = ALLOC(struct fserver);
- fs->fs_refc = 1;
- fs->fs_host = strdup(hp ? hp->h_name : "unknown_hostname");
- if (gopt.flags & CFM_NORMALIZE_HOSTNAMES)
- host_normalize(&fs->fs_host);
- fs->fs_ip = ip;
- fs->fs_cid = 0;
- if (ip) {
- fs->fs_flags = FSF_DOWN; /* Starts off down */
- } else {
- fs->fs_flags = FSF_ERROR | FSF_VALID;
- mf->mf_flags |= MFF_ERROR;
- mf->mf_error = ENOENT;
- }
- if (mf->mf_flags & MFF_WEBNFS)
- fs->fs_flags |= FSF_WEBNFS;
- fs->fs_version = nfs_version;
- fs->fs_proto = nfs_proto;
- fs->fs_type = MNTTAB_TYPE_NFS;
- fs->fs_pinger = AM_PINGER;
- fs->fs_flags |= FSF_PING_UNINIT; /* pinger hasn't been initialized */
- np = ALLOC(struct nfs_private);
- memset((voidp) np, 0, sizeof(*np));
- np->np_mountd_inval = TRUE;
- np->np_xid = XID_ALLOC();
- np->np_error = -1;
-
- /*
- * Initially the server will be deemed dead after
- * MAX_ALLOWED_PINGS of the fast variety have failed.
- */
- np->np_ttl = clocktime(NULL) + MAX_ALLOWED_PINGS * FAST_NFS_PING - 1;
- fs->fs_private = (voidp) np;
- fs->fs_prfree = (void (*)(voidp)) free;
-
- if (!FSRV_ERROR(fs)) {
- /* start of keepalive timer, first updating pingval */
- start_nfs_pings(fs, pingval);
- if (fserver_is_down)
- fs->fs_flags |= FSF_VALID | FSF_DOWN;
- }
-
- /*
- * Add to list of servers
- */
- ins_que(&fs->fs_q, &nfs_srvr_list);
-
- return fs;
-}
diff --git a/contrib/amd/amq/amq.8 b/contrib/amd/amq/amq.8
deleted file mode 100644
index 203a52938014..000000000000
--- a/contrib/amd/amq/amq.8
+++ /dev/null
@@ -1,262 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1990 Jan-Simon Pendry
-.\" Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: amq.8,v 1.15.2.1 2006/01/02 18:48:24 ezk Exp $
-.\"
-.TH AMQ 8 "25 April 1989"
-.SH NAME
-amq \- automounter query tool
-.SH SYNOPSIS
-.B amq
-[
-.BI \-fmpsvwHTU
-] [
-.BI \-h " hostname"
-] [
-.BI \-l " log_file"
-] [
-.BI \-x " log_options"
-] [
-.BI \-D " debug_options"
-] [
-.BI \-P " program_number"
-] [[
-.B \-u
-]
-.I directory .\|.\|.
-]
-.SH DESCRIPTION
-.B Amq
-provides a simple way of determining the current state of
-.B amd
-program.
-Communication is by
-.SM RPC.
-Three modes of operation are supported by the current protocol. By default
-a list of mount points and auto-mounted filesystems is output. An
-alternative host can be specified using the
-.I \-h
-option.
-.LP
-If
-.I directory
-names are given, as output by default, then per-filesystem
-information is displayed.
-.SH OPTIONS
-
-.TP
-.B \-f
-Ask the automounter to flush the internal caches and reload all the maps.
-
-.TP
-.BI \-h " hostname"
-Specify an alternate host to query. By default the local host is used. In
-an
-.SM HP-UX
-cluster, the root server is queried by default, since that is the system on
-which the automounter is normally run.
-
-.TP
-.BI \-l " log_file"
-Tell amd to use
-.I log_file
-as the log file name. For security reasons, this must be the same log file
-which amd used when started. This option is therefore only useful to
-refresh amd's open file handle on the log file, so that it can be rotated
-and compressed via daily cron jobs.
-
-.TP
-.B \-m
-Ask the automounter to provide a list of mounted filesystems, including the
-number of references to each filesystem and any error which occurred while
-mounting.
-
-.TP
-.B \-p
-Return the process ID of the remote or locally running amd. Useful when you
-need to send a signal to the local amd process, and would rather not have to
-search through the process table. This option is used in the
-.I ctl-amd
-script.
-
-.TP
-.B \-s
-Ask the automounter to provide system-wide mount statistics.
-
-.TP
-.B \-u
-Ask the automounter to unmount the filesystems named in
-.I directory
-instead of providing
-information about them. Unmounts are requested, not forced. They merely
-cause the mounted filesystem to timeout, which will be picked up by
-.BR amd 's
-main scheduler thus causing the normal timeout action to be taken.
-
-.TP
-.B \-v
-Ask the automounter for its version information. This is a subset of the
-information output by
-.BR amd 's
-.I -v
-option.
-
-.TP
-.B \-w
-Translate a full pathname as returned by
-.IR getpwd (3)
-into a short
-.B Amd
-pathname that goes through its mount points. This option requires that
-.B Amd
-is running.
-
-.TP
-.BI \-x " log_options"
-Ask the automounter to use the logging options specified in
-.I log_options
-from now on.
-
-.TP
-.BI \-D " log_options"
-Ask the automounter to use the debugging options specified in
-.I debug_options
-from now on.
-
-.TP
-.B \-H
-Display short usage message.
-
-.TP
-.BI \-P " program_number"
-Contact an alternate running amd that had registered itself on a different
-RPC
-.I program_number
-and apply all other operations to that instance of the automounter. This is
-useful when you run multiple copies of amd, and need to manage each
-one separately. If not specified, amq will use the default program number
-for amd, 300019. For security reasons, the only alternate program numbers
-amd can use range from 300019 to 300029, inclusive.
-
-.TP
-.B \-T
-Contact
-.B amd
-using the TCP transport only. Normally
-.B amq
-will try TCP, and if that failed, will try UDP.
-
-.TP
-.B \-U
-Contact
-.B amd
-using UDP (connectionless) transport only. Normally
-.B amq
-will try TCP, and if that failed, will try UDP.
-
-.SH FILES
-.TP 20
-.B amq.x
-.SM RPC
-protocol description.
-
-.SH CAVEATS
-.B Amq
-uses a Sun registered
-.SM RPC
-program number (300019 decimal) which may not
-be in the /etc/rpc database.
-.PP
-If the TCP wrappers library is available, and the
-.B use_tcpwrappers
-global
-.B amd.conf
-option is set to ``yes'', then
-.B amd
-will verify that the host running
-.B amq
-is authorized to connect. The
-.I amd
-service name must used in the
-.B /etc/hosts.allow
-and
-.B /etc/hosts.deny
-files. For example, to allow only localhost to connect to
-.B amd,
-add this line to
-.B /etc/hosts.allow:
-.PP
-.RS
-amd: localhost
-.RE
-.PP
-and this line to
-.B /etc/hosts.deny:
-.PP
-.RS
-amd: ALL
-.RE
-
-.SH "SEE ALSO"
-.BR amd (8),
-.BR ctl-amd (8),
-.BR amd.conf (5),
-.BR hosts_access (5).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-
-.SH AUTHORS
-Jan-Simon Pendry <jsp@doc.ic.ac.uk>, Department of Computing, Imperial College, London, UK.
-.P
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/amq/amq.c b/contrib/amd/amq/amq.c
deleted file mode 100644
index 2379b6214766..000000000000
--- a/contrib/amd/amq/amq.c
+++ /dev/null
@@ -1,692 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amq/amq.c
- *
- */
-
-/*
- * Automounter query tool
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amq.h>
-
-/* locals */
-static int flush_flag;
-static int minfo_flag;
-static int getpid_flag;
-static int unmount_flag;
-static int stats_flag;
-static int getvers_flag;
-static int amd_program_number = AMQ_PROGRAM;
-static int use_tcp_flag, use_udp_flag;
-static int getpwd_flag;
-static char *debug_opts;
-static char *amq_logfile;
-static char *xlog_optstr;
-static char localhost[] = "localhost";
-static char *def_server = localhost;
-
-/* externals */
-extern int optind;
-extern char *optarg;
-
-/* structures */
-enum show_opt {
- Full, Stats, Calc, Short, ShowDone
-};
-
-
-/*
- * If (e) is Calc then just calculate the sizes
- * Otherwise display the mount node on stdout
- */
-static void
-show_mti(amq_mount_tree *mt, enum show_opt e, int *mwid, int *dwid, int *twid)
-{
- switch (e) {
- case Calc:
- {
- int mw = strlen(mt->mt_mountinfo);
- int dw = strlen(mt->mt_directory);
- int tw = strlen(mt->mt_type);
- if (mw > *mwid)
- *mwid = mw;
- if (dw > *dwid)
- *dwid = dw;
- if (tw > *twid)
- *twid = tw;
- }
- break;
-
- case Full:
- {
- struct tm *tp = localtime((time_t *) ((voidp) &mt->mt_mounttime));
- printf("%-*.*s %-*.*s %-*.*s %s\n\t%-5d %-7d %-6d %-7d %-7d %-6d %02d/%02d/%04d %02d:%02d:%02d\n",
- *dwid, *dwid,
- *mt->mt_directory ? mt->mt_directory : "/", /* XXX */
- *twid, *twid,
- mt->mt_type,
- *mwid, *mwid,
- mt->mt_mountinfo,
- mt->mt_mountpoint,
-
- mt->mt_mountuid,
- mt->mt_getattr,
- mt->mt_lookup,
- mt->mt_readdir,
- mt->mt_readlink,
- mt->mt_statfs,
-
- tp->tm_mon + 1, tp->tm_mday,
- tp->tm_year < 1900 ? tp->tm_year + 1900 : tp->tm_year,
- tp->tm_hour, tp->tm_min, tp->tm_sec);
- }
- break;
-
- case Stats:
- {
- struct tm *tp = localtime((time_t *) ((voidp) &mt->mt_mounttime));
- printf("%-*.*s %-5d %-7d %-6d %-7d %-7d %-6d %02d/%02d/%02d %02d:%02d:%04d\n",
- *dwid, *dwid,
- *mt->mt_directory ? mt->mt_directory : "/", /* XXX */
-
- mt->mt_mountuid,
- mt->mt_getattr,
- mt->mt_lookup,
- mt->mt_readdir,
- mt->mt_readlink,
- mt->mt_statfs,
-
- tp->tm_mon + 1, tp->tm_mday,
- tp->tm_year < 1900 ? tp->tm_year + 1900 : tp->tm_year,
- tp->tm_hour, tp->tm_min, tp->tm_sec);
- }
- break;
-
- case Short:
- {
- printf("%-*.*s %-*.*s %-*.*s %s\n",
- *dwid, *dwid,
- *mt->mt_directory ? mt->mt_directory : "/",
- *twid, *twid,
- mt->mt_type,
- *mwid, *mwid,
- mt->mt_mountinfo,
- mt->mt_mountpoint);
- }
- break;
-
- default:
- break;
- }
-}
-
-
-/*
- * Display a pwd data
- */
-static void
-show_pwd(amq_mount_tree *mt, char *path, size_t l, int *flag)
-{
- int len;
-
- while (mt) {
- len = strlen(mt->mt_mountpoint);
- if (NSTREQ(path, mt->mt_mountpoint, len) &&
- !STREQ(mt->mt_directory, mt->mt_mountpoint)) {
- char buf[MAXPATHLEN+1]; /* must be same size as 'path' */
- xstrlcpy(buf, mt->mt_directory, sizeof(buf));
- xstrlcat(buf, &path[len], sizeof(buf));
- xstrlcpy(path, buf, l);
- *flag = 1;
- }
- show_pwd(mt->mt_next, path, l, flag);
- mt = mt->mt_child;
- }
-}
-
-
-/*
- * Display a mount tree.
- */
-static void
-show_mt(amq_mount_tree *mt, enum show_opt e, int *mwid, int *dwid, int *pwid)
-{
- while (mt) {
- show_mti(mt, e, mwid, dwid, pwid);
- show_mt(mt->mt_next, e, mwid, dwid, pwid);
- mt = mt->mt_child;
- }
-}
-
-
-static void
-show_mi(amq_mount_info_list *ml, enum show_opt e, int *mwid, int *dwid, int *twid)
-{
- u_int i;
-
- switch (e) {
-
- case Calc:
- {
- for (i = 0; i < ml->amq_mount_info_list_len; i++) {
- amq_mount_info *mi = &ml->amq_mount_info_list_val[i];
- int mw = strlen(mi->mi_mountinfo);
- int dw = strlen(mi->mi_mountpt);
- int tw = strlen(mi->mi_type);
- if (mw > *mwid)
- *mwid = mw;
- if (dw > *dwid)
- *dwid = dw;
- if (tw > *twid)
- *twid = tw;
- }
- }
- break;
-
- case Full:
- {
- for (i = 0; i < ml->amq_mount_info_list_len; i++) {
- amq_mount_info *mi = &ml->amq_mount_info_list_val[i];
- printf("%-*.*s %-*.*s %-*.*s %-3d %s is %s",
- *mwid, *mwid, mi->mi_mountinfo,
- *dwid, *dwid, mi->mi_mountpt,
- *twid, *twid, mi->mi_type,
- mi->mi_refc, mi->mi_fserver,
- mi->mi_up > 0 ? "up" :
- mi->mi_up < 0 ? "starting" : "down");
- if (mi->mi_error > 0) {
- printf(" (%s)", strerror(mi->mi_error));
- } else if (mi->mi_error < 0) {
- fputs(" (in progress)", stdout);
- }
- fputc('\n', stdout);
- }
- }
- break;
-
- default:
- break;
- }
-}
-
-
-/*
- * Display general mount statistics
- */
-static void
-show_ms(amq_mount_stats *ms)
-{
- printf("\
-requests stale mount mount unmount\n\
-deferred fhandles ok failed failed\n\
-%-9d %-9d %-9d %-9d %-9d\n",
- ms->as_drops, ms->as_stale, ms->as_mok, ms->as_merr, ms->as_uerr);
-}
-
-
-#if defined(HAVE_CLUSTER_H) && defined(HAVE_CNODEID) && defined(HAVE_GETCCENT)
-static char *
-cluster_server(void)
-{
- struct cct_entry *cp;
-
- if (cnodeid() == 0) {
- /*
- * Not clustered
- */
- return def_server;
- }
- while (cp = getccent())
- if (cp->cnode_type == 'r')
- return cp->cnode_name;
-
- return def_server;
-}
-#endif /* defined(HAVE_CLUSTER_H) && defined(HAVE_CNODEID) && defined(HAVE_GETCCENT) */
-
-
-/*
- * MAIN
- */
-int
-main(int argc, char *argv[])
-{
- int opt_ch;
- int errs = 0;
- char *server;
- struct sockaddr_in server_addr;
- CLIENT *clnt = NULL;
- struct hostent *hp;
- int nodefault = 0;
- struct timeval tv;
- char *progname = NULL;
-
- /*
- * Compute program name
- */
- if (argv[0]) {
- progname = strrchr(argv[0], '/');
- if (progname && progname[1])
- progname++;
- else
- progname = argv[0];
- }
- if (!progname)
- progname = "amq";
- am_set_progname(progname);
-
- /*
- * Parse arguments
- */
- while ((opt_ch = getopt(argc, argv, "Hfh:l:msuvx:D:pP:TUw")) != -1)
- switch (opt_ch) {
- case 'H':
- goto show_usage;
- break;
-
- case 'f':
- flush_flag = 1;
- nodefault = 1;
- break;
-
- case 'h':
- def_server = optarg;
- break;
-
- case 'l':
- amq_logfile = optarg;
- nodefault = 1;
- break;
-
- case 'm':
- minfo_flag = 1;
- nodefault = 1;
- break;
-
- case 'p':
- getpid_flag = 1;
- nodefault = 1;
- break;
-
- case 's':
- stats_flag = 1;
- nodefault = 1;
- break;
-
- case 'u':
- unmount_flag = 1;
- nodefault = 1;
- break;
-
- case 'v':
- getvers_flag = 1;
- nodefault = 1;
- break;
-
- case 'x':
- xlog_optstr = optarg;
- nodefault = 1;
- break;
-
- case 'D':
- debug_opts = optarg;
- nodefault = 1;
- break;
-
- case 'P':
- amd_program_number = atoi(optarg);
- break;
-
- case 'T':
- use_tcp_flag = 1;
- break;
-
- case 'U':
- use_udp_flag = 1;
- break;
-
- case 'w':
- getpwd_flag = 1;
- break;
-
- default:
- errs = 1;
- break;
- }
-
- if (optind == argc) {
- if (unmount_flag)
- errs = 1;
- }
- if (errs) {
- show_usage:
- fprintf(stderr, "\
-Usage: %s [-fmpsvwHTU] [-h hostname] [-l log_file|\"syslog\"]\n\
-\t[-x log_options] [-D debug_options]\n\
-\t[-P program_number] [[-u] directory ...]\n",
- am_get_progname()
- );
- exit(1);
- }
-
-
- /* set use_udp and use_tcp flags both to on if none are defined */
- if (!use_tcp_flag && !use_udp_flag)
- use_tcp_flag = use_udp_flag = 1;
-
-#if defined(HAVE_CLUSTER_H) && defined(HAVE_CNODEID) && defined(HAVE_GETCCENT)
- /*
- * Figure out root server of cluster
- */
- if (def_server == localhost)
- server = cluster_server();
- else
-#endif /* defined(HAVE_CLUSTER_H) && defined(HAVE_CNODEID) && defined(HAVE_GETCCENT) */
- server = def_server;
-
- /*
- * Get address of server
- */
- if ((hp = gethostbyname(server)) == 0 && !STREQ(server, localhost)) {
- fprintf(stderr, "%s: Can't get address of %s\n",
- am_get_progname(), server);
- exit(1);
- }
- memset(&server_addr, 0, sizeof(server_addr));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- server_addr.sin_family = AF_INET;
- if (hp) {
- memmove((voidp) &server_addr.sin_addr, (voidp) hp->h_addr,
- sizeof(server_addr.sin_addr));
- } else {
- /* fake "localhost" */
- server_addr.sin_addr.s_addr = htonl(0x7f000001);
- }
-
- /*
- * Create RPC endpoint
- */
- tv.tv_sec = 5; /* 5 seconds for timeout or per retry */
- tv.tv_usec = 0;
-
- if (use_tcp_flag) /* try tcp first */
- clnt = clnt_create(server, amd_program_number, AMQ_VERSION, "tcp");
- if (!clnt && use_udp_flag) { /* try udp next */
- clnt = clnt_create(server, amd_program_number, AMQ_VERSION, "udp");
- /* if ok, set timeout (valid for connectionless transports only) */
- if (clnt)
- clnt_control(clnt, CLSET_RETRY_TIMEOUT, (char *) &tv);
- }
- if (!clnt) {
- fprintf(stderr, "%s: ", am_get_progname());
- clnt_pcreateerror(server);
- exit(1);
- }
-
- /*
- * Control debugging
- */
- if (debug_opts) {
- int *rc;
- amq_setopt opt;
- opt.as_opt = AMOPT_DEBUG;
- opt.as_str = debug_opts;
- rc = amqproc_setopt_1(&opt, clnt);
- if (rc && *rc < 0) {
- fprintf(stderr, "%s: daemon not compiled for debug\n",
- am_get_progname());
- errs = 1;
- } else if (!rc || *rc > 0) {
- fprintf(stderr, "%s: debug setting for \"%s\" failed\n",
- am_get_progname(), debug_opts);
- errs = 1;
- }
- }
-
- /*
- * Control logging
- */
- if (xlog_optstr) {
- int *rc;
- amq_setopt opt;
- opt.as_opt = AMOPT_XLOG;
- opt.as_str = xlog_optstr;
- rc = amqproc_setopt_1(&opt, clnt);
- if (!rc || *rc) {
- fprintf(stderr, "%s: setting log level to \"%s\" failed\n",
- am_get_progname(), xlog_optstr);
- errs = 1;
- }
- }
-
- /*
- * Control log file
- */
- if (amq_logfile) {
- int *rc;
- amq_setopt opt;
- opt.as_opt = AMOPT_LOGFILE;
- opt.as_str = amq_logfile;
- rc = amqproc_setopt_1(&opt, clnt);
- if (!rc || *rc) {
- fprintf(stderr, "%s: setting logfile to \"%s\" failed\n",
- am_get_progname(), amq_logfile);
- errs = 1;
- }
- }
-
- /*
- * Flush map cache
- */
- if (flush_flag) {
- int *rc;
- amq_setopt opt;
- opt.as_opt = AMOPT_FLUSHMAPC;
- opt.as_str = "";
- rc = amqproc_setopt_1(&opt, clnt);
- if (!rc || *rc) {
- fprintf(stderr, "%s: amd on %s cannot flush the map cache\n",
- am_get_progname(), server);
- errs = 1;
- }
- }
-
- /*
- * getpwd info
- */
- if (getpwd_flag) {
- char path[MAXPATHLEN+1];
- char *wd = getcwd(path, MAXPATHLEN+1);
- amq_mount_tree_list *mlp = amqproc_export_1((voidp) 0, clnt);
- amq_mount_tree_p mt;
- u_int i;
- int flag;
-
- if (!wd) {
- perror("getcwd");
- exit(1);
- }
- for (i = 0; mlp && i < mlp->amq_mount_tree_list_len; i++) {
- mt = mlp->amq_mount_tree_list_val[i];
- while (1) {
- flag = 0;
- show_pwd(mt, path, sizeof(path), &flag);
- if (!flag) {
- printf("%s\n", path);
- break;
- }
- }
- }
- exit(0);
- }
-
- /*
- * Mount info
- */
- if (minfo_flag) {
- int dummy;
- amq_mount_info_list *ml = amqproc_getmntfs_1(&dummy, clnt);
- if (ml) {
- int mwid = 0, dwid = 0, twid = 0;
- show_mi(ml, Calc, &mwid, &dwid, &twid);
- mwid++;
- dwid++;
- twid++;
- show_mi(ml, Full, &mwid, &dwid, &twid);
-
- } else {
- fprintf(stderr, "%s: amd on %s cannot provide mount info\n",
- am_get_progname(), server);
- }
- }
-
- /*
- * Get Version
- */
- if (getvers_flag) {
- amq_string *spp = amqproc_getvers_1((voidp) 0, clnt);
- if (spp && *spp) {
- fputs(*spp, stdout);
- XFREE(*spp);
- } else {
- fprintf(stderr, "%s: failed to get version information\n",
- am_get_progname());
- errs = 1;
- }
- }
-
- /*
- * Get PID of amd
- */
- if (getpid_flag) {
- int *ip = amqproc_getpid_1((voidp) 0, clnt);
- if (ip && *ip) {
- printf("%d\n", *ip);
- } else {
- fprintf(stderr, "%s: failed to get PID of amd\n", am_get_progname());
- errs = 1;
- }
- }
-
- /*
- * Apply required operation to all remaining arguments
- */
- if (optind < argc) {
- do {
- char *fs = argv[optind++];
- if (unmount_flag) {
- /*
- * Unmount request
- */
- amqproc_umnt_1(&fs, clnt);
- } else {
- /*
- * Stats request
- */
- amq_mount_tree_p *mtp = amqproc_mnttree_1(&fs, clnt);
- if (mtp) {
- amq_mount_tree *mt = *mtp;
- if (mt) {
- int mwid = 0, dwid = 0, twid = 0;
- show_mt(mt, Calc, &mwid, &dwid, &twid);
- mwid++;
- dwid++, twid++;
- printf("%-*.*s Uid Getattr Lookup RdDir RdLnk Statfs Mounted@\n",
- dwid, dwid, "What");
- show_mt(mt, Stats, &mwid, &dwid, &twid);
- } else {
- fprintf(stderr, "%s: %s not automounted\n", am_get_progname(), fs);
- }
- xdr_pri_free((XDRPROC_T_TYPE) xdr_amq_mount_tree_p, (caddr_t) mtp);
- } else {
- fprintf(stderr, "%s: ", am_get_progname());
- clnt_perror(clnt, server);
- errs = 1;
- }
- }
- } while (optind < argc);
-
- } else if (unmount_flag) {
- goto show_usage;
-
- } else if (stats_flag) {
- amq_mount_stats *ms = amqproc_stats_1((voidp) 0, clnt);
- if (ms) {
- show_ms(ms);
- } else {
- fprintf(stderr, "%s: ", am_get_progname());
- clnt_perror(clnt, server);
- errs = 1;
- }
-
- } else if (!nodefault) {
- amq_mount_tree_list *mlp = amqproc_export_1((voidp) 0, clnt);
- if (mlp) {
- enum show_opt e = Calc;
- int mwid = 0, dwid = 0, pwid = 0;
-
- while (e != ShowDone) {
- u_int i;
- for (i = 0; i < mlp->amq_mount_tree_list_len; i++) {
- show_mt(mlp->amq_mount_tree_list_val[i],
- e, &mwid, &dwid, &pwid);
- }
- mwid++;
- dwid++, pwid++;
- if (e == Calc)
- e = Short;
- else if (e == Short)
- e = ShowDone;
- }
-
- } else {
- fprintf(stderr, "%s: ", am_get_progname());
- clnt_perror(clnt, server);
- errs = 1;
- }
- }
- exit(errs);
- return errs; /* should never reach here */
-}
diff --git a/contrib/amd/amq/amq.h b/contrib/amd/amq/amq.h
deleted file mode 100644
index 2f36b8194456..000000000000
--- a/contrib/amd/amq/amq.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amq/amq.h
- *
- */
-
-#ifndef _AMQ_H
-#define _AMQ_H
-
-/*
- * external definitions for building amq
- */
-
-extern voidp amqproc_null_1(voidp argp, CLIENT *rqstp);
-extern amq_mount_tree_p *amqproc_mnttree_1(amq_string *argp, CLIENT *rqstp);
-extern voidp amqproc_umnt_1(amq_string *argp, CLIENT *rqstp);
-extern amq_mount_stats *amqproc_stats_1(voidp argp, CLIENT *rqstp);
-extern amq_mount_tree_list *amqproc_export_1(voidp argp, CLIENT *rqstp);
-extern int *amqproc_setopt_1(amq_setopt *argp, CLIENT *rqstp);
-extern amq_mount_info_list *amqproc_getmntfs_1(voidp argp, CLIENT *rqstp);
-extern int *amqproc_mount_1(voidp argp, CLIENT *rqstp);
-extern amq_string *amqproc_getvers_1(voidp argp, CLIENT *rqstp);
-extern int *amqproc_getpid_1(voidp argp, CLIENT *rqstp);
-extern amq_string *amqproc_pawd_1(amq_string *argp, CLIENT *rqstp);
-
-#endif /* not _AMQ_H */
diff --git a/contrib/amd/amq/amq_clnt.c b/contrib/amd/amq/amq_clnt.c
deleted file mode 100644
index ddfeb675c99b..000000000000
--- a/contrib/amd/amq/amq_clnt.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amq/amq_clnt.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amq.h>
-
-
-static struct timeval TIMEOUT = {ALLOWED_MOUNT_TIME, 0};
-
-
-voidp
-amqproc_null_1(voidp argp, CLIENT *clnt)
-{
- static char res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_NULL,
- (XDRPROC_T_TYPE) xdr_void, argp,
- (XDRPROC_T_TYPE) xdr_void, &res, TIMEOUT)
- != RPC_SUCCESS) {
- return (NULL);
- }
- return ((voidp) &res);
-}
-
-
-amq_mount_tree_p *
-amqproc_mnttree_1(amq_string *argp, CLIENT *clnt)
-{
- static amq_mount_tree_p res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_MNTTREE,
- (XDRPROC_T_TYPE) xdr_amq_string, (SVC_IN_ARG_TYPE) argp,
- (XDRPROC_T_TYPE) xdr_amq_mount_tree_p, (SVC_IN_ARG_TYPE) &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-voidp
-amqproc_umnt_1(amq_string *argp, CLIENT *clnt)
-{
- static char res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_UMNT,
- (XDRPROC_T_TYPE) xdr_amq_string, (SVC_IN_ARG_TYPE) argp,
- (XDRPROC_T_TYPE) xdr_void, &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return ((voidp) &res);
-}
-
-
-amq_mount_stats *
-amqproc_stats_1(voidp argp, CLIENT *clnt)
-{
- static amq_mount_stats res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_STATS,
- (XDRPROC_T_TYPE) xdr_void, argp,
- (XDRPROC_T_TYPE) xdr_amq_mount_stats,
- (SVC_IN_ARG_TYPE) &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-amq_mount_tree_list *
-amqproc_export_1(voidp argp, CLIENT *clnt)
-{
- static amq_mount_tree_list res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_EXPORT,
- (XDRPROC_T_TYPE) xdr_void, argp,
- (XDRPROC_T_TYPE) xdr_amq_mount_tree_list,
- (SVC_IN_ARG_TYPE) &res, TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-int *
-amqproc_setopt_1(amq_setopt *argp, CLIENT *clnt)
-{
- static int res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_SETOPT, (XDRPROC_T_TYPE) xdr_amq_setopt,
- (SVC_IN_ARG_TYPE) argp, (XDRPROC_T_TYPE) xdr_int,
- (SVC_IN_ARG_TYPE) &res, TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-amq_mount_info_list *
-amqproc_getmntfs_1(voidp argp, CLIENT *clnt)
-{
- static amq_mount_info_list res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_GETMNTFS, (XDRPROC_T_TYPE) xdr_void, argp,
- (XDRPROC_T_TYPE) xdr_amq_mount_info_list,
- (SVC_IN_ARG_TYPE) &res, TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-int *
-amqproc_mount_1(voidp argp, CLIENT *clnt)
-{
- static int res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_MOUNT, (XDRPROC_T_TYPE) xdr_amq_string, argp,
- (XDRPROC_T_TYPE) xdr_int, (SVC_IN_ARG_TYPE) &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-amq_string *
-amqproc_getvers_1(voidp argp, CLIENT *clnt)
-{
- static amq_string res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_GETVERS, (XDRPROC_T_TYPE) xdr_void, argp,
- (XDRPROC_T_TYPE) xdr_amq_string, (SVC_IN_ARG_TYPE) &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-int *
-amqproc_getpid_1(voidp argp, CLIENT *clnt)
-{
- static int res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_GETPID, (XDRPROC_T_TYPE) xdr_void, argp,
- (XDRPROC_T_TYPE) xdr_int, (SVC_IN_ARG_TYPE) &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
-
-
-amq_string *
-amqproc_pawd_1(amq_string *argp, CLIENT *clnt)
-{
- static amq_string res;
-
- memset((char *) &res, 0, sizeof(res));
- if (clnt_call(clnt, AMQPROC_PAWD,
- (XDRPROC_T_TYPE) xdr_amq_string, (SVC_IN_ARG_TYPE) argp,
- (XDRPROC_T_TYPE) xdr_amq_string, (SVC_IN_ARG_TYPE) &res,
- TIMEOUT) != RPC_SUCCESS) {
- return (NULL);
- }
- return (&res);
-}
diff --git a/contrib/amd/amq/amq_xdr.c b/contrib/amd/amq/amq_xdr.c
deleted file mode 100644
index 692a0a408607..000000000000
--- a/contrib/amd/amq/amq_xdr.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amq/amq_xdr.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amq.h>
-
-
-bool_t
-xdr_time_type(XDR *xdrs, time_type *objp)
-{
- if (!xdr_long(xdrs, (long *) objp)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_tree(XDR *xdrs, amq_mount_tree *objp)
-{
-
- if (!xdr_amq_string(xdrs, &objp->mt_mountinfo)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->mt_directory)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->mt_mountpoint)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->mt_type)) {
- return (FALSE);
- }
-
- if (!xdr_time_type(xdrs, &objp->mt_mounttime)) {
- return (FALSE);
- }
-
- if (!xdr_u_short(xdrs, &objp->mt_mountuid)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mt_getattr)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mt_lookup)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mt_readdir)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mt_readlink)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mt_statfs)) {
- return (FALSE);
- }
-
- if (!xdr_pointer(xdrs,
- (char **) ((voidp) &objp->mt_next),
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
- return (FALSE);
- }
-
- if (!xdr_pointer(xdrs,
- (char **) ((voidp) &objp->mt_child),
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
- return (FALSE);
- }
-
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_tree_p(XDR *xdrs, amq_mount_tree_p *objp)
-{
- if (!xdr_pointer(xdrs,
- (char **) objp,
- sizeof(amq_mount_tree),
- (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_info(XDR *xdrs, amq_mount_info *objp)
-{
-
- if (!xdr_amq_string(xdrs, &objp->mi_type)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->mi_mountpt)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->mi_mountinfo)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->mi_fserver)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mi_error)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mi_refc)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->mi_up)) {
- return (FALSE);
- }
-
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_info_list(XDR *xdrs, amq_mount_info_list *objp)
-{
- if (!xdr_array(xdrs,
- (char **) ((voidp) &objp->amq_mount_info_list_val),
- (u_int *) &objp->amq_mount_info_list_len,
- ~0,
- sizeof(amq_mount_info),
- (XDRPROC_T_TYPE) xdr_amq_mount_info)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_tree_list(XDR *xdrs, amq_mount_tree_list *objp)
-{
- if (!xdr_array(xdrs,
- (char **) ((voidp) &objp->amq_mount_tree_list_val),
- (u_int *) &objp->amq_mount_tree_list_len,
- ~0,
- sizeof(amq_mount_tree_p),
- (XDRPROC_T_TYPE) xdr_amq_mount_tree_p)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_mount_stats(XDR *xdrs, amq_mount_stats *objp)
-{
-
- if (!xdr_int(xdrs, &objp->as_drops)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->as_stale)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->as_mok)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->as_merr)) {
- return (FALSE);
- }
-
- if (!xdr_int(xdrs, &objp->as_uerr)) {
- return (FALSE);
- }
-
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_opt(XDR *xdrs, amq_opt *objp)
-{
- if (!xdr_enum(xdrs, (enum_t *) objp)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_amq_setopt(XDR *xdrs, amq_setopt *objp)
-{
-
- if (!xdr_amq_opt(xdrs, &objp->as_opt)) {
- return (FALSE);
- }
-
- if (!xdr_amq_string(xdrs, &objp->as_str)) {
- return (FALSE);
- }
-
- return (TRUE);
-}
-
-
-bool_t
-xdr_pri_free(XDRPROC_T_TYPE xdr_args, caddr_t args_ptr)
-{
- XDR xdr;
-
- xdr.x_op = XDR_FREE;
- return ((*xdr_args) (&xdr, (caddr_t *) args_ptr));
-}
diff --git a/contrib/amd/amq/pawd.1 b/contrib/amd/amq/pawd.1
deleted file mode 100644
index 73a16b59b555..000000000000
--- a/contrib/amd/amq/pawd.1
+++ /dev/null
@@ -1,90 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1990 Jan-Simon Pendry
-.\" Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: pawd.1,v 1.9.2.1 2006/01/02 18:48:24 ezk Exp $
-.\"
-.TH PAWD 1 "6 Jan 1998"
-.SH NAME
-pawd \- print automounter working directory
-.SH SYNOPSIS
-.B pawd
-[
-.I path ...
-]
-.SH DESCRIPTION
-.LP
-.B pawd
-is used to print the current working directory, adjusted to reflect proper
-paths that can be reused to go through the automounter for the shortest
-possible path. In particular, the path printed back does not include any
-of
-.BR Amd 's
-local mount points. Using them is unsafe, because
-.B Amd
-may unmount managed file systems from the mount points, and thus including
-them in paths may not always find the files within.
-.P
-Without any arguments,
-.B pawd
-will print the automounter adjusted current working directory. With any
-number of arguments, it will print the adjusted path of each one of the
-arguments.
-.SH "SEE ALSO"
-.BR amd (8),
-.BR amq (8),
-.BR pwd (1).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH AUTHORS
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/amq/pawd.c b/contrib/amd/amq/pawd.c
deleted file mode 100644
index c9a32b16189b..000000000000
--- a/contrib/amd/amq/pawd.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/amq/pawd.c
- *
- */
-
-/*
- * pawd is similar to pwd, except that it returns more "natural" versions of
- * pathnames for directories automounted with the amd automounter. If any
- * arguments are given, the "more natural" form of the given pathnames are
- * printed.
- *
- * Paul Anderson (paul@ed.lfcs)
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amq.h>
-
-
-/* statics */
-static char *localhost = "localhost";
-static char transform[MAXPATHLEN];
-
-
-#ifdef HAVE_CNODEID
-static char *
-cluster_server(void)
-{
-# ifdef HAVE_EXTERN_GETCCENT
- struct cct_entry *cp;
-# endif /* HAVE_EXTERN_GETCCENT */
-
- if (cnodeid() == 0)
- return localhost;
-
-# ifdef HAVE_EXTERN_GETCCENT
- while ((cp = getccent()))
- if (cp->cnode_type == 'r')
- return cp->cnode_name;
-# endif /* HAVE_EXTERN_GETCCENT */
-
- return localhost;
-}
-#endif /* HAVE_CNODEID */
-
-
-/* DISK_HOME_HACK added by gdmr */
-#ifdef DISK_HOME_HACK
-static char *
-hack_name(char *dir)
-{
- char partition[MAXPATHLEN];
- char username[MAXPATHLEN];
- char hesiod_lookup[MAXPATHLEN];
- char *to, *ch, *hes_name, *dot;
- char **hes;
-
-#ifdef DEBUG
- fprintf(stderr, "hack_name(%s)\n", dir);
-#endif /* DEBUG */
-
- if (dir[0] == '/' && dir[1] == 'a' && dir[2] == '/') {
- /* Could be /a/server/disk/home/partition/user... */
- ch = dir + 3;
- while (*ch && *ch != '/') ch++; /* Skip server */
- if (!NSTREQ(ch, "/disk/home/", 11))
- return NULL; /* Nope */
- /* Looking promising, next should be the partition name */
- ch += 11;
- to = partition;
- while (*ch && *ch != '/') *to++ = *ch++;
- to = '\0';
- if (!(*ch))
- return NULL; /* Off the end */
- /* Now the username */
- ch++;
- to = username;
- while (*ch && *ch != '/') *to++ = *ch++;
- to = '\0';
-#ifdef DEBUG
- fprintf(stderr, "partition %s, username %s\n", partition, username);
-#endif /* DEBUG */
-
- xsnprintf(hesiod_lookup, sizeof(hesiod_lookup),
- "%s.homes-remote", username);
- hes = hes_resolve(hesiod_lookup, "amd");
- if (!hes)
- return NULL;
-#ifdef DEBUG
- fprintf(stderr, "hesiod -> <%s>\n", *hes);
-#endif /* DEBUG */
- hes_name = strstr(*hes, "/homes/remote/");
- if (!hes_name) return NULL;
- hes_name += 14;
-#ifdef DEBUG
- fprintf(stderr, "hesiod -> <%s>\n", hes_name);
-#endif /* DEBUG */
- dot = hes_name;
- while (*dot && *dot != '.') dot++;
- *dot = '\0';
-#ifdef DEBUG
- fprintf(stderr, "hesiod -> <%s>\n", hes_name);
-#endif /* DEBUG */
-
- if (strcmp(partition, hes_name)) return NULL;
-#ifdef DEBUG
- fprintf(stderr, "A match, munging....\n");
-#endif /* DEBUG */
- xstrlcpy(transform, "/home/", sizeof(transform));
- xstrlcat(transform, username, sizeof(transform));
- if (*ch)
- xstrlcat(transform, ch, sizeof(transform));
-#ifdef DEBUG
- fprintf(stderr, "Munged to <%s>\n", transform);
-#endif /* DEBUG */
- return transform;
- }
- return NULL;
-}
-#endif /* DISK_HOME_HACK */
-
-
-/*
- * The routine transform_dir(path) transforms pathnames of directories
- * mounted with the amd automounter to produce a more "natural" version.
- * The automount table is obtained from the local amd via the rpc interface
- * and reverse lookups are repeatedly performed on the directory name
- * substituting the name of the automount link for the value of the link
- * whenever it occurs as a prefix of the directory name.
- */
-static char *
-transform_dir(char *dir)
-{
-#ifdef DISK_HOME_HACK
- char *ch;
-#endif /* DISK_HOME_HACK */
- char *server;
- struct sockaddr_in server_addr;
- int s = RPC_ANYSOCK;
- CLIENT *clnt;
- struct hostent *hp;
- struct timeval tmo = {10, 0};
- char *dummystr;
- amq_string *spp;
-
-#ifdef DISK_HOME_HACK
- if (ch = hack_name(dir))
- return ch;
-#endif /* DISK_HOME_HACK */
-
-#ifdef HAVE_CNODEID
- server = cluster_server();
-#else /* not HAVE_CNODEID */
- server = localhost;
-#endif /* not HAVE_CNODEID */
-
- if ((hp = gethostbyname(server)) == NULL)
- return dir;
- memset(&server_addr, 0, sizeof(server_addr));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr = *(struct in_addr *) hp->h_addr;
-
- clnt = clntudp_create(&server_addr, AMQ_PROGRAM, AMQ_VERSION, tmo, &s);
- if (clnt == NULL)
- clnt = clnttcp_create(&server_addr, AMQ_PROGRAM, AMQ_VERSION, &s, 0, 0);
- if (clnt == NULL)
- return dir;
-
- xstrlcpy(transform, dir, sizeof(transform));
- dummystr = transform;
- spp = amqproc_pawd_1((amq_string *) &dummystr, clnt);
- if (spp && *spp && **spp) {
- xstrlcpy(transform, *spp, sizeof(transform));
- XFREE(*spp);
- }
- clnt_destroy(clnt);
- return transform;
-}
-
-
-/* getawd() is a substitute for getwd() which transforms the path */
-static char *
-getawd(char *path, size_t l)
-{
-#ifdef HAVE_GETCWD
- char *wd = getcwd(path, MAXPATHLEN);
-#else /* not HAVE_GETCWD */
- char *wd = getwd(path);
-#endif /* not HAVE_GETCWD */
-
- if (wd == NULL) {
- return NULL;
- }
- xstrlcpy(path, transform_dir(wd), l);
- return path;
-}
-
-
-int
-main(int argc, char *argv[])
-{
- char tmp_buf[MAXPATHLEN], *wd;
-
- if (argc == 1) {
- wd = getawd(tmp_buf, sizeof(tmp_buf));
- if (wd == NULL) {
- fprintf(stderr, "pawd: %s\n", tmp_buf);
- exit(1);
- } else {
- fprintf(stdout, "%s\n", wd);
- }
- } else {
- while (--argc) {
- wd = transform_dir(*++argv);
- fprintf(stdout, "%s\n", wd);
- }
- }
- exit(0);
-}
diff --git a/contrib/amd/aux_conf.h.in b/contrib/amd/aux_conf.h.in
deleted file mode 100644
index 8c38bbfac5f1..000000000000
--- a/contrib/amd/aux_conf.h.in
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * aux_conf.h:
- * This file gets "filled in" for each architecture.
- * @configure_input@
- */
-
-#ifndef _AUX_CONF_H
-#define _AUX_CONF_H
-
-/*
- * The next line is a literal inclusion of a file which includes a
- * definition for the MOUNT_TRAP macro for a particular architecture.
- * If it defines the wrong entry, check the AC_CHECK_MOUNT_TRAP m4 macro
- * in $srcdir/m4/macros.
- */
-@am_utils_mount_trap@
-/* End of included MOUNT_TRAP macro definition file */
-
-/*
- * The next line is a literal replacement of a variable which defines the
- * the UNMOUNT_TRAP macro for a particular architecture.
- * If it defines the wrong entry, check the AC_CHECK_UNMOUNT_CALL m4 macro
- * in $srcdir/aclocal.m4. If the arguments are being defined wrong, check
- * the macro AC_CHECK_UNMOUNT_ARGS in $srcdir/m4/macros.
- */
-#define UNMOUNT_TRAP(mnt) @am_utils_unmount_call@(@am_utils_unmount_args@)
-/* End of replaced UNMOUNT_TRAP macro definition */
-/* umount(8) executable path, for type:=program */
-#define UNMOUNT_PROGRAM "@UNMOUNT_PROGRAM@"
-
-/*
- * The next line is a literal inclusion of a file which includes a
- * definition for the NFS_FH_DREF macro for a particular architecture.
- * If it defines the wrong entry, check the AC_CHECK_NFS_FH_DREF m4 macro
- * in $srcdir/m4/macros.
- */
-@am_utils_nfs_fh_dref@
-/* End of included NFS_FH_DREF macro definition file */
-
-/*
- * The next line is a literal inclusion of a file which includes a
- * definition for the NFS_SA_DREF macro for a particular architecture.
- * If it defines the wrong entry, check the AC_CHECK_NFS_SA_DREF m4 macro
- * in $srcdir/m4/macros.
- */
-@am_utils_nfs_sa_dref@
-/* End of included NFS_SA_DREF macro definition file */
-
-/*
- * The next line is a literal inclusion of a file which includes a
- * definition for the NFS_HN_DREF macro for a particular architecture.
- * If it defines the wrong entry, check the AC_CHECK_NFS_HN_DREF m4 macro
- * in $srcdir/m4/macros.
- */
-@am_utils_nfs_hn_dref@
-/* End of included NFS_HN_DREF macro definition file */
-
-#endif /* not _AUX_CONF_H */
diff --git a/contrib/amd/bootstrap b/contrib/amd/bootstrap
deleted file mode 100755
index 6c351382caa5..000000000000
--- a/contrib/amd/bootstrap
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/bin/sh
-#set -x
-# helps bootstrapping am-utils, when checked out from CVS
-# requires GNU autoconf and GNU automake
-# this is not meant to go into the distributions
-# Erez Zadok <ezk@cs.columbia.edu>
-
-# test cwd
-test -f ../amd/amd.c && cd ..
-if [ ! -f amd/amd.c ]; then
- echo "Must run $0 from the top level source directory."
- exit 1
-fi
-
-# validate macros directory and some macro files
-if [ ! -d m4/macros ]; then
- echo No m4/macros directory found!
- exit 1
-fi
-if [ ! -f m4/macros/HEADER ]; then
- echo No m4/macros/HEADER file found!
- exit 1
-fi
-
-# remove any remaining autom4te.cache directory
-rm -fr autom4te.cache autom4te-*.cache
-
-# generate acinclude.m4 file
-echo "AMU: prepare acinclude.m4..."
-test -f acinclude.m4 && mv -f acinclude.m4 acinclude.m4.old
-(cd m4/macros
- for i in HEADER *.m4; do
- cat $i
- echo
- echo
- done
- cat TRAILER
-) > acinclude.m4
-
-# generate aclocal.m4 file
-echo "AMU: aclocal..."
-test -f aclocal.m4 && mv -f aclocal.m4 aclocal.m4.old
-# show version
-aclocal --version 2>&1 | head -1
-if aclocal ; then
- :
-else
- echo "aclocal command failed. fix errors and rerun $0."
- exit 2
-fi
-
-# produce new configure.in (temp) script
-echo "AMU: autoconf..."
-# show version
-autoconf --version 2>&1 | head -1
-LOG=/tmp/amu-$$.log
-rm -f ${LOG}
-autoconf configure.in > configure.new 2> ${LOG}
-# until Automake requires Autoconf 2.50, manual says to ignore this
-CUTWARNMSG1="warning: AC_PROG_LEX invoked multiple times|do not use m4_(patsubst|regexp):"
-egrep -v "${CUTWARNMSG1}" ${LOG} > ${LOG}.new
-mv ${LOG}.new ${LOG}
-if test -s ${LOG}; then
- echo "AUTOCONF ERRORS (MUST FIX):"
- cat ${LOG}
- rm -f ${LOG}
- exit 2
-fi
-# now prepare the real configure script
-test -f configure && mv -f configure configure.old
-mv -f configure.new configure
-chmod a+rx configure
-rm -f configure.old
-
-# run autoheader to produce C header .in files
-echo "AMU: autoheader..."
-# show version
-autoheader --version 2>&1 | head -1
-autoheader configure.in > config.h.in 2> ${LOG}
-CUTWARNMSG2="autoheader: \`config.h.in' is updated"
-egrep -v "${CUTWARNMSG2}" ${LOG} > ${LOG}.new
-mv ${LOG}.new ${LOG}
-if test -s ${LOG}; then
- echo "AUTOHEADER ERRORS (MUST FIX):"
- cat ${LOG}
- rm -f ${LOG}
- exit 2
-fi
-rm -f ${LOG}
-
-# generate makefiles
-cmd="automake --add-missing --copy --ignore-deps"
-#cmd="automake --add-missing"
-echo "AMU: $cmd..."
-# show version
-automake --version 2>&1 | head -1
-if ${cmd} ; then
- :
-else
- echo "automake command failed. fix errors and rerun $0."
- exit 2
-fi
-
-# save timestamp
-echo "AMU: save timestamp..."
-echo timestamp > stamp-h.in
-
-exit 0
diff --git a/contrib/amd/conf/checkmount/checkmount_bsd44.c b/contrib/amd/conf/checkmount/checkmount_bsd44.c
deleted file mode 100644
index a6ec2438da88..000000000000
--- a/contrib/amd/conf/checkmount/checkmount_bsd44.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/conf/checkmount/checkmount_bsd44.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-
-extern int is_same_host(char *name1, char *name2, struct in_addr addr2);
-int fixmount_check_mount(char *host, struct in_addr hostaddr, char *path);
-
-int
-fixmount_check_mount(char *host, struct in_addr hostaddr, char *path)
-{
- struct statfs *mntbufp, *mntp;
- int nloc, i;
- char *colon;
-
- /* read mount table from kernel */
- nloc = getmntinfo(&mntbufp, MNT_NOWAIT);
- if (nloc <= 0) {
- perror("getmntinfo");
- exit(1);
- }
-
- mntp = mntbufp;
- for (i=0; i<nloc; ++i) {
- if ((colon = strchr(mntp->f_mntfromname, ':'))) {
- *colon = '\0';
- if (STREQ(colon + 1, path) &&
- is_same_host(mntp->f_mntfromname, host, hostaddr))
- return 1;
- }
- }
-
- return 0;
-}
diff --git a/contrib/amd/conf/fh_dref/fh_dref_freebsd22.h b/contrib/amd/conf/fh_dref/fh_dref_freebsd22.h
deleted file mode 100644
index 989561d267f6..000000000000
--- a/contrib/amd/conf/fh_dref/fh_dref_freebsd22.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $srcdir/conf/fh_dref/fh_dref_freebsd22.h */
-#define NFS_FH_DREF(dst, src) (dst) = (u_char *) (src)
diff --git a/contrib/amd/conf/hn_dref/hn_dref_default.h b/contrib/amd/conf/hn_dref/hn_dref_default.h
deleted file mode 100644
index d495ea8ca943..000000000000
--- a/contrib/amd/conf/hn_dref/hn_dref_default.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $srcdir/conf/hn_dref/hn_dref_default.h */
-#define NFS_HN_DREF(dst, src) (dst) = (src)
diff --git a/contrib/amd/conf/mount/mount_default.c b/contrib/amd/conf/mount/mount_default.c
deleted file mode 100644
index 1bdf52293cfe..000000000000
--- a/contrib/amd/conf/mount/mount_default.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 1997-2003 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: mount_default.c,v 1.1.2.3 2002/12/27 22:44:48 ezk Exp $
- */
-
-/*
- * Default mount helper (currently empty)
- */
diff --git a/contrib/amd/conf/mount/mount_freebsd3.c b/contrib/amd/conf/mount/mount_freebsd3.c
deleted file mode 100644
index 5888ed949d30..000000000000
--- a/contrib/amd/conf/mount/mount_freebsd3.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 1997-1998 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: mount_freebsd3.c,v 5.2.2.1 1992/02/09 15:10:08 jsp beta $
- *
- */
-
-/*
- * FreeBSD 3.x (as of snapshot 3.0-980311-SNAP) Mount helper
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-/*
- * Map from conventional mount arguments
- * to FreeBSD 3.0 style arguments.
- */
-int
-mount_freebsd3(MTYPE_TYPE type, const char *dir, int flags, voidp data)
-{
- char const *namelist[] = INITMOUNTNAMES;
-
- return mount(namelist[type],
- dir,
- flags,
- data);
-}
diff --git a/contrib/amd/conf/mtab/mtab_bsd.c b/contrib/amd/conf/mtab/mtab_bsd.c
deleted file mode 100644
index fe3991aa575d..000000000000
--- a/contrib/amd/conf/mtab/mtab_bsd.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/conf/mtab/mtab_bsd.c
- *
- */
-
-/*
- * BSD 4.4 systems don't write their mount tables on a file. Instead, they
- * use a (better) system where the kernel keeps this state, and you access
- * the mount tables via a known interface.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-static mntent_t *
-mnt_dup(struct statfs *mp)
-{
- mntent_t *new_mp = ALLOC(mntent_t);
- char *ty;
-
- new_mp->mnt_fsname = strdup(mp->f_mntfromname);
- new_mp->mnt_dir = strdup(mp->f_mntonname);
-
-#ifdef HAVE_STRUCT_STATFS_F_FSTYPENAME
- ty = mp->f_fstypename;
-#else /* not HAVE_STRUCT_STATFS_F_FSTYPENAME */
- switch (mp->f_type) {
-
-# if defined(MOUNT_UFS) && defined(MNTTAB_TYPE_UFS)
- case MOUNT_UFS:
- ty = MNTTAB_TYPE_UFS;
- break;
-# endif /* defined(MOUNT_UFS) && defined(MNTTAB_TYPE_UFS) */
-
-# if defined(MOUNT_NFS) && defined(MNTTAB_TYPE_NFS)
- case MOUNT_NFS:
- ty = MNTTAB_TYPE_NFS;
- break;
-# endif /* defined(MOUNT_NFS) && defined(MNTTAB_TYPE_NFS) */
-
-# if defined(MOUNT_MFS) && defined(MNTTAB_TYPE_MFS)
- case MOUNT_MFS:
- ty = MNTTAB_TYPE_MFS;
- break;
-# endif /* defined(MOUNT_MFS) && defined(MNTTAB_TYPE_MFS) */
-
- default:
- ty = "unknown";
-
- break;
- }
-#endif /* not HAVE_STRUCT_STATFS_F_FSTYPENAME */
-
- new_mp->mnt_type = strdup(ty);
- new_mp->mnt_opts = strdup("unset");
- new_mp->mnt_freq = 0;
- new_mp->mnt_passno = 0;
-
- return new_mp;
-}
-
-
-/*
- * Read a mount table into memory
- */
-mntlist *
-read_mtab(char *fs, const char *mnttabname)
-{
- mntlist **mpp, *mhp;
- struct statfs *mntbufp, *mntp;
-
- int nloc = getmntinfo(&mntbufp, MNT_NOWAIT);
-
- if (nloc == 0) {
- plog(XLOG_ERROR, "Can't read mount table");
- return 0;
- }
- mpp = &mhp;
- for (mntp = mntbufp; mntp < mntbufp + nloc; mntp++) {
- /*
- * Allocate a new slot
- */
- *mpp = ALLOC(struct mntlist);
-
- /*
- * Copy the data returned by getmntent
- */
- (*mpp)->mnt = mnt_dup(mntp);
-
- /*
- * Move to next pointer
- */
- mpp = &(*mpp)->mnext;
- }
-
- /*
- * Terminate the list
- */
- *mpp = 0;
-
- return mhp;
-}
diff --git a/contrib/amd/conf/nfs_prot/nfs_prot_aix5_1.h b/contrib/amd/conf/nfs_prot/nfs_prot_aix5_1.h
deleted file mode 100644
index e7fb47861c77..000000000000
--- a/contrib/amd/conf/nfs_prot/nfs_prot_aix5_1.h
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (c) 1997-2003 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: nfs_prot_aix5_1.h,v 1.1.2.3 2002/12/27 22:44:53 ezk Exp $
- *
- */
-
-#ifndef _AMU_NFS_PROT_H
-#define _AMU_NFS_PROT_H
-
-
-/*
- * AIX 5.1 has a different aix51_nfs_args structure, hence the separate header.
- */
-
-#ifdef HAVE_RPCSVC_NFS_PROT_H
-# include <rpcsvc/nfs_prot.h>
-#endif /* HAVE_RPCSVC_NFS_PROT_H */
-#ifdef HAVE_NFS_NFSV2_H
-# include <nfs/nfsv2.h>
-#endif /* HAVE_NFS_NFSV2_H */
-#ifdef HAVE_NFS_RPCV2_H
-# include <nfs/rpcv2.h>
-#endif /* HAVE_NFS_RPCV2_H */
-#ifdef HAVE_SYS_FS_NFS_H
-# include <sys/fs/nfs.h>
-#endif /* HAVE_SYS_FS_NFS_H */
-#ifdef HAVE_RPCSVC_MOUNT_H
-# include <rpcsvc/mount.h>
-#endif /* HAVE_RPCSVC_MOUNT_H */
-
-
-/*
- * MACROS
- */
-
-#ifndef MNTPATHLEN
-# define MNTPATHLEN 1024
-#endif /* not MNTPATHLEN */
-#ifndef MNTNAMLEN
-# define MNTNAMLEN 255
-#endif /* not MNTNAMLEN */
-
-/* map field names */
-#define ex_dir ex_name
-#define gr_name g_name
-#define gr_next g_next
-#define ml_directory ml_path
-#define ml_hostname ml_name
-#define ml_next ml_nxt
-
-#define dr_drok_u diropres
-#define ca_attributes attributes
-#define ca_where where
-#define da_fhandle dir
-#define da_name name
-#define dl_entries entries
-#define dl_eof eof
-#define dr_status status
-#define dr_u diropres_u
-#define drok_attributes attributes
-#define drok_fhandle file
-#define fh_data data
-#define la_fhandle from
-#define la_to to
-#define na_atime atime
-#define na_blocks blocks
-#define na_blocksize blocksize
-#define na_ctime ctime
-#define na_fileid fileid
-#define na_fsid fsid
-#define na_gid gid
-#define na_mode mode
-#define na_mtime mtime
-#define na_nlink nlink
-#define na_rdev rdev
-#define na_size size
-#define na_type type
-#define na_uid uid
-#define ne_cookie cookie
-#define ne_fileid fileid
-#define ne_name name
-#define ne_nextentry nextentry
-#define ns_attr_u attributes
-#define ns_status status
-#define ns_u attrstat_u
-#define nt_seconds seconds
-#define nt_useconds useconds
-#define ra_count count
-#define ra_fhandle file
-#define ra_offset offset
-#define ra_totalcount totalcount
-#define raok_attributes attributes
-#define raok_len_u data_len
-#define raok_u data
-#define raok_val_u data_val
-#define rda_cookie cookie
-#define rda_count count
-#define rda_fhandle dir
-#define rdr_reply_u reply
-#define rdr_status status
-#define rdr_u readdirres_u
-#define rlr_data_u data
-#define rlr_status status
-#define rlr_u readlinkres_u
-#define rna_from from
-#define rna_to to
-#define rr_reply_u reply
-#define rr_status status
-#define rr_u readres_u
-#define sa_atime atime
-#define sa_gid gid
-#define sa_mode mode
-#define sa_mtime mtime
-#define sa_size size
-#define sa_uid uid
-#define sag_attributes attributes
-#define sag_fhandle file
-#define sfr_reply_u reply
-#define sfr_status status
-#define sfr_u statfsres_u
-#define sfrok_bavail bavail
-#define sfrok_bfree bfree
-#define sfrok_blocks blocks
-#define sfrok_bsize bsize
-#define sfrok_tsize tsize
-#define sla_attributes attributes
-#define sla_from from
-#define sla_to to
-#define wra_beginoffset beginoffset
-#define wra_fhandle file
-#define wra_len_u data_len
-#define wra_offset offset
-#define wra_totalcount totalcount
-#define wra_u data
-#define wra_val_u data_val
-
-
-/*
- * TYPEDEFS:
- */
-typedef char *dirpath;
-typedef char *name;
-typedef struct exports *exports;
-typedef struct exports exportnode;
-typedef struct groups *groups;
-typedef struct groups groupnode;
-typedef struct mountlist *mountlist;
-
-typedef attrstat nfsattrstat;
-typedef createargs nfscreateargs;
-typedef dirlist nfsdirlist;
-typedef diropargs nfsdiropargs;
-typedef diropokres nfsdiropokres;
-typedef diropres nfsdiropres;
-typedef entry nfsentry;
-typedef fattr nfsfattr;
-typedef ftype nfsftype;
-typedef linkargs nfslinkargs;
-typedef readargs nfsreadargs;
-typedef readdirargs nfsreaddirargs;
-typedef readdirres nfsreaddirres;
-typedef readlinkres nfsreadlinkres;
-typedef readokres nfsreadokres;
-typedef readres nfsreadres;
-typedef renameargs nfsrenameargs;
-typedef sattr nfssattr;
-typedef sattrargs nfssattrargs;
-typedef statfsokres nfsstatfsokres;
-typedef statfsres nfsstatfsres;
-typedef symlinkargs nfssymlinkargs;
-typedef writeargs nfswriteargs;
-
-
-/*
- * EXTERNALS:
- */
-
-
-/*
- * STRUCTURES:
- */
-
-/*
- * AIX 5.1 has NFS V3, but it is undefined in the header files.
- * so I define everything that's needed for NFS V3 here.
- */
-#ifdef MNT_NFS3
-
-#define FHSIZE3 64 /* size in bytes of a file handle (v3) */
-#define NFS3_FHSIZE 64
-#define MOUNTVERS3 ((unsigned long)(3))
-#define NFS_V3 ((unsigned long)(3))
-
-#if 0
-struct nfs_fh3 {
- u_int len;
- char val[64]; /* !!! */
-};
-#endif
-
-struct aix51_nfs_args {
- struct sockaddr_in addr; /* server address and port */
- caddr_t u0; /* ??? UNKNOWN ??? */
- unsigned long proto; /* IPPROTO_TCP/IPPROTO_UDP */
- char *hostname; /* pointer to hostname? */
- char *netname; /* pointer to netname? */
- caddr_t fh; /* pointer to NFS v3 fh? */
- unsigned long u5; /* IBM sux, IBM sux, IBM sux... */
- unsigned long flags; /* flags */
- unsigned long wsize; /* wsize */
- unsigned long rsize; /* rsize */
- unsigned long timeo; /* timeo */
- unsigned long retrans; /* retrans */
- unsigned long acregmin; /* acregmin */
- unsigned long acregmax; /* acregmax */
- unsigned long acdirmin; /* acdirmin */
- unsigned long acdirmax; /* acdirmax */
- unsigned long u15; /* ??? UNKNOWN ??? */
- struct pathcnf *pathconf; /* pathconf */
-};
-
-typedef struct {
- u_int fhandle3_len;
- char *fhandle3_val;
-} fhandle3;
-
-enum mountstat3 {
- MNT3_OK = 0,
- MNT3ERR_PERM = 1,
- MNT3ERR_NOENT = 2,
- MNT3ERR_IO = 5,
- MNT3ERR_ACCES = 13,
- MNT3ERR_NOTDIR = 20,
- MNT3ERR_INVAL = 22,
- MNT3ERR_NAMETOOLONG = 63,
- MNT3ERR_NOTSUPP = 10004,
- MNT3ERR_SERVERFAULT = 10006
-};
-typedef enum mountstat3 mountstat3;
-
-struct mountres3_ok {
- fhandle3 fhandle;
- struct {
- u_int auth_flavors_len;
- int *auth_flavors_val;
- } auth_flavors;
-};
-typedef struct mountres3_ok mountres3_ok;
-
-struct mountres3 {
- mountstat3 fhs_status;
- union {
- mountres3_ok mountinfo;
- } mountres3_u;
-};
-typedef struct mountres3 mountres3;
-
-struct nfs_fh3 {
- u_int fh3_length;
- union nfs_fh3_u {
- struct nfs_fh3_i {
- fhandle_t fh3_i;
- } nfs_fh3_i;
- char data[NFS3_FHSIZE];
- } fh3_u;
-};
-typedef struct nfs_fh3 nfs_fh3;
-
-#endif /* MNT_NFS3 */
-
-/*
- * EXTERNALS:
- */
-extern bool_t xdr_groups(XDR *xdrs, groups *objp);
-extern char *yperr_string (int incode);
-
-#endif /* not _AMU_NFS_PROT_H */
diff --git a/contrib/amd/conf/nfs_prot/nfs_prot_darwin.h b/contrib/amd/conf/nfs_prot/nfs_prot_darwin.h
deleted file mode 100644
index 9ef1e721e60d..000000000000
--- a/contrib/amd/conf/nfs_prot/nfs_prot_darwin.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (c) 1997-2003 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: nfs_prot_darwin.h,v 1.1.2.4 2002/12/27 22:44:54 ezk Exp $
- *
- */
-
-#ifndef _AMU_NFS_PROT_H
-#define _AMU_NFS_PROT_H
-
-#ifdef HAVE_RPCSVC_NFS_PROT_H
-# include <rpcsvc/nfs_prot.h>
-#endif /* HAVE_RPCSVC_NFS_PROT_H */
-#ifdef HAVE_NFS_RPCV2_H
-# include <nfs/rpcv2.h>
-#endif /* HAVE_NFS_RPCV2_H */
-#ifdef HAVE_NFS_NFS_H
-# include <nfs/nfs.h>
-#endif /* HAVE_NFS_NFS_H */
-#ifdef HAVE_UFS_UFS_UFSMOUNT_H
-# include <ufs/ufs/ufsmount.h>
-#endif /* HAVE_UFS_UFS_UFSMOUNT_H */
-
-#define MOUNTVERS3 ((unsigned long)(3))
-
-typedef struct {
- u_int fhandle3_len;
- char *fhandle3_val;
-} fhandle3;
-
-
-enum mountstat3 {
- MNT3_OK = 0,
- MNT3ERR_PERM = 1,
- MNT3ERR_NOENT = 2,
- MNT3ERR_IO = 5,
- MNT3ERR_ACCES = 13,
- MNT3ERR_NOTDIR = 20,
- MNT3ERR_INVAL = 22,
- MNT3ERR_NAMETOOLONG = 63,
- MNT3ERR_NOTSUPP = 10004,
- MNT3ERR_SERVERFAULT = 10006
-};
-typedef enum mountstat3 mountstat3;
-
-struct mountres3_ok {
- fhandle3 fhandle;
- struct {
- u_int auth_flavors_len;
- int *auth_flavors_val;
- } auth_flavors;
-};
-typedef struct mountres3_ok mountres3_ok;
-
-struct mountres3 {
- mountstat3 fhs_status;
- union {
- mountres3_ok mountinfo;
- } mountres3_u;
-};
-typedef struct mountres3 mountres3;
-
-
-/*
- * MACROS:
- */
-#define dr_drok_u diropres
-#define ca_attributes attributes
-#define ca_where where
-#define da_fhandle dir
-#define da_name name
-#define dl_entries entries
-#define dl_eof eof
-#define dr_status status
-#define dr_u diropres_u
-#define drok_attributes attributes
-#define drok_fhandle file
-#define fh_data data
-#define la_fhandle from
-#define la_to to
-#define na_atime atime
-#define na_ctime ctime
-#define na_fileid fileid
-#define na_fsid fsid
-#define na_gid gid
-#define na_mode mode
-#define na_mtime mtime
-#define na_nlink nlink
-#define na_size size
-#define na_type type
-#define na_uid uid
-#define na_blocks blocks
-#define na_blocksize blocksize
-#define na_rdev rdev
-#define ne_cookie cookie
-#define ne_fileid fileid
-#define ne_name name
-#define ne_nextentry nextentry
-#define ns_attr_u attributes
-#define ns_status status
-#define ns_u attrstat_u
-#define nt_seconds seconds
-#define nt_useconds useconds
-#define ra_count count
-#define ra_fhandle file
-#define ra_offset offset
-#define ra_totalcount totalcount
-#define raok_attributes attributes
-#define raok_len_u data_len
-#define raok_u data
-#define raok_val_u data_val
-#define rda_cookie cookie
-#define rda_count count
-#define rda_fhandle dir
-#define rdr_reply_u reply
-#define rdr_status status
-#define rdr_u readdirres_u
-#define rlr_data_u data
-#define rlr_status status
-#define rlr_u readlinkres_u
-#define rna_from from
-#define rna_to to
-#define rr_reply_u reply
-#define rr_status status
-#define rr_u readres_u
-#define sa_atime atime
-#define sa_gid gid
-#define sa_mode mode
-#define sa_mtime mtime
-#define sa_size size
-#define sa_uid uid
-#define sag_attributes attributes
-#define sag_fhandle file
-#define sfr_reply_u reply
-#define sfr_status status
-#define sfr_u statfsres_u
-#define sfrok_bavail bavail
-#define sfrok_bfree bfree
-#define sfrok_blocks blocks
-#define sfrok_bsize bsize
-#define sfrok_tsize tsize
-#define sla_attributes attributes
-#define sla_from from
-#define sla_to to
-#define wra_beginoffset beginoffset
-#define wra_fhandle file
-#define wra_len_u data_len
-#define wra_offset offset
-#define wra_totalcount totalcount
-#define wra_u data
-#define wra_val_u data_val
-
-/*
- * TYPEDEFS:
- */
-typedef attrstat nfsattrstat;
-typedef createargs nfscreateargs;
-typedef dirlist nfsdirlist;
-typedef diropargs nfsdiropargs;
-typedef diropokres nfsdiropokres;
-typedef diropres nfsdiropres;
-typedef entry nfsentry;
-typedef fattr nfsfattr;
-typedef ftype nfsftype;
-typedef linkargs nfslinkargs;
-typedef readargs nfsreadargs;
-typedef readdirargs nfsreaddirargs;
-typedef readdirres nfsreaddirres;
-typedef readlinkres nfsreadlinkres;
-typedef readokres nfsreadokres;
-typedef readres nfsreadres;
-typedef renameargs nfsrenameargs;
-typedef sattr nfssattr;
-typedef sattrargs nfssattrargs;
-typedef statfsokres nfsstatfsokres;
-typedef statfsres nfsstatfsres;
-typedef symlinkargs nfssymlinkargs;
-typedef writeargs nfswriteargs;
-
-
-/*
- *
- * FreeBSD-3.0-RELEASE has NFS V3. Older versions had it only defined
- * in the rpcgen source file. If you are on an older system, and you
- * want NFSv3 support, you need to regenerate the rpcsvc header files as
- * follows:
- * cd /usr/include/rpcsvc
- * rpcgen -h -C -DWANT_NFS3 mount.x
- * rpcgen -h -C -DWANT_NFS3 nfs_prot.x
- * If you don't want NFSv3, then you will have to turn off the NFSMNT_NFSV3
- * macro below. If the code doesn't compile, upgrade to the latest 3.0
- * version...
- */
-#ifdef NFSMNT_NFSV3
-
-# define MOUNT_NFS3 "nfs" /* is this right? */
-# define MNTOPT_NFS3 "nfs"
-
-/*
- * as of 3.0-RELEASE the nfs_fh3 that is defined in the system headers
- * (or the one generated by rpcgen) lacks the proper full definition,
- * listed below. A special macro (m4/macros/struct_nfs_fh3.m4) searches
- * for this special name before other names.
- */
-
-#define NFS3_FHSIZE 64
-#define FHSIZE3 64
-
-struct nfs_fh3_freebsd3 {
- u_int fh3_length;
- union nfs_fh3_u {
- struct nfs_fh3_i {
- fhandle_t fh3_i;
- } nfs_fh3_i;
- char data[NFS3_FHSIZE];
- } fh3_u;
-};
-typedef struct nfs_fh3_freebsd3 nfs_fh3;
-
-#endif /* NFSMNT_NFSV3 */
-
-#endif /* not _AMU_NFS_PROT_H */
diff --git a/contrib/amd/conf/nfs_prot/nfs_prot_freebsd2.h b/contrib/amd/conf/nfs_prot/nfs_prot_freebsd2.h
deleted file mode 100644
index cf7ba33ee47b..000000000000
--- a/contrib/amd/conf/nfs_prot/nfs_prot_freebsd2.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/conf/nfs_prot/nfs_prot_freebsd2.h
- *
- */
-
-#ifndef _AMU_NFS_PROT_H
-#define _AMU_NFS_PROT_H
-
-#ifdef HAVE_RPCSVC_NFS_PROT_H
-# include <rpcsvc/nfs_prot.h>
-#endif /* HAVE_RPCSVC_NFS_PROT_H */
-
-/*
- * MACROS:
- */
-#define dr_drok_u diropres
-#define ca_where where
-#define da_fhandle dir
-#define da_name name
-#define dl_entries entries
-#define dl_eof eof
-#define dr_status status
-#define dr_u diropres_u
-#define drok_attributes attributes
-#define drok_fhandle file
-#define fh_data data
-#define la_fhandle from
-#define la_to to
-#define na_atime atime
-#define na_ctime ctime
-#define na_fileid fileid
-#define na_fsid fsid
-#define na_mode mode
-#define na_mtime mtime
-#define na_nlink nlink
-#define na_size size
-#define na_type type
-#define ne_cookie cookie
-#define ne_fileid fileid
-#define ne_name name
-#define ne_nextentry nextentry
-#define ns_attr_u attributes
-#define ns_status status
-#define ns_u attrstat_u
-#define nt_seconds seconds
-#define nt_useconds useconds
-#define rda_cookie cookie
-#define rda_count count
-#define rda_fhandle dir
-#define rdr_reply_u reply
-#define rdr_status status
-#define rdr_u readdirres_u
-#define rlr_data_u data
-#define rlr_status status
-#define rlr_u readlinkres_u
-#define rna_from from
-#define rna_to to
-#define rr_status status
-#define sag_fhandle file
-#define sfr_reply_u reply
-#define sfr_status status
-#define sfr_u statfsres_u
-#define sfrok_bavail bavail
-#define sfrok_bfree bfree
-#define sfrok_blocks blocks
-#define sfrok_bsize bsize
-#define sfrok_tsize tsize
-#define sla_from from
-#define wra_fhandle file
-
-
-/*
- * TYPEDEFS:
- */
-typedef attrstat nfsattrstat;
-typedef createargs nfscreateargs;
-typedef dirlist nfsdirlist;
-typedef diropargs nfsdiropargs;
-typedef diropres nfsdiropres;
-typedef entry nfsentry;
-typedef fattr nfsfattr;
-typedef ftype nfsftype;
-typedef linkargs nfslinkargs;
-typedef readargs nfsreadargs;
-typedef readdirargs nfsreaddirargs;
-typedef readdirres nfsreaddirres;
-typedef readlinkres nfsreadlinkres;
-typedef readres nfsreadres;
-typedef renameargs nfsrenameargs;
-typedef sattrargs nfssattrargs;
-typedef statfsokres nfsstatfsokres;
-typedef statfsres nfsstatfsres;
-typedef symlinkargs nfssymlinkargs;
-typedef writeargs nfswriteargs;
-
-
-/*
- * FreeBSD 2.2.x has NFS V3, but it does not define enough macros
- * in the headers to automatically detect it.
- * So fake it in the meant time.
- */
-#if 0
-#define MOUNT_NFS3 MOUNT_NFS
-#endif
-
-
-#endif /* not _AMU_NFS_PROT_H */
diff --git a/contrib/amd/conf/nfs_prot/nfs_prot_freebsd3.h b/contrib/amd/conf/nfs_prot/nfs_prot_freebsd3.h
deleted file mode 100644
index edcc57540fee..000000000000
--- a/contrib/amd/conf/nfs_prot/nfs_prot_freebsd3.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/conf/nfs_prot/nfs_prot_freebsd3.h
- *
- */
-
-#ifndef _AMU_NFS_PROT_H
-#define _AMU_NFS_PROT_H
-
-#ifdef HAVE_RPCSVC_NFS_PROT_H
-# include <rpcsvc/nfs_prot.h>
-#endif /* HAVE_RPCSVC_NFS_PROT_H */
-#ifdef HAVE_NFS_RPCV2_H
-# include <nfs/rpcv2.h>
-#endif /* HAVE_NFS_RPCV2_H */
-#ifdef HAVE_NFS_NFS_H
-# include <nfs/nfs.h>
-#endif /* HAVE_NFS_NFS_H */
-#ifdef HAVE_UFS_UFS_UFSMOUNT_H
-# ifdef HAVE_UFS_UFS_EXTATTR_H
-/*
- * Define a dummy struct ufs_extattr_per_mount, which is used in struct
- * ufsmount in <ufs/ufs/ufsmount.h>.
- */
-struct ufs_extattr_per_mount;
-# endif /* HAVE_UFS_UFS_EXTATTR_H */
-# include <ufs/ufs/ufsmount.h>
-#endif /* HAVE_UFS_UFS_UFSMOUNT_H */
-
-/* nfsclient/nfsargs.h was introduced in FreeBSD 5.0, and is needed */
-#ifdef HAVE_NFSCLIENT_NFSARGS_H
-# include <nfsclient/nfsargs.h>
-#endif /* HAVE_NFSCLIENT_NFSARGS_H */
-
-/*
- * MACROS:
- */
-#define dr_drok_u diropres
-#define ca_where where
-#define da_fhandle dir
-#define da_name name
-#define dl_entries entries
-#define dl_eof eof
-#define dr_status status
-#define dr_u diropres_u
-#define drok_attributes attributes
-#define drok_fhandle file
-#define fh_data data
-#define la_fhandle from
-#define la_to to
-#define na_atime atime
-#define na_ctime ctime
-#define na_fileid fileid
-#define na_fsid fsid
-#define na_mode mode
-#define na_mtime mtime
-#define na_nlink nlink
-#define na_size size
-#define na_type type
-#define na_uid uid
-#define ne_cookie cookie
-#define ne_fileid fileid
-#define ne_name name
-#define ne_nextentry nextentry
-#define ns_attr_u attributes
-#define ns_status status
-#define ns_u attrstat_u
-#define nt_seconds seconds
-#define nt_useconds useconds
-#define rda_cookie cookie
-#define rda_count count
-#define rda_fhandle dir
-#define rdr_reply_u reply
-#define rdr_status status
-#define rdr_u readdirres_u
-#define rlr_data_u data
-#define rlr_status status
-#define rlr_u readlinkres_u
-#define rna_from from
-#define rna_to to
-#define rr_status status
-#define sag_fhandle file
-#define sfr_reply_u reply
-#define sfr_status status
-#define sfr_u statfsres_u
-#define sfrok_bavail bavail
-#define sfrok_bfree bfree
-#define sfrok_blocks blocks
-#define sfrok_bsize bsize
-#define sfrok_tsize tsize
-#define sla_from from
-#define wra_fhandle file
-
-
-/*
- * TYPEDEFS:
- */
-typedef attrstat nfsattrstat;
-typedef createargs nfscreateargs;
-typedef dirlist nfsdirlist;
-typedef diropargs nfsdiropargs;
-typedef diropres nfsdiropres;
-typedef entry nfsentry;
-typedef fattr nfsfattr;
-typedef ftype nfsftype;
-typedef linkargs nfslinkargs;
-typedef readargs nfsreadargs;
-typedef readdirargs nfsreaddirargs;
-typedef readdirres nfsreaddirres;
-typedef readlinkres nfsreadlinkres;
-typedef readres nfsreadres;
-typedef renameargs nfsrenameargs;
-typedef sattrargs nfssattrargs;
-typedef statfsokres nfsstatfsokres;
-typedef statfsres nfsstatfsres;
-typedef symlinkargs nfssymlinkargs;
-typedef writeargs nfswriteargs;
-
-
-/*
- *
- * FreeBSD-3.0-RELEASE has NFS V3. Older versions had it only defined
- * in the rpcgen source file. If you are on an older system, and you
- * want NFSv3 support, you need to regenerate the rpcsvc header files as
- * follows:
- * cd /usr/include/rpcsvc
- * rpcgen -h -C -DWANT_NFS3 mount.x
- * rpcgen -h -C -DWANT_NFS3 nfs_prot.x
- * If you don't want NFSv3, then you will have to turn off the NFSMNT_NFSV3
- * macro below. If the code doesn't compile, upgrade to the latest 3.0
- * version...
- */
-#ifdef NFSMNT_NFSV3
-
-# define MOUNT_NFS3 "nfs" /* is this right? */
-# define MNTOPT_NFS3 "nfs"
-
-# ifndef HAVE_XDR_LOOKUP3RES
-/*
- * FreeBSD uses different field names than are defined on most other
- * systems.
- */
-# define AMU_LOOKUP3RES_OK(x) ((x)->LOOKUP3res_u.resok)
-# define AMU_LOOKUP3RES_FAIL(x) ((x)->LOOKUP3res_u.resfail)
-# define AMU_LOOKUP3RES_FH_LEN(x) (AMU_LOOKUP3RES_OK(x).object.data.data_len)
-# define AMU_LOOKUP3RES_FH_DATA(x) (AMU_LOOKUP3RES_OK(x).object.data.data_val)
-# endif /* not HAVE_XDR_LOOKUP3RES */
-
-#endif /* NFSMNT_NFSV3 */
-
-#endif /* not _AMU_NFS_PROT_H */
diff --git a/contrib/amd/conf/nfs_prot/nfs_prot_osf5.h b/contrib/amd/conf/nfs_prot/nfs_prot_osf5.h
deleted file mode 100644
index 655e98d03902..000000000000
--- a/contrib/amd/conf/nfs_prot/nfs_prot_osf5.h
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Copyright (c) 1997-2003 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: nfs_prot_osf5.h,v 1.1.2.4 2002/12/27 22:44:57 ezk Exp $
- *
- */
-
-#ifndef _AMU_NFS_PROT_H
-#define _AMU_NFS_PROT_H
-
-#ifdef HAVE_RPCSVC_NFS_PROT_H
-# include <rpcsvc/nfs_prot.h>
-#endif /* HAVE_RPCSVC_NFS_PROT_H */
-#ifdef HAVE_NFS_NFS_H
-# include <nfs/nfs.h>
-#endif /* HAVE_NFS_NFS_H */
-#ifdef HAVE_RPCSVC_MOUNTV3_H
-# include <rpcsvc/mountv3.h>
-#endif /* HAVE_RPCSVC_MOUNTV3_H */
-#ifdef HAVE_RPC_RPC_H
-# include <rpc/rpc.h>
-#endif /* HAVE_RPC_RPC_H */
-
-/* avoid conflicts with Irix's EFS */
-#undef MOUNT_EFS /* DCE Episode FS */
-
-/*
- * The NFSMNT_AUTO flag in Tru64 UNIX V5 has two effects: it causes df and
- * mount not to display this mount point without the -e switch, as it did in
- * previous releases. Unfortunately it also ignores the timeo mount option,
- * disables the usual timeout backof and enforces a timeout of NFS_MAXTIMO
- * (20 seconds) instead. This breaks amd which can sometimes take longer to
- * respond to an NFS request, causing `nfs server not responding still trying'
- * messages.
- *
- * To avoid this, we need to completely disable this flag on automount points,
- * with the unfortunate side effect that they are no longer hidden in df and
- * mount output.
- */
-#undef MNT2_NFS_OPT_AUTO
-
-/*
- * MACROS
- */
-
-#define NFS_PORT 2049
-#define NFS_MAXDATA 8192
-#define NFS_MAXPATHLEN 1024
-#define NFS_MAXNAMLEN 255
-#define NFS_FHSIZE 32
-#define NFS_COOKIESIZE 4
-#define MNTPATHLEN 1024
-#define MNTNAMLEN 255
-
-#define NFSMODE_FMT 0170000
-#define NFSMODE_DIR 0040000
-#define NFSMODE_CHR 0020000
-#define NFSMODE_BLK 0060000
-#define NFSMODE_REG 0100000
-#define NFSMODE_LNK 0120000
-#define NFSMODE_SOCK 0140000
-#define NFSMODE_FIFO 0010000
-
-#ifndef NFS_PROGRAM
-# define NFS_PROGRAM ((u_long)100003)
-#endif /* not NFS_PROGRAM */
-#ifndef NFS_VERSION
-# define NFS_VERSION ((u_long)2)
-#endif /* not NFS_VERSION */
-
-#define NFSPROC_NULL ((u_long)0)
-#define NFSPROC_GETATTR ((u_long)1)
-#define NFSPROC_SETATTR ((u_long)2)
-#define NFSPROC_ROOT ((u_long)3)
-#define NFSPROC_LOOKUP ((u_long)4)
-#define NFSPROC_READLINK ((u_long)5)
-#define NFSPROC_READ ((u_long)6)
-#define NFSPROC_WRITECACHE ((u_long)7)
-#define NFSPROC_WRITE ((u_long)8)
-#define NFSPROC_CREATE ((u_long)9)
-#define NFSPROC_REMOVE ((u_long)10)
-#define NFSPROC_RENAME ((u_long)11)
-#define NFSPROC_LINK ((u_long)12)
-#define NFSPROC_SYMLINK ((u_long)13)
-#define NFSPROC_MKDIR ((u_long)14)
-#define NFSPROC_RMDIR ((u_long)15)
-#define NFSPROC_READDIR ((u_long)16)
-#define NFSPROC_STATFS ((u_long)17)
-
-/* map field names */
-#define ml_hostname ml_name
-#define ml_directory ml_path
-#define ml_next ml_nxt
-#define gr_next g_next
-#define gr_name g_name
-#define ex_dir ex_name
-
-#define drok_attributes drok_attr
-#define na_fileid na_nodeid
-#define la_fhandle la_from
-#define nt_seconds tv_sec
-#define nt_useconds tv_usec
-#define ra_totalcount ra_totcount
-#define sla_to sla_tnm
-#define sla_attributes sla_sa
-#define sag_fhandle saa_fh
-#define sag_attributes saa_sa
-#define sfrok_tsize fsok_tsize
-#define sfrok_bsize fsok_bsize
-#define sfrok_blocks fsok_blocks
-#define sfrok_bfree fsok_bfree
-#define sfrok_bavail fsok_bavail
-#define sfr_status fs_status
-#define sfr_u fs_u
-#define sfr_reply_u fs_fsok_u
-#define wra_fhandle wa_fhandle
-#define wra_beginoffset wa_begoff
-#define wra_offset wa_offset
-#define wra_totalcount wa_totcount
-#define wra_u wa_mbuf->m_hdr
-#define wra_val_u mh_data
-#define wra_len_u mh_len
-
-
-/*
- * TYPEDEFS:
- */
-typedef char *dirpath;
-typedef char *filename;
-typedef char *name;
-typedef char *nfspath;
-typedef char nfscookie[NFS_COOKIESIZE];
-typedef enum nfsftype nfsftype;
-typedef enum nfsstat nfsstat;
-typedef struct nfssvcfh fhandle;
-typedef struct nfsattrstat nfsattrstat;
-typedef struct nfscreateargs nfscreateargs;
-typedef struct nfsdirlist nfsdirlist;
-typedef struct nfsdiropargs nfsdiropargs;
-typedef struct nfsdrok nfsdiropokres;
-typedef struct nfsdiropres nfsdiropres;
-typedef struct nfsentry nfsentry;
-typedef struct exports *exports;
-typedef struct exports exportnode;
-typedef struct nfsfattr nfsfattr;
-typedef struct fhstatus fhstatus;
-typedef struct groups *groups;
-typedef struct groups groupnode;
-typedef struct nfslinkargs nfslinkargs;
-typedef struct mountlist *mountlist;
-typedef struct mountlist mountbody;
-typedef struct _nfs_fh _nfs_fh;
-typedef struct timeval nfstime;
-typedef struct nfsreadargs nfsreadargs;
-typedef struct nfsreaddirargs nfsreaddirargs;
-typedef struct nfsreaddirres nfsreaddirres;
-typedef struct nfsreadlinkres nfsreadlinkres;
-typedef struct nfsreadokres nfsreadokres;
-typedef struct nfsreadres nfsreadres;
-typedef struct nfsrenameargs nfsrenameargs;
-typedef struct nfssattr nfssattr;
-typedef struct nfssaargs nfssattrargs;
-typedef struct nfsstatfsok nfsstatfsokres;
-typedef struct nfsstatfs nfsstatfsres;
-typedef struct nfsslargs nfssymlinkargs;
-typedef struct nfswriteargs nfswriteargs;
-
-
-/*
- * EXTERNALS:
- */
-
-extern void *nfsproc_null_2_svc(void *, struct svc_req *);
-extern nfsattrstat *nfsproc_getattr_2_svc(struct nfssvcfh *, struct svc_req *);
-extern nfsattrstat *nfsproc_setattr_2_svc(nfssattrargs *, struct svc_req *);
-extern void *nfsproc_root_2_svc(void *, struct svc_req *);
-extern nfsdiropres *nfsproc_lookup_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsreadlinkres *nfsproc_readlink_2_svc(struct nfssvcfh *, struct svc_req *);
-extern nfsreadres *nfsproc_read_2_svc(nfsreadargs *, struct svc_req *);
-extern void *nfsproc_writecache_2_svc(void *, struct svc_req *);
-extern nfsattrstat *nfsproc_write_2_svc(nfswriteargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_create_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_remove_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsstat *nfsproc_rename_2_svc(nfsrenameargs *, struct svc_req *);
-extern nfsstat *nfsproc_link_2_svc(nfslinkargs *, struct svc_req *);
-extern nfsstat *nfsproc_symlink_2_svc(nfssymlinkargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_mkdir_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_rmdir_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsreaddirres *nfsproc_readdir_2_svc(nfsreaddirargs *, struct svc_req *);
-extern nfsstatfsres *nfsproc_statfs_2_svc(struct nfssvcfh *, struct svc_req *);
-
-extern bool_t xdr_nfsstat(XDR *, nfsstat*);
-extern bool_t xdr_ftype(XDR *, nfsftype*);
-extern bool_t xdr_nfs_fh(XDR *, struct nfssvcfh*);
-extern bool_t xdr_nfstime(XDR *, nfstime*);
-extern bool_t xdr_fattr(XDR *, nfsfattr*);
-extern bool_t xdr_sattr(XDR *, nfssattr*);
-extern bool_t xdr_filename(XDR *, filename*);
-extern bool_t xdr_nfspath(XDR *, nfspath*);
-extern bool_t xdr_attrstat(XDR *, nfsattrstat*);
-extern bool_t xdr_sattrargs(XDR *, nfssattrargs*);
-extern bool_t xdr_diropargs(XDR *, nfsdiropargs*);
-extern bool_t xdr_diropokres(XDR *, nfsdiropokres*);
-extern bool_t xdr_diropres(XDR *, nfsdiropres*);
-extern bool_t xdr_readlinkres(XDR *, nfsreadlinkres*);
-extern bool_t xdr_readargs(XDR *, nfsreadargs*);
-extern bool_t xdr_readokres(XDR *, nfsreadokres*);
-extern bool_t xdr_readres(XDR *, nfsreadres*);
-extern bool_t xdr_writeargs(XDR *, nfswriteargs*);
-extern bool_t xdr_createargs(XDR *, nfscreateargs*);
-extern bool_t xdr_renameargs(XDR *, nfsrenameargs*);
-extern bool_t xdr_linkargs(XDR *, nfslinkargs*);
-extern bool_t xdr_symlinkargs(XDR *, nfssymlinkargs*);
-extern bool_t xdr_nfscookie(XDR *, nfscookie);
-extern bool_t xdr_readdirargs(XDR *, nfsreaddirargs*);
-extern bool_t xdr_entry(XDR *, nfsentry*);
-extern bool_t xdr_dirlist(XDR *, nfsdirlist*);
-extern bool_t xdr_readdirres(XDR *, nfsreaddirres*);
-extern bool_t xdr_statfsokres(XDR *, nfsstatfsokres*);
-extern bool_t xdr_statfsres(XDR *, nfsstatfsres*);
-
-
-/*
- * STRUCTURES:
- */
-
-struct _nfs_fh {
- char data[NFS_FHSIZE];
-};
-
-struct nfstime {
- u_int nt_seconds;
- u_int nt_useconds;
-};
-
-struct _fattr {
- nfsftype na_type;
- u_int na_mode;
- u_int na_nlink;
- u_int na_uid;
- u_int na_gid;
- u_int na_size;
- u_int na_blocksize;
- u_int na_rdev;
- u_int na_blocks;
- u_int na_fsid;
- u_int na_fileid;
- nfstime na_atime;
- nfstime na_mtime;
- nfstime na_ctime;
-};
-
-struct _sattr {
- u_int sa_mode;
- u_int sa_uid;
- u_int sa_gid;
- u_int sa_size;
- nfstime sa_atime;
- nfstime sa_mtime;
-};
-
-struct _attrstat {
- nfsstat ns_status;
- union {
- nfsfattr ns_attr_u;
- } ns_u;
-};
-
-struct _sattrargs {
- struct nfssvcfh sag_fhandle;
- nfssattr sag_attributes;
-};
-
-struct _diropargs {
- struct nfssvcfh da_fhandle; /* was dir */
- filename da_name;
-};
-
-struct _diropokres {
- struct nfssvcfh drok_fhandle;
- nfsfattr drok_attributes;
-};
-
-struct _diropres {
- nfsstat dr_status; /* was status */
- union {
- nfsdiropokres dr_drok_u; /* was diropres */
- } dr_u; /* was diropres_u */
-};
-
-struct nfsreadlinkres {
- nfsstat rlr_status;
- union {
- nfspath rlr_data_u;
- } rlr_u;
-};
-
-struct _readargs {
- struct nfssvcfh ra_fhandle;
- u_int ra_offset;
- u_int ra_count;
- u_int ra_totalcount;
-};
-
-struct nfsreadokres {
- nfsfattr raok_attributes;
- struct {
- u_int raok_len_u;
- char *raok_val_u;
- } raok_u;
-};
-
-struct nfsreadres {
- nfsstat rr_status;
- union {
- nfsreadokres rr_reply_u;
- } rr_u;
-};
-
-#if 0
-struct _writeargs {
- struct nfssvcfh wra_fhandle;
- u_int wra_beginoffset;
- u_int wra_offset;
- u_int wra_totalcount;
- struct {
- u_int wra_len_u;
- char *wra_val_u;
- } wra_u;
-};
-#endif
-
-struct nfscreateargs {
- nfsdiropargs ca_where;
- nfssattr ca_attributes;
-};
-
-struct nfsrenameargs {
- nfsdiropargs rna_from;
- nfsdiropargs rna_to;
-};
-
-struct _linkargs {
- struct nfssvcfh la_fhandle;
- nfsdiropargs la_to;
-};
-
-struct _symlinkargs {
- nfsdiropargs sla_from;
- nfspath sla_to;
- nfssattr sla_attributes;
-};
-
-struct nfsreaddirargs {
- struct nfssvcfh rda_fhandle;
- nfscookie rda_cookie;
- u_int rda_count;
-};
-
-struct nfsentry {
- u_int ne_fileid;
- filename ne_name;
- nfscookie ne_cookie;
- nfsentry *ne_nextentry;
-};
-
-struct nfsdirlist {
- nfsentry *dl_entries;
- bool_t dl_eof;
-};
-
-struct nfsreaddirres {
- nfsstat rdr_status;
- union {
- nfsdirlist rdr_reply_u;
- } rdr_u;
-};
-
-struct _statfsokres {
- u_int sfrok_tsize;
- u_int sfrok_bsize;
- u_int sfrok_blocks;
- u_int sfrok_bfree;
- u_int sfrok_bavail;
-};
-
-struct _statfsres {
- nfsstat sfr_status;
- union {
- nfsstatfsokres sfr_reply_u;
- } sfr_u;
-};
-
-#endif /* not _AMU_NFS_PROT_H */
diff --git a/contrib/amd/conf/nfs_prot/nfs_prot_sunos5_8.h b/contrib/amd/conf/nfs_prot/nfs_prot_sunos5_8.h
deleted file mode 100644
index 639262229608..000000000000
--- a/contrib/amd/conf/nfs_prot/nfs_prot_sunos5_8.h
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright (c) 1997-2003 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: nfs_prot_sunos5_8.h,v 1.2.2.4 2002/12/27 22:44:59 ezk Exp $
- *
- */
-
-#ifndef _AMU_NFS_PROT_H
-#define _AMU_NFS_PROT_H
-
-/*
- * Do NOT include <rpcsvc/nfs_prot.h> to get NFS V2 specs, because
- * it will result in conflicts with <nfs/nfs.h>. The latter is a must
- * for NFS V3 specs.
- */
-
-#ifdef HAVE_NFS_NFS_H
-# include <nfs/nfs.h>
-#endif /* HAVE_NFS_NFS_H */
-
-#ifdef HAVE_RPCSVC_MOUNT_H
-# include <rpcsvc/mount.h>
-#endif /* HAVE_RPCSVC_MOUNT_H */
-
-#ifdef HAVE_RPC_RPC_H
-# include <rpc/rpc.h>
-#endif /* HAVE_RPC_RPC_H */
-
-
-/*
- * MACROS
- */
-
-#define NFS_PORT 2049
-#define NFS_MAXDATA 8192
-#define NFS_MAXPATHLEN 1024
-#define NFS_MAXNAMLEN 255
-#define NFS_FHSIZE 32
-#define NFS_COOKIESIZE 4
-
-#define NFSMODE_FMT 0170000
-#define NFSMODE_DIR 0040000
-#define NFSMODE_CHR 0020000
-#define NFSMODE_BLK 0060000
-#define NFSMODE_REG 0100000
-#define NFSMODE_LNK 0120000
-#define NFSMODE_SOCK 0140000
-#define NFSMODE_FIFO 0010000
-
-#define NFSPROC_NULL ((unsigned long)(0))
-#define NFSPROC_GETATTR ((unsigned long)(1))
-#define NFSPROC_SETATTR ((unsigned long)(2))
-#define NFSPROC_ROOT ((unsigned long)(3))
-#define NFSPROC_LOOKUP ((unsigned long)(4))
-#define NFSPROC_READLINK ((unsigned long)(5))
-#define NFSPROC_READ ((unsigned long)(6))
-#define NFSPROC_WRITECACHE ((unsigned long)(7))
-#define NFSPROC_WRITE ((unsigned long)(8))
-#define NFSPROC_CREATE ((unsigned long)(9))
-#define NFSPROC_REMOVE ((unsigned long)(10))
-#define NFSPROC_RENAME ((unsigned long)(11))
-#define NFSPROC_LINK ((unsigned long)(12))
-#define NFSPROC_SYMLINK ((unsigned long)(13))
-#define NFSPROC_MKDIR ((unsigned long)(14))
-#define NFSPROC_RMDIR ((unsigned long)(15))
-#define NFSPROC_READDIR ((unsigned long)(16))
-#define NFSPROC_STATFS ((unsigned long)(17))
-
-
-/*
- * TYPEDEFS:
- */
-
-typedef char *filename;
-typedef char *nfspath;
-typedef char nfscookie[NFS_COOKIESIZE];
-typedef enum nfsftype nfsftype;
-typedef struct attrstat nfsattrstat;
-typedef struct createargs nfscreateargs;
-typedef struct dirlist nfsdirlist;
-typedef struct diropargs nfsdiropargs;
-typedef struct diropokres nfsdiropokres;
-typedef struct diropres nfsdiropres;
-typedef struct entry nfsentry;
-typedef struct fattr nfsfattr;
-typedef struct linkargs nfslinkargs;
-typedef struct nfs_fh nfs_fh;
-typedef struct nfstime nfstime;
-typedef struct readargs nfsreadargs;
-typedef struct readdirargs nfsreaddirargs;
-typedef struct readdirres nfsreaddirres;
-typedef struct readlinkres nfsreadlinkres;
-typedef struct readokres nfsreadokres;
-typedef struct readres nfsreadres;
-typedef struct renameargs nfsrenameargs;
-typedef struct sattr nfssattr;
-typedef struct sattrargs nfssattrargs;
-typedef struct statfsokres nfsstatfsokres;
-typedef struct statfsres nfsstatfsres;
-typedef struct symlinkargs nfssymlinkargs;
-typedef struct writeargs nfswriteargs;
-
-
-/*
- * EXTERNALS:
- */
-
-extern bool_t xdr_nfsstat(XDR *, nfsstat *);
-extern bool_t xdr_ftype(XDR *, nfsftype *);
-extern bool_t xdr_nfs_fh(XDR *, nfs_fh *);
-extern bool_t xdr_nfstime(XDR *, nfstime *);
-extern bool_t xdr_fattr(XDR *, nfsfattr *);
-extern bool_t xdr_sattr(XDR *, nfssattr *);
-extern bool_t xdr_filename(XDR *, filename *);
-extern bool_t xdr_nfspath(XDR *, nfspath *);
-extern bool_t xdr_attrstat(XDR *, nfsattrstat *);
-extern bool_t xdr_sattrargs(XDR *, nfssattrargs *);
-extern bool_t xdr_diropargs(XDR *, nfsdiropargs *);
-extern bool_t xdr_diropokres(XDR *, nfsdiropokres *);
-extern bool_t xdr_diropres(XDR *, nfsdiropres *);
-extern bool_t xdr_readlinkres(XDR *, nfsreadlinkres *);
-extern bool_t xdr_readargs(XDR *, nfsreadargs *);
-extern bool_t xdr_readokres(XDR *, nfsreadokres *);
-extern bool_t xdr_readres(XDR *, nfsreadres *);
-extern bool_t xdr_writeargs(XDR *, nfswriteargs *);
-extern bool_t xdr_createargs(XDR *, nfscreateargs *);
-extern bool_t xdr_renameargs(XDR *, nfsrenameargs *);
-extern bool_t xdr_linkargs(XDR *, nfslinkargs *);
-extern bool_t xdr_symlinkargs(XDR *, nfssymlinkargs *);
-extern bool_t xdr_nfscookie(XDR *, nfscookie);
-extern bool_t xdr_readdirargs(XDR *, nfsreaddirargs *);
-extern bool_t xdr_entry(XDR *, nfsentry *);
-extern bool_t xdr_dirlist(XDR *, nfsdirlist *);
-extern bool_t xdr_readdirres(XDR *, nfsreaddirres *);
-extern bool_t xdr_statfsokres(XDR *, nfsstatfsokres *);
-extern bool_t xdr_statfsres(XDR *, nfsstatfsres *);
-
-extern nfsattrstat *nfsproc_getattr_2(nfs_fh *, CLIENT *);
-extern nfsattrstat *nfsproc_getattr_2_svc(nfs_fh *, struct svc_req *);
-extern nfsattrstat *nfsproc_setattr_2(nfssattrargs *, CLIENT *);
-extern nfsattrstat *nfsproc_setattr_2_svc(nfssattrargs *, struct svc_req *);
-extern nfsattrstat *nfsproc_write_2(nfswriteargs *, CLIENT *);
-extern nfsattrstat *nfsproc_write_2_svc(nfswriteargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_create_2(nfscreateargs *, CLIENT *);
-extern nfsdiropres *nfsproc_create_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_lookup_2(nfsdiropargs *, CLIENT *);
-extern nfsdiropres *nfsproc_lookup_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_mkdir_2(nfscreateargs *, CLIENT *);
-extern nfsdiropres *nfsproc_mkdir_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_link_2(nfslinkargs *, CLIENT *);
-extern nfsstat *nfsproc_link_2_svc(nfslinkargs *, struct svc_req *);
-extern nfsstat *nfsproc_remove_2(nfsdiropargs *, CLIENT *);
-extern nfsstat *nfsproc_remove_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsstat *nfsproc_rename_2(nfsrenameargs *, CLIENT *);
-extern nfsstat *nfsproc_rename_2_svc(nfsrenameargs *, struct svc_req *);
-extern nfsstat *nfsproc_rmdir_2(nfsdiropargs *, CLIENT *);
-extern nfsstat *nfsproc_rmdir_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsstat *nfsproc_symlink_2(nfssymlinkargs *, CLIENT *);
-extern nfsstat *nfsproc_symlink_2_svc(nfssymlinkargs *, struct svc_req *);
-extern nfsreaddirres *nfsproc_readdir_2(nfsreaddirargs *, CLIENT *);
-extern nfsreaddirres *nfsproc_readdir_2_svc(nfsreaddirargs *, struct svc_req *);
-extern nfsreadlinkres *nfsproc_readlink_2(nfs_fh *, CLIENT *);
-extern nfsreadlinkres *nfsproc_readlink_2_svc(nfs_fh *, struct svc_req *);
-extern nfsreadres *nfsproc_read_2(nfsreadargs *, CLIENT *);
-extern nfsreadres *nfsproc_read_2_svc(nfsreadargs *, struct svc_req *);
-extern nfsstatfsres *nfsproc_statfs_2(nfs_fh *, CLIENT *);
-extern nfsstatfsres *nfsproc_statfs_2_svc(nfs_fh *, struct svc_req *);
-extern void *nfsproc_null_2(void *, CLIENT *);
-extern void *nfsproc_null_2_svc(void *, struct svc_req *);
-extern void *nfsproc_root_2(void *, CLIENT *);
-extern void *nfsproc_root_2_svc(void *, struct svc_req *);
-extern void *nfsproc_writecache_2(void *, CLIENT *);
-extern void *nfsproc_writecache_2_svc(void *, struct svc_req *);
-extern int nfs_program_2_freeresult(SVCXPRT *, xdrproc_t, caddr_t);
-
-
-/*
- * ENUMS:
- */
-
-
-/*
- * STRUCTURES:
- */
-
-struct nfs_fh {
- char fh_data[NFS_FHSIZE];
-};
-
-struct nfstime {
- u_int nt_seconds;
- u_int nt_useconds;
-};
-
-struct fattr {
- nfsftype na_type;
- u_int na_mode;
- u_int na_nlink;
- u_int na_uid;
- u_int na_gid;
- u_int na_size;
- u_int na_blocksize;
- u_int na_rdev;
- u_int na_blocks;
- u_int na_fsid;
- u_int na_fileid;
- nfstime na_atime;
- nfstime na_mtime;
- nfstime na_ctime;
-};
-
-struct sattr {
- u_int sa_mode;
- u_int sa_uid;
- u_int sa_gid;
- u_int sa_size;
- nfstime sa_atime;
- nfstime sa_mtime;
-};
-
-struct attrstat {
- nfsstat ns_status;
- union {
- nfsfattr ns_attr_u;
- } ns_u;
-};
-
-struct sattrargs {
- nfs_fh sag_fhandle;
- nfssattr sag_attributes;
-};
-
-struct diropargs {
- nfs_fh da_fhandle; /* was dir */
- filename da_name;
-};
-
-struct diropokres {
- nfs_fh drok_fhandle;
- nfsfattr drok_attributes;
-};
-
-struct diropres {
- nfsstat dr_status; /* was status */
- union {
- nfsdiropokres dr_drok_u; /* was diropres */
- } dr_u; /* was diropres_u */
-};
-
-struct readlinkres {
- nfsstat rlr_status;
- union {
- nfspath rlr_data_u;
- } rlr_u;
-};
-
-struct readargs {
- nfs_fh ra_fhandle;
- u_int ra_offset;
- u_int ra_count;
- u_int ra_totalcount;
-};
-
-struct readokres {
- nfsfattr raok_attributes;
- struct {
- u_int raok_len_u;
- char *raok_val_u;
- } raok_u;
-};
-
-struct readres {
- nfsstat rr_status;
- union {
- nfsreadokres rr_reply_u;
- } rr_u;
-};
-
-struct writeargs {
- nfs_fh wra_fhandle;
- u_int wra_beginoffset;
- u_int wra_offset;
- u_int wra_totalcount;
- struct {
- u_int wra_len_u;
- char *wra_val_u;
- } wra_u;
-};
-
-struct createargs {
- nfsdiropargs ca_where;
- nfssattr ca_attributes;
-};
-
-struct renameargs {
- nfsdiropargs rna_from;
- nfsdiropargs rna_to;
-};
-
-struct linkargs {
- nfs_fh la_fhandle;
- nfsdiropargs la_to;
-};
-
-struct symlinkargs {
- nfsdiropargs sla_from;
- nfspath sla_to;
- nfssattr sla_attributes;
-};
-
-struct readdirargs {
- nfs_fh rda_fhandle;
- nfscookie rda_cookie;
- u_int rda_count;
-};
-
-struct entry {
- u_int ne_fileid;
- filename ne_name;
- nfscookie ne_cookie;
- nfsentry *ne_nextentry;
-};
-
-struct dirlist {
- nfsentry *dl_entries;
- bool_t dl_eof;
-};
-
-struct readdirres {
- nfsstat rdr_status;
- union {
- nfsdirlist rdr_reply_u;
- } rdr_u;
-};
-
-struct statfsokres {
- u_int sfrok_tsize;
- u_int sfrok_bsize;
- u_int sfrok_blocks;
- u_int sfrok_bfree;
- u_int sfrok_bavail;
-};
-
-struct statfsres {
- nfsstat sfr_status;
- union {
- nfsstatfsokres sfr_reply_u;
- } sfr_u;
-};
-
-#endif /* not _AMU_NFS_PROT_H */
diff --git a/contrib/amd/conf/sa_dref/sa_dref_bsd44.h b/contrib/amd/conf/sa_dref/sa_dref_bsd44.h
deleted file mode 100644
index a8075401477e..000000000000
--- a/contrib/amd/conf/sa_dref/sa_dref_bsd44.h
+++ /dev/null
@@ -1,6 +0,0 @@
-/* $srcdir/conf/sa_dref/sa_dref_bsd44.h */
-#define NFS_SA_DREF(dst, src) { \
- (dst)->addr = (struct sockaddr *) (src); \
- (dst)->addrlen = sizeof(*src); \
- }
-#define NFS_ARGS_T_ADDR_IS_POINTER 1
diff --git a/contrib/amd/conf/transp/transp_sockets.c b/contrib/amd/conf/transp/transp_sockets.c
deleted file mode 100644
index 025e1f3e3cf2..000000000000
--- a/contrib/amd/conf/transp/transp_sockets.c
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/conf/transp/transp_sockets.c
- *
- * Socket specific utilities.
- * -Erez Zadok <ezk@cs.columbia.edu>
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-/*
- * find the IP address that can be used to connect to the local host
- */
-void
-amu_get_myaddress(struct in_addr *iap, const char *preferred_localhost)
-{
- struct hostent *hp;
- char dq[20];
-
-#ifdef DEBUG_off
-#error this code is old and probably not useful any longer.
-#error Erez, Jan 21, 2004.
- struct sockaddr_in sin;
-
- /*
- * Most modern systems should use 127.0.0.1 as the localhost address over
- * which you can do NFS mounts. In the past we found that some NFS
- * clients may not allow mounts from localhost. So we used
- * get_myaddress() and that seemed to work. Alas, on some other systems,
- * get_myaddress() may return one of the interface addresses at random,
- * and thus use a less efficient IP address than 127.0.0.1. The solution
- * is to hard-code 127.0.0.1, but still check if get_myaddress() returns a
- * different value and warn about it.
- */
- memset((char *) &sin, 0, sizeof(sin));
- get_myaddress(&sin);
- if (sin.sin_addr.s_addr != htonl(INADDR_LOOPBACK))
- dlog("amu_get_myaddress: myaddress conflict (0x%x vs. 0x%lx)",
- sin.sin_addr.s_addr, (u_long) htonl(INADDR_LOOPBACK));
-#endif /* DEBUG_off */
-
- if (preferred_localhost == NULL)
- goto out;
-
- /* if specified preferred locahost, then try to use it */
- hp = gethostbyname(preferred_localhost);
- if (hp == NULL) {
- /* XXX: if hstrerror()/h_errno aren't portable, then need to port the next statement */
- plog(XLOG_ERROR, "Unable to resolve localhost_address \"%s\" (%s): using default",
- preferred_localhost, hstrerror(h_errno));
- goto out;
- }
- if (hp->h_addr_list == NULL) {
- plog(XLOG_ERROR, "localhost_address \"%s\" has no IP addresses: using default",
- preferred_localhost);
- goto out;
- }
- if (hp->h_addr_list[1] != NULL) {
- plog(XLOG_ERROR, "localhost_address \"%s\" has more than one IP addresses: using first",
- preferred_localhost);
- goto out;
- }
- memmove((voidp) &iap->s_addr, (voidp) hp->h_addr_list[0], sizeof(iap->s_addr));
- plog(XLOG_INFO, "localhost_address \"%s\" requested, using %s",
- preferred_localhost, inet_dquad(dq, sizeof(dq), iap->s_addr));
- return;
-
- out:
- iap->s_addr = htonl(INADDR_LOOPBACK);
-}
-
-
-/*
- * How to bind to reserved ports.
- * Note: if *pp is non-null and is greater than 0, then *pp will not be modified.
- */
-int
-bind_resv_port(int so, u_short *pp)
-{
- struct sockaddr_in sin;
- int rc;
- u_short port;
-
- memset((voidp) &sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
-
- if (pp && *pp > 0) {
- sin.sin_port = htons(*pp);
- rc = bind(so, (struct sockaddr *) &sin, sizeof(sin));
- } else {
- port = IPPORT_RESERVED;
-
- do {
- --port;
- sin.sin_port = htons(port);
- rc = bind(so, (struct sockaddr *) &sin, sizeof(sin));
- } while (rc < 0 && (int) port > IPPORT_RESERVED / 2);
-
- if (pp && rc == 0)
- *pp = port;
- }
-
- return rc;
-}
-
-
-/*
- * close a descriptor, Sockets style
- */
-int
-amu_close(int fd)
-{
- return close(fd);
-}
-
-
-/*
- * Create an rpc client attached to the mount daemon.
- */
-CLIENT *
-get_mount_client(char *unused_host, struct sockaddr_in *sin, struct timeval *tv, int *sock, u_long mnt_version)
-{
- CLIENT *client;
-
- /*
- * First try a TCP socket
- */
- if ((*sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) > 0) {
- /*
- * Bind to a privileged port
- */
- if (bind_resv_port(*sock, (u_short *) 0) < 0)
- plog(XLOG_ERROR, "can't bind privileged port (socket)");
-
- /*
- * Find mountd port to connect to.
- * Connect to mountd.
- * Create a tcp client.
- */
- if ((sin->sin_port = htons(pmap_getport(sin, MOUNTPROG, mnt_version, IPPROTO_TCP))) != 0) {
- if (connect(*sock, (struct sockaddr *) sin, sizeof(*sin)) >= 0
- && ((client = clnttcp_create(sin, MOUNTPROG, mnt_version, sock, 0, 0)) != NULL))
- return client;
- }
- /*
- * Failed so close socket
- */
- (void) close(*sock);
- } /* tcp socket opened */
- /* TCP failed so try UDP */
- if ((*sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- plog(XLOG_ERROR, "Can't create socket to connect to mountd: %m");
- *sock = RPC_ANYSOCK;
- return NULL;
- }
- /*
- * Bind to a privileged port
- */
- if (bind_resv_port(*sock, (u_short *) 0) < 0)
- plog(XLOG_ERROR, "can't bind privileged port");
-
- /*
- * Zero out the port - make sure we recompute
- */
- sin->sin_port = 0;
-
- /*
- * Make a UDP client
- */
- if ((client = clntudp_create(sin, MOUNTPROG, mnt_version, *tv, sock)) == NULL) {
- (void) close(*sock);
- *sock = RPC_ANYSOCK;
- return NULL;
- }
- dlog("get_mount_client: Using udp, port %d", sin->sin_port);
- return client;
-}
-
-
-/*
- * find the address of the caller of an RPC procedure.
- */
-struct sockaddr_in *
-amu_svc_getcaller(SVCXPRT *xprt)
-{
- /* glibc 2.2 returns a sockaddr_storage ??? */
- return (struct sockaddr_in *) svc_getcaller(xprt);
-}
-
-
-/*
- * register an RPC server
- */
-int
-amu_svc_register(SVCXPRT *xprt, u_long prognum, u_long versnum,
- void (*dispatch)(struct svc_req *rqstp, SVCXPRT *transp),
- u_long protocol, struct netconfig *dummy)
-{
- return svc_register(xprt, prognum, versnum, dispatch, protocol);
-}
-
-
-/*
- * Create the nfs service for amd
- */
-int
-create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp))
-{
-
- *soNFSp = socket(AF_INET, SOCK_DGRAM, 0);
-
- if (*soNFSp < 0 || bind_resv_port(*soNFSp, nfs_portp) < 0) {
- plog(XLOG_FATAL, "Can't create privileged nfs port (socket)");
- if (*soNFSp >= 0)
- close(*soNFSp);
- return 1;
- }
- if ((*nfs_xprtp = svcudp_create(*soNFSp)) == NULL) {
- plog(XLOG_FATAL, "cannot create rpc/udp service");
- close(*soNFSp);
- return 2;
- }
- if ((*nfs_portp = (*nfs_xprtp)->xp_port) >= IPPORT_RESERVED) {
- plog(XLOG_FATAL, "Can't create privileged nfs port");
- svc_destroy(*nfs_xprtp);
- close(*soNFSp);
- return 1;
- }
- if (!svc_register(*nfs_xprtp, NFS_PROGRAM, NFS_VERSION, dispatch_fxn, 0)) {
- plog(XLOG_FATAL, "unable to register (%ld, %ld, 0)",
- (u_long) NFS_PROGRAM, (u_long) NFS_VERSION);
- svc_destroy(*nfs_xprtp);
- close(*soNFSp);
- return 3;
- }
-
- return 0; /* all is well */
-}
-
-
-/*
- * Create the amq service for amd (both TCP and UDP)
- */
-int
-create_amq_service(int *udp_soAMQp,
- SVCXPRT **udp_amqpp,
- struct netconfig **dummy1,
- int *tcp_soAMQp,
- SVCXPRT **tcp_amqpp,
- struct netconfig **dummy2,
- u_short preferred_amq_port)
-{
- /* first create TCP service */
- if (tcp_soAMQp) {
- *tcp_soAMQp = socket(AF_INET, SOCK_STREAM, 0);
- if (*tcp_soAMQp < 0) {
- plog(XLOG_FATAL, "cannot create tcp socket for amq service: %m");
- return 1;
- }
-
- /* next, bind to a specific (TCP) port if asked for */
- if (preferred_amq_port > 0) {
- /*
- * Note: if &preferred_amq_port is non-null and is greater than 0,
- * then the pointer will not be modified. We don't want it to be
- * modified because it was passed down to create_amq_service as a
- * non-pointer (a variable on the stack, not to be modified!)
- */
- if (bind_resv_port(*tcp_soAMQp, &preferred_amq_port) < 0) {
- plog(XLOG_FATAL, "can't bind amq service to requested TCP port %d: %m)", preferred_amq_port);
- return 1;
- }
- }
-
- /* now create RPC service handle for amq */
- if (tcp_amqpp &&
- (*tcp_amqpp = svctcp_create(*tcp_soAMQp, AMQ_SIZE, AMQ_SIZE)) == NULL) {
- plog(XLOG_FATAL, "cannot create tcp service for amq: soAMQp=%d", *tcp_soAMQp);
- return 1;
- }
-
-#ifdef SVCSET_CONNMAXREC
- /*
- * This is *BSD at its best.
- * They just had to do things differently than everyone else
- * so they fixed a library DoS issue by forcing client-side changes...
- */
-# ifndef RPC_MAXDATASIZE
-# define RPC_MAXDATASIZE 9000
-# endif /* not RPC_MAXDATASIZE */
- if (tcp_amqpp) {
- int maxrec = RPC_MAXDATASIZE;
- SVC_CONTROL(*tcp_amqpp, SVCSET_CONNMAXREC, &maxrec);
- }
-#endif /* not SVCSET_CONNMAXREC */
- }
-
- /* next create UDP service */
- if (udp_soAMQp) {
- *udp_soAMQp = socket(AF_INET, SOCK_DGRAM, 0);
- if (*udp_soAMQp < 0) {
- plog(XLOG_FATAL, "cannot create udp socket for amq service: %m");
- return 1;
- }
-
- /* next, bind to a specific (UDP) port if asked for */
- if (preferred_amq_port > 0) {
- /*
- * Note: see comment about using &preferred_amq_port above in this
- * function.
- */
- if (bind_resv_port(*udp_soAMQp, &preferred_amq_port) < 0) {
- plog(XLOG_FATAL, "can't bind amq service to requested UDP port %d: %m)", preferred_amq_port);
- return 1;
- }
- }
-
- /* now create RPC service handle for amq */
- if (udp_amqpp &&
- (*udp_amqpp = svcudp_bufcreate(*udp_soAMQp, AMQ_SIZE, AMQ_SIZE)) == NULL) {
- plog(XLOG_FATAL, "cannot create udp service for amq: soAMQp=%d", *udp_soAMQp);
- return 1;
- }
- }
-
- return 0; /* all is well */
-}
-
-
-/*
- * Check if the portmapper is running and reachable: 0==down, 1==up
- */
-int check_pmap_up(char *host, struct sockaddr_in* sin)
-{
- CLIENT *client;
- enum clnt_stat clnt_stat = RPC_TIMEDOUT; /* assume failure */
- int socket = RPC_ANYSOCK;
- struct timeval timeout;
-
- timeout.tv_sec = 2;
- timeout.tv_usec = 0;
- sin->sin_port = htons(PMAPPORT);
- client = clntudp_create(sin, PMAPPROG, PMAPVERS, timeout, &socket);
-
- if (client == (CLIENT *) NULL) {
- plog(XLOG_ERROR,
- "check_pmap_up: cannot create connection to contact portmapper on host \"%s\"%s",
- host, clnt_spcreateerror(""));
- return 0;
- }
-
- timeout.tv_sec = 6;
- /* Ping the portmapper on a remote system by calling the nullproc */
- clnt_stat = clnt_call(client,
- PMAPPROC_NULL,
- (XDRPROC_T_TYPE) xdr_void,
- NULL,
- (XDRPROC_T_TYPE) xdr_void,
- NULL,
- timeout);
- clnt_destroy(client);
- close(socket);
- sin->sin_port = 0;
-
- if (clnt_stat == RPC_TIMEDOUT) {
- plog(XLOG_ERROR,
- "check_pmap_up: failed to contact portmapper on host \"%s\": %s",
- host, clnt_sperrno(clnt_stat));
- return 0;
- }
- return 1;
-}
-
-
-/*
- * Find the best NFS version for a host and protocol.
- */
-u_long
-get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto)
-{
- CLIENT *clnt;
- int again = 0;
- enum clnt_stat clnt_stat;
- struct timeval tv;
- int sock;
- char *errstr;
-
- /*
- * If not set or set wrong, then try from NFS_VERS_MAX on down. If
- * set, then try from nfs_version on down.
- */
- if (nfs_version <= 0 || nfs_version > NFS_VERS_MAX) {
- nfs_version = NFS_VERS_MAX;
- again = 1;
- }
- tv.tv_sec = 2; /* retry every 2 seconds, but also timeout */
- tv.tv_usec = 0;
-
-#ifdef HAVE_FS_NFS3
-try_again:
-#endif /* HAVE_FS_NFS3 */
-
- sock = RPC_ANYSOCK;
- errstr = NULL;
- if (STREQ(proto, "tcp"))
- clnt = clnttcp_create(sin, NFS_PROGRAM, nfs_version, &sock, 0, 0);
- else if (STREQ(proto, "udp"))
- clnt = clntudp_create(sin, NFS_PROGRAM, nfs_version, tv, &sock);
- else
- clnt = NULL;
-
- if (clnt != NULL) {
- /* Try three times (6/2=3) to verify the CLIENT handle. */
- tv.tv_sec = 6;
- clnt_stat = clnt_call(clnt,
- NFSPROC_NULL,
- (XDRPROC_T_TYPE) xdr_void,
- 0,
- (XDRPROC_T_TYPE) xdr_void,
- 0,
- tv);
-
- if (clnt_stat != RPC_SUCCESS)
- errstr = clnt_sperrno(clnt_stat);
-
- close(sock);
- clnt_destroy(clnt);
- } else {
-#ifdef HAVE_CLNT_SPCREATEERROR
- errstr = clnt_spcreateerror("");
-#else /* not HAVE_CLNT_SPCREATEERROR */
- errstr = "";
-#endif /* not HAVE_CLNT_SPCREATEERROR */
- }
-
- if (errstr) {
- plog(XLOG_INFO, "get_nfs_version NFS(%d,%s) failed for %s%s",
- (int) nfs_version, proto, host, errstr);
- if (again) {
-#ifdef HAVE_FS_NFS3
- if (nfs_version == NFS_VERSION3) {
- nfs_version = NFS_VERSION;
- again = 0;
- plog(XLOG_INFO, "get_nfs_version trying a lower version: NFS(%d,%s)", (int) nfs_version, proto);
- }
- goto try_again;
-#endif /* HAVE_FS_NFS3 */
- }
- return 0;
- }
-
- plog(XLOG_INFO, "get_nfs_version: returning NFS(%d,%s) on host %s",
- (int) nfs_version, proto, host);
- return nfs_version;
-}
-
-
-#if defined(HAVE_FS_AUTOFS) && defined(AUTOFS_PROG)
-/*
- * Register the autofs service for amd
- */
-int
-register_autofs_service(char *autofs_conftype, void (*autofs_dispatch)(struct svc_req *rqstp, SVCXPRT *transp))
-{
- int autofs_socket;
- SVCXPRT *autofs_xprt = NULL;
-
- autofs_socket = socket(AF_INET, SOCK_DGRAM, 0);
-
- if (autofs_socket < 0 || bind_resv_port(autofs_socket, NULL) < 0) {
- plog(XLOG_FATAL, "Can't create privileged autofs port (socket)");
- return 1;
- }
- if ((autofs_xprt = svcudp_create(autofs_socket)) == NULL) {
- plog(XLOG_FATAL, "Can't create autofs rpc/udp service");
- return 2;
- }
- if (autofs_xprt->xp_port >= IPPORT_RESERVED) {
- plog(XLOG_FATAL, "Can't create privileged autofs port");
- return 1;
- }
- if (!svc_register(autofs_xprt, AUTOFS_PROG, AUTOFS_VERS, autofs_dispatch, 0)) {
- plog(XLOG_FATAL, "unable to register (%ld, %ld, 0)",
- (u_long) AUTOFS_PROG, (u_long) AUTOFS_VERS);
- return 3;
- }
-
- return 0; /* all is well */
-}
-
-
-int
-unregister_autofs_service(char *autofs_conftype)
-{
- svc_unregister(AUTOFS_PROG, AUTOFS_VERS);
- return 0;
-}
-#endif /* HAVE_FS_AUTOFS && AUTOFS_PROG */
diff --git a/contrib/amd/conf/trap/trap_default.h b/contrib/amd/conf/trap/trap_default.h
deleted file mode 100644
index a132b0ec4931..000000000000
--- a/contrib/amd/conf/trap/trap_default.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* $srcdir/conf/trap/trap_default.h */
-#define MOUNT_TRAP(type, mnt, flags, mnt_data) mount(type, mnt->mnt_dir, flags, mnt_data)
diff --git a/contrib/amd/conf/trap/trap_freebsd3.h b/contrib/amd/conf/trap/trap_freebsd3.h
deleted file mode 100644
index 95c664254c05..000000000000
--- a/contrib/amd/conf/trap/trap_freebsd3.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* $srcdir/conf/trap/trap_freebsd3.h */
-extern int mount_freebsd3(MTYPE_TYPE type, const char *dir, int flags, voidp data);
-#define MOUNT_TRAP(type, mnt, flags, mnt_data) mount_freebsd3(type, mnt->mnt_dir, flags, mnt_data)
diff --git a/contrib/amd/conf/umount/umount_bsd44.c b/contrib/amd/conf/umount/umount_bsd44.c
deleted file mode 100644
index d05944d8f788..000000000000
--- a/contrib/amd/conf/umount/umount_bsd44.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/conf/umount/umount_bsd44.c
- *
- */
-
-/*
- * Unmounting filesystems under BSD 4.4.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-int
-umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags)
-{
- int error;
-
-eintr:
- error = unmount(mntdir, 0);
- if (error < 0)
- error = errno;
-
- switch (error) {
- case EINVAL:
- case ENOTBLK:
- case ENOENT:
- plog(XLOG_WARNING, "unmount: %s is not mounted", mntdir);
- error = 0; /* Not really an error */
- break;
-
- case EINTR:
- /* not sure why this happens, but it does. ask kirk one day... */
- dlog("%s: unmount: %m", mntdir);
- goto eintr;
-
-#ifdef MNT2_GEN_OPT_FORCE
- case EBUSY:
- case EIO:
- case ESTALE:
- /* caller determines if forced unmounts should be used */
- if (unmount_flags & AMU_UMOUNT_FORCE) {
- error = umount2_fs(mntdir, unmount_flags);
- if (error < 0)
- error = errno;
- else
- return error;
- }
- /* fallthrough */
-#endif /* MNT2_GEN_OPT_FORCE */
-
- default:
- dlog("%s: unmount: %m", mntdir);
- break;
- }
-
- return error;
-}
-
-
-#ifdef MNT2_GEN_OPT_FORCE
-/* force unmount, no questions asked, without touching mnttab file */
-int
-umount2_fs(const char *mntdir, u_int unmount_flags)
-{
- int error = 0;
- if (unmount_flags & AMU_UMOUNT_FORCE) {
- plog(XLOG_INFO, "umount2_fs: trying unmount/forced on %s", mntdir);
- error = unmount(mntdir, MNT2_GEN_OPT_FORCE);
- if (error < 0 && (errno == EINVAL || errno == ENOENT))
- error = 0; /* ignore EINVAL/ENOENT */
- if (error < 0)
- plog(XLOG_WARNING, "%s: unmount/force: %m", mntdir);
- else
- dlog("%s: unmount/force: OK", mntdir);
- }
- return error;
-}
-#endif /* MNT2_GEN_OPT_FORCE */
diff --git a/contrib/amd/cvs-server.txt b/contrib/amd/cvs-server.txt
deleted file mode 100644
index 0943963082cb..000000000000
--- a/contrib/amd/cvs-server.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-##############################################################################
-Here are generic CVS server instructions:
-
-(1) Login to the cvs server. Not needed more than once b/c the cvs login
- will record your cvs password in $HOME/.cvspass. Change "ezk" for your
- CVS user id.
-
-$ cvs -d :pserver:ezk@shekel.mcl.cs.columbia.edu:/proj/bank/cvsroot login
-CVS password:
-
-Type in your password, crypt(3)'ed in /proj/bank/cvsroot/CVSROOT/passwd.
-
-(2) Then, check out a fresh copy of 6.1 (experimental)
-
-$ cvs -d :pserver:ezk@shekel.mcl.cs.columbia.edu:/proj/bank/cvsroot checkout am-utils
-
-Or, to checkout the stable branch:
-
-$ cvs -d :pserver:ezk@shekel.mcl.cs.columbia.edu:/proj/bank/cvsroot checkout -r amd-6-0-stable am-utils
-
-(3) Then you can do normal edit, commit, update, etc. w/o having to worry
- about your $CVSROOT or the -d option.
-
-##############################################################################
-To merge changes from the stable branch into the main (experimental) branch:
-
-$ cvs update -j amd-6-0-stable -kk
-
-- don't worry about all the files that change; it's probably because of cvs
- keywords in the sources
-- after the merge, do a 'cvs update -d' and resolve any conflicts
-
-##############################################################################
-
-There are two new mailing lists:
-
-amd-maintainers@shekel.mcl.cs.columbia.edu: for Amd maintainers to
- communicate internally w/o exposure to the greater user community.
-
-amd-cvslog@shekel.mcl.cs.columbia.edu: to get cvs log messages. I've used a
- better (I hope) script for loginfo. It provides different output
- and can be tweaked as well.
-##############################################################################
diff --git a/contrib/amd/doc/am-utils.texi b/contrib/amd/doc/am-utils.texi
deleted file mode 100644
index 1cc46b608bae..000000000000
--- a/contrib/amd/doc/am-utils.texi
+++ /dev/null
@@ -1,8686 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@c
-@c Copyright (c) 1997-2006 Erez Zadok
-@c Copyright (c) 1989 Jan-Simon Pendry
-@c Copyright (c) 1989 Imperial College of Science, Technology & Medicine
-@c Copyright (c) 1989 The Regents of the University of California.
-@c All rights reserved.
-@c
-@c This code is derived from software contributed to Berkeley by
-@c Jan-Simon Pendry at Imperial College, London.
-@c
-@c Redistribution and use in source and binary forms, with or without
-@c modification, are permitted provided that the following conditions
-@c are met:
-@c 1. Redistributions of source code must retain the above copyright
-@c notice, this list of conditions and the following disclaimer.
-@c 2. Redistributions in binary form must reproduce the above copyright
-@c notice, this list of conditions and the following disclaimer in the
-@c documentation and/or other materials provided with the distribution.
-@c 3. All advertising materials mentioning features or use of this software
-@c must display the following acknowledgment:
-@c This product includes software developed by the University of
-@c California, Berkeley and its contributors.
-@c 4. Neither the name of the University nor the names of its contributors
-@c may be used to endorse or promote products derived from this software
-@c without specific prior written permission.
-@c
-@c THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-@c ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-@c IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-@c ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-@c FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-@c DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-@c OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-@c HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-@c LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-@c OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-@c
-@c
-@c File: am-utils/doc/am-utils.texi
-@c
-@setfilename am-utils.info
-
-@include version.texi
-
-@c info directory entry
-@dircategory Administration
-@direntry
-* Am-utils: (am-utils). The Amd automounter suite of utilities
-@end direntry
-
-@settitle Am-utils (4.4BSD Automounter Utilities)
-@setchapternewpage odd
-
-@titlepage
-@title Am-utils (4.4BSD Automounter Utilities)
-@subtitle For version @value{VERSION}, @value{UPDATED}
-
-@author Erez Zadok
-(Originally by Jan-Simon Pendry and Nick Williams)
-
-@page
-Copyright @copyright{} 1997-2006 Erez Zadok
-@*
-Copyright @copyright{} 1989 Jan-Simon Pendry
-@*
-Copyright @copyright{} 1989 Imperial College of Science, Technology & Medicine
-@*
-Copyright @copyright{} 1989 The Regents of the University of California.
-@sp
-All Rights Reserved.
-@vskip 1ex
-Permission to copy this document, or any portion of it, as
-necessary for use of this software is granted provided this
-copyright notice and statement of permission are included.
-@end titlepage
-@page
-
-@c Define a new index for options.
-@syncodeindex pg cp
-@syncodeindex vr cp
-
-@ifinfo
-
-@c ################################################################
-@node Top, License, , (DIR)
-
-@b{Am-utils (4.4BSD Automounter Utilities) User Manual}
-@*
-For version @value{VERSION}, @value{UPDATED}
-
-@b{Erez Zadok}
-@*
-(Originally by Jan-Simon Pendry and Nick Williams)
-
-Copyright @copyright{} 1997-2006 Erez Zadok
-@*
-Copyright @copyright{} 1989 Jan-Simon Pendry
-@*
-Copyright @copyright{} 1989 Imperial College of Science, Technology & Medicine
-@*
-Copyright @copyright{} 1989 The Regents of the University of California.
-@*
-All Rights Reserved.
-
-Permission to copy this document, or any portion of it, as
-necessary for use of this software is granted provided this
-copyright notice and statement of permission are included.
-
-Am-utils is the 4.4BSD Automounter Tool Suite, which includes the Amd
-automounter, the Amq query and control program, the Hlfsd daemon, and
-other tools. This Info file describes how to use and understand the
-tools within Am-utils.
-@end ifinfo
-
-@menu
-* License:: Explains the terms and conditions for using
- and distributing Am-utils.
-* Distrib:: How to get the latest Am-utils distribution.
-* AddInfo:: How to get additional information.
-* Intro:: An introduction to Automounting concepts.
-* History:: History of am-utils' development.
-* Overview:: An overview of Amd.
-* Supported Platforms:: Machines and Systems supported by Amd.
-* Mount Maps:: Details of mount maps.
-* Amd Command Line Options:: All the Amd command line options explained.
-* Filesystem Types:: The different mount types supported by Amd.
-* Amd Configuration File:: The amd.conf file syntax and meaning.
-* Run-time Administration:: How to start, stop and control Amd.
-* FSinfo:: The FSinfo filesystem management tool.
-* Hlfsd:: The Home-Link Filesystem server.
-* Assorted Tools:: Other tools which come with am-utils.
-* Examples:: Some examples showing how Amd might be used.
-* Internals:: Implementation details.
-* Acknowledgments & Trademarks:: Legal Notes.
-
-Indexes
-* Index:: An item for each concept.
-@end menu
-
-@iftex
-@unnumbered Preface
-
-This manual documents the use of the 4.4BSD automounter tool suite,
-which includes @i{Amd}, @i{Amq}, @i{Hlfsd}, and other programs. This is
-primarily a reference manual. While no tutorial exists, there are
-examples available. @xref{Examples}.
-
-This manual comes in two forms: the published form and the Info form.
-The Info form is for on-line perusal with the INFO program which is
-distributed along with GNU texinfo package (a version of which is
-available for GNU Emacs).@footnote{GNU packages can be found in
-@url{ftp://ftp.gnu.org/pub/gnu/}.} Both forms contain substantially
-the same text and are generated from a common source file, which is
-distributed with the @i{Am-utils} source.
-@end iftex
-
-@c ################################################################
-@node License, Distrib, Top, Top
-@unnumbered License
-@cindex License Information
-
-@i{Am-utils} is not in the public domain; it is copyrighted and there are
-restrictions on its distribution.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-@enumerate
-
-@item
-Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-
-@item
-Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-@item
-All advertising materials mentioning features or use of this software
-must display the following acknowledgment:
-
-@cartouche
-``This product includes software developed by the University of
-California, Berkeley and its contributors, as well as the Trustees of
-Columbia University.''
-@end cartouche
-
-@item
-Neither the name of the University nor the names of its contributors may
-be used to endorse or promote products derived from this software
-without specific prior written permission.
-
-@end enumerate
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
-
-@c ################################################################
-@node Distrib, AddInfo, License, Top
-@unnumbered Source Distribution
-@cindex Source code distribution
-@cindex Obtaining the source code
-
-The @i{Am-utils} home page is located in
-@example
-@url{http://www.am-utils.org/}
-@end example
-
-You can get the latest distribution version of @i{Am-utils} from
-@example
-@url{ftp://ftp.am-utils.org/pub/am-utils/am-utils.tar.gz}
-@end example
-
-Additional alpha, beta, and release distributions are available in
-@example
-@url{ftp://ftp.am-utils.org/pub/am-utils/}.
-@end example
-
-Revision 5.2 was part of the 4.3BSD Reno distribution.
-
-Revision 5.3bsdnet, a late alpha version of 5.3, was part
-of the BSD network version 2 distribution
-
-Revision 6.0 was made independently by
-@email{ezk@@cs.columbia.edu,Erez Zadok} at the Computer Science
-Department of @uref{http://www.cs.columbia.edu/,Columbia University},
-as part of his
-@uref{http://www.fsl.cs.sunysb.edu/docs/zadok-thesis-proposal/,PhD
-thesis work}. Am-utils (especially version 6.1) continues to be
-developed and maintained at the
-@uref{http://www.cs.sunysb.edu/,Computer Science Department} of
-@uref{http://www.stonybrook.edu/,Stony Brook University}, as a service
-to the user community.
-
-
-@xref{History}, for more details.
-
-@c ################################################################
-@node AddInfo, Intro, Distrib, Top
-@unnumbered Getting Additional Information
-@cindex Getting Additional Information
-
-@unnumberedsec Bug Reports
-@cindex Bug reports
-
-Before reporting a bug, see if it is a known one in the
-@uref{http://www.am-utils.org/docs/am-utils/BUGS.txt,bugs} file.
-
-If you find a problem and hopefully you can reproduce it, please
-describe it in detail and
-@uref{https://bugzilla.filesystems.org/,submit a bug report} via
-@uref{http://www.bugzilla.org/,Bugzilla}. Alternatively, you can send
-your bug report to @email{am-utils@@am-utils.org} quoting the details
-of the release and your configuration. These details can be obtained
-by running the command @samp{amd -v}. It would greatly help if you
-could provide a reproducible procedure for detecting the bug you are
-reporting.
-
-Providing working patches is highly encouraged. Every patch
-incorporated, however small, will get its author an honorable mention in
-the @uref{http://www.am-utils.org/docs/am-utils/AUTHORS.txt,authors
-file}.
-
-@unnumberedsec Mailing Lists
-@cindex Mailing lists
-
-There are several mailing lists for people interested in keeping up-to-date
-with developments.
-
-@c ###############
-
-@enumerate
-
-@item
-The users mailing list, @samp{am-utils} is for
-
-@itemize @minus
-@item
-announcements of alpha and beta releases of am-utils
-@item
-reporting of bugs and patches
-@item
-discussions of new features for am-utils
-@item
-implementation and porting issues
-@end itemize
-
-To subscribe, visit
-@url{http://lists.am-utils.org/mailman/listinfo/am-utils}. After
-subscribing, you can post a message to this list at
-@email{am-utils@@am-utils.org}. To avoid as much spam as
-possible, only subscribers to this list may post to it.
-
-Subscribers of @samp{am-utils} are most helpful if they have the time
-and resources to test new and development versions of amd, on as many
-different platforms as possible. They should also be prepared to
-learn and use the GNU Autoconf, Automake, and Libtool packages, as
-needed; and of course, become familiar with the complex code in the
-am-utils package. In other words, subscribers on this list should
-hopefully be able to contribute meaningfully to the development of
-amd.
-
-Note that this @samp{am-utils} list used to be called @samp{amd-dev}
-before January 1st, 2004. Please use the new name, @samp{am-utils}.
-
-@item
-The announcements mailing list, @samp{am-utils-announce} is for
-announcements only (mostly new releases). To subscribe, visit
-@url{http://lists.am-utils.org/mailman/listinfo/am-utils-announce}.
-This list is read-only: only am-utils developers may post to it.
-
-@item
-We distribute nightly CVS snapshots in
-@url{ftp://ftp.am-utils.org/pub/am-utils/snapshots/daily/}. If you
-like to get email notices of commits to the am-utils CVS repository,
-subscribe to the CVS logs mailing list, @samp{am-utils-cvs} at
-@url{http://lists.am-utils.org/mailman/listinfo/am-utils-cvs}.
-
-@item
-The older list which was used to user discussions, @samp{amd-workers},
-is defunct as of January 2004. (Its last address was
-@email{amd-workers@@majordomo.glue.umd.edu}.) Don't use
-@samp{amd-workers}: use the newer, more active @samp{am-utils} list.
-
-@item
-For completeness, there's a developers-only closed list called
-@samp{am-utils-developers@@am-utils.org}.
-
-@end enumerate
-
-@unnumberedsec Am-utils Book
-@cindex Am-utils book
-@cindex Amd book
-@cindex Automounter book
-@cindex book
-
-@email{ezk@@cs.sunysb.edu,Erez Zadok} wrote a
-@uref{http://www.fsl.cs.sunysb.edu/docs/amd-book/,book}, titled @i{Linux NFS and
-Automounter Administration}, ISBN 0-7821-2739-8, (Sybex, 2001). The
-book is full of details and examples that go beyond what this manual
-has. The book also covers NFS in great detail. Although the book is
-geared toward Linux users, it is general enough for any Unix
-administrator and contains specific sections for non-Linux systems.
-
-@c ################################################################
-@node Intro, History, AddInfo, Top
-@unnumbered Introduction
-@cindex Introduction
-
-An @dfn{automounter} maintains a cache of mounted filesystems.
-Filesystems are mounted on demand when they are first referenced,
-and unmounted after a period of inactivity.
-
-@i{Amd} may be used as a replacement for Sun's automounter. The choice
-of which filesystem to mount can be controlled dynamically with
-@dfn{selectors}. Selectors allow decisions of the form ``hostname is
-@var{this},'' or ``architecture is not @var{that}.'' Selectors may be
-combined arbitrarily. @i{Amd} also supports a variety of filesystem
-types, including NFS, UFS and the novel @dfn{program} filesystem. The
-combination of selectors and multiple filesystem types allows identical
-configuration files to be used on all machines thus reducing the
-administrative overhead.
-
-@i{Amd} ensures that it will not hang if a remote server goes down.
-Moreover, @i{Amd} can determine when a remote server has become
-inaccessible and then mount replacement filesystems as and when they
-become available.
-
-@i{Amd} contains no proprietary source code and has been ported to
-numerous flavors of Unix.
-
-@c ################################################################
-@node History, Overview, Intro, Top
-@unnumbered History
-@cindex History
-
-The @i{Amd} package has been without an official maintainer since 1992.
-Several people have stepped in to maintain it unofficially. Most
-notable were the `upl' (Unofficial Patch Level) releases of @i{Amd},
-created by me (@email{ezk@@cs.sunysb.edu,Erez Zadok}), and available from
-@url{ftp://ftp.am-utils.org/pub/amd/}. The last such unofficial
-release was `upl102'.
-
-Through the process of patching and aging, it was becoming more and more
-apparent that @i{Amd} was in much need of revitalizing. Maintaining
-@i{Amd} had become a difficult task. I took it upon myself to cleanup
-the code, so that it would be easier to port to new platforms, add new
-features, keep up with the many new feature requests, and deal with the
-never ending stream of bug reports.
-
-I have been working on such a release of @i{Amd} on and off since
-January of 1996. The new suite of tools is currently named "am-utils"
-(AutoMounter Utilities), in line with GNU naming conventions, befitting
-the contents of the package. In October of 1996 I had received enough
-offers to help me with this task that I decided to make a mailing list
-for this group of people. Around the same time, @i{Amd} had become a
-necessary part of my PhD thesis work, resulting in more work performed
-on am-utils.
-
-Am-utils version 6.0 was numbered with a major new release number to
-distinguish it from the last official release of @i{Amd} (5.x). Many
-new features have been added such as a GNU @code{configure} system, NFS
-Version 3, a run-time configuration file (`amd.conf'), many new ports,
-more scripts and programs, as well as numerous bug fixes. Another
-reason for the new major release number was to alert users of am-utils
-that user-visible interfaces may have changed. In order to make @i{Amd}
-work well for the next 10 years, and be easier to maintain, it was
-necessary to remove old or unused features, change various syntax files,
-etc. However, great care was taken to ensure the maximum possible
-backwards compatibility.
-
-Am-utils version 6.1 has autofs support for Linux and Solaris 2.5+ as
-@i{the} major new feature, in addition to several other minor new
-features. The autofs support is completely transparent to the
-end-user, aside from the fact that @code{/bin/pwd} now always returns
-the correct amd-ified path. The administrator can easily switch
-between NFS and autofs mounts by changing one parameter in
-@code{amd.conf}. Autofs support and maintenance was developed in
-conjunction with @email{ionut@@badula.org,Ion Badulescu}.
-
-@c ################################################################
-@node Overview, Supported Platforms, History, Top
-@chapter Overview
-
-@i{Amd} maintains a cache of mounted filesystems. Filesystems are
-@dfn{demand-mounted} when they are first referenced, and unmounted after
-a period of inactivity. @i{Amd} may be used as a replacement for Sun's
-@b{automount}(8) program. It contains no proprietary source code and
-has been ported to numerous flavors of Unix. @xref{Supported
-Platforms}.@refill
-
-@i{Amd} was designed as the basis for experimenting with filesystem
-layout and management. Although @i{Amd} has many direct applications it
-is loaded with additional features which have little practical use. At
-some point the infrequently used components may be removed to streamline
-the production system.
-
-@i{Amd} supports the notion of @dfn{replicated} filesystems by evaluating
-each member of a list of possible filesystem locations one by one.
-@i{Amd} checks that each cached mapping remains valid. Should a mapping be
-lost -- such as happens when a fileserver goes down -- @i{Amd} automatically
-selects a replacement should one be available.
-
-@menu
-* Fundamentals::
-* Filesystems and Volumes::
-* Volume Naming::
-* Volume Binding::
-* Operational Principles::
-* Mounting a Volume::
-* Automatic Unmounting::
-* Keep-alives::
-* Non-blocking Operation::
-@end menu
-
-@node Fundamentals, Filesystems and Volumes, Overview, Overview
-@comment node-name, next, previous, up
-@section Fundamentals
-@cindex Automounter fundamentals
-
-The fundamental concept behind @i{Amd} is the ability to separate the
-name used to refer to a file from the name used to refer to its physical
-storage location. This allows the same files to be accessed with the
-same name regardless of where in the network the name is used. This is
-very different from placing @file{/n/hostname} in front of the pathname
-since that includes location dependent information which may change if
-files are moved to another machine.
-
-By placing the required mappings in a centrally administered database,
-filesystems can be re-organized without requiring changes to
-configuration files, shell scripts and so on.
-
-@node Filesystems and Volumes, Volume Naming, Fundamentals, Overview
-@comment node-name, next, previous, up
-@section Filesystems and Volumes
-@cindex Filesystem
-@cindex Volume
-@cindex Fileserver
-@cindex sublink
-
-@i{Amd} views the world as a set of fileservers, each containing one or
-more filesystems where each filesystem contains one or more
-@dfn{volumes}. Here the term @dfn{volume} is used to refer to a
-coherent set of files such as a user's home directory or a @TeX{}
-distribution.@refill
-
-In order to access the contents of a volume, @i{Amd} must be told in
-which filesystem the volume resides and which host owns the filesystem.
-By default the host is assumed to be local and the volume is assumed to
-be the entire filesystem. If a filesystem contains more than one
-volume, then a @dfn{sublink} is used to refer to the sub-directory
-within the filesystem where the volume can be found.
-
-@node Volume Naming, Volume Binding, Filesystems and Volumes, Overview
-@comment node-name, next, previous, up
-@section Volume Naming
-@cindex Volume names
-@cindex Network-wide naming
-@cindex Replicated volumes
-@cindex Duplicated volumes
-@cindex Replacement volumes
-
-Volume names are defined to be unique across the entire network. A
-volume name is the pathname to the volume's root as known by the users
-of that volume. Since this name uniquely identifies the volume
-contents, all volumes can be named and accessed from each host, subject
-to administrative controls.
-
-Volumes may be replicated or duplicated. Replicated volumes contain
-identical copies of the same data and reside at two or more locations in
-the network. Each of the replicated volumes can be used
-interchangeably. Duplicated volumes each have the same name but contain
-different, though functionally identical, data. For example,
-@samp{/vol/tex} might be the name of a @TeX{} distribution which varied
-for each machine architecture.@refill
-
-@i{Amd} provides facilities to take advantage of both replicated and
-duplicated volumes. Configuration options allow a single set of
-configuration data to be shared across an entire network by taking
-advantage of replicated and duplicated volumes.
-
-@i{Amd} can take advantage of replacement volumes by mounting them as
-required should an active fileserver become unavailable.
-
-@node Volume Binding, Operational Principles, Volume Naming, Overview
-@comment node-name, next, previous, up
-@section Volume Binding
-@cindex Volume binding
-@cindex Unix namespace
-@cindex Namespace
-@cindex Binding names to filesystems
-
-Unix implements a namespace of hierarchically mounted filesystems. Two
-forms of binding between names and files are provided. A @dfn{hard
-link} completes the binding when the name is added to the filesystem. A
-@dfn{soft link} delays the binding until the name is accessed. An
-@dfn{automounter} adds a further form in which the binding of name to
-filesystem is delayed until the name is accessed.@refill
-
-The target volume, in its general form, is a tuple (host, filesystem,
-sublink) which can be used to name the physical location of any volume
-in the network.
-
-When a target is referenced, @i{Amd} ignores the sublink element and
-determines whether the required filesystem is already mounted. This is
-done by computing the local mount point for the filesystem and checking
-for an existing filesystem mounted at the same place. If such a
-filesystem already exists then it is assumed to be functionally
-identical to the target filesystem. By default there is a one-to-one
-mapping between the pair (host, filesystem) and the local mount point so
-this assumption is valid.
-
-@node Operational Principles, Mounting a Volume, Volume Binding, Overview
-@comment node-name, next, previous, up
-@section Operational Principles
-@cindex Operational principles
-
-@i{Amd} operates by introducing new mount points into the namespace.
-These are called @dfn{automount} points. The kernel sees these
-automount points as NFS filesystems being served by @i{Amd}. Having
-attached itself to the namespace, @i{Amd} is now able to control the
-view the rest of the system has of those mount points. RPC calls are
-received from the kernel one at a time.
-
-When a @dfn{lookup} call is received @i{Amd} checks whether the name is
-already known. If it is not, the required volume is mounted. A
-symbolic link pointing to the volume root is then returned. Once the
-symbolic link is returned, the kernel will send all other requests
-direct to the mounted filesystem.
-
-If a volume is not yet mounted, @i{Amd} consults a configuration
-@dfn{mount-map} corresponding to the automount point. @i{Amd} then
-makes a runtime decision on what and where to mount a filesystem based
-on the information obtained from the map.
-
-@i{Amd} does not implement all the NFS requests; only those relevant
-to name binding such as @dfn{lookup}, @dfn{readlink} and @dfn{readdir}.
-Some other calls are also implemented but most simply return an error
-code; for example @dfn{mkdir} always returns ``read-only filesystem''.
-
-@node Mounting a Volume, Automatic Unmounting, Operational Principles, Overview
-@comment node-name, next, previous, up
-@section Mounting a Volume
-@cindex Mounting a volume
-@cindex Location lists
-@cindex Alternate locations
-@cindex Mount retries
-@cindex Background mounts
-
-Each automount point has a corresponding mount map. The mount map
-contains a list of key--value pairs. The key is the name of the volume
-to be mounted. The value is a list of locations describing where the
-filesystem is stored in the network. In the source for the map the
-value would look like
-
-@display
-location1 location2 @dots{} locationN
-@end display
-
-@i{Amd} examines each location in turn. Each location may contain
-@dfn{selectors} which control whether @i{Amd} can use that location.
-For example, the location may be restricted to use by certain hosts.
-Those locations which cannot be used are ignored.
-
-@i{Amd} attempts to mount the filesystem described by each remaining
-location until a mount succeeds or @i{Amd} can no longer proceed. The
-latter can occur in three ways:
-
-@itemize @bullet
-@item
-If none of the locations could be used, or if all of the locations
-caused an error, then the last error is returned.
-
-@item
-If a location could be used but was being mounted in the background then
-@i{Amd} marks that mount as being ``in progress'' and continues with
-the next request; no reply is sent to the kernel.
-
-@item
-Lastly, one or more of the mounts may have been @dfn{deferred}. A mount
-is deferred if extra information is required before the mount can
-proceed. When the information becomes available the mount will take
-place, but in the mean time no reply is sent to the kernel. If the
-mount is deferred, @i{Amd} continues to try any remaining locations.
-@end itemize
-
-Once a volume has been mounted, @i{Amd} establishes a @dfn{volume
-mapping} which is used to satisfy subsequent requests.@refill
-
-@node Automatic Unmounting, Keep-alives, Mounting a Volume, Overview
-@comment node-name, next, previous, up
-@section Automatic Unmounting
-
-To avoid an ever increasing number of filesystem mounts, @i{Amd} removes
-volume mappings which have not been used recently. A time-to-live
-interval is associated with each mapping and when that expires the
-mapping is removed. When the last reference to a filesystem is removed,
-that filesystem is unmounted. If the unmount fails, for example the
-filesystem is still busy, the mapping is re-instated and its
-time-to-live interval is extended. The global default for this grace
-period is controlled by the @code{-w} command-line option (@pxref{-w
-Option, -w}) or the @i{amd.conf} parameter @samp{dismount_interval}
-(@pxref{dismount_interval Parameter}). It is also possible to set this
-value on a per-mount basis (@pxref{opts Option, opts, opts}).
-
-Filesystems can be forcefully timed out using the @i{Amq} command.
-@xref{Run-time Administration}. Note that on new enough systems that
-support forced unmounts, such as Linux, @i{Amd} can try to use the
-@b{umount2}(2) system call to force the unmount, if the regular
-@b{umount}(2) system call failed in a way that indicates that the
-mount point is hung or stale. @xref{forced_unmounts Parameter}.
-
-@node Keep-alives, Non-blocking Operation, Automatic Unmounting, Overview
-@comment node-name, next, previous, up
-@section Keep-alives
-@cindex Keep-alives
-@cindex Server crashes
-@cindex NFS ping
-
-Use of some filesystem types requires the presence of a server on
-another machine. If a machine crashes then it is of no concern to
-processes on that machine that the filesystem is unavailable. However,
-to processes on a remote host using that machine as a fileserver this
-event is important. This situation is most widely recognized when an
-NFS server crashes and the behavior observed on client machines is that
-more and more processes hang. In order to provide the possibility of
-recovery, @i{Amd} implements a @dfn{keep-alive} interval timer for some
-filesystem types. Currently only NFS makes use of this service.
-
-The basis of the NFS keep-alive implementation is the observation that
-most sites maintain replicated copies of common system data such as
-manual pages, most or all programs, system source code and so on. If
-one of those servers goes down it would be reasonable to mount one of
-the others as a replacement.
-
-The first part of the process is to keep track of which fileservers are
-up and which are down. @i{Amd} does this by sending RPC requests to the
-servers' NFS @code{NullProc} and checking whether a reply is returned.
-While the server state is uncertain the requests are re-transmitted at
-three second intervals and if no reply is received after four attempts
-the server is marked down. If a reply is received the fileserver is
-marked up and stays in that state for 30 seconds at which time another
-NFS ping is sent. This interval is configurable and can even be
-turned off using the @i{ping} option. @xref{opts Option}.
-
-Once a fileserver is marked down, requests continue to be sent every 30
-seconds in order to determine when the fileserver comes back up. During
-this time any reference through @i{Amd} to the filesystems on that
-server fail with the error ``Operation would block''. If a replacement
-volume is available then it will be mounted, otherwise the error is
-returned to the user.
-
-@c @i{Amd} keeps track of which servers are up and which are down.
-@c It does this by sending RPC requests to the servers' NFS {\sc NullProc} and
-@c checking whether a reply is returned. If no replies are received after a
-@c short period, @i{Amd} marks the fileserver @dfn{down}.
-@c RPC requests continue to be sent so that it will notice when a fileserver
-@c comes back up.
-@c ICMP echo packets \cite{rfc:icmp} are not used because it is the availability
-@c of the NFS service that is important, not the existence of a base kernel.
-@c Whenever a reference to a fileserver which is down is made via @i{Amd}, an alternate
-@c filesystem is mounted if one is available.
-@c
-Although this action does not protect user files, which are unique on
-the network, or processes which do not access files via @i{Amd} or
-already have open files on the hung filesystem, it can prevent most new
-processes from hanging.
-@c
-@c With a suitable combination of filesystem management and mount-maps,
-@c machines can be protected against most server downtime. This can be
-@c enhanced by allocating boot-servers dynamically which allows a diskless
-@c workstation to be quickly restarted if necessary. Once the root filesystem
-@c is mounted, @i{Amd} can be started and allowed to mount the remainder of
-@c the filesystem from whichever fileservers are available.
-
-@node Non-blocking Operation, , Keep-alives, Overview
-@comment node-name, next, previous, up
-@section Non-blocking Operation
-@cindex Non-blocking operation
-@cindex Multiple-threaded server
-@cindex RPC retries
-
-Since there is only one instance of @i{Amd} for each automount point,
-and usually only one instance on each machine, it is important that it
-is always available to service kernel calls. @i{Amd} goes to great
-lengths to ensure that it does not block in a system call. As a last
-resort @i{Amd} will fork before it attempts a system call that may block
-indefinitely, such as mounting an NFS filesystem. Other tasks such as
-obtaining filehandle information for an NFS filesystem, are done using a
-purpose built non-blocking RPC library which is integrated with
-@i{Amd}'s task scheduler. This library is also used to implement NFS
-keep-alives (@pxref{Keep-alives}).
-
-Whenever a mount is deferred or backgrounded, @i{Amd} must wait for it
-to complete before replying to the kernel. However, this would cause
-@i{Amd} to block waiting for a reply to be constructed. Rather than do
-this, @i{Amd} simply @dfn{drops} the call under the assumption that the
-kernel RPC mechanism will automatically retry the request.
-
-@c ################################################################
-@node Supported Platforms, Mount Maps, Overview, Top
-@comment node-name, next, previous, up
-@chapter Supported Platforms
-@cindex Supported Platforms
-@cindex shared libraries
-@cindex NFS V.3 support
-
-@i{Am-utils} has been ported to a wide variety of machines and operating
-systems. @i{Am-utils}'s code works for little-endian and big-endian
-machines, as well as 32 bit and 64 bit architectures. Furthermore, when
-@i{Am-utils} ports to an Operating System on one architecture, it is generally
-readily portable to the same Operating System on all platforms on which
-it is available.
-
-See the @file{INSTALL} in the distribution for more specific details on
-building and/or configuring for some systems.
-
-@c ################################################################
-@node Mount Maps, Amd Command Line Options, Supported Platforms, Top
-@comment node-name, next, previous, up
-@chapter Mount Maps
-@cindex Mount maps
-@cindex Automounter configuration maps
-@cindex Mount information
-
-@i{Amd} has no built-in knowledge of machines or filesystems.
-External @dfn{mount-maps} are used to provide the required information.
-Specifically, @i{Amd} needs to know when and under what conditions it
-should mount filesystems.
-
-The map entry corresponding to the requested name contains a list of
-possible locations from which to resolve the request. Each location
-specifies filesystem type, information required by that filesystem (for
-example the block special device in the case of UFS), and some
-information describing where to mount the filesystem (@pxref{fs Option}). A
-location may also contain @dfn{selectors} (@pxref{Selectors}).@refill
-
-@menu
-* Map Types::
-* Key Lookup::
-* Location Format::
-@end menu
-
-@node Map Types, Key Lookup, Mount Maps, Mount Maps
-@comment node-name, next, previous, up
-@section Map Types
-@cindex Mount map types
-@cindex Map types
-@cindex Configuration map types
-@cindex Types of mount map
-@cindex Types of configuration map
-@cindex Determining the map type
-
-A mount-map provides the run-time configuration information to @i{Amd}.
-Maps can be implemented in many ways. Some of the forms supported by
-@i{Amd} are regular files, ndbm databases, NIS maps, the @dfn{Hesiod}
-name server, and even the password file.
-
-A mount-map @dfn{name} is a sequence of characters. When an automount
-point is created a handle on the mount-map is obtained. For each map
-type configured, @i{Amd} attempts to reference the map of the
-appropriate type. If a map is found, @i{Amd} notes the type for future
-use and deletes the reference, for example closing any open file
-descriptors. The available maps are configured when @i{Amd} is built
-and can be displayed by running the command @samp{amd -v}.
-
-When using an @i{Amd} configuration file (@pxref{Amd Configuration File})
-and the keyword @samp{map_type} (@pxref{map_type Parameter}), you may
-force the map used to any type.
-
-By default, @i{Amd} caches data in a mode dependent on the type of map.
-This is the same as specifying @samp{cache:=mapdefault} and selects a
-suitable default cache mode depending on the map type. The individual
-defaults are described below. The @var{cache} option can be specified
-on automount points to alter the caching behavior (@pxref{Automount
-Filesystem}).@refill
-
-The following map types have been implemented, though some are not
-available on all machines. Run the command @samp{amd -v} to obtain a
-list of map types configured on your machine.
-
-@menu
-* File maps::
-* ndbm maps::
-* NIS maps::
-* NIS+ maps::
-* Hesiod maps::
-* Password maps::
-* Union maps::
-* LDAP maps::
-* Executable maps::
-@end menu
-
-@c ----------------------------------------------------------------
-@node File maps, ndbm maps, Map Types, Map Types
-@comment node-name, next, previous, up
-@subsection File maps
-@cindex File maps
-@cindex Flat file maps
-@cindex File map syntactic conventions
-
-When @i{Amd} searches a file for a map entry it does a simple scan of
-the file and supports both comments and continuation lines.
-
-Continuation lines are indicated by a backslash character (@samp{\}) as
-the last character of a line in the file. The backslash, newline character
-@emph{and any leading white space on the following line} are discarded. A maximum
-line length of 2047 characters is enforced after continuation lines are read
-but before comments are stripped. Each line must end with
-a newline character; that is newlines are terminators, not separators.
-The following examples illustrate this:
-
-@example
-key valA valB; \
- valC
-@end example
-
-specifies @emph{three} locations, and is identical to
-
-@example
-key valA valB; valC
-@end example
-
-However,
-
-@example
-key valA valB;\
- valC
-@end example
-
-specifies only @emph{two} locations, and is identical to
-
-@example
-key valA valB;valC
-@end example
-
-After a complete line has been read from the file, including
-continuations, @i{Amd} determines whether there is a comment on the
-line. A comment begins with a hash (``@samp{#}'') character and
-continues to the end of the line. There is no way to escape or change
-the comment lead-in character.
-
-Note that continuation lines and comment support @dfn{only} apply to
-file maps, or ndbm maps built with the @code{mk-amd-map} program.
-
-When caching is enabled, file maps have a default cache mode of
-@code{all} (@pxref{Automount Filesystem}).
-
-@c ----------------------------------------------------------------
-@node ndbm maps, NIS maps, File maps, Map Types
-@comment node-name, next, previous, up
-@subsection ndbm maps
-@cindex ndbm maps
-
-An ndbm map may be used as a fast access form of a file map. The program,
-@code{mk-amd-map}, converts a normal map file into an ndbm database.
-This program supports the same continuation and comment conventions that
-are provided for file maps. Note that ndbm format files may @emph{not}
-be sharable across machine architectures. The notion of speed generally
-only applies to large maps; a small map, less than a single disk block,
-is almost certainly better implemented as a file map.
-
-ndbm maps have a default cache mode of @samp{all}
-(@pxref{Automount Filesystem}).
-
-@c ----------------------------------------------------------------
-@node NIS maps, NIS+ maps, ndbm maps, Map Types
-@comment node-name, next, previous, up
-@subsection NIS maps
-@cindex NIS (YP) maps
-
-When using NIS (formerly YP), an @i{Amd} map is implemented directly
-by the underlying NIS map. Comments and continuation lines are
-@emph{not} supported in the automounter and must be stripped when
-constructing the NIS server's database.
-
-NIS maps have a default cache mode of @code{all} (@pxref{Automount
-Filesystem}).
-
-The following rule illustrates what could be added to your NIS @file{Makefile},
-in this case causing the @file{amd.home} map to be rebuilt:
-@example
-$(YPTSDIR)/amd.home.time: $(ETCDIR)/amd.home
- -@@sed -e "s/#.*$$//" -e "/^$$/d" $(ETCDIR)/amd.home | \
- awk '@{ \
- for (i = 1; i <= NF; i++) \
- if (i == NF) @{ \
- if (substr($$i, length($$i), 1) == "\\") \
- printf("%s", substr($$i, 1, length($$i) - 1)); \
- else \
- printf("%s\n", $$i); \
- @} \
- else \
- printf("%s ", $$i); \
- @}' | \
- $(MAKEDBM) - $(YPDBDIR)/amd.home; \
- touch $(YPTSDIR)/amd.home.time; \
- echo "updated amd.home"; \
- if [ ! $(NOPUSH) ]; then \
- $(YPPUSH) amd.home; \
- echo "pushed amd.home"; \
- else \
- : ; \
- fi
-@end example
-
-Here @code{$(YPTSDIR)} contains the time stamp files, and
-@code{$(YPDBDIR)} contains the dbm format NIS files.
-
-@c ----------------------------------------------------------------
-@node NIS+ maps, Hesiod maps, NIS maps, Map Types
-@comment node-name, next, previous, up
-@subsection NIS+ maps
-@cindex NIS+ maps
-
-NIS+ maps do not support cache mode @samp{all} and, when caching is
-enabled, have a default cache mode of @samp{inc}.
-
-XXX: FILL IN WITH AN EXAMPLE.
-
-@c ----------------------------------------------------------------
-@node Hesiod maps, Password maps, NIS+ maps, Map Types
-@comment node-name, next, previous, up
-@subsection Hesiod maps
-@cindex Hesiod maps
-
-When the map name begins with the string @samp{hesiod.} lookups are made
-using the @dfn{Hesiod} name server. The string following the dot is
-used as a name qualifier and is prepended with the key being located.
-The entire string is then resolved in the @code{automount} context, or
-the @i{amd.conf} parameter @samp{hesiod_base} (@pxref{hesiod_base
-Parameter}). For example, if the key is @samp{jsp} and map name is
-@samp{hesiod.homes} then @dfn{Hesiod} is asked to resolve
-@samp{jsp.homes.automount}.
-
-Hesiod maps do not support cache mode @samp{all} and, when caching is
-enabled, have a default cache mode of @samp{inc} (@pxref{Automount
-Filesystem}).
-
-The following is an example of a @dfn{Hesiod} map entry:
-
-@example
-jsp.homes.automount HS TXT "rfs:=/home/charm;rhost:=charm;sublink:=jsp"
-njw.homes.automount HS TXT "rfs:=/home/dylan/dk2;rhost:=dylan;sublink:=njw"
-@end example
-
-@c ----------------------------------------------------------------
-@node Password maps, Union maps, Hesiod maps, Map Types
-@comment node-name, next, previous, up
-@subsection Password maps
-@cindex Password file maps
-@cindex /etc/passwd maps
-@cindex User maps, automatic generation
-@cindex Automatic generation of user maps
-@cindex Using the password file as a map
-
-The password map support is unlike the four previous map types. When
-the map name is the string @file{/etc/passwd} @i{Amd} can lookup a user
-name in the password file and re-arrange the home directory field to
-produce a usable map entry.
-
-@i{Amd} assumes the home directory has the format
-`@t{/}@i{anydir}@t{/}@i{dom1}@t{/../}@i{domN}@t{/}@i{login}'.
-@c @footnote{This interpretation is not necessarily exactly what you want.}
-It breaks this string into a map entry where @code{$@{rfs@}} has the
-value `@t{/}@i{anydir}@t{/}@i{domN}', @code{$@{rhost@}} has the value
-`@i{domN}@t{.}@i{...}@t{.}@i{dom1}', and @code{$@{sublink@}} has the
-value @i{login}.@refill
-
-Thus if the password file entry was
-
-@example
-/home/achilles/jsp
-@end example
-
-the map entry used by @i{Amd} would be
-
-@example
-rfs:=/home/achilles;rhost:=achilles;sublink:=jsp
-@end example
-
-Similarly, if the password file entry was
-
-@example
-/home/cc/sugar/mjh
-@end example
-
-the map entry used by @i{Amd} would be
-
-@example
-rfs:=/home/sugar;rhost:=sugar.cc;sublink:=jsp
-@end example
-
-@c ----------------------------------------------------------------
-@node Union maps, LDAP maps, Password maps, Map Types
-@comment node-name, next, previous, up
-@subsection Union maps
-@cindex Union file maps
-
-The union map support is provided specifically for use with the union
-filesystem, @pxref{Union Filesystem}.
-
-It is identified by the string @samp{union:} which is followed by a
-colon separated list of directories. The directories are read in order,
-and the names of all entries are recorded in the map cache. Later
-directories take precedence over earlier ones. The union filesystem
-type then uses the map cache to determine the union of the names in all
-the directories.
-
-@c ----------------------------------------------------------------
-@node LDAP maps, Executable maps, Union maps, Map Types
-@comment node-name, next, previous, up
-@subsection LDAP maps
-@cindex LDAP maps
-@cindex Lightweight Directory Access Protocol
-
-LDAP (Lightweight Directory Access Protocol) maps do not support cache
-mode @samp{all} and, when caching is enabled, have a default cache mode
-of @samp{inc}.
-
-For example, an @i{Amd} map @samp{amd.home} that looks as follows:
-
-@example
-/defaults opts:=rw,intr;type:=link
-
-zing -rhost:=shekel \
- host==shekel \
- host!=shekel;type:=nfs
-@end example
-@noindent
-when converted to LDAP (@pxref{amd2ldif}), will result in the following
-LDAP database:
-@example
-$ amd2ldif amd.home CUCS < amd.home
-dn: cn=amdmap timestamp, CUCS
-cn : amdmap timestamp
-objectClass : amdmapTimestamp
-amdmapTimestamp: 873071363
-
-dn: cn=amdmap amd.home[/defaults], CUCS
-cn : amdmap amd.home[/defaults]
-objectClass : amdmap
-amdmapName : amd.home
-amdmapKey : /defaults
-amdmapValue : opts:=rw,intr;type:=link
-
-dn: cn=amdmap amd.home[], CUCS
-cn : amdmap amd.home[]
-objectClass : amdmap
-amdmapName : amd.home
-amdmapKey :
-amdmapValue :
-
-dn: cn=amdmap amd.home[zing], CUCS
-cn : amdmap amd.home[zing]
-objectClass : amdmap
-amdmapName : amd.home
-amdmapKey : zing
-amdmapValue : -rhost:=shekel host==shekel host!=shekel;type:=nfs
-@end example
-
-@c ----------------------------------------------------------------
-@node Executable maps, , LDAP maps, Map Types
-@comment node-name, next, previous, up
-@subsection Executable maps
-@cindex Executable maps
-
-An executable map is a dynamic map in which the keys and values for
-the maps are generated on the fly by a program or script. The program
-is expected to take a single parameter argument which is the key to
-lookup. If the key is found, the program should print on stdout the
-key-value pair that were found; if the key was not found, nothing
-should be printed out. Below is an sample of such a map script:
-
-@example
-#!/bin/sh
-# executable map example
-case "$1" in
- "/defaults" )
- echo "/defaults type:=nfs;rfs:=filer"
- ;;
- "a" )
- echo "a type:=nfs;fs:=/tmp"
- ;;
- "b" )
- echo "b type:=link;fs:=/usr/local"
- ;;
- * ) # no match, echo nothing
- ;;
-esac
-@end example
-
-@xref{exec_map_timeout Parameter}.
-
-@c ----------------------------------------------------------------
-@c subsection Gdbm
-@c ----------------------------------------------------------------
-@node Key Lookup, Location Format, Map Types, Mount Maps
-@comment node-name, next, previous, up
-@section How keys are looked up
-@cindex Key lookup
-@cindex Map lookup
-@cindex Looking up keys
-@cindex How keys are looked up
-@cindex Wildcards in maps
-
-The key is located in the map whose type was determined when the
-automount point was first created. In general the key is a pathname
-component. In some circumstances this may be modified by variable
-expansion (@pxref{Variable Expansion}) and prefixing. If the automount
-point has a prefix, specified by the @var{pref} option, then that is
-prepended to the search key before the map is searched.
-
-If the map cache is a @samp{regexp} cache then the key is treated as an
-egrep-style regular expression, otherwise a normal string comparison is
-made.
-
-If the key cannot be found then a @dfn{wildcard} match is attempted.
-@i{Amd} repeatedly strips the basename from the key, appends @samp{/*} and
-attempts a lookup. Finally, @i{Amd} attempts to locate the special key @samp{*}.
-
-For example, the following sequence would be checked if @file{home/dylan/dk2} was
-being located:
-
-@example
- home/dylan/dk2
- home/dylan/*
- home/*
- *
-@end example
-
-At any point when a wildcard is found, @i{Amd} proceeds as if an exact
-match had been found and the value field is then used to resolve the
-mount request, otherwise an error code is propagated back to the kernel.
-(@pxref{Filesystem Types}).@refill
-
-@node Location Format, , Key Lookup, Mount Maps
-@comment node-name, next, previous, up
-@section Location Format
-@cindex Location format
-@cindex Map entry format
-@cindex How locations are parsed
-
-The value field from the lookup provides the information required to
-mount a filesystem. The information is parsed according to the syntax
-shown below.
-
-@display
-@i{location-list}:
- @i{location-selection}
- @i{location-list} @i{white-space} @t{||} @i{white-space} @i{location-selection}
-@i{location-selection}:
- @i{location}
- @i{location-selection} @i{white-space} @i{location}
-@i{location}:
- @i{location-info}
- @t{-}@i{location-info}
- @t{-}
-@i{location-info}:
- @i{sel-or-opt}
- @i{location-info}@t{;}@i{sel-or-opt}
- @t{;}
-@i{sel-or-opt}:
- @i{selection}
- @i{opt-ass}
-@i{selection}:
- selector@t{==}@i{value}
- selector@t{!=}@i{value}
-@i{opt-ass}:
- option@t{:=}@i{value}
-@i{white-space}:
- space
- tab
-@end display
-
-Note that unquoted whitespace is not allowed in a location description.
-White space is only allowed, and is mandatory, where shown with non-terminal
-@i{white-space}.
-
-A @dfn{location-selection} is a list of possible volumes with which to
-satisfy the request. Each @dfn{location-selection} is tried
-sequentially, until either one succeeds or all fail. This, by the
-way, is different from the historically documented behavior, which
-claimed (falsely, at least for last 3 years) that @i{Amd} would
-attempt to mount all @dfn{location-selection}s in parallel and the
-first one to succeed would be used.
-
-@dfn{location-selection}s are optionally separated by the @samp{||}
-operator. The effect of this operator is to prevent use of
-location-selections to its right if any of the location-selections on
-its left were selected, whether or not any of them were successfully
-mounted (@pxref{Selectors}).@refill
-
-The location-selection, and singleton @dfn{location-list},
-@samp{type:=ufs;dev:=/dev/xd1g} would inform @i{Amd} to mount a UFS
-filesystem from the block special device @file{/dev/xd1g}.
-
-The @dfn{sel-or-opt} component is either the name of an option required
-by a specific filesystem, or it is the name of a built-in, predefined
-selector such as the architecture type. The value may be quoted with
-double quotes @samp{"}, for example
-@samp{type:="ufs";dev:="/dev/xd1g"}. These quotes are stripped when the
-value is parsed and there is no way to get a double quote into a value
-field. Double quotes are used to get white space into a value field,
-which is needed for the program filesystem (@pxref{Program Filesystem}).@refill
-
-@menu
-* Map Defaults::
-* Variable Expansion::
-* Selectors::
-* Map Options::
-@end menu
-
-@node Map Defaults, Variable Expansion, Location Format, Location Format
-@comment node-name, next, previous, up
-@subsection Map Defaults
-@cindex Map defaults
-@cindex How to set default map parameters
-@cindex Setting default map parameters
-
-A location beginning with a dash @samp{-} is used to specify default
-values for subsequent locations. Any previously specified defaults in
-the location-list are discarded. The default string can be empty in
-which case no defaults apply.
-
-The location @samp{-fs:=/mnt;opts:=ro} would set the local mount point
-to @file{/mnt} and cause mounts to be read-only by default. Defaults
-specified this way are appended to, and so override, any global map
-defaults given with @samp{/defaults}).
-
-@c
-@c A @samp{/defaults} value @dfn{gdef} and a location list
-@c \begin{quote}
-@c $@samp{-}@dfn{def}_a $\verb*+ +$ @dfn{loc}_{a_1} $\verb*+ +$ @dfn{loc}_{a_2} $\verb*+ +$ @samp{-}@dfn{def}_b $\verb*+ +$ @dfn{loc}_{b_1} \ldots$
-@c \end{quote}
-@c is equivalent to
-@c \begin{quote}
-@c $@samp{-}@dfn{gdef}@samp{;}@dfn{def}_a $\verb*+ +$ @dfn{loc}_{a_1} $\verb*+ +$ @dfn{loc}_{a_2} $\verb*+ +$ @samp{-}@dfn{gdef}@samp{;}@dfn{def}_b $\verb*+ +$ @dfn{loc}_{b_1} \ldots$
-@c \end{quote}
-@c which is equivalent to
-@c \begin{quote}
-@c $@dfn{gdef}@samp{;}@dfn{def}_a@samp{;}@dfn{loc}_{a_1} $\verb*+ +$@dfn{gdef}@samp{;}@dfn{def}_a@samp{;}@dfn{loc}_{a_2} $\verb*+ +$@dfn{gdef}@samp{;}@dfn{def}_b@samp{;}@dfn{loc}_{b_1} \ldots$
-@c \end{quote}
-
-@node Variable Expansion, Selectors, Map Defaults, Location Format
-@comment node-name, next, previous, up
-@subsection Variable Expansion
-@cindex Variable expansion
-@cindex How variables are expanded
-@cindex Pathname operators
-@cindex Domain stripping
-@cindex Domainname operators
-@cindex Stripping the local domain name
-@cindex Environment variables
-@cindex How to access environment variables in maps
-
-To allow generic location specifications @i{Amd} does variable expansion
-on each location and also on some of the option strings. Any option or
-selector appearing in the form @code{$@dfn{var}} is replaced by the
-current value of that option or selector. For example, if the value of
-@code{$@{key@}} was @samp{bin}, @code{$@{autodir@}} was @samp{/a} and
-@code{$@{fs@}} was `@t{$@{autodir@}}@t{/local/}@t{$@{key@}}' then
-after expansion @code{$@{fs@}} would have the value @samp{/a/local/bin}.
-Any environment variable can be accessed in a similar way.@refill
-
-Two pathname operators are available when expanding a variable. If the
-variable name begins with @samp{/} then only the last component of the
-pathname is substituted. For example, if @code{$@{path@}} was
-@samp{/foo/bar} then @code{$@{/path@}} would be expanded to @samp{bar}.
-Similarly, if the variable name ends with @samp{/} then all but the last
-component of the pathname is substituted. In the previous example,
-@code{$@{path/@}} would be expanded to @samp{/foo}.@refill
-
-Two domain name operators are also provided. If the variable name
-begins with @samp{.} then only the domain part of the name is
-substituted. For example, if @code{$@{rhost@}} was
-@samp{swan.doc.ic.ac.uk} then @code{$@{.rhost@}} would be expanded to
-@samp{doc.ic.ac.uk}. Similarly, if the variable name ends with @samp{.}
-then only the host component is substituted. In the previous example,
-@code{$@{rhost.@}} would be expanded to @samp{swan}.@refill
-
-Variable expansion is a two phase process. Before a location is parsed,
-all references to selectors, @i{eg} @code{$@{path@}}, are expanded. The
-location is then parsed, selections are evaluated and option assignments
-recorded. If there were no selections or they all succeeded the
-location is used and the values of the following options are expanded in
-the order given: @var{sublink}, @var{rfs}, @var{fs}, @var{opts},
-@var{remopts}, @var{mount} and @var{unmount}.
-
-Note that expansion of option values is done after @dfn{all} assignments
-have been completed and not in a purely left to right order as is done
-by the shell. This generally has the desired effect but care must be
-taken if one of the options references another, in which case the
-ordering can become significant.
-
-There are two special cases concerning variable expansion:
-
-@enumerate
-@item
-before a map is consulted, any selectors in the name received
-from the kernel are expanded. For example, if the request from the
-kernel was for `@t{$@{arch@}}@t{.bin}' and the machine architecture
-was @samp{vax}, the value given to @code{$@{key@}} would be
-@samp{vax.bin}.@refill
-
-@item
-the value of @code{$@{rhost@}} is expanded and normalized before the
-other options are expanded. The normalization process strips any local
-sub-domain components. For example, if @code{$@{domain@}} was
-@samp{Berkeley.EDU} and @code{$@{rhost@}} was initially
-@samp{snow.Berkeley.EDU}, after the normalization it would simply be
-@samp{snow}. Hostname normalization is currently done in a
-@emph{case-dependent} manner.@refill
-@end enumerate
-
-@c======================================================================
-@node Selectors, Map Options, Variable Expansion, Location Format
-@comment node-name, next, previous, up
-@subsection Selectors
-@cindex Selectors
-
-Selectors are used to control the use of a location. It is possible to
-share a mount map between many machines in such a way that filesystem
-location, architecture and operating system differences are hidden from
-the users. A selector of the form @samp{arch==sun3;os==sunos4} would only
-apply on Sun-3s running SunOS 4.x.
-
-Selectors can be negated by using @samp{!=} instead of @samp{==}. For
-example to select a location on all non-Vax machines the selector
-@samp{arch!=vax} would be used.
-
-Selectors are evaluated left to right. If a selector fails then that
-location is ignored. Thus the selectors form a conjunction and the
-locations form a disjunction. If all the locations are ignored or
-otherwise fail then @i{Amd} uses the @dfn{error} filesystem
-(@pxref{Error Filesystem}). This is equivalent to having a location
-@samp{type:=error} at the end of each mount-map entry.@refill
-
-The default value of many of the selectors listed here can be overridden
-by an @i{Amd} command line switch or in an @i{Amd} configuration file.
-@xref{Amd Configuration File}.
-
-The following selectors are currently implemented.
-
-@menu
-* arch Selector Variable::
-* autodir Selector Variable::
-* byte Selector Variable::
-* cluster Selector Variable::
-* domain Selector Variable::
-* dollar Selector Variable::
-* host Selector Variable::
-* hostd Selector Variable::
-* karch Selector Variable::
-* os Selector Variable::
-* osver Selector Variable::
-* full_os Selector Variable::
-* vendor Selector Variable::
-
-* key Selector Variable::
-* map Selector Variable::
-* netnumber Selector Variable::
-* network Selector Variable::
-* path Selector Variable::
-* wire Selector Variable::
-* uid Selector Variable::
-* gid Selector Variable::
-
-* exists Selector Function::
-* false Selector Function::
-* netgrp Selector Function::
-* netgrpd Selector Function::
-* in_network Selector Function::
-* true Selector Function::
-* xhost Selector Function::
-@end menu
-
-@c ----------------------------------------------------------------
-@node arch Selector Variable, autodir Selector Variable, Selectors, Selectors
-@comment node-name, next, previous, up
-@subsubsection arch Selector Variable
-@cindex arch Selector Variable
-@cindex arch, mount selector
-@cindex Mount selector; arch
-@cindex Selector; arch
-
-The machine architecture which was automatically determined at compile
-time. The architecture type can be displayed by running the command
-@samp{amd -v}. You can override this value also using the @code{-A}
-command line option. @xref{Supported Platforms}.@refill
-
-@c ----------------------------------------------------------------
-@node autodir Selector Variable, byte Selector Variable, arch Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection autodir Selector Variable
-@cindex autodir Selector Variable
-@cindex autodir, mount selector
-@cindex Mount selector; autodir
-@cindex Selector; autodir
-
-The default directory under which to mount filesystems. This may be
-changed by the @code{-a} command line option. @xref{fs Option}.
-
-@c ----------------------------------------------------------------
-@node byte Selector Variable, cluster Selector Variable, autodir Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection byte Selector Variable
-@cindex byte Selector Variable
-@cindex byte, mount selector
-@cindex Mount selector; byte
-@cindex Selector; byte
-
-The machine's byte ordering. This is either @samp{little}, indicating
-little-endian, or @samp{big}, indicating big-endian. One possible use
-is to share @samp{rwho} databases (@pxref{rwho servers}). Another is to
-share ndbm databases, however this use can be considered a courageous
-juggling act.
-
-@c ----------------------------------------------------------------
-@node cluster Selector Variable, domain Selector Variable, byte Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection cluster Selector Variable
-@cindex cluster Selector Variable
-@cindex cluster, mount selector
-@cindex Mount selector; cluster
-@cindex Selector; cluster
-
-This is provided as a hook for the name of the local cluster. This can
-be used to decide which servers to use for copies of replicated
-filesystems. @code{$@{cluster@}} defaults to the value of
-@code{$@{domain@}} unless a different value is set with the @code{-C}
-command line option.
-
-@c ----------------------------------------------------------------
-@node domain Selector Variable, dollar Selector Variable, cluster Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection domain Selector Variable
-@cindex domain Selector Variable
-@cindex domain, mount selector
-@cindex Mount selector; domain
-@cindex Selector; domain
-
-The local domain name as specified by the @code{-d} command line option.
-@xref{host Selector Variable}.
-
-@c ----------------------------------------------------------------
-@node dollar Selector Variable, host Selector Variable, domain Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection dollar Selector Variable
-@cindex dollar Selector Variable
-
-This is a special variable, whose sole purpose is to produce a literal
-dollar sign in the value of another variable. For example, if you have
-a remote file system whose name is @samp{/disk$s}, you can mount it by
-setting the remote file system variable as follows:
-
-@example
-rfs:=/disk$@{dollar@}s
-@end example
-
-@c ----------------------------------------------------------------
-@node host Selector Variable, hostd Selector Variable, dollar Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection host Selector Variable
-@cindex host Selector Variable
-@cindex host, mount selector
-@cindex Mount selector; host
-@cindex Selector; host
-
-The local hostname as determined by @b{gethostname}(2). If no domain
-name was specified on the command line and the hostname contains a
-period @samp{.} then the string before the period is used as the host
-name, and the string after the period is assigned to @code{$@{domain@}}.
-For example, if the hostname is @samp{styx.doc.ic.ac.uk} then
-@code{host} would be @samp{styx} and @code{domain} would be
-@samp{doc.ic.ac.uk}. @code{hostd} would be
-@samp{styx.doc.ic.ac.uk}.@refill
-
-@c ----------------------------------------------------------------
-@node hostd Selector Variable, karch Selector Variable, host Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection hostd Selector Variable
-@cindex hostd Selector Variable
-@cindex hostd, mount selector
-@cindex Mount selector; hostd
-@cindex Selector; hostd
-
-This resolves to the @code{$@{host@}} and @code{$@{domain@}}
-concatenated with a @samp{.} inserted between them if required. If
-@code{$@{domain@}} is an empty string then @code{$@{host@}} and
-@code{$@{hostd@}} will be identical.
-
-@c ----------------------------------------------------------------
-@node karch Selector Variable, os Selector Variable, hostd Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection karch Selector Variable
-@cindex karch Selector Variable
-@cindex karch, mount selector
-@cindex Mount selector; karch
-@cindex Selector; karch
-
-This is provided as a hook for the kernel architecture. This is used on
-SunOS 4 and SunOS 5, for example, to distinguish between different
-@samp{/usr/kvm} volumes. @code{$@{karch@}} defaults to the ``machine''
-value gotten from @b{uname}(2). If the @b{uname}(2) system call is not
-available, the value of @code{$@{karch@}} defaults to that of
-@code{$@{arch@}}. Finally, a different value can be set with the @code{-k}
-command line option.
-
-@c ----------------------------------------------------------------
-@node os Selector Variable, osver Selector Variable, karch Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection os Selector Variable
-@cindex os Selector Variable
-@cindex os, mount selector
-@cindex Mount selector; os
-@cindex Selector; os
-
-The operating system. Like the machine architecture, this is
-automatically determined at compile time. The operating system name can
-be displayed by running the command @samp{amd -v}. @xref{Supported
-Platforms}.@refill
-
-@c ----------------------------------------------------------------
-@node osver Selector Variable, full_os Selector Variable, os Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection osver Selector Variable
-@cindex osver Selector Variable
-@cindex osver, mount selector
-@cindex Mount selector; osver
-@cindex Selector; osver
-
-The operating system version. Like the machine architecture, this is
-automatically determined at compile time. The operating system name can
-be displayed by running the command @samp{amd -v}. @xref{Supported
-Platforms}.@refill
-
-@c ----------------------------------------------------------------
-@node full_os Selector Variable, vendor Selector Variable, osver Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection full_os Selector Variable
-@cindex full_os Selector Variable
-@cindex full_os, mount selector
-@cindex Mount selector; full_os
-@cindex Selector; full_os
-
-The full name of the operating system, including its version. This
-value is automatically determined at compile time. The full operating
-system name and version can be displayed by running the command
-@samp{amd -v}. @xref{Supported Platforms}.@refill
-
-@c ----------------------------------------------------------------
-@node vendor Selector Variable, key Selector Variable, full_os Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection vendor Selector Variable
-@cindex vendor Selector Variable
-@cindex vendor, mount selector
-@cindex Mount selector; vendor
-@cindex Selector; vendor
-
-The name of the vendor of the operating system. This value is
-automatically determined at compile time. The name of the vendor can be
-displayed by running the command @samp{amd -v}. @xref{Supported
-Platforms}.@refill
-
-
-@c ----------------------------------------------------------------
-@ifhtml
-<HR>
-@end ifhtml
-@sp 3
-The following selectors are also provided. Unlike the other selectors,
-they vary for each lookup. Note that when the name from the kernel is
-expanded prior to a map lookup, these selectors are all defined as empty
-strings.
-
-@c ----------------------------------------------------------------
-@node key Selector Variable, map Selector Variable, vendor Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection key Selector Variable
-@cindex key Selector Variable
-@cindex key, mount selector
-@cindex Mount selector; key
-@cindex Selector; key
-
-The name being resolved. For example, if @file{/home} is an automount
-point, then accessing @file{/home/foo} would set @code{$@{key@}} to the
-string @samp{foo}. The key is prefixed by the @var{pref} option set in
-the parent mount point. The default prefix is an empty string. If the
-prefix was @file{blah/} then @code{$@{key@}} would be set to
-@file{blah/foo}.@refill
-
-@c ----------------------------------------------------------------
-@node map Selector Variable, netnumber Selector Variable, key Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection map Selector Variable
-@cindex map Selector Variable
-@cindex map, mount selector
-@cindex Mount selector; map
-@cindex Selector; map
-
-The name of the mount map being used.
-
-@c ----------------------------------------------------------------
-@node netnumber Selector Variable, network Selector Variable, map Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection netnumber Selector Variable
-@cindex netnumber Selector Variable
-@cindex netnumber, mount selector
-@cindex Mount selector; netnumber
-@cindex Selector; netnumber
-
-This selector is identical to the @samp{in_network} selector function,
-see @ref{in_network Selector Function}. It will match either the name
-or number of @i{any} network interface on which this host is connected
-to. The names and numbers of all attached interfaces are available from
-the output of @samp{amd -v}.
-
-@c ----------------------------------------------------------------
-@node network Selector Variable, path Selector Variable, netnumber Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection network Selector Variable
-@cindex network Selector Variable
-@cindex network, mount selector
-@cindex Mount selector; network
-@cindex Selector; network
-
-This selector is identical to the @samp{in_network} selector function,
-see @ref{in_network Selector Function}. It will match either the name
-or number of @i{any} network interface on which this host is connected
-to. The names and numbers of all attached interfaces are available from
-the output of @samp{amd -v}.
-
-@c ----------------------------------------------------------------
-@node path Selector Variable, wire Selector Variable, network Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection path Selector Variable
-@cindex path Selector Variable
-@cindex path, mount selector
-@cindex Mount selector; path
-@cindex Selector; path
-
-The full pathname of the name being resolved. For example
-@file{/home/foo} in the example above.
-
-@c ----------------------------------------------------------------
-@node wire Selector Variable, uid Selector Variable, path Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection wire Selector Variable
-@cindex wire Selector Variable
-@cindex wire, mount selector
-@cindex Mount selector; wire
-@cindex Selector; wire
-
-This selector is identical to the @samp{in_network} selector function,
-see @ref{in_network Selector Function}. It will match either the name
-or number of @i{any} network interface on which this host is connected
-to. The names and numbers of all attached interfaces are available from
-the output of @samp{amd -v}.
-
-@c ----------------------------------------------------------------
-@node uid Selector Variable, gid Selector Variable, wire Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection uid Selector Variable
-@cindex uid Selector Variable
-@cindex uid, mount selector
-@cindex Mount selector; uid
-@cindex Selector; uid
-
-This selector provides the numeric effective user ID (UID) of the user
-which last accessed an automounted path name. This simple example shows
-how floppy mounting can be assigned only to machine owners:
-
-@example
-floppy -type:=pcfs \
- uid==2301;host==shekel;dev:=/dev/floppy \
- uid==6712;host==titan;dev=/dev/fd0 \
- uid==0;dev:=/dev/fd0c \
- type:=error
-@end example
-
-The example allows two machine owners to mount floppies on their
-designated workstations, allows the root user to mount on any host, and
-otherwise forces an error.
-
-@c ----------------------------------------------------------------
-@node gid Selector Variable, exists Selector Function, uid Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection gid Selector Variable
-@cindex gid Selector Variable
-@cindex gid, mount selector
-@cindex Mount selector; gid
-@cindex Selector; gid
-
-This selector provides the numeric effective group ID (GID) of the user
-which last accessed an automounted path name.
-
-@c ----------------------------------------------------------------
-@ifhtml
-<HR>
-@end ifhtml
-@sp 2
-The following boolean functions are selectors which take an argument
-@i{ARG}. They return a value of true or false, and thus do not need to
-be compared with a value. Each of these may be negated by prepending
-@samp{!} to their name.
-
-@c ----------------------------------------------------------------
-@node exists Selector Function, false Selector Function, gid Selector Variable, Selectors
-@comment node-name, next, previous, up
-@subsubsection exists Selector Function
-@cindex exists Selector Function
-@cindex exists, boolean mount selector
-@cindex !exists, boolean mount selector
-@cindex Mount selector; exists
-@cindex Selector; exists
-
-If the file listed by @i{ARG} exists (via @b{lstat}(2)), this function
-evaluates to true. Otherwise it evaluates to false.
-
-@c ----------------------------------------------------------------
-@node false Selector Function, netgrp Selector Function, exists Selector Function, Selectors
-@comment node-name, next, previous, up
-@subsubsection false Selector Function
-@cindex false Selector Function
-@cindex false, boolean mount selector
-@cindex !false, boolean mount selector
-@cindex Mount selector; false
-@cindex Selector; false
-
-Always evaluates to false. @i{ARG} is ignored.
-
-@c ----------------------------------------------------------------
-@node netgrp Selector Function, netgrpd Selector Function, false Selector Function, Selectors
-@comment node-name, next, previous, up
-@subsubsection netgrp Selector Function
-@cindex netgrp Selector Function
-@cindex netgrp, boolean mount selector
-@cindex !netgrp, boolean mount selector
-@cindex Mount selector; netgrp
-@cindex Selector; netgrp
-
-The argument @i{ARG} of this selector is a netgroup name followed
-optionally by a comma and a host name. If the host name is not
-specified, it defaults to @code{$@{host@}}. If the host name (short
-name) is a member of the netgroup, this selector evaluates to
-true. Otherwise it evaluates to false.
-
-For example, suppose you have a netgroup @samp{ppp-hosts}, and for
-reasons of performance, these have a local @file{/home} partition,
-while all other clients on the faster network can access a shared home
-directory. A common map to use for both might look like the
-following:
-
-@example
-home/* netgrp(ppp-hosts);type:=link;fs:=/local/$@{key@} \
- !netgrp(ppp-hosts);type:=nfs;rhost:=serv1;rfs:=/remote/$@{key@}
-@end example
-
-A more complex example that takes advantage of the two argument netgrp
-mount selector is given in the following scenario. Suppose one wants
-to mount the local scratch space from a each host under
-@file{scratch/<hostname>} and some hosts have their scratch space in a
-different path than others. Hosts in the netgroup @samp{apple-hosts}
-have their scratch space in the @file{/apple} path, where hosts in the
-netgroup @samp{cherry-hosts} have their scratch space in the
-@file{/cherry} path. For hosts that are neither in the
-@samp{apple-hosts} or @samp{cherry-hosts} netgroups we want to make a
-symlink pointing to nowhere but provide a descriptive error message in
-the link destination:
-
-@example
-scratch/* netgrp(apple-hosts,$@{/key@});type:=nfs;rhost:=$@{/key@};\
- rfs:="/apple" \
- netgrp(cherry-hosts,$@{/key@});type:=nfs;rhost:=$@{/key@};\
- rfs:="/cherry" \
- type:=link;rfs:="no local partition for $@{/key@}"
-@end example
-
-@c ----------------------------------------------------------------
-@node netgrpd Selector Function, in_network Selector Function, netgrp Selector Function, Selectors
-@comment node-name, next, previous, up
-@subsubsection netgrpd Selector Function
-@cindex netgrpd Selector Function
-@cindex netgrpd, boolean mount selector
-@cindex !netgrpd, boolean mount selector
-@cindex Mount selector; netgrpd
-@cindex Selector; netgrpd
-
-The argument @i{ARG} of this selector is a netgroup name followed
-optionally by a comma and a host name. If the host name is not
-specified, it defaults to @code{$@{hostd@}}. If the host name
-(fully-qualified name) is a member of the netgroup, this selector
-evaluates to true. Otherwise it evaluates to false.
-
-The @samp{netgrpd} function uses fully-qualified host names to match
-netgroup names, while the @samp{netgrp} function (@pxref{netgrp
-Selector Function}) uses short host names.
-
-@c ----------------------------------------------------------------
-@node in_network Selector Function, true Selector Function, netgrpd Selector Function, Selectors
-@comment node-name, next, previous, up
-@subsubsection in_network Selector Function
-@cindex in_network Selector Function
-@cindex in_network, boolean mount selector
-@cindex !in_network, boolean mount selector
-@cindex Mount selector; in_network
-@cindex Selector; in_network
-
-This selector matches against any network name or number with an
-optional netmask. First, if the current host has any network interface that is
-locally attached to the network specified in @i{ARG} (either via name or
-number), this selector evaluates to true.
-
-Second, @samp{in_network} supports a network/netmask syntax such as
-@samp{128.59.16.0/255.255.255.0}, @samp{128.59.16.0/24},
-@samp{128.59.16.0/0xffffff00}, or @samp{128.59.16.0/}. Using the last
-form, @i{Amd} will match the specified network number against the
-default netmasks of each of the locally attached interfaces.
-
-If the selector does not match, it evaluates to false.
-
-For example, suppose you have two servers that have an exportable
-@file{/opt} that smaller clients can NFS mount. The two servers are
-say, @samp{serv1} on network @samp{foo-net.site.com} and @samp{serv2} on
-network @samp{123.4.5.0}. You can write a map to be used by all clients
-that will attempt to mount the closest one as follows:
-
-@example
-opt in_network(foo-net.site.com);rhost:=serv1;rfs:=/opt \
- in_network(123.4.5.0);rhost:=serv2;rfs:=/opt \
- rhost:=fallback-server
-@end example
-
-@c ----------------------------------------------------------------
-@node true Selector Function, xhost Selector Function, in_network Selector Function, Selectors
-@comment node-name, next, previous, up
-@subsubsection true Selector Function
-@cindex true Selector Function
-@cindex true, boolean mount selector
-@cindex !true, boolean mount selector
-@cindex Mount selector; true
-@cindex Selector; true
-
-Always evaluates to true. @i{ARG} is ignored.
-
-@c ----------------------------------------------------------------
-@node xhost Selector Function, , true Selector Function, Selectors
-@comment node-name, next, previous, up
-@subsubsection xhost Selector Function
-@cindex xhost Selector Function
-@cindex xhost, boolean mount selector
-@cindex !xhost, boolean mount selector
-@cindex Mount selector; xhost
-@cindex Selector; xhost
-@cindex CNAMEs
-
-This function compares @i{ARG} against the current hostname, similarly
-to the @ref{host Selector Variable}. However, this function will
-also match if @i{ARG} is a CNAME (DNS Canonical Name, or alias) for
-the current host's name.
-
-@c ================================================================
-@node Map Options, , Selectors, Location Format
-@comment node-name, next, previous, up
-@subsection Map Options
-@cindex Map options
-@cindex Setting map options
-
-Options are parsed concurrently with selectors. The difference is that
-when an option is seen the string following the @samp{:=} is
-recorded for later use. As a minimum the @var{type} option must be
-specified. Each filesystem type has other options which must also be
-specified. @xref{Filesystem Types}, for details on the filesystem
-specific options.@refill
-
-Superfluous option specifications are ignored and are not reported
-as errors.
-
-The following options apply to more than one filesystem type.
-
-@menu
-* addopts Option::
-* delay Option::
-* fs Option::
-* opts Option::
-* remopts Option::
-* sublink Option::
-* type Option::
-@end menu
-
-@node addopts Option, delay Option, Map Options, Map Options
-@comment node-name, next, previous, up
-@subsubsection addopts Option
-@cindex Setting additional options on a mount location
-@cindex Overriding or adding options to a mount
-@cindex addopts, mount option
-@cindex Mount option; addopts
-
-This option adds additional options to default options normally
-specified in the @samp{/defaults} entry or the defaults of the key entry
-being processed (@pxref{opts Option}). Normally when you specify
-@samp{opts} in both the @samp{/defaults} and the map entry, the latter
-overrides the former completely. But with @samp{addopts} it will append
-the options and override any conflicting ones.
-
-@samp{addopts} also overrides the value of the @samp{remopts} option
-(@pxref{remopts Option}), which unless specified defaults to the value
-of @samp{opts}.
-
-Options which start with @samp{no} will override those with the same
-name that do not start with @samp{no} and vice verse. Special handling
-is given to inverted options such as @samp{soft} and @samp{hard},
-@samp{bg} and @samp{fg}, @samp{ro} and @samp{rw}, etc.
-
-For example, if the default options specified were
-@example
-opts:=rw,nosuid,intr,rsize=1024,wsize=1024,quota,posix
-@end example
-
-and the ones specified in a map entry were
-
-@example
-addopts:=grpid,suid,ro,rsize=2048,quota,nointr
-@end example
-
-then the actual options used would be
-
-@example
-wsize=1024,posix,grpid,suid,ro,rsize=2048,quota,nointr
-@end example
-
-@node delay Option, fs Option, addopts Option, Map Options
-@comment node-name, next, previous, up
-@subsubsection delay Option
-@cindex Setting a delay on a mount location
-@cindex Delaying mounts from specific locations
-@cindex Primary server
-@cindex Secondary server
-@cindex delay, mount option
-@cindex Mount option; delay
-
-The delay, in seconds, before an attempt will be made to mount from the
-current location. Auxiliary data, such as network address, file handles
-and so on are computed regardless of this value.
-
-A delay can be used to implement the notion of primary and secondary
-file servers. The secondary servers would have a delay of a few
-seconds, thus giving the primary servers a chance to respond first.
-
-@node fs Option, opts Option, delay Option, Map Options
-@comment node-name, next, previous, up
-@subsubsection fs Option
-@cindex Setting the local mount point
-@cindex Overriding the default mount point
-@cindex fs, mount option
-@cindex Mount option; fs
-
-The local mount point. The semantics of this option vary between
-filesystems.
-
-For NFS and UFS filesystems the value of @code{$@{fs@}} is used as the
-local mount point. For other filesystem types it has other meanings
-which are described in the section describing the respective filesystem
-type. It is important that this string uniquely identifies the
-filesystem being mounted. To satisfy this requirement, it should
-contain the name of the host on which the filesystem is resident and the
-pathname of the filesystem on the local or remote host.
-
-The reason for requiring the hostname is clear if replicated filesystems
-are considered. If a fileserver goes down and a replacement filesystem
-is mounted then the @dfn{local} mount point @dfn{must} be different from
-that of the filesystem which is hung. Some encoding of the filesystem
-name is required if more than one filesystem is to be mounted from any
-given host.
-
-If the hostname is first in the path then all mounts from a particular
-host will be gathered below a single directory. If that server goes
-down then the hung mount points are less likely to be accidentally
-referenced, for example when @b{getcwd}(3) traverses the namespace to
-find the pathname of the current directory.
-
-The @samp{fs} option defaults to
-@code{$@{autodir@}/$@{rhost@}$@{rfs@}}. In addition,
-@samp{rhost} defaults to the local host name (@code{$@{host@}}) and
-@samp{rfs} defaults to the value of @code{$@{path@}}, which is the full
-path of the requested file; @samp{/home/foo} in the example above
-(@pxref{Selectors}). @code{$@{autodir@}} defaults to @samp{/a} but may
-be changed with the @code{-a} command line option. Sun's automounter
-defaults to @samp{/tmp_mnt}. Note that there is no @samp{/} between
-the @code{$@{rhost@}} and @code{$@{rfs@}} since @code{$@{rfs@}} begins
-with a @samp{/}.@refill
-
-@node opts Option, remopts Option, fs Option, Map Options
-@comment node-name, next, previous, up
-@subsubsection opts Option
-@cindex Setting system mount options
-@cindex Passing parameters to the mount system call
-@cindex mount system call
-@cindex mount system call flags
-@cindex The mount system call
-@cindex opts, mount option
-@cindex Mount option; opts
-
-The options to pass to the mount system call. A leading @samp{-} is
-silently ignored. The mount options supported generally correspond to
-those used by @b{mount}(8) and are listed below. Some additional
-pseudo-options are interpreted by @i{Amd} and are also listed.
-
-Unless specifically overridden, each of the system default mount options
-applies. Any options not recognized are ignored. If no options list is
-supplied the string @samp{rw,defaults} is used and all the system
-default mount options apply. Options which are not applicable for a
-particular operating system are silently ignored. For example, only 4.4BSD
-is known to implement the @code{compress} and @code{spongy} options.
-
-@table @code
-
-@item acdirmax=@var{n}
-@cindex Mount flags; acdirmax
-Set the maximum directory attribute cache timeout to @var{n}.
-
-@item acdirmin=@var{n}
-@cindex Mount flags; acdirmin
-Set the minimum directory attribute cache timeout to @var{n}.
-
-@item acregmax=@var{n}
-@cindex Mount flags; acregmax
-Set the maximum file attribute cache timeout to @var{n}.
-
-@item acregmin=@var{n}
-@cindex Mount flags; acregmin
-Set the minimum file attribute cache timeout to @var{n}.
-
-@item actimeo=@var{n}
-@cindex Mount flags; actimeo
-Set the overall attribute cache timeout to @var{n}.
-
-@item auto
-@cindex Mount flags; auto
-@itemx ignore
-@cindex Mount flags; ignore
-Ignore this mount by @b{df}(1).
-
-@item cache
-@cindex Mount flags; cache
-Allow data to be cached from a remote server for this mount.
-
-@item compress
-@cindex Mount flags; compress
-Use NFS compression protocol.
-
-@item defperm
-@cindex Mount flags; defperm
-Ignore the permission mode bits, and default file permissions to 0555,
-UID 0, and GID 0. Useful for CD-ROMs formatted as ISO-9660.
-
-@item dev
-@cindex Mount flags; dev
-Allow local special devices on this filesystem.
-
-@item dirmask=@var{n}
-@cindex Mount flags; dirmask
-For PCFS mounts, specify the maximum file permissions for directories
-in the file system. See the @samp{mask} option's description for more
-details. The mask value of @var{n} can be specified in decimal,
-octal, or hexadecimal.
-
-@item dumbtimr
-@cindex Mount flags; dumbtimr
-Turn off the dynamic retransmit timeout estimator. This may be useful
-for UDP mounts that exhibit high retry rates, since it is possible that
-the dynamically estimated timeout interval is too short.
-
-@item extatt
-@cindex Mount flags; extatt
-Enable extended attributes in ISO-9660 file systems.
-
-@item fsid
-@cindex Mount flags; fsid
-Set ID of filesystem.
-
-@item gens
-@cindex Mount flags; gens
-Enable generations in ISO-9660 file systems. Generations allow you to
-see all versions of a given file.
-
-@item group=@var{n}
-@cindex Mount flags; group
-For PCFS mounts, set the group of the files in the file system to
-@var{n} (which can either be a group name or a GID number). The
-default group is the group of the directory on which the file system
-is being mounted.
-
-@item grpid
-@cindex Mount flags; grpid
-Use BSD directory group-id semantics.
-
-@item int
-@cindex Mount flags; int
-@itemx intr
-@cindex Mount flags; intr
-Allow keyboard interrupts on hard mounts.
-
-@item lock
-@cindex Mount flags; lock
-Use the NFS locking protocol (default)
-
-@item longname
-@cindex Mount Flags; longname
-For PCFS mounts, force Win95 long names.
-
-@item mask=@var{n}
-@cindex Mount flags; mask
-For PCFS mounts, specify the maximum file permissions for files in the
-file system. For example, a mask of 755 specifies that, by default,
-the owner should have read, write, and execute permissions for files,
-but others should only have read and execute permissions. Only the
-nine low-order bits of mask are used. The default mask is taken from
-the directory on which the file system is being mounted. The mask
-value of @var{n} can be specified in decimal, octal, or hexadecimal.
-
-@item multi
-@cindex Mount flags; multi
-Perform multi-component lookup on files.
-
-@item maxgroups
-@cindex Mount flags; maxgroups
-Set the maximum number of groups to allow for this mount.
-
-@item nfsv3
-@cindex Mount flags; nfsv3
-Use NFS Version 3 for this mount.
-
-@item noac
-@cindex Mount flags; noac
-Turn off the attribute cache.
-
-@item noauto
-@cindex Mount flags; noauto
-This option is used by the mount command in @samp{/etc/fstab} or
-@samp{/etc/vfstab} and means not to mount this file system when mount -a
-is used.
-
-@item nocache
-@cindex Mount flags; nocache
-Do not allow data to be cached from a remote server for this
-mount.
-
-@item noconn
-@cindex Mount flags; noconn
-Don't make a connection on datagram transports.
-
-@item nocto
-@cindex Mount flags; nocto
-No close-to-open consistency.
-
-@item nodefperm
-@cindex Mount flags; nodefperm
-Do not ignore the permission mode bits. Useful for CD-ROMS formatted as
-ISO-9660.
-
-@item nodev
-@cindex Mount flags; nodev
-@itemx nodevs
-@cindex Mount flags; nodevs
-Don't allow local special devices on this filesystem.
-
-@item noexec
-@cindex Mount flags; noexec
-Don't allow program execution.
-
-@item noint
-@cindex Mount flags; noint
-Do not allow keyboard interrupts for this mount
-
-@item nolock
-@cindex Mount flags; nolock
-Do not use the NFS locking protocol
-
-@item nomnttab
-@cindex Mount flags; nomnttab
-This option is used internally to tell Amd that a Solaris 8 system using
-mntfs is in use.
-
-@item norrip
-@cindex Mount flags; norrip
-Turn off using of the Rock Ridge Interchange Protocol (RRIP) extensions
-to ISO-9660.
-
-@item nosub
-@cindex Mount flags; nosub
-Disallow mounts beneath this mount.
-
-@item nosuid
-@cindex Mount flags; nosuid
-Don't allow set-uid or set-gid executables on this filesystem.
-
-@item noversion
-@cindex Mount flags; noversion
-Strip the extension @samp{;#} from the version string of files recorded
-on an ISO-9660 CD-ROM.
-
-@item nowin95
-@cindex Mount Flags; nowin95
-For PCFS mounts, completely ignore Win95 entries.
-
-@item optionstr
-@cindex Mount flags; optionstr
-Under Solaris 8, provide the kernel a string of options to parse and
-show as part of the special in-kernel mount file system.
-
-@item overlay
-@cindex Mount flags; overlay
-Overlay this mount on top of an existing mount, if any.
-
-@item pgthresh=@var{n}
-@cindex Mount flags; pgthresh
-Set the paging threshold to @var{n} kilobytes.
-
-@item port=@var{n}
-@cindex Mount flags; port
-Set the NFS port to @var{n}.
-
-@item posix
-@cindex Mount flags; posix
-Turn on POSIX static pathconf for mounts.
-
-@item private
-@cindex Mount flags; private
-Use local locking instead of the NLM protocol, useful for IRIX 6 only.
-
-@item proplist
-@cindex Mount flags; proplist
-Support property lists (ACLs) for this mount, useful primarily for Tru64
-UNIX.
-
-@item proto=@var{s}
-@cindex Mount flags; proto
-Use transport protocol @var{s} for NFS (can be @code{"tcp"} or @code{"udp"}).
-
-@item quota
-@cindex Mount flags; quota
-Enable quota checking on this mount.
-
-@item rdonly
-@cindex Mount flags; rdonly
-@itemx ro
-@cindex Mount flags; ro
-Mount this filesystem readonly.
-
-@item resvport
-@cindex Mount flags; resvport
-Use a reserved port (smaller than 1024) for remote NFS mounts. Most
-systems assume that, but some allow for mounts to occur on non-reserved
-ports. This causes problems when such a system tries to NFS mount one
-that requires reserved ports. It is recommended that this option always
-be on.
-
-@item retrans=@i{n}
-@cindex Mount flags; retrans
-The number of NFS retransmits made before a user error is generated by a
-@samp{soft} mounted filesystem, and before a @samp{hard} mounted
-filesystem reports @samp{NFS server @dfn{yoyo} not responding still
-trying}.
-
-@item retry
-@cindex Mount flags; retry
-Set the NFS retry counter.
-
-@item rrip
-@cindex Mount flags; rrip
-Uses the Rock Ridge Interchange Protocol (RRIP) extensions to ISO-9660.
-
-@item rsize=@var{n}
-@cindex Mount flags; rsize
-The NFS read packet size. You may need to set this if you are using
-NFS/UDP through a gateway or a slow link.
-
-@item rw
-@cindex Mount flags; rw
-Allow reads and writes on this filesystem.
-
-@item shortname
-@cindex Mount Flags; longname
-For PCFS mounts, force old DOS short names only.
-
-@item soft
-@cindex Mount flags; soft
-Give up after @dfn{retrans} retransmissions.
-
-@item spongy
-@cindex Mount flags; spongy
-Like @samp{soft} for status requests, and @samp{hard} for data transfers.
-
-@item suid
-@cindex Mount flags; suid
-Allow set-uid programs on this mount.
-
-@item symttl
-@cindex Mount flags; symttl
-Turn off the symbolic link cache time-to-live.
-
-@item sync
-@cindex Mount flags; sync
-Perform synchronous filesystem operations on this mount.
-
-@item tcp
-@cindex Mount flags; tcp
-Use TCP/IP instead of UDP/IP, ignored if the NFS implementation does not
-support TCP/IP mounts.
-
-@item timeo=@var{n}
-@cindex Mount flags; timeo
-The NFS timeout, in tenth-seconds, before a request is retransmitted.
-
-@item user=@var{n}
-@cindex Mount flags; user
-For PCFS mounts, set the owner of the files in the file system to
-@var{n} (which can either be a user name or a UID number). The
-default owner is the owner of the directory on which the file system
-is being mounted.
-
-@item vers=@var{n}
-@cindex Mount flags; vers
-Use NFS protocol version number @var{n} (can be 2 or 3).
-
-@item wsize=@var{n}
-@cindex Mount flags; wsize
-The NFS write packet size. You may need to set this if you are using
-NFS/UDP through a gateway or a slow link.
-
-@end table
-
-The following options are implemented by @i{Amd}, rather than being
-passed to the kernel.
-
-@table @code
-
-@item nounmount
-@cindex Mount flags; nounmount
-Configures the mount so that its time-to-live will never expire. This
-is the default for non-network based filesystem types (such as
-mounting local disks, floppies, and CD-ROMs). See also the related
-@i{unmount} option.
-@c
-@c Implementation broken:
-
-@item ping=@var{n}
-@cindex Mount flags; ping
-The interval, in seconds, between keep-alive pings. When four
-consecutive pings have failed the mount point is marked as hung. This
-interval defaults to 30 seconds; if the ping interval is set to zero,
-@i{Amd} will use the default 30-second interval. If the interval is
-set to -1 (or any other negative value), no pings are sent and the
-host is assumed to be always up, which can cause unmounts to hang See
-the @i{softlookup} option for a better alternative. Turning pings off
-can be useful in NFS-HA (High-Availability) sites where the NFS
-service rarely goes down. Setting the ping value to a large value can
-reduce the amount of NFS_NULL chatter on your network considerably,
-especially in large sites.
-
-Note that if you have multiple @i{Amd} entries using the same file
-server, and each entry sets a different value of N, then each time Amd
-mounts a new entry, the ping value will be re-evaluated (and updated,
-turned off, or turned back on as needed). Finally, note that NFS_NULL
-pings are sent for both UDP and TCP mounts, because even a hung TCP
-mount can cause user processes to hang.
-
-@item public
-@cindex Mount flags; public
-Use WebNFS multi-component lookup on the public file handle instead of
-the mount protocol to obtain NFS file handles, as documented in the
-WebNFS Client Specification, RFC 2054. This means that @i{Amd} will not
-attempt to contact the remote portmapper or remote mountd daemon, and
-will only connect to the well-known NFS port 2049 or the port specified
-with the @i{port} mount option, thus making it easier to use NFS through
-a firewall.
-
-@item retry=@var{n}
-@cindex Mount flags; retry=@var{n}
-The number of times to retry the mount system call.
-
-@item softlookup
-@cindex Mount flags; softlookup
-Configures @i{Amd}'s behavior with respect to already-mounted shares from
-NFS fileservers that are unreachable. If softlookup is specified,
-trying to access such a share will result in an error (EIO, which is
-changed from the ENOENT 6.0 used to return). If it is not specified, a
-regular symlink is provided and the access will probably hang
-in the NFS filesystem.
-
-The default behavior depends on whether the mount is 'soft' or 'hard';
-softlookup can be used to change this default. This is changed from 6.0
-which always behaved as if softlookup was specified.
-
-@item unmount
-@cindex Mount flags; unmount
-Configures the mount so that its time-to-live will indeed expire (and
-thus may be automatically unmounted). This is also the default for
-network-based filesystem types (e.g., NFS). This option is useful for
-removable local media such as CD-ROMs, USB drives, etc. so they can
-expire when not in use, and get unmounted (such drives can get work
-out when they keep spinning). See also the related @i{nounmount}
-option.
-
-@item utimeout=@var{n}
-@cindex Mount flags; utimeout=@var{n}
-The interval, in seconds, that looked up and mounted map entries are
-cached. After that period of time, @i{Amd} will attempt to unmount
-the entries. If, however, the unmount fails (with EBUSY), then
-@i{Amd} will extend the mount's time-to-live by the @i{utimeout} value
-before the next unmount attempt is made. In fact the interval is
-extended before the unmount is attempted, to avoid thrashing. The
-default value is 120 seconds (two minutes) or as set by the @code{-w}
-command line option.
-
-@item xlatecookie
-@cindex Mount flags; xlatecookie
-Translate directory cookies between 32-long and 64-long lengths.
-
-@end table
-
-@node remopts Option, sublink Option, opts Option, Map Options
-@comment node-name, next, previous, up
-@subsubsection remopts Option
-@cindex Setting system mount options for non-local networks
-@cindex remopts, mount option
-@cindex Mount option; remopts
-
-This option has the same use as @code{$@{opts@}} but applies only when
-the remote host is on a non-local network. For example, when using NFS
-across a gateway it is often necessary to use smaller values for the
-data read and write sizes. This can simply be done by specifying the
-small values in @var{remopts}. When a non-local host is accessed, the
-smaller sizes will automatically be used.
-
-@i{Amd} determines whether a host is local by examining the network
-interface configuration at startup. Any interface changes made after
-@i{Amd} has been started will not be noticed. The likely effect will
-be that a host may incorrectly be declared non-local.
-
-Unless otherwise set, the value of @code{$@{remopts@}} is the same as
-the value of @code{$@{opts@}}.
-
-@node sublink Option, type Option, remopts Option, Map Options
-@comment node-name, next, previous, up
-@subsubsection sublink Option
-@cindex Setting the sublink option
-@cindex sublink, mount option
-@cindex Mount option; sublink
-
-The subdirectory within the mounted filesystem to which the reference
-should point. This can be used to prevent duplicate mounts in cases
-where multiple directories in the same mounted filesystem are used.
-
-@node type Option, , sublink Option, Map Options
-@comment node-name, next, previous, up
-@subsubsection type Option
-@cindex Setting the filesystem type option
-@cindex type, mount option
-@cindex Mount option; type
-
-The filesystem type to be used. @xref{Filesystem Types}, for a full
-description of each type.@refill
-
-@c ################################################################
-@node Amd Command Line Options, Filesystem Types, Mount Maps, Top
-@comment node-name, next, previous, up
-@chapter @i{Amd} Command Line Options
-@cindex Command line options, Amd
-@cindex Amd command line options
-@cindex Overriding defaults on the command line
-
-Many of @i{Amd}'s parameters can be set from the command line. The
-command line is also used to specify automount points and maps.
-
-The general format of a command line is
-
-@example
-amd [@i{options}] [@{ @i{directory} @i{map-name} [-@i{map-options}] @} ...]
-@end example
-
-For each directory and map-name given or specified in the
-@file{amd.conf} file, @i{Amd} establishes an automount point. The
-@dfn{map-options} may be any sequence of options or
-selectors---@pxref{Location Format}. The @dfn{map-options} apply only
-to @i{Amd}'s mount point.
-
-@samp{type:=toplvl;cache:=mapdefault;fs:=$@{map@}} is the default value for the
-map options. Default options for a map are read from a special entry in
-the map whose key is the string @samp{/defaults}. When default options
-are given they are prepended to any options specified in the mount-map
-locations as explained in @ref{Map Defaults}.
-
-The @dfn{options} are any combination of those listed below.
-
-Once the command line has been parsed, the automount points are mounted.
-The mount points are created if they do not already exist, in which case they
-will be removed when @i{Amd} exits.
-Finally, @i{Amd} disassociates itself from its controlling terminal and
-forks into the background.
-
-Note: Even if @i{Amd} has been built with @samp{-DDEBUG} (via
-@code{configure --enable-debug}), it will still background itself and
-disassociate itself from the controlling terminal. To use a debugger it
-is necessary to specify @samp{-D daemon} on the command line.
-However, even with all of this, mounts and unmounts are performed in the
-background, and @i{Amd} will always fork before doing them. Therefore,
-debugging what happens closely during un/mounts is more challenging.
-
-@emph{All} of @i{Amd}'s command options (save @code{-F} and @code{-T})
-can be specified in the @file{amd.conf} file. @xref{Amd Configuration
-File}. If @i{Amd} is invoked without any command line options, it will
-default to using the configuration file @file{/etc/amd.conf}, if one
-exists.
-
-@menu
-* -a Option:: Automount directory.
-* -c Option:: Cache timeout interval.
-* -d Option:: Domain name.
-* -k Option:: Kernel architecture.
-* -l Option:: Log file.
-* -n Option:: Hostname normalization.
-* -o Option:: Operating system version.
-* -p Option:: Output process id.
-* -r Option:: Restart existing mounts.
-* -t Option:: Kernel RPC timeout.
-* -v Option:: Version information.
-* -w Option:: Wait interval after failed unmount.
-* -x Option:: Log options.
-* -y Option:: NIS domain.
-* -A Option:: Operating system Architecture.
-* -C Option:: Cluster name.
-* -D Option:: Debug flags.
-* -F Option:: Amd configuration file.
-* -H Option:: Show brief help.
-* -O Option:: Operating system name.
-* -S Option:: Lock executable pages in memory.
-* -T Option:: Set tag for configuration file.
-@end menu
-
-@c ----------------------------------------------------------------
-@node -a Option, -c Option, Amd Command Line Options, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-a} @var{directory}
-@cindex Automount directory
-@cindex Setting the default mount directory
-
-Specifies the default mount directory. This option changes the variable
-@code{$@{autodir@}} which otherwise defaults to @file{/a}. For example,
-some sites prefer @file{/amd} or @file{/n}.
-
-@example
-amd -a /amd ...
-@end example
-
-@c ----------------------------------------------------------------
-@node -c Option, -d Option, -a Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-c} @var{cache-interval}
-@cindex Cache interval
-@cindex Interval before a filesystem times out
-@cindex Setting the interval before a filesystem times out
-@cindex Changing the interval before a filesystem times out
-
-Selects the period, in seconds, for which a name is cached by @i{Amd}.
-If no reference is made to the volume in this period, @i{Amd} discards
-the volume name to filesystem mapping.
-
-Once the last reference to a filesystem has been removed, @i{Amd}
-attempts to unmount the filesystem. If the unmount fails the interval
-is extended by a further period as specified by the @samp{-w} command
-line option or by the @samp{utimeout} mount option.
-
-The default @dfn{cache-interval} is 300 seconds (five minutes).
-
-@c ----------------------------------------------------------------
-@node -d Option, -k Option, -c Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-d} @var{domain}
-@cindex Domain name
-@cindex Setting the local domain name
-@cindex Overriding the local domain name
-
-Specifies the host's domain. This sets the internal variable
-@code{$@{domain@}} and affects the @code{$@{hostd@}} variable.
-
-If this option is not specified and the hostname already contains the
-local domain then that is used, otherwise the default value of
-@code{$@{domain@}} is @samp{unknown.domain}.
-
-For example, if the local domain was @samp{doc.ic.ac.uk}, @i{Amd} could
-be started as follows:
-
-@example
-amd -d doc.ic.ac.uk ...
-@end example
-
-@c ----------------------------------------------------------------
-@node -k Option, -l Option, -d Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-k} @var{kernel-architecture}
-@cindex Setting the Kernel architecture
-
-Specifies the kernel architecture of the system. This is usually the
-output of @samp{uname -m} (the ``machine'' value gotten from
-@b{uname}(2)). If the @b{uname}(2) system call is not available, the
-value of @code{$@{karch@}} defaults to that of @code{$@{arch@}}.
-
-The only effect of this option is to set the variable @code{$@{karch@}}.
-
-This option would be used as follows:
-
-@example
-amd -k `arch -k` ...
-@end example
-
-@c ----------------------------------------------------------------
-@node -l Option, -n Option, -k Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-l} @var{log-option}
-@cindex Log filename
-@cindex Setting the log file
-@cindex Using syslog to log errors
-@cindex syslog
-
-Selects the form of logging to be made. Several special @dfn{log-options}
-are recognized.
-
-@enumerate
-@item
-If @dfn{log-option} is the string @samp{syslog}, @i{Amd} will use the
-@b{syslog}(3) mechanism. If your system supports syslog facilities, then
-the default facility used is @samp{LOG_DAEMON}.
-
-@item
-@cindex syslog facility; specifying an alternate
-When using syslog, if you wish to change the facility, append its name
-to the log option name, delimited by a single colon. For example, if
-@dfn{log-options} is the string @samp{syslog:local7} then @b{Amd} will
-log messages via @b{syslog}(3) using the @samp{LOG_LOCAL7} facility. If
-the facility name specified is not recognized, @i{Amd} will default to
-@samp{LOG_DAEMON}. Note: while you can use any syslog facility
-available on your system, it is generally a bad idea to use those
-reserved for other services such as @samp{kern}, @samp{lpr},
-@samp{cron}, etc.
-
-@item
-If @dfn{log-option} is the string @samp{/dev/stderr}, @i{Amd} will use
-standard error, which is also the default target for log messages. To
-implement this, @i{Amd} simulates the effect of the @samp{/dev/fd}
-driver.
-@end enumerate
-
-Any other string is taken as a filename to use for logging. Log
-messages are appended to the file if it already exists, otherwise a new
-file is created. The file is opened once and then held open, rather
-than being re-opened for each message.
-
-Normally, when long-running daemons hold an open file descriptor on a
-log file, it is impossible to ``rotate'' the log file and compress older
-logs on a daily basis. The daemon needs to be told to discard (via
-@b{close}(2)) its file handle, and re-open the log file. This is done
-using @code{amq -l} @i{log-option}. @xref{Amq -l option}.
-
-If the @samp{syslog} option is specified but the system does not support
-syslog or if the named file cannot be opened or created, @i{Amd} will
-use standard error. Error messages generated before @i{Amd} has
-finished parsing the command line are printed on standard error.
-
-Since @i{Amd} tends to generate a lot of logging information (especially
-if debugging was turned on), and due to it being an important program
-running on the system, it is usually best to log to a separate disk
-file. In that case @i{Amd} would be started as follows:
-
-@example
-amd -l /var/log/amd ...
-@end example
-
-@c ----------------------------------------------------------------
-@node -n Option, -o Option, -l Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-n}
-@cindex Hostname normalization
-@cindex Aliased hostnames
-@cindex Resolving aliased hostnames
-@cindex Normalizing hostnames
-
-Normalizes the remote hostname before using it. Normalization is done
-by replacing the value of @code{$@{rhost@}} with the (generally fully
-qualified) primary name returned by a hostname lookup.
-
-This option should be used if several names are used to refer to a
-single host in a mount map.
-
-@c ----------------------------------------------------------------
-@node -o Option, -p Option, -n Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-o} @var{op-sys-ver}
-@cindex Operating System version
-@cindex Setting the Operating System version
-
-Overrides the compiled-in version number of the operating system, with
-@var{op-sys-ver}. Useful when the built-in version is not desired for
-backward compatibility reasons. For example, if the built-in version is
-@samp{2.5.1}, you can override it to @samp{5.5.1}, and use older maps
-that were written with the latter in mind.
-
-@c ----------------------------------------------------------------
-@node -p Option, -r Option, -o Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-p}
-@cindex Process id
-@cindex Displaying the process id
-@cindex process id of Amd daemon
-@cindex pid file, creating with -p option
-@cindex Creating a pid file
-
-Causes @i{Amd}'s process id to be printed on standard output.
-This can be redirected to a suitable file for use with kill:
-
-@example
-amd -p > /var/run/amd.pid ...
-@end example
-
-This option only has an affect if @i{Amd} is running in daemon mode.
-If @i{Amd} is started with the @code{-D daemon} debug flag, this
-option is ignored.
-
-@c ----------------------------------------------------------------
-@node -r Option, -t Option, -p Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-r}
-@cindex Restarting existing mounts
-@cindex Picking up existing mounts
-
-Tells @i{Amd} to restart existing mounts (@pxref{Inheritance Filesystem}).
-@c @dfn{This option will be made the default in the next release.}
-
-@c ----------------------------------------------------------------
-@node -t Option, -v Option, -r Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-t} @var{timeout.retransmit}
-@cindex Setting Amd's RPC parameters
-
-Specifies the RPC @dfn{timeout} interval and the @dfn{retransmit}
-counter used by the kernel to communicate to @i{Amd}. These are used to
-set the @samp{timeo} and @samp{retrans} mount options, respectively.
-The default timeout is 0.8 seconds, and the default number of
-retransmissions is 11.
-
-@i{Amd} relies on the kernel RPC retransmit mechanism to trigger mount
-retries. The values of these parameters change the overall retry
-interval. Too long an interval gives poor interactive response; too
-short an interval causes excessive retries.
-
-@c ----------------------------------------------------------------
-@node -v Option, -w Option, -t Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-v}
-@cindex Version information
-@cindex Discovering version information
-@cindex How to discover your version of Amd
-
-Print version information on standard error and then exit. The output
-is of the form:
-
-@example
-Copyright (c) 1997-1999 Erez Zadok
-Copyright (c) 1990 Jan-Simon Pendry
-Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-Copyright (c) 1990 The Regents of the University of California.
-am-utils version 6.0a15 (build 61).
-Built by ezk@@cs.columbia.edu on date Wed Oct 22 15:21:03 EDT 1997.
-cpu=sparc (big-endian), arch=sun4, karch=sun4u.
-full_os=solaris2.5.1, os=sos5, osver=5.5.1, vendor=sun.
-Map support for: root, passwd, union, nisplus, nis, ndbm, file, error.
-AMFS: nfs, link, nfsx, nfsl, host, linkx, program, union, inherit,
- ufs, lofs, hsfs, pcfs, auto, direct, toplvl, error.
-FS: autofs, cachefs, cdfs, lofs, nfs, nfs3, pcfs, tfs, tmpfs, ufs.
-Network 1: wire="mcl-lab-net.cs.columbia.edu" (netnumber=128.59.13).
-Network 2: wire="14-net.cs.columbia.edu" (netnumber=128.59.14).
-Network 3: wire="old-net.cs.columbia.edu" (netnumber=128.59.16).
-@end example
-
-The information includes the version number, number of times @i{Amd} was
-compiled on the local system, release date and name of the release.
-Following come the cpu type, byte ordering, and the architecture and
-kernel architecture as @code{$@{arch@}} and @code{$@{karch@}},
-respectively. The next line lists the operating system full name, short
-name, version, and vendor. These four values correspond to the
-variables @code{$@{full_os@}}, @code{$@{os@}}, @code{$@{osver@}}, and
-@code{$@{vendor@}}, respectively. @xref{Supported Platforms}.
-
-Then come a list of map types supported, filesystems internally
-supported by @i{Amd} (AMFS), and generic filesystems available (FS).
-Finally all known networks (if any) of this host are listed by name
-and number. They are available via the variables
-@code{$@{wire@}} or @code{$@{network@}}, and
-@code{$@{netnumber@}} (@pxref{Selectors}) or the @samp{in_network}
-selector function (@pxref{in_network Selector Function}).
-
-@c ----------------------------------------------------------------
-@node -w Option, -x Option, -v Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-w} @var{wait-timeout}
-@cindex Setting the interval between unmount attempts
-@cindex unmount attempt backoff interval
-
-Selects the interval in seconds between unmount attempts after the
-initial time-to-live has expired.
-
-This defaults to 120 seconds (two minutes).
-
-@c ----------------------------------------------------------------
-@node -x Option, -y Option, -w Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-x} @var{opts}
-@cindex Log message selection
-@cindex Selecting specific log messages
-@cindex How to select log messages
-@cindex syslog priorities
-
-Specifies the type and verbosity of log messages. @dfn{opts} is
-a comma separated list selected from the following options:
-
-@table @code
-@item fatal
-Fatal errors
-@item error
-Non-fatal errors
-@item user
-Non-fatal user errors
-@item warn
-Recoverable errors
-@item warning
-Alias for @code{warn}
-@item info
-Information messages
-@item map
-Mount map usage
-@item stats
-Additional statistics
-@item all
-All of the above
-@end table
-
-Initially a set of default logging flags is enabled. This is as if
-@samp{-x all,nomap,nostats} had been selected. The command line is
-parsed and logging is controlled by the @code{-x} option. The very first
-set of logging flags is saved and can not be subsequently disabled using
-@i{Amq}. This default set of options is useful for general production
-use.@refill
-
-The @samp{info} messages include details of what is mounted and
-unmounted and when filesystems have timed out. If you want to have the
-default set of messages without the @samp{info} messages then you simply
-need @samp{-x noinfo}. The messages given by @samp{user} relate to
-errors in the mount maps, so these are useful when new maps are
-installed. The following table lists the syslog priorities used for each
-of the message types.@refill
-
-@table @code
-@item fatal
-@samp{LOG_CRIT}
-@item error
-@samp{LOG_ERR}
-@item user
-@samp{LOG_WARNING}
-@item warning
-@samp{LOG_WARNING}
-@item info
-@samp{LOG_INFO}
-@item debug
-@samp{LOG_DEBUG}
-@item map
-@samp{LOG_DEBUG}
-@item stats
-@samp{LOG_INFO}
-@end table
-
-
-The options can be prefixed by the string @samp{no} to indicate
-that this option should be turned off. For example, to obtain all
-but @samp{info} messages the option @samp{-x all,noinfo} would be used.
-
-If @i{Amd} was built with debugging enabled the @code{debug} option is
-automatically enabled regardless of the command line options.
-
-@c ----------------------------------------------------------------
-@node -y Option, -A Option, -x Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-y} @var{NIS-domain}
-@cindex NIS (YP) domain name
-@cindex Overriding the NIS (YP) domain name
-@cindex Setting the NIS (YP) domain name
-@cindex YP domain name
-
-Selects an alternate NIS domain. This is useful for debugging and
-cross-domain shared mounting. If this flag is specified, @i{Amd}
-immediately attempts to bind to a server for this domain.
-@c @i{Amd} refers to NIS maps when it starts, unless the @code{-m} option
-@c is specified, and whenever required in a mount map.
-
-@c ----------------------------------------------------------------
-@node -A Option, -C Option, -y Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-A} @var{architecture}
-@cindex Setting the operating system architecture
-
-Specifies the OS architecture of the system.
-The only effect of this option is to set the variable @code{$@{arch@}}.
-
-This option would be used as follows:
-
-@example
-amd -A i386 ...
-@end example
-
-@c ----------------------------------------------------------------
-@node -C Option, -D Option, -A Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-C} @var{cluster-name}
-@cindex Cluster names
-@cindex Setting the cluster name
-
-Specifies the name of the cluster of which the local machine is a member.
-The only effect is to set the variable @code{$@{cluster@}}.
-The @dfn{cluster-name} is will usually obtained by running another command which uses
-a database to map the local hostname into a cluster name.
-@code{$@{cluster@}} can then be used as a selector to restrict mounting of
-replicated data.
-If this option is not given, @code{$@{cluster@}} has the same value as @code{$@{domain@}}.
-This would be used as follows:
-
-@example
-amd -C `clustername` ...
-@end example
-
-@c ----------------------------------------------------------------
-@node -D Option, -F Option, -C Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-D} @var{opts}
-@cindex Debug options
-@cindex Setting debug flags
-
-Controls the verbosity and coverage of the debugging trace; @dfn{opts}
-is a comma separated list of debugging options. The @code{-D} option is
-only available if @i{Amd} was compiled with @samp{-DDEBUG}, or
-configured with @code{configure --enable-debug}. The memory debugging
-facilities (@samp{mem}) are only available if @i{Amd} was compiled with
-@samp{-DDEBUG_MEM} (in addition to @samp{-DDEBUG}), or configured with
-@code{configure --enable-debug=mem}.
-
-The most common options to use are @samp{-D trace} and @samp{-D test}
-(which turns on all the useful debug options). As usual, every option
-can be prefixed with @samp{no} to turn it off.
-
-@table @code
-@item all
-all ``reasonable'' options (currently trace|str|full|mem|info|readdir)
-@item amq
-do not register for amq
-@item daemon
-do not enter daemon mode
-@item fork
-do not fork child worker (hlfsd only)
-@item full
-program trace
-@item hrtime
-print high resolution time stamps (only if @b{syslog}(3) is not used)
-@item info
-@cindex debugging hesiod resolver service
-@cindex Hesiod; turning on RES_DEBUG
-info service specific debugging (hesiod, nis, etc.) In the case of
-hesiod maps, turns on the hesiod RES_DEBUG internal debugging option.
-@item mem
-trace memory allocations. Needs to be explicitly enabled at compile
-time with --enable-debug=mem.
-@item mtab
-use local @file{./mtab} file
-@item readdir
-show readdir progress
-@item str
-debug string munging
-@item test
-full debug but no daemon
-@item trace
-trace RPC protocol and NFS mount arguments
-@item xdrtrace
-trace XDR routines
-@end table
-
-You may also refer to the program source for a more detailed explanation
-of the available options.
-
-@c ----------------------------------------------------------------
-@node -F Option, -H Option, -D Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-F} @var{conf-file}
-@cindex Amd configuration file; specifying name
-@cindex Amd configuration file
-@cindex amd.conf file
-
-Specify an @i{Amd} configuration file @var{conf-file} to use. For a
-description of the format and syntax, @pxref{Amd Configuration File}.
-This configuration file is used to specify any options in lieu of typing
-many of them on the command line. The @file{amd.conf} file includes
-directives for every command line option @i{Amd} has, and many more that
-are only available via the configuration file facility. The
-configuration file specified by this option is processed after all other
-options had been processed, regardless of the actual location of this
-option on the command line.
-
-@c ----------------------------------------------------------------
-@node -H Option, -O Option, -F Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-H}
-@cindex Displaying brief help
-@cindex Help; showing from Amd
-
-Print a brief help and usage string.
-
-@c ----------------------------------------------------------------
-@node -O Option, -S Option, -H Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-O} @var{op-sys-name}
-@cindex Operating System name
-@cindex Setting the Operating System name
-
-Overrides the compiled-in name of the operating system, with
-@var{op-sys-name}. Useful when the built-in name is not desired for
-backward compatibility reasons. For example, if the build in name is
-@samp{sunos5}, you can override it to the old name @samp{sos5}, and use
-older maps which were written with the latter in mind.
-
-@c ----------------------------------------------------------------
-@node -S Option, -T Option, -O Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-S}
-@cindex plock; using
-@cindex mlockall; using
-@cindex locking executable pages in memory
-
-Do @emph{not} lock the running executable pages of @i{Amd} into memory.
-To improve @i{Amd}'s performance, systems that support the @b{plock}(3)
-or @b{mlockall}(2)
-call lock the @i{Amd} process into memory. This way there is less
-chance the operating system will schedule, page out, and swap the
-@i{Amd} process as needed. This tends to improve @i{Amd}'s performance,
-at the cost of reserving the memory used by the @i{Amd} process (making
-it unavailable for other processes). If this behavior is not desired,
-use the @code{-S} option.
-
-@c ----------------------------------------------------------------
-@node -T Option, , -S Option, Amd Command Line Options
-@comment node-name, next, previous, up
-@section @code{-T} @var{tag}
-@cindex Tags for Amd configuration file
-@cindex Configuration file; tags
-
-Specify a tag to use with @file{amd.conf}. All map entries tagged with
-@var{tag} will be processed. Map entries that are not tagged are always
-processed. Map entries that are tagged with a tag other than @var{tag}
-will not be processed.
-
-@c ################################################################
-@node Filesystem Types, Amd Configuration File, Amd Command Line Options, Top
-@comment node-name, next, previous, up
-@chapter Filesystem Types
-@cindex Filesystem types
-@cindex Mount types
-@cindex Types of filesystem
-
-To mount a volume, @i{Amd} must be told the type of filesystem to be
-used. Each filesystem type typically requires additional information
-such as the fileserver name for NFS.
-
-From the point of view of @i{Amd}, a @dfn{filesystem} is anything that
-can resolve an incoming name lookup. An important feature is support
-for multiple filesystem types. Some of these filesystems are
-implemented in the local kernel and some on remote fileservers, whilst
-the others are implemented internally by @i{Amd}.@refill
-
-The two common filesystem types are UFS and NFS. Four other user
-accessible filesystems (@samp{link}, @samp{program}, @samp{auto} and
-@samp{direct}) are also implemented internally by @i{Amd} and these are
-described below. There are two additional filesystem types internal to
-@i{Amd} which are not directly accessible to the user (@samp{inherit}
-and @samp{error}). Their use is described since they may still have an
-effect visible to the user.@refill
-
-@menu
-* Network Filesystem:: A single NFS filesystem.
-* Network Host Filesystem:: NFS mount a host's entire export tree.
-* Network Filesystem Group:: An atomic group of NFS filesystems.
-* Unix Filesystem:: Native disk filesystem.
-* Caching Filesystem:: Caching from remote server filesystem.
-* CD-ROM Filesystem:: ISO9660 CD ROM.
-* Loopback Filesystem:: Local loopback-mount filesystem.
-* Memory/RAM Filesystem:: A memory or RAM-based filesystem.
-* Null Filesystem:: 4.4BSD's loopback-mount filesystem.
-* Floppy Filesystem:: MS-DOS Floppy filesystem.
-* Translucent Filesystem:: The directory merging filesystem.
-* Shared Memory+Swap Filesystem:: Sun's tmpfs filesystem.
-* User ID Mapping Filesystem:: 4.4BSD's umapfs filesystem.
-* Program Filesystem:: Generic Program mounts.
-* Symbolic Link Filesystem:: Local link.
-* Symbolic Link Filesystem II:: Local link referencing existing filesystem.
-* NFS-Link Filesystem:: Link if path exists, NFS otherwise.
-* Automount Filesystem::
-* Direct Automount Filesystem::
-* Union Filesystem::
-* Error Filesystem::
-* Top-level Filesystem::
-* Root Filesystem::
-* Inheritance Filesystem::
-@end menu
-
-@c ----------------------------------------------------------------
-@node Network Filesystem, Network Host Filesystem, Filesystem Types, Filesystem Types
-@comment node-name, next, previous, up
-@section Network Filesystem (@samp{nfs})
-@cindex NFS
-@cindex Mounting an NFS filesystem
-@cindex How to mount and NFS filesystem
-@cindex nfs, filesystem type
-@cindex Filesystem type; nfs
-
-The @dfn{nfs} (@samp{type:=nfs}) filesystem type provides access to Sun's NFS.
-
-@noindent
-The following options must be specified:
-
-@table @code
-@cindex rhost, mount option
-@cindex Mount option; rhost
-@item rhost
-the remote fileserver. This must be an entry in the hosts database. IP
-addresses are not accepted. The default value is taken
-from the local host name (@code{$@{host@}}) if no other value is
-specified.
-
-@cindex rfs, mount option
-@cindex Mount option; rfs
-@item rfs
-the remote filesystem.
-If no value is specified for this option, an internal default of
-@code{$@{path@}} is used.
-@end table
-
-NFS mounts require a two stage process. First, the @dfn{file handle} of
-the remote file system must be obtained from the server. Then a mount
-system call must be done on the local system. @i{Amd} keeps a cache
-of file handles for remote file systems. The cache entries have a
-lifetime of a few minutes.
-
-If a required file handle is not in the cache, @i{Amd} sends a request
-to the remote server to obtain it.
-@c @i{Amd} @dfn{does not} wait for
-@c a response; it notes that one of the locations needs retrying, but
-@c continues with any remaining locations. When the file handle becomes
-@c available, and assuming none of the other locations was successfully
-@c mounted, @i{Amd} will retry the mount. This mechanism allows several
-@c NFS filesystems to be mounted in parallel.
-@c @footnote{The mechanism
-@c is general, however NFS is the only filesystem
-@c for which the required hooks have been written.}
-@c The first one which responds with a valid file handle will be used.
-
-Historically, this documentation has maintained that @i{Amd} will try
-all the locations in parallel and use the first one which responds
-with a valid file handle. This has not been the case for quite some
-time, however. Instead, @i{Amd} will go through each location, one by
-one, and will only skip to the next one if the previous one either
-fails or times out.
-
-@noindent
-An NFS entry might be:
-
-@example
-jsp host!=charm;type:=nfs;rhost:=charm;rfs:=/home/charm;sublink:=jsp
-@end example
-
-The mount system call and any unmount attempts are always done
-in a new task to avoid the possibility of blocking @i{Amd}.
-
-@c ----------------------------------------------------------------
-@node Network Host Filesystem, Network Filesystem Group, Network Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Network Host Filesystem (@samp{host})
-@cindex Network host filesystem
-@cindex Mounting entire export trees
-@cindex How to mount all NFS exported filesystems
-@cindex host, filesystem type
-@cindex Filesystem type; host
-
-@c NOTE: the current implementation of the @dfn{host} filesystem type
-@c sometimes fails to maintain a consistent view of the remote mount tree.
-@c This happens when the mount times out and only some of the remote mounts
-@c are successfully unmounted. To prevent this from occurring, use the
-@c @samp{nounmount} mount option.
-
-The @dfn{host} (@samp{type:=host}) filesystem allows access to the entire export tree of an
-NFS server. The implementation is layered above the @samp{nfs}
-implementation so keep-alives work in the same way. The only option
-which needs to be specified is @samp{rhost} which is the name of the
-fileserver to mount.
-
-The @samp{host} filesystem type works by querying the mount daemon on
-the given fileserver to obtain its export list. @i{Amd} then obtains
-filehandles for each of the exported filesystems. Any errors at this
-stage cause that particular filesystem to be ignored. Finally each
-filesystem is mounted. Again, errors are logged but ignored. One
-common reason for mounts to fail is that the mount point does not exist.
-Although @i{Amd} attempts to automatically create the mount point, it
-may be on a remote filesystem to which @i{Amd} does not have write
-permission.
-
-When an attempt to unmount a @samp{host} filesystem mount fails, @i{Amd}
-remounts any filesystems which had successfully been unmounted. To do
-this @i{Amd} queries the mount daemon again and obtains a fresh copy of
-the export list. @i{Amd} then tries to mount any exported filesystems
-which are not currently mounted.
-
-Sun's automounter provides a special @samp{-hosts} map. To achieve the
-same effect with @i{Amd} requires two steps. First a mount map must
-be created as follows:
-
-@example
-* type:=host;rhost:=$@{key@};fs:=$@{autodir@}/$@{rhost@}/root
-@end example
-
-@noindent
-and then start @i{Amd} with the following command
-
-@example
-amd /net net.map
-@end example
-
-@noindent
-where @samp{net.map} is the name of map described above. Note that the
-value of @code{$@{fs@}} is overridden in the map. This is done to avoid
-a clash between the mount tree and any other filesystem already mounted
-from the same fileserver.
-
-If different mount options are needed for different hosts then
-additional entries can be added to the map, for example
-
-@example
-host2 opts:=ro,nosuid,soft
-@end example
-
-@noindent
-would soft mount @samp{host2} read-only.
-
-@c ----------------------------------------------------------------
-@node Network Filesystem Group, Unix Filesystem, Network Host Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Network Filesystem Group (@samp{nfsx})
-@cindex Network filesystem group
-@cindex Atomic NFS mounts
-@cindex Mounting an atomic group of NFS filesystems
-@cindex How to mount an atomic group of NFS filesystems
-@cindex nfsx, filesystem type
-@cindex Filesystem type; nfsx
-
-The @dfn{nfsx} (@samp{type:=nfsx}) filesystem allows a group of filesystems to be mounted
-from a single NFS server. The implementation is layered above the
-@samp{nfs} implementation so keep-alives work in the same way.
-
-@emph{WARNING}: @samp{nfsx} is meant to be a ``last resort'' kind of
-solution. It is racy and poorly supported. The authors @emph{highly}
-recommend that other solutions be considered before relying on it.
-
-The options are the same as for the @samp{nfs} filesystem with one
-difference for @samp{rfs}, as explained below.
-
-@noindent
-The following options should be specified:
-
-@table @code
-@item rhost
-the remote fileserver. The default value is taken from the local
-host name (@code{$@{host@}}) if no other value is specified.
-
-@item rfs
-is a list of filesystems to mount, and must be specified.
-The list is in the form of a comma separated strings.
-@end table
-
-@noindent
-For example:
-
-@example
-pub type:=nfsx;rhost:=gould;\
- rfs:=/public,/,graphics,usenet;fs:=$@{autodir@}/$@{rhost@}/root
-@end example
-
-The first string defines the root of the tree, and is applied as a
-prefix to the remaining members of the list which define the individual
-filesystems. The first string is @emph{not} used as a filesystem name.
-A serial operation is used to determine the local mount points to
-ensure a consistent layout of a tree of mounts.
-
-Here, the @emph{three} filesystems, @samp{/public},
-@samp{/public/graphics} and @samp{/public/usenet}, would be mounted.@refill
-
-A local mount point, @code{$@{fs@}}, @emph{must} be specified. The
-default local mount point will not work correctly in the general case.
-A suggestion is to use @samp{fs:=$@{autodir@}/$@{rhost@}/root}.@refill
-
-@c ----------------------------------------------------------------
-@node Unix Filesystem, Caching Filesystem, Network Filesystem Group, Filesystem Types
-@comment node-name, next, previous, up
-@section Unix Filesystem (@samp{ufs}, @samp{xfs}, or @samp{efs})
-@cindex Unix filesystem
-@cindex UFS
-@cindex XFS
-@cindex EFS
-@cindex Mounting a UFS filesystem
-@cindex Mounting a local disk
-@cindex How to mount a UFS filesystems
-@cindex How to mount a local disk
-@cindex Disk filesystems
-@cindex ufs, filesystem type
-@cindex Filesystem type; ufs
-@cindex xfs, filesystem type
-@cindex Filesystem type; xfs
-@cindex efs, filesystem type
-@cindex Filesystem type; efs
-
-The @dfn{ufs} (@samp{type:=ufs}) filesystem type provides access to the system's standard
-disk filesystem---usually a derivative of the Berkeley Fast Filesystem.
-
-@noindent
-The following option must be specified:
-
-@table @code
-@cindex dev, mount option
-@cindex Mount option; dev
-@item dev
-the block special device to be mounted.
-@end table
-
-A UFS entry might be:
-
-@example
-jsp host==charm;type:=ufs;dev:=/dev/sd0d;sublink:=jsp
-@end example
-
-UFS is the default Unix disk-based file system, which Am-utils picks up
-during the autoconfiguration phase. Some systems have more than one
-type, such as IRIX, that comes with EFS (Extent File System) and XFS
-(Extended File System). In those cases, you may explicitly set the file
-system type, by using entries such:
-
-@example
-ez1 type:=efs;dev:=/dev/xd0a
-ez2 type:=xfs;dev:=/dev/sd3c
-@end example
-
-The UFS/XFS/EFS filesystems are never timed out by default, i.e. they
-will never be unmounted by @i{Amd}. If automatic unmounting is
-desired, the ``unmount'' option should be added to the mount options
-for the entry.
-
-@c ----------------------------------------------------------------
-@node Caching Filesystem, CD-ROM Filesystem, Unix Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Caching Filesystem (@samp{cachefs})
-@cindex Caching Filesystem
-@cindex cachefs, filesystem type
-@cindex Filesystem type; cachefs
-
-The @dfn{cachefs} (@samp{type:=cachefs}) filesystem caches files from
-one location onto another, presumably providing faster access. It is
-particularly useful to cache from a larger and remote (slower) NFS
-partition to a smaller and local (faster) UFS directory.
-
-@noindent
-The following options must be specified:
-
-@table @code
-@cindex cachedir, mount option
-@cindex Mount option; cachedir
-@item cachedir
-the directory where the cache is stored.
-@item rfs
-the path name to the ``back file system'' to be cached from.
-@item fs
-the ``front file system'' mount point to the cached files, where @i{Amd}
-will set a symbolic link pointing to.
-@end table
-
-A CacheFS entry for, say, the @file{/import} @i{Amd} mount point, might
-be:
-
-@example
-copt type:=cachefs;cachedir:=/cache;rfs:=/import/opt;fs:=/n/import/copt
-@end example
-
-Access to the pathname @file{/import/copt} will follow a symbolic link
-to @file{/n/import/copt}. The latter is the mount point for a caching
-file system, that caches from @file{/import/opt} to @file{/cache}.
-
-The cachefs filesystem is never timed out by default, i.e. it will
-never be unmounted by @i{Amd}. If automatic unmounting is desired, the
-``unmount'' option should be added to the mount options for the entry.
-
-@b{Caveats}:
-@enumerate
-@item This file system is currently only implemented for Solaris 2.x!
-@item Before being used for the first time, the cache directory @i{must} be
-initialized with @samp{cfsadmin -c @var{cachedir}}. See the manual page for
-@b{cfsadmin}(1M) for more information.
-@item The ``back file system'' mounted must be a complete file system, not
-a subdirectory thereof; otherwise you will get an error ``Invalid Argument''.
-@item If @i{Amd} aborts abnormally, the state of the cache may be
-inconsistent, requiring running the command @file{fsck -F cachefs
-@var{cachedir}}. Otherwise you will get the error ``No Space Left on Device''.
-@end enumerate
-
-@c ----------------------------------------------------------------
-@node CD-ROM Filesystem, Loopback Filesystem, Caching Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section CD-ROM Filesystem (@samp{cdfs})
-@cindex CD-ROM Filesystem
-@cindex cdfs, filesystem type
-@cindex Filesystem type; cdfs
-
-The @dfn{cdfs} (@samp{type:=cdfs}) filesystem mounts a CD-ROM with an
-ISO9660 format filesystem on it.
-
-@noindent
-The following option must be specified:
-
-@table @code
-@cindex dev, mount option
-@cindex Mount option; dev
-@item dev
-the block special device to be mounted.
-@end table
-
-Some operating systems will fail to mount read-only CDs unless the
-@samp{ro} option is specified. A cdfs entry might be:
-
-@example
-cdfs os==sunos4;type:=cdfs;dev:=/dev/sr0 \
- os==sunos5;addopts:=ro;type:=cdfs;dev:=/dev/dsk/c0t6d0s2
-@end example
-
-@c ----------------------------------------------------------------
-@node Loopback Filesystem, Memory/RAM Filesystem, CD-ROM Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Loopback Filesystem (@samp{lofs})
-@cindex Loopback Filesystem
-@cindex lofs, filesystem type
-@cindex Filesystem type; lofs
-
-The @dfn{lofs} (@samp{type:=lofs}) filesystem is also called the
-loopback filesystem. It mounts a local directory on another, thus
-providing mount-time binding to another location (unlike symbolic
-links).
-
-The loopback filesystem is particularly useful within the context of a
-chroot-ed directory (via @b{chroot}(2)), to provide access to
-directories otherwise inaccessible.
-
-@noindent
-The following option must be specified:
-
-@table @code
-@cindex rfs, mount option
-@cindex Mount option; rfs
-@item rfs
-the pathname to be mounted on top of @code{$@{fs@}}.
-@end table
-
-Usually, the FTP server runs in a chroot-ed environment, for security
-reasons. In this example, lofs is used to provide a subdirectory within
-a user's home directory, also available for public ftp.
-
-@example
-lofs type:=lofs;rfs:=/home/ezk/myftpdir;fs:=/usr/ftp/pub/ezk
-@end example
-
-@c ----------------------------------------------------------------
-@node Memory/RAM Filesystem, Null Filesystem, Loopback Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Memory/RAM Filesystem (@samp{mfs})
-@cindex Memory/RAM Filesystem
-@cindex mfs, filesystem type
-@cindex Filesystem type; mfs
-
-The @dfn{mfs} (@samp{type:=mfs}) filesystem is available in 4.4BSD,
-Linux, and other systems. It creates a filesystem in a portion of the
-system's memory, thus providing very fast file (volatile) access.
-
-XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET!
-
-@c ----------------------------------------------------------------
-@node Null Filesystem, Floppy Filesystem, Memory/RAM Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Null Filesystem (@samp{nullfs})
-@cindex Null Filesystem
-@cindex nullfs, filesystem type
-@cindex Filesystem type; nullfs
-
-The @dfn{nullfs} (@samp{type:=nullfs}) filesystem is available from 4.4BSD,
-and is very similar to the loopback filesystem, @dfn{lofs}.
-
-XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET!
-
-@c ----------------------------------------------------------------
-@node Floppy Filesystem, Translucent Filesystem, Null Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Floppy Filesystem (@samp{pcfs})
-@cindex Floppy Filesystem
-@cindex pcfs, filesystem type
-@cindex Filesystem type; pcfs
-
-The @dfn{pcfs} (@samp{type:=pcfs}) filesystem mounts a floppy previously
-formatted for the MS-DOS format.
-
-@noindent
-The following option must be specified:
-
-@table @code
-@cindex dev, mount option
-@cindex Mount option; dev
-@item dev
-the block special device to be mounted.
-@end table
-
-A pcfs entry might be:
-
-@example
-pcfs os==sunos4;type:=pcfs;dev:=/dev/fd0 \
- os==sunos5;type:=pcfs;dev:=/dev/diskette
-@end example
-
-@c ----------------------------------------------------------------
-@node Translucent Filesystem, Shared Memory+Swap Filesystem, Floppy Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Translucent Filesystem (@samp{tfs})
-@cindex Translucent Filesystem
-@cindex tfs, filesystem type
-@cindex Filesystem type; tfs
-
-The @dfn{tfs} (@samp{type:=tfs}) filesystem is an older version of the
-4.4BSD @dfn{unionfs}.
-
-XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET!
-
-@c ----------------------------------------------------------------
-@node Shared Memory+Swap Filesystem, User ID Mapping Filesystem, Translucent Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Shared Memory+Swap Filesystem (@samp{tmpfs})
-@cindex Shared Memory and Swap Filesystem
-@cindex tmpfs, filesystem type
-@cindex Filesystem type; tmpfs
-
-The @dfn{tmpfs} (@samp{type:=tmpfs}) filesystem shares memory between a
-the swap device and the rest of the system. It is generally used to
-provide a fast access @file{/tmp} directory, one that uses memory that
-is otherwise unused. This filesystem is available in SunOS 4.x and 5.x.
-
-XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET!
-
-@c ----------------------------------------------------------------
-@node User ID Mapping Filesystem, Program Filesystem, Shared Memory+Swap Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section User ID Mapping Filesystem (@samp{umapfs})
-@cindex User ID Mapping Filesystem
-@cindex umapfs, filesystem type
-@cindex Filesystem type; umapfs
-
-The @dfn{umapfs} (@samp{type:=umapfs}) filesystem maps User IDs of file
-ownership, and is available from 4.4BSD.
-
-XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET!
-
-@c ----------------------------------------------------------------
-@node Program Filesystem, Symbolic Link Filesystem, User ID Mapping Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Program Filesystem (@samp{program})
-@cindex Program filesystem
-@cindex Mount a filesystem under program control
-@cindex program, filesystem type
-@cindex Filesystem type; program
-
-The @dfn{program} (@samp{type:=program}) filesystem type allows a
-program to be run whenever a mount or unmount is required. This allows
-easy addition of support for other filesystem types, such as MIT's
-Remote Virtual Disk (RVD) which has a programmatic interface via the
-commands @samp{rvdmount} and @samp{rvdunmount}.
-
-@noindent
-Both of the following options must be specified:
-
-@table @code
-@cindex mount, mount option
-@cindex Mount option; mount
-@item mount
-the program which will perform the mount.
-
-@cindex unmount, mount option
-@cindex umount, mount option
-@cindex Mount option; unmount
-@cindex Mount option; umount
-@item unmount
-@item umount
-the program which will perform the unmount. For convenience, you may
-use either @samp{unmount} or @samp{umount} but not both. If neither
-is defined, @i{Amd} will default to @samp{umount $@{fs@}} (the actual
-unmount program pathname will be automatically determined at the time
-GNU @code{configure} runs.)
-@end table
-
-The exit code from these two programs is interpreted as a Unix error
-code. As usual, exit code zero indicates success. To execute the
-program, @i{Amd} splits the string on whitespace to create an array of
-substrings. Single quotes @samp{'} can be used to quote whitespace
-if that is required in an argument. There is no way to escape or change
-the single quote character.
-
-To run e.g. the program @samp{rvdmount} with a host name and filesystem as
-arguments, it would be specified by
-@samp{fs:=$@{autodir@}$@{path@};type:=program;mount:="/etc/rvdmount
-rvdmount fserver $@{fs@}";unmount:="/etc/rdvumount rvdumount $@{fs@}"}.
-
-The first element in the array is taken as the pathname of the program
-to execute. The other members of the array form the argument vector
-to be passed to the program, @dfn{including argument zero}. The array
-is exactly the same as the array passed to the execv() system call
-(man execv for details). The split string must have at least two
-elements. The programs are directly executed by @i{Amd}, not via a
-shell. Therefore, if a script is to be used as a mount/umount
-program, it @dfn{must} begin with a @code{#!} interpreter specification.
-
-Often, this program mount type is used for Samba mounts, where you
-need a double slash in pathnames. However, @i{Amd} normalizes
-sequences of slashes into one slash. Therefore, you must use an
-escaped slash, preceded by an escaped backslash. So to get a double
-slash in the mount command, you need the eight character sequence
-@samp{\\\/\\\/} in your map. For example:
-
-@samp{mount="/sbin/mount mount -r -t smbfs -o-N,-Ihostname \\\/\\\/guest@@venus/mp3"}
-
-If a filesystem type is to be heavily used, it may be worthwhile adding
-a new filesystem type into @i{Amd}, but for most uses the program
-filesystem should suffice.
-
-When the program is run, standard input and standard error are inherited
-from the current values used by @i{Amd}. Standard output is a
-duplicate of standard error. The value specified with the @code{-l}
-command line option has no effect on standard error.
-
-@i{Amd} guarantees that the mountpoint will be created before calling
-the mount program, and that it will be removed after the umount
-program returns success.
-
-@c ----------------------------------------------------------------
-@node Symbolic Link Filesystem, Symbolic Link Filesystem II, Program Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Symbolic Link Filesystem (@samp{link})
-@cindex Symbolic link filesystem
-@cindex Referencing part of the local name space
-@cindex Mounting part of the local name space
-@cindex How to reference part of the local name space
-@cindex link, filesystem type
-@cindex symlink, link filesystem type
-@cindex Filesystem type; link
-
-Each filesystem type creates a symbolic link to point from the volume
-name to the physical mount point. The @samp{link} filesystem does the
-same without any other side effects. This allows any part of the
-machines name space to be accessed via @i{Amd}.
-
-One common use for the symlink filesystem is @file{/homes} which can be
-made to contain an entry for each user which points to their
-(auto-mounted) home directory. Although this may seem rather expensive,
-it provides a great deal of administrative flexibility.
-
-@noindent
-The following option must be defined:
-
-@table @code
-@item fs
-The value of @var{fs} option specifies the destination of the link, as
-modified by the @var{sublink} option. If @var{sublink} is non-null, it
-is appended to @code{$@{fs@}}@code{/} and the resulting string is used
-as the target.
-@end table
-
-The @samp{link} filesystem can be thought of as identical to the
-@samp{ufs} filesystem but without actually mounting anything.
-
-An example entry might be:
-
-@example
-jsp host==charm;type:=link;fs:=/home/charm;sublink:=jsp
-@end example
-which would return a symbolic link pointing to @file{/home/charm/jsp}.
-
-@c ----------------------------------------------------------------
-@node Symbolic Link Filesystem II, NFS-Link Filesystem, Symbolic Link Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Symbolic Link Filesystem II (@samp{linkx})
-@cindex Symbolic link filesystem II
-@cindex Referencing an existing part of the local name space
-@cindex Mounting an existing part of the local name space
-@cindex How to reference an existing part of the local name space
-@cindex linkx, filesystem type
-@cindex symlink, linkx filesystem type
-@cindex Filesystem type; linkx
-
-The @dfn{linkx} (@samp{type:=linkx}) filesystem type is identical to @samp{link} with the
-exception that the target of the link must exist. Existence is checked
-with the @b{lstat}(2) system call.
-
-The @samp{linkx} filesystem type is particularly useful for wildcard map
-entries. In this case, a list of possible targets can be given and
-@i{Amd} will choose the first one which exists on the local machine.
-
-@c ----------------------------------------------------------------
-@node NFS-Link Filesystem, Automount Filesystem, Symbolic Link Filesystem II, Filesystem Types
-@comment node-name, next, previous, up
-@section NFS-Link Filesystem (@samp{nfsl})
-@cindex NFS-Link filesystem II
-@cindex Referencing an existing part of the name space if target exists
-@cindex Mounting a remote part of the name space if target is missing
-@cindex Symlink if target exists, NFS otherwise
-@cindex nfsl, filesystem type
-@cindex symlink, nfsl filesystem type
-@cindex Filesystem type; nfsl
-
-The @dfn{nfsl} (@samp{type:=nfsl}) filesystem type is a combination of two others:
-@samp{link} and @samp{nfs}. If the local host name is equal to the
-value of @code{$@{rhost@}} @emph{and} the target pathname listed in
-@code{$@{fs@}} exists, @samp{nfsl} will behave exactly as
-@samp{type:=link}, and refer to the target as a symbolic link. If the
-local host name is not equal to the value of @code{$@{rhost@}}, or if
-the target of the link does not exist, @i{Amd} will treat it as
-@samp{type:=nfs}, and will mount a remote pathname for it.
-
-The @samp{nfsl} filesystem type is particularly useful as a shorthand
-for the more cumbersome and yet one of the most popular @i{Amd}
-entries. For example, you can simplify all map entries that look like:
-
-@example
-zing -fs:=/n/shekel/u/zing \
- host!=shekel;type:=nfs;rhost:=shekel;rfs:=$@{fs@} \
- host==shekel;type:=link
-@end example
-
-or
-
-@example
-zing -fs:=/n/shekel/u/zing \
- exists($@{fs@});type:=link \
- !exists($@{fs@});type:=nfs;rhost:=shekel;rfs:=$@{fs@}
-@end example
-
-into a shorter form
-
-@example
-zing type:=nfsl;fs:=/n/shekel/u/zing;rhost:=shekel;rfs:=$@{fs@}
-@end example
-
-Not just does it make the maps smaller and simpler, but it avoids
-possible mistakes that often happen when forgetting to set up the two
-entries (one for @samp{type:=nfs} and the other for @samp{type:=link})
-necessary to perform transparent mounts of existing or remote mounts.
-
-@c ----------------------------------------------------------------
-@node Automount Filesystem, Direct Automount Filesystem, NFS-Link Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Automount Filesystem (@samp{auto})
-@cindex Automount filesystem
-@cindex Map cache types
-@cindex Setting map cache parameters
-@cindex How to set map cache parameters
-@cindex How to start an indirect automount point
-@cindex auto, filesystem type
-@cindex Filesystem type; auto
-@cindex SIGHUP signal
-@cindex Map cache synchronizing
-@cindex Synchronizing the map cache
-@cindex Map cache options
-@cindex Regular expressions in maps
-
-The @dfn{auto} (@samp{type:=auto}) filesystem type creates a new automount point below an
-existing automount point. Top-level automount points appear as system
-mount points. An automount mount point can also appear as a
-sub-directory of an existing automount point. This allows some
-additional structure to be added, for example to mimic the mount tree of
-another machine.
-
-The following options may be specified:
-
-@table @code
-@cindex cache, mount map option
-@cindex Mount map option; cache
-@item cache
-specifies whether the data in this mount-map should be
-cached. The default value is @samp{none}, in which case
-no caching is done in order to conserve memory.
-
-However, better performance and reliability can be obtained by caching
-some or all of a mount-map.
-
-If the cache option specifies @samp{all},
-the entire map is enumerated when the mount point is created.
-
-If the cache option specifies @samp{inc}, caching is done incrementally
-as and when data is required.
-Some map types do not support cache mode @samp{all}, in which case @samp{inc}
-is used whenever @samp{all} is requested.
-
-Caching can be entirely disabled by using cache mode @samp{none}.
-
-If the cache option specifies @samp{regexp} then the entire map will be
-enumerated and each key will be treated as an egrep-style regular
-expression. The order in which a cached map is searched does not
-correspond to the ordering in the source map so the regular expressions
-should be mutually exclusive to avoid confusion.
-
-Each mount map type has a default cache type, usually @samp{inc}, which
-can be selected by specifying @samp{mapdefault}.
-
-The cache mode for a mount map can only be selected on the command line.
-Starting @i{Amd} with the command:
-
-@example
-amd /homes hesiod.homes -cache:=inc
-@end example
-
-will cause @samp{/homes} to be automounted using the @dfn{Hesiod} name
-server with local incremental caching of all successfully resolved names.
-
-All cached data is forgotten whenever @i{Amd} receives a @samp{SIGHUP}
-signal and, if cache @samp{all} mode was selected, the cache will be
-reloaded. This can be used to inform @i{Amd} that a map has been
-updated. In addition, whenever a cache lookup fails and @i{Amd} needs
-to examine a map, the map's modify time is examined. If the cache is
-out of date with respect to the map then it is flushed as if a
-@samp{SIGHUP} had been received.
-
-An additional option (@samp{sync}) may be specified to force @i{Amd} to
-check the map's modify time whenever a cached entry is being used. For
-example, an incremental, synchronized cache would be created by the
-following command:
-
-@example
-amd /homes hesiod.homes -cache:=inc,sync
-@end example
-
-@item fs
-specifies the name of the mount map to use for the new mount point.
-
-Arguably this should have been specified with the @code{$@{rfs@}} option but
-we are now stuck with it due to historical accident.
-
-@c %If the string @samp{.} is used then the same map is used;
-@c %in addition the lookup prefix is set to the name of the mount point followed
-@c %by a slash @samp{/}.
-@c %This is the same as specifying @samp{fs:=\$@{map@};pref:=\$@{key@}/}.
-@c
-
-@item pref
-alters the name that is looked up in the mount map. If
-@code{$@{pref@}}, the @dfn{prefix}, is non-null then it is prepended
-to the name requested by the kernel @dfn{before} the map is
-searched. The default prefix is the prefix of the parent map (if any)
-with name of the auto node appended to it. That means if you want no
-prefix you must say so in the map: @samp{pref:=null}.
-
-@item opts
-Normally, @samp{auto} style maps are not browsable even if you turn on
-directory browsability (@pxref{browsable_dirs Parameter}). To enable
-browsing entries in @samp{auto} maps, specify @samp{opts:=browsable}
-or @samp{opts:=fullybrowsable} in
-the description of this map.
-
-@end table
-
-The server @samp{dylan.doc.ic.ac.uk} has two user disks:
-@samp{/dev/dsk/2s0} and @samp{/dev/dsk/5s0}. These are accessed as
-@samp{/home/dylan/dk2} and @samp{/home/dylan/dk5} respectively. Since
-@samp{/home} is already an automount point, this naming is achieved with
-the following map entries:@refill
-
-@example
-dylan type:=auto;fs:=$@{map@};pref:=$@{key@}/
-dylan/dk2 type:=ufs;dev:=/dev/dsk/2s0
-dylan/dk5 type:=ufs;dev:=/dev/dsk/5s0
-@end example
-
-@c ----------------------------------------------------------------
-@node Direct Automount Filesystem, Union Filesystem, Automount Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Direct Automount Filesystem (@samp{direct})
-@cindex Direct automount filesystem
-@cindex How to start a direct automount point
-@cindex direct, filesystem type
-@cindex Filesystem type; direct
-
-The @dfn{direct} (@samp{type:=direct}) filesystem is almost identical to
-the automount filesystem. Instead of appearing to be a directory of
-mount points, it appears as a symbolic link to a mounted filesystem.
-The mount is done at the time the link is accessed. @xref{Automount
-Filesystem}, for a list of required options.
-
-Direct automount points are created by specifying the @samp{direct}
-filesystem type on the command line:
-
-@example
-amd ... /usr/man auto.direct -type:=direct
-@end example
-
-where @samp{auto.direct} would contain an entry such as:
-
-@example
-usr/man -type:=nfs;rfs:=/usr/man \
- rhost:=man-server1 rhost:=man-server2
-@end example
-
-In this example, @samp{man-server1} and @samp{man-server2} are file
-servers which export copies of the manual pages. Note that the key
-which is looked up is the name of the automount point without the
-leading @samp{/}.
-
-Note that the implementation of the traditional @dfn{direct} filesystem is
-essentially a hack (pretending that the root of an NFS filesystem is a
-symlink) and many modern operating systems get very unhappy about
-it. For example, Linux kernel 2.4+ completely disallows it, and Solaris
-2.8 fails to unmount it when @i{Amd} shuts down. Therefore, the use of
-the traditional @dfn{direct} filesystem is strongly discouraged; it is
-only semi-supported, at best.
-
-The autofs implementations that permit direct mounts are fully
-supported, however. That currently includes all versions of
-Solaris. Linux autofs does NOT support direct mounts at all.
-
-@c ----------------------------------------------------------------
-@node Union Filesystem, Error Filesystem, Direct Automount Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Union Filesystem (@samp{union})
-@cindex Union filesystem
-@cindex union, filesystem type
-@cindex Filesystem type; union
-
-The @dfn{union} (@samp{type:=union}) filesystem type allows the contents of several
-directories to be merged and made visible in a single directory. This
-can be used to overcome one of the major limitations of the Unix mount
-mechanism which only allows complete directories to be mounted.
-
-For example, supposing @file{/tmp} and @file{/var/tmp} were to be merged
-into a new directory called @file{/mtmp}, with files in @file{/var/tmp}
-taking precedence. The following command could be used to achieve this
-effect:
-
-@example
-amd ... /mtmp union:/tmp:/var/tmp -type:=union
-@end example
-
-Currently, the unioned directories must @emph{not} be automounted. That
-would cause a deadlock. This seriously limits the current usefulness of
-this filesystem type and the problem will be addressed in a future
-release of @i{Amd}.
-
-Files created in the union directory are actually created in the last
-named directory. This is done by creating a wildcard entry which points
-to the correct directory. The wildcard entry is visible if the union
-directory is listed, so allowing you to see which directory has
-priority.
-
-The files visible in the union directory are computed at the time
-@i{Amd} is started, and are not kept up-to-date with respect to the
-underlying directories. Similarly, if a link is removed, for example
-with the @samp{rm} command, it will be lost forever.
-
-@c ----------------------------------------------------------------
-@node Error Filesystem, Top-level Filesystem, Union Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Error Filesystem (@samp{error})
-@cindex Error filesystem
-@cindex error, filesystem type
-@cindex Filesystem type; error
-
-The @dfn{error} (@samp{type:=error}) filesystem type is used internally as a catch-all in the
-case where none of the other filesystems was selected, or some other
-error occurred. Lookups and mounts always fail with ``No such file or
-directory''. All other operations trivially succeed.
-
-The error filesystem is not directly accessible.
-
-@c ----------------------------------------------------------------
-@node Top-level Filesystem, Root Filesystem, Error Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Top-level Filesystem (@samp{toplvl})
-@cindex Top level filesystem
-@cindex toplvl, filesystem type
-@cindex Filesystem type; toplvl
-
-The @dfn{toplvl} (@samp{type:=toplvl}) filesystems is derived from the @samp{auto} filesystem
-and is used to mount the top-level automount nodes. Requests of this
-type are automatically generated from the command line arguments.
-
-@c ----------------------------------------------------------------
-@node Root Filesystem, Inheritance Filesystem, Top-level Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Root Filesystem (@samp{root})
-@cindex Root filesystem
-@cindex root, filesystem type
-@cindex Filesystem type; root
-
-The @dfn{root} (@samp{type:=root}) filesystem type acts as an internal
-placeholder onto which @i{Amd} can pin @samp{toplvl} mounts. Only one
-node of this type need ever exist and one is created automatically
-during startup. The effect of having more than one root node is
-undefined.
-
-The root filesystem is not directly accessible.
-
-@c ----------------------------------------------------------------
-@node Inheritance Filesystem, , Root Filesystem, Filesystem Types
-@comment node-name, next, previous, up
-@section Inheritance Filesystem (@samp{inherit})
-@cindex Inheritance filesystem
-@cindex Nodes generated on a restart
-@cindex inherit, filesystem type
-@cindex Filesystem type; inherit
-
-The @dfn{inheritance} (@samp{type:=inherit}) filesystem is not directly
-accessible. Instead, internal mount nodes of this type are
-automatically generated when @i{Amd} is started with the @code{-r} option.
-At this time the system mount table is scanned to locate any filesystems
-which are already mounted. If any reference to these filesystems is
-made through @i{Amd} then instead of attempting to mount it, @i{Amd}
-simulates the mount and @dfn{inherits} the filesystem. This allows a
-new version of @i{Amd} to be installed on a live system simply by
-killing the old daemon with @samp{SIGTERM} and starting the new one.@refill
-
-This filesystem type is not generally visible externally, but it is
-possible that the output from @samp{amq -m} may list @samp{inherit} as
-the filesystem type. This happens when an inherit operation cannot
-be completed for some reason, usually because a fileserver is down.
-
-@c ################################################################
-@node Amd Configuration File, Run-time Administration, Filesystem Types, Top
-@comment node-name, next, previous, up
-@chapter Amd Configuration File
-@cindex Amd Configuration File
-@cindex amd.conf
-
-The @samp{amd.conf} file is the configuration file for @i{Amd}, as part
-of the am-utils suite. This file contains runtime configuration
-information for the @i{Amd} automounter program.
-
-@menu
-* File Format::
-* The Global Section::
-* Regular Map Sections::
-* Common Parameters::
-* Global Parameters::
-* Regular Map Parameters::
-* amd.conf Examples::
-@end menu
-
-@c ================================================================
-@node File Format, The Global Section, Amd Configuration File, Amd Configuration File
-@comment node-name, next, previous, up
-@section File Format
-@cindex amd.conf file format
-
-The @samp{amd.conf} file consists of sections and parameters. A section
-begins with the name of the section in square brackets @samp{[]} and
-continues until the next section begins or the end of the file is reached.
-Sections contain parameters of the form @samp{name = value}.
-
-The file is line-based --- that is, each newline-terminated line
-represents either a comment, a section name or a parameter. No
-line-continuation syntax is available.
-
-Section names, parameter names and their values are case sensitive.
-
-Only the first equals sign in a parameter is significant. Whitespace
-before or after the first equals sign is discarded. Leading, trailing
-and internal whitespace in section and parameter names is irrelevant.
-Leading and trailing whitespace in a parameter value is discarded.
-Internal whitespace within a parameter value is not allowed, unless the
-whole parameter value is quoted with double quotes as in @samp{name =
-"some value"}.
-
-Any line beginning with a pound sign @samp{#} is ignored, as are lines
-containing only whitespace.
-
-The values following the equals sign in parameters are all either a
-string (no quotes needed if string does not include spaces) or a
-boolean, which may be given as @samp{yes}/@samp{no}. Case is significant in all
-values. Some items such as cache timeouts are numeric.
-
-@c ================================================================
-@node The Global Section, Regular Map Sections, File Format, Amd Configuration File
-@comment node-name, next, previous, up
-@section The Global Section
-@cindex amd.conf global section
-
-The global section must be specified as @samp{[global]}. Parameters in
-this section either apply to @i{Amd} as a whole, or to all other regular map
-sections which follow. There should be only one global section defined
-in one configuration file.
-
-It is highly recommended that this section be specified first in the
-configuration file. If it is not, then regular map sections which
-precede it will not use global values defined later.
-
-@c ================================================================
-@node Regular Map Sections, Common Parameters, The Global Section, Amd Configuration File
-@comment node-name, next, previous, up
-@section Regular Map Sections
-@cindex amd.conf regular map sections
-
-Parameters in regular (non-global) sections apply to a single map entry.
-For example, if the map section @samp{[/homes]} is defined, then all
-parameters following it will be applied to the @file{/homes}
-@i{Amd}-managed mount point.
-
-@c ================================================================
-@node Common Parameters, Global Parameters, Regular Map Sections, Amd Configuration File
-@comment node-name, next, previous, up
-@section Common Parameters
-@cindex amd.conf common parameters
-
-These parameters can be specified either in the global or a map-specific
-section. Entries specified in a map-specific section override the default
-value or one defined in the global section. If such a common parameter is
-specified only in the global section, it is applicable to all regular map
-sections that follow.
-
-@menu
-* autofs_use_lofs Parameter::
-* browsable_dirs Parameter::
-* map_defaults Parameter::
-* map_options Parameter::
-* map_type Parameter::
-* mount_type Parameter::
-* search_path Parameter::
-* selectors_in_defaults Parameter::
-@end menu
-
-@c ----------------------------------------------------------------
-@node autofs_use_lofs Parameter, browsable_dirs Parameter, Common Parameters, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{autofs_use_lofs} Parameter
-@cindex autofs_use_lofs Parameter
-
-(type=string, default=@samp{yes}).
-When set to @samp{yes}, @i{Amd}'s autofs code will use lofs-type
-(loopback) mounts for @code{type:=link} mounts, as well as several
-other cases that require local references. This has the advantage
-that @i{Amd} does not use a secondary mount point and users do not see
-external pathnames (the infamous @code{/bin/pwd} problem, where it
-reports a different path than the user chdir'ed into). One of the
-disadvantages of using this option is that the autofs code is
-relatively new and the in-place mounts have not been throughly tested.
-
-If this option is set to @samp{no}, then @i{Amd}'s autofs code will
-use symlinks instead of lofs-type mounts for local references. This
-has the advantage of using simpler (more stable) code, but at the
-expense of negating one of autofs's big advantages: the hiding of
-@i{Amd}'s internal paths. Note that symlinks are not supported in all
-autofs implementations, especially those derived from Solaris Autofs
-v1. Also, on Solaris 2.6 and newer, autofs symlinks are not cached,
-resulting in repeated up-call requests to @i{Amd}.
-
-@c ----------------------------------------------------------------
-@node browsable_dirs Parameter, map_defaults Parameter, autofs_use_lofs Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{browsable_dirs} Parameter
-@cindex browsable_dirs Parameter
-
-(type=string, default=@samp{no}). If @samp{yes}, then @i{Amd}'s top-level
-mount points will be browsable to @b{readdir}(3) calls. This means you
-could run for example @b{ls}(1) and see what keys are available to mount
-in that directory. Not all entries are made visible to @b{readdir}(3):
-the @samp{/defaults} entry, wildcard entries, and those with a @file{/}
-in them are not included. If you specify @samp{full} to this option,
-all but the @samp{/defaults} entry will be visible. Note that if you run
-a command which will attempt to @b{stat}(2) the entries, such as often
-done by @samp{ls -l} or @samp{ls -F}, @i{Amd} will attempt to mount
-@i{every} entry in that map. This is often called a ``mount storm''.
-
-Note that mount storms are mostly avoided by using autofs mounts
-(@samp{mount_type = autofs}).
-
-@c ----------------------------------------------------------------
-@node map_defaults Parameter, map_options Parameter, browsable_dirs Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{map_defaults} Parameter
-@cindex map_defaults Parameter
-
-(type=string, default to empty). This option sets a string to be used
-as the map's @code{/defaults} entry, overriding any @code{/defaults}
-specified in the map. This allows local users to override a given
-map's defaults without modifying maps globally (which is impossible in
-sites where the maps are managed by a different administrative group).
-
-@c ----------------------------------------------------------------
-@node map_options Parameter, map_type Parameter, map_defaults Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{map_options} Parameter
-@cindex map_options Parameter
-
-(type=string, default no options). This option is the same as
-specifying map options on the command line to @i{Amd}, such as
-@samp{cache:=all}.
-
-@c ----------------------------------------------------------------
-@node map_type Parameter, mount_type Parameter, map_options Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{map_type} Parameter
-@cindex map_type Parameter
-
-(type=string, default search all map types). If specified, @i{Amd} will
-initialize the map only for the type given. This is useful to avoid the
-default map search type used by @i{Amd} which takes longer and can have
-undesired side-effects such as initializing NIS even if not used.
-Possible values are
-
-@table @samp
-@item file
-plain files
-@item hesiod
-Hesiod name service from MIT
-@item ldap
-Lightweight Directory Access Protocol
-@item ndbm
-(New) dbm style hash files
-@item nis
-Network Information Services (version 2)
-@item nisplus
-Network Information Services Plus (version 3)
-@item passwd
-local password files
-@item union
-union maps
-@end table
-
-@c ----------------------------------------------------------------
-@node mount_type Parameter, search_path Parameter, map_type Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{mount_type} Parameter
-@cindex mount_type Parameter
-
-(type=string, default=@samp{nfs}). All @i{Amd} mount types default to NFS.
-That is, @i{Amd} is an NFS server on the map mount points, for the local
-host it is running on. If @samp{autofs} is specified, @i{Amd} will be
-an autofs server for those mount points.
-
-@c ----------------------------------------------------------------
-@node search_path Parameter, selectors_in_defaults Parameter, mount_type Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{search_path} Parameter
-@cindex search_path Parameter
-
-(type=string, default no search path). This provides a
-(colon-delimited) search path for file maps. Using a search path,
-sites can allow for local map customizations and overrides, and can
-distributed maps in several locations as needed.
-
-@c ----------------------------------------------------------------
-@node selectors_in_defaults Parameter, , search_path Parameter, Common Parameters
-@comment node-name, next, previous, up
-@subsection @t{selectors_in_defaults} Parameter
-@cindex selectors_in_defaults Parameter
-
-(type=boolean, default=@samp{no}). If @samp{yes}, then the
-@samp{/defaults} entry of maps will search for and process any
-selectors before setting defaults for all other keys in that map.
-Useful when you want to set different options for a complete map based
-on some parameters. For example, you may want to better the NFS
-performance over slow slip-based networks as follows:
-
-@example
-/defaults \
- wire==slip-net;opts:=intr,rsize=1024,wsize=1024 \
- wire!=slip-net;opts:=intr,rsize=8192,wsize=8192
-@end example
-
-Deprecated form: selectors_on_default.
-
-
-@c ================================================================
-@node Global Parameters, Regular Map Parameters, Common Parameters, Amd Configuration File
-@comment node-name, next, previous, up
-@section Global Parameters
-@cindex amd.conf global parameters
-
-The following parameters are applicable to the @samp{[global]} section only.
-
-@menu
-* arch Parameter::
-* auto_attrcache Parameter::
-* auto_dir Parameter::
-* cache_duration Parameter::
-* cluster Parameter::
-* debug_mtab_file Parameter::
-* debug_options Parameter::
-* dismount_interval Parameter::
-* domain_strip Parameter::
-* exec_map_timeout Parameter::
-* forced_unmounts Parameter::
-* full_os Parameter::
-* fully_qualified_hosts Parameter::
-* hesiod_base Parameter::
-* karch Parameter::
-* ldap_base Parameter::
-* ldap_cache_maxmem Parameter::
-* ldap_cache_seconds Parameter::
-* ldap_hostports Parameter::
-* ldap_proto_version Parameter::
-* local_domain Parameter::
-* localhost_address Parameter::
-* log_file Parameter::
-* log_options Parameter::
-* map_reload_interval Parameter::
-* nfs_allow_any_interface Parameter::
-* nfs_allow_insecure_port Parameter::
-* nfs_proto Parameter::
-* nfs_retransmit_counter Parameter::
-* nfs_retransmit_counter_udp Parameter::
-* nfs_retransmit_counter_tcp Parameter::
-* nfs_retransmit_counter_toplvl Parameter::
-* nfs_retry_interval Parameter::
-* nfs_retry_interval_udp Parameter::
-* nfs_retry_interval_tcp Parameter::
-* nfs_retry_interval_toplvl Parameter::
-* nfs_vers Parameter::
-* nis_domain Parameter::
-* normalize_hostnames Parameter::
-* normalize_slashes Parameter::
-* os Parameter::
-* osver Parameter::
-* pid_file Parameter::
-* plock Parameter::
-* portmap_program Parameter::
-* preferred_amq_port Parameter::
-* print_pid Parameter::
-* print_version Parameter::
-* restart_mounts Parameter::
-* show_statfs_entries Parameter::
-* truncate_log Parameter::
-* unmount_on_exit Parameter::
-* use_tcpwrappers Parameter::
-* vendor Parameter::
-@end menu
-
-@c ----------------------------------------------------------------
-@node arch Parameter, auto_attrcache Parameter, Global Parameters, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{arch} Parameter
-@cindex arch Parameter
-
-(type=string, default to compiled in value). Same as the @code{-A}
-option to @i{Amd}. Allows you to override the value of the @i{arch}
-@i{Amd} variable.
-
-@c ----------------------------------------------------------------
-@node auto_attrcache Parameter, auto_dir Parameter, arch Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{auto_attrcache} Parameter
-@cindex auto_attrcache Parameter
-
-(type=numeric, default=0). Specify in seconds (or units of 0.1
-seconds, depending on the OS), what is the (kernel-side) NFS attribute
-cache timeout for @i{Amd}'s own automount points. A value of 0 is
-supposed to turn off attribute caching, meaning that @i{Amd} will be
-consulted via a kernel-RPC each time someone stat()'s the mount point
-(which could be abused as a denial-of-service attack).
-
-@emph{WARNING}: @i{Amd} depends on being able to turn off the NFS
-attribute cache of the client OS. If it cannot be turned off, then
-users may get ESTALE errors or symlinks that point to the wrong
-places. This is more likely under heavy use of @i{Amd}, for example
-if your system is experiencing frequent map changes or frequent
-mounts/unmounts. Therefore, under normal circumstances, this
-parameter should remain set to 0, to ensure that the attribute cache
-is indeed off.
-
-Unfortunately, some kernels (e.g., certain BSDs) don't have a way to
-turn off the NFS attribute cache. Setting this parameter to 0 is
-supposed to turn off attribute caching entirely, but unfortunately it
-does not; instead, the attribute cache is set to some internal
-hard-coded default (usually anywhere from 5-30 seconds). If you
-suspect that your OS doesn't have a reliable way of turning off the
-attribute cache, then it is better to set this parameter to the
-smallest possible non-zero value (set @samp{auto_attrcache=1} in your
-@code{amd.conf}). This will not eliminate the problem, but reduce the
-risk window somewhat. The best solutions are (1) to use @i{Amd} in
-Autofs mode, if it's supported in your OS, and (2) talk to your OS
-vendor to support a true @samp{noac} flag. See the
-@uref{http://www.am-utils.org/docs/am-utils/attrcache.txt,README.attrcache}
-document for more details.
-
-If you are able to turn off the attribute cache on your OS, alas,
-@i{Amd}'s performance may degrade (when not using Autofs) because
-every traversal of an automounter-controlled pathname will result in a
-lookup request from the kernel to @i{Amd}. Under heavy loads, for
-example when using recursive tools like @samp{find}, @samp{rdist}, or
-@samp{rsync}, this performance degradation can be noticeable. There
-are two possible solutions that some administrators have chosen to
-improve performance:
-
-@enumerate
-
-@item
-First, you can turn off unmounting using the @samp{nounmount} mount
-option. This will ensure that no @i{Amd} symlink could ever change,
-thereby the kernel's attribute cache and @i{Amd} will always be in
-sync. However, this method will cause the number of mounts to keep
-growing, even if some are no longer in use; this has the disadvantage
-that your system could be more susceptible to hangs if even one of
-those accumulating mounts hangs due to a downed server.
-
-@item
-Second, you can turn on attribute caching carefully by setting a small
-automounter attribute cache value (say, one second), and a relatively
-large dismount interval (say, one hour). (@xref{dismount_interval
-Parameter}.) For example, you can set this in your @code{amd.conf}:
-
-@example
-[global]
-auto_attrcache = 1
-dismount_interval = 3600
-@end example
-
-This has the benefit of using the kernel's attribute cache and thus
-improving performance. The disadvantage with this option is that the
-window of vulnerability is not eliminated entirely: it is only made
-smaller.
-
-@end enumerate
-
-@c ----------------------------------------------------------------
-@node auto_dir Parameter, cache_duration Parameter, auto_attrcache Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{auto_dir} Parameter
-@cindex auto_dir Parameter
-
-(type=string, default=@samp{/a}). Same as the @code{-a} option to @i{Amd}.
-This sets the private directory where @i{Amd} will create
-sub-directories for its real mount points.
-
-@c ----------------------------------------------------------------
-@node cache_duration Parameter, cluster Parameter, auto_dir Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{cache_duration} Parameter
-@cindex cache_duration Parameter
-
-(type=numeric, default=300). Same as the @code{-c} option to @i{Amd}.
-Sets the duration in seconds that looked-up or mounted map entries
-remain in the cache.
-
-@c ----------------------------------------------------------------
-@node cluster Parameter, debug_mtab_file Parameter, cache_duration Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{cluster} Parameter
-@cindex cluster Parameter
-
-(type=string, default no cluster). Same as the @code{-C} option to
-@i{Amd}. Specifies the alternate HP-UX cluster to use.
-
-@c ----------------------------------------------------------------
-@node debug_mtab_file Parameter, debug_options Parameter, cluster Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{debug_mtab_file} Parameter
-@cindex debug_mtab_file Parameter
-
-(type=string, default="/tmp/mnttab"). Path to mtab file that is used
-by @i{Amd} to store a list of mounted file systems during debug-mtab mode.
-This option only applies to systems that store mtab information on disk.
-
-@c ----------------------------------------------------------------
-@node debug_options Parameter, dismount_interval Parameter, debug_mtab_file Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{debug_options} Parameter
-@cindex debug_options Parameter
-
-(type=string, default no debug options). Same as the @code{-D} option
-to @i{Amd}. Specify any debugging options for @i{Amd}. Works only if
-am-utils was configured for debugging using the @code{--enable-debug}
-option. The additional @samp{mem} option can be turned on via
-@code{--enable-debug=mem}. Otherwise debugging options are ignored.
-Options are comma delimited, and can be preceded by the string
-@samp{no} to negate their meaning. You can get the list of supported
-debugging and logging options by running @code{amd -H}. Possible
-values those listed for the -D option. @xref{-D Option}.
-
-@c ----------------------------------------------------------------
-@node dismount_interval Parameter, domain_strip Parameter, debug_options Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{dismount_interval} Parameter
-@cindex dismount_interval Parameter
-
-(type=numeric, default=120). Same as the @code{-w} option to
-@i{Amd}. Specify in seconds, the time between attempts to dismount file
-systems that have exceeded their cached times.
-
-@c ----------------------------------------------------------------
-@node domain_strip Parameter, exec_map_timeout Parameter, dismount_interval Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{domain_strip} Parameter
-@cindex domain_strip Parameter
-
-(type=boolean, default=@samp{yes}). If @samp{yes}, then the domain
-name part referred to by @code{$@{rhost@}} is stripped off. This is
-useful to keep logs and smaller. If @samp{no}, then the domain name
-part is left changed. This is useful when using multiple domains with
-the same maps (as you may have hosts whose domain-stripped name is
-identical).
-
-@c ----------------------------------------------------------------
-@node exec_map_timeout Parameter, forced_unmounts Parameter, domain_strip Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{exec_map_timeout} Parameter
-@cindex exec_map_timeout Parameter
-
-(type=numeric, default=10). The timeout in seconds that @i{Amd} will
-wait for an executable map program before an answer is returned from
-that program (or script). This value should be set to as small as
-possible while still allowing normal replies to be returned before the
-timer expires, because during the time that the executable map program
-is queried, @i{Amd} is essentially waiting and is thus not responding
-to any other queries. @xref{Executable maps}.
-
-@c ----------------------------------------------------------------
-@node forced_unmounts Parameter, full_os Parameter, exec_map_timeout Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{forced_unmounts} Parameter
-@cindex forced_unmounts Parameter
-
-(type=boolean, default=@samp{no}).
-Sometimes, mount points are hung due to unrecoverable conditions, such
-as when NFS servers migrate, change their IP address, are down
-permanently, or due to hardware failures, and more. In this case,
-attempting to unmount an existing mount point, or even just to
-@b{stat}(2) it, results in one of three fatal errors: EIO, ESTALE, or
-EBUSY. At that point, @i{Amd} can do little to recover that hung
-point (in fact, the OS cannot automatically recover either). For that
-reason, some OSs support special kinds of forced unmounts, which must
-be used very carefully: they will force an unmount immediately (or
-lazily on Linux), which could result in application data loss.
-However, that may be the only way to recover the entire host (without
-rebooting). Once a hung mount point is forced out, @i{Amd} can then
-re-mount a replacement one (if available), bringing a mostly-hung
-system back to operation and avoiding a potentially costly reboot.
-
-If the @samp{forced_unmounts} option is set to @samp{yes}, and the
-client OS supports forced or lazy unmounts, then @i{Amd} will attempt
-to use them if it gets any of the three serious error conditions
-listed above. Note that @i{Amd} will force the unmount of mount
-points that returned EBUSY only for @samp{type:=toplvl} mounts
-(@pxref{Top-level Filesystem}): that is, @i{Amd}'s own mount points.
-This is useful to recover from a previously hung @i{Amd}, and to
-ensure that an existing @i{Amd} can shutdown cleanly even if some
-processes are keeping its mount points busy (i.e., when a user's shell
-process uses @code{cd} to set its CWD to @i{Amd}'s own mount point).
-
-If this option is set to @samp{no} (the default), then @i{Amd} will
-not attempt this special recovery procedure.
-
-@c ----------------------------------------------------------------
-@node full_os Parameter, fully_qualified_hosts Parameter, forced_unmounts Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{full_os} Parameter
-@cindex full_os Parameter
-
-(type=string, default to compiled in value). The full name of the
-operating system, along with its version. Allows you to override the
-compiled-in full name and version of the operating system. Useful when
-the compiled-in name is not desired. For example, the full operating
-system name on linux comes up as @samp{linux}, but you can override it
-to @samp{linux-2.2.5}.
-
-@c ----------------------------------------------------------------
-@node fully_qualified_hosts Parameter, hesiod_base Parameter, full_os Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{fully_qualified_hosts} Parameter
-@cindex fully_qualified_hosts Parameter
-
-(type=string, default=@samp{no}). If @samp{yes}, @i{Amd} will perform RPC
-authentication using fully-qualified host names. This is necessary for
-some systems, and especially when performing cross-domain mounting. For
-this function to work, the @i{Amd} variable @samp{$@{hostd@}} is used,
-requiring that @samp{$@{domain@}} not be null.
-
-@c ----------------------------------------------------------------
-@node hesiod_base Parameter, karch Parameter, fully_qualified_hosts Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{hesiod_base} Parameter
-@cindex hesiod_base Parameter
-
-(type=string, default=@samp{automount}). Specify the base name for
-hesiod maps.
-
-@c ----------------------------------------------------------------
-@node karch Parameter, ldap_base Parameter, hesiod_base Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{karch} Parameter
-@cindex karch Parameter
-
-(type=string, default to karch of the system). Same as the @code{-k}
-option to @i{Amd}. Allows you to override the kernel-architecture of
-your system. Useful for example on Sun (Sparc) machines, where you can
-build one @i{Amd} binary, and run it on multiple machines, yet you want
-each one to get the correct @i{karch} variable set (for example, sun4c,
-sun4m, sun4u, etc.) Note that if not specified, @i{Amd} will use
-@b{uname}(2) to figure out the kernel architecture of the machine.
-
-@c ----------------------------------------------------------------
-@node ldap_base Parameter, ldap_cache_maxmem Parameter, karch Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{ldap_base} Parameter
-@cindex ldap_base Parameter
-
-(type=string, default not set).
-Specify the base name for LDAP. This often includes LDAP-specific
-values such as country and organization.
-
-@c ----------------------------------------------------------------
-@node ldap_cache_maxmem Parameter, ldap_cache_seconds Parameter, ldap_base Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{ldap_cache_maxmem} Parameter
-@cindex ldap_cache_maxmem Parameter
-
-(type=numeric, default=131072). Specify the maximum memory @i{Amd}
-should use to cache LDAP entries.
-
-@c ----------------------------------------------------------------
-@node ldap_cache_seconds Parameter, ldap_hostports Parameter, ldap_cache_maxmem Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{ldap_cache_seconds} Parameter
-@cindex ldap_cache_seconds Parameter
-
-(type=numeric, default=0). Specify the number of seconds to keep
-entries in the cache.
-
-@c ----------------------------------------------------------------
-@node ldap_hostports Parameter, ldap_proto_version Parameter, ldap_cache_seconds Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{ldap_hostports} Parameter
-@cindex ldap_hostports Parameter
-
-(type=string, default not set).
-Specify the LDAP host and port values.
-
-@c ----------------------------------------------------------------
-@node ldap_proto_version Parameter, local_domain Parameter, ldap_hostports Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{ldap_proto_version} Parameter
-@cindex ldap_proto_version Parameter
-
-(type=numeric, default=2). Specify the LDAP protocol version to use.
-With a value of 3 will use LDAPv3 protocol.
-
-@c ----------------------------------------------------------------
-@node local_domain Parameter, localhost_address Parameter, ldap_proto_version Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{local_domain} Parameter
-@cindex local_domain Parameter
-
-(type=string, default no sub-domain). Same as the @code{-d} option
-to @i{Amd}. Specify the local domain name. If this option is not given
-the domain name is determined from the hostname, by removing the first
-component of the fully-qualified host name.
-
-@c ----------------------------------------------------------------
-@node localhost_address Parameter, log_file Parameter, local_domain Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{localhost_address} Parameter
-@cindex localhost_address Parameter
-
-(type=string, default to localhost or 127.0.0.1). Specify the name or
-IP address for @i{Amd} to use when connecting the sockets for the
-local NFS server and the RPC server. This defaults to 127.0.0.1 or
-whatever the host reports as its local address. This parameter is
-useful on hosts with multiple addresses where you want to force
-@i{Amd} to connect to a specific address.
-
-@c ----------------------------------------------------------------
-@node log_file Parameter, log_options Parameter, localhost_address Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{log_file} Parameter
-@cindex log_file Parameter
-
-(type=string, default=@samp{stderr}). Same as the @code{-l} option to
-@i{Amd}. Specify a file name to log @i{Amd} events to.
-If the string @samp{/dev/stderr} is specified,
-@i{Amd} will send its events to the standard error file descriptor.
-
-If the string @samp{syslog} is given, @i{Amd} will record its events
-with the system logger @b{syslogd}(8). If your system supports syslog
-facilities, then the default facility used is @samp{LOG_DAEMON}.
-
-When using syslog, if you wish to change the facility, append its name
-to the option name, delimited by a single colon. For example, if it is
-the string @samp{syslog:local7} then @i{Amd} will log messages via
-@b{syslog}(3) using the @samp{LOG_LOCAL7} facility. If the facility
-name specified is not recognized, @i{Amd} will default to @samp{LOG_DAEMON}.
-Note: while you can use any syslog facility available on your system, it
-is generally a bad idea to use those reserved for other services such as
-@samp{kern}, @samp{lpr}, @samp{cron}, etc.
-
-@c ----------------------------------------------------------------
-@node log_options Parameter, map_reload_interval Parameter, log_file Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{log_options} Parameter
-@cindex log_options Parameter
-
-(type=string, default no logging options). Same as the @code{-x}
-option to @i{Amd}. Specify any logging options for @i{Amd}. Options
-are comma delimited, and can be preceded by the string @samp{no} to
-negate their meaning. The @samp{debug} logging option is only available
-if am-utils was configured with @code{--enable-debug}. You can get the
-list of supported debugging options by running @code{amd -H}. Possible
-values are:
-
-@table @samp
-@item all
-all messages
-@item debug
-debug messages
-@item error
-non-fatal system errors
-@item fatal
-fatal errors
-@item info
-information
-@item map
-map errors
-@item stats
-additional statistical information
-@item user
-non-fatal user errors
-@item warn
-warnings
-@item warning
-warnings
-@end table
-
-@c ----------------------------------------------------------------
-@node map_reload_interval Parameter, nfs_allow_any_interface Parameter, log_options Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{map_reload_interval} Parameter
-@cindex map_reload_interval Parameter
-
-(type=numeric, default=3600). The number of seconds that @i{Amd} will
-wait before it checks to see if any maps have changed at their source
-(NIS servers, LDAP servers, files, etc.). @i{Amd} will reload only
-those maps that have changed.
-
-@c ----------------------------------------------------------------
-@node nfs_allow_any_interface Parameter, nfs_allow_insecure_port Parameter, map_reload_interval Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_allow_any_interface} Parameter
-@cindex nfs_allow_any_interface Parameter
-
-(type=string, default=@samp{no}). Normally @i{Amd} accepts local NFS
-packets only from 127.0.0.1. If this parameter is set to @samp{yes},
-then @i{amd} will accept local NFS packets from any local interface;
-this is useful on hosts that may have multiple interfaces where the
-system is forced to send all outgoing packets (even those bound to the
-same host) via an address other than 127.0.0.1.
-
-@c ----------------------------------------------------------------
-@node nfs_allow_insecure_port Parameter, nfs_proto Parameter, nfs_allow_any_interface Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_allow_insecure_port} Parameter
-@cindex nfs_allow_insecure_port Parameter
-
-(type=string, default=@samp{no}). Normally @i{Amd} will refuse requests
-coming from unprivileged ports (i.e., ports >= 1024 on Unix systems),
-so that only privileged users and the kernel can send NFS requests to
-it. However, some kernels (certain versions of Darwin, MacOS X, and
-Linux) have bugs that cause them to use unprivileged ports in certain
-situations, which causes @i{Amd} to stop dead in its tracks. This
-parameter allows @i{Amd} to operate normally even on such systems, at the
-expense of a slight decrease in the security of its operations. If
-you see messages like ``ignoring request from foo:1234, port not
-reserved'' in your @i{Amd} log, try enabling this parameter and give it
-another go.
-
-@c ----------------------------------------------------------------
-@node nfs_proto Parameter, nfs_retransmit_counter Parameter, nfs_allow_insecure_port Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_proto} Parameter
-@cindex nfs_proto Parameter
-
-(type=string, default to trying version tcp then udp). By default,
-@i{Amd} tries @code{tcp} and then @code{udp}. This option forces the
-overall NFS protocol used to TCP or UDP. It overrides what is in the
-@i{Amd} maps, and is useful when @i{Amd} is compiled with TCP support
-in NFSv2/NFSv3 that may not be stable. With this option you can turn
-off the complete usage of TCP for NFS dynamically (without having to
-recompile @i{Amd}), and use UDP only, until such time as TCP support
-is desired again.
-
-@c ----------------------------------------------------------------
-@node nfs_retransmit_counter Parameter, nfs_retransmit_counter_udp Parameter, nfs_proto Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retransmit_counter} Parameter
-@cindex nfs_retransmit_counter Parameter
-
-(type=numeric, default=11). Same as the @i{retransmit} part of the
-@code{-t} @i{timeout.retransmit} option to @i{Amd}. Specifies the
-number of NFS retransmissions that the kernel will use to communicate
-with @i{Amd} using either UDP or TCP mounts. @xref{-t Option}.
-
-@c ----------------------------------------------------------------
-@node nfs_retransmit_counter_udp Parameter, nfs_retransmit_counter_tcp Parameter, nfs_retransmit_counter Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retransmit_counter_udp} Parameter
-@cindex nfs_retransmit_counter_udp Parameter
-@cindex nfs_retransmit_counter Parameter
-@cindex UDP
-
-(type=numeric, default=11). Same as the @i{nfs_retransmit_counter}
-parameter, but applied globally only to UDP mounts.
-@xref{nfs_retransmit_counter Parameter}.
-
-@c ----------------------------------------------------------------
-@node nfs_retransmit_counter_tcp Parameter, nfs_retransmit_counter_toplvl Parameter, nfs_retransmit_counter_udp Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retransmit_counter_tcp} Parameter
-@cindex nfs_retransmit_counter_tcp Parameter
-@cindex nfs_retransmit_counter Parameter
-@cindex TCP
-
-(type=numeric, default=11). Same as the @i{nfs_retransmit_counter}
-parameter, but applied globally only to TCP mounts.
-@xref{nfs_retransmit_counter Parameter}.
-
-@c ----------------------------------------------------------------
-@node nfs_retransmit_counter_toplvl Parameter, nfs_retry_interval Parameter, nfs_retransmit_counter_tcp Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retransmit_counter_toplvl} Parameter
-@cindex nfs_retransmit_counter_toplvl Parameter
-@cindex nfs_retransmit_counter Parameter
-@cindex UDP
-
-(type=numeric, default=11). Same as the @i{nfs_retransmit_counter}
-parameter, applied only for @i{Amd}'s top-level UDP mounts. On some
-systems it is useful to set this differently than the OS default, so
-as to better tune @i{Amd}'s responsiveness under heavy scheduler
-loads. @xref{nfs_retransmit_counter Parameter}.
-
-@c ----------------------------------------------------------------
-@node nfs_retry_interval Parameter, nfs_retry_interval_udp Parameter, nfs_retransmit_counter_toplvl Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retry_interval} Parameter
-@cindex nfs_retry_interval Parameter
-
-(type=numeric, default=8). Same as the @i{timeout} part of the
-@code{-t} @i{timeout.retransmit} option to @i{Amd}. Specifies the NFS
-timeout interval, in @emph{tenths} of seconds, between NFS/RPC retries
-(for UDP or TCP). This is the value that the kernel will use to
-communicate with @i{Amd}. @xref{-t Option}.
-
-@i{Amd} relies on the kernel RPC retransmit mechanism to trigger mount
-retries. The values of the @i{nfs_retransmit_counter} and the
-@i{nfs_retry_interval} parameters change the overall retry interval.
-Too long an interval gives poor interactive response; too short an
-interval causes excessive retries.
-
-@c ----------------------------------------------------------------
-@node nfs_retry_interval_udp Parameter, nfs_retry_interval_tcp Parameter, nfs_retry_interval Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retry_interval_udp} Parameter
-@cindex nfs_retry_interval_udp Parameter
-@cindex nfs_retry_interval Parameter
-@cindex UDP
-
-(type=numeric, default=8). Same as the @i{nfs_retry_interval}
-parameter, but applied globally only to UDP mounts.
-@xref{nfs_retry_interval Parameter}.
-
-@c ----------------------------------------------------------------
-@node nfs_retry_interval_tcp Parameter, nfs_retry_interval_toplvl Parameter, nfs_retry_interval_udp Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retry_interval_tcp} Parameter
-@cindex nfs_retry_interval_tcp Parameter
-@cindex nfs_retry_interval Parameter
-@cindex TCP
-
-(type=numeric, default=8). Same as the @i{nfs_retry_interval}
-parameter, but applied globally only to TCP mounts.
-@xref{nfs_retry_interval Parameter}.
-
-@c ----------------------------------------------------------------
-@node nfs_retry_interval_toplvl Parameter, nfs_vers Parameter, nfs_retry_interval_tcp Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_retry_interval_toplvl} Parameter
-@cindex nfs_retry_interval_toplvl Parameter
-@cindex nfs_retry_interval Parameter
-@cindex UDP
-
-(type=numeric, default=8). Same as the @i{nfs_retry_interval}
-parameter, applied only for @i{Amd}'s top-level UDP mounts. On some
-systems it is useful to set this differently than the OS default, so
-as to better tune @i{Amd}'s responsiveness under heavy scheduler
-loads. @xref{nfs_retry_interval Parameter}.
-
-@c ----------------------------------------------------------------
-@node nfs_vers Parameter, nis_domain Parameter, nfs_retry_interval_toplvl Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nfs_vers} Parameter
-@cindex nfs_vers Parameter
-
-(type=numeric, default to trying version 3 then 2). By default,
-@i{Amd} tries version 3 and then version 2. This option forces the
-overall NFS protocol used to version 3 or 2. It overrides what is in
-the @i{Amd} maps, and is useful when @i{Amd} is compiled with NFSv3
-support that may not be stable. With this option you can turn off the
-complete usage of NFSv3 dynamically (without having to recompile
-@i{Amd}), and use NFSv2 only, until such time as NFSv3 support is
-desired again.
-
-@c ----------------------------------------------------------------
-@node nis_domain Parameter, normalize_hostnames Parameter, nfs_vers Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{nis_domain} Parameter
-@cindex nis_domain Parameter
-
-(type=string, default to local NIS domain name). Same as the
-@code{-y} option to @i{Amd}. Specify an alternative NIS domain from
-which to fetch the NIS maps. The default is the system domain name.
-This option is ignored if NIS support is not available.
-
-@c ----------------------------------------------------------------
-@node normalize_hostnames Parameter, normalize_slashes Parameter, nis_domain Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{normalize_hostnames} Parameter
-@cindex normalize_hostnames Parameter
-
-(type=boolean, default=@samp{no}). Same as the @code{-n} option to @i{Amd}.
-If @samp{yes}, then the name referred to by @code{$@{rhost@}} is normalized
-relative to the host database before being used. The effect is to
-translate aliases into ``official'' names.
-
-@c ----------------------------------------------------------------
-@node normalize_slashes Parameter, os Parameter, normalize_hostnames Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{normalize_slashes} Parameter
-@cindex normalize_slashes Parameter
-
-(type=boolean, default=@samp{yes}). If @samp{yes} then amd will
-condense all multiple @code{/} (slash) characters into one and remove
-all trailing slashes. If @samp{no}, then amd will not touch strings
-that may contain repeated or trailing slashes. The latter is
-sometimes useful with SMB mounts, which often require multiple slash
-characters in pathnames.
-
-@c ----------------------------------------------------------------
-@node os Parameter, osver Parameter, normalize_slashes Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{os} Parameter
-@cindex os Parameter
-
-(type=string, default to compiled in value). Same as the @code{-O}
-option to @i{Amd}. Allows you to override the compiled-in name of the
-operating system. Useful when the built-in name is not desired for
-backward compatibility reasons. For example, if the built-in name is
-@samp{sunos5}, you can override it to @samp{sos5}, and use older maps
-which were written with the latter in mind.
-
-
-@c ----------------------------------------------------------------
-@node osver Parameter, pid_file Parameter, os Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{osver} Parameter
-@cindex osver Parameter
-
-(type=string, default to compiled in value). Same as the @code{-o}
-option to @i{Amd}. Allows you to override the compiled-in version
-number of the operating system. Useful when the built-in version is not
-desired for backward compatibility reasons. For example, if the build
-in version is @samp{2.5.1}, you can override it to @samp{5.5.1}, and use
-older maps that were written with the latter in mind.
-
-@c ----------------------------------------------------------------
-@node pid_file Parameter, plock Parameter, osver Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{pid_file} Parameter
-@cindex pid_file Parameter
-
-(type=string, default=@samp{/dev/stdout}). Specify a file to store the process
-ID of the running daemon into. If not specified, @i{Amd} will print its
-process id onto the standard output. Useful for killing @i{Amd} after
-it had run. Note that the PID of a running @i{Amd} can also be
-retrieved via @i{Amq} (@pxref{Amq -p option}).
-
-This file is used only if the @samp{print_pid} option is on
-(@pxref{print_pid Parameter}).
-
-@c ----------------------------------------------------------------
-@node plock Parameter, portmap_program Parameter, pid_file Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{plock} Parameter
-@cindex plock Parameter
-
-(type=boolean, default=@samp{yes}). Same as the @code{-S} option to @i{Amd}.
-If @samp{yes}, lock the running executable pages of @i{Amd} into memory.
-To improve @i{Amd}'s performance, systems that support the @b{plock}(3)
-or @b{mlockall}(2)
-call can lock the @i{Amd} process into memory. This way there is less
-chance the operating system will schedule, page out, and swap the
-@i{Amd} process as needed. This improves @i{Amd}'s performance, at the
-cost of reserving the memory used by the @i{Amd} process (making it
-unavailable for other processes).
-
-@c ----------------------------------------------------------------
-@node portmap_program Parameter, preferred_amq_port Parameter, plock Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{portmap_program} Parameter
-@cindex portmap_program Parameter
-
-(type=numeric, default=300019). Specify an alternate Port-mapper RPC
-program number, other than the official number. This is useful when
-running multiple @i{Amd} processes. For example, you can run another
-@i{Amd} in ``test'' mode, without affecting the primary @i{Amd} process
-in any way. For safety reasons, the alternate program numbers that can
-be specified must be in the range 300019-300029, inclusive. @i{Amq} has
-an option @code{-P} which can be used to specify an alternate program
-number of an @i{Amd} to contact. In this way, amq can fully control any
-number of @i{Amd} processes running on the same host.
-
-@c ----------------------------------------------------------------
-@node preferred_amq_port Parameter, print_pid Parameter, portmap_program Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{preferred_amq_port} Parameter
-@cindex preferred_amq_port Parameter
-
-(type=numeric, default=0). Specify an alternate Port-mapper RPC port
-number for @i{Amd}'s @i{Amq} service. This is used for both UDP and
-TCP. Setting this value to 0 (or not defining it) will cause @i{Amd}
-to select an arbitrary port number. Setting the @i{Amq} RPC service
-port to a specific number is useful in firewalled or NAT'ed
-environments, where you need to know which port @i{Amd} will listen
-on.
-
-@c ----------------------------------------------------------------
-@node print_pid Parameter, print_version Parameter, preferred_amq_port Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{print_pid} Parameter
-@cindex print_pid Parameter
-
-(type=boolean, default=@samp{no}). Same as the @code{-p} option to @i{Amd}.
-If @samp{yes}, @i{Amd} will print its process ID upon starting.
-
-@c ----------------------------------------------------------------
-@node print_version Parameter, restart_mounts Parameter, print_pid Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{print_version} Parameter
-@cindex print_version Parameter
-
-(type=boolean, default=@samp{no}). Same as the @code{-v} option to @i{Amd},
-but the version prints and @i{Amd} continues to run. If @samp{yes}, @i{Amd}
-will print its version information string, which includes some
-configuration and compilation values.
-
-@c ----------------------------------------------------------------
-@node restart_mounts Parameter, show_statfs_entries Parameter, print_version Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{restart_mounts} Parameter
-@cindex restart_mounts Parameter
-
-(type=boolean, default=@samp{no}). Same as the @code{-r} option to @i{Amd}.
-If @samp{yes} @i{Amd} will scan the mount table to determine which file
-systems are currently mounted. Whenever one of these would have been
-auto-mounted, @i{Amd} inherits it.
-
-@c ----------------------------------------------------------------
-@node show_statfs_entries Parameter, truncate_log Parameter, restart_mounts Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{show_statfs_entries} Parameter
-@cindex show_statfs_entries Parameter
-
-(type=boolean), default=@samp{no}). If @samp{yes}, then all maps which are
-browsable will also show the number of entries (keys) they have when
-@b{df}(1) runs. (This is accomplished by returning non-zero values to
-the @b{statfs}(2) system call).
-
-@c ----------------------------------------------------------------
-@node truncate_log Parameter, unmount_on_exit Parameter, show_statfs_entries Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{truncate_log} Parameter
-@cindex truncate_log Parameter
-
-(type=boolean), default=@samp{no}). If @samp{yes}, then @i{Amd} will
-truncate the log file (if it's a regular file) on startup. This could
-be useful when conducting extensive testing on @i{Amd} maps (or
-@i{Amd} itself) and you don't want to see log data from a previous run
-in the same file.
-
-@c ----------------------------------------------------------------
-@node unmount_on_exit Parameter, use_tcpwrappers Parameter, truncate_log Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{unmount_on_exit} Parameter
-@cindex unmount_on_exit Parameter
-
-(type=boolean, default=@samp{no}). If @samp{yes}, then @i{Amd} will attempt
-to unmount all file systems which it knows about. Normally it leaves
-all (esp. NFS) mounted file systems intact. Note that @i{Amd} does not
-know about file systems mounted before it starts up, unless the
-@samp{restart_mounts} option is used (@pxref{restart_mounts Parameter}).
-
-@c ----------------------------------------------------------------
-@node use_tcpwrappers Parameter, vendor Parameter, unmount_on_exit Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{use_tcpwrappers} Parameter
-@cindex use_tcpwrappers Parameter
-
-(type=boolean), default=@samp{yes}). If @samp{yes}, then amd will use
-the tcpwrappers (tcpd/librwap) library (if available) to control
-access to @i{Amd} via the @code{/etc/hosts.allow} and
-@code{/etc/hosts.deny} files. @i{Amd} will verify that the host
-running @i{Amq} is authorized to connect. The @code{amd} service name
-must used in the @code{/etc/hosts.allow} and @code{/etc/hosts.deny}
-files. For example, to allow only localhost to connect to @i{Amd},
-add this line to @code{/etc/hosts.allow}:
-
-@example
-amd: localhost
-@end example
-
-and this line to @code{/etc/hosts.deny}:
-
-@example
-amd: ALL
-@end example
-
-Consult the man pages for @b{hosts_access}(5) for more information on using
-the tcpwrappers access-control library.
-
-Note that in particular, you should not configure your @code{hosts.allow}
-file to spawn a command for @i{Amd}: that will cause @i{Amd} to not be able
-to @code{waitpid} on the child process ID of any background un/mount that
-@i{Amd} issued, resulting in a confused @i{Amd} that does not know what
-happened to those background un/mount requests.
-
-@c ----------------------------------------------------------------
-@node vendor Parameter, , use_tcpwrappers Parameter, Global Parameters
-@comment node-name, next, previous, up
-@subsection @t{vendor} Parameter
-@cindex vendor Parameter
-
-(type=string, default to compiled in value). The name of the vendor of
-the operating system. Overrides the compiled-in vendor name. Useful
-when the compiled-in name is not desired. For example, most Intel based
-systems set the vendor name to @samp{unknown}, but you can set it to
-@samp{redhat}.
-
-@c ================================================================
-@node Regular Map Parameters, amd.conf Examples, Global Parameters, Amd Configuration File
-@comment node-name, next, previous, up
-@section Regular Map Parameters
-@cindex amd.conf regular map parameters
-
-The following parameters are applicable only to regular map sections.
-
-@menu
-* map_name Parameter::
-* tag Parameter::
-@end menu
-
-@c ----------------------------------------------------------------
-@node map_name Parameter, tag Parameter, Regular Map Parameters, Regular Map Parameters
-@comment node-name, next, previous, up
-@subsection map_name Parameter
-@cindex map_name Parameter
-
-(type=string, must be specified). Name of the map where the keys are
-located.
-
-@c ----------------------------------------------------------------
-@node tag Parameter, , map_name Parameter, Regular Map Parameters
-@comment node-name, next, previous, up
-@subsection tag Parameter
-@cindex tag Parameter
-
-(type=string, default no tag). Each map entry in the configuration file
-can be tagged. If no tag is specified, that map section will always be
-processed by @i{Amd}. If it is specified, then @i{Amd} will process the map
-if the @code{-T} option was given to @i{Amd}, and the value given to that
-command-line option matches that in the map section.
-
-@c ================================================================
-@node amd.conf Examples, , Regular Map Parameters, Amd Configuration File
-@comment node-name, next, previous, up
-@section amd.conf Examples
-@cindex amd.conf examples
-
-The following is the actual @code{amd.conf} file I used at the
-Computer Science Department of Columbia University.
-
-@example
-# GLOBAL OPTIONS SECTION
-[ global ]
-normalize_hostnames = no
-print_pid = no
-#pid_file = /var/run/amd.pid
-restart_mounts = yes
-#unmount_on_exit = yes
-auto_dir = /n
-log_file = /var/log/amd
-log_options = all
-#debug_options = all
-plock = no
-selectors_in_defaults = yes
-# config.guess picks up "sunos5" and I don't want to edit my maps yet
-os = sos5
-# if you print_version after setting up "os", it will show it.
-print_version = no
-map_type = file
-search_path = /etc/amdmaps:/usr/lib/amd:/usr/local/AMD/lib
-browsable_dirs = yes
-fully_qualified_hosts = no
-
-# DEFINE AN AMD MOUNT POINT
-[ /u ]
-map_name = amd.u
-
-[ /proj ]
-map_name = amd.proj
-
-[ /src ]
-map_name = amd.src
-
-[ /misc ]
-map_name = amd.misc
-
-[ /import ]
-map_name = amd.import
-
-[ /tftpboot/.amd ]
-tag = tftpboot
-map_name = amd.tftpboot
-@end example
-
-@c ################################################################
-@node Run-time Administration, FSinfo, Amd Configuration File, Top
-@comment node-name, next, previous, up
-@chapter Run-time Administration
-@cindex Run-time administration
-@cindex Amq command
-
-@menu
-* Starting Amd::
-* Stopping Amd::
-* Restarting Amd::
-* Controlling Amd::
-@end menu
-
-@node Starting Amd, Stopping Amd, Run-time Administration, Run-time Administration
-@comment node-name, next, previous, up
-@section Starting @i{Amd}
-@cindex Starting Amd
-@cindex Additions to /etc/rc.local
-@cindex /etc/rc.local additions
-@cindex ctl-amd
-
-@i{Amd} is best started from @samp{/etc/rc.local} on BSD systems, or
-from the appropriate start-level script in @samp{/etc/init.d} on System V
-systems.
-
-@example
-if [ -f /usr/local/sbin/ctl-amd ]; then
- /usr/local/sbin/ctl-amd start; (echo -n ' amd') > /dev/console
-fi
-@end example
-
-@noindent
-The shell script, @samp{ctl-amd} is used to start, stop, or restart
-@i{Amd}. It is a relatively generic script. All options you want to
-set should not be made in this script, but rather updated in the
-@file{amd.conf} file. @xref{Amd Configuration File}.
-
-If you do not wish to use an @i{Amd} configuration file, you may start
-@i{Amd} manually. For example, getting the map entries via NIS:
-
-@example
-amd -r -l /var/log/amd `ypcat -k auto.master`
-@end example
-
-@node Stopping Amd, Restarting Amd, Starting Amd, Run-time Administration
-@comment node-name, next, previous, up
-@section Stopping @i{Amd}
-@cindex Stopping Amd
-@cindex SIGTERM signal
-@cindex SIGINT signal
-
-@i{Amd} stops in response to two signals.
-
-@table @samp
-@item SIGTERM
-causes the top-level automount points to be unmounted and then @i{Amd}
-to exit. Any automounted filesystems are left mounted. They can be
-recovered by restarting @i{Amd} with the @code{-r} command line option.@refill
-
-@item SIGINT
-causes @i{Amd} to attempt to unmount any filesystems which it has
-automounted, in addition to the actions of @samp{SIGTERM}. This signal
-is primarily used for debugging.@refill
-@end table
-
-Actions taken for other signals are undefined.
-
-The easiest and safest way to stop @i{Amd}, without having to find its
-process ID by hand, is to use the @file{ctl-amd} script, as with:
-
-@example
-ctl-amd stop
-@end example
-
-@node Restarting Amd, Controlling Amd, Stopping Amd, Run-time Administration
-@comment node-name, next, previous, up
-@section Restarting @i{Amd}
-@cindex Restarting Amd
-@cindex Killing and starting Amd
-
-Before @i{Amd} can be started, it is vital to ensure that no other
-@i{Amd} processes are managing any of the mount points, and that the
-previous process(es) have terminated cleanly. When a terminating signal
-is set to @i{Amd}, the automounter does @emph{not} terminate right then.
-Rather, it starts by unmounting all of its managed mount mounts in the
-background, and then terminates. It usually takes a few seconds for
-this process to happen, but it can take an arbitrarily longer time. If
-two or more @i{Amd} processes attempt to manage the same mount point, it
-usually will result in a system lockup.
-
-The easiest and safest way to restart @i{Amd}, without having to find
-its process ID by hand, sending it the @samp{SIGTERM} signal, waiting for @i{Amd}
-to die cleanly, and verifying so, is to use the @file{ctl-amd} script,
-as with:
-
-@example
-ctl-amd restart
-@end example
-
-The script will locate the process ID of @i{Amd}, kill it, and wait for
-it to die cleanly before starting a new instance of the automounter.
-@file{ctl-amd} will wait for a total of 30 seconds for @i{Amd} to die,
-and will check once every 5 seconds if it had.
-
-@node Controlling Amd, , Restarting Amd, Run-time Administration
-@comment node-name, next, previous, up
-@section Controlling @i{Amd}
-@cindex Controlling Amd
-@cindex Discovering what is going on at run-time
-@cindex Listing currently mounted filesystems
-
-It is sometimes desirable or necessary to exercise external control
-over some of @i{Amd}'s internal state. To support this requirement,
-@i{Amd} implements an RPC interface which is used by the @dfn{Amq} program.
-A variety of information is available.
-
-@i{Amq} generally applies an operation, specified by a single letter option,
-to a list of mount points. The default operation is to obtain statistics
-about each mount point. This is similar to the output shown above
-but includes information about the number and type of accesses to each
-mount point.
-
-@menu
-* Amq default:: Default command behavior.
-* Amq -f option:: Flushing the map cache.
-* Amq -h option:: Controlling a non-local host.
-* Amq -H option:: Print help message.
-* Amq -l option:: Controlling the log file.
-* Amq -m option:: Obtaining mount statistics.
-* Amq -p option:: Getting Amd's process ID.
-* Amq -P option:: Contacting alternate Amd processes.
-* Amq -s option:: Obtaining global statistics.
-* Amq -T option:: Use TCP transport.
-* Amq -U option:: Use UDP transport.
-* Amq -u option:: Forcing volumes to time out.
-* Amq -v option:: Version information.
-* Amq -w option:: Print Amd current working directory.
-* Other Amq options:: Three other special options.
-@end menu
-
-@c ----------------------------------------------------------------
-@node Amq default, Amq -f option, Controlling Amd, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} default information
-
-With no arguments, @dfn{Amq} obtains a brief list of all existing
-mounts created by @i{Amd}. This is different from the list displayed by
-@b{df}(1) since the latter only includes system mount points.
-
-@noindent
-The output from this option includes the following information:
-
-@itemize @bullet
-@item
-the automount point,
-@item
-the filesystem type,
-@item
-the mount map or mount information,
-@item
-the internal, or system mount point.
-@end itemize
-
-@noindent
-For example:
-
-@example
-/ root "root" sky:(pid75)
-/homes toplvl /usr/local/etc/amd.homes /homes
-/home toplvl /usr/local/etc/amd.home /home
-/homes/jsp nfs charm:/home/charm /a/charm/home/charm/jsp
-/homes/phjk nfs toytown:/home/toytown /a/toytown/home/toytown/ai/phjk
-@end example
-
-@noindent
-If an argument is given then statistics for that volume name will
-be output. For example:
-
-@example
-What Uid Getattr Lookup RdDir RdLnk Statfs Mounted@@
-/homes 0 1196 512 22 0 30 90/09/14 12:32:55
-/homes/jsp 0 0 0 0 1180 0 90/10/13 12:56:58
-@end example
-
-@table @code
-@item What
-the volume name.
-
-@item Uid
-ignored.
-
-@item Getattr
-the count of NFS @dfn{getattr} requests on this node. This should only be
-non-zero for directory nodes.
-
-@item Lookup
-the count of NFS @dfn{lookup} requests on this node. This should only be
-non-zero for directory nodes.
-
-@item RdDir
-the count of NFS @dfn{readdir} requests on this node. This should only
-be non-zero for directory nodes.
-
-@item RdLnk
-the count of NFS @dfn{readlink} requests on this node. This should be
-zero for directory nodes.
-
-@item Statfs
-the count of NFS @dfn{statfs} requests on this node. This should only
-be non-zero for top-level automount points.
-
-@item Mounted@@
-the date and time the volume name was first referenced.
-@end table
-
-@c ----------------------------------------------------------------
-@node Amq -f option, Amq -h option, Amq default, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-f} option
-@cindex Flushing the map cache
-@cindex Map cache, flushing
-
-The @code{-f} option causes @i{Amd} to flush the internal mount map cache.
-This is useful for example in Hesiod maps since @i{Amd} will not
-automatically notice when they have been updated. The map cache can
-also be synchronized with the map source by using the @samp{sync} option
-(@pxref{Automount Filesystem}).@refill
-
-@c ----------------------------------------------------------------
-@node Amq -h option, Amq -H option, Amq -f option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-h} option
-@cindex Querying an alternate host
-
-By default the local host is used. In an HP-UX cluster the root server
-is used since that is the only place in the cluster where @i{Amd} will
-be running. To query @i{Amd} on another host the @code{-h} option should
-be used.
-
-@c ----------------------------------------------------------------
-@node Amq -H option, Amq -l option, Amq -h option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-H} option
-@cindex Displaying brief help
-@cindex Help; showing from Amq
-
-Print a brief help and usage string.
-
-@c ----------------------------------------------------------------
-@node Amq -l option, Amq -m option, Amq -H option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-l} option
-@cindex Resetting the Amd log file
-@cindex Setting the Amd log file via Amq
-@cindex Log file, resetting
-
-Tell @i{Amd} to use @i{log_file} as the log file name. For security
-reasons, this @emph{must} be the same log file which @i{Amd} used when
-started. This option is therefore only useful to refresh @i{Amd}'s open
-file handle on the log file, so that it can be rotated and compressed
-via daily cron jobs.
-
-@c ----------------------------------------------------------------
-@node Amq -m option, Amq -p option, Amq -l option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-m} option
-
-The @code{-m} option displays similar information about mounted
-filesystems, rather than automount points. The output includes the
-following information:
-
-@itemize @bullet
-@item
-the mount information,
-@item
-the mount point,
-@item
-the filesystem type,
-@item
-the number of references to this filesystem,
-@item
-the server hostname,
-@item
-the state of the file server,
-@item
-any error which has occurred.
-@end itemize
-
-For example:
-
-@example
-"root" truth:(pid602) root 1 localhost is up
-hesiod.home /home toplvl 1 localhost is up
-hesiod.vol /vol toplvl 1 localhost is up
-hesiod.homes /homes toplvl 1 localhost is up
-amy:/home/amy /a/amy/home/amy nfs 5 amy is up
-swan:/home/swan /a/swan/home/swan nfs 0 swan is up (Permission denied)
-ex:/home/ex /a/ex/home/ex nfs 0 ex is down
-@end example
-
-When the reference count is zero the filesystem is not mounted but
-the mount point and server information is still being maintained
-by @i{Amd}.
-
-@c ----------------------------------------------------------------
-@ignore
-@comment Retained for future consideration: from the description of the
-@comment amq -M option removed in amd 6.0.5.
-
-A future release of @i{Amd} will include code to allow the @b{mount}(8)
-command to mount automount points:
-
-@example
-mount -t amd /vol hesiod.vol
-@end example
-
-This will then allow @i{Amd} to be controlled from the standard system
-filesystem mount list.
-
-@end ignore
-
-@c ----------------------------------------------------------------
-@node Amq -p option, Amq -P option, Amq -m option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-p} option
-@cindex Process ID; Amd
-@cindex Amd's process ID
-@cindex Amd's PID
-@cindex PID; Amd
-
-Return the process ID of the remote or locally running @i{Amd}. Useful
-when you need to send a signal to the local @i{Amd} process, and would
-rather not have to search through the process table. This option is
-used in the @file{ctl-amd} script.
-
-@c ----------------------------------------------------------------
-@node Amq -P option, Amq -s option, Amq -p option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-P} option
-@cindex Multiple Amd processes
-@cindex Running multiple Amd
-@cindex Debugging a new Amd configuration
-@cindex RPC Program numbers; Amd
-
-Contact an alternate running @i{Amd} that had registered itself on a
-different RPC @var{program_number} and apply all other operations to
-that instance of the automounter. This is useful when you run multiple
-copies of @i{Amd}, and need to manage each one separately. If not
-specified, @i{Amq} will use the default program number for @i{Amd}, 300019.
-For security reasons, the only alternate program numbers @i{Amd} can use
-range from 300019 to 300029, inclusive.
-
-For example, to kill an alternate running @i{Amd}:
-
-@example
-kill `amq -p -P 300020`
-@end example
-
-@c ----------------------------------------------------------------
-@node Amq -s option, Amq -T option, Amq -P option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-s} option
-@cindex Global statistics
-@cindex Statistics
-
-The @code{-s} option displays global statistics. If any other options are specified
-or any filesystems named then this option is ignored. For example:
-
-@example
-requests stale mount mount unmount
-deferred fhandles ok failed failed
-1054 1 487 290 7017
-@end example
-
-@table @samp
-@item Deferred requests
-are those for which an immediate reply could not be constructed. For
-example, this would happen if a background mount was required.
-
-@item Stale filehandles
-counts the number of times the kernel passes a stale filehandle to @i{Amd}.
-Large numbers indicate problems.
-
-@item Mount ok
-counts the number of automounts which were successful.
-
-@item Mount failed
-counts the number of automounts which failed.
-
-@item Unmount failed
-counts the number of times a filesystem could not be unmounted. Very
-large numbers here indicate that the time between unmount attempts
-should be increased.
-@end table
-
-@c ----------------------------------------------------------------
-@node Amq -T option, Amq -U option, Amq -s option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-T} option
-@cindex Forcing Amq to use a TCP transport
-@cindex TCP; using with Amq
-
-The @code{-T} option causes the @i{Amq} to contact @i{Amd} using the TCP
-transport only (connection oriented). Normally, @i{Amq} will use TCP
-first, and if that failed, will try UDP.
-
-@c ----------------------------------------------------------------
-@node Amq -U option, Amq -u option, Amq -T option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-U} option
-@cindex Forcing Amq to use a UDP transport
-@cindex UDP; using with Amq
-
-The @code{-U} option causes the @i{Amq} to contact @i{Amd} using the UDP
-transport only (connectionless). Normally, @i{Amq} will use TCP first,
-and if that failed, will try UDP.
-
-@c ----------------------------------------------------------------
-@node Amq -u option, Amq -v option, Amq -U option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-u} option
-@cindex Forcing filesystem to time out
-@cindex Unmounting a filesystem
-
-The @code{-u} option causes the time-to-live interval of the named mount
-points to be expired, thus causing an unmount attempt. This is the only
-safe way to unmount an automounted filesystem. It is not possible to
-unmount a filesystem which has been mounted with the @samp{nounmount}
-flag.
-
-@c The @code{-H} option informs @i{Amd} that the specified mount point
-@c has hung - as if its keepalive timer had expired.
-
-@c ----------------------------------------------------------------
-@node Amq -v option, Amq -w option, Amq -u option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-v} option
-@cindex Version information at run-time
-
-The @code{-v} option displays the version of @i{Amd} in a similar way to
-@i{Amd}'s @code{-v} option.
-
-@c ----------------------------------------------------------------
-@node Amq -w option, Other Amq options, Amq -v option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection @i{Amq} @code{-w} option
-@cindex Getting real working directory
-
-The @code{-w} option translates a full pathname as returned by
-@b{getpwd}(3) into a short @i{Amd} pathname that goes through its mount
-points. This option requires that @i{Amd} is running.
-
-@c ----------------------------------------------------------------
-@node Other Amq options, , Amq -w option, Controlling Amd
-@comment node-name, next, previous, up
-@subsection Other @i{Amq} options
-@cindex Logging options via Amq
-@cindex Debugging options via Amq
-
-Two other operations are implemented. These modify the state of @i{Amd}
-as a whole, rather than any particular filesystem. The @code{-x} and
-@code{-D} options have exactly the same effect as @i{Amd}'s corresponding
-command line options.
-
-When @i{Amd} receives a @code{-x} flag it limits the log options being
-modified to those which were not enabled at startup. This prevents a
-user turning @emph{off} any logging option which was specified at
-startup, though any which have been turned on since then can still be
-turned off. The @code{-D} option has a similar behavior.
-
-@c ################################################################
-@node FSinfo, Hlfsd, Run-time Administration, Top
-@comment node-name, next, previous, up
-@chapter FSinfo
-@cindex FSinfo
-@cindex Filesystem info package
-
-XXX: this chapter should be reviewed by someone knowledgeable with
-fsinfo.
-
-@menu
-* FSinfo Overview:: Introduction to FSinfo.
-* Using FSinfo:: Basic concepts.
-* FSinfo Grammar:: Language syntax, semantics and examples.
-* FSinfo host definitions:: Defining a new host.
-* FSinfo host attributes:: Definable host attributes.
-* FSinfo filesystems:: Defining locally attached filesystems.
-* FSinfo static mounts:: Defining additional static mounts.
-* FSinfo automount definitions::
-* FSinfo Command Line Options::
-* FSinfo errors::
-@end menu
-
-@node FSinfo Overview, Using FSinfo, FSinfo, FSinfo
-@comment node-name, next, previous, up
-@section @i{FSinfo} overview
-@cindex FSinfo overview
-
-@i{FSinfo} is a filesystem management tool. It has been designed to
-work with @i{Amd} to help system administrators keep track of the ever
-increasing filesystem namespace under their control.
-
-The purpose of @i{FSinfo} is to generate all the important standard
-filesystem data files from a single set of input data. Starting with a
-single data source guarantees that all the generated files are
-self-consistent. One of the possible output data formats is a set of
-@i{Amd} maps which can be used among the set of hosts described in the
-input data.
-
-@i{FSinfo} implements a declarative language. This language is
-specifically designed for describing filesystem namespace and physical
-layouts. The basic declaration defines a mounted filesystem including
-its device name, mount point, and all the volumes and access
-permissions. @i{FSinfo} reads this information and builds an internal
-map of the entire network of hosts. Using this map, many different data
-formats can be produced including @file{/etc/fstab},
-@file{/etc/exports}, @i{Amd} mount maps and
-@file{/etc/bootparams}.@refill
-
-@node Using FSinfo, FSinfo Grammar, FSinfo Overview, FSinfo
-@comment node-name, next, previous, up
-@section Using @i{FSinfo}
-@cindex Using FSinfo
-
-The basic strategy when using @i{FSinfo} is to gather all the
-information about all disks on all machines into one set of
-declarations. For each machine being managed, the following data is
-required:
-
-@itemize @bullet
-@item
-Hostname
-@item
-List of all filesystems and, optionally, their mount points.
-@item
-Names of volumes stored on each filesystem.
-@item
-NFS export information for each volume.
-@item
-The list of static filesystem mounts.
-@end itemize
-
-The following information can also be entered into the same
-configuration files so that all data can be kept in one place.
-
-@itemize @bullet
-@item
-List of network interfaces
-@item
-IP address of each interface
-@item
-Hardware address of each interface
-@item
-Dumpset to which each filesystem belongs
-@item
-and more @dots{}
-@end itemize
-
-To generate @i{Amd} mount maps, the automount tree must also be defined
-(@pxref{FSinfo automount definitions}). This will have been designed at
-the time the volume names were allocated. Some volume names will not be
-automounted, so @i{FSinfo} needs an explicit list of which volumes
-should be automounted.@refill
-
-Hostnames are required at several places in the @i{FSinfo} language. It
-is important to stick to either fully qualified names or unqualified
-names. Using a mixture of the two will inevitably result in confusion.
-
-Sometimes volumes need to be referenced which are not defined in the set
-of hosts being managed with @i{FSinfo}. The required action is to add a
-dummy set of definitions for the host and volume names required. Since
-the files generated for those particular hosts will not be used on them,
-the exact values used is not critical.
-
-@node FSinfo Grammar, FSinfo host definitions, Using FSinfo, FSinfo
-@comment node-name, next, previous, up
-@section @i{FSinfo} grammar
-@cindex FSinfo grammar
-@cindex Grammar, FSinfo
-
-@i{FSinfo} has a relatively simple grammar. Distinct syntactic
-constructs exist for each of the different types of data, though they
-share a common flavor. Several conventions are used in the grammar
-fragments below.
-
-The notation, @i{list(}@t{xxx}@i{)}, indicates a list of zero or more
-@t{xxx}'s. The notation, @i{opt(}@t{xxx}@i{)}, indicates zero or one
-@t{xxx}. Items in double quotes, @i{eg} @t{"host"}, represent input
-tokens. Items in angle brackets, @i{eg} @var{<hostname>}, represent
-strings in the input. Strings need not be in double quotes, except to
-differentiate them from reserved words. Quoted strings may include the
-usual set of C ``@t{\}'' escape sequences with one exception: a
-backslash-newline-whitespace sequence is squashed into a single space
-character. To defeat this feature, put a further backslash at the start
-of the second line.
-
-At the outermost level of the grammar, the input consists of a
-sequence of host and automount declarations. These declarations are
-all parsed before they are analyzed. This means they can appear in
-any order and cyclic host references are possible.
-
-@example
-fsinfo : @i{list(}fsinfo_attr@i{)} ;
-
-fsinfo_attr : host | automount ;
-@end example
-
-@menu
-* FSinfo host definitions::
-* FSinfo automount definitions::
-@end menu
-
-@node FSinfo host definitions, FSinfo host attributes, FSinfo Grammar, FSinfo
-@comment node-name, next, previous, up
-@section @i{FSinfo} host definitions
-@cindex FSinfo host definitions
-@cindex Defining a host, FSinfo
-
-A host declaration consists of three parts: a set of machine attribute
-data, a list of filesystems physically attached to the machine, and a
-list of additional statically mounted filesystems.
-
-@example
-host : "host" host_data @i{list(}filesystem@i{@i{)}} @i{list(}mount@i{@i{)}} ;
-@end example
-
-Each host must be declared in this way exactly once. Such things as the
-hardware address, the architecture and operating system types and the
-cluster name are all specified within the @dfn{host data}.
-
-All the disks the machine has should then be described in the @dfn{list
-of filesystems}. When describing disks, you can specify what
-@dfn{volname} the disk/partition should have and all such entries are
-built up into a dictionary which can then be used for building the
-automounter maps.
-
-The @dfn{list of mounts} specifies all the filesystems that should be
-statically mounted on the machine.
-
-@menu
-* FSinfo host attributes::
-* FSinfo filesystems::
-* FSinfo static mounts::
-@end menu
-
-@node FSinfo host attributes, FSinfo filesystems, FSinfo host definitions , FSinfo host definitions
-@comment node-name, next, previous, up
-@section @i{FSinfo} host attributes
-@cindex FSinfo host attributes
-@cindex Defining host attributes, FSinfo
-
-The host data, @dfn{host_data}, always includes the @dfn{hostname}. In
-addition, several other host attributes can be given.
-
-@example
-host_data : @var{<hostname>}
- | "@{" @i{list(}host_attrs@i{)} "@}" @var{<hostname>}
- ;
-
-host_attrs : host_attr "=" @var{<string>}
- | netif
- ;
-
-host_attr : "config"
- | "arch"
- | "os"
- | "cluster"
- ;
-@end example
-
-The @dfn{hostname} is, typically, the fully qualified hostname of the
-machine.
-
-Examples:
-
-@example
-host dylan.doc.ic.ac.uk
-
-host @{
- os = hpux
- arch = hp300
-@} dougal.doc.ic.ac.uk
-@end example
-
-The options that can be given as host attributes are shown below.
-
-@menu
-* FSinfo netif Option:: FSinfo host netif.
-* FSinfo config Option:: FSinfo host config.
-* FSinfo arch Option:: FSinfo host arch.
-* FSinfo os Option:: FSinfo host os.
-* FSinfo cluster Option:: FSinfo host cluster.
-@end menu
-
-@node FSinfo netif Option, FSinfo config Option, , FSinfo host attributes
-@comment node-name, next, previous, up
-@subsection netif Option
-
-This defines the set of network interfaces configured on the machine.
-The interface attributes collected by @i{FSinfo} are the IP address,
-subnet mask and hardware address. Multiple interfaces may be defined
-for hosts with several interfaces by an entry for each interface. The
-values given are sanity checked, but are currently unused for anything
-else.
-
-@example
-netif : "netif" @var{<string>} "@{" @i{list(}netif_attrs@i{)} "@}" ;
-
-netif_attrs : netif_attr "=" @var{<string>} ;
-
-netif_attr : "inaddr" | "netmask" | "hwaddr" ;
-@end example
-
-Examples:
-
-@example
-netif ie0 @{
- inaddr = 129.31.81.37
- netmask = 0xfffffe00
- hwaddr = "08:00:20:01:a6:a5"
-@}
-
-netif ec0 @{ @}
-@end example
-
-@node FSinfo config Option, FSinfo arch Option, FSinfo netif Option, FSinfo host attributes
-@comment node-name, next, previous, up
-@subsection config Option
-@cindex FSinfo config host attribute
-@cindex config, FSinfo host attribute
-
-This option allows you to specify configuration variables for the
-startup scripts (@file{rc} scripts). A simple string should immediately
-follow the keyword.
-
-Example:
-
-@example
-config "NFS_SERVER=true"
-config "ZEPHYR=true"
-@end example
-
-This option is currently unsupported.
-
-@node FSinfo arch Option, FSinfo os Option, FSinfo config Option, FSinfo host attributes
-@comment node-name, next, previous, up
-@subsection arch Option
-@cindex FSinfo arch host attribute
-@cindex arch, FSinfo host attribute
-
-This defines the architecture of the machine. For example:
-
-@example
-arch = hp300
-@end example
-
-This is intended to be of use when building architecture specific
-mountmaps, however, the option is currently unsupported.
-
-@node FSinfo os Option, FSinfo cluster Option, FSinfo arch Option, FSinfo host attributes
-@comment node-name, next, previous, up
-@subsection os Option
-@cindex FSinfo os host attribute
-@cindex os, FSinfo host attribute
-
-This defines the operating system type of the host. For example:
-
-@example
-os = hpux
-@end example
-
-This information is used when creating the @file{fstab} files, for
-example in choosing which format to use for the @file{fstab} entries
-within the file.
-
-@node FSinfo cluster Option, , FSinfo os Option, FSinfo host attributes
-@comment node-name, next, previous, up
-@subsection cluster Option
-@cindex FSinfo cluster host attribute
-@cindex cluster, FSinfo host attribute
-
-This is used for specifying in which cluster the machine belongs. For
-example:
-
-@example
-cluster = "theory"
-@end example
-
-The cluster is intended to be used when generating the automount maps,
-although it is currently unsupported.
-
-@node FSinfo filesystems, FSinfo static mounts, FSinfo host attributes, FSinfo host definitions
-@comment node-name, next, previous, up
-@section @i{FSinfo} filesystems
-@cindex FSinfo filesystems
-
-The list of physically attached filesystems follows the machine
-attributes. These should define all the filesystems available from this
-machine, whether exported or not. In addition to the device name,
-filesystems have several attributes, such as filesystem type, mount
-options, and @samp{fsck} pass number which are needed to generate
-@file{fstab} entries.
-
-@example
-filesystem : "fs" @var{<device>} "@{" @i{list(}fs_data@i{)} "@}" ;
-
-fs_data : fs_data_attr "=" @var{<string>}
- | mount
- ;
-
-fs_data_attr
- : "fstype" | "opts" | "passno"
- | "freq" | "dumpset" | "log"
- ;
-@end example
-
-Here, @var{<device>} is the device name of the disk (for example,
-@file{/dev/dsk/2s0}). The device name is used for building the mount
-maps and for the @file{fstab} file. The attributes that can be
-specified are shown in the following section.
-
-The @i{FSinfo} configuration file for @code{dylan.doc.ic.ac.uk} is listed below.
-
-@example
-host dylan.doc.ic.ac.uk
-
-fs /dev/dsk/0s0 @{
- fstype = swap
-@}
-
-fs /dev/dsk/0s0 @{
- fstype = hfs
- opts = rw,noquota,grpid
- passno = 0;
- freq = 1;
- mount / @{ @}
-@}
-
-fs /dev/dsk/1s0 @{
- fstype = hfs
- opts = defaults
- passno = 1;
- freq = 1;
- mount /usr @{
- local @{
- exportfs "dougal eden dylan zebedee brian"
- volname /nfs/hp300/local
- @}
- @}
-@}
-
-fs /dev/dsk/2s0 @{
- fstype = hfs
- opts = defaults
- passno = 1;
- freq = 1;
- mount default @{
- exportfs "toytown_clients hangers_on"
- volname /home/dylan/dk2
- @}
-@}
-
-fs /dev/dsk/3s0 @{
- fstype = hfs
- opts = defaults
- passno = 1;
- freq = 1;
- mount default @{
- exportfs "toytown_clients hangers_on"
- volname /home/dylan/dk3
- @}
-@}
-
-fs /dev/dsk/5s0 @{
- fstype = hfs
- opts = defaults
- passno = 1;
- freq = 1;
- mount default @{
- exportfs "toytown_clients hangers_on"
- volname /home/dylan/dk5
- @}
-@}
-@end example
-
-@menu
-* FSinfo fstype Option:: FSinfo filesystems fstype.
-* FSinfo opts Option:: FSinfo filesystems opts.
-* FSinfo passno Option:: FSinfo filesystems passno.
-* FSinfo freq Option:: FSinfo filesystems freq.
-* FSinfo mount Option:: FSinfo filesystems mount.
-* FSinfo dumpset Option:: FSinfo filesystems dumpset.
-* FSinfo log Option:: FSinfo filesystems log.
-@end menu
-
-@node FSinfo fstype Option, FSinfo opts Option, , FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection fstype Option
-@cindex FSinfo fstype filesystems option
-@cindex fstype, FSinfo filesystems option
-@cindex export, FSinfo special fstype
-
-This specifies the type of filesystem being declared and will be placed
-into the @file{fstab} file as is. The value of this option will be
-handed to @code{mount} as the filesystem type---it should have such
-values as @code{4.2}, @code{nfs} or @code{swap}. The value is not
-examined for correctness.
-
-There is one special case. If the filesystem type is specified as
-@samp{export} then the filesystem information will not be added to the
-host's @file{fstab} information, but it will still be visible on the
-network. This is useful for defining hosts which contain referenced
-volumes but which are not under full control of @i{FSinfo}.
-
-Example:
-
-@example
-fstype = swap
-@end example
-
-@node FSinfo opts Option, FSinfo passno Option, FSinfo fstype Option, FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection opts Option
-@cindex FSinfo opts filesystems option
-@cindex opts, FSinfo filesystems option
-
-This defines any options that should be given to @b{mount}(8) in the
-@file{fstab} file. For example:
-
-@example
-opts = rw,nosuid,grpid
-@end example
-
-@node FSinfo passno Option, FSinfo freq Option, FSinfo opts Option, FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection passno Option
-@cindex FSinfo passno filesystems option
-@cindex passno, FSinfo filesystems option
-
-This defines the @b{fsck}(8) pass number in which to check the
-filesystem. This value will be placed into the @file{fstab} file.
-
-Example:
-
-@example
-passno = 1
-@end example
-
-@node FSinfo freq Option, FSinfo mount Option, FSinfo passno Option, FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection freq Option
-@cindex FSinfo freq filesystems option
-@cindex freq, FSinfo filesystems option
-
-This defines the interval (in days) between dumps. The value is placed
-as is into the @file{fstab} file.
-
-Example:
-
-@example
-freq = 3
-@end example
-
-@node FSinfo mount Option, FSinfo dumpset Option, FSinfo freq Option, FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection mount Option
-@cindex FSinfo mount filesystems option
-@cindex mount, FSinfo filesystems option
-@cindex exportfs, FSinfo mount option
-@cindex volname, FSinfo mount option
-@cindex sel, FSinfo mount option
-
-This defines the mountpoint at which to place the filesystem. If the
-mountpoint of the filesystem is specified as @code{default}, then the
-filesystem will be mounted in the automounter's tree under its volume
-name and the mount will automatically be inherited by the automounter.
-
-Following the mountpoint, namespace information for the filesystem may
-be described. The options that can be given here are @code{exportfs},
-@code{volname} and @code{sel}.
-
-The format is:
-
-@example
-mount : "mount" vol_tree ;
-
-vol_tree : @i{list(}vol_tree_attr@i{)} ;
-
-vol_tree_attr
- : @var{<string>} "@{" @i{list(}vol_tree_info@i{)} vol_tree "@}" ;
-
-vol_tree_info
- : "exportfs" @var{<export-data>}
- | "volname" @var{<volname>}
- | "sel" @var{<selector-list>}
- ;
-@end example
-
-Example:
-
-@example
-mount default @{
- exportfs "dylan dougal florence zebedee"
- volname /vol/andrew
-@}
-@end example
-
-In the above example, the filesystem currently being declared will have
-an entry placed into the @file{exports} file allowing the filesystem to
-be exported to the machines @code{dylan}, @code{dougal}, @code{florence}
-and @code{zebedee}. The volume name by which the filesystem will be
-referred to remotely, is @file{/vol/andrew}. By declaring the
-mountpoint to be @code{default}, the filesystem will be mounted on the
-local machine in the automounter tree, where @i{Amd} will automatically
-inherit the mount as @file{/vol/andrew}.@refill
-
-@table @samp
-@item exportfs
-a string defining which machines the filesystem may be exported to.
-This is copied, as is, into the @file{exports} file---no sanity checking
-is performed on this string.@refill
-
-@item volname
-a string which declares the remote name by which to reference the
-filesystem. The string is entered into a dictionary and allows you to
-refer to this filesystem in other places by this volume name.@refill
-
-@item sel
-a string which is placed into the automounter maps as a selector for the
-filesystem.@refill
-
-@end table
-
-@node FSinfo dumpset Option, FSinfo log Option, FSinfo mount Option, FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection dumpset Option
-@cindex FSinfo dumpset filesystems option
-@cindex dumpset, FSinfo filesystems option
-
-This provides support for Imperial College's local file backup tools and
-is not documented further here.
-
-@node FSinfo log Option, , FSinfo dumpset Option, FSinfo filesystems
-@comment node-name, next, previous, up
-@subsection log Option
-@cindex FSinfo log filesystems option
-@cindex log, FSinfo filesystems option
-
-Specifies the log device for the current filesystem. This is ignored if
-not required by the particular filesystem type.
-
-@node FSinfo static mounts, FSinfo automount definitions , FSinfo filesystems, FSinfo host definitions
-@comment node-name, next, previous, up
-@section @i{FSinfo} static mounts
-@cindex FSinfo static mounts
-@cindex Statically mounts filesystems, FSinfo
-
-Each host may also have a number of statically mounted filesystems. For
-example, the host may be a diskless workstation in which case it will
-have no @code{fs} declarations. In this case the @code{mount}
-declaration is used to determine from where its filesystems will be
-mounted. In addition to being added to the @file{fstab} file, this
-information can also be used to generate a suitable @file{bootparams}
-file.@refill
-
-@example
-mount : "mount" @var{<volname>} @i{list(}localinfo@i{)} ;
-
-localinfo : localinfo_attr @var{<string>} ;
-
-localinfo_attr
- : "as"
- | "from"
- | "fstype"
- | "opts"
- ;
-@end example
-
-The filesystem specified to be mounted will be searched for in the
-dictionary of volume names built when scanning the list of hosts'
-definitions.
-
-The attributes have the following semantics:
-@table @samp
-@item from @var{machine}
-mount the filesystem from the machine with the hostname of
-@dfn{machine}.@refill
-
-@item as @var{mountpoint}
-mount the filesystem locally as the name given, in case this is
-different from the advertised volume name of the filesystem.
-
-@item opts @var{options}
-native @b{mount}(8) options.
-
-@item fstype @var{type}
-type of filesystem to be mounted.
-@end table
-
-An example:
-
-@example
-mount /export/exec/hp300/local as /usr/local
-@end example
-
-If the mountpoint specified is either @file{/} or @file{swap}, the
-machine will be considered to be booting off the net and this will be
-noted for use in generating a @file{bootparams} file for the host which
-owns the filesystems.
-
-@node FSinfo automount definitions, FSinfo Command Line Options, FSinfo static mounts, FSinfo
-@comment node-name, next, previous, up
-@section Defining an @i{Amd} Mount Map in @i{FSinfo}
-@cindex FSinfo automount definitions
-@cindex Defining an Amd mount map, FSinfo
-
-The maps used by @i{Amd} can be constructed from @i{FSinfo} by defining
-all the automount trees. @i{FSinfo} takes all the definitions found and
-builds one map for each top level tree.
-
-The automount tree is usually defined last. A single automount
-configuration will usually apply to an entire management domain. One
-@code{automount} declaration is needed for each @i{Amd} automount point.
-@i{FSinfo} determines whether the automount point is @dfn{direct}
-(@pxref{Direct Automount Filesystem}) or @dfn{indirect}
-(@pxref{Top-level Filesystem}). Direct automount points are
-distinguished by the fact that there is no underlying
-@dfn{automount_tree}.@refill
-
-@example
-automount : "automount" @i{opt(}auto_opts@i{)} automount_tree ;
-
-auto_opts : "opts" @var{<mount-options>} ;
-
-automount_tree
- : @i{list(}automount_attr@i{)}
- ;
-
-automount_attr
- : @var{<string>} "=" @var{<volname>}
- | @var{<string>} "->" @var{<symlink>}
- | @var{<string>} "@{" automount_tree "@}"
- ;
-@end example
-
-If @var{<mount-options>} is given, then it is the string to be placed in
-the maps for @i{Amd} for the @code{opts} option.
-
-A @dfn{map} is typically a tree of filesystems, for example @file{home}
-normally contains a tree of filesystems representing other machines in
-the network.
-
-A map can either be given as a name representing an already defined
-volume name, or it can be a tree. A tree is represented by placing
-braces after the name. For example, to define a tree @file{/vol}, the
-following map would be defined:
-
-@example
-automount /vol @{ @}
-@end example
-
-Within a tree, the only items that can appear are more maps.
-For example:
-
-@example
-automount /vol @{
- andrew @{ @}
- X11 @{ @}
-@}
-@end example
-
-In this case, @i{FSinfo} will look for volumes named @file{/vol/andrew}
-and @file{/vol/X11} and a map entry will be generated for each. If the
-volumes are defined more than once, then @i{FSinfo} will generate
-a series of alternate entries for them in the maps.@refill
-
-Instead of a tree, either a link (@var{name} @code{->}
-@var{destination}) or a reference can be specified (@var{name} @code{=}
-@var{destination}). A link creates a symbolic link to the string
-specified, without further processing the entry. A reference will
-examine the destination filesystem and optimize the reference. For
-example, to create an entry for @code{njw} in the @file{/homes} map,
-either of the two forms can be used:@refill
-
-@example
-automount /homes @{
- njw -> /home/dylan/njw
-@}
-@end example
-
-or
-
-@example
-automount /homes @{
- njw = /home/dylan/njw
-@}
-@end example
-
-In the first example, when @file{/homes/njw} is referenced from @i{Amd},
-a link will be created leading to @file{/home/dylan/njw} and the
-automounter will be referenced a second time to resolve this filename.
-The map entry would be:
-
-@example
-njw type:=link;fs:=/home/dylan/njw
-@end example
-
-In the second example, the destination directory is analyzed and found
-to be in the filesystem @file{/home/dylan} which has previously been
-defined in the maps. Hence the map entry will look like:
-
-@example
-njw rhost:=dylan;rfs:=/home/dylan;sublink:=njw
-@end example
-
-Creating only one symbolic link, and one access to @i{Amd}.
-
-@node FSinfo Command Line Options, FSinfo errors, FSinfo automount definitions, FSinfo
-@comment node-name, next, previous, up
-@section @i{FSinfo} Command Line Options
-@cindex FSinfo command line options
-@cindex Command line options, FSinfo
-
-@i{FSinfo} is started from the command line by using the command:
-
-@example
-fsinfo [@i{options}] @i{files} ...
-@end example
-
-The input to @i{FSinfo} is a single set of definitions of machines and
-automount maps. If multiple files are given on the command-line, then
-the files are concatenated together to form the input source. The files
-are passed individually through the C pre-processor before being parsed.
-
-Several options define a prefix for the name of an output file. If the
-prefix is not specified no output of that type is produced. The suffix
-used will correspond either to the hostname to which a file belongs, or
-to the type of output if only one file is produced. Dumpsets and the
-@file{bootparams} file are in the latter class. To put the output into
-a subdirectory simply put a @file{/} at the end of the prefix, making
-sure that the directory has already been made before running
-@i{Fsinfo}.
-
-@menu
-* -a FSinfo Option:: Amd automount directory:
-* -b FSinfo Option:: Prefix for bootparams files.
-* -d FSinfo Option:: Prefix for dumpset data files.
-* -e FSinfo Option:: Prefix for exports files.
-* -f FSinfo Option:: Prefix for fstab files.
-* -h FSinfo Option:: Local hostname.
-* -m FSinfo Option:: Prefix for automount maps.
-* -q FSinfo Option:: Ultra quiet mode.
-* -v FSinfo Option:: Verbose mode.
-* -I FSinfo Option:: Define new #include directory.
-* -D-FSinfo Option:: Define macro.
-* -U FSinfo Option:: Undefine macro.
-@end menu
-
-@node -a FSinfo Option, -b FSinfo Option, FSinfo Command Line Options, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-a} @var{autodir}
-
-Specifies the directory name in which to place the automounter's
-mountpoints. This defaults to @file{/a}. Some sites have the autodir set
-to be @file{/amd}, and this would be achieved by:
-
-@example
-fsinfo -a /amd ...
-@end example
-
-@node -b FSinfo Option, -d FSinfo Option, -a FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-b} @var{bootparams}
-@cindex bootparams, FSinfo prefix
-
-This specifies the prefix for the @file{bootparams} filename. If it is
-not given, then the file will not be generated. The @file{bootparams}
-file will be constructed for the destination machine and will be placed
-into a file named @file{bootparams} and prefixed by this string. The
-file generated contains a list of entries describing each diskless
-client that can boot from the destination machine.
-
-As an example, to create a @file{bootparams} file in the directory
-@file{generic}, the following would be used:
-
-@example
-fsinfo -b generic/ ...
-@end example
-
-@node -d FSinfo Option, -e FSinfo Option, -b FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-d} @var{dumpsets}
-@cindex dumpset, FSinfo prefix
-
-This specifies the prefix for the @file{dumpsets} file. If it is not
-specified, then the file will not be generated. The file will be for
-the destination machine and will be placed into a filename
-@file{dumpsets}, prefixed by this string. The @file{dumpsets} file is
-for use by Imperial College's local backup system.
-
-For example, to create a @file{dumpsets} file in the directory @file{generic},
-then you would use the following:
-
-@example
-fsinfo -d generic/ ...
-@end example
-
-@node -e FSinfo Option, -f FSinfo Option, -d FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-e} @var{exportfs}
-@cindex exports, FSinfo prefix
-
-Defines the prefix for the @file{exports} files. If it is not given,
-then the file will not be generated. For each machine defined in the
-configuration files as having disks, an @file{exports} file is
-constructed and given a filename determined by the name of the machine,
-prefixed with this string. If a machine is defined as diskless, then no
-@file{exports} file will be created for it. The files contain entries
-for directories on the machine that may be exported to clients.
-
-Example: To create the @file{exports} files for each diskfull machine
-and place them into the directory @file{exports}:
-
-@example
-fsinfo -e exports/ ...
-@end example
-
-@node -f FSinfo Option, -h FSinfo Option, -e FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-f} @var{fstab}
-@cindex fstab, FSinfo prefix
-
-This defines the prefix for the @file{fstab} files. The files will only
-be created if this prefix is defined. For each machine defined in the
-configuration files, a @file{fstab} file is created with the filename
-determined by prefixing this string with the name of the machine. These
-files contain entries for filesystems and partitions to mount at boot
-time.
-
-Example, to create the files in the directory @file{fstabs}:
-
-@example
-fsinfo -f fstabs/ ...
-@end example
-
-@node -h FSinfo Option, -m FSinfo Option, -f FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-h} @var{hostname}
-@cindex hostname, FSinfo command line option
-
-Defines the hostname of the destination machine to process for. If this
-is not specified, it defaults to the local machine name, as returned by
-@b{gethostname}(2).
-
-Example:
-
-@example
-fsinfo -h dylan.doc.ic.ac.uk ...
-@end example
-
-@node -m FSinfo Option, -q FSinfo Option, -h FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-m} @var{mount-maps}
-@cindex maps, FSinfo command line option
-
-Defines the prefix for the automounter files. The maps will only be
-produced if this prefix is defined. The mount maps suitable for the
-network defined by the configuration files will be placed into files
-with names calculated by prefixing this string to the name of each map.
-
-For example, to create the automounter maps and place them in the
-directory @file{automaps}:
-
-@example
-fsinfo -m automaps/ ...
-@end example
-
-@node -q FSinfo Option, -v FSinfo Option, -m FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-q}
-@cindex quiet, FSinfo command line option
-
-Selects quiet mode. @i{FSinfo} suppress the ``running commentary'' and
-only outputs any error messages which are generated.
-
-@node -v FSinfo Option, -D-FSinfo Option, -q FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-v}
-@cindex verbose, FSinfo command line option
-
-Selects verbose mode. When this is activated, the program will display
-more messages, and display all the information discovered when
-performing the semantic analysis phase. Each verbose message is output
-to @file{stdout} on a line starting with a @samp{#} character.
-
-@node -D-FSinfo Option, -I FSinfo Option, -v FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-D} @var{name}@i{[=defn]}
-
-Defines a symbol @dfn{name} for the preprocessor when reading the
-configuration files. Equivalent to @code{#define} directive.
-
-@node -I FSinfo Option, -U FSinfo Option, -D-FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-I} @var{directory}
-
-This option is passed into the preprocessor for the configuration files.
-It specifies directories in which to find include files
-
-@node -U FSinfo Option, , -I FSinfo Option, FSinfo Command Line Options
-@comment node-name, next, previous, up
-@subsection @code{-U} @var{name}
-
-Removes any initial definition of the symbol @dfn{name}. Inverse of the
-@code{-D} option.
-
-@node FSinfo errors, , FSinfo Command Line Options, FSinfo
-@comment node-name, next, previous, up
-@section Errors produced by @i{FSinfo}
-@cindex FSinfo error messages
-
-The following table documents the errors and warnings which @i{FSinfo} may produce.
-
-@table @t
-
-@item " expected
-Occurs if an unescaped newline is found in a quoted string.
-
-@item ambiguous mount: @var{volume} is a replicated filesystem
-If several filesystems are declared as having the same volume name, they
-will be considered replicated filesystems. To mount a replicated
-filesystem statically, a specific host will need to be named, to say
-which particular copy to try and mount, else this error will
-result.
-
-@item can't open @var{filename} for writing
-Occurs if any errors are encountered when opening an output file.
-
-@item cannot determine localname since volname @var{volume} is not uniquely defined
-If a volume is replicated and an attempt is made to mount the filesystem
-statically without specifying a local mountpoint, @i{FSinfo} cannot
-calculate a mountpoint, as the desired pathname would be
-ambiguous.
-
-@item @var{device} has duplicate exportfs data
-Produced if the @samp{exportfs} option is used multiple times within the
-same branch of a filesystem definition. For example, if you attempt to
-set the @samp{exportfs} data at different levels of the mountpoint
-directory tree.
-
-@item dump frequency for @var{host}:@var{device} is non-zero
-Occurs if @var{device} has its @samp{fstype} declared to be @samp{swap}
-or @samp{export} and the @samp{dump} option is set to a value greater
-than zero. Swap devices should not be dumped.
-
-@item duplicate host @var{hostname}!
-If a host has more than one definition.
-
-@item end of file within comment
-A comment was unterminated before the end of one of the configuration
-files.
-
-@item @var{filename}: cannot open for reading
-If a file specified on the command line as containing configuration data
-could not be opened.
-
-@item @var{filesystem} has a volname but no exportfs data
-Occurs when a volume name is declared for a file system, but the string
-specifying what machines the filesystem can be exported to is
-missing.
-
-@item fs field "@var{field-name}" already set
-Occurs when multiple definitions are given for one of the attributes of a
-host's filesystem.
-
-@item host field "@var{field-name}" already set
-If duplicate definitions are given for any of the fields with a host
-definition.
-
-@item @var{host}:@var{device} has more than one mount point
-Occurs if the mount option for a host's filesystem specifies multiple
-trees at which to place the mountpoint.
-
-@item @var{host}:@var{device} has no mount point
-Occurs if the @samp{mount} option is not specified for a host's
-filesystem.
-
-@item @var{host}:@var{device} needs field "@var{field-name}"
-Occurs when a filesystem is missing a required field. @var{field-name} could
-be one of @samp{fstype}, @samp{opts}, @samp{passno} or
-@samp{mount}.
-
-@item @var{host}:mount field specified for swap partition
-Occurs if a mountpoint is given for a filesystem whose type is declared
-to be @samp{swap}.
-
-@item malformed IP dotted quad: @var{address}
-If the Internet address of an interface is incorrectly specified. An
-Internet address definition is handled to @b{inet_addr}(3N) to see if it
-can cope. If not, then this message will be displayed.
-
-@item malformed netmask: @var{netmask}
-If the netmask cannot be decoded as though it were a hexadecimal number,
-then this message will be displayed. It will typically be caused by
-incorrect characters in the @var{netmask} value.
-
-@item mount field "@var{field-name}" already set
-Occurs when a static mount has multiple definitions of the same field.
-
-@item mount tree field "@var{field-name}" already set
-Occurs when the @var{field-name} is defined more than once during the
-definition of a filesystems mountpoint.
-
-@item netif field @var{field-name} already set
-Occurs if you attempt to define an attribute of an interface more than
-once.
-
-@item network booting requires both root and swap areas
-Occurs if a machine has mount declarations for either the root partition
-or the swap area, but not both. You cannot define a machine to only
-partially boot via the network.
-
-@item no disk mounts on @var{hostname}
-If there are no static mounts, nor local disk mounts specified for a
-machine, this message will be displayed.
-
-@item no volname given for @var{host}:@var{device}
-Occurs when a filesystem is defined to be mounted on @file{default}, but
-no volume name is given for the file system, then the mountpoint cannot
-be determined.
-
-@item not allowed '/' in a directory name
-Occurs when a pathname with multiple directory elements is specified as
-the name for an automounter tree. A tree should only have one name at
-each level.
-
-@item pass number for @var{host}:@var{device} is non-zero
-Occurs if @var{device} has its @samp{fstype} declared to be @samp{swap}
-or @samp{export} and the @b{fsck}(8) pass number is set. Swap devices
-should not be fsck'd. @xref{FSinfo fstype Option}.
-
-@item sub-directory @var{directory} of @var{directory-tree} starts with '/'
-Within the filesystem specification for a host, if an element
-@var{directory} of the mountpoint begins with a @samp{/} and it is not
-the start of the tree.
-
-@item sub-directory of @var{directory-tree} is named "default"
-@samp{default} is a keyword used to specify if a mountpoint should be
-automatically calculated by @i{FSinfo}. If you attempt to specify a
-directory name as this, it will use the filename of @file{default} but
-will produce this warning.
-
-@item unknown \ sequence
-Occurs if an unknown escape sequence is found inside a string. Within a
-string, you can give the standard C escape sequences for strings, such
-as newlines and tab characters.
-
-@item unknown directory attribute
-If an unknown keyword is found while reading the definition of a host's
-filesystem mount option.
-
-@item unknown filesystem attribute
-Occurs if an unrecognized keyword is used when defining a host's
-filesystems.
-
-@item unknown host attribute
-Occurs if an unrecognized keyword is used when defining a host.
-
-@item unknown mount attribute
-Occurs if an unrecognized keyword is found while parsing the list of
-static mounts.
-
-@item unknown volname @var{volume} automounted @i{[} on @i{name} @i{]}
-Occurs if @var{volume} is used in a definition of an automount map but the volume
-name has not been declared during the host filesystem definitions.
-
-@item volname @var{volume} is unknown
-Occurs if an attempt is made to mount or reference a volume name which
-has not been declared during the host filesystem definitions.
-
-@item volname @var{volume} not exported from @var{machine}
-Occurs if you attempt to mount the volume @var{volume} from a machine
-which has not declared itself to have such a filesystem
-available.
-
-@end table
-
-@c ################################################################
-@node Hlfsd, Assorted Tools, FSinfo, Top
-@comment node-name, next, previous, up
-@chapter Hlfsd
-@pindex Hlfsd
-@cindex Home-Link Filesystem
-
-@i{Hlfsd} is a daemon which implements a filesystem containing a
-symbolic link to subdirectory within a user's home directory, depending
-on the user which accessed that link. It was primarily designed to
-redirect incoming mail to users' home directories, so that it can be read
-from anywhere. It was designed and implemented by
-@email{ezk@@cs.columbia.edu,Erez Zadok} and
-@email{dupuy@@cs.columbia.edu,Alexander Dupuy}, at the
-@uref{http://www.cs.columbia.edu/,Computer Science Department} of
-@uref{http://www.columbia.edu/,Columbia University}. A
-@uref{http://www.fsl.cs.sunysb.edu/docs/hlfsd/hlfsd.html,paper}
-on @i{Hlfsd} was presented at the Usenix LISA VII conference in 1993.
-
-@i{Hlfsd} operates by mounting itself as an NFS server for the directory
-containing @i{linkname}, which defaults to @file{/hlfs/home}. Lookups
-within that directory are handled by @i{Hlfsd}, which uses the
-password map to determine how to resolve the lookup. The directory will
-be created if it doesn't already exist. The symbolic link will be to
-the accessing user's home directory, with @i{subdir} appended to it. If
-not specified, @i{subdir} defaults to @file{.hlfsdir}. This directory
-will also be created if it does not already exist.
-
-A @samp{SIGTERM} sent to @i{Hlfsd} will cause it to shutdown. A
-@samp{SIGHUP} will flush the internal caches, and reload the password
-map. It will also close and reopen the log file, to enable the original
-log file to be removed or rotated. A @samp{SIGUSR1} will cause it to
-dump its internal table of user IDs and home directories to the file
-@file{/tmp/hlfsddump}.
-
-@menu
-* Introduction to Hlfsd::
-* Background to Mail Delivery::
-* Using Hlfsd::
-@end menu
-
-@c ================================================================
-@node Introduction to Hlfsd, Background to Mail Delivery, Hlfsd, Hlfsd
-@comment node-name, next, previous, up
-@section Introduction to Hlfsd
-@cindex Introduction to Hlfsd
-@cindex Hlfsd; introduction
-
-Electronic mail has become one of the major applications for many
-computer networks, and use of this service is expected to increase over
-time, as networks proliferate and become faster. Providing a convenient
-environment for users to read, compose, and send electronic mail has
-become a requirement for systems administrators (SAs).
-
-Widely used methods for handling mail usually require users to be logged
-into a designated ``home'' machine, where their mailbox files reside.
-Only on that one machine can they read newly arrived mail. Since users
-have to be logged into that system to read their mail, they often find
-it convenient to run all of their other processes on that system as
-well, including memory and CPU-intensive jobs. For example, in our
-department, we have allocated and configured several multi-processor
-servers to handle such demanding CPU/memory applications, but these were
-underutilized, in large part due to the inconvenience of not being able
-to read mail on those machines. (No home directories were located on
-these designated CPU-servers, since we did not want NFS service for
-users' home directories to have to compete with CPU-intensive jobs. At the
-same time, we discouraged users from running demanding applications on
-their home machines.)
-
-Many different solutions have been proposed to allow users to read their
-mail on any host. However, all of these solutions fail in one or more
-of several ways:
-
-@itemize @bullet
-
-@item
-they introduce new single points of failure
-
-@item
-they require using different mail transfer agents (MTAs) or user agents
-(UAs)
-
-@item
-they do not solve the problem for all cases, i.e. the solution is only
-partially successful for a particular environment.
-
-@end itemize
-
-We have designed a simple filesystem, called the @dfn{Home-Link File
-System}, to provide the ability to deliver mail to users' home
-directories, without modification to mail-related applications. We have
-endeavored to make it as stable as possible. Of great importance to us
-was to make sure the HLFS daemon, @file{hlfsd} , would not hang under
-any circumstances, and would take the next-best action when faced with
-problems. Compared to alternative methods, @i{Hlfsd} is a stable, more
-general solution, and easier to install/use. In fact, in some ways, we
-have even managed to improve the reliability and security of mail
-service.
-
-Our server implements a small filesystem containing a symbolic link
-to a subdirectory of the invoking user's home directory, and named symbolic
-links to users' mailbox files.
-
-The @i{Hlfsd} server finds out the @var{uid} of the process that is
-accessing its mount point, and resolves the pathname component @samp{home} as a
-symbolic link to a subdirectory within the home directory given by the
-@var{uid}'s entry in the password file. If the @var{gid} of the process
-that attempts to access a mailbox file is a special one (called
-HLFS_GID), then the server maps the name of the @emph{next} pathname
-component directly to the user's mailbox. This is necessary so that
-access to a mailbox file by users other than the owner can succeed. The
-server has safety features in case of failures such as hung filesystems
-or home directory filesystems that are inaccessible or full.
-
-On most of our machines, mail gets delivered to the directory
-@file{/var/spool/mail}. Many programs, including UAs, depend on that
-path. @i{Hlfsd} creates a directory @file{/mail}, and mounts itself on
-top of that directory. @i{Hlfsd} implements the path name component
-called @samp{home}, pointing to a subdirectory of the user's home directory.
-We have made @file{/var/spool/mail} a symbolic link to
-@file{/mail/home}, so that accessing @file{/var/spool/mail} actually
-causes access to a subdirectory within a user's home directory.
-
-The following table shows an example of how resolving the pathname
-@file{/var/mail/@i{NAME}} to @file{/users/ezk/.mailspool/@i{NAME}} proceeds.
-
-@multitable {Resolving Component} {Pathname left to resolve} {Value if symbolic link}
-
-@item @b{Resolving Component}
-@tab @b{Pathname left to resolve}
-@tab @b{Value if symbolic link}
-
-@item @t{/}
-@tab @t{var/mail/}@i{NAME}
-
-@item @t{var/}
-@tab @t{mail/}@i{NAME}
-
-@item @t{mail}@@
-@tab @t{/mail/home/}@i{NAME}
-@tab @t{mail}@@ -> @t{/mail/home}
-
-@item @t{/}
-@tab @t{mail/home/}@i{NAME}
-
-@item @t{mail/}
-@tab @t{home/}@i{NAME}
-
-@item @t{home}@@
-@tab @i{NAME}
-@tab @t{home}@@ -> @t{/users/ezk/.mailspool}
-
-@item @t{/}
-@tab @t{users/ezk/.mailspool/}@i{NAME}
-
-@item @t{users/}
-@tab @t{ezk/.mailspool/}@i{NAME}
-
-@item @t{ezk/}
-@tab @t{.mailspool/}@i{NAME}
-
-@item @t{.mailspool/}
-@tab @i{NAME}
-
-@item @i{NAME}
-
-@end multitable
-
-@c ================================================================
-@node Background to Mail Delivery, Using Hlfsd, Introduction to Hlfsd, Hlfsd
-@comment node-name, next, previous, up
-@section Background to Mail Delivery
-@cindex Background to Mail Delivery
-@cindex Hlfsd; background
-
-This section provides an in-depth discussion of why available methods
-for delivering mail to home directories are not as good as the one used
-by @i{Hlfsd}.
-
-@menu
-* Single-Host Mail Spool Directory::
-* Centralized Mail Spool Directory::
-* Distributed Mail Spool Service::
-* Why Deliver Into the Home Directory?::
-@end menu
-
-@c ----------------------------------------------------------------
-@node Single-Host Mail Spool Directory, Centralized Mail Spool Directory, Background to Mail Delivery, Background to Mail Delivery
-@comment node-name, next, previous, up
-@subsection Single-Host Mail Spool Directory
-@cindex Single-Host Mail Spool Directory
-
-The most common method for mail delivery is for mail to be appended to a
-mailbox file in a standard spool directory on the designated ``mail
-home'' machine of the user. The greatest advantage of this method is
-that it is the default method most vendors provide with their systems,
-thus very little (if any) configuration is required on the SA's part.
-All they need to set up are mail aliases directing mail to the host on
-which the user's mailbox file is assigned. (Otherwise, mail is
-delivered locally, and users find mailboxes on many machines.)
-
-As users become more sophisticated, and aided by windowing systems, they
-find themselves logging in on multiple hosts at once, performing several
-tasks concurrently. They ask to be able to read their mail on any host
-on the network, not just the one designated as their ``mail home''.
-
-@c ----------------------------------------------------------------
-@node Centralized Mail Spool Directory, Distributed Mail Spool Service, Single-Host Mail Spool Directory, Background to Mail Delivery
-@comment node-name, next, previous, up
-@subsection Centralized Mail Spool Directory
-@cindex Centralized Mail Spool Directory
-
-A popular method for providing mail readability from any host is to have
-all mail delivered to a mail spool directory on a designated
-``mail-server'' which is exported via NFS to all of the hosts on the
-network. Configuring such a system is relatively easy. On most
-systems, the bulk of the work is a one-time addition to one or two
-configuration files in @file{/etc}. The file-server's spool directory
-is then hard-mounted across every machine on the local network. In
-small environments with only a handful of hosts this can be an
-acceptable solution. In our department, with a couple of hundred active
-hosts and thousands of mail messages processed daily, this was deemed
-completely unacceptable, as it introduced several types of problems:
-
-@table @b
-
-@item Scalability and Performance
-
-As more and more machines get added to the network, more mail traffic
-has to go over NFS to and from the mail-server. Users like to run
-mail-watchers, and read their mail often. The stress on the shared
-infrastructure increases with every user and host added; loads on the
-mail server would most certainly be high since all mail delivery goes
-through that one machine.@footnote{ Delivery via NFS-mounted filesystems
-may require usage of @samp{rpc.lockd} and @samp{rpc.statd} to provide
-distributed file-locking, both of which are widely regarded as unstable
-and unreliable. Furthermore, this will degrade performance, as local
-processes as well as remote @samp{nfsd} processes are kept busy.} This
-leads to lower reliability and performance. To reduce the number of
-concurrent connections between clients and the server host, some SAs
-have resorted to automounting the mail-spool directory. But this
-solution only makes things worse: since users often run mail watchers,
-and many popular applications such as @samp{trn}, @samp{emacs},
-@samp{csh} or @samp{ksh} check periodically for new mail, the
-automounted directory would be effectively permanently mounted. If it
-gets unmounted automatically by the automounter program, it is most
-likely to get mounted shortly afterwards, consuming more I/O resources
-by the constant cycle of mount and umount calls.
-
-@item Reliability
-
-The mail-server host and its network connectivity must be very reliable.
-Worse, since the spool directory has to be hard-mounted,@footnote{No SA
-in their right minds would soft-mount read/write partitions --- the
-chances for data loss are too great.} many processes which access the
-spool directory (various shells, @samp{login}, @samp{emacs}, etc.)
-would be hung as long as connectivity to the mail-server is severed. To
-improve reliability, SAs may choose to backup the mail-server's spool
-partition several times a day. This may make things worse since reading
-or delivering mail while backups are in progress may cause backups to be
-inconsistent; more backups consume more backup-media resources, and
-increase the load on the mail-server host.
-
-@end table
-
-@c ----------------------------------------------------------------
-@node Distributed Mail Spool Service, Why Deliver Into the Home Directory?, Centralized Mail Spool Directory, Background to Mail Delivery
-@comment node-name, next, previous, up
-@subsection Distributed Mail Spool Service
-@cindex Distributed Mail Spool Service
-
-Despite the existence of a few systems that support delivery to users'
-home directories, mail delivery to home directories hasn't caught on.
-We believe the main reason is that there are too many programs that
-``know'' where mailbox files reside. Besides the obvious (the delivery
-program @file{/bin/mail} and mail readers like @file{/usr/ucb/Mail},
-@samp{mush}, @samp{mm}, etc.), other programs that know mailbox location
-are login, from, almost every shell, @samp{xbiff}, @samp{xmailbox}, and
-even some programs not directly related to mail, such as @samp{emacs}
-and @samp{trn}. Although some of these programs can be configured to
-look in different directories with the use of environment variables and
-other resources, many of them cannot. The overall porting work is
-significant.
-
-Other methods that have yet to catch on require the use of a special
-mail-reading server, such as IMAP or POP. The main disadvantage of
-these systems is that UAs need to be modified to use these services ---
-a long and involved task. That is why they are not popular at this
-time.
-
-Several other ideas have been proposed and even used in various
-environments. None of them is robust. They are mostly very
-specialized, inflexible, and do not extend to the general case. Some of
-the ideas are plain bad, potentially leading to lost or corrupt mail:
-
-@table @b
-
-@item automounters
-
-Using an automounter such as @i{Amd} to provide a set of symbolic links
-from the normal spool directory to user home directories is not
-sufficient. UAs rename, unlink, and recreate the mailbox as a regular
-file, therefore it must be a real file, not a symbolic link.
-Furthermore, it must reside in a real directory which is writable by the
-UAs and MTAs. This method may also require populating
-@file{/var/spool/mail} with symbolic links and making sure they are
-updated. Making @i{Amd} manage that directory directly fails, since
-many various lock files need to be managed as well. Also, @i{Amd} does
-not provide all of the NFS operations which are required to write mail
-such as write, create, remove, and unlink.
-
-@item @code{$MAIL}
-
-Setting this variable to an automounted directory pointing to the user's
-mail spool host only solves the problem for those programs which know
-and use @code{$MAIL}. Many programs don't, therefore this solution is partial
-and of limited flexibility. Also, it requires the SAs or the users to
-set it themselves --- an added level of inconvenience and possible
-failures.
-
-@item @t{/bin/mail}
-
-Using a different mail delivery agent could be the solution. One such
-example is @samp{hdmail}. However, @samp{hdmail} still requires
-modifying all UAs, the MTA's configuration, installing new daemons, and
-changing login scripts. This makes the system less upgradable or
-compatible with others, and adds one more complicated system for SAs to
-deal with. It is not a complete solution because it still requires each
-user have their @code{$MAIL} variable setup correctly, and that every program
-use this variable.
-
-@end table
-
-@c ----------------------------------------------------------------
-@node Why Deliver Into the Home Directory?, , Distributed Mail Spool Service, Background to Mail Delivery
-@comment node-name, next, previous, up
-@subsection Why Deliver Into the Home Directory?
-@cindex Why Deliver Into the Home Directory?
-@cindex Hlfsd; Why Deliver Into the Home Directory?
-
-There are several major reasons why SAs might want to deliver mail
-directly into the users' home directories:
-
-@table @b
-
-@item Location
-
-Many mail readers need to move mail from the spool directory to the
-user's home directory. It speeds up this operation if the two are on
-the same filesystem. If for some reason the user's home directory is
-inaccessible, it isn't that useful to be able to read mail, since there
-is no place to move it to. In some cases, trying to move mail to a
-non-existent or hung filesystem may result in mail loss.
-
-@item Distribution
-
-Having all mail spool directories spread among the many more filesystems
-minimizes the chances that complete environments will grind to a halt
-when a single server is down. It does increase the chance that there
-will be someone who is not able to read their mail when a machine is
-down, but that is usually preferred to having no one be able to read
-their mail because a centralized mail server is down. The problem of
-losing some mail due to the (presumably) higher chances that a user's
-machine is down is minimized in HLFS.
-
-@item Security
-
-Delivering mail to users' home directories has another advantage ---
-enhanced security and privacy. Since a shared system mail spool
-directory has to be world-readable and searchable, any user can see
-whether other users have mail, when they last received new mail, or when
-they last read their mail. Programs such as @samp{finger} display this
-information, which some consider an infringement of privacy. While it
-is possible to disable this feature of @samp{finger} so that remote
-users cannot see a mailbox file's status, this doesn't prevent local
-users from getting the information. Furthermore, there are more
-programs which make use of this information. In shared environments,
-disabling such programs has to be done on a system-wide basis, but with
-mail delivered to users' home directories, users less concerned with
-privacy who do want to let others know when they last received or read
-mail can easily do so using file protection bits.
-
-@c Lastly, on systems that do not export their NFS filesystem with
-@c @t{anon=0}, superusers are less likely to snoop around others' mail, as
-@c they become ``nobodies'' across NFS.
-
-@end table
-
-In summary, delivering mail to home directories provides users the
-functionality sought, and also avoids most of the problems just
-discussed.
-
-@c ================================================================
-@node Using Hlfsd, , Background to Mail Delivery, Hlfsd
-@comment node-name, next, previous, up
-@section Using Hlfsd
-@cindex Using Hlfsd
-@cindex Hlfsd; using
-
-@menu
-* Controlling Hlfsd::
-* Hlfsd Options::
-* Hlfsd Files::
-@end menu
-
-@c ----------------------------------------------------------------
-@node Controlling Hlfsd, Hlfsd Options, Using Hlfsd, Using Hlfsd
-@comment node-name, next, previous, up
-@subsection Controlling Hlfsd
-@cindex Controlling Hlfsd
-@cindex Hlfsd; controlling
-@pindex ctl-hlfsd
-
-Much the same way @i{Amd} is controlled by @file{ctl-amd}, so does
-@i{Hlfsd} get controlled by the @file{ctl-hlfsd} script:
-
-@table @t
-
-@item ctl-hlfsd start
-Start a new @i{Hlfsd}.
-
-@item ctl-hlfsd stop
-Stop a running @i{Hlfsd}.
-
-@item ctl-hlfsd restart
-Stop a running @i{Hlfsd}, wait for 10 seconds, and then start a new
-one. It is hoped that within 10 seconds, the previously running
-@i{Hlfsd} terminate properly; otherwise, starting a second one could
-cause system lockup.
-
-@end table
-
-For example, on our systems, we start @i{Hlfsd} within @file{ctl-hlfsd}
-as follows on Solaris 2 systems:
-
-@example
-hlfsd -a /var/alt_mail -x all -l /var/log/hlfsd /mail/home .mailspool
-@end example
-
-The directory @file{/var/alt_mail} is a directory in the root partition
-where alternate mail will be delivered into, when it cannot be delivered
-into the user's home directory.
-
-Normal mail gets delivered into @file{/var/mail}, but on our systems,
-that is a symbolic link to @file{/mail/home}. @file{/mail} is managed
-by @i{Hlfsd}, which creates a dynamic symlink named @samp{home},
-pointing to the subdirectory @file{.mailspool} @emph{within} the
-accessing user's home directory. This results in mail which normally
-should go to @file{/var/mail/@code{$USER}}, to go to
-@file{@code{$HOME}/.mailspool/@code{$USER}}.
-
-@i{Hlfsd} does not create the @file{/var/mail} symlink. This needs to
-be created (manually) once on each host, by the system administrators,
-as follows:
-
-@example
-mv /var/mail /var/alt_mail
-ln -s /mail/home /var/mail
-@end example
-
-@i{Hlfsd} also responds to the following signals:
-
-A @samp{SIGHUP} signal sent to @i{Hlfsd} will force it to reload the
-password map immediately.
-
-A @samp{SIGUSR1} signal sent to @i{Hlfsd} will cause it to dump its
-internal password map to the file @file{/usr/tmp/hlfsd.dump.XXXXXX},
-where @samp{XXXXXX} will be replaced by a random string generated by
-@b{mktemp}(3) or (the more secure) @b{mkstemp}(3).
-
-@c ----------------------------------------------------------------
-@node Hlfsd Options, Hlfsd Files, Controlling Hlfsd, Using Hlfsd
-@comment node-name, next, previous, up
-@subsection Hlfsd Options
-@cindex Hlfsd Options
-@cindex Hlfsd; Options
-
-@table @t
-
-@item -a @var{alt_dir}
-Alternate directory. The name of the directory to which the symbolic
-link returned by @i{Hlfsd} will point, if it cannot access the home
-directory of the user. This defaults to @file{/var/hlfs}. This
-directory will be created if it doesn't exist. It is expected that
-either users will read these files, or the system administrators will
-run a script to resend this ``lost mail'' to its owner.
-
-@item -c @var{cache-interval}
-Caching interval. @i{Hlfsd} will cache the validity of home directories
-for this interval, in seconds. Entries which have been verified within
-the last @var{cache-interval} seconds will not be verified again, since
-the operation could be expensive, and the entries are most likely still
-valid. After the interval has expired, @i{Hlfsd} will re-verify the
-validity of the user's home directory, and reset the cache time-counter.
-The default value for @var{cache-interval} is 300 seconds (5 minutes).
-
-@item -f
-Force fast startup. This option tells @i{Hlfsd} to skip startup-time
-consistency checks such as existence of mount directory, alternate spool
-directory, symlink to be hidden under the mount directory, their
-permissions and validity.
-
-@item -g @var{group}
-Set the special group HLFS_GID to @var{group}. Programs such as
-@file{/usr/ucb/from} or @file{/usr/sbin/in.comsat}, which access the
-mailboxes of other users, must be setgid @samp{HLFS_GID} to work properly. The
-default group is @samp{hlfs}. If no group is provided, and there is no
-group @samp{hlfs}, this feature is disabled.
-
-@item -h
-Help. Print a brief help message, and exit.
-
-@item -i @var{reload-interval}
-Map-reloading interval. Each @var{reload-interval} seconds, @i{Hlfsd}
-will reload the password map. @i{Hlfsd} needs the password map for the
-UIDs and home directory pathnames. @i{Hlfsd} schedules a @samp{SIGALRM} to
-reload the password maps. A @samp{SIGHUP} sent to @i{Hlfsd} will force it to
-reload the maps immediately. The default value for
-@var{reload-interval} is 900 seconds (15 minutes.)
-
-@item -l @var{logfile}
-Specify a log file to which @i{Hlfsd} will record events. If
-@var{logfile} is the string @samp{syslog} then the log messages will be
-sent to the system log daemon by @b{syslog}(3), using the @samp{LOG_DAEMON}
-facility. This is also the default.
-
-@item -n
-No verify. @i{Hlfsd} will not verify the validity of the symbolic link
-it will be returning, or that the user's home directory contains
-sufficient disk-space for spooling. This can speed up @i{Hlfsd} at the
-cost of possibly returning symbolic links to home directories which are
-not currently accessible or are full. By default, @i{Hlfsd} validates
-the symbolic-link in the background. The @code{-n} option overrides the
-meaning of the @code{-c} option, since no caching is necessary.
-
-@item -o @var{mount-options}
-Mount options which @i{Hlfsd} will use to mount itself on top of
-@var{dirname}. By default, @var{mount-options} is set to @samp{ro}. If
-the system supports symbolic-link caching, default options are set
-to @samp{ro,nocache}.
-
-@item -p
-Print PID. Outputs the process-id of @i{Hlfsd} to standard output where
-it can be saved into a file.
-
-@item -v
-Version. Displays version information to standard error.
-
-@item -x @var{log-options}
-Specify run-time logging options. The options are a comma separated
-list chosen from: @samp{fatal}, @samp{error}, @samp{user}, @samp{warn}, @samp{info}, @samp{map}, @samp{stats}, @samp{all}.
-
-@item -C
-Force @i{Hlfsd} to run on systems that cannot turn off the NFS
-attribute-cache. Use of this option on those systems is discouraged, as
-it may result in loss or misdelivery of mail. The option is ignored on
-systems that can turn off the attribute-cache.
-
-@item -D @var{log-options}
-Select from a variety of debugging options. Prefixing an option with
-the string @samp{no} reverses the effect of that option. Options are
-cumulative. The most useful option is @samp{all}. Since this option is
-only used for debugging other options are not documented here. A fuller
-description is available in the program source.
-
-@item -P @var{password-file}
-Read the user-name, user-id, and home directory information from the
-file @var{password-file}. Normally, @i{Hlfsd} will use @b{getpwent}(3)
-to read the password database. This option allows you to override the
-default database, and is useful if you want to map users' mail files to
-a directory other than their home directory. Only the username, uid,
-and home-directory fields of the file @var{password-file} are read and
-checked. All other fields are ignored. The file @var{password-file}
-must otherwise be compliant with Unix Version 7 colon-delimited format
-@b{passwd}(4).
-
-@end table
-
-@c ----------------------------------------------------------------
-@node Hlfsd Files, , Hlfsd Options, Using Hlfsd
-@comment node-name, next, previous, up
-@subsection Hlfsd Files
-@cindex Hlfsd Files
-@cindex Hlfsd; Files
-
-The following files are used by @i{Hlfsd}:
-
-@table @file
-
-@item /hlfs
-directory under which @i{Hlfsd} mounts itself and manages the symbolic
-link @file{home}.
-
-@item .hlfsdir
-default sub-directory in the user's home directory, to which the
-@file{home} symbolic link returned by @i{Hlfsd} points.
-
-@item /var/hlfs
-directory to which @file{home} symbolic link returned by @i{Hlfsd}
-points if it is unable to verify the that user's home directory is
-accessible.
-
-@item /usr/tmp/hlfsd.dump.XXXXXX
-file to which @i{Hlfsd} will dump its internal password map when it
-receives the @samp{SIGUSR1} signal. @samp{XXXXXX} will be replaced by
-a random string generated by @b{mktemp}(3) or (the more secure)
-@b{mkstemp}(3).
-
-@end table
-
-For discussion on other files used by @i{Hlfsd}, see @xref{lostaltmail}, and
-@ref{lostaltmail.conf-sample}.
-
-@c ################################################################
-@node Assorted Tools, Examples, Hlfsd, Top
-@comment node-name, next, previous, up
-@chapter Assorted Tools
-@cindex Assorted Tools
-
-The following are additional utilities and scripts included with
-am-utils, and get installed.
-
-@menu
-* am-eject::
-* amd.conf-sample::
-* amd2ldif::
-* amd2sun::
-* automount2amd::
-* ctl-amd::
-* ctl-hlfsd::
-* expn::
-* fix-amd-map::
-* fixmount::
-* fixrmtab::
-* lostaltmail::
-* lostaltmail.conf-sample::
-* mk-amd-map::
-* pawd::
-* redhat-ctl-amd::
-* wait4amd::
-* wait4amd2die::
-* wire-test::
-@end menu
-
-@c ----------------------------------------------------------------
-@node am-eject, amd.conf-sample, Assorted Tools, Assorted Tools
-@comment node-name, next, previous, up
-@section am-eject
-@pindex am-eject
-
-A shell script unmounts a floppy or CD-ROM that is automounted, and
-then attempts to eject the removable device.
-
-@c ----------------------------------------------------------------
-@node amd.conf-sample, amd2ldif, am-eject, Assorted Tools
-@comment node-name, next, previous, up
-@section amd.conf-sample
-@pindex amd.conf-sample
-
-A sample @i{Amd} configuration file. @xref{Amd Configuration File}.
-
-@c ----------------------------------------------------------------
-@node amd2ldif, amd2sun, amd.conf-sample, Assorted Tools
-@comment node-name, next, previous, up
-@section amd2ldif
-@pindex amd2ldif
-
-A script to convert @i{Amd} maps to LDAP input files. Use it as follows:
-
-@example
-amd2ldif @i{mapname} @i{base} < @i{amd.mapfile} > @i{mapfile.ldif}
-@end example
-
-@c ----------------------------------------------------------------
-@node amd2sun, automount2amd, amd2ldif, Assorted Tools
-@comment node-name, next, previous, up
-@section amd2sun
-@pindex amd2sun
-
-A script to convert @i{Amd} maps to Sun Automounter maps. Use it as
-follows
-
-@example
-amd2sun < @i{amd.mapfile} > @i{auto_mapfile}
-@end example
-
-@c ----------------------------------------------------------------
-@node automount2amd, ctl-amd, amd2sun, Assorted Tools
-@comment node-name, next, previous, up
-@section automount2amd
-@pindex automount2amd
-
-A script to convert old Sun Automounter maps to @i{Amd} maps.
-
-Say you have the Sun automount file @i{auto.foo}, with these two lines:
-@example
-home earth:/home
-moon -ro,intr server:/proj/images
-@end example
-Running
-@example
-automount2amd auto.foo > amd.foo
-@end example
-
-will produce the @i{Amd} map @i{amd.foo} with this content:
-
-@example
-# generated by automount2amd on Sat Aug 14 17:59:32 US/Eastern 1999
-
-/defaults \\
- type:=nfs;opts:=rw,grpid,nosuid,utimeout=600
-
-home \
- host==earth;type:=link;fs:=/home \\
- rhost:=earth;rfs:=/home
-
-moon \
- -addopts:=ro,intr \\
- host==server;type:=link;fs:=/proj/images \\
- rhost:=server;rfs:=/proj/images
-@end example
-
-This perl script will use the following @i{/default} entry
-@example
-type:=nfs;opts:=rw,grpid,nosuid,utimeout=600
-@end example
-If you wish to override that, define the @b{$DEFAULTS} environment
-variable, or modify the script.
-
-If you wish to generate Amd maps using the @i{hostd} (@pxref{hostd
-Selector Variable}) @i{Amd} map syntax, then define the environment
-variable @b{$DOMAIN} or modify the script.
-
-Note that automount2amd does not understand the syntax in newer Sun
-Automount maps, those used with autofs.
-
-@c ----------------------------------------------------------------
-@node ctl-amd, ctl-hlfsd, automount2amd, Assorted Tools
-@comment node-name, next, previous, up
-@section ctl-amd
-@pindex ctl-amd
-
-A script to start, stop, or restart @i{Amd}. Use it as follows:
-
-@table @t
-@item ctl-amd start
-Start a new @i{Amd} process.
-@item ctl-amd stop
-Stop the running @i{Amd}.
-@item ctl-amd restart
-Stop the running @i{Amd} (if any), safely wait for it to terminate, and
-then start a new process --- only if the previous one died cleanly.
-@end table
-
-@xref{Run-time Administration}, for more details.
-
-@c ----------------------------------------------------------------
-@node ctl-hlfsd, expn, ctl-amd, Assorted Tools
-@comment node-name, next, previous, up
-@section ctl-hlfsd
-@pindex ctl-hlfsd
-
-A script for controlling @i{Hlfsd}, much the same way @file{ctl-amd}
-controls @i{Amd}. Use it as follows:
-
-@table @t
-@item ctl-hlfsd start
-Start a new @i{Hlfsd} process.
-@item ctl-hlfsd stop
-Stop the running @i{Hlfsd}.
-@item ctl-hlfsd restart
-Stop the running @i{Hlfsd} (if any), wait for 10 seconds for it to
-terminate, and then start a new process --- only if the previous one
-died cleanly.
-@end table
-
-@xref{Hlfsd}, for more details.
-
-@c ----------------------------------------------------------------
-@node expn, fix-amd-map, ctl-hlfsd, Assorted Tools
-@comment node-name, next, previous, up
-@section expn
-@pindex expn
-
-A script to expand email addresses into their full name. It is
-generally useful when using with the @file{lostaltmail} script, but is a
-useful tools otherwise.
-
-@example
-$ expn -v ezk@@cs.columbia.edu
-ezk@@cs.columbia.edu ->
- ezk@@shekel.mcl.cs.columbia.edu
-ezk@@shekel.mcl.cs.columbia.edu ->
- Erez Zadok <"| /usr/local/mh/lib/slocal -user ezk || exit 75>
- Erez Zadok <\ezk>
- Erez Zadok </u/zing/ezk/.mailspool/backup>
-@end example
-
-@c ----------------------------------------------------------------
-@node fix-amd-map, fixmount, expn, Assorted Tools
-@comment node-name, next, previous, up
-@section fix-amd-map
-@pindex fix-amd-map
-
-Am-utils changed some of the syntax and default values of some
-variables. For example, the default value for @samp{$@{os@}} for
-Solaris 2.x (aka SunOS 5.x) systems used to be @samp{sos5}, it is now
-more automatically generated from @file{config.guess} and its value is
-@samp{sunos5}.
-
-This script converts older @i{Amd} maps to new ones. Use it as follows:
-
-@example
-fix-amd-map < @i{old.map} > @i{new.map}
-@end example
-
-@c ----------------------------------------------------------------
-@node fixmount, fixrmtab, fix-amd-map, Assorted Tools
-@comment node-name, next, previous, up
-@section fixmount
-@pindex fixmount
-
-@samp{fixmount} is a variant of @b{showmount}(8) that can delete bogus
-mount entries in remote @b{mountd}(8) daemons. This is useful to
-cleanup otherwise ever-accumulating ``junk''. Use it for example:
-
-@example
-fixmount -r @i{host}
-@end example
-
-See the online manual page for @samp{fixmount} for more details of its
-usage.
-
-@c ----------------------------------------------------------------
-@node fixrmtab, lostaltmail, fixmount, Assorted Tools
-@comment node-name, next, previous, up
-@section fixrmtab
-@pindex fixrmtab
-
-A script to invalidate @file{/etc/rmtab} entries for hosts named. Also
-restart mountd for changes to take effect. Use it for example:
-
-@example
-fixrmtab @i{host1} @i{host2} @i{...}
-@end example
-
-@c ----------------------------------------------------------------
-@node lostaltmail, lostaltmail.conf-sample, fixrmtab, Assorted Tools
-@comment node-name, next, previous, up
-@section lostaltmail
-@pindex lostaltmail
-
-A script used with @i{Hlfsd} to resend any ``lost'' mail. @i{Hlfsd}
-redirects mail which cannot be written into the user's home directory to
-an alternate directory. This is useful to continue delivering mail,
-even if the user's file system was unavailable, full, or over quota.
-But, the mail which gets delivered to the alternate directory needs to
-be resent to its respective users. This is what the @samp{lostaltmail}
-script does.
-
-Use it as follows:
-
-@example
-lostaltmail
-@end example
-
-This script needs a configuration file @samp{lostaltmail.conf} set up
-with the right parameters to properly work. @xref{Hlfsd}, for more
-details.
-
-@c ----------------------------------------------------------------
-@node lostaltmail.conf-sample, mk-amd-map, lostaltmail, Assorted Tools
-@comment node-name, next, previous, up
-@section lostaltmail.conf-sample
-@pindex lostaltmail.conf-sample
-@cindex lostaltmail; configuration file
-
-This is a text file with configuration parameters needed for the
-@samp{lostaltmail} script. The script includes comments explaining each
-of the configuration variables. See it for more information. Also
-@pxref{Hlfsd} for general information.
-
-@c ----------------------------------------------------------------
-@node mk-amd-map, pawd, lostaltmail.conf-sample, Assorted Tools
-@comment node-name, next, previous, up
-@section mk-amd-map
-@pindex mk-amd-map
-
-This program converts a normal @i{Amd} map file into an ndbm database
-with the same prefix as the named file. Use it as follows:
-
-@example
-mk-amd-map @i{mapname}
-@end example
-
-@c ----------------------------------------------------------------
-@node pawd, redhat-ctl-amd, mk-amd-map, Assorted Tools
-@comment node-name, next, previous, up
-@section pawd
-@pindex pawd
-
-@i{Pawd} is used to print the current working directory, adjusted to
-reflect proper paths that can be reused to go through the automounter
-for the shortest possible path. In particular, the path printed back
-does not include any of @i{Amd}'s local mount points. Using them is
-unsafe, because @i{Amd} may unmount managed file systems from the mount
-points, and thus including them in paths may not always find the files
-within.
-
-Without any arguments, @i{Pawd} will print the automounter adjusted
-current working directory. With any number of arguments, it will print
-the adjusted path of each one of the arguments.
-
-@c ----------------------------------------------------------------
-@node redhat-ctl-amd, wait4amd, pawd, Assorted Tools
-@comment node-name, next, previous, up
-@section redhat-ctl-amd
-@pindex redhat-ctl-amd
-
-This script is similar to @i{ctl-amd} (@pxref{ctl-amd}) but is intended
-for Red Hat Linux systems. You can safely copy @i{redhat-ctl-amd} onto
-@file{/etc/rc.d/init.d/amd}. The script supplied by @i{Am-utils} is
-usually better than the one provided by Red Hat, because the Red Hat
-script does not correctly kill @i{Amd} processes: it is too quick to
-kill the wrong processes, leaving stale or hung mount points behind.
-
-@c ----------------------------------------------------------------
-@node wait4amd, wait4amd2die, redhat-ctl-amd, Assorted Tools
-@comment node-name, next, previous, up
-@section wait4amd
-@pindex wait4amd
-
-A script to wait for @i{Amd} to start on a particular host before
-performing an arbitrary command. The command is executed repeatedly,
-with 1 second intervals in between. You may interrupt the script using
-@samp{^C} (or whatever keyboard sequence your terminal's @samp{intr} function
-is bound to).
-
-Examples:
-
-@table @t
-@item wait4amd saturn amq -p -h saturn
-When @i{Amd} is up on host @samp{saturn}, get the process ID of that
-running @i{Amd}.
-@item wait4amd pluto rlogin pluto
-Remote login to host @samp{pluto} when @i{Amd} is up on that host. It
-is generally necessary to wait for @i{Amd} to properly start and
-initialize on a remote host before logging in to it, because otherwise
-user home directories may not be accessible across the network.
-@item wait4amd pluto
-A short-hand version of the previous command, since the most useful
-reason for this script is to login to a remote host. I use it very
-often when testing out new versions of @i{Amd}, and need to reboot hung
-hosts.
-@end table
-
-@c ----------------------------------------------------------------
-@node wait4amd2die, wire-test, wait4amd, Assorted Tools
-@comment node-name, next, previous, up
-@section wait4amd2die
-@pindex wait4amd2die
-
-This script is used internally by @samp{ctl-amd} when used to restart
-@i{Amd}. It waits for @i{Amd} to terminate. If it detected that
-@i{Amd} terminated cleanly, this script will return an exist status of
-zero. Otherwise, it will return a non-zero exit status.
-
-The script tests for @i{Amd}'s existence once every 5 seconds, six
-times, for a total of 30 seconds. It will return a zero exist status as
-soon as it detects that @i{Amd} dies.
-
-@c ----------------------------------------------------------------
-@node wire-test, , wait4amd2die, Assorted Tools
-@comment node-name, next, previous, up
-@section wire-test
-@pindex wire-test
-
-A simple program to test if some of the most basic networking functions
-in am-util's library @file{libamu} work. It also tests the combination
-of NFS protocol and version number that are supported from the current
-host, to a remote one.
-
-For example, in this test a machine which only supports NFS Version 2 is
-contacting a remote host that can support the same version, but using
-both UDP and TCP. If no host name is specified, @samp{wire-test} will
-try @file{localhost}.
-
-@example
-$ wire-test moisil
-Network name is "mcl-lab-net.cs.columbia.edu"
-Network number is "128.59.13"
-Network name is "old-net.cs.columbia.edu"
-Network number is "128.59.16"
-My IP address is 0x7f000001.
-NFS Version and protocol tests to host "moisil"...
- testing vers=2, proto="udp" -> found version 2.
- testing vers=3, proto="udp" -> failed!
- testing vers=2, proto="tcp" -> found version 2.
- testing vers=3, proto="tcp" -> failed!
-@end example
-
-@c ################################################################
-@node Examples, Internals, Assorted Tools, Top
-@comment node-name, next, previous, up
-@chapter Examples
-
-@menu
-* User Filesystems::
-* Home Directories::
-* Architecture Sharing::
-* Wildcard Names::
-* rwho servers::
-* /vol::
-* /defaults with selectors::
-* /tftpboot in a chroot-ed environment::
-
-@end menu
-
-@node User Filesystems, Home Directories, Examples, Examples
-@comment node-name, next, previous, up
-@section User Filesystems
-@cindex User filesystems
-@cindex Mounting user filesystems
-
-With more than one fileserver, the directories most frequently
-cross-mounted are those containing user home directories. A common
-convention used at Imperial College is to mount the user disks under
-@t{/home/}@i{machine}.
-
-Typically, the @samp{/etc/fstab} file contained a long list of entries
-such as:
-
-@example
-@i{machine}:/home/@i{machine} /home/@i{machine} nfs ...
-@end example
-
-for each fileserver on the network.
-
-There are numerous problems with this system. The mount list can become
-quite large and some of the machines may be down when a system is
-booted. When a new fileserver is installed, @samp{/etc/fstab} must be
-updated on every machine, the mount directory created and the filesystem
-mounted.
-
-In many environments most people use the same few workstations, but
-it is convenient to go to a colleague's machine and access your own
-files. When a server goes down, it can cause a process on a client
-machine to hang. By minimizing the mounted filesystems to only include
-those actively being used, there is less chance that a filesystem will
-be mounted when a server goes down.
-
-The following is a short extract from a map taken from a research fileserver
-at Imperial College.
-
-Note the entry for @samp{localhost} which is used for users such as
-the operator (@samp{opr}) who have a home directory on most machine as
-@samp{/home/localhost/opr}.
-
-@example
-/defaults opts:=rw,intr,grpid,nosuid
-charm host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} \
- host==$@{key@};type:=ufs;dev:=/dev/xd0g
-#
-...
-
-#
-localhost type:=link;fs:=$@{host@}
-...
-#
-# dylan has two user disks so have a
-# top directory in which to mount them.
-#
-dylan type:=auto;fs:=$@{map@};pref:=$@{key@}/
-#
-dylan/dk2 host!=dylan;type:=nfs;rhost:=dylan;rfs:=/home/$@{key@} \
- host==dylan;type:=ufs;dev:=/dev/dsk/2s0
-#
-dylan/dk5 host!=dylan;type:=nfs;rhost:=dylan;rfs:=/home/$@{key@} \
- host==dylan;type:=ufs;dev:=/dev/dsk/5s0
-...
-#
-toytown host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} \
- host==$@{key@};type:=ufs;dev:=/dev/xy1g
-...
-#
-zebedee host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} \
- host==$@{key@};type:=ufs;dev:=/dev/dsk/1s0
-#
-# Just for access...
-#
-gould type:=auto;fs:=$@{map@};pref:=$@{key@}/
-gould/staff host!=gould;type:=nfs;rhost:=gould;rfs:=/home/$@{key@}
-#
-gummo host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@}
-...
-@end example
-
-This map is shared by most of the machines listed so on those
-systems any of the user disks is accessible via a consistent name.
-@i{Amd} is started with the following command
-
-@example
-amd /home amd.home
-@end example
-
-Note that when mounting a remote filesystem, the @dfn{automounted}
-mount point is referenced, so that the filesystem will be mounted if
-it is not yet (at the time the remote @samp{mountd} obtains the file handle).
-
-@node Home Directories, Architecture Sharing, User Filesystems, Examples
-@comment node-name, next, previous, up
-@section Home Directories
-@cindex Home directories
-@cindex Example of mounting home directories
-@cindex Mount home directories
-
-One convention for home directories is to locate them in @samp{/homes}
-so user @samp{jsp}'s home directory is @samp{/homes/jsp}. With more
-than a single fileserver it is convenient to spread user files across
-several machines. All that is required is a mount-map which converts
-login names to an automounted directory.
-
-Such a map might be started by the command:
-
-@example
-amd /homes amd.homes
-@end example
-
-where the map @samp{amd.homes} contained the entries:
-
-@example
-/defaults type:=link # All the entries are of type:=link
-jsp fs:=/home/charm/jsp
-njw fs:=/home/dylan/dk5/njw
-...
-phjk fs:=/home/toytown/ai/phjk
-sjv fs:=/home/ganymede/sjv
-@end example
-
-Whenever a login name is accessed in @samp{/homes} a symbolic link
-appears pointing to the real location of that user's home directory. In
-this example, @samp{/homes/jsp} would appear to be a symbolic link
-pointing to @samp{/home/charm/jsp}. Of course, @samp{/home} would also
-be an automount point.
-
-This system causes an extra level of symbolic links to be used.
-Although that turns out to be relatively inexpensive, an alternative is
-to directly mount the required filesystems in the @samp{/homes}
-map. The required map is simple, but long, and its creation is best automated.
-The entry for @samp{jsp} could be:
-
-@example
-jsp -sublink:=$@{key@};rfs:=/home/charm \
- host==charm;type:=ufs;dev:=/dev/xd0g \
- host!=charm;type:=nfs;rhost:=charm
-@end example
-
-This map can become quite big if it contains a large number of entries.
-By combining two other features of @i{Amd} it can be greatly simplified.
-
-First the UFS partitions should be mounted under the control of
-@samp{/etc/fstab}, taking care that they are mounted in the same place
-that @i{Amd} would have automounted them. In most cases this would be
-something like @samp{/a/@dfn{host}/home/@dfn{host}} and
-@samp{/etc/fstab} on host @samp{charm} would have a line:@refill
-
-@example
-/dev/xy0g /a/charm/home/charm 4.2 rw,nosuid,grpid 1 5
-@end example
-
-The map can then be changed to:
-
-@example
-/defaults type:=nfs;sublink:=$@{key@};opts:=rw,intr,nosuid,grpid
-jsp rhost:=charm;rfs:=/home/charm
-njw rhost:=dylan;rfs:=/home/dylan/dk5
-...
-phjk rhost:=toytown;rfs:=/home/toytown;sublink:=ai/$@{key@}
-sjv rhost:=ganymede;rfs:=/home/ganymede
-@end example
-
-This map operates as usual on a remote machine (@i{ie} @code{$@{host@}}
-not equal to @code{$@{rhost@}}). On the machine where the filesystem is
-stored (@i{ie} @code{$@{host@}} equal to @code{$@{rhost@}}), @i{Amd}
-will construct a local filesystem mount point which corresponds to the
-name of the locally mounted UFS partition. If @i{Amd} is started with
-the @code{-r} option then instead of attempting an NFS mount, @i{Amd} will
-simply inherit the UFS mount (@pxref{Inheritance Filesystem}). If
-@code{-r} is not used then a loopback NFS mount will be made. This type of
-mount is known to cause a deadlock on many systems.
-
-@node Architecture Sharing, Wildcard Names, Home Directories, Examples
-@comment node-name, next, previous, up
-@section Architecture Sharing
-@cindex Architecture sharing
-@cindex Sharing a fileserver between architectures
-@cindex Architecture dependent volumes
-
-@c %At the moment some of the research machines have sets of software
-@c %mounted in @samp{/vol}. This contains subdirectories for \TeX,
-@c %system sources, local sources, prolog libraries and so on.
-Often a filesystem will be shared by machines of different architectures.
-Separate trees can be maintained for the executable images for each
-architecture, but it may be more convenient to have a shared tree,
-with distinct subdirectories.
-
-A shared tree might have the following structure on the fileserver (called
-@samp{fserver} in the example):
-
-@example
-local/tex
-local/tex/fonts
-local/tex/lib
-local/tex/bin
-local/tex/bin/sun3
-local/tex/bin/sun4
-local/tex/bin/hp9000
-...
-@end example
-
-In this example, the subdirectories of @samp{local/tex/bin} should be
-hidden when accessed via the automount point (conventionally @samp{/vol}).
-A mount-map for @samp{/vol} to achieve this would look like:
-
-@example
-/defaults sublink:=$@{/key@};rhost:=fserver;type:=link
-tex type:=auto;fs:=$@{map@};pref:=$@{key@}/
-tex/fonts host!=fserver;type:=nfs;rfs:=/vol/tex \
- host==fserver;fs:=/usr/local/tex
-tex/lib host!=fserver;type:=nfs;rfs:=/vol/tex \
- host==fserver;fs:=/usr/local/tex
-tex/bin -sublink:=$@{/key@}/$@{arch@} \
- host!=fserver;type:=nfs;rfs:=/vol/tex \
- host:=fserver;fs:=/usr/local/tex
-@end example
-
-When @samp{/vol/tex/bin} is referenced, the current machine architecture
-is automatically appended to the path by the @code{$@{sublink@}}
-variable. This means that users can have @samp{/vol/tex/bin} in their
-@samp{PATH} without concern for architecture dependencies.
-
-@node Wildcard Names, rwho servers, Architecture Sharing, Examples
-@comment node-name, next, previous, up
-@section Wildcard Names & Replicated Servers
-
-By using the wildcard facility, @i{Amd} can @dfn{overlay} an existing
-directory with additional entries.
-The system files are usually mounted under @samp{/usr}. If instead,
-@i{Amd} is mounted on @samp{/usr}, additional
-names can be overlayed to augment or replace names in the ``master'' @samp{/usr}.
-A map to do this would have the form:
-
-@example
-local type:=auto;fs:=local-map
-share type:=auto;fs:=share-map
-* -type:=nfs;rfs:=/export/exec/$@{arch@};sublink:="$@{key@}" \
- rhost:=fserv1 rhost:=fserv2 rhost:=fserv3
-@end example
-
-Note that the assignment to @code{$@{sublink@}} is surrounded by double
-quotes to prevent the incoming key from causing the map to be
-misinterpreted. This map has the effect of directing any access to
-@samp{/usr/local} or @samp{/usr/share} to another automount point.
-
-In this example, it is assumed that the @samp{/usr} files are replicated
-on three fileservers: @samp{fserv1}, @samp{fserv2} and @samp{fserv3}.
-For any references other than to @samp{local} and @samp{share} one of
-the servers is used and a symbolic link to
-@t{$@{autodir@}/$@{rhost@}/export/exec/$@{arch@}/@i{whatever}} is
-returned once an appropriate filesystem has been mounted.@refill
-
-@node rwho servers, /vol, Wildcard Names, Examples
-@comment node-name, next, previous, up
-@section @samp{rwho} servers
-@cindex rwho servers
-@cindex Architecture specific mounts
-@cindex Example of architecture specific mounts
-
-The @samp{/usr/spool/rwho} directory is a good candidate for automounting.
-For efficiency reasons it is best to capture the rwho data on a small
-number of machines and then mount that information onto a large number
-of clients. The data written into the rwho files is byte order dependent
-so only servers with the correct byte ordering can be used by a client:
-
-@example
-/defaults type:=nfs
-usr/spool/rwho -byte==little;rfs:=/usr/spool/rwho \
- rhost:=vaxA rhost:=vaxB \
- || -rfs:=/usr/spool/rwho \
- rhost:=sun4 rhost:=hp300
-@end example
-
-@node /vol, /defaults with selectors, rwho servers, Examples
-@comment node-name, next, previous, up
-@section @samp{/vol}
-@cindex /vol
-@cindex Catch-all mount point
-@cindex Generic volume name
-
-@samp{/vol} is used as a catch-all for volumes which do not have other
-conventional names.
-
-Below is part of the @samp{/vol} map for the domain @samp{doc.ic.ac.uk}.
-The @samp{r+d} tree is used for new or experimental software that needs
-to be available everywhere without installing it on all the fileservers.
-Users wishing to try out the new software then simply include
-@samp{/vol/r+d/@{bin,ucb@}} in their path.@refill
-
-The main tree resides on one host @samp{gould.doc.ic.ac.uk}, which has
-different @samp{bin}, @samp{etc}, @samp{lib} and @samp{ucb}
-sub-directories for each machine architecture. For example,
-@samp{/vol/r+d/bin} for a Sun-4 would be stored in the sub-directory
-@samp{bin/sun4} of the filesystem @samp{/usr/r+d}. When it was accessed
-a symbolic link pointing to @samp{/a/gould/usr/r+d/bin/sun4} would be
-returned.@refill
-
-@example
-/defaults type:=nfs;opts:=rw,grpid,nosuid,intr,soft
-wp -opts:=rw,grpid,nosuid;rhost:=charm \
- host==charm;type:=link;fs:=/usr/local/wp \
- host!=charm;type:=nfs;rfs:=/vol/wp
-...
-#
-src -opts:=rw,grpid,nosuid;rhost:=charm \
- host==charm;type:=link;fs:=/usr/src \
- host!=charm;type:=nfs;rfs:=/vol/src
-#
-r+d type:=auto;fs:=$@{map@};pref:=r+d/
-# per architecture bin,etc,lib&ucb...
-r+d/bin rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@}
-r+d/etc rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@}
-r+d/include rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}
-r+d/lib rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@}
-r+d/man rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}
-r+d/src rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}
-r+d/ucb rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@}
-# hades pictures
-pictures -opts:=rw,grpid,nosuid;rhost:=thpfs \
- host==thpfs;type:=link;fs:=/nbsd/pictures \
- host!=thpfs;type:=nfs;rfs:=/nbsd;sublink:=pictures
-# hades tools
-hades -opts:=rw,grpid,nosuid;rhost:=thpfs \
- host==thpfs;type:=link;fs:=/nbsd/hades \
- host!=thpfs;type:=nfs;rfs:=/nbsd;sublink:=hades
-# bsd tools for hp.
-bsd -opts:=rw,grpid,nosuid;arch==hp9000;rhost:=thpfs \
- host==thpfs;type:=link;fs:=/nbsd/bsd \
- host!=thpfs;type:=nfs;rfs:=/nbsd;sublink:=bsd
-@end example
-
-@node /defaults with selectors, /tftpboot in a chroot-ed environment, /vol, Examples
-@comment node-name, next, previous, up
-@section @samp{/defaults} with selectors
-@cindex /defaults with selectors
-@cindex selectors on default
-
-It is sometimes useful to have different defaults for a given map. To
-achieve this, the @samp{/defaults} entry must be able to process normal
-selectors. This feature is turned on by setting
-@samp{selectors_in_defaults = yes} in the @file{amd.conf} file.
-@xref{selectors_in_defaults Parameter}.
-
-In this example, I set different default NFS mount options for hosts
-which are running over a slower network link. By setting a smaller size
-for the NFS read and write buffer sizes, you can greatly improve remote
-file service performance.
-
-@example
-/defaults \
- wire==slip-net;opts:=rw,intr,rsize=1024,wsize=1024,timeo=20,retrans=10 \
- wire!=slip-net;opts:=rw,intr
-@end example
-
-@node /tftpboot in a chroot-ed environment, , /defaults with selectors, Examples
-@comment node-name, next, previous, up
-@section @samp{/tftpboot} in a chroot-ed environment
-@cindex /tftpboot in a chroot-ed environment
-@cindex chroot; /tftpboot example
-
-In this complex example, we attempt to run an @i{Amd} process
-@emph{inside} a chroot-ed environment. @samp{tftpd} (Trivial FTP) is
-used to trivially retrieve files used to boot X-Terminals, Network
-Printers, Network routers, diskless workstations, and other such
-devices. For security reasons, @samp{tftpd} (and also @samp{ftpd})
-processes are run using the @b{chroot}(2) system call. This provides an
-environment for these processes, where access to any files outside the
-directory where the chroot-ed process runs is denied.
-
-For example, if you start @samp{tftpd} on your system with
-
-@example
-chroot /tftpboot /usr/sbin/tftpd
-@end example
-
-@noindent
-then the @samp{tftpd} process will not be able to access any files
-outside @file{/tftpboot}. This ensures that no one can retrieve files
-such as @file{/etc/passwd} and run password crackers on it.
-
-Since the TFTP service works by broadcast, it is necessary to have at
-least one TFTP server running on each subnet. If you have lots of files
-that you need to make available for @samp{tftp}, and many subnets, it
-could take significant amounts of disk space on each host serving them.
-
-A solution we implemented at Columbia University was to have every host
-run @samp{tftpd}, but have those servers retrieve the boot files from
-two replicated servers. Those replicated servers have special
-partitions dedicated to the many network boot files.
-
-We start @i{Amd} as follows:
-
-@example
-amd /tftpboot/.amd amd.tftpboot
-@end example
-
-That is, @i{Amd} is serving the directory @file{/tftpboot/.amd}. The
-@samp{tftp} server runs inside @file{/tftpboot} and is chroot-ed in that
-directory too. The @file{amd.tftpboot} map looks like:
-
-@example
-#
-# Amd /tftpboot directory -> host map
-#
-
-/defaults opts:=nosuid,ro,intr,soft;fs:=/tftpboot/import;type:=nfs
-
-tp host==lol;rfs:=/n/lol/import/tftpboot;type:=lofs \
- host==ober;rfs:=/n/ober/misc/win/tftpboot;type:=lofs \
- rhost:=ober;rfs:=/n/ober/misc/win/tftpboot \
- rhost:=lol;rfs:=/n/lol/import/tftpboot
-@end example
-
-To help understand this example, I list a few of the file entries that
-are created inside @file{/tftpboot}:
-
-@example
-$ ls -la /tftpboot
-dr-xr-xr-x 2 root 512 Aug 30 23:11 .amd
-drwxrwsr-x 12 root 512 Aug 30 08:00 import
-lrwxrwxrwx 1 root 33 Feb 27 1997 adminpr.cfg -> ./.amd/tp/hplj/adminpr.cfg
-lrwxrwxrwx 1 root 22 Dec 5 1996 tekxp -> ./.amd/tp/xterms/tekxp
-lrwxrwxrwx 1 root 1 Dec 5 1996 tftpboot -> .
-@end example
-
-Here is an explanation of each of the entries listed above:
-
-@table @code
-
-@item .amd
-This is the @i{Amd} mount point. Note that you do not need to run a
-separate @i{Amd} process for the TFTP service. The @b{chroot}(2) system
-call only protects against file access, but the same process can still
-serve files and directories inside and outside the chroot-ed
-environment, because @i{Amd} itself was not run in chroot-ed mode.
-
-@item import
-This is the mount point where @i{Amd} will mount the directories
-containing the boot files. The map is designed so that remote
-directories will be NFS mounted (even if they are already mounted
-elsewhere), and local directories are loopback mounted (since they are
-not accessible outside the chroot-ed @file{/tftpboot} directory).
-
-@item adminpr.cfg
-@itemx tekxp
-Two manually created symbolic links to directories @emph{inside} the
-@i{Amd}-managed directory. The crossing of the component @file{tp} will
-cause @i{Amd} to automount one of the remote replicas. Once crossed,
-access to files inside proceeds as usual. The @samp{adminpr.cfg} is a
-configuration file for an HP Laser-Jet 4si printer, and the @samp{tekxp}
-is a directory for Tektronix X-Terminal boot files.
-
-@item tftpboot
-This innocent looking symlink is important. Usually, when devices boot
-via the TFTP service, they perform the @samp{get file} command to
-retrieve @var{file}. However, some devices assume that @samp{tftpd}
-does not run in a chroot-ed environment, but rather ``unprotected'', and
-thus use a full pathname for files to retrieve, as in @samp{get
-/tftpboot/file}. This symlink effectively strips out the leading
-@file{/tftpboot/}.
-
-@end table
-
-@c ################################################################
-@node Internals, Acknowledgments & Trademarks, Examples, Top
-@comment node-name, next, previous, up
-@chapter Internals
-
-Note that there are more error and logging messages possible than are
-listed here. Most of them are self-explanatory. Refer to the program
-sources for more details on the rest.
-
-@menu
-* Log Messages::
-@end menu
-
-@node Log Messages, , Internals, Internals
-@comment node-name, next, previous, up
-@section Log Messages
-
-In the following sections a brief explanation is given of some of the
-log messages made by @i{Amd}. Where the message is in @samp{typewriter}
-font, it corresponds exactly to the message produced by @i{Amd}. Words
-in @dfn{italic} are replaced by an appropriate string. Variables,
-@code{$@{@i{var}@}}, indicate that the value of the appropriate variable is
-output.
-
-Log messages are either sent directly to a file,
-or logged via the @b{syslog}(3) mechanism. @xref{log_file Parameter}.
-In either case, entries in the file are of the form:
-@example
-@i{date-string} @i{hostname} @t{amd[}@i{pid}@t{]} @i{message}
-@end example
-
-@menu
-* Fatal errors::
-* Info messages::
-@end menu
-
-@node Fatal errors, Info messages, Log Messages, Log Messages
-@comment node-name, next, previous, up
-@subsection Fatal errors
-
-@i{Amd} attempts to deal with unusual events. Whenever it is not
-possible to deal with such an error, @i{Amd} will log an appropriate
-message and, if it cannot possibly continue, will either exit or abort.
-These messages are selected by @samp{-x fatal} on the command line.
-When @b{syslog}(3) is being used, they are logged with level
-@samp{LOG_FATAL}. Even if @i{Amd} continues to operate it is likely to
-remain in a precarious state and should be restarted at the earliest
-opportunity.
-
-@table @t
-
-@item Attempting to inherit not-a-filesystem
-The prototype mount point created during a filesystem restart did not
-contain a reference to the restarted filesystem. This error ``should
-never happen''.
-
-@item Can't bind to domain "@i{NIS-domain}"
-A specific NIS domain was requested on the command line, but no server
-for that domain is available on the local net.
-
-@item Can't determine IP address of this host (@i{hostname})
-When @i{Amd} starts it determines its own IP address. If this lookup
-fails then @i{Amd} cannot continue. The hostname it looks up is that
-obtained returned by @b{gethostname}(2) system call.
-
-@item Can't find root file handle for @i{automount point}
-@i{Amd} creates its own file handles for the automount points. When it
-mounts itself as a server, it must pass these file handles to the local
-kernel. If the filehandle is not obtainable the mount point is ignored.
-This error ``should never happen''.
-
-@item Must be root to mount filesystems (euid = @i{euid})
-To prevent embarrassment, @i{Amd} makes sure it has appropriate system
-privileges. This amounts to having an euid of 0. The check is made
-after argument processing complete to give non-root users a chance to
-access the @code{-v} option.
-
-@item No work to do - quitting
-No automount points were given on the command line and so there is no
-work to do.
-
-@item Out of memory
-While attempting to malloc some memory, the memory space available to
-@i{Amd} was exhausted. This is an unrecoverable error.
-
-@item Out of memory in realloc
-While attempting to realloc some memory, the memory space available to
-@i{Amd} was exhausted. This is an unrecoverable error.
-
-@item cannot create rpc/udp service
-Either the NFS or AMQ endpoint could not be created.
-
-@item gethostname: @i{description}
-The @b{gethostname}(2) system call failed during startup.
-
-@item host name is not set
-The @b{gethostname}(2) system call returned a zero length host name.
-This can happen if @i{Amd} is started in single user mode just after
-booting the system.
-
-@item ifs_match called!
-An internal error occurred while restarting a pre-mounted filesystem.
-This error ``should never happen''.
-
-@item mount_afs: @i{description}
-An error occurred while @i{Amd} was mounting itself.
-
-@item run_rpc failed
-Somehow the main NFS server loop failed. This error ``should never
-happen''.
-
-@item unable to free rpc arguments in amqprog_1
-The incoming arguments to the AMQ server could not be free'ed.
-
-@item unable to free rpc arguments in nfs_program_1
-The incoming arguments to the NFS server could not be free'ed.
-
-@item unable to register (AMQ_PROGRAM, AMQ_VERSION, udp)
-The AMQ server could not be registered with the local portmapper or the
-internal RPC dispatcher.
-
-@item unable to register (NFS_PROGRAM, NFS_VERSION, 0)
-The NFS server could not be registered with the internal RPC dispatcher.
-
-@end table
-
-XXX: This section needs to be updated
-
-@node Info messages, , Fatal errors, Log Messages
-@comment node-name, next, previous, up
-@subsection Info messages
-
-@i{Amd} generates information messages to record state changes. These
-messages are selected by @samp{-x info} on the command line. When
-@b{syslog}(3) is being used, they are logged with level @samp{LOG_INFO}.
-
-The messages listed below can be generated and are in a format suitable
-for simple statistical analysis. @dfn{mount-info} is the string
-that is displayed by @dfn{Amq} in its mount information column and
-placed in the system mount table.
-
-@table @t
-
-@item "@t{$@{@i{path}@}}" forcibly timed out
-An automount point has been timed out by the @i{Amq} command.
-
-@item "@t{$@{@i{path}@}}" has timed out
-No access to the automount point has been made within the timeout
-period.
-
-@item Filehandle denied for "$@{@i{rhost}@}:$@{@i{rfs}@}"
-The mount daemon refused to return a file handle for the requested filesystem.
-
-@item Filehandle error for "$@{@i{rhost}@}:$@{@i{rfs}@}": @i{description}
-The mount daemon gave some other error for the requested filesystem.
-
-@item Finishing with status @i{exit-status}
-@i{Amd} is about to exit with the given exit status.
-
-@item Re-synchronizing cache for map @t{$@{@i{map}@}}
-The named map has been modified and the internal cache is being re-synchronized.
-
-@item file server @t{$@{@i{rhost}@}} is down - timeout of "@t{$@{@i{path}@}}" ignored
-An automount point has timed out, but the corresponding file server is
-known to be down. This message is only produced once for each mount
-point for which the server is down.
-
-@item file server @t{$@{@i{rhost}@}} type nfs is down
-An NFS file server that was previously up is now down.
-
-@item file server @t{$@{@i{rhost}@}} type nfs is up
-An NFS file server that was previously down is now up.
-
-@item file server @t{$@{@i{rhost}@}} type nfs starts down
-A new NFS file server has been referenced and is known to be down.
-
-@item file server @t{$@{@i{rhost}@}} type nfs starts up
-A new NFS file server has been referenced and is known to be up.
-
-@item mount of "@t{$@{@i{path}@}}" on @t{$@{@i{fs}@}} timed out
-Attempts to mount a filesystem for the given automount point have failed
-to complete within 30 seconds.
-
-@item @i{mount-info} mounted fstype @t{$@{@i{type}@}} on @t{$@{@i{fs}@}}
-A new file system has been mounted.
-
-@item @i{mount-info} restarted fstype @t{$@{@i{type}@}} on @t{$@{@i{fs}@}}
-@i{Amd} is using a pre-mounted filesystem to satisfy a mount request.
-
-@item @i{mount-info} unmounted fstype @t{$@{@i{type}@}} from @t{$@{@i{fs}@}}
-A file system has been unmounted.
-
-@item @i{mount-info} unmounted fstype @t{$@{@i{type}@}} from @t{$@{@i{fs}@}} link @t{$@{@i{fs}@}}/@t{$@{@i{sublink}@}}
-A file system of which only a sub-directory was in use has been unmounted.
-
-@item restarting @i{mount-info} on @t{$@{@i{fs}@}}
-A pre-mounted file system has been noted.
-
-@end table
-
-XXX: This section needs to be updated
-
-@c ################################################################
-@node Acknowledgments & Trademarks, Index, Internals, Top
-@comment node-name, next, previous, up
-@unnumbered Acknowledgments & Trademarks
-
-Many thanks to the @email{am-utils@@am-utils.org,Am-Utils Users}
-mailing list through the months developing am-utils. These members
-have contributed to the discussions, ideas, code and documentation,
-and subjected their systems to alpha quality code. Special thanks go
-to those @uref{http://www.am-utils.org/docs/am-utils/AUTHORS.txt,authors} who have
-submitted patches, and especially to the maintainers:
-
-@itemize @bullet
-@item @email{ezk@@cs.sunysb.edu,Erez Zadok}
-@item @email{ib42@@cs.columbia.edu,Ion Badulescu}
-@item @email{ro@@techfak.uni-bielefeld.de,Rainer Orth}
-@item @email{nick.williams@@morganstanley.com,Nick Williams}
-@end itemize
-
-Thanks to the Formal Methods Group at Imperial College for suffering
-patiently while @i{Amd} was being developed on their machines.
-
-Thanks to the many people who have helped with the development of
-@i{Amd}, especially Piete Brooks at the Cambridge University Computing
-Lab for many hours of testing, experimentation and discussion.
-
-Thanks to the older @email{amd-workers@@majordomo.glue.umd.edu,Amd
-Workers} mailing list (now defunct) members for many suggestions and
-bug reports to @i{Amd}.
-
-@itemize @bullet
-@item
-@b{DEC}, @b{VAX} and @b{Ultrix} are registered trademarks of Digital
-Equipment Corporation.
-@item
-@b{AIX} and @b{IBM} are registered trademarks of International Business
-Machines Corporation.
-@item
-@b{Sun}, @b{NFS} and @b{SunOS} are registered trademarks of Sun
-Microsystems, Inc.
-@item
-@b{UNIX} is a registered trademark in the USA and other countries,
-exclusively licensed through X/Open Company, Ltd.
-@item
-All other registered trademarks are owned by their respective owners.
-@end itemize
-
-@c ################################################################
-@node Index, , Acknowledgments & Trademarks, Top
-@comment node-name, next, previous, up
-@unnumbered Index
-
-@printindex cp
-
-@contents
-@bye
-
-@c ====================================================================
-@c ISPELL LOCAL WORDS:
-@c LocalWords: setfilename amdref overfullrule settitle titlepage titlefont nz
-@c LocalWords: authorfont vskip ifinfo iftex cindex unnumberedsec dfn xref vol
-@c LocalWords: locationN pxref jpo nott concentrix Sjoerd sjoerd cwi Eitan vuw
-@c LocalWords: Mizrotsky eitan shumuji dgux fpx scp hcx metcalf masala hlh OTS
-@c LocalWords: Presnell srp cgl Trost trost ogi pyrOSx OSx tubsibr riscix iX
-@c LocalWords: Piete pb Lindblad cjl ai umax utek xinu Mitchum D'Souza dsouza
-@c LocalWords: mrc apu alliant aviion AViiON fps macII multimax tahoe vax emph
-@c LocalWords: mapdefault valA valB valC YPTSDIR ETCDIR substr MAKEDBM YPDBDIR
-@c LocalWords: NOPUSH njw dylan dk dylan njw anydir domN achilles mjh pref sel
-@c LocalWords: gdef loc loc loc ldots autodir remopts rwho rwho styx styx yoyo
-@c LocalWords: noindent gould rvdmount rvdunmount fserver mtmp unioned logfile
-@c LocalWords: dmn esac phjk toytown toytown toytown toytown phjk RdDir RdLnk
-@c LocalWords: volname attrs netif dougal inaddr hwaddr ec mountmaps passno xy
-@c LocalWords: freq dumpset hfs brian florence localinfo fstabs automaps defn
-@c LocalWords: localname fsck'd opr gummo sjv ganymede sjv fserv fserv fserv
-@c LocalWords: vaxA vaxB wp thpfs nbsd asis ifs amqprog free'ed printindex gov
-@c LocalWords: LocalWords syncodeindex Distrib bsdnet lanl AutoMounter acis ic
-@c LocalWords: ac uk aix bsd Mullender nl il DG lcs hpux irix ucsf NeXT cse cl
-@c LocalWords: mt FX hp ibm mips utils def def Domainname eg hostd getwd tmp
-@c LocalWords: subsubsection rw grpid intr noconn nocto nodevs nosuid retrans
-@c LocalWords: rsize tcp timeo nounmount utimeout DDEBUG nodaemon fd hostnames
-@c LocalWords: pid Amd's pendry vangogh nfsx backoff stats nomap nostats CRIT
-@c LocalWords: noinfo clustername RVD dsk dsk amq hostports osver statfs str
-@c LocalWords: ou counter's amdmaps proj src tftpboot sh mv cd sbin ypcat inet
-@c LocalWords: Getattr getattr localhost fhandles netmask fstype noquota addr
-@c LocalWords: exportfs Dumpsets dumpsets pindex ldif fixmount fixrmtab euid
-@c LocalWords: lostaltmail realloc netnumber itemx primnetnum primnetname ARG
-@c LocalWords: subsnetname subsnetnum netgrp netgroup multitable Shlib dec osf
-@c LocalWords: hppa pc bsdi freebsd netbsd openbsd ncr sysv rs acdirmax fsid
-@c LocalWords: acdirmin acregmax acregmin actimeo dumbtimr nfsv noac noauto sd
-@c LocalWords: nocache nodev noint nosub pgthresh posix rdonly suid symttl mfs
-@c LocalWords: AMFS umapfs myftpdir unionfs es mapname mapfile mapfile slocal
-@c LocalWords: mailspool saturn saturn notknown lol ober dr xr xr drwxrwsr cfg
-@c LocalWords: lrwxrwxrwx adminpr hplj adminpr cfg tekxp xterms tekxp Dupuy tp
-@c LocalWords: linkname hlfsddump dirname rmtab pluto rlogin direntry pg vr dn
-@c LocalWords: maxmem hlfsdir xmailbox showmount cn amdmap amdmapName resvport
-@c LocalWords: objectClass amdmapKey amdmapValue ln powerpc amdmapTimestamp ez
-@c LocalWords: moisil FSinfo Libtool Unmounting sublink fileservers NullProc
-@c LocalWords: gethostname mount's unmounts linkx remounts unmounting UAs SA's
-@c LocalWords: mountpoint mountpoints unescaped UIDs util's overlayed uref EFS
-@c LocalWords: serv maxgroups nfsl cachedir copt cfsadmin efs addopts fg ROMs
-@c LocalWords: nointr extatt setchapternewpage columnfractions alphaev gnulibc
-@c LocalWords: freebsdelf gnuoldld ifhtml defperm nodefperm norrip RRIP rrip
-@c LocalWords: noversion attr XXXXXX netgrpd rh mkstemp uid gid noexec mntfs
-@c LocalWords: nomnttab optionstr hrtime xdrtrace getpwd proplist redhat ctl
-@c LocalWords: texinfo texi ib sp cartouche ified xlatecookie dircategory sc
-@c LocalWords: AddInfo suse Novell softlookup ENOENT USB fullybrowsable LDAPv
-@c LocalWords: amy ie xfffffe zebedee andrew diskfull hdmail searchable si
-@c LocalWords: Orth ESTALE
diff --git a/contrib/amd/doc/stamp-vti b/contrib/amd/doc/stamp-vti
deleted file mode 100644
index 41b19a30d5c6..000000000000
--- a/contrib/amd/doc/stamp-vti
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 20 April 2006
-@set UPDATED-MONTH April 2006
-@set EDITION 6.1.5
-@set VERSION 6.1.5
diff --git a/contrib/amd/doc/texinfo.tex b/contrib/amd/doc/texinfo.tex
deleted file mode 100644
index e758cedae7e6..000000000000
--- a/contrib/amd/doc/texinfo.tex
+++ /dev/null
@@ -1,7014 +0,0 @@
-% texinfo.tex -- TeX macros to handle Texinfo files.
-%
-% Load plain if necessary, i.e., if running under initex.
-\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
-%
-\def\texinfoversion{2004-09-06.16}
-%
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
-% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
-% Foundation, Inc.
-%
-% This texinfo.tex file 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, or (at
-% your option) any later version.
-%
-% This texinfo.tex file 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 this texinfo.tex file; see the file COPYING. If not, write
-% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-% Boston, MA 02111-1307, USA.
-%
-% As a special exception, when this file is read by TeX when processing
-% a Texinfo source document, you may use the result without
-% restriction. (This has been our intent since Texinfo was invented.)
-%
-% Please try the latest version of texinfo.tex before submitting bug
-% reports; you can get the latest version from:
-% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
-% ftp://tug.org/tex/texinfo.tex
-% (and all CTAN mirrors, see http://www.ctan.org).
-% The texinfo.tex in any given distribution could well be out
-% of date, so if that's what you're using, please check.
-%
-% Send bug reports to bug-texinfo@gnu.org. Please include including a
-% complete document in each bug report with which we can reproduce the
-% problem. Patches are, of course, greatly appreciated.
-%
-% To process a Texinfo manual with TeX, it's most reliable to use the
-% texi2dvi shell script that comes with the distribution. For a simple
-% manual foo.texi, however, you can get away with this:
-% tex foo.texi
-% texindex foo.??
-% tex foo.texi
-% tex foo.texi
-% dvips foo.dvi -o # or whatever; this makes foo.ps.
-% The extra TeX runs get the cross-reference information correct.
-% Sometimes one run after texindex suffices, and sometimes you need more
-% than two; texi2dvi does it as many times as necessary.
-%
-% It is possible to adapt texinfo.tex for other languages, to some
-% extent. You can get the existing language-specific files from the
-% full Texinfo distribution.
-%
-% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
-
-
-\message{Loading texinfo [version \texinfoversion]:}
-
-% If in a .fmt file, print the version number
-% and turn on active characters that we couldn't do earlier because
-% they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}%
- \catcode`+=\active \catcode`\_=\active}
-
-\message{Basics,}
-\chardef\other=12
-
-% We never want plain's \outer definition of \+ in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-% Save some plain tex macros whose names we will redefine.
-\let\ptexb=\b
-\let\ptexbullet=\bullet
-\let\ptexc=\c
-\let\ptexcomma=\,
-\let\ptexdot=\.
-\let\ptexdots=\dots
-\let\ptexend=\end
-\let\ptexequiv=\equiv
-\let\ptexexclam=\!
-\let\ptexfootnote=\footnote
-\let\ptexgtr=>
-\let\ptexhat=^
-\let\ptexi=\i
-\let\ptexindent=\indent
-\let\ptexnoindent=\noindent
-\let\ptexinsert=\insert
-\let\ptexlbrace=\{
-\let\ptexless=<
-\let\ptexplus=+
-\let\ptexrbrace=\}
-\let\ptexslash=\/
-\let\ptexstar=\*
-\let\ptext=\t
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
- \let\linenumber = \empty % Pre-3.0.
-\else
- \def\linenumber{l.\the\inputlineno:\space}
-\fi
-
-% Set up fixed words for English if not already set.
-\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
-\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
-\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
-\ifx\putwordin\undefined \gdef\putwordin{in}\fi
-\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
-\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
-\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
-\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
-\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
-\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
-\ifx\putwordof\undefined \gdef\putwordof{of}\fi
-\ifx\putwordon\undefined \gdef\putwordon{on}\fi
-\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
-\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
-\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
-\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
-\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
-\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
-\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
-%
-\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
-\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
-\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
-\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
-\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
-\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
-\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
-\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
-\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
-\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
-\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
-\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
-%
-\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
-\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
-\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
-\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
-
-% In some macros, we cannot use the `\? notation---the left quote is
-% in some cases the escape char.
-\chardef\colonChar = `\:
-\chardef\commaChar = `\,
-\chardef\dotChar = `\.
-\chardef\exclamChar= `\!
-\chardef\questChar = `\?
-\chardef\semiChar = `\;
-\chardef\underChar = `\_
-
-\chardef\spaceChar = `\ %
-\chardef\spacecat = 10
-\def\spaceisspace{\catcode\spaceChar=\spacecat}
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-% The following is used inside several \edef's.
-\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
-
-% Hyphenation fixes.
-\hyphenation{
- Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
- ap-pen-dix bit-map bit-maps
- data-base data-bases eshell fall-ing half-way long-est man-u-script
- man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
- par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
- spell-ing spell-ings
- stand-alone strong-est time-stamp time-stamps which-ever white-space
- wide-spread wrap-around
-}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen\bindingoffset
-\newdimen\normaloffset
-\newdimen\pagewidth \newdimen\pageheight
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
-
-% @| inserts a changebar to the left of the current line. It should
-% surround any changed text. This approach does *not* work if the
-% change spans more than two lines of output. To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
- % \vadjust can only be used in horizontal mode.
- \leavevmode
- %
- % Append this vertical mode material after the current line in the output.
- \vadjust{%
- % We want to insert a rule with the height and depth of the current
- % leading; that is exactly what \strutbox is supposed to record.
- \vskip-\baselineskip
- %
- % \vadjust-items are inserted at the left edge of the type. So
- % the \llap here moves out into the left-hand margin.
- \llap{%
- %
- % For a thicker or thinner bar, change the `1pt'.
- \vrule height\baselineskip width1pt
- %
- % This is the space between the bar and the text.
- \hskip 12pt
- }%
- }%
-}
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal. We don't just call \tracingall here,
-% since that produces some useless output on the terminal. We also make
-% some effort to order the tracing commands to reduce output in the log
-% file; cf. trace.sty in LaTeX.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{%
- \tracingstats2
- \tracingpages1
- \tracinglostchars2 % 2 gives us more in etex
- \tracingparagraphs1
- \tracingoutput1
- \tracingmacros2
- \tracingrestores1
- \showboxbreadth\maxdimen \showboxdepth\maxdimen
- \ifx\eTeXversion\undefined\else % etex gives us more logging
- \tracingscantokens1
- \tracingifs1
- \tracinggroups1
- \tracingnesting2
- \tracingassigns1
- \fi
- \tracingcommands3 % 3 gives us more in etex
- \errorcontextlines16
-}%
-
-% add check for \lastpenalty to plain's definitions. If the last thing
-% we did was a \nobreak, we don't want to insert more space.
-%
-\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
- \removelastskip\penalty-50\smallskip\fi\fi}
-\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
- \removelastskip\penalty-100\medskip\fi\fi}
-\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
- \removelastskip\penalty-200\bigskip\fi\fi}
-
-% For @cropmarks command.
-% Do @cropmarks to get crop marks.
-%
-\newif\ifcropmarks
-\let\cropmarks = \cropmarkstrue
-%
-% Dimensions to add cropmarks at corners.
-% Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
-\newdimen\cornerlong \cornerlong=1pc
-\newdimen\cornerthick \cornerthick=.3pt
-\newdimen\topandbottommargin \topandbottommargin=.75in
-
-% Main output routine.
-\chardef\PAGE = 255
-\output = {\onepageout{\pagecontents\PAGE}}
-
-\newbox\headlinebox
-\newbox\footlinebox
-
-% \onepageout takes a vbox as an argument. Note that \pagecontents
-% does insertions, but you have to call it yourself.
-\def\onepageout#1{%
- \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
- %
- \ifodd\pageno \advance\hoffset by \bindingoffset
- \else \advance\hoffset by -\bindingoffset\fi
- %
- % Do this outside of the \shipout so @code etc. will be expanded in
- % the headline as they should be, not taken literally (outputting ''code).
- \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
- \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
- %
- {%
- % Have to do this stuff outside the \shipout because we want it to
- % take effect in \write's, yet the group defined by the \vbox ends
- % before the \shipout runs.
- %
- \escapechar = `\\ % use backslash in output files.
- \indexdummies % don't expand commands in the output.
- \normalturnoffactive % \ in index entries must not stay \, e.g., if
- % the page break happens to be in the middle of an example.
- \shipout\vbox{%
- % Do this early so pdf references go to the beginning of the page.
- \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
- %
- \ifcropmarks \vbox to \outervsize\bgroup
- \hsize = \outerhsize
- \vskip-\topandbottommargin
- \vtop to0pt{%
- \line{\ewtop\hfil\ewtop}%
- \nointerlineskip
- \line{%
- \vbox{\moveleft\cornerthick\nstop}%
- \hfill
- \vbox{\moveright\cornerthick\nstop}%
- }%
- \vss}%
- \vskip\topandbottommargin
- \line\bgroup
- \hfil % center the page within the outer (page) hsize.
- \ifodd\pageno\hskip\bindingoffset\fi
- \vbox\bgroup
- \fi
- %
- \unvbox\headlinebox
- \pagebody{#1}%
- \ifdim\ht\footlinebox > 0pt
- % Only leave this space if the footline is nonempty.
- % (We lessened \vsize for it in \oddfootingxxx.)
- % The \baselineskip=24pt in plain's \makefootline has no effect.
- \vskip 2\baselineskip
- \unvbox\footlinebox
- \fi
- %
- \ifcropmarks
- \egroup % end of \vbox\bgroup
- \hfil\egroup % end of (centering) \line\bgroup
- \vskip\topandbottommargin plus1fill minus1fill
- \boxmaxdepth = \cornerthick
- \vbox to0pt{\vss
- \line{%
- \vbox{\moveleft\cornerthick\nsbot}%
- \hfill
- \vbox{\moveright\cornerthick\nsbot}%
- }%
- \nointerlineskip
- \line{\ewbot\hfil\ewbot}%
- }%
- \egroup % \vbox from first cropmarks clause
- \fi
- }% end of \shipout\vbox
- }% end of group with \normalturnoffactive
- \advancepageno
- \ifnum\outputpenalty>-20000 \else\dosupereject\fi
-}
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
- \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1 \unvbox#1
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-% Here are the rules for the cropmarks. Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
- {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
- {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-% Parse an argument, then pass it to #1. The argument is the rest of
-% the input line (except we remove a trailing comment). #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-%
-\def\parsearg{\parseargusing{}}
-\def\parseargusing#1#2{%
- \def\next{#2}%
- \begingroup
- \obeylines
- \spaceisspace
- #1%
- \parseargline\empty% Insert the \empty token, see \finishparsearg below.
-}
-
-{\obeylines %
- \gdef\parseargline#1^^M{%
- \endgroup % End of the group started in \parsearg.
- \argremovecomment #1\comment\ArgTerm%
- }%
-}
-
-% First remove any @comment, then any @c comment.
-\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
-\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
-
-% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
-%
-% \argremovec might leave us with trailing space, e.g.,
-% @end itemize @c foo
-% This space token undergoes the same procedure and is eventually removed
-% by \finishparsearg.
-%
-\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
-\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
-\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
- \def\temp{#3}%
- \ifx\temp\empty
- % We cannot use \next here, as it holds the macro to run;
- % thus we reuse \temp.
- \let\temp\finishparsearg
- \else
- \let\temp\argcheckspaces
- \fi
- % Put the space token in:
- \temp#1 #3\ArgTerm
-}
-
-% If a _delimited_ argument is enclosed in braces, they get stripped; so
-% to get _exactly_ the rest of the line, we had to prevent such situation.
-% We prepended an \empty token at the very beginning and we expand it now,
-% just before passing the control to \next.
-% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
-% either the null string, or it ends with \^^M---thus there is no danger
-% that a pair of braces would be stripped.
-%
-% But first, we have to remove the trailing space token.
-%
-\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
-
-% \parseargdef\foo{...}
-% is roughly equivalent to
-% \def\foo{\parsearg\Xfoo}
-% \def\Xfoo#1{...}
-%
-% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
-% favourite TeX trick. --kasal, 16nov03
-
-\def\parseargdef#1{%
- \expandafter \doparseargdef \csname\string#1\endcsname #1%
-}
-\def\doparseargdef#1#2{%
- \def#2{\parsearg#1}%
- \def#1##1%
-}
-
-% Several utility definitions with active space:
-{
- \obeyspaces
- \gdef\obeyedspace{ }
-
- % Make each space character in the input produce a normal interword
- % space in the output. Don't allow a line break at this space, as this
- % is used only in environments like @example, where each line of input
- % should produce a line of output anyway.
- %
- \gdef\sepspaces{\obeyspaces\let =\tie}
-
- % If an index command is used in an @example environment, any spaces
- % therein should become regular spaces in the raw index file, not the
- % expansion of \tie (\leavevmode \penalty \@M \ ).
- \gdef\unsepspaces{\let =\space}
-}
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-% Define the framework for environments in texinfo.tex. It's used like this:
-%
-% \envdef\foo{...}
-% \def\Efoo{...}
-%
-% It's the responsibility of \envdef to insert \begingroup before the
-% actual body; @end closes the group after calling \Efoo. \envdef also
-% defines \thisenv, so the current environment is known; @end checks
-% whether the environment name matches. The \checkenv macro can also be
-% used to check whether the current environment is the one expected.
-%
-% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
-% are not treated as enviroments; they don't open a group. (The
-% implementation of @end takes care not to call \endgroup in this
-% special case.)
-
-
-% At runtime, environments start with this:
-\def\startenvironment#1{\begingroup\def\thisenv{#1}}
-% initialize
-\let\thisenv\empty
-
-% ... but they get defined via ``\envdef\foo{...}'':
-\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
-\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
-
-% Check whether we're in the right environment:
-\def\checkenv#1{%
- \def\temp{#1}%
- \ifx\thisenv\temp
- \else
- \badenverr
- \fi
-}
-
-% Evironment mismatch, #1 expected:
-\def\badenverr{%
- \errhelp = \EMsimple
- \errmessage{This command can appear only \inenvironment\temp,
- not \inenvironment\thisenv}%
-}
-\def\inenvironment#1{%
- \ifx#1\empty
- out of any environment%
- \else
- in environment \expandafter\string#1%
- \fi
-}
-
-% @end foo executes the definition of \Efoo.
-% But first, it executes a specialized version of \checkenv
-%
-\parseargdef\end{%
- \if 1\csname iscond.#1\endcsname
- \else
- % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
- \expandafter\checkenv\csname#1\endcsname
- \csname E#1\endcsname
- \endgroup
- \fi
-}
-
-\newhelp\EMsimple{Press RETURN to continue.}
-
-
-%% Simple single-character @ commands
-
-% @@ prints an @
-% Kludge this until the fonts are right (grr).
-\def\@{{\tt\char64}}
-
-% This is turned off because it was never documented
-% and you can use @w{...} around a quote to suppress ligatures.
-%% Define @` and @' to be the same as ` and '
-%% but suppressing ligatures.
-%\def\`{{`}}
-%\def\'{{'}}
-
-% Used to generate quoted braces.
-\def\mylbrace {{\tt\char123}}
-\def\myrbrace {{\tt\char125}}
-\let\{=\mylbrace
-\let\}=\myrbrace
-\begingroup
- % Definitions to produce \{ and \} commands for indices,
- % and @{ and @} for the aux file.
- \catcode`\{ = \other \catcode`\} = \other
- \catcode`\[ = 1 \catcode`\] = 2
- \catcode`\! = 0 \catcode`\\ = \other
- !gdef!lbracecmd[\{]%
- !gdef!rbracecmd[\}]%
- !gdef!lbraceatcmd[@{]%
- !gdef!rbraceatcmd[@}]%
-!endgroup
-
-% @comma{} to avoid , parsing problems.
-\let\comma = ,
-
-% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
-\let\, = \c
-\let\dotaccent = \.
-\def\ringaccent#1{{\accent23 #1}}
-\let\tieaccent = \t
-\let\ubaraccent = \b
-\let\udotaccent = \d
-
-% Other special characters: @questiondown @exclamdown @ordf @ordm
-% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
-\def\questiondown{?`}
-\def\exclamdown{!`}
-\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
-\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
-
-% Dotless i and dotless j, used for accents.
-\def\imacro{i}
-\def\jmacro{j}
-\def\dotless#1{%
- \def\temp{#1}%
- \ifx\temp\imacro \ptexi
- \else\ifx\temp\jmacro \j
- \else \errmessage{@dotless can be used only with i or j}%
- \fi\fi
-}
-
-% The \TeX{} logo, as in plain, but resetting the spacing so that a
-% period following counts as ending a sentence. (Idea found in latex.)
-%
-\edef\TeX{\TeX \spacefactor=1000 }
-
-% @LaTeX{} logo. Not quite the same results as the definition in
-% latex.ltx, since we use a different font for the raised A; it's most
-% convenient for us to use an explicitly smaller font, rather than using
-% the \scriptstyle font (since we don't reset \scriptstyle and
-% \scriptscriptstyle).
-%
-\def\LaTeX{%
- L\kern-.36em
- {\setbox0=\hbox{T}%
- \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
- \kern-.15em
- \TeX
-}
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\hfil\break\hbox{}\ignorespaces}
-
-% @/ allows a line break.
-\let\/=\allowbreak
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=3000 }
-
-% @! is an end-of-sentence bang.
-\def\!{!\spacefactor=3000 }
-
-% @? is an end-of-sentence query.
-\def\?{?\spacefactor=3000 }
-
-% @w prevents a word break. Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line. According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0). If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-% Another complication is that the group might be very large. This can
-% cause the glue on the previous page to be unduly stretched, because it
-% does not have much material. In this case, it's better to add an
-% explicit \vfill so that the extra space is at the bottom. The
-% threshold for doing this is if the group is more than \vfilllimit
-% percent of a page (\vfilllimit can be changed inside of @tex).
-%
-\newbox\groupbox
-\def\vfilllimit{0.7}
-%
-\envdef\group{%
- \ifnum\catcode`\^^M=\active \else
- \errhelp = \groupinvalidhelp
- \errmessage{@group invalid in context where filling is enabled}%
- \fi
- \startsavinginserts
- %
- \setbox\groupbox = \vtop\bgroup
- % Do @comment since we are called inside an environment such as
- % @example, where each end-of-line in the input causes an
- % end-of-line in the output. We don't want the end-of-line after
- % the `@group' to put extra space in the output. Since @group
- % should appear on a line by itself (according to the Texinfo
- % manual), we don't worry about eating any user text.
- \comment
-}
-%
-% The \vtop produces a box with normal height and large depth; thus, TeX puts
-% \baselineskip glue before it, and (when the next line of text is done)
-% \lineskip glue after it. Thus, space below is not quite equal to space
-% above. But it's pretty close.
-\def\Egroup{%
- % To get correct interline space between the last line of the group
- % and the first line afterwards, we have to propagate \prevdepth.
- \endgraf % Not \par, as it may have been set to \lisppar.
- \global\dimen1 = \prevdepth
- \egroup % End the \vtop.
- % \dimen0 is the vertical size of the group's box.
- \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
- % \dimen2 is how much space is left on the page (more or less).
- \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
- % if the group doesn't fit on the current page, and it's a big big
- % group, force a page break.
- \ifdim \dimen0 > \dimen2
- \ifdim \pagetotal < \vfilllimit\pageheight
- \page
- \fi
- \fi
- \box\groupbox
- \prevdepth = \dimen1
- \checkinserts
-}
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil \mil=0.001in
-
-% Old definition--didn't work.
-%\parseargdef\need{\par %
-%% This method tries to make TeX break the page naturally
-%% if the depth of the box does not fit.
-%{\baselineskip=0pt%
-%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
-%\prevdepth=-1000pt
-%}}
-
-\parseargdef\need{%
- % Ensure vertical mode, so we don't make a big box in the middle of a
- % paragraph.
- \par
- %
- % If the @need value is less than one line space, it's useless.
- \dimen0 = #1\mil
- \dimen2 = \ht\strutbox
- \advance\dimen2 by \dp\strutbox
- \ifdim\dimen0 > \dimen2
- %
- % Do a \strut just to make the height of this box be normal, so the
- % normal leading is inserted relative to the preceding line.
- % And a page break here is fine.
- \vtop to #1\mil{\strut\vfil}%
- %
- % TeX does not even consider page breaks if a penalty added to the
- % main vertical list is 10000 or more. But in order to see if the
- % empty box we just added fits on the page, we must make it consider
- % page breaks. On the other hand, we don't want to actually break the
- % page after the empty box. So we use a penalty of 9999.
- %
- % There is an extremely small chance that TeX will actually break the
- % page at this \penalty, if there are no other feasible breakpoints in
- % sight. (If the user is using lots of big @group commands, which
- % almost-but-not-quite fill up a page, TeX will have a hard time doing
- % good page breaking, for example.) However, I could not construct an
- % example where a page broke at this \penalty; if it happens in a real
- % document, then we can reconsider our strategy.
- \penalty9999
- %
- % Back up by the size of the box, whether we did a page break or not.
- \kern -#1\mil
- %
- % Do not allow a page break right after this kern.
- \nobreak
- \fi
-}
-
-% @br forces paragraph break (and is undocumented).
-
-\let\br = \par
-
-% @page forces the start of a new page.
-%
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
-
-% This defn is used inside nofill environments such as @example.
-\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
- \leftline{\hskip\leftskip{\rm#1}}}}
-
-% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
-% paragraph. For more general purposes, use the \margin insertion
-% class. WHICH is `l' or `r'.
-%
-\newskip\inmarginspacing \inmarginspacing=1cm
-\def\strutdepth{\dp\strutbox}
-%
-\def\doinmargin#1#2{\strut\vadjust{%
- \nobreak
- \kern-\strutdepth
- \vtop to \strutdepth{%
- \baselineskip=\strutdepth
- \vss
- % if you have multiple lines of stuff to put here, you'll need to
- % make the vbox yourself of the appropriate size.
- \ifx#1l%
- \llap{\ignorespaces #2\hskip\inmarginspacing}%
- \else
- \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
- \fi
- \null
- }%
-}}
-\def\inleftmargin{\doinmargin l}
-\def\inrightmargin{\doinmargin r}
-%
-% @inmargin{TEXT [, RIGHT-TEXT]}
-% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
-% else use TEXT for both).
-%
-\def\inmargin#1{\parseinmargin #1,,\finish}
-\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0 > 0pt
- \def\lefttext{#1}% have both texts
- \def\righttext{#2}%
- \else
- \def\lefttext{#1}% have only one text
- \def\righttext{#1}%
- \fi
- %
- \ifodd\pageno
- \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
- \else
- \def\temp{\inleftmargin\lefttext}%
- \fi
- \temp
-}
-
-% @include file insert text of that file as input.
-%
-\def\include{\parseargusing\filenamecatcodes\includezzz}
-\def\includezzz#1{%
- \pushthisfilestack
- \def\thisfile{#1}%
- {%
- \makevalueexpandable
- \def\temp{\input #1 }%
- \expandafter
- }\temp
- \popthisfilestack
-}
-\def\filenamecatcodes{%
- \catcode`\\=\other
- \catcode`~=\other
- \catcode`^=\other
- \catcode`_=\other
- \catcode`|=\other
- \catcode`<=\other
- \catcode`>=\other
- \catcode`+=\other
- \catcode`-=\other
-}
-
-\def\pushthisfilestack{%
- \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
-}
-\def\pushthisfilestackX{%
- \expandafter\pushthisfilestackY\thisfile\StackTerm
-}
-\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
- \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
-}
-
-\def\popthisfilestack{\errthisfilestackempty}
-\def\errthisfilestackempty{\errmessage{Internal error:
- the stack of filenames is empty.}}
-
-\def\thisfile{}
-
-% @center line
-% outputs that line, centered.
-%
-\parseargdef\center{%
- \ifhmode
- \let\next\centerH
- \else
- \let\next\centerV
- \fi
- \next{\hfil \ignorespaces#1\unskip \hfil}%
-}
-\def\centerH#1{%
- {%
- \hfil\break
- \advance\hsize by -\leftskip
- \advance\hsize by -\rightskip
- \line{#1}%
- \break
- }%
-}
-\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
-
-% @sp n outputs n lines of vertical space
-
-\parseargdef\sp{\vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore is another way to write a comment
-
-\def\comment{\begingroup \catcode`\^^M=\other%
-\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
-\commentxxx}
-{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
-
-\let\c=\comment
-
-% @paragraphindent NCHARS
-% We'll use ems for NCHARS, close enough.
-% NCHARS can also be the word `asis' or `none'.
-% We cannot feasibly implement @paragraphindent asis, though.
-%
-\def\asisword{asis} % no translation, these are keywords
-\def\noneword{none}
-%
-\parseargdef\paragraphindent{%
- \def\temp{#1}%
- \ifx\temp\asisword
- \else
- \ifx\temp\noneword
- \defaultparindent = 0pt
- \else
- \defaultparindent = #1em
- \fi
- \fi
- \parindent = \defaultparindent
-}
-
-% @exampleindent NCHARS
-% We'll use ems for NCHARS like @paragraphindent.
-% It seems @exampleindent asis isn't necessary, but
-% I preserve it to make it similar to @paragraphindent.
-\parseargdef\exampleindent{%
- \def\temp{#1}%
- \ifx\temp\asisword
- \else
- \ifx\temp\noneword
- \lispnarrowing = 0pt
- \else
- \lispnarrowing = #1em
- \fi
- \fi
-}
-
-% @firstparagraphindent WORD
-% If WORD is `none', then suppress indentation of the first paragraph
-% after a section heading. If WORD is `insert', then do indent at such
-% paragraphs.
-%
-% The paragraph indentation is suppressed or not by calling
-% \suppressfirstparagraphindent, which the sectioning commands do.
-% We switch the definition of this back and forth according to WORD.
-% By default, we suppress indentation.
-%
-\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
-\def\insertword{insert}
-%
-\parseargdef\firstparagraphindent{%
- \def\temp{#1}%
- \ifx\temp\noneword
- \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
- \else\ifx\temp\insertword
- \let\suppressfirstparagraphindent = \relax
- \else
- \errhelp = \EMsimple
- \errmessage{Unknown @firstparagraphindent option `\temp'}%
- \fi\fi
-}
-
-% Here is how we actually suppress indentation. Redefine \everypar to
-% \kern backwards by \parindent, and then reset itself to empty.
-%
-% We also make \indent itself not actually do anything until the next
-% paragraph.
-%
-\gdef\dosuppressfirstparagraphindent{%
- \gdef\indent{%
- \restorefirstparagraphindent
- \indent
- }%
- \gdef\noindent{%
- \restorefirstparagraphindent
- \noindent
- }%
- \global\everypar = {%
- \kern -\parindent
- \restorefirstparagraphindent
- }%
-}
-
-\gdef\restorefirstparagraphindent{%
- \global \let \indent = \ptexindent
- \global \let \noindent = \ptexnoindent
- \global \everypar = {}%
-}
-
-
-% @asis just yields its argument. Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math outputs its argument in math mode.
-%
-% One complication: _ usually means subscripts, but it could also mean
-% an actual _ character, as in @math{@var{some_variable} + 1}. So make
-% _ active, and distinguish by seeing if the current family is \slfam,
-% which is what @var uses.
-{
- \catcode\underChar = \active
- \gdef\mathunderscore{%
- \catcode\underChar=\active
- \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
- }
-}
-% Another complication: we want \\ (and @\) to output a \ character.
-% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
-% this is not advertised and we don't care. Texinfo does not
-% otherwise define @\.
-%
-% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
-\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
-%
-\def\math{%
- \tex
- \mathunderscore
- \let\\ = \mathbackslash
- \mathactive
- $\finishmath
-}
-\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
-
-% Some active characters (such as <) are spaced differently in math.
-% We have to reset their definitions in case the @math was an argument
-% to a command which sets the catcodes (such as @item or @section).
-%
-{
- \catcode`^ = \active
- \catcode`< = \active
- \catcode`> = \active
- \catcode`+ = \active
- \gdef\mathactive{%
- \let^ = \ptexhat
- \let< = \ptexless
- \let> = \ptexgtr
- \let+ = \ptexplus
- }
-}
-
-% @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{$\ptexbullet$}
-\def\minus{$-$}
-
-% @dots{} outputs an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in a typewriter
-% font as three actual period characters.
-%
-\def\dots{%
- \leavevmode
- \hbox to 1.5em{%
- \hskip 0pt plus 0.25fil
- .\hfil.\hfil.%
- \hskip 0pt plus 0.5fil
- }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
- \dots
- \spacefactor=3000
-}
-
-% @comma{} is so commas can be inserted into text without messing up
-% Texinfo's parsing.
-%
-\let\comma = ,
-
-% @refill is a no-op.
-\let\refill=\relax
-
-% If working on a large document in chapters, it is convenient to
-% be able to disable indexing, cross-referencing, and contents, for test runs.
-% This is done with @novalidate (before @setfilename).
-%
-\newif\iflinks \linkstrue % by default we want the aux files.
-\let\novalidate = \linksfalse
-
-% @setfilename is done at the beginning of every texinfo file.
-% So open here the files we need to have open while reading the input.
-% This makes it possible to make a .fmt file for texinfo.
-\def\setfilename{%
- \fixbackslash % Turn off hack to swallow `\input texinfo'.
- \iflinks
- \tryauxfile
- % Open the new aux file. TeX will close it automatically at exit.
- \immediate\openout\auxfile=\jobname.aux
- \fi % \openindices needs to do some work in any case.
- \openindices
- \let\setfilename=\comment % Ignore extra @setfilename cmds.
- %
- % If texinfo.cnf is present on the system, read it.
- % Useful for site-wide @afourpaper, etc.
- \openin 1 texinfo.cnf
- \ifeof 1 \else \input texinfo.cnf \fi
- \closein 1
- %
- \comment % Ignore the actual filename.
-}
-
-% Called from \setfilename.
-%
-\def\openindices{%
- \newindex{cp}%
- \newcodeindex{fn}%
- \newcodeindex{vr}%
- \newcodeindex{tp}%
- \newcodeindex{ky}%
- \newcodeindex{pg}%
-}
-
-% @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-
-\message{pdf,}
-% adobe `portable' document format
-\newcount\tempnum
-\newcount\lnkcount
-\newtoks\filename
-\newcount\filenamelength
-\newcount\pgn
-\newtoks\toksA
-\newtoks\toksB
-\newtoks\toksC
-\newtoks\toksD
-\newbox\boxA
-\newcount\countA
-\newif\ifpdf
-\newif\ifpdfmakepagedest
-
-% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
-% can be set). So we test for \relax and 0 as well as \undefined,
-% borrowed from ifpdf.sty.
-\ifx\pdfoutput\undefined
-\else
- \ifx\pdfoutput\relax
- \else
- \ifcase\pdfoutput
- \else
- \pdftrue
- \fi
- \fi
-\fi
-%
-\ifpdf
- \input pdfcolor
- \pdfcatalog{/PageMode /UseOutlines}%
- \def\dopdfimage#1#2#3{%
- \def\imagewidth{#2}%
- \def\imageheight{#3}%
- % without \immediate, pdftex seg faults when the same image is
- % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
- \ifnum\pdftexversion < 14
- \immediate\pdfimage
- \else
- \immediate\pdfximage
- \fi
- \ifx\empty\imagewidth\else width \imagewidth \fi
- \ifx\empty\imageheight\else height \imageheight \fi
- \ifnum\pdftexversion<13
- #1.pdf%
- \else
- {#1.pdf}%
- \fi
- \ifnum\pdftexversion < 14 \else
- \pdfrefximage \pdflastximage
- \fi}
- \def\pdfmkdest#1{{%
- % We have to set dummies so commands such as @code in a section title
- % aren't expanded.
- \atdummies
- \normalturnoffactive
- \pdfdest name{#1} xyz%
- }}
- \def\pdfmkpgn#1{#1}
- \let\linkcolor = \Blue % was Cyan, but that seems light?
- \def\endlink{\Black\pdfendlink}
- % Adding outlines to PDF; macros for calculating structure of outlines
- % come from Petr Olsak
- \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
- \else \csname#1\endcsname \fi}
- \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
- \advance\tempnum by 1
- \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
- %
- % #1 is the section text. #2 is the pdf expression for the number
- % of subentries (or empty, for subsubsections). #3 is the node
- % text, which might be empty if this toc entry had no
- % corresponding node. #4 is the page number.
- %
- \def\dopdfoutline#1#2#3#4{%
- % Generate a link to the node text if that exists; else, use the
- % page number. We could generate a destination for the section
- % text in the case where a section has no node, but it doesn't
- % seem worthwhile, since most documents are normally structured.
- \def\pdfoutlinedest{#3}%
- \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
- %
- \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
- }
- %
- \def\pdfmakeoutlines{%
- \begingroup
- % Thanh's hack / proper braces in bookmarks
- \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
- \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
- %
- % Read toc silently, to get counts of subentries for \pdfoutline.
- \def\numchapentry##1##2##3##4{%
- \def\thischapnum{##2}%
- \let\thissecnum\empty
- \let\thissubsecnum\empty
- }%
- \def\numsecentry##1##2##3##4{%
- \advancenumber{chap\thischapnum}%
- \def\thissecnum{##2}%
- \let\thissubsecnum\empty
- }%
- \def\numsubsecentry##1##2##3##4{%
- \advancenumber{sec\thissecnum}%
- \def\thissubsecnum{##2}%
- }%
- \def\numsubsubsecentry##1##2##3##4{%
- \advancenumber{subsec\thissubsecnum}%
- }%
- \let\thischapnum\empty
- \let\thissecnum\empty
- \let\thissubsecnum\empty
- %
- % use \def rather than \let here because we redefine \chapentry et
- % al. a second time, below.
- \def\appentry{\numchapentry}%
- \def\appsecentry{\numsecentry}%
- \def\appsubsecentry{\numsubsecentry}%
- \def\appsubsubsecentry{\numsubsubsecentry}%
- \def\unnchapentry{\numchapentry}%
- \def\unnsecentry{\numsecentry}%
- \def\unnsubsecentry{\numsubsecentry}%
- \def\unnsubsubsecentry{\numsubsubsecentry}%
- \input \jobname.toc
- %
- % Read toc second time, this time actually producing the outlines.
- % The `-' means take the \expnumber as the absolute number of
- % subentries, which we calculated on our first read of the .toc above.
- %
- % We use the node names as the destinations.
- \def\numchapentry##1##2##3##4{%
- \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
- \def\numsecentry##1##2##3##4{%
- \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
- \def\numsubsecentry##1##2##3##4{%
- \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
- \def\numsubsubsecentry##1##2##3##4{% count is always zero
- \dopdfoutline{##1}{}{##3}{##4}}%
- %
- % PDF outlines are displayed using system fonts, instead of
- % document fonts. Therefore we cannot use special characters,
- % since the encoding is unknown. For example, the eogonek from
- % Latin 2 (0xea) gets translated to a | character. Info from
- % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
- %
- % xx to do this right, we have to translate 8-bit characters to
- % their "best" equivalent, based on the @documentencoding. Right
- % now, I guess we'll just let the pdf reader have its way.
- \indexnofonts
- \turnoffactive
- \input \jobname.toc
- \endgroup
- }
- %
- \def\makelinks #1,{%
- \def\params{#1}\def\E{END}%
- \ifx\params\E
- \let\nextmakelinks=\relax
- \else
- \let\nextmakelinks=\makelinks
- \ifnum\lnkcount>0,\fi
- \picknum{#1}%
- \startlink attr{/Border [0 0 0]}
- goto name{\pdfmkpgn{\the\pgn}}%
- \linkcolor #1%
- \advance\lnkcount by 1%
- \endlink
- \fi
- \nextmakelinks
- }
- \def\picknum#1{\expandafter\pn#1}
- \def\pn#1{%
- \def\p{#1}%
- \ifx\p\lbrace
- \let\nextpn=\ppn
- \else
- \let\nextpn=\ppnn
- \def\first{#1}
- \fi
- \nextpn
- }
- \def\ppn#1{\pgn=#1\gobble}
- \def\ppnn{\pgn=\first}
- \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
- \def\skipspaces#1{\def\PP{#1}\def\D{|}%
- \ifx\PP\D\let\nextsp\relax
- \else\let\nextsp\skipspaces
- \ifx\p\space\else\addtokens{\filename}{\PP}%
- \advance\filenamelength by 1
- \fi
- \fi
- \nextsp}
- \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
- \ifnum\pdftexversion < 14
- \let \startlink \pdfannotlink
- \else
- \let \startlink \pdfstartlink
- \fi
- \def\pdfurl#1{%
- \begingroup
- \normalturnoffactive\def\@{@}%
- \makevalueexpandable
- \leavevmode\Red
- \startlink attr{/Border [0 0 0]}%
- user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
- \endgroup}
- \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
- \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
- \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
- \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
- \def\maketoks{%
- \expandafter\poptoks\the\toksA|ENDTOKS|\relax
- \ifx\first0\adn0
- \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
- \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
- \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
- \else
- \ifnum0=\countA\else\makelink\fi
- \ifx\first.\let\next=\done\else
- \let\next=\maketoks
- \addtokens{\toksB}{\the\toksD}
- \ifx\first,\addtokens{\toksB}{\space}\fi
- \fi
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \next}
- \def\makelink{\addtokens{\toksB}%
- {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
- \def\pdflink#1{%
- \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
- \linkcolor #1\endlink}
- \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\else
- \let\pdfmkdest = \gobble
- \let\pdfurl = \gobble
- \let\endlink = \relax
- \let\linkcolor = \relax
- \let\pdfmakeoutlines = \relax
-\fi % \ifx\pdfoutput
-
-
-\message{fonts,}
-
-% Change the current font style to #1, remembering it in \curfontstyle.
-% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
-% italics, not bold italics.
-%
-\def\setfontstyle#1{%
- \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
- \csname ten#1\endcsname % change the current font
-}
-
-% Select #1 fonts with the current style.
-%
-\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
-
-\def\rm{\fam=0 \setfontstyle{rm}}
-\def\it{\fam=\itfam \setfontstyle{it}}
-\def\sl{\fam=\slfam \setfontstyle{sl}}
-\def\bf{\fam=\bffam \setfontstyle{bf}}
-\def\tt{\fam=\ttfam \setfontstyle{tt}}
-
-% Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf.
-\newfam\sffam
-\def\sf{\fam=\sffam \setfontstyle{sf}}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-% We don't need math for this font style.
-\def\ttsl{\setfontstyle{ttsl}}
-
-% Default leading.
-\newdimen\textleading \textleading = 13.2pt
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly. There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-\def\setleading#1{%
- \normalbaselineskip = #1\relax
- \normallineskip = \lineskipfactor\normalbaselineskip
- \normalbaselines
- \setbox\strutbox =\hbox{%
- \vrule width0pt height\strutheightpercent\baselineskip
- depth \strutdepthpercent \baselineskip
- }%
-}
-
-% Set the font macro #1 to the font named #2, adding on the
-% specified font prefix (normally `cm').
-% #3 is the font's design size, #4 is a scale factor
-\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\undefined
-\def\fontprefix{cm}
-\fi
-% Support font families that don't use the same naming scheme as CM.
-\def\rmshape{r}
-\def\rmbshape{bx} %where the normal face is bold
-\def\bfshape{b}
-\def\bxshape{bx}
-\def\ttshape{tt}
-\def\ttbshape{tt}
-\def\ttslshape{sltt}
-\def\itshape{ti}
-\def\itbshape{bxti}
-\def\slshape{sl}
-\def\slbshape{bxsl}
-\def\sfshape{ss}
-\def\sfbshape{ss}
-\def\scshape{csc}
-\def\scbshape{csc}
-
-% Text fonts (11.2pt, magstep1).
-\newcount\mainmagstep
-\ifx\bigger\relax
- % not really supported.
- \mainmagstep=\magstep1
- \setfont\textrm\rmshape{12}{1000}
- \setfont\texttt\ttshape{12}{1000}
-\else
- \mainmagstep=\magstephalf
- \setfont\textrm\rmshape{10}{\mainmagstep}
- \setfont\texttt\ttshape{10}{\mainmagstep}
-\fi
-\setfont\textbf\bfshape{10}{\mainmagstep}
-\setfont\textit\itshape{10}{\mainmagstep}
-\setfont\textsl\slshape{10}{\mainmagstep}
-\setfont\textsf\sfshape{10}{\mainmagstep}
-\setfont\textsc\scshape{10}{\mainmagstep}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstep1}
-\setfont\deftt\ttshape{10}{\magstep1}
-\setfont\defttsl\ttslshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\setfont\smallrm\rmshape{9}{1000}
-\setfont\smalltt\ttshape{9}{1000}
-\setfont\smallbf\bfshape{10}{900}
-\setfont\smallit\itshape{9}{1000}
-\setfont\smallsl\slshape{9}{1000}
-\setfont\smallsf\sfshape{9}{1000}
-\setfont\smallsc\scshape{10}{900}
-\setfont\smallttsl\ttslshape{10}{900}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-
-% Fonts for small examples (8pt).
-\setfont\smallerrm\rmshape{8}{1000}
-\setfont\smallertt\ttshape{8}{1000}
-\setfont\smallerbf\bfshape{10}{800}
-\setfont\smallerit\itshape{8}{1000}
-\setfont\smallersl\slshape{8}{1000}
-\setfont\smallersf\sfshape{8}{1000}
-\setfont\smallersc\scshape{10}{800}
-\setfont\smallerttsl\ttslshape{10}{800}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-
-% Fonts for title page (20.4pt):
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\setfont\titleit\itbshape{10}{\magstep4}
-\setfont\titlesl\slbshape{10}{\magstep4}
-\setfont\titlett\ttbshape{12}{\magstep3}
-\setfont\titlettsl\ttslshape{10}{\magstep4}
-\setfont\titlesf\sfbshape{17}{\magstep1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\authorrm{\secrm}
-\def\authortt{\sectt}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\setfont\chaprm\rmbshape{12}{\magstep2}
-\setfont\chapit\itbshape{10}{\magstep3}
-\setfont\chapsl\slbshape{10}{\magstep3}
-\setfont\chaptt\ttbshape{12}{\magstep2}
-\setfont\chapttsl\ttslshape{10}{\magstep3}
-\setfont\chapsf\sfbshape{17}{1000}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-
-% Section fonts (14.4pt).
-\setfont\secrm\rmbshape{12}{\magstep1}
-\setfont\secit\itbshape{10}{\magstep2}
-\setfont\secsl\slbshape{10}{\magstep2}
-\setfont\sectt\ttbshape{12}{\magstep1}
-\setfont\secttsl\ttslshape{10}{\magstep2}
-\setfont\secsf\sfbshape{12}{\magstep1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-
-% Subsection fonts (13.15pt).
-\setfont\ssecrm\rmbshape{12}{\magstephalf}
-\setfont\ssecit\itbshape{10}{1315}
-\setfont\ssecsl\slbshape{10}{1315}
-\setfont\ssectt\ttbshape{12}{\magstephalf}
-\setfont\ssecttsl\ttslshape{10}{1315}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1315}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-
-% Reduced fonts for @acro in text (10pt).
-\setfont\reducedrm\rmshape{10}{1000}
-\setfont\reducedtt\ttshape{10}{1000}
-\setfont\reducedbf\bfshape{10}{1000}
-\setfont\reducedit\itshape{10}{1000}
-\setfont\reducedsl\slshape{10}{1000}
-\setfont\reducedsf\sfshape{10}{1000}
-\setfont\reducedsc\scshape{10}{1000}
-\setfont\reducedttsl\ttslshape{10}{1000}
-\font\reducedi=cmmi10
-\font\reducedsy=cmsy10
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families. Since
-% texinfo doesn't allow for producing subscripts and superscripts except
-% in the main text, we don't bother to reset \scriptfont and
-% \scriptscriptfont (which would also require loading a lot more fonts).
-%
-\def\resetmathfonts{%
- \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
- \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
- \textfont\ttfam=\tentt \textfont\sffam=\tensf
-}
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE. We do this because \STYLE needs to also set the
-% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
-% \tenSTYLE to set the current font.
-%
-% Each font-changing command also sets the names \lsize (one size lower)
-% and \lllsize (three sizes lower). These relative commands are used in
-% the LaTeX logo and acronyms.
-%
-% This all needs generalizing, badly.
-%
-\def\textfonts{%
- \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
- \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
- \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
- \let\tenttsl=\textttsl
- \def\lsize{reduced}\def\lllsize{smaller}%
- \resetmathfonts \setleading{\textleading}}
-\def\titlefonts{%
- \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
- \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
- \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
- \let\tenttsl=\titlettsl
- \def\lsize{chap}\def\lllsize{subsec}%
- \resetmathfonts \setleading{25pt}}
-\def\titlefont#1{{\titlefonts\rm #1}}
-\def\chapfonts{%
- \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
- \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
- \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
- \def\lsize{sec}\def\lllsize{text}%
- \resetmathfonts \setleading{19pt}}
-\def\secfonts{%
- \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
- \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
- \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
- \let\tenttsl=\secttsl
- \def\lsize{subsec}\def\lllsize{reduced}%
- \resetmathfonts \setleading{16pt}}
-\def\subsecfonts{%
- \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
- \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
- \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
- \let\tenttsl=\ssecttsl
- \def\lsize{text}\def\lllsize{small}%
- \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts
-\def\reducedfonts{%
- \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
- \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
- \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
- \let\tenttsl=\reducedttsl
- \def\lsize{small}\def\lllsize{smaller}%
- \resetmathfonts \setleading{10.5pt}}
-\def\smallfonts{%
- \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
- \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
- \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
- \let\tenttsl=\smallttsl
- \def\lsize{smaller}\def\lllsize{smaller}%
- \resetmathfonts \setleading{10.5pt}}
-\def\smallerfonts{%
- \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
- \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
- \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
- \let\tenttsl=\smallerttsl
- \def\lsize{smaller}\def\lllsize{smaller}%
- \resetmathfonts \setleading{9.5pt}}
-
-% Set the fonts to use with the @small... environments.
-\let\smallexamplefonts = \smallfonts
-
-% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
-% can fit this many characters:
-% 8.5x11=86 smallbook=72 a4=90 a5=69
-% If we use \scriptfonts (8pt), then we can fit this many characters:
-% 8.5x11=90+ smallbook=80 a4=90+ a5=77
-% For me, subjectively, the few extra characters that fit aren't worth
-% the additional smallness of 8pt. So I'm making the default 9pt.
-%
-% By the way, for comparison, here's what fits with @example (10pt):
-% 8.5x11=71 smallbook=60 a4=75 a5=58
-%
-% I wish the USA used A4 paper.
-% --karl, 24jan03.
-
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\textfonts \rm
-
-% Define these so they can be easily changed for other fonts.
-\def\angleleft{$\langle$}
-\def\angleright{$\rangle$}
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-% Fonts for short table of contents.
-\setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12
-\setfont\shortcontsl\slshape{12}{1000}
-\setfont\shortconttt\ttshape{12}{1000}
-
-%% Add scribe-like font environments, plus @l for inline lisp (usually sans
-%% serif) and @ii for TeX italic
-
-% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
-% unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
- \ptexslash\fi\fi\fi}
-\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
-\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
-
-% like \smartslanted except unconditionally uses \ttsl.
-% @var is set to this for defun arguments.
-\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
-
-% like \smartslanted except unconditionally use \sl. We never want
-% ttsl for book titles, do we?
-\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
-
-\let\i=\smartitalic
-\let\slanted=\smartslanted
-\let\var=\smartslanted
-\let\dfn=\smartslanted
-\let\emph=\smartitalic
-
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph. Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-% Set sfcode to normal for the chars that usually have another value.
-% Can't use plain's \frenchspacing because it uses the `\x notation, and
-% sometimes \x has an active definition that messes things up.
-%
-\catcode`@=11
- \def\frenchspacing{%
- \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
- \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
- }
-\catcode`@=\other
-
-\def\t#1{%
- {\tt \rawbackslash \frenchspacing #1}%
- \null
-}
-\def\samp#1{`\tclose{#1}'\null}
-\setfont\keyrm\rmshape{8}{1000}
-\font\keysy=cmsy9
-\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
- \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
- \vbox{\hrule\kern-0.4pt
- \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
- \kern-0.4pt\hrule}%
- \kern-.06em\raise0.4pt\hbox{\angleright}}}}
-% The old definition, with no lozenge:
-%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
-% @file, @option are the same as @samp.
-\let\file=\samp
-\let\option=\samp
-
-% @code is a modification of @t,
-% which makes spaces the same size as normal in the surrounding text.
-\def\tclose#1{%
- {%
- % Change normal interword space to be same as for the current font.
- \spaceskip = \fontdimen2\font
- %
- % Switch to typewriter.
- \tt
- %
- % But `\ ' produces the large typewriter interword space.
- \def\ {{\spaceskip = 0pt{} }}%
- %
- % Turn off hyphenation.
- \nohyphenation
- %
- \rawbackslash
- \frenchspacing
- #1%
- }%
- \null
-}
-
-% We *must* turn on hyphenation at `-' and `_' in @code.
-% Otherwise, it is too hard to avoid overfull hboxes
-% in the Emacs manual, the Library manual, etc.
-
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate at a dash.
-% -- rms.
-{
- \catcode`\-=\active
- \catcode`\_=\active
- %
- \global\def\code{\begingroup
- \catcode`\-=\active \let-\codedash
- \catcode`\_=\active \let_\codeunder
- \codex
- }
-}
-
-\def\realdash{-}
-\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{%
- % this is all so @math{@code{var_name}+1} can work. In math mode, _
- % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
- % will therefore expand the active definition of _, which is us
- % (inside @code that is), therefore an endless loop.
- \ifusingtt{\ifmmode
- \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
- \else\normalunderscore \fi
- \discretionary{}{}{}}%
- {\_}%
-}
-\def\codex #1{\tclose{#1}\endgroup}
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-
-% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
-% `example' (@kbd uses ttsl only inside of @example and friends),
-% or `code' (@kbd uses normal tty font always).
-\parseargdef\kbdinputstyle{%
- \def\arg{#1}%
- \ifx\arg\worddistinct
- \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
- \else\ifx\arg\wordexample
- \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
- \else\ifx\arg\wordcode
- \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
- \else
- \errhelp = \EMsimple
- \errmessage{Unknown @kbdinputstyle option `\arg'}%
- \fi\fi\fi
-}
-\def\worddistinct{distinct}
-\def\wordexample{example}
-\def\wordcode{code}
-
-% Default is `distinct.'
-\kbdinputstyle distinct
-
-\def\xkey{\key}
-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
-\ifx\one\xkey\ifx\threex\three \key{#2}%
-\else{\tclose{\kbdfont\look}}\fi
-\else{\tclose{\kbdfont\look}}\fi}
-
-% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
-\let\indicateurl=\code
-\let\env=\code
-\let\command=\code
-
-% @uref (abbreviation for `urlref') takes an optional (comma-separated)
-% second argument specifying the text to display and an optional third
-% arg as text to display instead of (rather than in addition to) the url
-% itself. First (mandatory) arg is the url. Perhaps eventually put in
-% a hypertex \special here.
-%
-\def\uref#1{\douref #1,,,\finish}
-\def\douref#1,#2,#3,#4\finish{\begingroup
- \unsepspaces
- \pdfurl{#1}%
- \setbox0 = \hbox{\ignorespaces #3}%
- \ifdim\wd0 > 0pt
- \unhbox0 % third arg given, show only that
- \else
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0 > 0pt
- \ifpdf
- \unhbox0 % PDF: 2nd arg given, show only it
- \else
- \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
- \fi
- \else
- \code{#1}% only url given, so show it
- \fi
- \fi
- \endlink
-\endgroup}
-
-% @url synonym for @uref, since that's how everyone uses it.
-%
-\let\url=\uref
-
-% rms does not like angle brackets --karl, 17may97.
-% So now @email is just like @uref, unless we are pdf.
-%
-%\def\email#1{\angleleft{\tt #1}\angleright}
-\ifpdf
- \def\email#1{\doemail#1,,\finish}
- \def\doemail#1,#2,#3\finish{\begingroup
- \unsepspaces
- \pdfurl{mailto:#1}%
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
- \endlink
- \endgroup}
-\else
- \let\email=\uref
-\fi
-
-% Check if we are currently using a typewriter font. Since all the
-% Computer Modern typewriter fonts have zero interword stretch (and
-% shrink), and it is reasonable to expect all typewriter fonts to have
-% this property, we can check that font parameter.
-%
-\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
-
-% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
-
-% @l was never documented to mean ``switch to the Lisp font'',
-% and it is not used as such in any manual I can find. We need it for
-% Polish suppressed-l. --karl, 22sep96.
-%\def\l#1{{\li #1}\null}
-
-% Explicit font changes: @r, @sc, undocumented @ii.
-\def\r#1{{\rm #1}} % roman font
-\def\sc#1{{\smallcaps#1}} % smallcaps font
-\def\ii#1{{\it #1}} % italic font
-
-% @acronym for "FBI", "NATO", and the like.
-% We print this one point size smaller, since it's intended for
-% all-uppercase.
-%
-\def\acronym#1{\doacronym #1,,\finish}
-\def\doacronym#1,#2,#3\finish{%
- {\selectfonts\lsize #1}%
- \def\temp{#2}%
- \ifx\temp\empty \else
- \space ({\unsepspaces \ignorespaces \temp \unskip})%
- \fi
-}
-
-% @abbr for "Comput. J." and the like.
-% No font change, but don't do end-of-sentence spacing.
-%
-\def\abbr#1{\doabbr #1,,\finish}
-\def\doabbr#1,#2,#3\finish{%
- {\frenchspacing #1}%
- \def\temp{#2}%
- \ifx\temp\empty \else
- \space ({\unsepspaces \ignorespaces \temp \unskip})%
- \fi
-}
-
-% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
-%
-\def\pounds{{\it\$}}
-
-% @registeredsymbol - R in a circle. The font for the R should really
-% be smaller yet, but lllsize is the best we can do for now.
-% Adapted from the plain.tex definition of \copyright.
-%
-\def\registeredsymbol{%
- $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
- \hfil\crcr\Orb}}%
- }$%
-}
-
-% Laurent Siebenmann reports \Orb undefined with:
-% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
-% so we'll define it if necessary.
-%
-\ifx\Orb\undefined
-\def\Orb{\mathhexbox20D}
-\fi
-
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page. Must do @settitle before @titlepage.
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-% Do an implicit @contents or @shortcontents after @end titlepage if the
-% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
-%
-\newif\ifsetcontentsaftertitlepage
- \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
-\newif\ifsetshortcontentsaftertitlepage
- \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
-
-\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
- \endgroup\page\hbox{}\page}
-
-\envdef\titlepage{%
- % Open one extra group, as we want to close it in the middle of \Etitlepage.
- \begingroup
- \parindent=0pt \textfonts
- % Leave some space at the very top of the page.
- \vglue\titlepagetopglue
- % No rule at page bottom unless we print one at the top with @title.
- \finishedtitlepagetrue
- %
- % Most title ``pages'' are actually two pages long, with space
- % at the top of the second. We don't want the ragged left on the second.
- \let\oldpage = \page
- \def\page{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- \let\page = \oldpage
- \page
- \null
- }%
-}
-
-\def\Etitlepage{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- % It is important to do the page break before ending the group,
- % because the headline and footline are only empty inside the group.
- % If we use the new definition of \page, we always get a blank page
- % after the title page, which we certainly don't want.
- \oldpage
- \endgroup
- %
- % Need this before the \...aftertitlepage checks so that if they are
- % in effect the toc pages will come out with page numbers.
- \HEADINGSon
- %
- % If they want short, they certainly want long too.
- \ifsetshortcontentsaftertitlepage
- \shortcontents
- \contents
- \global\let\shortcontents = \relax
- \global\let\contents = \relax
- \fi
- %
- \ifsetcontentsaftertitlepage
- \contents
- \global\let\contents = \relax
- \global\let\shortcontents = \relax
- \fi
-}
-
-\def\finishtitlepage{%
- \vskip4pt \hrule height 2pt width \hsize
- \vskip\titlepagebottomglue
- \finishedtitlepagetrue
-}
-
-%%% Macros to be used within @titlepage:
-
-\let\subtitlerm=\tenrm
-\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
-
-\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
- \let\tt=\authortt}
-
-\parseargdef\title{%
- \checkenv\titlepage
- \leftline{\titlefonts\rm #1}
- % print a rule at the page bottom also.
- \finishedtitlepagefalse
- \vskip4pt \hrule height 4pt width \hsize \vskip4pt
-}
-
-\parseargdef\subtitle{%
- \checkenv\titlepage
- {\subtitlefont \rightline{#1}}%
-}
-
-% @author should come last, but may come many times.
-% It can also be used inside @quotation.
-%
-\parseargdef\author{%
- \def\temp{\quotation}%
- \ifx\thisenv\temp
- \def\quotationauthor{#1}% printed in \Equotation.
- \else
- \checkenv\titlepage
- \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
- {\authorfont \leftline{#1}}%
- \fi
-}
-
-
-%%% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks\evenheadline % headline on even pages
-\newtoks\oddheadline % headline on odd pages
-\newtoks\evenfootline % footline on even pages
-\newtoks\oddfootline % footline on odd pages
-
-% Now make TeX use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
- \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
- \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what @headings on does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
-\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
-\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
-\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
-\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
- \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
- %
- % Leave some space for the footline. Hopefully ok to assume
- % @evenfooting will not be used by itself.
- \global\advance\pageheight by -\baselineskip
- \global\advance\vsize by -\baselineskip
-}
-
-\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-
-
-% @headings double turns headings on for double-sided printing.
-% @headings single turns headings on for single-sided printing.
-% @headings off turns them off.
-% @headings on same as @headings double, retained for compatibility.
-% @headings after turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off at the start of a document,
-% and turned `on' after @end titlepage.
-
-\def\headings #1 {\csname HEADINGS#1\endcsname}
-
-\def\HEADINGSoff{%
-\global\evenheadline={\hfil} \global\evenfootline={\hfil}
-\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
-\HEADINGSoff
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-\let\contentsalignmacro = \chappager
-
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-
-% Subroutines used in generating headings
-% This produces Day Month Year style of output.
-% Only define if not already defined, in case a txi-??.tex file has set
-% up a different format (e.g., txi-cs.tex does this).
-\ifx\today\undefined
-\def\today{%
- \number\day\space
- \ifcase\month
- \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
- \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
- \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
- \fi
- \space\number\year}
-\fi
-
-% @settitle line... specifies the title of the document, for headings.
-% It generates no output of its own.
-\def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg{\gdef\thistitle}}
-
-
-\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\itemzzz #1{\begingroup %
- \advance\hsize by -\rightskip
- \advance\hsize by -\tableindent
- \setbox0=\hbox{\itemindicate{#1}}%
- \itemindex{#1}%
- \nobreak % This prevents a break before @itemx.
- %
- % If the item text does not fit in the space we have, put it on a line
- % by itself, and do not allow a page break either before or after that
- % line. We do not start a paragraph here because then if the next
- % command is, e.g., @kindex, the whatsit would get put into the
- % horizontal list on a line by itself, resulting in extra blank space.
- \ifdim \wd0>\itemmax
- %
- % Make this a paragraph so we get the \parskip glue and wrapping,
- % but leave it ragged-right.
- \begingroup
- \advance\leftskip by-\tableindent
- \advance\hsize by\tableindent
- \advance\rightskip by0pt plus1fil
- \leavevmode\unhbox0\par
- \endgroup
- %
- % We're going to be starting a paragraph, but we don't want the
- % \parskip glue -- logically it's part of the @item we just started.
- \nobreak \vskip-\parskip
- %
- % Stop a page break at the \parskip glue coming up. However, if
- % what follows is an environment such as @example, there will be no
- % \parskip glue; then the negative vskip we just inserted would
- % cause the example and the item to crash together. So we use this
- % bizarre value of 10001 as a signal to \aboveenvbreak to insert
- % \parskip glue after all. Section titles are handled this way also.
- %
- \penalty 10001
- \endgroup
- \itemxneedsnegativevskipfalse
- \else
- % The item text fits into the space. Start a paragraph, so that the
- % following text (if any) will end up on the same line.
- \noindent
- % Do this with kerns and \unhbox so that if there is a footnote in
- % the item text, it can migrate to the main vertical list and
- % eventually be printed.
- \nobreak\kern-\tableindent
- \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
- \unhbox0
- \nobreak\kern\dimen0
- \endgroup
- \itemxneedsnegativevskiptrue
- \fi
-}
-
-\def\item{\errmessage{@item while not in a list environment}}
-\def\itemx{\errmessage{@itemx while not in a list environment}}
-
-% @table, @ftable, @vtable.
-\envdef\table{%
- \let\itemindex\gobble
- \tablex
-}
-\envdef\ftable{%
- \def\itemindex ##1{\doind {fn}{\code{##1}}}%
- \tablex
-}
-\envdef\vtable{%
- \def\itemindex ##1{\doind {vr}{\code{##1}}}%
- \tablex
-}
-\def\tablex#1{%
- \def\itemindicate{#1}%
- \parsearg\tabley
-}
-\def\tabley#1{%
- {%
- \makevalueexpandable
- \edef\temp{\noexpand\tablez #1\space\space\space}%
- \expandafter
- }\temp \endtablez
-}
-\def\tablez #1 #2 #3 #4\endtablez{%
- \aboveenvbreak
- \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
- \ifnum 0#2>0 \tableindent=#2\mil \fi
- \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
- \itemmax=\tableindent
- \advance \itemmax by -\itemmargin
- \advance \leftskip by \tableindent
- \exdentamount=\tableindent
- \parindent = 0pt
- \parskip = \smallskipamount
- \ifdim \parskip=0pt \parskip=2pt \fi
- \let\item = \internalBitem
- \let\itemx = \internalBitemx
-}
-\def\Etable{\endgraf\afterenvbreak}
-\let\Eftable\Etable
-\let\Evtable\Etable
-\let\Eitemize\Etable
-\let\Eenumerate\Etable
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\envdef\itemize{\parsearg\doitemize}
-
-\def\doitemize#1{%
- \aboveenvbreak
- \itemmax=\itemindent
- \advance\itemmax by -\itemmargin
- \advance\leftskip by \itemindent
- \exdentamount=\itemindent
- \parindent=0pt
- \parskip=\smallskipamount
- \ifdim\parskip=0pt \parskip=2pt \fi
- \def\itemcontents{#1}%
- % @itemize with no arg is equivalent to @itemize @bullet.
- \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
- \let\item=\itemizeitem
-}
-
-% Definition of @item while inside @itemize and @enumerate.
-%
-\def\itemizeitem{%
- \advance\itemno by 1 % for enumerations
- {\let\par=\endgraf \smallbreak}% reasonable place to break
- {%
- % If the document has an @itemize directly after a section title, a
- % \nobreak will be last on the list, and \sectionheading will have
- % done a \vskip-\parskip. In that case, we don't want to zero
- % parskip, or the item text will crash with the heading. On the
- % other hand, when there is normal text preceding the item (as there
- % usually is), we do want to zero parskip, or there would be too much
- % space. In that case, we won't have a \nobreak before. At least
- % that's the theory.
- \ifnum\lastpenalty<10000 \parskip=0in \fi
- \noindent
- \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
- \vadjust{\penalty 1200}}% not good to break after first line of item.
- \flushcr
-}
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list. No
-% argument is the same as `1'.
-%
-\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
- % If we were given no argument, pretend we were given `1'.
- \def\thearg{#1}%
- \ifx\thearg\empty \def\thearg{1}\fi
- %
- % Detect if the argument is a single token. If so, it might be a
- % letter. Otherwise, the only valid thing it can be is a number.
- % (We will always have one token, because of the test we just made.
- % This is a good thing, since \splitoff doesn't work given nothing at
- % all -- the first parameter is undelimited.)
- \expandafter\splitoff\thearg\endmark
- \ifx\rest\empty
- % Only one token in the argument. It could still be anything.
- % A ``lowercase letter'' is one whose \lccode is nonzero.
- % An ``uppercase letter'' is one whose \lccode is both nonzero, and
- % not equal to itself.
- % Otherwise, we assume it's a number.
- %
- % We need the \relax at the end of the \ifnum lines to stop TeX from
- % continuing to look for a <number>.
- %
- \ifnum\lccode\expandafter`\thearg=0\relax
- \numericenumerate % a number (we hope)
- \else
- % It's a letter.
- \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
- \lowercaseenumerate % lowercase letter
- \else
- \uppercaseenumerate % uppercase letter
- \fi
- \fi
- \else
- % Multiple tokens in the argument. We hope it's a number.
- \numericenumerate
- \fi
-}
-
-% An @enumerate whose labels are integers. The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
- \itemno = \thearg
- \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more lowercase letters in @enumerate; get a bigger
- alphabet}%
- \fi
- \char\lccode\itemno
- }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more uppercase letters in @enumerate; get a bigger
- alphabet}
- \fi
- \char\uccode\itemno
- }%
-}
-
-% Call \doitemize, adding a period to the first argument and supplying the
-% common last two arguments. Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
- \advance\itemno by -1
- \doitemize{#1.}\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble. Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-% @multitable @columnfractions .25 .3 .45
-% @item ...
-%
-% Numbers following @columnfractions are the percent of the total
-% current hsize to be used for each column. You may use as many
-% columns as desired.
-
-
-% Or use a template:
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item ...
-% using the widest term desired in each column.
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab do not need to be on their own lines, but it will not hurt
-% if they are.
-
-% Sample multitable:
-
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item first col stuff @tab second col stuff @tab third col
-% @item
-% first col stuff
-% @tab
-% second col stuff
-% @tab
-% third col
-% @item first col stuff @tab second col stuff
-% @tab Many paragraphs of text may be used in any column.
-%
-% They will wrap at the width determined by the template.
-% @item@tab@tab This will be in third column.
-% @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-% to baseline.
-% 0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
-
-% Macros used to set up halign preamble:
-%
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\columnfractions\relax
-\def\xcolumnfractions{\columnfractions}
-\newif\ifsetpercent
-
-% #1 is the @columnfraction, usually a decimal number like .5, but might
-% be just 1. We just use it, whatever it is.
-%
-\def\pickupwholefraction#1 {%
- \global\advance\colcount by 1
- \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
- \setuptable
-}
-
-\newcount\colcount
-\def\setuptable#1{%
- \def\firstarg{#1}%
- \ifx\firstarg\xendsetuptable
- \let\go = \relax
- \else
- \ifx\firstarg\xcolumnfractions
- \global\setpercenttrue
- \else
- \ifsetpercent
- \let\go\pickupwholefraction
- \else
- \global\advance\colcount by 1
- \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
- % separator; typically that is always in the input, anyway.
- \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
- \fi
- \fi
- \ifx\go\pickupwholefraction
- % Put the argument back for the \pickupwholefraction call, so
- % we'll always have a period there to be parsed.
- \def\go{\pickupwholefraction#1}%
- \else
- \let\go = \setuptable
- \fi%
- \fi
- \go
-}
-
-% multitable-only commands.
-%
-% @headitem starts a heading row, which we typeset in bold.
-% Assignments have to be global since we are inside the implicit group
-% of an alignment entry. Note that \everycr resets \everytab.
-\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
-%
-% A \tab used to include \hskip1sp. But then the space in a template
-% line is not enough. That is bad. So let's go back to just `&' until
-% we encounter the problem it was intended to solve again.
-% --karl, nathan@acm.org, 20apr99.
-\def\tab{\checkenv\multitable &\the\everytab}%
-
-% @multitable ... @end multitable definitions:
-%
-\newtoks\everytab % insert after every tab.
-%
-\envdef\multitable{%
- \vskip\parskip
- \startsavinginserts
- %
- % @item within a multitable starts a normal row.
- % We use \def instead of \let so that if one of the multitable entries
- % contains an @itemize, we don't choke on the \item (seen as \crcr aka
- % \endtemplate) expanding \doitemize.
- \def\item{\crcr}%
- %
- \tolerance=9500
- \hbadness=9500
- \setmultitablespacing
- \parskip=\multitableparskip
- \parindent=\multitableparindent
- \overfullrule=0pt
- \global\colcount=0
- %
- \everycr = {%
- \noalign{%
- \global\everytab={}%
- \global\colcount=0 % Reset the column counter.
- % Check for saved footnotes, etc.
- \checkinserts
- % Keeps underfull box messages off when table breaks over pages.
- %\filbreak
- % Maybe so, but it also creates really weird page breaks when the
- % table breaks over pages. Wouldn't \vfil be better? Wait until the
- % problem manifests itself, so it can be fixed for real --karl.
- }%
- }%
- %
- \parsearg\domultitable
-}
-\def\domultitable#1{%
- % To parse everything between @multitable and @item:
- \setuptable#1 \endsetuptable
- %
- % This preamble sets up a generic column definition, which will
- % be used as many times as user calls for columns.
- % \vtop will set a single line and will also let text wrap and
- % continue for many paragraphs if desired.
- \halign\bgroup &%
- \global\advance\colcount by 1
- \multistrut
- \vtop{%
- % Use the current \colcount to find the correct column width:
- \hsize=\expandafter\csname col\the\colcount\endcsname
- %
- % In order to keep entries from bumping into each other
- % we will add a \leftskip of \multitablecolspace to all columns after
- % the first one.
- %
- % If a template has been used, we will add \multitablecolspace
- % to the width of each template entry.
- %
- % If the user has set preamble in terms of percent of \hsize we will
- % use that dimension as the width of the column, and the \leftskip
- % will keep entries from bumping into each other. Table will start at
- % left margin and final column will justify at right margin.
- %
- % Make sure we don't inherit \rightskip from the outer environment.
- \rightskip=0pt
- \ifnum\colcount=1
- % The first column will be indented with the surrounding text.
- \advance\hsize by\leftskip
- \else
- \ifsetpercent \else
- % If user has not set preamble in terms of percent of \hsize
- % we will advance \hsize by \multitablecolspace.
- \advance\hsize by \multitablecolspace
- \fi
- % In either case we will make \leftskip=\multitablecolspace:
- \leftskip=\multitablecolspace
- \fi
- % Ignoring space at the beginning and end avoids an occasional spurious
- % blank line, when TeX decides to break the line at the space before the
- % box from the multistrut, so the strut ends up on a line by itself.
- % For example:
- % @multitable @columnfractions .11 .89
- % @item @code{#}
- % @tab Legal holiday which is valid in major parts of the whole country.
- % Is automatically provided with highlighting sequences respectively
- % marking characters.
- \noindent\ignorespaces##\unskip\multistrut
- }\cr
-}
-\def\Emultitable{%
- \crcr
- \egroup % end the \halign
- \global\setpercentfalse
-}
-
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
-% If so, do nothing. If not, give it an appropriate dimension based on
-% current baselineskip.
-\ifdim\multitablelinespace=0pt
-\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
-\global\advance\multitablelinespace by-\ht0
-%% strut to put in table in case some entry doesn't have descenders,
-%% to keep lines equally spaced
-\let\multistrut = \strut
-\else
-%% FIXME: what is \box0 supposed to be?
-\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
-width0pt\relax} \fi
-%% Test to see if parskip is larger than space between lines of
-%% table. If not, do nothing.
-%% If so, set to same dimension as multitablelinespace.
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
- %% than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
- %% than skip between lines in the table.
-\fi}
-
-
-\message{conditionals,}
-
-% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
-% @ifnotxml always succeed. They currently do nothing; we don't
-% attempt to check whether the conditionals are properly nested. But we
-% have to remember that they are conditionals, so that @end doesn't
-% attempt to close an environment group.
-%
-\def\makecond#1{%
- \expandafter\let\csname #1\endcsname = \relax
- \expandafter\let\csname iscond.#1\endcsname = 1
-}
-\makecond{iftex}
-\makecond{ifnotdocbook}
-\makecond{ifnothtml}
-\makecond{ifnotinfo}
-\makecond{ifnotplaintext}
-\makecond{ifnotxml}
-
-% Ignore @ignore, @ifhtml, @ifinfo, and the like.
-%
-\def\direntry{\doignore{direntry}}
-\def\documentdescription{\doignore{documentdescription}}
-\def\docbook{\doignore{docbook}}
-\def\html{\doignore{html}}
-\def\ifdocbook{\doignore{ifdocbook}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\ifplaintext{\doignore{ifplaintext}}
-\def\ifxml{\doignore{ifxml}}
-\def\ignore{\doignore{ignore}}
-\def\menu{\doignore{menu}}
-\def\xml{\doignore{xml}}
-
-% Ignore text until a line `@end #1', keeping track of nested conditionals.
-%
-% A count to remember the depth of nesting.
-\newcount\doignorecount
-
-\def\doignore#1{\begingroup
- % Scan in ``verbatim'' mode:
- \catcode`\@ = \other
- \catcode`\{ = \other
- \catcode`\} = \other
- %
- % Make sure that spaces turn into tokens that match what \doignoretext wants.
- \spaceisspace
- %
- % Count number of #1's that we've seen.
- \doignorecount = 0
- %
- % Swallow text until we reach the matching `@end #1'.
- \dodoignore{#1}%
-}
-
-{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
- \obeylines %
- %
- \gdef\dodoignore#1{%
- % #1 contains the command name as a string, e.g., `ifinfo'.
- %
- % Define a command to find the next `@end #1', which must be on a line
- % by itself.
- \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
- % And this command to find another #1 command, at the beginning of a
- % line. (Otherwise, we would consider a line `@c @ifset', for
- % example, to count as an @ifset for nesting.)
- \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
- %
- % And now expand that command.
- \obeylines %
- \doignoretext ^^M%
- }%
-}
-
-\def\doignoreyyy#1{%
- \def\temp{#1}%
- \ifx\temp\empty % Nothing found.
- \let\next\doignoretextzzz
- \else % Found a nested condition, ...
- \advance\doignorecount by 1
- \let\next\doignoretextyyy % ..., look for another.
- % If we're here, #1 ends with ^^M\ifinfo (for example).
- \fi
- \next #1% the token \_STOP_ is present just after this macro.
-}
-
-% We have to swallow the remaining "\_STOP_".
-%
-\def\doignoretextzzz#1{%
- \ifnum\doignorecount = 0 % We have just found the outermost @end.
- \let\next\enddoignore
- \else % Still inside a nested condition.
- \advance\doignorecount by -1
- \let\next\doignoretext % Look for the next @end.
- \fi
- \next
-}
-
-% Finish off ignored text.
-\def\enddoignore{\endgroup\ignorespaces}
-
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it.
-% We rely on the fact that \parsearg sets \catcode`\ =10.
-%
-\parseargdef\set{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
- {%
- \makevalueexpandable
- \def\temp{#2}%
- \edef\next{\gdef\makecsname{SET#1}}%
- \ifx\temp\empty
- \next{}%
- \else
- \setzzz#2\endsetzzz
- \fi
- }%
-}
-% Remove the trailing space \setxxx inserted.
-\def\setzzz#1 \endsetzzz{\next{#1}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\parseargdef\clear{%
- {%
- \makevalueexpandable
- \global\expandafter\let\csname SET#1\endcsname=\relax
- }%
-}
-
-% @value{foo} gets the text saved in variable foo.
-\def\value{\begingroup\makevalueexpandable\valuexxx}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
-{
- \catcode`\- = \active \catcode`\_ = \active
- %
- \gdef\makevalueexpandable{%
- \let\value = \expandablevalue
- % We don't want these characters active, ...
- \catcode`\-=\other \catcode`\_=\other
- % ..., but we might end up with active ones in the argument if
- % we're called from @code, as @code{@value{foo-bar_}}, though.
- % So \let them to their normal equivalents.
- \let-\realdash \let_\normalunderscore
- }
-}
-
-% We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we call \makevalueexpandable in \indexdummies).
-% The command has to be fully expandable (if the variable is set), since
-% the result winds up in the index file. This means that if the
-% variable's value contains other Texinfo commands, it's almost certain
-% it will fail (although perhaps we could fix that with sufficient work
-% to do a one-level expansion on the result, instead of complete).
-%
-\def\expandablevalue#1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- {[No value for ``#1'']}%
- \message{Variable `#1', used in @value, is not set.}%
- \else
- \csname SET#1\endcsname
- \fi
-}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-%
-% To get special treatment of `@end ifset,' call \makeond and the redefine.
-%
-\makecond{ifset}
-\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
-\def\doifset#1#2{%
- {%
- \makevalueexpandable
- \let\next=\empty
- \expandafter\ifx\csname SET#2\endcsname\relax
- #1% If not set, redefine \next.
- \fi
- \expandafter
- }\next
-}
-\def\ifsetfail{\doignore{ifset}}
-
-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-% The `\else' inside the `\doifset' parameter is a trick to reuse the
-% above code: if the variable is not set, do nothing, if it is set,
-% then redefine \next to \ifclearfail.
-%
-\makecond{ifclear}
-\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
-\def\ifclearfail{\doignore{ifclear}}
-
-% @dircategory CATEGORY -- specify a category of the dir file
-% which this file should belong to. Ignore this in TeX.
-\let\dircategory=\comment
-
-% @defininfoenclose.
-\let\definfoenclose=\comment
-
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
-
-% \newindex {foo} defines an index named foo.
-% It automatically defines \fooindex such that
-% \fooindex ...rest of line... puts an entry in the index foo.
-% It also defines \fooindfile to be the number of the output channel for
-% the file that accumulates this index. The file's extension is foo.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-%
-\def\newindex#1{%
- \iflinks
- \expandafter\newwrite \csname#1indfile\endcsname
- \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
- \fi
- \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
- \noexpand\doindex{#1}}
-}
-
-% @defindex foo == \newindex{foo}
-%
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-%
-\def\defcodeindex{\parsearg\newcodeindex}
-%
-\def\newcodeindex#1{%
- \iflinks
- \expandafter\newwrite \csname#1indfile\endcsname
- \openout \csname#1indfile\endcsname \jobname.#1
- \fi
- \expandafter\xdef\csname#1index\endcsname{%
- \noexpand\docodeindex{#1}}%
-}
-
-
-% @synindex foo bar makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-%
-% @syncodeindex foo bar similar, but put all entries made for index foo
-% inside @code.
-%
-\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
-\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
-
-% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
-% #3 the target index (bar).
-\def\dosynindex#1#2#3{%
- % Only do \closeout if we haven't already done it, else we'll end up
- % closing the target index.
- \expandafter \ifx\csname donesynindex#2\endcsname \undefined
- % The \closeout helps reduce unnecessary open files; the limit on the
- % Acorn RISC OS is a mere 16 files.
- \expandafter\closeout\csname#2indfile\endcsname
- \expandafter\let\csname\donesynindex#2\endcsname = 1
- \fi
- % redefine \fooindfile:
- \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
- \expandafter\let\csname#2indfile\endcsname=\temp
- % redefine \fooindex:
- \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
-}
-
-% Define \doindex, the driver for all \fooindex macros.
-% Argument #1 is generated by the calling \fooindex macro,
-% and it is "foo", the name of the index.
-
-% \doindex just uses \parsearg; it calls \doind for the actual work.
-% This is because \doind is more useful to call from other macros.
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
-\def\singleindexer #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
-\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
-
-% Take care of Texinfo commands that can appear in an index entry.
-% Since there are some commands we want to expand, and others we don't,
-% we have to laboriously prevent expansion for those that we don't.
-%
-\def\indexdummies{%
- \def\@{@}% change to @@ when we switch to @ as escape char in index files.
- \def\ {\realbackslash\space }%
- % Need these in case \tex is in effect and \{ is a \delimiter again.
- % But can't use \lbracecmd and \rbracecmd because texindex assumes
- % braces and backslashes are used only as delimiters.
- \let\{ = \mylbrace
- \let\} = \myrbrace
- %
- % \definedummyword defines \#1 as \realbackslash #1\space, thus
- % effectively preventing its expansion. This is used only for control
- % words, not control letters, because the \space would be incorrect
- % for control characters, but is needed to separate the control word
- % from whatever follows.
- %
- % For control letters, we have \definedummyletter, which omits the
- % space.
- %
- % These can be used both for control words that take an argument and
- % those that do not. If it is followed by {arg} in the input, then
- % that will dutifully get written to the index (or wherever).
- %
- \def\definedummyword##1{%
- \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
- }%
- \def\definedummyletter##1{%
- \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
- }%
- \let\definedummyaccent\definedummyletter
- %
- % Do the redefinitions.
- \commondummies
-}
-
-% For the aux file, @ is the escape character. So we want to redefine
-% everything using @ instead of \realbackslash. When everything uses
-% @, this will be simpler.
-%
-\def\atdummies{%
- \def\@{@@}%
- \def\ {@ }%
- \let\{ = \lbraceatcmd
- \let\} = \rbraceatcmd
- %
- % (See comments in \indexdummies.)
- \def\definedummyword##1{%
- \expandafter\def\csname ##1\endcsname{@##1\space}%
- }%
- \def\definedummyletter##1{%
- \expandafter\def\csname ##1\endcsname{@##1}%
- }%
- \let\definedummyaccent\definedummyletter
- %
- % Do the redefinitions.
- \commondummies
-}
-
-% Called from \indexdummies and \atdummies. \definedummyword and
-% \definedummyletter must be defined first.
-%
-\def\commondummies{%
- %
- \normalturnoffactive
- %
- \commondummiesnofonts
- %
- \definedummyletter{_}%
- %
- % Non-English letters.
- \definedummyword{AA}%
- \definedummyword{AE}%
- \definedummyword{L}%
- \definedummyword{OE}%
- \definedummyword{O}%
- \definedummyword{aa}%
- \definedummyword{ae}%
- \definedummyword{l}%
- \definedummyword{oe}%
- \definedummyword{o}%
- \definedummyword{ss}%
- \definedummyword{exclamdown}%
- \definedummyword{questiondown}%
- \definedummyword{ordf}%
- \definedummyword{ordm}%
- %
- % Although these internal commands shouldn't show up, sometimes they do.
- \definedummyword{bf}%
- \definedummyword{gtr}%
- \definedummyword{hat}%
- \definedummyword{less}%
- \definedummyword{sf}%
- \definedummyword{sl}%
- \definedummyword{tclose}%
- \definedummyword{tt}%
- %
- \definedummyword{LaTeX}%
- \definedummyword{TeX}%
- %
- % Assorted special characters.
- \definedummyword{bullet}%
- \definedummyword{comma}%
- \definedummyword{copyright}%
- \definedummyword{registeredsymbol}%
- \definedummyword{dots}%
- \definedummyword{enddots}%
- \definedummyword{equiv}%
- \definedummyword{error}%
- \definedummyword{expansion}%
- \definedummyword{minus}%
- \definedummyword{pounds}%
- \definedummyword{point}%
- \definedummyword{print}%
- \definedummyword{result}%
- %
- % Handle some cases of @value -- where it does not contain any
- % (non-fully-expandable) commands.
- \makevalueexpandable
- %
- % Normal spaces, not active ones.
- \unsepspaces
- %
- % No macro expansion.
- \turnoffmacros
-}
-
-% \commondummiesnofonts: common to \commondummies and \indexnofonts.
-%
-% Better have this without active chars.
-{
- \catcode`\~=\other
- \gdef\commondummiesnofonts{%
- % Control letters and accents.
- \definedummyletter{!}%
- \definedummyaccent{"}%
- \definedummyaccent{'}%
- \definedummyletter{*}%
- \definedummyaccent{,}%
- \definedummyletter{.}%
- \definedummyletter{/}%
- \definedummyletter{:}%
- \definedummyaccent{=}%
- \definedummyletter{?}%
- \definedummyaccent{^}%
- \definedummyaccent{`}%
- \definedummyaccent{~}%
- \definedummyword{u}%
- \definedummyword{v}%
- \definedummyword{H}%
- \definedummyword{dotaccent}%
- \definedummyword{ringaccent}%
- \definedummyword{tieaccent}%
- \definedummyword{ubaraccent}%
- \definedummyword{udotaccent}%
- \definedummyword{dotless}%
- %
- % Texinfo font commands.
- \definedummyword{b}%
- \definedummyword{i}%
- \definedummyword{r}%
- \definedummyword{sc}%
- \definedummyword{t}%
- %
- % Commands that take arguments.
- \definedummyword{acronym}%
- \definedummyword{cite}%
- \definedummyword{code}%
- \definedummyword{command}%
- \definedummyword{dfn}%
- \definedummyword{emph}%
- \definedummyword{env}%
- \definedummyword{file}%
- \definedummyword{kbd}%
- \definedummyword{key}%
- \definedummyword{math}%
- \definedummyword{option}%
- \definedummyword{samp}%
- \definedummyword{strong}%
- \definedummyword{tie}%
- \definedummyword{uref}%
- \definedummyword{url}%
- \definedummyword{var}%
- \definedummyword{verb}%
- \definedummyword{w}%
- }
-}
-
-% \indexnofonts is used when outputting the strings to sort the index
-% by, and when constructing control sequence names. It eliminates all
-% control sequences and just writes whatever the best ASCII sort string
-% would be for a given command (usually its argument).
-%
-\def\indexnofonts{%
- % Accent commands should become @asis.
- \def\definedummyaccent##1{%
- \expandafter\let\csname ##1\endcsname\asis
- }%
- % We can just ignore other control letters.
- \def\definedummyletter##1{%
- \expandafter\def\csname ##1\endcsname{}%
- }%
- % Hopefully, all control words can become @asis.
- \let\definedummyword\definedummyaccent
- %
- \commondummiesnofonts
- %
- % Don't no-op \tt, since it isn't a user-level command
- % and is used in the definitions of the active chars like <, >, |, etc.
- % Likewise with the other plain tex font commands.
- %\let\tt=\asis
- %
- \def\ { }%
- \def\@{@}%
- % how to handle braces?
- \def\_{\normalunderscore}%
- %
- % Non-English letters.
- \def\AA{AA}%
- \def\AE{AE}%
- \def\L{L}%
- \def\OE{OE}%
- \def\O{O}%
- \def\aa{aa}%
- \def\ae{ae}%
- \def\l{l}%
- \def\oe{oe}%
- \def\o{o}%
- \def\ss{ss}%
- \def\exclamdown{!}%
- \def\questiondown{?}%
- \def\ordf{a}%
- \def\ordm{o}%
- %
- \def\LaTeX{LaTeX}%
- \def\TeX{TeX}%
- %
- % Assorted special characters.
- % (The following {} will end up in the sort string, but that's ok.)
- \def\bullet{bullet}%
- \def\comma{,}%
- \def\copyright{copyright}%
- \def\registeredsymbol{R}%
- \def\dots{...}%
- \def\enddots{...}%
- \def\equiv{==}%
- \def\error{error}%
- \def\expansion{==>}%
- \def\minus{-}%
- \def\pounds{pounds}%
- \def\point{.}%
- \def\print{-|}%
- \def\result{=>}%
- %
- % Don't write macro names.
- \emptyusermacros
-}
-
-\let\indexbackslash=0 %overridden during \printindex.
-\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
-
-% Most index entries go through here, but \dosubind is the general case.
-% #1 is the index name, #2 is the entry text.
-\def\doind#1#2{\dosubind{#1}{#2}{}}
-
-% Workhorse for all \fooindexes.
-% #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% empty if called from \doind, as we usually are (the main exception
-% is with most defuns, which call us directly).
-%
-\def\dosubind#1#2#3{%
- \iflinks
- {%
- % Store the main index entry text (including the third arg).
- \toks0 = {#2}%
- % If third arg is present, precede it with a space.
- \def\thirdarg{#3}%
- \ifx\thirdarg\empty \else
- \toks0 = \expandafter{\the\toks0 \space #3}%
- \fi
- %
- \edef\writeto{\csname#1indfile\endcsname}%
- %
- \ifvmode
- \dosubindsanitize
- \else
- \dosubindwrite
- \fi
- }%
- \fi
-}
-
-% Write the entry in \toks0 to the index file:
-%
-\def\dosubindwrite{%
- % Put the index entry in the margin if desired.
- \ifx\SETmarginindex\relax\else
- \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
- \fi
- %
- % Remember, we are within a group.
- \indexdummies % Must do this here, since \bf, etc expand at this stage
- \escapechar=`\\
- \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
- % so it will be output as is; and it will print as backslash.
- %
- % Process the index entry with all font commands turned off, to
- % get the string to sort by.
- {\indexnofonts
- \edef\temp{\the\toks0}% need full expansion
- \xdef\indexsorttmp{\temp}%
- }%
- %
- % Set up the complete index entry, with both the sort key and
- % the original text, including any font commands. We write
- % three arguments to \entry to the .?? file (four in the
- % subentry case), texindex reduces to two when writing the .??s
- % sorted result.
- \edef\temp{%
- \write\writeto{%
- \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
- }%
- \temp
-}
-
-% Take care of unwanted page breaks:
-%
-% If a skip is the last thing on the list now, preserve it
-% by backing up by \lastskip, doing the \write, then inserting
-% the skip again. Otherwise, the whatsit generated by the
-% \write will make \lastskip zero. The result is that sequences
-% like this:
-% @end defun
-% @tindex whatever
-% @defun ...
-% will have extra space inserted, because the \medbreak in the
-% start of the @defun won't see the skip inserted by the @end of
-% the previous defun.
-%
-% But don't do any of this if we're not in vertical mode. We
-% don't want to do a \vskip and prematurely end a paragraph.
-%
-% Avoid page breaks due to these extra skips, too.
-%
-% But wait, there is a catch there:
-% We'll have to check whether \lastskip is zero skip. \ifdim is not
-% sufficient for this purpose, as it ignores stretch and shrink parts
-% of the skip. The only way seems to be to check the textual
-% representation of the skip.
-%
-% The following is almost like \def\zeroskipmacro{0.0pt} except that
-% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
-%
-\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
-%
-% ..., ready, GO:
-%
-\def\dosubindsanitize{%
- % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
- \skip0 = \lastskip
- \edef\lastskipmacro{\the\lastskip}%
- \count255 = \lastpenalty
- %
- % If \lastskip is nonzero, that means the last item was a
- % skip. And since a skip is discardable, that means this
- % -\skip0 glue we're inserting is preceded by a
- % non-discardable item, therefore it is not a potential
- % breakpoint, therefore no \nobreak needed.
- \ifx\lastskipmacro\zeroskipmacro
- \else
- \vskip-\skip0
- \fi
- %
- \dosubindwrite
- %
- \ifx\lastskipmacro\zeroskipmacro
- % If \lastskip was zero, perhaps the last item was a penalty, and
- % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
- % to re-insert the same penalty (values >10000 are used for various
- % signals); since we just inserted a non-discardable item, any
- % following glue (such as a \parskip) would be a breakpoint. For example:
- %
- % @deffn deffn-whatever
- % @vindex index-whatever
- % Description.
- % would allow a break between the index-whatever whatsit
- % and the "Description." paragraph.
- \ifnum\count255>9999 \penalty\count255 \fi
- \else
- % On the other hand, if we had a nonzero \lastskip,
- % this make-up glue would be preceded by a non-discardable item
- % (the whatsit from the \write), so we must insert a \nobreak.
- \nobreak\vskip\skip0
- \fi
-}
-
-% The index entry written in the file actually looks like
-% \entry {sortstring}{page}{topic}
-% or
-% \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-% \initial {c}
-% before the first topic whose initial is c
-% \entry {topic}{pagelist}
-% for a topic that is used without subtopics
-% \primary {topic}
-% for the beginning of a topic that is used with subtopics
-% \secondary {subtopic}{pagelist}
-% for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% @printindex causes a particular index (the ??s file) to get printed.
-% It does not print any chapter heading (usually an @unnumbered).
-%
-\parseargdef\printindex{\begingroup
- \dobreak \chapheadingskip{10000}%
- %
- \smallfonts \rm
- \tolerance = 9500
- \everypar = {}% don't want the \kern\-parindent from indentation suppression.
- %
- % See if the index file exists and is nonempty.
- % Change catcode of @ here so that if the index file contains
- % \initial {@}
- % as its first line, TeX doesn't complain about mismatched braces
- % (because it thinks @} is a control sequence).
- \catcode`\@ = 11
- \openin 1 \jobname.#1s
- \ifeof 1
- % \enddoublecolumns gets confused if there is no text in the index,
- % and it loses the chapter title and the aux file entries for the
- % index. The easiest way to prevent this problem is to make sure
- % there is some text.
- \putwordIndexNonexistent
- \else
- %
- % If the index file exists but is empty, then \openin leaves \ifeof
- % false. We have to make TeX try to read something from the file, so
- % it can discover if there is anything in it.
- \read 1 to \temp
- \ifeof 1
- \putwordIndexIsEmpty
- \else
- % Index files are almost Texinfo source, but we use \ as the escape
- % character. It would be better to use @, but that's too big a change
- % to make right now.
- \def\indexbackslash{\backslashcurfont}%
- \catcode`\\ = 0
- \escapechar = `\\
- \begindoublecolumns
- \input \jobname.#1s
- \enddoublecolumns
- \fi
- \fi
- \closein 1
-\endgroup}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-\def\initial#1{{%
- % Some minor font changes for the special characters.
- \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
- %
- % Remove any glue we may have, we'll be inserting our own.
- \removelastskip
- %
- % We like breaks before the index initials, so insert a bonus.
- \nobreak
- \vskip 0pt plus 3\baselineskip
- \penalty 0
- \vskip 0pt plus -3\baselineskip
- %
- % Typeset the initial. Making this add up to a whole number of
- % baselineskips increases the chance of the dots lining up from column
- % to column. It still won't often be perfect, because of the stretch
- % we need before each entry, but it's better.
- %
- % No shrink because it confuses \balancecolumns.
- \vskip 1.67\baselineskip plus .5\baselineskip
- \leftline{\secbf #1}%
- % Do our best not to break after the initial.
- \nobreak
- \vskip .33\baselineskip plus .1\baselineskip
-}}
-
-% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
-% then page number (#2) flushed to the right margin. It is used for index
-% and table of contents entries. The paragraph is indented by \leftskip.
-%
-% A straightforward implementation would start like this:
-% \def\entry#1#2{...
-% But this frozes the catcodes in the argument, and can cause problems to
-% @code, which sets - active. This problem was fixed by a kludge---
-% ``-'' was active throughout whole index, but this isn't really right.
-%
-% The right solution is to prevent \entry from swallowing the whole text.
-% --kasal, 21nov03
-\def\entry{%
- \begingroup
- %
- % Start a new paragraph if necessary, so our assignments below can't
- % affect previous text.
- \par
- %
- % Do not fill out the last line with white space.
- \parfillskip = 0in
- %
- % No extra space above this paragraph.
- \parskip = 0in
- %
- % Do not prefer a separate line ending with a hyphen to fewer lines.
- \finalhyphendemerits = 0
- %
- % \hangindent is only relevant when the entry text and page number
- % don't both fit on one line. In that case, bob suggests starting the
- % dots pretty far over on the line. Unfortunately, a large
- % indentation looks wrong when the entry text itself is broken across
- % lines. So we use a small indentation and put up with long leaders.
- %
- % \hangafter is reset to 1 (which is the value we want) at the start
- % of each paragraph, so we need not do anything with that.
- \hangindent = 2em
- %
- % When the entry text needs to be broken, just fill out the first line
- % with blank space.
- \rightskip = 0pt plus1fil
- %
- % A bit of stretch before each entry for the benefit of balancing
- % columns.
- \vskip 0pt plus1pt
- %
- % Swallow the left brace of the text (first parameter):
- \afterassignment\doentry
- \let\temp =
-}
-\def\doentry{%
- \bgroup % Instead of the swallowed brace.
- \noindent
- \aftergroup\finishentry
- % And now comes the text of the entry.
-}
-\def\finishentry#1{%
- % #1 is the page number.
- %
- % The following is kludged to not output a line of dots in the index if
- % there are no page numbers. The next person who breaks this will be
- % cursed by a Unix daemon.
- \def\tempa{{\rm }}%
- \def\tempb{#1}%
- \edef\tempc{\tempa}%
- \edef\tempd{\tempb}%
- \ifx\tempc\tempd
- \ %
- \else
- %
- % If we must, put the page number on a line of its own, and fill out
- % this line with blank space. (The \hfil is overwhelmed with the
- % fill leaders glue in \indexdotfill if the page number does fit.)
- \hfil\penalty50
- \null\nobreak\indexdotfill % Have leaders before the page number.
- %
- % The `\ ' here is removed by the implicit \unskip that TeX does as
- % part of (the primitive) \par. Without it, a spurious underfull
- % \hbox ensues.
- \ifpdf
- \pdfgettoks#1.%
- \ \the\toksA
- \else
- \ #1%
- \fi
- \fi
- \par
- \endgroup
-}
-
-% Like \dotfill except takes at least 1 em.
-\def\indexdotfill{\cleaders
- \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-\def\secondary#1#2{{%
- \parfillskip=0in
- \parskip=0in
- \hangindent=1in
- \hangafter=1
- \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
- \ifpdf
- \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
- \else
- #2
- \fi
- \par
-}}
-
-% Define two-column mode, which we use to typeset indexes.
-% Adapted from the TeXbook, page 416, which is to say,
-% the manmac.tex format used to print the TeXbook itself.
-\catcode`\@=11
-
-\newbox\partialpage
-\newdimen\doublecolumnhsize
-
-\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
- % Grab any single-column material above us.
- \output = {%
- %
- % Here is a possibility not foreseen in manmac: if we accumulate a
- % whole lot of material, we might end up calling this \output
- % routine twice in a row (see the doublecol-lose test, which is
- % essentially a couple of indexes with @setchapternewpage off). In
- % that case we just ship out what is in \partialpage with the normal
- % output routine. Generally, \partialpage will be empty when this
- % runs and this will be a no-op. See the indexspread.tex test case.
- \ifvoid\partialpage \else
- \onepageout{\pagecontents\partialpage}%
- \fi
- %
- \global\setbox\partialpage = \vbox{%
- % Unvbox the main output page.
- \unvbox\PAGE
- \kern-\topskip \kern\baselineskip
- }%
- }%
- \eject % run that output routine to set \partialpage
- %
- % Use the double-column output routine for subsequent pages.
- \output = {\doublecolumnout}%
- %
- % Change the page size parameters. We could do this once outside this
- % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
- % format, but then we repeat the same computation. Repeating a couple
- % of assignments once per index is clearly meaningless for the
- % execution time, so we may as well do it in one place.
- %
- % First we halve the line length, less a little for the gutter between
- % the columns. We compute the gutter based on the line length, so it
- % changes automatically with the paper format. The magic constant
- % below is chosen so that the gutter has the same value (well, +-<1pt)
- % as it did when we hard-coded it.
- %
- % We put the result in a separate register, \doublecolumhsize, so we
- % can restore it in \pagesofar, after \hsize itself has (potentially)
- % been clobbered.
- %
- \doublecolumnhsize = \hsize
- \advance\doublecolumnhsize by -.04154\hsize
- \divide\doublecolumnhsize by 2
- \hsize = \doublecolumnhsize
- %
- % Double the \vsize as well. (We don't need a separate register here,
- % since nobody clobbers \vsize.)
- \vsize = 2\vsize
-}
-
-% The double-column output routine for all double-column pages except
-% the last.
-%
-\def\doublecolumnout{%
- \splittopskip=\topskip \splitmaxdepth=\maxdepth
- % Get the available space for the double columns -- the normal
- % (undoubled) page height minus any material left over from the
- % previous page.
- \dimen@ = \vsize
- \divide\dimen@ by 2
- \advance\dimen@ by -\ht\partialpage
- %
- % box0 will be the left-hand column, box2 the right.
- \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
- \onepageout\pagesofar
- \unvbox255
- \penalty\outputpenalty
-}
-%
-% Re-output the contents of the output page -- any previous material,
-% followed by the two boxes we just split, in box0 and box2.
-\def\pagesofar{%
- \unvbox\partialpage
- %
- \hsize = \doublecolumnhsize
- \wd0=\hsize \wd2=\hsize
- \hbox to\pagewidth{\box0\hfil\box2}%
-}
-%
-% All done with double columns.
-\def\enddoublecolumns{%
- \output = {%
- % Split the last of the double-column material. Leave it on the
- % current page, no automatic page break.
- \balancecolumns
- %
- % If we end up splitting too much material for the current page,
- % though, there will be another page break right after this \output
- % invocation ends. Having called \balancecolumns once, we do not
- % want to call it again. Therefore, reset \output to its normal
- % definition right away. (We hope \balancecolumns will never be
- % called on to balance too much material, but if it is, this makes
- % the output somewhat more palatable.)
- \global\output = {\onepageout{\pagecontents\PAGE}}%
- }%
- \eject
- \endgroup % started in \begindoublecolumns
- %
- % \pagegoal was set to the doubled \vsize above, since we restarted
- % the current page. We're now back to normal single-column
- % typesetting, so reset \pagegoal to the normal \vsize (after the
- % \endgroup where \vsize got restored).
- \pagegoal = \vsize
-}
-%
-% Called at the end of the double column material.
-\def\balancecolumns{%
- \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
- \dimen@ = \ht0
- \advance\dimen@ by \topskip
- \advance\dimen@ by-\baselineskip
- \divide\dimen@ by 2 % target to split to
- %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
- \splittopskip = \topskip
- % Loop until we get a decent breakpoint.
- {%
- \vbadness = 10000
- \loop
- \global\setbox3 = \copy0
- \global\setbox1 = \vsplit3 to \dimen@
- \ifdim\ht3>\dimen@
- \global\advance\dimen@ by 1pt
- \repeat
- }%
- %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
- \setbox0=\vbox to\dimen@{\unvbox1}%
- \setbox2=\vbox to\dimen@{\unvbox3}%
- %
- \pagesofar
-}
-\catcode`\@ = \other
-
-
-\message{sectioning,}
-% Chapters, sections, etc.
-
-% \unnumberedno is an oxymoron, of course. But we count the unnumbered
-% sections so that we can refer to them unambiguously in the pdf
-% outlines by their "section number". We avoid collisions with chapter
-% numbers by starting them at 10000. (If a document ever has 10000
-% chapters, we're in trouble anyway, I'm sure.)
-\newcount\unnumberedno \unnumberedno = 10000
-\newcount\chapno
-\newcount\secno \secno=0
-\newcount\subsecno \subsecno=0
-\newcount\subsubsecno \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount\appendixno \appendixno = `\@
-%
-% \def\appendixletter{\char\the\appendixno}
-% We do the following ugly conditional instead of the above simple
-% construct for the sake of pdftex, which needs the actual
-% letter in the expansion, not just typeset.
-%
-\def\appendixletter{%
- \ifnum\appendixno=`A A%
- \else\ifnum\appendixno=`B B%
- \else\ifnum\appendixno=`C C%
- \else\ifnum\appendixno=`D D%
- \else\ifnum\appendixno=`E E%
- \else\ifnum\appendixno=`F F%
- \else\ifnum\appendixno=`G G%
- \else\ifnum\appendixno=`H H%
- \else\ifnum\appendixno=`I I%
- \else\ifnum\appendixno=`J J%
- \else\ifnum\appendixno=`K K%
- \else\ifnum\appendixno=`L L%
- \else\ifnum\appendixno=`M M%
- \else\ifnum\appendixno=`N N%
- \else\ifnum\appendixno=`O O%
- \else\ifnum\appendixno=`P P%
- \else\ifnum\appendixno=`Q Q%
- \else\ifnum\appendixno=`R R%
- \else\ifnum\appendixno=`S S%
- \else\ifnum\appendixno=`T T%
- \else\ifnum\appendixno=`U U%
- \else\ifnum\appendixno=`V V%
- \else\ifnum\appendixno=`W W%
- \else\ifnum\appendixno=`X X%
- \else\ifnum\appendixno=`Y Y%
- \else\ifnum\appendixno=`Z Z%
- % The \the is necessary, despite appearances, because \appendixletter is
- % expanded while writing the .toc file. \char\appendixno is not
- % expandable, thus it is written literally, thus all appendixes come out
- % with the same letter (or @) in the toc without it.
- \else\char\the\appendixno
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-% Each @chapter defines this as the name of the chapter.
-% page headings and footings can use it. @section does likewise.
-% However, they are not reliable, because we don't use marks.
-\def\thischapter{}
-\def\thissection{}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% we only have subsub.
-\chardef\maxseclevel = 3
-%
-% A numbered section within an unnumbered changes to unnumbered too.
-% To achive this, remember the "biggest" unnum. sec. we are currently in:
-\chardef\unmlevel = \maxseclevel
-%
-% Trace whether the current chapter is an appendix or not:
-% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
-\def\chapheadtype{N}
-
-% Choose a heading macro
-% #1 is heading type
-% #2 is heading level
-% #3 is text for heading
-\def\genhead#1#2#3{%
- % Compute the abs. sec. level:
- \absseclevel=#2
- \advance\absseclevel by \secbase
- % Make sure \absseclevel doesn't fall outside the range:
- \ifnum \absseclevel < 0
- \absseclevel = 0
- \else
- \ifnum \absseclevel > 3
- \absseclevel = 3
- \fi
- \fi
- % The heading type:
- \def\headtype{#1}%
- \if \headtype U%
- \ifnum \absseclevel < \unmlevel
- \chardef\unmlevel = \absseclevel
- \fi
- \else
- % Check for appendix sections:
- \ifnum \absseclevel = 0
- \edef\chapheadtype{\headtype}%
- \else
- \if \headtype A\if \chapheadtype N%
- \errmessage{@appendix... within a non-appendix chapter}%
- \fi\fi
- \fi
- % Check for numbered within unnumbered:
- \ifnum \absseclevel > \unmlevel
- \def\headtype{U}%
- \else
- \chardef\unmlevel = 3
- \fi
- \fi
- % Now print the heading:
- \if \headtype U%
- \ifcase\absseclevel
- \unnumberedzzz{#3}%
- \or \unnumberedseczzz{#3}%
- \or \unnumberedsubseczzz{#3}%
- \or \unnumberedsubsubseczzz{#3}%
- \fi
- \else
- \if \headtype A%
- \ifcase\absseclevel
- \appendixzzz{#3}%
- \or \appendixsectionzzz{#3}%
- \or \appendixsubseczzz{#3}%
- \or \appendixsubsubseczzz{#3}%
- \fi
- \else
- \ifcase\absseclevel
- \chapterzzz{#3}%
- \or \seczzz{#3}%
- \or \numberedsubseczzz{#3}%
- \or \numberedsubsubseczzz{#3}%
- \fi
- \fi
- \fi
- \suppressfirstparagraphindent
-}
-
-% an interface:
-\def\numhead{\genhead N}
-\def\apphead{\genhead A}
-\def\unnmhead{\genhead U}
-
-% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
-% all lower-level sectioning counters to zero.
-%
-% Also set \chaplevelprefix, which we prepend to @float sequence numbers
-% (e.g., figures), q.v. By default (before any chapter), that is empty.
-\let\chaplevelprefix = \empty
-%
-\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz#1{%
- % section resetting is \global in case the chapter is in a group, such
- % as an @include file.
- \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
- \global\advance\chapno by 1
- %
- % Used for \float.
- \gdef\chaplevelprefix{\the\chapno.}%
- \resetallfloatnos
- %
- \message{\putwordChapter\space \the\chapno}%
- %
- % Write the actual heading.
- \chapmacro{#1}{Ynumbered}{\the\chapno}%
- %
- % So @section and the like are numbered underneath this chapter.
- \global\let\section = \numberedsec
- \global\let\subsection = \numberedsubsec
- \global\let\subsubsection = \numberedsubsubsec
-}
-
-\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz#1{%
- \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
- \global\advance\appendixno by 1
- \gdef\chaplevelprefix{\appendixletter.}%
- \resetallfloatnos
- %
- \def\appendixnum{\putwordAppendix\space \appendixletter}%
- \message{\appendixnum}%
- %
- \chapmacro{#1}{Yappendix}{\appendixletter}%
- %
- \global\let\section = \appendixsec
- \global\let\subsection = \appendixsubsec
- \global\let\subsubsection = \appendixsubsubsec
-}
-
-\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz#1{%
- \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
- \global\advance\unnumberedno by 1
- %
- % Since an unnumbered has no number, no prefix for figures.
- \global\let\chaplevelprefix = \empty
- \resetallfloatnos
- %
- % This used to be simply \message{#1}, but TeX fully expands the
- % argument to \message. Therefore, if #1 contained @-commands, TeX
- % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
- % expanded @cite (which turns out to cause errors because \cite is meant
- % to be executed, not expanded).
- %
- % Anyway, we don't want the fully-expanded definition of @cite to appear
- % as a result of the \message, we just want `@cite' itself. We use
- % \the<toks register> to achieve this: TeX expands \the<toks> only once,
- % simply yielding the contents of <toks register>. (We also do this for
- % the toc entries.)
- \toks0 = {#1}%
- \message{(\the\toks0)}%
- %
- \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
- %
- \global\let\section = \unnumberedsec
- \global\let\subsection = \unnumberedsubsec
- \global\let\subsubsection = \unnumberedsubsubsec
-}
-
-% @centerchap is like @unnumbered, but the heading is centered.
-\outer\parseargdef\centerchap{%
- % Well, we could do the following in a group, but that would break
- % an assumption that \chapmacro is called at the outermost level.
- % Thus we are safer this way: --kasal, 24feb04
- \let\centerparametersmaybe = \centerparameters
- \unnmhead0{#1}%
- \let\centerparametersmaybe = \relax
-}
-
-% @top is like @unnumbered.
-\let\top\unnumbered
-
-% Sections.
-\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
-\def\seczzz#1{%
- \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
- \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
-}
-
-\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz#1{%
- \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
- \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
-}
-\let\appendixsec\appendixsection
-
-\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz#1{%
- \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
- \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
-}
-
-% Subsections.
-\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz#1{%
- \global\subsubsecno=0 \global\advance\subsecno by 1
- \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
-}
-
-\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz#1{%
- \global\subsubsecno=0 \global\advance\subsecno by 1
- \sectionheading{#1}{subsec}{Yappendix}%
- {\appendixletter.\the\secno.\the\subsecno}%
-}
-
-\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz#1{%
- \global\subsubsecno=0 \global\advance\subsecno by 1
- \sectionheading{#1}{subsec}{Ynothing}%
- {\the\unnumberedno.\the\secno.\the\subsecno}%
-}
-
-% Subsubsections.
-\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz#1{%
- \global\advance\subsubsecno by 1
- \sectionheading{#1}{subsubsec}{Ynumbered}%
- {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz#1{%
- \global\advance\subsubsecno by 1
- \sectionheading{#1}{subsubsec}{Yappendix}%
- {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz#1{%
- \global\advance\subsubsecno by 1
- \sectionheading{#1}{subsubsec}{Ynothing}%
- {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\let\section = \numberedsec
-\let\subsection = \numberedsubsec
-\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-% NOTE on use of \vbox for chapter headings, section headings, and such:
-% 1) We use \vbox rather than the earlier \line to permit
-% overlong headings to fold.
-% 2) \hyphenpenalty is set to 10000 because hyphenation in a
-% heading is obnoxious; this forbids it.
-% 3) Likewise, headings look best if no \parindent is used, and
-% if justification is not attempted. Hence \raggedright.
-
-
-\def\majorheading{%
- {\advance\chapheadingskip by 10pt \chapbreak }%
- \parsearg\chapheadingzzz
-}
-
-\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
-\def\chapheadingzzz#1{%
- {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}%
- \bigskip \par\penalty 200\relax
- \suppressfirstparagraphindent
-}
-
-% @heading, @subheading, @subsubheading.
-\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
- \suppressfirstparagraphindent}
-\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
- \suppressfirstparagraphindent}
-\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
- \suppressfirstparagraphindent}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-%%% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-%%% Define plain chapter starts, and page on/off switching for it
-% Parameter controlling skip before chapter headings (if needed)
-
-\newskip\chapheadingskip
-
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-\def\chappager{\par\vfill\supereject}
-\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
-
-\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{%
-\global\let\contentsalignmacro = \chapoddpage
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-% Chapter opening.
-%
-% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
-% Yappendix, Yomitfromtoc), #3 the chapter number.
-%
-% To test against our argument.
-\def\Ynothingkeyword{Ynothing}
-\def\Yomitfromtockeyword{Yomitfromtoc}
-\def\Yappendixkeyword{Yappendix}
-%
-\def\chapmacro#1#2#3{%
- \pchapsepmacro
- {%
- \chapfonts \rm
- %
- % Have to define \thissection before calling \donoderef, because the
- % xref code eventually uses it. On the other hand, it has to be called
- % after \pchapsepmacro, or the headline will change too soon.
- \gdef\thissection{#1}%
- \gdef\thischaptername{#1}%
- %
- % Only insert the separating space if we have a chapter/appendix
- % number, and don't print the unnumbered ``number''.
- \def\temptype{#2}%
- \ifx\temptype\Ynothingkeyword
- \setbox0 = \hbox{}%
- \def\toctype{unnchap}%
- \def\thischapter{#1}%
- \else\ifx\temptype\Yomitfromtockeyword
- \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
- \def\toctype{omit}%
- \xdef\thischapter{}%
- \else\ifx\temptype\Yappendixkeyword
- \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
- \def\toctype{app}%
- % We don't substitute the actual chapter name into \thischapter
- % because we don't want its macros evaluated now. And we don't
- % use \thissection because that changes with each section.
- %
- \xdef\thischapter{\putwordAppendix{} \appendixletter:
- \noexpand\thischaptername}%
- \else
- \setbox0 = \hbox{#3\enspace}%
- \def\toctype{numchap}%
- \xdef\thischapter{\putwordChapter{} \the\chapno:
- \noexpand\thischaptername}%
- \fi\fi\fi
- %
- % Write the toc entry for this chapter. Must come before the
- % \donoderef, because we include the current node name in the toc
- % entry, and \donoderef resets it to empty.
- \writetocentry{\toctype}{#1}{#3}%
- %
- % For pdftex, we have to write out the node definition (aka, make
- % the pdfdest) after any page break, but before the actual text has
- % been typeset. If the destination for the pdf outline is after the
- % text, then jumping from the outline may wind up with the text not
- % being visible, for instance under high magnification.
- \donoderef{#2}%
- %
- % Typeset the actual heading.
- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
- \hangindent=\wd0 \centerparametersmaybe
- \unhbox0 #1\par}%
- }%
- \nobreak\bigskip % no page break after a chapter title
- \nobreak
-}
-
-% @centerchap -- centered and unnumbered.
-\let\centerparametersmaybe = \relax
-\def\centerparameters{%
- \advance\rightskip by 3\rightskip
- \leftskip = \rightskip
- \parfillskip = 0pt
-}
-
-
-% I don't think this chapter style is supported any more, so I'm not
-% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
-%
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-%
-\def\unnchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\nobreak
-}
-\def\chfopen #1#2{\chapoddpage {\chapfonts
-\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
-\par\penalty 5000 %
-}
-\def\centerchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt
- \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
-}
-\def\CHAPFopen{%
- \global\let\chapmacro=\chfopen
- \global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles. These macros combine the section number parts and
-% call the generic \sectionheading to do the printing.
-%
-\newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
-
-% Subsection titles.
-\newskip\subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
-
-% Subsubsection titles.
-\def\subsubsecheadingskip{\subsecheadingskip}
-\def\subsubsecheadingbreak{\subsecheadingbreak}
-
-
-% Print any size, any type, section title.
-%
-% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
-% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
-% section number.
-%
-\def\sectionheading#1#2#3#4{%
- {%
- % Switch to the right set of fonts.
- \csname #2fonts\endcsname \rm
- %
- % Insert space above the heading.
- \csname #2headingbreak\endcsname
- %
- % Only insert the space after the number if we have a section number.
- \def\sectionlevel{#2}%
- \def\temptype{#3}%
- %
- \ifx\temptype\Ynothingkeyword
- \setbox0 = \hbox{}%
- \def\toctype{unn}%
- \gdef\thissection{#1}%
- \else\ifx\temptype\Yomitfromtockeyword
- % for @headings -- no section number, don't include in toc,
- % and don't redefine \thissection.
- \setbox0 = \hbox{}%
- \def\toctype{omit}%
- \let\sectionlevel=\empty
- \else\ifx\temptype\Yappendixkeyword
- \setbox0 = \hbox{#4\enspace}%
- \def\toctype{app}%
- \gdef\thissection{#1}%
- \else
- \setbox0 = \hbox{#4\enspace}%
- \def\toctype{num}%
- \gdef\thissection{#1}%
- \fi\fi\fi
- %
- % Write the toc entry (before \donoderef). See comments in \chfplain.
- \writetocentry{\toctype\sectionlevel}{#1}{#4}%
- %
- % Write the node reference (= pdf destination for pdftex).
- % Again, see comments in \chfplain.
- \donoderef{#3}%
- %
- % Output the actual section heading.
- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
- \hangindent=\wd0 % zero if no section number
- \unhbox0 #1}%
- }%
- % Add extra space after the heading -- half of whatever came above it.
- % Don't allow stretch, though.
- \kern .5 \csname #2headingskip\endcsname
- %
- % Do not let the kern be a potential breakpoint, as it would be if it
- % was followed by glue.
- \nobreak
- %
- % We'll almost certainly start a paragraph next, so don't let that
- % glue accumulate. (Not a breakpoint because it's preceded by a
- % discardable item.)
- \vskip-\parskip
- %
- % This is purely so the last item on the list is a known \penalty >
- % 10000. This is so \startdefun can avoid allowing breakpoints after
- % section headings. Otherwise, it would insert a valid breakpoint between:
- %
- % @section sec-whatever
- % @deffn def-whatever
- \penalty 10001
-}
-
-
-\message{toc,}
-% Table of contents.
-\newwrite\tocfile
-
-% Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.
-%
-% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
-% We append the current node name (if any) and page number as additional
-% arguments for the \{chap,sec,...}entry macros which will eventually
-% read this. The node name is used in the pdf outlines as the
-% destination to jump to.
-%
-% We open the .toc file for writing here instead of at @setfilename (or
-% any other fixed time) so that @contents can be anywhere in the document.
-% But if #1 is `omit', then we don't do anything. This is used for the
-% table of contents chapter openings themselves.
-%
-\newif\iftocfileopened
-\def\omitkeyword{omit}%
-%
-\def\writetocentry#1#2#3{%
- \edef\writetoctype{#1}%
- \ifx\writetoctype\omitkeyword \else
- \iftocfileopened\else
- \immediate\openout\tocfile = \jobname.toc
- \global\tocfileopenedtrue
- \fi
- %
- \iflinks
- \toks0 = {#2}%
- \toks2 = \expandafter{\lastnode}%
- \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
- {\the\toks2}{\noexpand\folio}}}%
- \temp
- \fi
- \fi
- %
- % Tell \shipout to create a pdf destination on each page, if we're
- % writing pdf. These are used in the table of contents. We can't
- % just write one on every page because the title pages are numbered
- % 1 and 2 (the page numbers aren't printed), and so are the first
- % two pages of the document. Thus, we'd have two destinations named
- % `1', and two named `2'.
- \ifpdf \global\pdfmakepagedesttrue \fi
-}
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\newcount\savepageno
-\newcount\lastnegativepageno \lastnegativepageno = -1
-
-% Prepare to read what we've written to \tocfile.
-%
-\def\startcontents#1{%
- % If @setchapternewpage on, and @headings double, the contents should
- % start on an odd page, unlike chapters. Thus, we maintain
- % \contentsalignmacro in parallel with \pagealignmacro.
- % From: Torbjorn Granlund <tege@matematik.su.se>
- \contentsalignmacro
- \immediate\closeout\tocfile
- %
- % Don't need to put `Contents' or `Short Contents' in the headline.
- % It is abundantly clear what they are.
- \def\thischapter{}%
- \chapmacro{#1}{Yomitfromtoc}{}%
- %
- \savepageno = \pageno
- \begingroup % Set up to handle contents files properly.
- \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
- % We can't do this, because then an actual ^ in a section
- % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
- %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
- \raggedbottom % Worry more about breakpoints than the bottom.
- \advance\hsize by -\contentsrightmargin % Don't use the full line length.
- %
- % Roman numerals for page numbers.
- \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
-}
-
-
-% Normal (long) toc.
-\def\contents{%
- \startcontents{\putwordTOC}%
- \openin 1 \jobname.toc
- \ifeof 1 \else
- \input \jobname.toc
- \fi
- \vfill \eject
- \contentsalignmacro % in case @setchapternewpage odd is in effect
- \ifeof 1 \else
- \pdfmakeoutlines
- \fi
- \closein 1
- \endgroup
- \lastnegativepageno = \pageno
- \global\pageno = \savepageno
-}
-
-% And just the chapters.
-\def\summarycontents{%
- \startcontents{\putwordShortTOC}%
- %
- \let\numchapentry = \shortchapentry
- \let\appentry = \shortchapentry
- \let\unnchapentry = \shortunnchapentry
- % We want a true roman here for the page numbers.
- \secfonts
- \let\rm=\shortcontrm \let\bf=\shortcontbf
- \let\sl=\shortcontsl \let\tt=\shortconttt
- \rm
- \hyphenpenalty = 10000
- \advance\baselineskip by 1pt % Open it up a little.
- \def\numsecentry##1##2##3##4{}
- \let\appsecentry = \numsecentry
- \let\unnsecentry = \numsecentry
- \let\numsubsecentry = \numsecentry
- \let\appsubsecentry = \numsecentry
- \let\unnsubsecentry = \numsecentry
- \let\numsubsubsecentry = \numsecentry
- \let\appsubsubsecentry = \numsecentry
- \let\unnsubsubsecentry = \numsecentry
- \openin 1 \jobname.toc
- \ifeof 1 \else
- \input \jobname.toc
- \fi
- \closein 1
- \vfill \eject
- \contentsalignmacro % in case @setchapternewpage odd is in effect
- \endgroup
- \lastnegativepageno = \pageno
- \global\pageno = \savepageno
-}
-\let\shortcontents = \summarycontents
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
-%
-\def\shortchaplabel#1{%
- % This space should be enough, since a single number is .5em, and the
- % widest letter (M) is 1em, at least in the Computer Modern fonts.
- % But use \hss just in case.
- % (This space doesn't include the extra space that gets added after
- % the label; that gets put in by \shortchapentry above.)
- %
- % We'd like to right-justify chapter numbers, but that looks strange
- % with appendix letters. And right-justifying numbers and
- % left-justifying letters looks strange when there is less than 10
- % chapters. Have to read the whole toc once to know how many chapters
- % there are before deciding ...
- \hbox to 1em{#1\hss}%
-}
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Chapters, in the main contents.
-\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
-%
-% Chapters, in the short toc.
-% See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3#4{%
- \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
-}
-
-% Appendices, in the main contents.
-% Need the word Appendix, and a fixed-size box.
-%
-\def\appendixbox#1{%
- % We use M since it's probably the widest letter.
- \setbox0 = \hbox{\putwordAppendix{} M}%
- \hbox to \wd0{\putwordAppendix{} #1\hss}}
-%
-\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
-
-% Unnumbered chapters.
-\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
-\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
-
-% Sections.
-\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
-\let\appsecentry=\numsecentry
-\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
-
-% Subsections.
-\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsecentry=\numsubsecentry
-\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
-
-% And subsubsections.
-\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsubsecentry=\numsubsubsecentry
-\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
-
-% This parameter controls the indentation of the various levels.
-% Same as \defaultparindent.
-\newdimen\tocindent \tocindent = 15pt
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we want it to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
- \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
- \begingroup
- \chapentryfonts
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
- \endgroup
- \nobreak\vskip .25\baselineskip plus.1\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
- \secentryfonts \leftskip=\tocindent
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
- \subsecentryfonts \leftskip=2\tocindent
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
- \subsubsecentryfonts \leftskip=3\tocindent
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-% We use the same \entry macro as for the index entries.
-\let\tocentry = \entry
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\def\subsecentryfonts{\textfonts}
-\def\subsubsecentryfonts{\textfonts}
-
-
-\message{environments,}
-% @foo ... @end foo.
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
-%
-% Since these characters are used in examples, it should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-%
-\def\point{$\star$}
-\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% The @error{} command.
-% Adapted from the TeXbook's \boxit.
-%
-\newbox\errorbox
-%
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
-%
-\setbox\errorbox=\hbox to \dimen0{\hfil
- \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
- \advance\hsize by -2\dimen2 % Rules.
- \vbox{%
- \hrule height\dimen2
- \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
- \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
- \kern3pt\vrule width\dimen2}% Space to right.
- \hrule height\dimen2}
- \hfil}
-%
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @tex ... @end tex escapes into raw Tex temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain tex @ character.
-
-\envdef\tex{%
- \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
- \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
- \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
- \catcode `\%=14
- \catcode `\+=\other
- \catcode `\"=\other
- \catcode `\|=\other
- \catcode `\<=\other
- \catcode `\>=\other
- \escapechar=`\\
- %
- \let\b=\ptexb
- \let\bullet=\ptexbullet
- \let\c=\ptexc
- \let\,=\ptexcomma
- \let\.=\ptexdot
- \let\dots=\ptexdots
- \let\equiv=\ptexequiv
- \let\!=\ptexexclam
- \let\i=\ptexi
- \let\indent=\ptexindent
- \let\noindent=\ptexnoindent
- \let\{=\ptexlbrace
- \let\+=\tabalign
- \let\}=\ptexrbrace
- \let\/=\ptexslash
- \let\*=\ptexstar
- \let\t=\ptext
- %
- \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
- \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
- \def\@{@}%
-}
-% There is no need to define \Etex.
-
-% Define @lisp ... @end lisp.
-% @lisp environment forms a group so it can rebind things,
-% including the definition of @end lisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments. \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical. We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip.
-%
-\def\aboveenvbreak{{%
- % =10000 instead of <10000 because of a special case in \itemzzz and
- % \sectionheading, q.v.
- \ifnum \lastpenalty=10000 \else
- \advance\envskipamount by \parskip
- \endgraf
- \ifdim\lastskip<\envskipamount
- \removelastskip
- % it's not a good place to break if the last penalty was \nobreak
- % or better ...
- \ifnum\lastpenalty<10000 \penalty-50 \fi
- \vskip\envskipamount
- \fi
- \fi
-}}
-
-\let\afterenvbreak = \aboveenvbreak
-
-% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
-\let\nonarrowing=\relax
-
-% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
-% environment contents.
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
- \ctl\leaders\hrule height\circthick\hfil\ctr
- \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
- \cbl\leaders\hrule height\circthick\hfil\cbr
- \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\envdef\cartouche{%
- \ifhmode\par\fi % can't be in the midst of a paragraph.
- \startsavinginserts
- \lskip=\leftskip \rskip=\rightskip
- \leftskip=0pt\rightskip=0pt % we want these *outside*.
- \cartinner=\hsize \advance\cartinner by-\lskip
- \advance\cartinner by-\rskip
- \cartouter=\hsize
- \advance\cartouter by 18.4pt % allow for 3pt kerns on either
- % side, and for 6pt waste from
- % each corner char, and rule thickness
- \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
- % Flag to tell @lisp, etc., not to narrow margin.
- \let\nonarrowing=\comment
- \vbox\bgroup
- \baselineskip=0pt\parskip=0pt\lineskip=0pt
- \carttop
- \hbox\bgroup
- \hskip\lskip
- \vrule\kern3pt
- \vbox\bgroup
- \kern3pt
- \hsize=\cartinner
- \baselineskip=\normbskip
- \lineskip=\normlskip
- \parskip=\normpskip
- \vskip -\parskip
- \comment % For explanation, see the end of \def\group.
-}
-\def\Ecartouche{%
- \ifhmode\par\fi
- \kern3pt
- \egroup
- \kern3pt\vrule
- \hskip\rskip
- \egroup
- \cartbot
- \egroup
- \checkinserts
-}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\def\nonfillstart{%
- \aboveenvbreak
- \hfuzz = 12pt % Don't be fussy
- \sepspaces % Make spaces be word-separators rather than space tokens.
- \let\par = \lisppar % don't ignore blank lines
- \obeylines % each line of input is a line of output
- \parskip = 0pt
- \parindent = 0pt
- \emergencystretch = 0pt % don't try to avoid overfull boxes
- % @cartouche defines \nonarrowing to inhibit narrowing
- % at next level down.
- \ifx\nonarrowing\relax
- \advance \leftskip by \lispnarrowing
- \exdentamount=\lispnarrowing
- \fi
- \let\exdent=\nofillexdent
-}
-
-% If you want all examples etc. small: @set dispenvsize small.
-% If you want even small examples the full size: @set dispenvsize nosmall.
-% This affects the following displayed environments:
-% @example, @display, @format, @lisp
-%
-\def\smallword{small}
-\def\nosmallword{nosmall}
-\let\SETdispenvsize\relax
-\def\setnormaldispenv{%
- \ifx\SETdispenvsize\smallword
- \smallexamplefonts \rm
- \fi
-}
-\def\setsmalldispenv{%
- \ifx\SETdispenvsize\nosmallword
- \else
- \smallexamplefonts \rm
- \fi
-}
-
-% We often define two environments, @foo and @smallfoo.
-% Let's do it by one command:
-\def\makedispenv #1#2{
- \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
- \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
- \expandafter\let\csname E#1\endcsname \afterenvbreak
- \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
-}
-
-% Define two synonyms:
-\def\maketwodispenvs #1#2#3{
- \makedispenv{#1}{#3}
- \makedispenv{#2}{#3}
-}
-
-% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
-%
-% @smallexample and @smalllisp: use smaller fonts.
-% Originally contributed by Pavel@xerox.
-%
-\maketwodispenvs {lisp}{example}{%
- \nonfillstart
- \tt
- \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
- \gobble % eat return
-}
-
-% @display/@smalldisplay: same as @lisp except keep current font.
-%
-\makedispenv {display}{%
- \nonfillstart
- \gobble
-}
-
-% @format/@smallformat: same as @display except don't narrow margins.
-%
-\makedispenv{format}{%
- \let\nonarrowing = t%
- \nonfillstart
- \gobble
-}
-
-% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
-\envdef\flushleft{%
- \let\nonarrowing = t%
- \nonfillstart
- \gobble
-}
-\let\Eflushleft = \afterenvbreak
-
-% @flushright.
-%
-\envdef\flushright{%
- \let\nonarrowing = t%
- \nonfillstart
- \advance\leftskip by 0pt plus 1fill
- \gobble
-}
-\let\Eflushright = \afterenvbreak
-
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins. We keep \parskip nonzero in general, since
-% we're doing normal filling. So, when using \aboveenvbreak and
-% \afterenvbreak, temporarily make \parskip 0.
-%
-\envdef\quotation{%
- {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
- \parindent=0pt
- %
- % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
- \ifx\nonarrowing\relax
- \advance\leftskip by \lispnarrowing
- \advance\rightskip by \lispnarrowing
- \exdentamount = \lispnarrowing
- \let\nonarrowing = \relax
- \fi
- \parsearg\quotationlabel
-}
-
-% We have retained a nonzero parskip for the environment, since we're
-% doing normal filling.
-%
-\def\Equotation{%
- \par
- \ifx\quotationauthor\undefined\else
- % indent a bit.
- \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
- \fi
- {\parskip=0pt \afterenvbreak}%
-}
-
-% If we're given an argument, typeset it in bold with a colon after.
-\def\quotationlabel#1{%
- \def\temp{#1}%
- \ifx\temp\empty \else
- {\bf #1: }%
- \fi
-}
-
-
-% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
-% If we want to allow any <char> as delimiter,
-% we need the curly braces so that makeinfo sees the @verb command, eg:
-% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
-%
-% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
-%
-% [Knuth] p.344; only we need to do the other characters Texinfo sets
-% active too. Otherwise, they get lost as the first character on a
-% verbatim line.
-\def\dospecials{%
- \do\ \do\\\do\{\do\}\do\$\do\&%
- \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
- \do\<\do\>\do\|\do\@\do+\do\"%
-}
-%
-% [Knuth] p. 380
-\def\uncatcodespecials{%
- \def\do##1{\catcode`##1=\other}\dospecials}
-%
-% [Knuth] pp. 380,381,391
-% Disable Spanish ligatures ?` and !` of \tt font
-\begingroup
- \catcode`\`=\active\gdef`{\relax\lq}
-\endgroup
-%
-% Setup for the @verb command.
-%
-% Eight spaces for a tab
-\begingroup
- \catcode`\^^I=\active
- \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
-\endgroup
-%
-\def\setupverb{%
- \tt % easiest (and conventionally used) font for verbatim
- \def\par{\leavevmode\endgraf}%
- \catcode`\`=\active
- \tabeightspaces
- % Respect line breaks,
- % print special symbols as themselves, and
- % make each space count
- % must do in this order:
- \obeylines \uncatcodespecials \sepspaces
-}
-
-% Setup for the @verbatim environment
-%
-% Real tab expansion
-\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
-%
-\def\starttabbox{\setbox0=\hbox\bgroup}
-\begingroup
- \catcode`\^^I=\active
- \gdef\tabexpand{%
- \catcode`\^^I=\active
- \def^^I{\leavevmode\egroup
- \dimen0=\wd0 % the width so far, or since the previous tab
- \divide\dimen0 by\tabw
- \multiply\dimen0 by\tabw % compute previous multiple of \tabw
- \advance\dimen0 by\tabw % advance to next multiple of \tabw
- \wd0=\dimen0 \box0 \starttabbox
- }%
- }
-\endgroup
-\def\setupverbatim{%
- \nonfillstart
- \advance\leftskip by -\defbodyindent
- % Easiest (and conventionally used) font for verbatim
- \tt
- \def\par{\leavevmode\egroup\box0\endgraf}%
- \catcode`\`=\active
- \tabexpand
- % Respect line breaks,
- % print special symbols as themselves, and
- % make each space count
- % must do in this order:
- \obeylines \uncatcodespecials \sepspaces
- \everypar{\starttabbox}%
-}
-
-% Do the @verb magic: verbatim text is quoted by unique
-% delimiter characters. Before first delimiter expect a
-% right brace, after last delimiter expect closing brace:
-%
-% \def\doverb'{'<char>#1<char>'}'{#1}
-%
-% [Knuth] p. 382; only eat outer {}
-\begingroup
- \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
- \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
-\endgroup
-%
-\def\verb{\begingroup\setupverb\doverb}
-%
-%
-% Do the @verbatim magic: define the macro \doverbatim so that
-% the (first) argument ends when '@end verbatim' is reached, ie:
-%
-% \def\doverbatim#1@end verbatim{#1}
-%
-% For Texinfo it's a lot easier than for LaTeX,
-% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'.
-%
-% Inspired by LaTeX's verbatim command set [latex.ltx]
-%
-\begingroup
- \catcode`\ =\active
- \obeylines %
- % ignore everything up to the first ^^M, that's the newline at the end
- % of the @verbatim input line itself. Otherwise we get an extra blank
- % line in the output.
- \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
- % We really want {...\end verbatim} in the body of the macro, but
- % without the active space; thus we have to use \xdef and \gobble.
-\endgroup
-%
-\envdef\verbatim{%
- \setupverbatim\doverbatim
-}
-\let\Everbatim = \afterenvbreak
-
-
-% @verbatiminclude FILE - insert text of file in verbatim environment.
-%
-\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
-%
-\def\doverbatiminclude#1{%
- {%
- \makevalueexpandable
- \setupverbatim
- \input #1
- \afterenvbreak
- }%
-}
-
-% @copying ... @end copying.
-% Save the text away for @insertcopying later.
-%
-% We save the uninterpreted tokens, rather than creating a box.
-% Saving the text in a box would be much easier, but then all the
-% typesetting commands (@smallbook, font changes, etc.) have to be done
-% beforehand -- and a) we want @copying to be done first in the source
-% file; b) letting users define the frontmatter in as flexible order as
-% possible is very desirable.
-%
-\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
-\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
-%
-\def\insertcopying{%
- \begingroup
- \parindent = 0pt % paragraph indentation looks wrong on title page
- \scanexp\copyingtext
- \endgroup
-}
-
-\message{defuns,}
-% @defun etc.
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-
-% Start the processing of @deffn:
-\def\startdefun{%
- \ifnum\lastpenalty<10000
- \medbreak
- \else
- % If there are two @def commands in a row, we'll have a \nobreak,
- % which is there to keep the function description together with its
- % header. But if there's nothing but headers, we need to allow a
- % break somewhere. Check specifically for penalty 10002, inserted
- % by \defargscommonending, instead of 10000, since the sectioning
- % commands also insert a nobreak penalty, and we don't want to allow
- % a break between a section heading and a defun.
- %
- \ifnum\lastpenalty=10002 \penalty2000 \fi
- %
- % Similarly, after a section heading, do not allow a break.
- % But do insert the glue.
- \medskip % preceded by discardable penalty, so not a breakpoint
- \fi
- %
- \parindent=0in
- \advance\leftskip by \defbodyindent
- \exdentamount=\defbodyindent
-}
-
-\def\dodefunx#1{%
- % First, check whether we are in the right environment:
- \checkenv#1%
- %
- % As above, allow line break if we have multiple x headers in a row.
- % It's not a great place, though.
- \ifnum\lastpenalty=10002 \penalty3000 \fi
- %
- % And now, it's time to reuse the body of the original defun:
- \expandafter\gobbledefun#1%
-}
-\def\gobbledefun#1\startdefun{}
-
-% \printdefunline \deffnheader{text}
-%
-\def\printdefunline#1#2{%
- \begingroup
- % call \deffnheader:
- #1#2 \endheader
- % common ending:
- \interlinepenalty = 10000
- \advance\rightskip by 0pt plus 1fil
- \endgraf
- \nobreak\vskip -\parskip
- \penalty 10002 % signal to \startdefun and \dodefunx
- % Some of the @defun-type tags do not enable magic parentheses,
- % rendering the following check redundant. But we don't optimize.
- \checkparencounts
- \endgroup
-}
-
-\def\Edefun{\endgraf\medbreak}
-
-% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
-% the only thing remainnig is to define \deffnheader.
-%
-\def\makedefun#1{%
- \expandafter\let\csname E#1\endcsname = \Edefun
- \edef\temp{\noexpand\domakedefun
- \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
- \temp
-}
-
-% \domakedefun \deffn \deffnx \deffnheader
-%
-% Define \deffn and \deffnx, without parameters.
-% \deffnheader has to be defined explicitly.
-%
-\def\domakedefun#1#2#3{%
- \envdef#1{%
- \startdefun
- \parseargusing\activeparens{\printdefunline#3}%
- }%
- \def#2{\dodefunx#1}%
- \def#3%
-}
-
-%%% Untyped functions:
-
-% @deffn category name args
-\makedefun{deffn}{\deffngeneral{}}
-
-% @deffn category class name args
-\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
-
-% \defopon {category on}class name args
-\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deffngeneral {subind}category name args
-%
-\def\deffngeneral#1#2 #3 #4\endheader{%
- % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
- \dosubind{fn}{\code{#3}}{#1}%
- \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
-}
-
-%%% Typed functions:
-
-% @deftypefn category type name args
-\makedefun{deftypefn}{\deftypefngeneral{}}
-
-% @deftypeop category class type name args
-\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
-
-% \deftypeopon {category on}class type name args
-\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypefngeneral {subind}category type name args
-%
-\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
- \dosubind{fn}{\code{#4}}{#1}%
- \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-%%% Typed variables:
-
-% @deftypevr category type var args
-\makedefun{deftypevr}{\deftypecvgeneral{}}
-
-% @deftypecv category class type var args
-\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
-
-% \deftypecvof {category of}class type var args
-\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypecvgeneral {subind}category type var args
-%
-\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
- \dosubind{vr}{\code{#4}}{#1}%
- \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-%%% Untyped variables:
-
-% @defvr category var args
-\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
-
-% @defcv category class var args
-\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
-
-% \defcvof {category of}class var args
-\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
-
-%%% Type:
-% @deftp category name args
-\makedefun{deftp}#1 #2 #3\endheader{%
- \doind{tp}{\code{#2}}%
- \defname{#1}{}{#2}\defunargs{#3\unskip}%
-}
-
-% Remaining @defun-like shortcuts:
-\makedefun{defun}{\deffnheader{\putwordDeffunc} }
-\makedefun{defmac}{\deffnheader{\putwordDefmac} }
-\makedefun{defspec}{\deffnheader{\putwordDefspec} }
-\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
-\makedefun{defvar}{\defvrheader{\putwordDefvar} }
-\makedefun{defopt}{\defvrheader{\putwordDefopt} }
-\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
-\makedefun{defmethod}{\defopon\putwordMethodon}
-\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
-\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
-\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
-
-% \defname, which formats the name of the @def (not the args).
-% #1 is the category, such as "Function".
-% #2 is the return type, if any.
-% #3 is the function name.
-%
-% We are followed by (but not passed) the arguments, if any.
-%
-\def\defname#1#2#3{%
- % Get the values of \leftskip and \rightskip as they were outside the @def...
- \advance\leftskip by -\defbodyindent
- %
- % How we'll format the type name. Putting it in brackets helps
- % distinguish it from the body text that may end up on the next line
- % just below it.
- \def\temp{#1}%
- \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
- %
- % Figure out line sizes for the paragraph shape.
- % The first line needs space for \box0; but if \rightskip is nonzero,
- % we need only space for the part of \box0 which exceeds it:
- \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
- % The continuations:
- \dimen2=\hsize \advance\dimen2 by -\defargsindent
- % (plain.tex says that \dimen1 should be used only as global.)
- \parshape 2 0in \dimen0 \defargsindent \dimen2
- %
- % Put the type name to the right margin.
- \noindent
- \hbox to 0pt{%
- \hfil\box0 \kern-\hsize
- % \hsize has to be shortened this way:
- \kern\leftskip
- % Intentionally do not respect \rightskip, since we need the space.
- }%
- %
- % Allow all lines to be underfull without complaint:
- \tolerance=10000 \hbadness=10000
- \exdentamount=\defbodyindent
- {%
- % defun fonts. We use typewriter by default (used to be bold) because:
- % . we're printing identifiers, they should be in tt in principle.
- % . in languages with many accents, such as Czech or French, it's
- % common to leave accents off identifiers. The result looks ok in
- % tt, but exceedingly strange in rm.
- % . we don't want -- and --- to be treated as ligatures.
- % . this still does not fix the ?` and !` ligatures, but so far no
- % one has made identifiers using them :).
- \df \tt
- \def\temp{#2}% return value type
- \ifx\temp\empty\else \tclose{\temp} \fi
- #3% output function name
- }%
- {\rm\enskip}% hskip 0.5 em of \tenrm
- %
- \boldbrax
- % arguments will be output next, if any.
-}
-
-% Print arguments in slanted roman (not ttsl), inconsistently with using
-% tt for the name. This is because literal text is sometimes needed in
-% the argument list (groff manual), and ttsl and tt are not very
-% distinguishable. Prevent hyphenation at `-' chars.
-%
-\def\defunargs#1{%
- % use sl by default (not ttsl),
- % tt for the names.
- \df \sl \hyphenchar\font=0
- %
- % On the other hand, if an argument has two dashes (for instance), we
- % want a way to get ttsl. Let's try @var for that.
- \let\var=\ttslanted
- #1%
- \sl\hyphenchar\font=45
-}
-
-% We want ()&[] to print specially on the defun line.
-%
-\def\activeparens{%
- \catcode`\(=\active \catcode`\)=\active
- \catcode`\[=\active \catcode`\]=\active
- \catcode`\&=\active
-}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-% Be sure that we always have a definition for `(', etc. For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-{
- \activeparens
- \global\let(=\lparen \global\let)=\rparen
- \global\let[=\lbrack \global\let]=\rbrack
- \global\let& = \&
-
- \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
- \gdef\magicamp{\let&=\amprm}
-}
-
-\newcount\parencount
-
-% If we encounter &foo, then turn on ()-hacking afterwards
-\newif\ifampseen
-\def\amprm#1 {\ampseentrue{\bf\&#1 }}
-
-\def\parenfont{%
- \ifampseen
- % At the first level, print parens in roman,
- % otherwise use the default font.
- \ifnum \parencount=1 \rm \fi
- \else
- % The \sf parens (in \boldbrax) actually are a little bolder than
- % the contained text. This is especially needed for [ and ] .
- \sf
- \fi
-}
-\def\infirstlevel#1{%
- \ifampseen
- \ifnum\parencount=1
- #1%
- \fi
- \fi
-}
-\def\bfafterword#1 {#1 \bf}
-
-\def\opnr{%
- \global\advance\parencount by 1
- {\parenfont(}%
- \infirstlevel \bfafterword
-}
-\def\clnr{%
- {\parenfont)}%
- \infirstlevel \sl
- \global\advance\parencount by -1
-}
-
-\newcount\brackcount
-\def\lbrb{%
- \global\advance\brackcount by 1
- {\bf[}%
-}
-\def\rbrb{%
- {\bf]}%
- \global\advance\brackcount by -1
-}
-
-\def\checkparencounts{%
- \ifnum\parencount=0 \else \badparencount \fi
- \ifnum\brackcount=0 \else \badbrackcount \fi
-}
-\def\badparencount{%
- \errmessage{Unbalanced parentheses in @def}%
- \global\parencount=0
-}
-\def\badbrackcount{%
- \errmessage{Unbalanced square braces in @def}%
- \global\brackcount=0
-}
-
-
-\message{macros,}
-% @macro.
-
-% To do this right we need a feature of e-TeX, \scantokens,
-% which we arrange to emulate with a temporary file in ordinary TeX.
-\ifx\eTeXversion\undefined
- \newwrite\macscribble
- \def\scantokens#1{%
- \toks0={#1}%
- \immediate\openout\macscribble=\jobname.tmp
- \immediate\write\macscribble{\the\toks0}%
- \immediate\closeout\macscribble
- \input \jobname.tmp
- }
-\fi
-
-\def\scanmacro#1{%
- \begingroup
- \newlinechar`\^^M
- \let\xeatspaces\eatspaces
- % Undo catcode changes of \startcontents and \doprintindex
- % When called from @insertcopying or (short)caption, we need active
- % backslash to get it printed correctly. Previously, we had
- % \catcode`\\=\other instead. We'll see whether a problem appears
- % with macro expansion. --kasal, 19aug04
- \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
- % ... and \example
- \spaceisspace
- %
- % Append \endinput to make sure that TeX does not see the ending newline.
- %
- % I've verified that it is necessary both for e-TeX and for ordinary TeX
- % --kasal, 29nov03
- \scantokens{#1\endinput}%
- \endgroup
-}
-
-\def\scanexp#1{%
- \edef\temp{\noexpand\scanmacro{#1}}%
- \temp
-}
-
-\newcount\paramno % Count of parameters
-\newtoks\macname % Macro name
-\newif\ifrecursive % Is it recursive?
-\def\macrolist{} % List of all defined macros in the form
- % \do\macro1\do\macro2...
-
-% Utility routines.
-% This does \let #1 = #2, with \csnames; that is,
-% \let \csname#1\endcsname = \csname#2\endcsname
-% (except of course we have to play expansion games).
-%
-\def\cslet#1#2{%
- \expandafter\let
- \csname#1\expandafter\endcsname
- \csname#2\endcsname
-}
-
-% Trim leading and trailing spaces off a string.
-% Concepts from aro-bend problem 15 (see CTAN).
-{\catcode`\@=11
-\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
-\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
-\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
-\def\unbrace#1{#1}
-\unbrace{\gdef\trim@@@ #1 } #2@{#1}
-}
-
-% Trim a single trailing ^^M off a string.
-{\catcode`\^^M=\other \catcode`\Q=3%
-\gdef\eatcr #1{\eatcra #1Q^^MQ}%
-\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
-\gdef\eatcrb#1Q#2Q{#1}%
-}
-
-% Macro bodies are absorbed as an argument in a context where
-% all characters are catcode 10, 11 or 12, except \ which is active
-% (as in normal texinfo). It is necessary to change the definition of \.
-
-% It's necessary to have hard CRs when the macro is executed. This is
-% done by making ^^M (\endlinechar) catcode 12 when reading the macro
-% body, and then making it the \newlinechar in \scanmacro.
-
-\def\scanctxt{%
- \catcode`\"=\other
- \catcode`\+=\other
- \catcode`\<=\other
- \catcode`\>=\other
- \catcode`\@=\other
- \catcode`\^=\other
- \catcode`\_=\other
- \catcode`\|=\other
- \catcode`\~=\other
-}
-
-\def\scanargctxt{%
- \scanctxt
- \catcode`\\=\other
- \catcode`\^^M=\other
-}
-
-\def\macrobodyctxt{%
- \scanctxt
- \catcode`\{=\other
- \catcode`\}=\other
- \catcode`\^^M=\other
- \usembodybackslash
-}
-
-\def\macroargctxt{%
- \scanctxt
- \catcode`\\=\other
-}
-
-% \mbodybackslash is the definition of \ in @macro bodies.
-% It maps \foo\ => \csname macarg.foo\endcsname => #N
-% where N is the macro parameter number.
-% We define \csname macarg.\endcsname to be \realbackslash, so
-% \\ in macro replacement text gets you a backslash.
-
-{\catcode`@=0 @catcode`@\=@active
- @gdef@usembodybackslash{@let\=@mbodybackslash}
- @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
-}
-\expandafter\def\csname macarg.\endcsname{\realbackslash}
-
-\def\macro{\recursivefalse\parsearg\macroxxx}
-\def\rmacro{\recursivetrue\parsearg\macroxxx}
-
-\def\macroxxx#1{%
- \getargs{#1}% now \macname is the macname and \argl the arglist
- \ifx\argl\empty % no arguments
- \paramno=0%
- \else
- \expandafter\parsemargdef \argl;%
- \fi
- \if1\csname ismacro.\the\macname\endcsname
- \message{Warning: redefining \the\macname}%
- \else
- \expandafter\ifx\csname \the\macname\endcsname \relax
- \else \errmessage{Macro name \the\macname\space already defined}\fi
- \global\cslet{macsave.\the\macname}{\the\macname}%
- \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
- % Add the macroname to \macrolist
- \toks0 = \expandafter{\macrolist\do}%
- \xdef\macrolist{\the\toks0
- \expandafter\noexpand\csname\the\macname\endcsname}%
- \fi
- \begingroup \macrobodyctxt
- \ifrecursive \expandafter\parsermacbody
- \else \expandafter\parsemacbody
- \fi}
-
-\parseargdef\unmacro{%
- \if1\csname ismacro.#1\endcsname
- \global\cslet{#1}{macsave.#1}%
- \global\expandafter\let \csname ismacro.#1\endcsname=0%
- % Remove the macro name from \macrolist:
- \begingroup
- \expandafter\let\csname#1\endcsname \relax
- \let\do\unmacrodo
- \xdef\macrolist{\macrolist}%
- \endgroup
- \else
- \errmessage{Macro #1 not defined}%
- \fi
-}
-
-% Called by \do from \dounmacro on each macro. The idea is to omit any
-% macro definitions that have been changed to \relax.
-%
-\def\unmacrodo#1{%
- \ifx#1\relax
- % remove this
- \else
- \noexpand\do \noexpand #1%
- \fi
-}
-
-% This makes use of the obscure feature that if the last token of a
-% <parameter list> is #, then the preceding argument is delimited by
-% an opening brace, and that opening brace is not consumed.
-\def\getargs#1{\getargsxxx#1{}}
-\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
-\def\getmacname #1 #2\relax{\macname={#1}}
-\def\getmacargs#1{\def\argl{#1}}
-
-% Parse the optional {params} list. Set up \paramno and \paramlist
-% so \defmacro knows what to do. Define \macarg.blah for each blah
-% in the params list, to be ##N where N is the position in that list.
-% That gets used by \mbodybackslash (above).
-
-% We need to get `macro parameter char #' into several definitions.
-% The technique used is stolen from LaTeX: let \hash be something
-% unexpandable, insert that wherever you need a #, and then redefine
-% it to # just before using the token list produced.
-%
-% The same technique is used to protect \eatspaces till just before
-% the macro is used.
-
-\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
- \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
-\def\parsemargdefxxx#1,{%
- \if#1;\let\next=\relax
- \else \let\next=\parsemargdefxxx
- \advance\paramno by 1%
- \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
- {\xeatspaces{\hash\the\paramno}}%
- \edef\paramlist{\paramlist\hash\the\paramno,}%
- \fi\next}
-
-% These two commands read recursive and nonrecursive macro bodies.
-% (They're different since rec and nonrec macros end differently.)
-
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-\long\def\parsermacbody#1@end rmacro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-
-% This defines the macro itself. There are six cases: recursive and
-% nonrecursive macros of zero, one, and many arguments.
-% Much magic with \expandafter here.
-% \xdef is used so that macro definitions will survive the file
-% they're defined in; @include reads the file inside a group.
-\def\defmacro{%
- \let\hash=##% convert placeholders to macro parameter chars
- \ifrecursive
- \ifcase\paramno
- % 0
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\scanmacro{\temp}}%
- \or % 1
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \noexpand\braceorline
- \expandafter\noexpand\csname\the\macname xxx\endcsname}%
- \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
- \egroup\noexpand\scanmacro{\temp}}%
- \else % many
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \noexpand\csname\the\macname xx\endcsname}%
- \expandafter\xdef\csname\the\macname xx\endcsname##1{%
- \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
- \expandafter\expandafter
- \expandafter\xdef
- \expandafter\expandafter
- \csname\the\macname xxx\endcsname
- \paramlist{\egroup\noexpand\scanmacro{\temp}}%
- \fi
- \else
- \ifcase\paramno
- % 0
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\norecurse{\the\macname}%
- \noexpand\scanmacro{\temp}\egroup}%
- \or % 1
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \noexpand\braceorline
- \expandafter\noexpand\csname\the\macname xxx\endcsname}%
- \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
- \egroup
- \noexpand\norecurse{\the\macname}%
- \noexpand\scanmacro{\temp}\egroup}%
- \else % many
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \expandafter\noexpand\csname\the\macname xx\endcsname}%
- \expandafter\xdef\csname\the\macname xx\endcsname##1{%
- \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
- \expandafter\expandafter
- \expandafter\xdef
- \expandafter\expandafter
- \csname\the\macname xxx\endcsname
- \paramlist{%
- \egroup
- \noexpand\norecurse{\the\macname}%
- \noexpand\scanmacro{\temp}\egroup}%
- \fi
- \fi}
-
-\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
-
-% \braceorline decides whether the next nonwhitespace character is a
-% {. If so it reads up to the closing }, if not, it reads the whole
-% line. Whatever was read is then fed to the next control sequence
-% as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
- \ifx\nchar\bgroup\else
- \expandafter\parsearg
- \fi \next}
-
-% We want to disable all macros during \shipout so that they are not
-% expanded by \write.
-\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
- \edef\next{\macrolist}\expandafter\endgroup\next}
-
-% For \indexnofonts, we need to get rid of all macros, leaving only the
-% arguments (if present). Of course this is not nearly correct, but it
-% is the best we can do for now. makeinfo does not expand macros in the
-% argument to @deffn, which ends up writing an index entry, and texindex
-% isn't prepared for an index sort entry that starts with \.
-%
-% Since macro invocations are followed by braces, we can just redefine them
-% to take a single TeX argument. The case of a macro invocation that
-% goes to end-of-line is not handled.
-%
-\def\emptyusermacros{\begingroup
- \def\do##1{\let\noexpand##1=\noexpand\asis}%
- \edef\next{\macrolist}\expandafter\endgroup\next}
-
-
-% @alias.
-% We need some trickery to remove the optional spaces around the equal
-% sign. Just make them active and then expand them all to nothing.
-\def\alias{\parseargusing\obeyspaces\aliasxxx}
-\def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{%
- {%
- \expandafter\let\obeyedspace=\empty
- \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
- }%
- \next
-}
-
-
-\message{cross references,}
-
-\newwrite\auxfile
-
-\newif\ifhavexrefs % True if xref values are known.
-\newif\ifwarnedxrefs % True if we warned once that they aren't known.
-
-% @inforef is relatively simple.
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
- node \samp{\ignorespaces#1{}}}
-
-% @node's only job in TeX is to define \lastnode, which is used in
-% cross-references. The @node line might or might not have commas, and
-% might or might not have spaces before the first comma, like:
-% @node foo , bar , ...
-% We don't want such trailing spaces in the node name.
-%
-\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
-%
-% also remove a trailing comma, in case of something like this:
-% @node Help-Cross, , , Cross-refs
-\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
-\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
-
-\let\nwnode=\node
-\let\lastnode=\empty
-
-% Write a cross-reference definition for the current node. #1 is the
-% type (Ynumbered, Yappendix, Ynothing).
-%
-\def\donoderef#1{%
- \ifx\lastnode\empty\else
- \setref{\lastnode}{#1}%
- \global\let\lastnode=\empty
- \fi
-}
-
-% @anchor{NAME} -- define xref target at arbitrary point.
-%
-\newcount\savesfregister
-%
-\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
-% anchor), which consists of three parts:
-% 1) NAME-title - the current sectioning name taken from \thissection,
-% or the anchor name.
-% 2) NAME-snt - section number and type, passed as the SNT arg, or
-% empty for anchors.
-% 3) NAME-pg - the page number.
-%
-% This is called from \donoderef, \anchor, and \dofloat. In the case of
-% floats, there is an additional part, which is not written here:
-% 4) NAME-lof - the text as it should appear in a @listoffloats.
-%
-\def\setref#1#2{%
- \pdfmkdest{#1}%
- \iflinks
- {%
- \atdummies % preserve commands, but don't expand them
- \turnoffactive
- \otherbackslash
- \edef\writexrdef##1##2{%
- \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
- ##1}{##2}}% these are parameters of \writexrdef
- }%
- \toks0 = \expandafter{\thissection}%
- \immediate \writexrdef{title}{\the\toks0 }%
- \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
- \writexrdef{pg}{\folio}% will be written later, during \shipout
- }%
- \fi
-}
-
-% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
-% the node name, #2 the name of the Info cross-reference, #3 the printed
-% node name, #4 the name of the Info file, #5 the name of the printed
-% manual. All but the node name can be omitted.
-%
-\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
-\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
- \unsepspaces
- \def\printedmanual{\ignorespaces #5}%
- \def\printedrefname{\ignorespaces #3}%
- \setbox1=\hbox{\printedmanual\unskip}%
- \setbox0=\hbox{\printedrefname\unskip}%
- \ifdim \wd0 = 0pt
- % No printed node name was explicitly given.
- \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
- % Use the node name inside the square brackets.
- \def\printedrefname{\ignorespaces #1}%
- \else
- % Use the actual chapter/section title appear inside
- % the square brackets. Use the real section title if we have it.
- \ifdim \wd1 > 0pt
- % It is in another manual, so we don't have it.
- \def\printedrefname{\ignorespaces #1}%
- \else
- \ifhavexrefs
- % We know the real title if we have the xref values.
- \def\printedrefname{\refx{#1-title}{}}%
- \else
- % Otherwise just copy the Info node name.
- \def\printedrefname{\ignorespaces #1}%
- \fi%
- \fi
- \fi
- \fi
- %
- % Make link in pdf output.
- \ifpdf
- \leavevmode
- \getfilename{#4}%
- {\turnoffactive \otherbackslash
- \ifnum\filenamelength>0
- \startlink attr{/Border [0 0 0]}%
- goto file{\the\filename.pdf} name{#1}%
- \else
- \startlink attr{/Border [0 0 0]}%
- goto name{\pdfmkpgn{#1}}%
- \fi
- }%
- \linkcolor
- \fi
- %
- % Float references are printed completely differently: "Figure 1.2"
- % instead of "[somenode], p.3". We distinguish them by the
- % LABEL-title being set to a magic string.
- {%
- % Have to otherify everything special to allow the \csname to
- % include an _ in the xref name, etc.
- \indexnofonts
- \turnoffactive
- \otherbackslash
- \expandafter\global\expandafter\let\expandafter\Xthisreftitle
- \csname XR#1-title\endcsname
- }%
- \iffloat\Xthisreftitle
- % If the user specified the print name (third arg) to the ref,
- % print it instead of our usual "Figure 1.2".
- \ifdim\wd0 = 0pt
- \refx{#1-snt}%
- \else
- \printedrefname
- \fi
- %
- % if the user also gave the printed manual name (fifth arg), append
- % "in MANUALNAME".
- \ifdim \wd1 > 0pt
- \space \putwordin{} \cite{\printedmanual}%
- \fi
- \else
- % node/anchor (non-float) references.
- %
- % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
- % insert empty discretionaries after hyphens, which means that it will
- % not find a line break at a hyphen in a node names. Since some manuals
- % are best written with fairly long node names, containing hyphens, this
- % is a loss. Therefore, we give the text of the node name again, so it
- % is as if TeX is seeing it for the first time.
- \ifdim \wd1 > 0pt
- \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
- \else
- % _ (for example) has to be the character _ for the purposes of the
- % control sequence corresponding to the node, but it has to expand
- % into the usual \leavevmode...\vrule stuff for purposes of
- % printing. So we \turnoffactive for the \refx-snt, back on for the
- % printing, back off for the \refx-pg.
- {\turnoffactive \otherbackslash
- % Only output a following space if the -snt ref is nonempty; for
- % @unnumbered and @anchor, it won't be.
- \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
- \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
- }%
- % output the `[mynode]' via a macro so it can be overridden.
- \xrefprintnodename\printedrefname
- %
- % But we always want a comma and a space:
- ,\space
- %
- % output the `page 3'.
- \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
- \fi
- \fi
- \endlink
-\endgroup}
-
-% This macro is called from \xrefX for the `[nodename]' part of xref
-% output. It's a separate macro only so it can be changed more easily,
-% since square brackets don't work well in some documents. Particularly
-% one that Bob is working on :).
-%
-\def\xrefprintnodename#1{[#1]}
-
-% Things referred to by \setref.
-%
-\def\Ynothing{}
-\def\Yomitfromtoc{}
-\def\Ynumbered{%
- \ifnum\secno=0
- \putwordChapter@tie \the\chapno
- \else \ifnum\subsecno=0
- \putwordSection@tie \the\chapno.\the\secno
- \else \ifnum\subsubsecno=0
- \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
- \else
- \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
- \fi\fi\fi
-}
-\def\Yappendix{%
- \ifnum\secno=0
- \putwordAppendix@tie @char\the\appendixno{}%
- \else \ifnum\subsecno=0
- \putwordSection@tie @char\the\appendixno.\the\secno
- \else \ifnum\subsubsecno=0
- \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
- \else
- \putwordSection@tie
- @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
- \fi\fi\fi
-}
-
-% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
-% If its value is nonempty, SUFFIX is output afterward.
-%
-\def\refx#1#2{%
- {%
- \indexnofonts
- \otherbackslash
- \expandafter\global\expandafter\let\expandafter\thisrefX
- \csname XR#1\endcsname
- }%
- \ifx\thisrefX\relax
- % If not defined, say something at least.
- \angleleft un\-de\-fined\angleright
- \iflinks
- \ifhavexrefs
- \message{\linenumber Undefined cross reference `#1'.}%
- \else
- \ifwarnedxrefs\else
- \global\warnedxrefstrue
- \message{Cross reference values unknown; you must run TeX again.}%
- \fi
- \fi
- \fi
- \else
- % It's defined, so just use it.
- \thisrefX
- \fi
- #2% Output the suffix in any case.
-}
-
-% This is the macro invoked by entries in the aux file. Usually it's
-% just a \def (we prepend XR to the control sequence name to avoid
-% collisions). But if this is a float type, we have more work to do.
-%
-\def\xrdef#1#2{%
- \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
- %
- % Was that xref control sequence that we just defined for a float?
- \expandafter\iffloat\csname XR#1\endcsname
- % it was a float, and we have the (safe) float type in \iffloattype.
- \expandafter\let\expandafter\floatlist
- \csname floatlist\iffloattype\endcsname
- %
- % Is this the first time we've seen this float type?
- \expandafter\ifx\floatlist\relax
- \toks0 = {\do}% yes, so just \do
- \else
- % had it before, so preserve previous elements in list.
- \toks0 = \expandafter{\floatlist\do}%
- \fi
- %
- % Remember this xref in the control sequence \floatlistFLOATTYPE,
- % for later use in \listoffloats.
- \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
- \fi
-}
-
-% Read the last existing aux file, if any. No error if none exists.
-%
-\def\tryauxfile{%
- \openin 1 \jobname.aux
- \ifeof 1 \else
- \readauxfile
- \global\havexrefstrue
- \fi
- \closein 1
-}
-
-\def\readauxfile{\begingroup
- \catcode`\^^@=\other
- \catcode`\^^A=\other
- \catcode`\^^B=\other
- \catcode`\^^C=\other
- \catcode`\^^D=\other
- \catcode`\^^E=\other
- \catcode`\^^F=\other
- \catcode`\^^G=\other
- \catcode`\^^H=\other
- \catcode`\^^K=\other
- \catcode`\^^L=\other
- \catcode`\^^N=\other
- \catcode`\^^P=\other
- \catcode`\^^Q=\other
- \catcode`\^^R=\other
- \catcode`\^^S=\other
- \catcode`\^^T=\other
- \catcode`\^^U=\other
- \catcode`\^^V=\other
- \catcode`\^^W=\other
- \catcode`\^^X=\other
- \catcode`\^^Z=\other
- \catcode`\^^[=\other
- \catcode`\^^\=\other
- \catcode`\^^]=\other
- \catcode`\^^^=\other
- \catcode`\^^_=\other
- % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
- % in xref tags, i.e., node names. But since ^^e4 notation isn't
- % supported in the main text, it doesn't seem desirable. Furthermore,
- % that is not enough: for node names that actually contain a ^
- % character, we would end up writing a line like this: 'xrdef {'hat
- % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
- % argument, and \hat is not an expandable control sequence. It could
- % all be worked out, but why? Either we support ^^ or we don't.
- %
- % The other change necessary for this was to define \auxhat:
- % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
- % and then to call \auxhat in \setq.
- %
- \catcode`\^=\other
- %
- % Special characters. Should be turned off anyway, but...
- \catcode`\~=\other
- \catcode`\[=\other
- \catcode`\]=\other
- \catcode`\"=\other
- \catcode`\_=\other
- \catcode`\|=\other
- \catcode`\<=\other
- \catcode`\>=\other
- \catcode`\$=\other
- \catcode`\#=\other
- \catcode`\&=\other
- \catcode`\%=\other
- \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
- %
- % This is to support \ in node names and titles, since the \
- % characters end up in a \csname. It's easier than
- % leaving it active and making its active definition an actual \
- % character. What I don't understand is why it works in the *value*
- % of the xrdef. Seems like it should be a catcode12 \, and that
- % should not typeset properly. But it works, so I'm moving on for
- % now. --karl, 15jan04.
- \catcode`\\=\other
- %
- % Make the characters 128-255 be printing characters.
- {%
- \count 1=128
- \def\loop{%
- \catcode\count 1=\other
- \advance\count 1 by 1
- \ifnum \count 1<256 \loop \fi
- }%
- }%
- %
- % @ is our escape character in .aux files, and we need braces.
- \catcode`\{=1
- \catcode`\}=2
- \catcode`\@=0
- %
- \input \jobname.aux
-\endgroup}
-
-
-\message{insertions,}
-% including footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed. (Generally, numeric constants should always be followed by a
-% space to prevent strange expansion errors.)
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for info output only.
-\let\footnotestyle=\comment
-
-{\catcode `\@=11
-%
-% Auto-number footnotes. Otherwise like plain.
-\gdef\footnote{%
- \let\indent=\ptexindent
- \let\noindent=\ptexnoindent
- \global\advance\footnoteno by \@ne
- \edef\thisfootno{$^{\the\footnoteno}$}%
- %
- % In case the footnote comes at the end of a sentence, preserve the
- % extra spacing after we do the footnote number.
- \let\@sf\empty
- \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
- %
- % Remove inadvertent blank space before typesetting the footnote number.
- \unskip
- \thisfootno\@sf
- \dofootnote
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter. Our footnotes don't need to be so general.
-%
-% Oh yes, they do; otherwise, @ifset (and anything else that uses
-% \parseargline) fails inside footnotes because the tokens are fixed when
-% the footnote is read. --karl, 16nov96.
-%
-\gdef\dofootnote{%
- \insert\footins\bgroup
- % We want to typeset this text as a normal paragraph, even if the
- % footnote reference occurs in (for example) a display environment.
- % So reset some parameters.
- \hsize=\pagewidth
- \interlinepenalty\interfootnotelinepenalty
- \splittopskip\ht\strutbox % top baseline for broken footnotes
- \splitmaxdepth\dp\strutbox
- \floatingpenalty\@MM
- \leftskip\z@skip
- \rightskip\z@skip
- \spaceskip\z@skip
- \xspaceskip\z@skip
- \parindent\defaultparindent
- %
- \smallfonts \rm
- %
- % Because we use hanging indentation in footnotes, a @noindent appears
- % to exdent this text, so make it be a no-op. makeinfo does not use
- % hanging indentation so @noindent can still be needed within footnote
- % text after an @example or the like (not that this is good style).
- \let\noindent = \relax
- %
- % Hang the footnote text off the number. Use \everypar in case the
- % footnote extends for more than one paragraph.
- \everypar = {\hang}%
- \textindent{\thisfootno}%
- %
- % Don't crash into the line above the footnote text. Since this
- % expands into a box, it must come within the paragraph, lest it
- % provide a place where TeX can split the footnote.
- \footstrut
- \futurelet\next\fo@t
-}
-}%end \catcode `\@=11
-
-% In case a @footnote appears in a vbox, save the footnote text and create
-% the real \insert just after the vbox finished. Otherwise, the insertion
-% would be lost.
-% Similarily, if a @footnote appears inside an alignment, save the footnote
-% text to a box and make the \insert when a row of the table is finished.
-% And the same can be done for other insert classes. --kasal, 16nov03.
-
-% Replace the \insert primitive by a cheating macro.
-% Deeper inside, just make sure that the saved insertions are not spilled
-% out prematurely.
-%
-\def\startsavinginserts{%
- \ifx \insert\ptexinsert
- \let\insert\saveinsert
- \else
- \let\checkinserts\relax
- \fi
-}
-
-% This \insert replacement works for both \insert\footins{foo} and
-% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
-%
-\def\saveinsert#1{%
- \edef\next{\noexpand\savetobox \makeSAVEname#1}%
- \afterassignment\next
- % swallow the left brace
- \let\temp =
-}
-\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
-\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
-
-\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
-
-\def\placesaveins#1{%
- \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
- {\box#1}%
-}
-
-% eat @SAVE -- beware, all of them have catcode \other:
-{
- \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
- \gdef\gobblesave @SAVE{}
-}
-
-% initialization:
-\def\newsaveins #1{%
- \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
- \next
-}
-\def\newsaveinsX #1{%
- \csname newbox\endcsname #1%
- \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
- \checksaveins #1}%
-}
-
-% initialize:
-\let\checkinserts\empty
-\newsaveins\footins
-\newsaveins\margin
-
-
-% @image. We use the macros from epsf.tex to support this.
-% If epsf.tex is not installed and @image is used, we complain.
-%
-% Check for and read epsf.tex up front. If we read it only at @image
-% time, we might be inside a group, and then its definitions would get
-% undone and the next image would fail.
-\openin 1 = epsf.tex
-\ifeof 1 \else
- % Do not bother showing banner with epsf.tex v2.7k (available in
- % doc/epsf.tex and on ctan).
- \def\epsfannounce{\toks0 = }%
- \input epsf.tex
-\fi
-\closein 1
-%
-% We will only complain once about lack of epsf.tex.
-\newif\ifwarnednoepsf
-\newhelp\noepsfhelp{epsf.tex must be installed for images to
- work. It is also included in the Texinfo distribution, or you can get
- it from ftp://tug.org/tex/epsf.tex.}
-%
-\def\image#1{%
- \ifx\epsfbox\undefined
- \ifwarnednoepsf \else
- \errhelp = \noepsfhelp
- \errmessage{epsf.tex not found, images will be ignored}%
- \global\warnednoepsftrue
- \fi
- \else
- \imagexxx #1,,,,,\finish
- \fi
-}
-%
-% Arguments to @image:
-% #1 is (mandatory) image filename; we tack on .eps extension.
-% #2 is (optional) width, #3 is (optional) height.
-% #4 is (ignored optional) html alt text.
-% #5 is (ignored optional) extension.
-% #6 is just the usual extra ignored arg for parsing this stuff.
-\newif\ifimagevmode
-\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
- \catcode`\^^M = 5 % in case we're inside an example
- \normalturnoffactive % allow _ et al. in names
- % If the image is by itself, center it.
- \ifvmode
- \imagevmodetrue
- \nobreak\bigskip
- % Usually we'll have text after the image which will insert
- % \parskip glue, so insert it here too to equalize the space
- % above and below.
- \nobreak\vskip\parskip
- \nobreak
- \line\bgroup\hss
- \fi
- %
- % Output the image.
- \ifpdf
- \dopdfimage{#1}{#2}{#3}%
- \else
- % \epsfbox itself resets \epsf?size at each figure.
- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
- \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
- \epsfbox{#1.eps}%
- \fi
- %
- \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
-\endgroup}
-
-
-% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
-% etc. We don't actually implement floating yet, we always include the
-% float "here". But it seemed the best name for the future.
-%
-\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
-
-% There may be a space before second and/or third parameter; delete it.
-\def\eatcommaspace#1, {#1,}
-
-% #1 is the optional FLOATTYPE, the text label for this float, typically
-% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
-% this float will not be numbered and cannot be referred to.
-%
-% #2 is the optional xref label. Also must be present for the float to
-% be referable.
-%
-% #3 is the optional positioning argument; for now, it is ignored. It
-% will somehow specify the positions allowed to float to (here, top, bottom).
-%
-% We keep a separate counter for each FLOATTYPE, which we reset at each
-% chapter-level command.
-\let\resetallfloatnos=\empty
-%
-\def\dofloat#1,#2,#3,#4\finish{%
- \let\thiscaption=\empty
- \let\thisshortcaption=\empty
- %
- % don't lose footnotes inside @float.
- %
- % BEWARE: when the floats start float, we have to issue warning whenever an
- % insert appears inside a float which could possibly float. --kasal, 26may04
- %
- \startsavinginserts
- %
- % We can't be used inside a paragraph.
- \par
- %
- \vtop\bgroup
- \def\floattype{#1}%
- \def\floatlabel{#2}%
- \def\floatloc{#3}% we do nothing with this yet.
- %
- \ifx\floattype\empty
- \let\safefloattype=\empty
- \else
- {%
- % the floattype might have accents or other special characters,
- % but we need to use it in a control sequence name.
- \indexnofonts
- \turnoffactive
- \xdef\safefloattype{\floattype}%
- }%
- \fi
- %
- % If label is given but no type, we handle that as the empty type.
- \ifx\floatlabel\empty \else
- % We want each FLOATTYPE to be numbered separately (Figure 1,
- % Table 1, Figure 2, ...). (And if no label, no number.)
- %
- \expandafter\getfloatno\csname\safefloattype floatno\endcsname
- \global\advance\floatno by 1
- %
- {%
- % This magic value for \thissection is output by \setref as the
- % XREFLABEL-title value. \xrefX uses it to distinguish float
- % labels (which have a completely different output format) from
- % node and anchor labels. And \xrdef uses it to construct the
- % lists of floats.
- %
- \edef\thissection{\floatmagic=\safefloattype}%
- \setref{\floatlabel}{Yfloat}%
- }%
- \fi
- %
- % start with \parskip glue, I guess.
- \vskip\parskip
- %
- % Don't suppress indentation if a float happens to start a section.
- \restorefirstparagraphindent
-}
-
-% we have these possibilities:
-% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
-% @float Foo,lbl & no caption: Foo 1.1
-% @float Foo & @caption{Cap}: Foo: Cap
-% @float Foo & no caption: Foo
-% @float ,lbl & Caption{Cap}: 1.1: Cap
-% @float ,lbl & no caption: 1.1
-% @float & @caption{Cap}: Cap
-% @float & no caption:
-%
-\def\Efloat{%
- \let\floatident = \empty
- %
- % In all cases, if we have a float type, it comes first.
- \ifx\floattype\empty \else \def\floatident{\floattype}\fi
- %
- % If we have an xref label, the number comes next.
- \ifx\floatlabel\empty \else
- \ifx\floattype\empty \else % if also had float type, need tie first.
- \appendtomacro\floatident{\tie}%
- \fi
- % the number.
- \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
- \fi
- %
- % Start the printed caption with what we've constructed in
- % \floatident, but keep it separate; we need \floatident again.
- \let\captionline = \floatident
- %
- \ifx\thiscaption\empty \else
- \ifx\floatident\empty \else
- \appendtomacro\captionline{: }% had ident, so need a colon between
- \fi
- %
- % caption text.
- \appendtomacro\captionline{\scanexp\thiscaption}%
- \fi
- %
- % If we have anything to print, print it, with space before.
- % Eventually this needs to become an \insert.
- \ifx\captionline\empty \else
- \vskip.5\parskip
- \captionline
- %
- % Space below caption.
- \vskip\parskip
- \fi
- %
- % If have an xref label, write the list of floats info. Do this
- % after the caption, to avoid chance of it being a breakpoint.
- \ifx\floatlabel\empty \else
- % Write the text that goes in the lof to the aux file as
- % \floatlabel-lof. Besides \floatident, we include the short
- % caption if specified, else the full caption if specified, else nothing.
- {%
- \atdummies \turnoffactive \otherbackslash
- % since we read the caption text in the macro world, where ^^M
- % is turned into a normal character, we have to scan it back, so
- % we don't write the literal three characters "^^M" into the aux file.
- \scanexp{%
- \xdef\noexpand\gtemp{%
- \ifx\thisshortcaption\empty
- \thiscaption
- \else
- \thisshortcaption
- \fi
- }%
- }%
- \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
- \ifx\gtemp\empty \else : \gtemp \fi}}%
- }%
- \fi
- \egroup % end of \vtop
- %
- % place the captured inserts
- %
- % BEWARE: when the floats start float, we have to issue warning whenever an
- % insert appears inside a float which could possibly float. --kasal, 26may04
- %
- \checkinserts
-}
-
-% Append the tokens #2 to the definition of macro #1, not expanding either.
-%
-\def\appendtomacro#1#2{%
- \expandafter\def\expandafter#1\expandafter{#1#2}%
-}
-
-% @caption, @shortcaption
-%
-\def\caption{\docaption\thiscaption}
-\def\shortcaption{\docaption\thisshortcaption}
-\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
-\def\defcaption#1#2{\egroup \def#1{#2}}
-
-% The parameter is the control sequence identifying the counter we are
-% going to use. Create it if it doesn't exist and assign it to \floatno.
-\def\getfloatno#1{%
- \ifx#1\relax
- % Haven't seen this figure type before.
- \csname newcount\endcsname #1%
- %
- % Remember to reset this floatno at the next chap.
- \expandafter\gdef\expandafter\resetallfloatnos
- \expandafter{\resetallfloatnos #1=0 }%
- \fi
- \let\floatno#1%
-}
-
-% \setref calls this to get the XREFLABEL-snt value. We want an @xref
-% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
-% first read the @float command.
-%
-\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
-
-% Magic string used for the XREFLABEL-title value, so \xrefX can
-% distinguish floats from other xref types.
-\def\floatmagic{!!float!!}
-
-% #1 is the control sequence we are passed; we expand into a conditional
-% which is true if #1 represents a float ref. That is, the magic
-% \thissection value which we \setref above.
-%
-\def\iffloat#1{\expandafter\doiffloat#1==\finish}
-%
-% #1 is (maybe) the \floatmagic string. If so, #2 will be the
-% (safe) float type for this float. We set \iffloattype to #2.
-%
-\def\doiffloat#1=#2=#3\finish{%
- \def\temp{#1}%
- \def\iffloattype{#2}%
- \ifx\temp\floatmagic
-}
-
-% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
-%
-\parseargdef\listoffloats{%
- \def\floattype{#1}% floattype
- {%
- % the floattype might have accents or other special characters,
- % but we need to use it in a control sequence name.
- \indexnofonts
- \turnoffactive
- \xdef\safefloattype{\floattype}%
- }%
- %
- % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
- \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
- \ifhavexrefs
- % if the user said @listoffloats foo but never @float foo.
- \message{\linenumber No `\safefloattype' floats to list.}%
- \fi
- \else
- \begingroup
- \leftskip=\tocindent % indent these entries like a toc
- \let\do=\listoffloatsdo
- \csname floatlist\safefloattype\endcsname
- \endgroup
- \fi
-}
-
-% This is called on each entry in a list of floats. We're passed the
-% xref label, in the form LABEL-title, which is how we save it in the
-% aux file. We strip off the -title and look up \XRLABEL-lof, which
-% has the text we're supposed to typeset here.
-%
-% Figures without xref labels will not be included in the list (since
-% they won't appear in the aux file).
-%
-\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
-\def\listoffloatsdoentry#1-title\finish{{%
- % Can't fully expand XR#1-lof because it can contain anything. Just
- % pass the control sequence. On the other hand, XR#1-pg is just the
- % page number, and we want to fully expand that so we can get a link
- % in pdf output.
- \toksA = \expandafter{\csname XR#1-lof\endcsname}%
- %
- % use the same \entry macro we use to generate the TOC and index.
- \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
- \writeentry
-}}
-
-\message{localization,}
-% and i18n.
-
-% @documentlanguage is usually given very early, just after
-% @setfilename. If done too late, it may not override everything
-% properly. Single argument is the language abbreviation.
-% It would be nice if we could set up a hyphenation file here.
-%
-\parseargdef\documentlanguage{%
- \tex % read txi-??.tex file in plain TeX.
- % Read the file if it exists.
- \openin 1 txi-#1.tex
- \ifeof 1
- \errhelp = \nolanghelp
- \errmessage{Cannot read language file txi-#1.tex}%
- \else
- \input txi-#1.tex
- \fi
- \closein 1
- \endgroup
-}
-\newhelp\nolanghelp{The given language definition file cannot be found or
-is empty. Maybe you need to install it? In the current directory
-should work if nowhere else does.}
-
-
-% @documentencoding should change something in TeX eventually, most
-% likely, but for now just recognize it.
-\let\documentencoding = \comment
-
-
-% Page size parameters.
-%
-\newdimen\defaultparindent \defaultparindent = 15pt
-
-\chapheadingskip = 15pt plus 4pt minus 2pt
-\secheadingskip = 12pt plus 3pt minus 2pt
-\subsecheadingskip = 9pt plus 2pt minus 2pt
-
-% Prevent underfull vbox error messages.
-\vbadness = 10000
-
-% Don't be so finicky about underfull hboxes, either.
-\hbadness = 2000
-
-% Following George Bush, just get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything. We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize. We call this whenever the paper size is set.
-%
-\def\setemergencystretch{%
- \ifx\emergencystretch\thisisundefined
- % Allow us to assign to \emergencystretch anyway.
- \def\emergencystretch{\dimen0}%
- \else
- \emergencystretch = .15\hsize
- \fi
-}
-
-% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
-% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
-% physical page width.
-%
-% We also call \setleading{\textleading}, so the caller should define
-% \textleading. The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6#7#8{%
- \voffset = #3\relax
- \topskip = #6\relax
- \splittopskip = \topskip
- %
- \vsize = #1\relax
- \advance\vsize by \topskip
- \outervsize = \vsize
- \advance\outervsize by 2\topandbottommargin
- \pageheight = \vsize
- %
- \hsize = #2\relax
- \outerhsize = \hsize
- \advance\outerhsize by 0.5in
- \pagewidth = \hsize
- %
- \normaloffset = #4\relax
- \bindingoffset = #5\relax
- %
- \ifpdf
- \pdfpageheight #7\relax
- \pdfpagewidth #8\relax
- \fi
- %
- \setleading{\textleading}
- %
- \parindent = \defaultparindent
- \setemergencystretch
-}
-
-% @letterpaper (the default).
-\def\letterpaper{{\globaldefs = 1
- \parskip = 3pt plus 2pt minus 1pt
- \textleading = 13.2pt
- %
- % If page is nothing but text, make it come out even.
- \internalpagesizes{46\baselineskip}{6in}%
- {\voffset}{.25in}%
- {\bindingoffset}{36pt}%
- {11in}{8.5in}%
-}}
-
-% Use @smallbook to reset parameters for 7x9.5 (or so) format.
-\def\smallbook{{\globaldefs = 1
- \parskip = 2pt plus 1pt
- \textleading = 12pt
- %
- \internalpagesizes{7.5in}{5in}%
- {\voffset}{.25in}%
- {\bindingoffset}{16pt}%
- {9.25in}{7in}%
- %
- \lispnarrowing = 0.3in
- \tolerance = 700
- \hfuzz = 1pt
- \contentsrightmargin = 0pt
- \defbodyindent = .5cm
-}}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{{\globaldefs = 1
- \parskip = 3pt plus 2pt minus 1pt
- \textleading = 13.2pt
- %
- % Double-side printing via postscript on Laserjet 4050
- % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
- % To change the settings for a different printer or situation, adjust
- % \normaloffset until the front-side and back-side texts align. Then
- % do the same for \bindingoffset. You can set these for testing in
- % your texinfo source file like this:
- % @tex
- % \global\normaloffset = -6mm
- % \global\bindingoffset = 10mm
- % @end tex
- \internalpagesizes{51\baselineskip}{160mm}
- {\voffset}{\hoffset}%
- {\bindingoffset}{44pt}%
- {297mm}{210mm}%
- %
- \tolerance = 700
- \hfuzz = 1pt
- \contentsrightmargin = 0pt
- \defbodyindent = 5mm
-}}
-
-% Use @afivepaper to print on European A5 paper.
-% From romildo@urano.iceb.ufop.br, 2 July 2000.
-% He also recommends making @example and @lisp be small.
-\def\afivepaper{{\globaldefs = 1
- \parskip = 2pt plus 1pt minus 0.1pt
- \textleading = 12.5pt
- %
- \internalpagesizes{160mm}{120mm}%
- {\voffset}{\hoffset}%
- {\bindingoffset}{8pt}%
- {210mm}{148mm}%
- %
- \lispnarrowing = 0.2in
- \tolerance = 800
- \hfuzz = 1.2pt
- \contentsrightmargin = 0pt
- \defbodyindent = 2mm
- \tableindent = 12mm
-}}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper.
-\def\afourlatex{{\globaldefs = 1
- \afourpaper
- \internalpagesizes{237mm}{150mm}%
- {\voffset}{4.6mm}%
- {\bindingoffset}{7mm}%
- {297mm}{210mm}%
- %
- % Must explicitly reset to 0 because we call \afourpaper.
- \globaldefs = 0
-}}
-
-% Use @afourwide to print on A4 paper in landscape format.
-\def\afourwide{{\globaldefs = 1
- \afourpaper
- \internalpagesizes{241mm}{165mm}%
- {\voffset}{-2.95mm}%
- {\bindingoffset}{7mm}%
- {297mm}{210mm}%
- \globaldefs = 0
-}}
-
-% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
-% Perhaps we should allow setting the margins, \topskip, \parskip,
-% and/or leading, also. Or perhaps we should compute them somehow.
-%
-\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
-\def\pagesizesyyy#1,#2,#3\finish{{%
- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
- \globaldefs = 1
- %
- \parskip = 3pt plus 2pt minus 1pt
- \setleading{\textleading}%
- %
- \dimen0 = #1
- \advance\dimen0 by \voffset
- %
- \dimen2 = \hsize
- \advance\dimen2 by \normaloffset
- %
- \internalpagesizes{#1}{\hsize}%
- {\voffset}{\normaloffset}%
- {\bindingoffset}{44pt}%
- {\dimen0}{\dimen2}%
-}}
-
-% Set default to letter.
-%
-\letterpaper
-
-
-\message{and turning on texinfo input format.}
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other
-\catcode`\~=\other
-\catcode`\^=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode`\+=\other
-\catcode`\$=\other
-\def\normaldoublequote{"}
-\def\normaltilde{~}
-\def\normalcaret{^}
-\def\normalunderscore{_}
-\def\normalverticalbar{|}
-\def\normalless{<}
-\def\normalgreater{>}
-\def\normalplus{+}
-\def\normaldollar{$}%$ font-lock fix
-
-% This macro is used to make a character print one way in \tt
-% (where it can probably be output as-is), and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise. Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
-
-% Same as above, but check for italic font. Actually this also catches
-% non-italic slanted fonts since it is impossible to distinguish them from
-% italic fonts. But since this is only used by $ and it uses \sl anyway
-% this is not a problem.
-\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
-
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-
-\catcode`\"=\active
-\def\activedoublequote{{\tt\char34}}
-\let"=\activedoublequote
-\catcode`\~=\active
-\def~{{\tt\char126}}
-\chardef\hat=`\^
-\catcode`\^=\active
-\def^{{\tt \hat}}
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-% Subroutine for the previous macro.
-\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
-
-\catcode`\|=\active
-\def|{{\tt\char124}}
-\chardef \less=`\<
-\catcode`\<=\active
-\def<{{\tt \less}}
-\chardef \gtr=`\>
-\catcode`\>=\active
-\def>{{\tt \gtr}}
-\catcode`\+=\active
-\def+{{\tt \char 43}}
-\catcode`\$=\active
-\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-
-% If a .fmt file is being used, characters that might appear in a file
-% name cannot be active until we have parsed the command line.
-% So turn them off again, and have \everyjob (or @setfilename) turn them on.
-% \otherifyactive is called near the end of this file.
-\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
-
-\catcode`\@=0
-
-% \backslashcurfont outputs one backslash character in current font,
-% as in \char`\\.
-\global\chardef\backslashcurfont=`\\
-\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
-
-% \rawbackslash defines an active \ to do \backslashcurfont.
-% \otherbackslash defines an active \ to be a literal `\' character with
-% catcode other.
-{\catcode`\\=\active
- @gdef@rawbackslash{@let\=@backslashcurfont}
- @gdef@otherbackslash{@let\=@realbackslash}
-}
-
-% \realbackslash is an actual character `\' with catcode other.
-{\catcode`\\=\other @gdef@realbackslash{\}}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\backslashcurfont}}
-
-\catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{%
- @let"=@normaldoublequote
- @let\=@realbackslash
- @let~=@normaltilde
- @let^=@normalcaret
- @let_=@normalunderscore
- @let|=@normalverticalbar
- @let<=@normalless
- @let>=@normalgreater
- @let+=@normalplus
- @let$=@normaldollar %$ font-lock fix
- @unsepspaces
-}
-
-% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
-% the literal character `\'. (Thus, \ is not expandable when this is in
-% effect.)
-%
-@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
-
-% Make _ and + \other characters, temporarily.
-% This is canceled by @fixbackslash.
-@otherifyactive
-
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-%
-@gdef@eatinput input texinfo{@fixbackslash}
-@global@let\ = @eatinput
-
-% On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix
-% that, assuming it is called before the first `\' could plausibly occur.
-% Also back turn on active characters that might appear in the input
-% file name, in case not using a pre-dumped format.
-%
-@gdef@fixbackslash{%
- @ifx\@eatinput @let\ = @normalbackslash @fi
- @catcode`+=@active
- @catcode`@_=@active
-}
-
-% Say @foo, not \foo, in error messages.
-@escapechar = `@@
-
-% These look ok in all fonts, so just make them not special.
-@catcode`@& = @other
-@catcode`@# = @other
-@catcode`@% = @other
-
-
-@c Local variables:
-@c eval: (add-hook 'write-file-hooks 'time-stamp)
-@c page-delimiter: "^\\\\message"
-@c time-stamp-start: "def\\\\texinfoversion{"
-@c time-stamp-format: "%:y-%02m-%02d.%02H"
-@c time-stamp-end: "}"
-@c End:
-
-@c vim:sw=2:
-
-@ignore
- arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
-@end ignore
diff --git a/contrib/amd/doc/version.texi b/contrib/amd/doc/version.texi
deleted file mode 100644
index 41b19a30d5c6..000000000000
--- a/contrib/amd/doc/version.texi
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 20 April 2006
-@set UPDATED-MONTH April 2006
-@set EDITION 6.1.5
-@set VERSION 6.1.5
diff --git a/contrib/amd/fixmount/fixmount.8 b/contrib/amd/fixmount/fixmount.8
deleted file mode 100644
index e4b700b9eebf..000000000000
--- a/contrib/amd/fixmount/fixmount.8
+++ /dev/null
@@ -1,177 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1990 Jan-Simon Pendry
-.\" Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: fixmount.8,v 1.12.2.1 2006/01/02 18:48:25 ezk Exp $
-.\"
-.TH FIXMOUNT 8 "26 Feb 1993"
-.SH NAME
-fixmount \- fix remote mount entries
-.SH SYNOPSIS
-.B fixmount
-[
-.B \-adervq
-]
-[
-.B \-h
-.I name
-]
-.I host
-\&...
-.SH DESCRIPTION
-.IX "fixmount command" "" "\fLfixmount\fP \(em fix remote mount entries"
-.LP
-.B fixmount
-is a variant of
-.BR showmount (8)
-that can delete bogus mount entries in remote
-.BR mountd (8C)
-daemons.
-The actions specified by the options are performed for each
-.I host
-in turn.
-.SH OPTIONS
-.TP
-.B \-a \-d \-e
-These options work as in
-.BR showmount (8)
-except that only entries pertaining to the local host are printed.
-.TP
-.B \-r
-Removes those remote mount entries on
-.I host
-that do not correspond to current mounts, i.e., which are left-over
-from a crash or are the result of improper mount protocol.
-The actuality of mounts is verified using the entries in
-.BR /etc/mtab .
-.TP
-.B \-v
-Verify remote mounts. Similar to
-.B \-r
-except that only a notification message is printed for each bogus entry
-found. The remote mount table is not changed.
-.TP
-.B \-A
-Issues a command to the remote mountd declaring that ALL of its filesystems
-have been unmounted. This should be used with caution, as it removes all
-remote mount entries pertaining to the local system, whether or not any
-filesystems are still mounted locally.
-.TP
-.B \-q
-Be quiet.
-Suppresses error messages due to timeouts and "Program not registered",
-i.e., due to remote hosts not supporting RPC or not running mountd.
-.TP
-.BI \-h \ name
-Pretend the local hostname is
-.IR name .
-This is useful after the local hostname has been changed and rmtab entries
-using the old name remain on a remote machine.
-Unfortunately, most mountd's won't be able to successfully handle removal
-of such entries, so this option is useful in combination with
-.B \-v
-only.
-.br
-This option also saves time as comparisons of remotely recorded and local
-hostnames by address are avoided.
-.SH FILES
-.TP 20
-.B /etc/mtab
-List of current mounts.
-.TP
-.B /etc/rmtab
-Backup file for remote mount entries on NFS server.
-.SH "SEE ALSO"
-.BR showmount (8),
-.BR mtab (5),
-.BR rmtab (5),
-.BR mountd (8C).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH BUGS
-No attempt is made to verify the information in
-.B /etc/mtab
-itself.
-.PP
-Since swap file mounts are not recorded in
-.BR /etc/mtab ,
-a heuristic specific to SunOS is used to determine whether such a mount
-is actual (replacing the string "swap" with "root" and verifying the resulting
-path).
-.PP
-Symbolic links on the server will cause the path in the remote entry to differ
-from the one in
-.BR /etc/mtab .
-To catch those cases, a filesystem is also deemed mounted if its
-.I local
-mount point is identical to the remote entry.
-I.e., on a SunOS diskless client,
-.B server:/export/share/sunos.4.1.1
-is actually
-.BR /usr/share .
-Since the local mount point is
-.B /usr/share
-as well this will be handled correctly.
-.PP
-There is no way to clear a stale entry in a remote mountd after the
-local hostname (or whatever reverse name resolution returns for it)
-has been changed. To take care of these cases,
-the remote /etc/rmtab file has to be edited and mountd restarted.
-.PP
-The RPC timeouts for mountd calls can only be changed by recompiling.
-The defaults are 2 seconds for client handle creation and 5 seconds for
-RPC calls.
-.SH AUTHORS
-Andreas Stolcke <stolcke@icsi.berkeley.edu>.
-.P
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/fixmount/fixmount.c b/contrib/amd/fixmount/fixmount.c
deleted file mode 100644
index c7c69102a55b..000000000000
--- a/contrib/amd/fixmount/fixmount.c
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fixmount/fixmount.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-
-#define CREATE_TIMEOUT 2 /* seconds */
-#define CALL_TIMEOUT 5 /* seconds */
-
-/* Constant defs */
-#define ALL 1
-#define DIRS 2
-
-#define DODUMP 0x1
-#define DOEXPORTS 0x2
-#define DOREMOVE 0x4
-#define DOVERIFY 0x8
-#define DOREMALL 0x10
-
-extern int fixmount_check_mount(char *host, struct in_addr hostaddr, char *path);
-
-static char dir_path[NFS_MAXPATHLEN];
-static char localhost[] = "localhost";
-static char thishost[MAXHOSTNAMELEN + 1] = "";
-static exports mntexports;
-static int quiet = 0;
-static int type = 0;
-static jmp_buf before_rpc;
-static mountlist mntdump;
-static struct in_addr thisaddr;
-static CLIENT *clnt_create_timeout(char *, struct timeval *);
-
-RETSIGTYPE create_timeout(int);
-int is_same_host(char *, char *, struct in_addr);
-int main(int, char *[]);
-int remove_all(CLIENT *, char *);
-int remove_mount(CLIENT *, char *, mountlist, int);
-void fix_rmtab(CLIENT *, char *, mountlist, int, int);
-void print_dump(mountlist);
-void usage(void);
-
-
-void
-usage(void)
-{
- fprintf(stderr, "usage: fixmount [-adervAqf] [-h hostname] host ...\n");
- exit(1);
-}
-
-
-/*
- * Check hostname against other name and its IP address
- */
-int
-is_same_host(char *name1, char *name2, struct in_addr addr2)
-{
- if (strcasecmp(name1, name2) == 0) {
- return 1;
- } else if (addr2.s_addr == INADDR_NONE) {
- return 0;
- } else {
- static char lasthost[MAXHOSTNAMELEN] = "";
- static struct in_addr addr1;
- struct hostent *he;
-
- /*
- * To save nameserver lookups, and because this function
- * is typically called repeatedly on the same names,
- * cache the last lookup result and reuse it if possible.
- */
- if (strcasecmp(name1, lasthost) == 0) {
- return (addr1.s_addr == addr2.s_addr);
- } else if (!(he = gethostbyname(name1))) {
- return 0;
- } else {
- xstrlcpy(lasthost, name1, MAXHOSTNAMELEN);
- memcpy(&addr1, he->h_addr, sizeof(addr1));
- return (addr1.s_addr == addr2.s_addr);
- }
- }
-}
-
-
-/*
- * Print the binary tree in inorder so that output is sorted.
- */
-void
-print_dump(mountlist mp)
-{
- if (mp == NULL)
- return;
- if (is_same_host(mp->ml_hostname, thishost, thisaddr)) {
- switch (type) {
- case ALL:
- printf("%s:%s\n", mp->ml_hostname, mp->ml_directory);
- break;
- case DIRS:
- printf("%s\n", mp->ml_directory);
- break;
- default:
- printf("%s\n", mp->ml_hostname);
- break;
- };
- }
- if (mp->ml_next)
- print_dump(mp->ml_next);
-}
-
-
-/*
- * remove entry from remote rmtab
- */
-int
-remove_mount(CLIENT *client, char *host, mountlist ml, int fixit)
-{
- enum clnt_stat estat;
- struct timeval tv;
- char *pathp = dir_path;
-
- xstrlcpy(dir_path, ml->ml_directory, sizeof(dir_path));
-
- if (!fixit) {
- printf("%s: bogus mount %s:%s\n", host, ml->ml_hostname, ml->ml_directory);
- fflush(stdout);
- } else {
- printf("%s: removing %s:%s\n", host, ml->ml_hostname, ml->ml_directory);
- fflush(stdout);
-
- tv.tv_sec = CALL_TIMEOUT;
- tv.tv_usec = 0;
-
- if ((estat = clnt_call(client,
- MOUNTPROC_UMNT,
- (XDRPROC_T_TYPE) xdr_dirpath,
- (char *) &pathp,
- (XDRPROC_T_TYPE) xdr_void,
- (char *) 0,
- tv)) != RPC_SUCCESS) {
- fprintf(stderr, "%s:%s MOUNTPROC_UMNT: ",
- host, ml->ml_directory);
- clnt_perrno(estat);
- fflush(stderr);
- return -1;
- }
- }
- return 0;
-}
-
-
-/*
- * fix mount list on remote host
- */
-void
-fix_rmtab(CLIENT *client, char *host, mountlist mp, int fixit, int force)
-{
- mountlist p;
- struct hostent *he;
- struct in_addr hostaddr;
-
- /*
- * Obtain remote address for comparisons
- */
- if ((he = gethostbyname(host))) {
- memcpy(&hostaddr, he->h_addr, sizeof(hostaddr));
- } else {
- hostaddr.s_addr = INADDR_NONE;
- }
-
- for (p = mp; p; p = p->ml_next) {
- if (is_same_host(p->ml_hostname, thishost, thisaddr)) {
- if (force || !fixmount_check_mount(host, hostaddr, p->ml_directory))
- remove_mount(client, host, p, fixit);
- }
- }
-}
-
-
-/*
- * remove all entries from remote rmtab
- */
-int
-remove_all(CLIENT *client, char *host)
-{
- enum clnt_stat estat;
- struct timeval tv;
-
- printf("%s: removing ALL\n", host);
- fflush(stdout);
-
- tv.tv_sec = CALL_TIMEOUT;
- tv.tv_usec = 0;
-
- if ((estat = clnt_call(client,
- MOUNTPROC_UMNTALL,
- (XDRPROC_T_TYPE) xdr_void,
- (char *) 0,
- (XDRPROC_T_TYPE) xdr_void,
- (char *) 0,
- tv)) != RPC_SUCCESS) {
- /*
- * RPC_SYSTEMERROR is returned even if all went well
- */
- if (estat != RPC_SYSTEMERROR) {
- fprintf(stderr, "%s MOUNTPROC_UMNTALL: ", host);
- clnt_perrno(estat);
- fflush(stderr);
- return -1;
- }
- }
-
- return 0;
-}
-
-
-/*
- * This command queries the NFS mount daemon for it's mount list and/or
- * it's exports list and prints them out.
- * See "NFS: Network File System Protocol Specification, RFC1094, Appendix A"
- * for detailed information on the protocol.
- */
-int
-main(int argc, char *argv[])
-{
- AUTH *auth;
- CLIENT *client;
- char *host;
- enum clnt_stat estat;
- exports exp;
- extern char *optarg;
- extern int optind;
- groups grp;
- int ch;
- int force = 0;
- int morethanone;
- register int rpcs = 0;
- struct timeval tv;
-
- while ((ch = getopt(argc, argv, "adervAqfh:")) != -1)
- switch ((char) ch) {
-
- case 'a':
- if (type == 0) {
- type = ALL;
- rpcs |= DODUMP;
- } else
- usage();
- break;
-
- case 'd':
- if (type == 0) {
- type = DIRS;
- rpcs |= DODUMP;
- } else
- usage();
- break;
-
- case 'e':
- rpcs |= DOEXPORTS;
- break;
-
- case 'r':
- rpcs |= DOREMOVE;
- break;
-
- case 'A':
- rpcs |= DOREMALL;
- break;
-
- case 'v':
- rpcs |= DOVERIFY;
- break;
-
- case 'q':
- quiet = 1;
- break;
-
- case 'f':
- force = 1;
- break;
-
- case 'h':
- xstrlcpy(thishost, optarg, sizeof(thishost));
- break;
-
- case '?':
- default:
- usage();
- }
-
- if (optind == argc)
- usage();
-
- if (rpcs == 0)
- rpcs = DODUMP;
-
- if (!*thishost) {
- struct hostent *he;
-
- if (gethostname(thishost, sizeof(thishost)) < 0) {
- perror("gethostname");
- exit(1);
- }
- thishost[sizeof(thishost) - 1] = '\0';
-
- /*
- * We need the hostname as it appears to the other side's
- * mountd, so get our own hostname by reverse address
- * resolution.
- */
- if (!(he = gethostbyname(thishost))) {
- fprintf(stderr, "gethostbyname failed on %s\n",
- thishost);
- exit(1);
- }
- memcpy(&thisaddr, he->h_addr, sizeof(thisaddr));
- if (!(he = gethostbyaddr((char *) &thisaddr, sizeof(thisaddr),
- he->h_addrtype))) {
- fprintf(stderr, "gethostbyaddr failed on %s\n",
- inet_ntoa(thisaddr));
- exit(1);
- }
- xstrlcpy(thishost, he->h_name, sizeof(thishost));
- } else {
- thisaddr.s_addr = INADDR_NONE;
- }
-
- if (!(auth = authunix_create_default())) {
- fprintf(stderr, "couldn't create authentication handle\n");
- exit(1);
- }
- morethanone = (optind + 1 < argc);
-
- for (; optind < argc; optind++) {
-
- host = argv[optind];
- tv.tv_sec = CREATE_TIMEOUT;
- tv.tv_usec = 0;
-
- if (!(client = clnt_create_timeout(host, &tv)))
- continue;
-
- client->cl_auth = auth;
- tv.tv_sec = CALL_TIMEOUT;
- tv.tv_usec = 0;
-
- if (rpcs & (DODUMP | DOREMOVE | DOVERIFY))
- if ((estat = clnt_call(client,
- MOUNTPROC_DUMP,
- (XDRPROC_T_TYPE) xdr_void,
- (char *) 0,
- (XDRPROC_T_TYPE) xdr_mountlist,
- (char *) &mntdump,
- tv)) != RPC_SUCCESS) {
- fprintf(stderr, "%s: MOUNTPROC_DUMP: ", host);
- clnt_perrno(estat);
- fflush(stderr);
- mntdump = NULL;
- goto next;
- }
- if (rpcs & DOEXPORTS)
- if ((estat = clnt_call(client,
- MOUNTPROC_EXPORT,
- (XDRPROC_T_TYPE) xdr_void,
- (char *) 0,
- (XDRPROC_T_TYPE) xdr_exports,
- (char *) &mntexports,
- tv)) != RPC_SUCCESS) {
- fprintf(stderr, "%s: MOUNTPROC_EXPORT: ", host);
- clnt_perrno(estat);
- fflush(stderr);
- mntexports = NULL;
- goto next;
- }
-
- /* Now just print out the results */
- if ((rpcs & (DODUMP | DOEXPORTS)) &&
- morethanone) {
- printf(">>> %s <<<\n", host);
- fflush(stdout);
- }
-
- if (rpcs & DODUMP) {
- print_dump(mntdump);
- }
-
- if (rpcs & DOEXPORTS) {
- exp = mntexports;
- while (exp) {
- printf("%-35s", exp->ex_dir);
- grp = exp->ex_groups;
- if (grp == NULL) {
- printf("Everyone\n");
- } else {
- while (grp) {
- printf("%s ", grp->gr_name);
- grp = grp->gr_next;
- }
- printf("\n");
- }
- exp = exp->ex_next;
- }
- }
-
- if (rpcs & DOVERIFY)
- fix_rmtab(client, host, mntdump, 0, force);
-
- if (rpcs & DOREMOVE)
- fix_rmtab(client, host, mntdump, 1, force);
-
- if (rpcs & DOREMALL)
- remove_all(client, host);
-
- next:
- if (mntdump)
- (void) clnt_freeres(client,
- (XDRPROC_T_TYPE) xdr_mountlist,
- (char *) &mntdump);
- if (mntexports)
- (void) clnt_freeres(client,
- (XDRPROC_T_TYPE) xdr_exports,
- (char *) &mntexports);
-
- clnt_destroy(client);
- }
- exit(0);
- return 0; /* should never reach here */
-}
-
-
-RETSIGTYPE
-create_timeout(int sig)
-{
- signal(SIGALRM, SIG_DFL);
- longjmp(before_rpc, 1);
-}
-
-
-#ifndef HAVE_TRANSPORT_TYPE_TLI
-/*
- * inetresport creates a datagram socket and attempts to bind it to a
- * secure port.
- * returns: The bound socket, or -1 to indicate an error.
- */
-static int
-inetresport(int ty)
-{
- int alport;
- struct sockaddr_in addr;
- int fd;
-
- memset(&addr, 0, sizeof(addr));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
-
- addr.sin_family = AF_INET; /* use internet address family */
- addr.sin_addr.s_addr = INADDR_ANY;
- if ((fd = socket(AF_INET, ty, 0)) < 0)
- return -1;
-
- for (alport = IPPORT_RESERVED - 1; alport > IPPORT_RESERVED / 2 + 1; alport--) {
- addr.sin_port = htons((u_short) alport);
- if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) >= 0)
- return fd;
- if (errno != EADDRINUSE) {
- close(fd);
- return -1;
- }
- }
- close(fd);
- errno = EAGAIN;
- return -1;
-}
-
-
-/*
- * Privsock() calls inetresport() to attempt to bind a socket to a secure
- * port. If inetresport() fails, privsock returns a magic socket number which
- * indicates to RPC that it should make its own socket.
- * returns: A privileged socket # or RPC_ANYSOCK.
- */
-static int
-privsock(int ty)
-{
- int sock = inetresport(ty);
-
- if (sock < 0) {
- errno = 0;
- /* Couldn't get a secure port, let RPC make an insecure one */
- sock = RPC_ANYSOCK;
- }
- return sock;
-}
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
-
-static CLIENT *
-clnt_create_timeout(char *host, struct timeval *tvp)
-{
- CLIENT *clnt;
- struct sockaddr_in host_addr;
- struct hostent *hp;
-#ifndef HAVE_TRANSPORT_TYPE_TLI
- int s;
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- if (setjmp(before_rpc)) {
- if (!quiet) {
- fprintf(stderr, "%s: ", host);
- clnt_perrno(RPC_TIMEDOUT);
- fprintf(stderr, "\n");
- fflush(stderr);
- }
- return NULL;
- }
- signal(SIGALRM, create_timeout);
- ualarm(tvp->tv_sec * 1000000 + tvp->tv_usec, 0);
-
- /*
- * Get address of host
- */
- if ((hp = gethostbyname(host)) == 0 && !STREQ(host, localhost)) {
- fprintf(stderr, "can't get address of %s\n", host);
- return NULL;
- }
- memset(&host_addr, 0, sizeof(host_addr));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- host_addr.sin_family = AF_INET;
- if (hp) {
- memmove((voidp) &host_addr.sin_addr, (voidp) hp->h_addr,
- sizeof(host_addr.sin_addr));
- } else {
- /* fake "localhost" */
- host_addr.sin_addr.s_addr = htonl(0x7f000001);
- }
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- /* try TCP first (in case return data is large), then UDP */
- clnt = clnt_create(host, MOUNTPROG, MOUNTVERS, "tcp");
- if (!clnt)
- clnt = clnt_create(host, MOUNTPROG, MOUNTVERS, "udp");
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- s = RPC_ANYSOCK;
- clnt = clnttcp_create(&host_addr, MOUNTPROG, MOUNTVERS, &s, 0, 0);
- if (!clnt) {
- /* XXX: do we need to close(s) ? */
- s = privsock(SOCK_DGRAM);
- clnt = clntudp_create(&host_addr, MOUNTPROG, MOUNTVERS, *tvp, &s);
- }
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- if (!clnt) {
- ualarm(0, 0);
- if (!quiet) {
- clnt_pcreateerror(host);
- fflush(stderr);
- }
- return NULL;
- }
-
- ualarm(0, 0);
- return clnt;
-}
diff --git a/contrib/amd/fsinfo/fsi_analyze.c b/contrib/amd/fsinfo/fsi_analyze.c
deleted file mode 100644
index 9da40978e621..000000000000
--- a/contrib/amd/fsinfo/fsi_analyze.c
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsi_analyze.c
- *
- */
-
-/*
- * Analyze filesystem declarations
- *
- * Note: most of this is magic!
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-char *disk_fs_strings[] =
-{
- "fstype", "opts", "dumpset", "passno", "freq", "mount", "log", 0,
-};
-
-char *mount_strings[] =
-{
- "volname", "exportfs", 0,
-};
-
-char *fsmount_strings[] =
-{
- "as", "volname", "fstype", "opts", "from", 0,
-};
-
-char *host_strings[] =
-{
- "host", "netif", "config", "arch", "cluster", "os", 0,
-};
-
-char *ether_if_strings[] =
-{
- "inaddr", "netmask", "hwaddr", 0,
-};
-
-
-/*
- * Strip off the trailing part of a domain
- * to produce a short-form domain relative
- * to the local host domain.
- * Note that this has no effect if the domain
- * names do not have the same number of
- * components. If that restriction proves
- * to be a problem then the loop needs recoding
- * to skip from right to left and do partial
- * matches along the way -- ie more expensive.
- */
-void
-domain_strip(char *otherdom, char *localdom)
-{
- char *p1, *p2;
-
- if ((p1 = strchr(otherdom, '.')) &&
- (p2 = strchr(localdom, '.')) &&
- STREQ(p1 + 1, p2 + 1))
- *p1 = '\0';
-}
-
-
-/*
- * Take a little-endian domain name and
- * transform into a big-endian Un*x pathname.
- * For example: kiska.doc.ic -> ic/doc/kiska
- */
-static char *
-compute_hostpath(char *hn)
-{
- char *p = xmalloc(MAXPATHLEN);
- char *d;
- char path[MAXPATHLEN];
-
- xstrlcpy(p, hn, MAXPATHLEN);
- domain_strip(p, hostname);
- path[0] = '\0';
-
- do {
- d = strrchr(p, '.');
- if (d) {
- *d = 0;
- xstrlcat(path, d + 1, sizeof(path));
- xstrlcat(path, "/", sizeof(path));
- } else {
- xstrlcat(path, p, sizeof(path));
- }
- } while (d);
-
- fsi_log("hostpath of '%s' is '%s'", hn, path);
-
- xstrlcpy(p, path, MAXPATHLEN);
- return p;
-}
-
-
-static dict_ent *
-find_volname(char *nn)
-{
- dict_ent *de;
- char *p = strdup(nn);
- char *q;
-
- do {
- fsi_log("Searching for volname %s", p);
- de = dict_locate(dict_of_volnames, p);
- q = strrchr(p, '/');
- if (q)
- *q = '\0';
- } while (!de && q);
-
- XFREE(p);
- return de;
-}
-
-
-static void
-show_required(ioloc *l, int mask, char *info, char *hostname, char *strings[])
-{
- int i;
- fsi_log("mask left for %s:%s is %#x", hostname, info, mask);
-
- for (i = 0; strings[i]; i++)
- if (ISSET(mask, i))
- lerror(l, "%s:%s needs field \"%s\"", hostname, info, strings[i]);
-}
-
-
-/*
- * Check and fill in "exportfs" details.
- * Make sure the m_exported field references
- * the most local node with an "exportfs" entry.
- */
-static int
-check_exportfs(qelem *q, fsi_mount *e)
-{
- fsi_mount *mp;
- int errors = 0;
-
- ITER(mp, fsi_mount, q) {
- if (ISSET(mp->m_mask, DM_EXPORTFS)) {
- if (e)
- lwarning(mp->m_ioloc, "%s has duplicate exportfs data", mp->m_name);
- mp->m_exported = mp;
- if (!ISSET(mp->m_mask, DM_VOLNAME))
- set_mount(mp, DM_VOLNAME, strdup(mp->m_name));
- } else {
- mp->m_exported = e;
- }
-
- /*
- * Recursively descend the mount tree
- */
- if (mp->m_mount)
- errors += check_exportfs(mp->m_mount, mp->m_exported);
-
- /*
- * If a volume name has been specified, but this node and none
- * of its parents has been exported, report an error.
- */
- if (ISSET(mp->m_mask, DM_VOLNAME) && !mp->m_exported) {
- lerror(mp->m_ioloc, "%s has a volname but no exportfs data", mp->m_name);
- errors++;
- }
- }
-
- return errors;
-}
-
-
-static int
-analyze_dkmount_tree(qelem *q, fsi_mount *parent, disk_fs *dk)
-{
- fsi_mount *mp;
- int errors = 0;
-
- ITER(mp, fsi_mount, q) {
- fsi_log("Mount %s:", mp->m_name);
- if (parent) {
- char n[MAXPATHLEN];
- xsnprintf(n, sizeof(n), "%s/%s", parent->m_name, mp->m_name);
- if (*mp->m_name == '/')
- lerror(mp->m_ioloc, "sub-directory %s of %s starts with '/'", mp->m_name, parent->m_name);
- else if (STREQ(mp->m_name, "default"))
- lwarning(mp->m_ioloc, "sub-directory of %s is named \"default\"", parent->m_name);
- fsi_log("Changing name %s to %s", mp->m_name, n);
- XFREE(mp->m_name);
- mp->m_name = strdup(n);
- }
-
- mp->m_name_len = strlen(mp->m_name);
- mp->m_parent = parent;
- mp->m_dk = dk;
- if (mp->m_mount)
- analyze_dkmount_tree(mp->m_mount, mp, dk);
- }
-
- return errors;
-}
-
-
-/*
- * The mount tree is a singleton list
- * containing the top-level mount
- * point for a disk.
- */
-static int
-analyze_dkmounts(disk_fs *dk, qelem *q)
-{
- int errors = 0;
- fsi_mount *mp, *mp2 = 0;
- int i = 0;
-
- /*
- * First scan the list of subdirs to make
- * sure there is only one - and remember it
- */
- if (q) {
- ITER(mp, fsi_mount, q) {
- mp2 = mp;
- i++;
- }
- }
-
- /*
- * Check...
- */
- if (i < 1) {
- lerror(dk->d_ioloc, "%s:%s has no mount point", dk->d_host->h_hostname, dk->d_dev);
- return 1;
- }
-
- if (i > 1) {
- lerror(dk->d_ioloc, "%s:%s has more than one mount point", dk->d_host->h_hostname, dk->d_dev);
- errors++;
- }
-
- /*
- * Now see if a default mount point is required
- */
- if (mp2 && STREQ(mp2->m_name, "default")) {
- if (ISSET(mp2->m_mask, DM_VOLNAME)) {
- char nbuf[1024];
- compute_automount_point(nbuf, sizeof(nbuf), dk->d_host, mp2->m_volname);
- XFREE(mp2->m_name);
- mp2->m_name = strdup(nbuf);
- fsi_log("%s:%s has default mount on %s", dk->d_host->h_hostname, dk->d_dev, mp2->m_name);
- } else {
- lerror(dk->d_ioloc, "no volname given for %s:%s", dk->d_host->h_hostname, dk->d_dev);
- errors++;
- }
- }
-
- /*
- * Fill in the disk mount point
- */
- if (!errors && mp2 && mp2->m_name)
- dk->d_mountpt = strdup(mp2->m_name);
- else
- dk->d_mountpt = strdup("error");
-
- /*
- * Analyze the mount tree
- */
- errors += analyze_dkmount_tree(q, 0, dk);
-
- /*
- * Analyze the export tree
- */
- errors += check_exportfs(q, 0);
-
- return errors;
-}
-
-
-static void
-fixup_required_disk_info(disk_fs *dp)
-{
- /*
- * "fstype"
- */
- if (ISSET(dp->d_mask, DF_FSTYPE)) {
- if (STREQ(dp->d_fstype, "swap")) {
-
- /*
- * Fixup for a swap device
- */
- if (!ISSET(dp->d_mask, DF_PASSNO)) {
- dp->d_passno = 0;
- BITSET(dp->d_mask, DF_PASSNO);
- } else if (dp->d_freq != 0) {
- lwarning(dp->d_ioloc,
- "Pass number for %s:%s is non-zero",
- dp->d_host->h_hostname, dp->d_dev);
- }
-
- /*
- * "freq"
- */
- if (!ISSET(dp->d_mask, DF_FREQ)) {
- dp->d_freq = 0;
- BITSET(dp->d_mask, DF_FREQ);
- } else if (dp->d_freq != 0) {
- lwarning(dp->d_ioloc,
- "dump frequency for %s:%s is non-zero",
- dp->d_host->h_hostname, dp->d_dev);
- }
-
- /*
- * "opts"
- */
- if (!ISSET(dp->d_mask, DF_OPTS))
- set_disk_fs(dp, DF_OPTS, strdup("swap"));
-
- /*
- * "mount"
- */
- if (!ISSET(dp->d_mask, DF_MOUNT)) {
- qelem *q = new_que();
- fsi_mount *m = new_mount();
-
- m->m_name = strdup("swap");
- m->m_mount = new_que();
- ins_que(&m->m_q, q->q_back);
- dp->d_mount = q;
- BITSET(dp->d_mask, DF_MOUNT);
- } else {
- lerror(dp->d_ioloc, "%s: mount field specified for swap partition", dp->d_host->h_hostname);
- }
- } else if (STREQ(dp->d_fstype, "export")) {
-
- /*
- * "passno"
- */
- if (!ISSET(dp->d_mask, DF_PASSNO)) {
- dp->d_passno = 0;
- BITSET(dp->d_mask, DF_PASSNO);
- } else if (dp->d_passno != 0) {
- lwarning(dp->d_ioloc,
- "pass number for %s:%s is non-zero",
- dp->d_host->h_hostname, dp->d_dev);
- }
-
- /*
- * "freq"
- */
- if (!ISSET(dp->d_mask, DF_FREQ)) {
- dp->d_freq = 0;
- BITSET(dp->d_mask, DF_FREQ);
- } else if (dp->d_freq != 0) {
- lwarning(dp->d_ioloc,
- "dump frequency for %s:%s is non-zero",
- dp->d_host->h_hostname, dp->d_dev);
- }
-
- /*
- * "opts"
- */
- if (!ISSET(dp->d_mask, DF_OPTS))
- set_disk_fs(dp, DF_OPTS, strdup("rw,defaults"));
-
- }
- }
-}
-
-
-static void
-fixup_required_mount_info(fsmount *fp, dict_ent *de)
-{
- if (!ISSET(fp->f_mask, FM_FROM)) {
- if (de->de_count != 1) {
- lerror(fp->f_ioloc, "ambiguous mount: %s is a replicated filesystem", fp->f_volname);
- } else {
- dict_data *dd;
- fsi_mount *mp = 0;
- dd = AM_FIRST(dict_data, &de->de_q);
- mp = (fsi_mount *) dd->dd_data;
- if (!mp)
- abort();
- fp->f_ref = mp;
- set_fsmount(fp, FM_FROM, mp->m_dk->d_host->h_hostname);
- fsi_log("set: %s comes from %s", fp->f_volname, fp->f_from);
- }
- }
-
- if (!ISSET(fp->f_mask, FM_FSTYPE)) {
- set_fsmount(fp, FM_FSTYPE, strdup("nfs"));
- fsi_log("set: fstype is %s", fp->f_fstype);
- }
-
- if (!ISSET(fp->f_mask, FM_OPTS)) {
- set_fsmount(fp, FM_OPTS, strdup("rw,nosuid,grpid,defaults"));
- fsi_log("set: opts are %s", fp->f_opts);
- }
-
- if (!ISSET(fp->f_mask, FM_LOCALNAME)) {
- if (fp->f_ref) {
- set_fsmount(fp, FM_LOCALNAME, strdup(fp->f_volname));
- fsi_log("set: localname is %s", fp->f_localname);
- } else {
- lerror(fp->f_ioloc, "cannot determine localname since volname %s is not uniquely defined", fp->f_volname);
- }
- }
-}
-
-
-/*
- * For each disk on a host
- * analyze the mount information
- * and fill in any derivable
- * details.
- */
-static void
-analyze_drives(host *hp)
-{
- qelem *q = hp->h_disk_fs;
- disk_fs *dp;
-
- ITER(dp, disk_fs, q) {
- int req;
- fsi_log("Disk %s:", dp->d_dev);
- dp->d_host = hp;
- fixup_required_disk_info(dp);
- req = ~dp->d_mask & DF_REQUIRED;
- if (req)
- show_required(dp->d_ioloc, req, dp->d_dev, hp->h_hostname, disk_fs_strings);
- analyze_dkmounts(dp, dp->d_mount);
- }
-}
-
-
-/*
- * Check that all static mounts make sense and
- * that the source volumes exist.
- */
-static void
-analyze_mounts(host *hp)
-{
- qelem *q = hp->h_mount;
- fsmount *fp;
- int netbootp = 0;
-
- ITER(fp, fsmount, q) {
- char *p;
- char *nn = strdup(fp->f_volname);
- int req;
- dict_ent *de = (dict_ent *) NULL;
- int found = 0;
- int matched = 0;
-
- if (ISSET(fp->f_mask, FM_DIRECT)) {
- found = 1;
- matched = 1;
- } else
- do {
- p = 0;
- de = find_volname(nn);
- fsi_log("Mount: %s (trying %s)", fp->f_volname, nn);
-
- if (de) {
- found = 1;
-
- /*
- * Check that the from field is really exporting
- * the filesystem requested.
- * LBL: If fake mount, then don't care about
- * consistency check.
- */
- if (ISSET(fp->f_mask, FM_FROM) && !ISSET(fp->f_mask, FM_DIRECT)) {
- dict_data *dd;
- fsi_mount *mp2 = 0;
-
- ITER(dd, dict_data, &de->de_q) {
- fsi_mount *mp = (fsi_mount *) dd->dd_data;
-
- if (fp->f_from &&
- STREQ(mp->m_dk->d_host->h_hostname, fp->f_from)) {
- mp2 = mp;
- break;
- }
- }
-
- if (mp2) {
- fp->f_ref = mp2;
- matched = 1;
- break;
- }
- } else {
- matched = 1;
- break;
- }
- }
- p = strrchr(nn, '/');
- if (p)
- *p = 0;
- } while (de && p);
- XFREE(nn);
-
- if (!found) {
- lerror(fp->f_ioloc, "volname %s unknown", fp->f_volname);
- } else if (matched) {
-
- if (de)
- fixup_required_mount_info(fp, de);
- req = ~fp->f_mask & FM_REQUIRED;
- if (req) {
- show_required(fp->f_ioloc, req, fp->f_volname, hp->h_hostname,
- fsmount_strings);
- } else if (STREQ(fp->f_localname, "/")) {
- hp->h_netroot = fp;
- netbootp |= FM_NETROOT;
- } else if (STREQ(fp->f_localname, "swap")) {
- hp->h_netswap = fp;
- netbootp |= FM_NETSWAP;
- }
-
- } else {
- lerror(fp->f_ioloc, "volname %s not exported from %s", fp->f_volname,
- fp->f_from ? fp->f_from : "anywhere");
- }
- }
-
- if (netbootp && (netbootp != FM_NETBOOT))
- lerror(hp->h_ioloc, "network booting requires both root and swap areas");
-}
-
-
-void
-analyze_hosts(qelem *q)
-{
- host *hp;
-
- show_area_being_processed("analyze hosts", 5);
-
- /*
- * Check all drives
- */
- ITER(hp, host, q) {
- fsi_log("disks on host %s", hp->h_hostname);
- show_new("ana-host");
- hp->h_hostpath = compute_hostpath(hp->h_hostname);
-
- if (hp->h_disk_fs)
- analyze_drives(hp);
-
- }
-
- show_area_being_processed("analyze mounts", 5);
-
- /*
- * Check static mounts
- */
- ITER(hp, host, q) {
- fsi_log("mounts on host %s", hp->h_hostname);
- show_new("ana-mount");
- if (hp->h_mount)
- analyze_mounts(hp);
-
- }
-}
-
-
-/*
- * Check an automount request
- */
-static void
-analyze_automount(automount *ap)
-{
- dict_ent *de = find_volname(ap->a_volname);
-
- if (de) {
- ap->a_mounted = de;
- } else {
- if (STREQ(ap->a_volname, ap->a_name))
- lerror(ap->a_ioloc, "unknown volname %s automounted", ap->a_volname);
- else
- lerror(ap->a_ioloc, "unknown volname %s automounted on %s", ap->a_volname, ap->a_name);
- }
-}
-
-
-static void
-analyze_automount_tree(qelem *q, char *pref, int lvl)
-{
- automount *ap;
-
- ITER(ap, automount, q) {
- char nname[1024];
-
- if (lvl > 0 || ap->a_mount)
- if (ap->a_name[1] && strchr(ap->a_name + 1, '/'))
- lerror(ap->a_ioloc, "not allowed '/' in a directory name");
- xsnprintf(nname, sizeof(nname), "%s/%s", pref, ap->a_name);
- XFREE(ap->a_name);
- ap->a_name = strdup(nname[1] == '/' ? nname + 1 : nname);
- fsi_log("automount point %s:", ap->a_name);
- show_new("ana-automount");
-
- if (ap->a_mount) {
- analyze_automount_tree(ap->a_mount, ap->a_name, lvl + 1);
- } else if (ap->a_hardwiredfs) {
- fsi_log("\thardwired from %s to %s", ap->a_volname, ap->a_hardwiredfs);
- } else if (ap->a_volname) {
- fsi_log("\tautomount from %s", ap->a_volname);
- analyze_automount(ap);
- } else if (ap->a_symlink) {
- fsi_log("\tsymlink to %s", ap->a_symlink);
- } else {
- ap->a_volname = strdup(ap->a_name);
- fsi_log("\timplicit automount from %s", ap->a_volname);
- analyze_automount(ap);
- }
- }
-}
-
-
-void
-analyze_automounts(qelem *q)
-{
- auto_tree *tp;
-
- show_area_being_processed("analyze automount", 5);
-
- /*
- * q is a list of automounts
- */
- ITER(tp, auto_tree, q)
- analyze_automount_tree(tp->t_mount, "", 0);
-}
diff --git a/contrib/amd/fsinfo/fsi_data.h b/contrib/amd/fsinfo/fsi_data.h
deleted file mode 100644
index 8276caf36cba..000000000000
--- a/contrib/amd/fsinfo/fsi_data.h
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsi_data.h
- *
- */
-
-#ifndef _FSI_DATA_H
-#define _FSI_DATA_H
-
-typedef struct auto_tree auto_tree;
-typedef struct automount automount;
-typedef struct dict dict;
-typedef struct dict_data dict_data;
-typedef struct dict_ent dict_ent;
-typedef struct disk_fs disk_fs;
-typedef struct ether_if ether_if;
-typedef struct fsmount fsmount;
-typedef struct host host;
-typedef struct ioloc ioloc;
-typedef struct fsi_mount fsi_mount;
-
-
-/*
- * Automount tree
- */
-struct automount {
- qelem a_q;
- ioloc *a_ioloc;
- char *a_name; /* Automount key */
- char *a_volname; /* Equivalent volume to be referenced */
- char *a_symlink; /* Symlink representation */
- char *a_opts; /* opts for mounting */
- char *a_hardwiredfs; /* hack to bypass bogus fs definitions */
- qelem *a_mount; /* Tree representation */
- dict_ent *a_mounted;
-};
-
-/*
- * List of automount trees
- */
-struct auto_tree {
- qelem t_q;
- ioloc *t_ioloc;
- char *t_defaults;
- qelem *t_mount;
-};
-
-/*
- * A host
- */
-struct host {
- qelem q;
- int h_mask;
- ioloc *h_ioloc;
- fsmount *h_netroot, *h_netswap;
-#define HF_HOST 0
- char *h_hostname; /* The full name of the host */
- char *h_lochost; /* The name of the host with local domains stripped */
- char *h_hostpath; /* The filesystem path to the host (cf
- compute_hostpath) */
-#define HF_ETHER 1
- qelem *h_ether;
-#define HF_CONFIG 2
- qelem *h_config;
-#define HF_ARCH 3
- char *h_arch;
-#define HF_CLUSTER 4
- char *h_cluster;
-#define HF_OS 5
- char *h_os;
- qelem *h_disk_fs;
- qelem *h_mount;
-};
-
-/*
- * An ethernet interface
- */
-struct ether_if {
- qelem e_q;
- int e_mask;
- ioloc *e_ioloc;
- char *e_if;
-#define EF_INADDR 0
- struct in_addr e_inaddr;
-#define EF_NETMASK 1
- u_long e_netmask;
-#define EF_HWADDR 2
- char *e_hwaddr;
-};
-
-/*
- * Disk filesystem structure.
- *
- * If the DF_* numbers are changed
- * disk_fs_strings in analyze.c will
- * need updating.
- */
-struct disk_fs {
- qelem d_q;
- int d_mask;
- ioloc *d_ioloc;
- host *d_host;
- char *d_mountpt;
- char *d_dev;
-#define DF_FSTYPE 0
- char *d_fstype;
-#define DF_OPTS 1
- char *d_opts;
-#define DF_DUMPSET 2
- char *d_dumpset;
-#define DF_PASSNO 3
- int d_passno;
-#define DF_FREQ 4
- int d_freq;
-#define DF_MOUNT 5
- qelem *d_mount;
-#define DF_LOG 6
- char *d_log;
-};
-
-#define DF_REQUIRED ((1<<DF_FSTYPE)|(1<<DF_OPTS)|(1<<DF_PASSNO)|(1<<DF_MOUNT))
-
-/*
- * A mount tree
- */
-struct fsi_mount {
- qelem m_q;
- ioloc *m_ioloc;
- int m_mask;
-#define DM_VOLNAME 0
- char *m_volname;
-#define DM_EXPORTFS 1
- char *m_exportfs;
-#define DM_SEL 2
- char *m_sel;
- char *m_name;
- int m_name_len;
- fsi_mount *m_parent;
- disk_fs *m_dk;
- fsi_mount *m_exported;
- qelem *m_mount;
-};
-
-/*
- * Additional filesystem mounts
- *
- * If the FM_* numbers are changed
- * disk_fs_strings in analyze.c will
- * need updating.
- */
-struct fsmount {
- qelem f_q;
- fsi_mount *f_ref;
- ioloc *f_ioloc;
- int f_mask;
-#define FM_LOCALNAME 0
- char *f_localname;
-#define FM_VOLNAME 1
- char *f_volname;
-#define FM_FSTYPE 2
- char *f_fstype;
-#define FM_OPTS 3
- char *f_opts;
-#define FM_FROM 4
- char *f_from;
-#define FM_DIRECT 5
-};
-
-#define FM_REQUIRED ((1<<FM_VOLNAME)|(1<<FM_FSTYPE)|(1<<FM_OPTS)|(1<<FM_FROM)|(1<<FM_LOCALNAME))
-#define FM_NETROOT 0x01
-#define FM_NETSWAP 0x02
-#define FM_NETBOOT (FM_NETROOT|FM_NETSWAP)
-
-#define DICTHASH 5
-struct dict_ent {
- dict_ent *de_next;
- char *de_key;
- int de_count;
- qelem de_q;
-};
-
-/*
- * Dictionaries ...
- */
-struct dict_data {
- qelem dd_q;
- char *dd_data;
-};
-
-struct dict {
- dict_ent *de[DICTHASH];
-};
-
-/*
- * Source text location for error reports
- */
-struct ioloc {
- int i_line;
- char *i_file;
-};
-#endif /* not _FSI_DATA_H */
diff --git a/contrib/amd/fsinfo/fsi_dict.c b/contrib/amd/fsinfo/fsi_dict.c
deleted file mode 100644
index 29cd1a3ed08a..000000000000
--- a/contrib/amd/fsinfo/fsi_dict.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsi_dict.c
- *
- */
-
-/*
- * Dictionary support
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-
-static int
-dict_hash(char *k)
-{
- u_int h;
-
- for (h = 0; *k; h += *k++) ;
- return h % DICTHASH;
-}
-
-
-dict *
-new_dict(void)
-{
- dict *dp = CALLOC(struct dict);
-
- return dp;
-}
-
-
-static void
-dict_add_data(dict_ent *de, char *v)
-{
- dict_data *dd = CALLOC(struct dict_data);
-
- dd->dd_data = v;
- ins_que(&dd->dd_q, de->de_q.q_back);
- de->de_count++;
-}
-
-
-static dict_ent *
-new_dict_ent(char *k)
-{
- dict_ent *de = CALLOC(struct dict_ent);
-
- de->de_key = k;
- init_que(&de->de_q);
- return de;
-}
-
-
-dict_ent *
-dict_locate(dict *dp, char *k)
-{
- dict_ent *de = dp->de[dict_hash(k)];
-
- while (de && !STREQ(de->de_key, k))
- de = de->de_next;
- return de;
-}
-
-
-void
-dict_add(dict *dp, char *k, char *v)
-{
- dict_ent *de = dict_locate(dp, k);
-
- if (!de) {
- dict_ent **dep = &dp->de[dict_hash(k)];
- de = new_dict_ent(k);
- de->de_next = *dep;
- *dep = de;
- }
- dict_add_data(de, v);
-}
-
-
-int
-dict_iter(dict *dp, int (*fn) (qelem *))
-{
- int i;
- int errors = 0;
-
- for (i = 0; i < DICTHASH; i++) {
- dict_ent *de = dp->de[i];
- while (de) {
- errors += (*fn) (&de->de_q);
- de = de->de_next;
- }
- }
- return errors;
-}
diff --git a/contrib/amd/fsinfo/fsi_gram.y b/contrib/amd/fsinfo/fsi_gram.y
deleted file mode 100644
index 961a89f1af45..000000000000
--- a/contrib/amd/fsinfo/fsi_gram.y
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsi_gram.y
- *
- */
-
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-extern qelem *list_of_hosts, *list_of_automounts;
-%}
-
-%union {
- auto_tree *a;
- disk_fs *d;
- ether_if *e;
- host *h;
- qelem *q;
- char *s;
- fsi_mount *m;
- fsmount *f;
-}
-
-%token tARCH
-%token tAS
-%token tAUTOMOUNT
-%token tCLUSTER
-%token tCONFIG
-%token tDUMPSET
-%token tEQ
-%token tNFSEQ
-%token tEXPORTFS
-%token tFREQ
-%token tFROM
-%token tFS
-%token tFSTYPE
-%token tHWADDR
-%token tINADDR
-%token tHOST
-%token tLOCALHOST
-%token tLOG
-%token tMOUNT
-%token tNETMASK
-%token tNETIF
-%token tVOLNAME
-%token tOPTS
-%token tOS
-%token tPASSNO
-%token tDIRECT
-%token tSEL
-%token <s> tSTR
-
-%start list_of_hosts
-
-%type <a> automount
-%type <q> automount_tree
-%type <e> ether_attr
-%type <m> dir_tree_info
-%type <d> filesystem fs_info_list
-%type <h> host host_attr host_attr_list
-%type <q> list_of_hosts list_of_filesystems list_of_mounts dir_tree
-%type <f> localinfo_list
-%type <s> opt_auto_opts
-
-%%
-
-list_of_hosts :
- /* empty */
- { $$ = new_que(); }
-
- | list_of_hosts host
- { if ($2) ins_que((qelem *) $2, list_of_hosts->q_back);
- $$ = $1; }
-
- | list_of_hosts automount
- { if ($2) ins_que((qelem *) $2, list_of_automounts->q_back);
- $$ = $1; }
- ;
-
-/*
- * A new host:
- *
- * host foo.domain
- */
-host :
- tHOST host_attr list_of_filesystems list_of_mounts
- { $$ = $2; $$->h_disk_fs = $3; $$->h_mount = $4; }
-
- | error tHOST host_attr list_of_filesystems list_of_mounts
- { $$ = $3; $$->h_disk_fs = $4; $$->h_mount = $5; }
-
- ;
-
-host_attr :
- tSTR
- { $$ = new_host(); set_host($$, HF_HOST, $1); }
-
- | '{' host_attr_list '}' tSTR
- { $$ = $2; set_host($$, HF_HOST, $4); }
-
- ;
-
-host_attr_list :
- /* empty */
- { $$ = new_host(); }
-
- | host_attr_list tNETIF tSTR '{' ether_attr '}'
- { if ($5) {
- $5->e_if = $3;
- $$ = $1; set_host($$, HF_ETHER, (char *) $5); }
- }
-
- | host_attr_list tCONFIG tSTR
- { $$ = $1; set_host($$, HF_CONFIG, $3); }
-
- | host_attr_list tARCH '=' tSTR
- { $$ = $1; set_host($$, HF_ARCH, $4); }
-
- | host_attr_list tOS '=' tSTR
- { $$ = $1; set_host($$, HF_OS, $4); }
-
- | host_attr_list tCLUSTER '=' tSTR
- { $$ = $1; set_host($$, HF_CLUSTER, $4); }
-
- | host_attr_list error '=' tSTR
- { yyerror("unknown host attribute"); }
- ;
-
-ether_attr :
- /* empty */
- { $$ = new_ether_if(); }
-
- | ether_attr tINADDR '=' tSTR
- { $$ = $1; set_ether_if($$, EF_INADDR, $4); }
- | ether_attr tNETMASK '=' tSTR
- { $$ = $1; set_ether_if($$, EF_NETMASK, $4); }
- | ether_attr tHWADDR '=' tSTR
- { $$ = $1; set_ether_if($$, EF_HWADDR, $4); }
- ;
-
-/*
- * A new automount tree:
- *
- * automount /mountpoint { ... }
- */
-automount :
- tAUTOMOUNT opt_auto_opts automount_tree
- { if ($3) {
- $$ = new_auto_tree($2, $3);
- } else {
- $$ = 0;
- }
- }
-
- | tAUTOMOUNT error
- { $$ = 0; }
- ;
-
-opt_auto_opts :
- /* empty */
- { $$ = strdup(""); }
-
- | tOPTS tSTR
- { $$ = $2; }
- ;
-
-list_of_filesystems :
- /* empty */
- { $$ = 0; }
-
- | list_of_filesystems filesystem
- { if ($2) {
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&$2->d_q, $$->q_back);
- } else {
- $$ = $1;
- }
- }
- ;
-
-/*
- * A new filesystem:
- *
- * fs /dev/whatever { ... }
- */
-filesystem :
- tFS tSTR '{' fs_info_list '}'
- { $4->d_dev = $2; $$ = $4; }
-
- | tFS error '}'
- { $$ = (disk_fs *) 0; }
- ;
-
-/*
- * Per-filesystem information:
- *
- * fstype - the type of the filesystem (4.2, nfs, swap, export)
- * opts - the mount options ("rw,grpid")
- * passno - fsck pass number
- * freq - dump frequency
- * dumpset - tape set for filesystem dumps
- * mount - where to mount this filesystem
- * log - log device
- */
-fs_info_list :
- /* empty */
- { $$ = new_disk_fs(); }
-
- | fs_info_list tFSTYPE '=' tSTR
- { $$ = $1; set_disk_fs($$, DF_FSTYPE, $4); }
-
- | fs_info_list tOPTS '=' tSTR
- { $$ = $1; set_disk_fs($$, DF_OPTS, $4); }
-
- | fs_info_list tPASSNO '=' tSTR
- { $$ = $1; set_disk_fs($$, DF_PASSNO, $4); }
-
- | fs_info_list tFREQ '=' tSTR
- { $$ = $1; set_disk_fs($$, DF_FREQ, $4); }
-
- | fs_info_list tMOUNT dir_tree
- { $$ = $1; set_disk_fs($$, DF_MOUNT, (char *) $3); }
-
- | fs_info_list tDUMPSET '=' tSTR
- { $$ = $1; set_disk_fs($$, DF_DUMPSET, $4); }
-
- | fs_info_list tLOG '=' tSTR
- { $$ = $1; set_disk_fs($$, DF_LOG, $4); }
-
- | fs_info_list error '=' tSTR
- { yyerror("unknown filesystem attribute"); }
- ;
-
-/*
- * An automount tree:
- *
- * name = "volname" name is a reference to volname
- * name -> "string" name is a link to "string"
- * name nfsalias "string" name is a link to "string", string parsed as NFS
- * pathname.
- * name { ... } name is an automount tree
- */
-automount_tree :
- /* empty */
- { $$ = 0; }
-
- | automount_tree tSTR opt_auto_opts '=' tSTR
- { automount *a = new_automount($2);
- a->a_volname = $5;
- a->a_opts = $3;
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&a->a_q, $$->q_back);
- }
- | automount_tree tSTR opt_auto_opts tNFSEQ tSTR
- { automount *a = new_automount($2);
- a->a_hardwiredfs = $5;
- a->a_opts = $3;
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&a->a_q, $$->q_back);
- }
-
- | automount_tree tSTR tEQ tSTR
- { automount *a = new_automount($2);
- a->a_symlink = $4;
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&a->a_q, $$->q_back);
- }
-
- | automount_tree tSTR opt_auto_opts '{' automount_tree '}'
- { automount *a = new_automount($2);
- a->a_mount = $5;
- a->a_opts = $3;
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&a->a_q, $$->q_back);
- }
- ;
-
-dir_tree :
- /* empty */
- { $$ = 0; }
-
- | dir_tree tSTR '{' dir_tree_info dir_tree '}'
- { $4->m_mount = $5;
- $4->m_name = $2;
- if ($2[0] != '/' && $2[1] && strchr($2+1, '/'))
- yyerror("not allowed '/' in a directory name");
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&$4->m_q, $$->q_back);
- }
- ;
-
-dir_tree_info :
- /* empty */
- { $$ = new_mount(); }
-
- | dir_tree_info tEXPORTFS tSTR
- { $$ = $1; set_mount($$, DM_EXPORTFS, $3); }
-
- | dir_tree_info tVOLNAME tSTR
- { $$ = $1; set_mount($$, DM_VOLNAME, $3); }
-
- | dir_tree_info tSEL tSTR
- { $$ = $1; set_mount($$, DM_SEL, $3); }
-
- | dir_tree_info error '=' tSTR
- { yyerror("unknown directory attribute"); }
- ;
-
-/*
- * Additional mounts on a host
- *
- * mount "volname" ...
- */
-list_of_mounts :
- /* empty */
- { $$ = 0; }
-
- | list_of_mounts tMOUNT tSTR localinfo_list
- { set_fsmount($4, FM_VOLNAME, $3);
- if ($1)
- $$ = $1;
- else
- $$ = new_que();
- ins_que(&$4->f_q, $$->q_back);
- }
- ;
-
-/*
- * Mount info:
- *
- * from "hostname" - obtain the object from the named host
- * as "string" - where to mount, if different from the volname
- * opts "string" - mount options
- * fstype "type" - type of filesystem mount, if not nfs
- * direct - mount entry, no need to create ad-hoc hosts file
- */
-localinfo_list :
- /* empty */
- { $$ = new_fsmount(); }
-
- | localinfo_list tDIRECT
- { $$ = $1; set_fsmount($$, FM_DIRECT, ""); }
-
- | localinfo_list tAS tSTR
- { $$ = $1; set_fsmount($$, FM_LOCALNAME, $3); }
-
- | localinfo_list tFROM tSTR
- { $$ = $1; set_fsmount($$, FM_FROM, $3); }
-
- | localinfo_list tFSTYPE tSTR
- { $$ = $1; set_fsmount($$, FM_FSTYPE, $3); }
-
- | localinfo_list tOPTS tSTR
- { $$ = $1; set_fsmount($$, FM_OPTS, $3); }
-
- | localinfo_list error '=' tSTR
- { yyerror("unknown mount attribute"); }
- ;
diff --git a/contrib/amd/fsinfo/fsi_lex.l b/contrib/amd/fsinfo/fsi_lex.l
deleted file mode 100644
index 6bca59b4deeb..000000000000
--- a/contrib/amd/fsinfo/fsi_lex.l
+++ /dev/null
@@ -1,274 +0,0 @@
-%{
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsi_lex.l
- *
- */
-
-/*
- * Lexical analyzer for fsinfo.
- * TODO: Needs rewriting.
- */
-
-static int ayylineno;
-
-#ifdef FLEX_SCANNER
-# define INIT_STATE { \
- switch ((yy_start - 1) / 2) { \
- case 0: \
- BEGIN F; \
- break; \
- } \
-}
-
-#else /* not FLEX_SCANNER */
-
-/*
- * Using old lex...
- */
-# define INIT_STATE { \
- switch (yybgin - yysvec - 1) { \
- case 0: \
- BEGIN F; \
- break; \
- } \
-}
-
-#endif /* end FLEX_SCANNER */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-/*
- * Some systems include a definition for the macro ECHO in <sys/ioctl.h>,
- * and their (bad) version of lex defines it too at the very beginning of
- * the generated lex.yy.c file (before it can be easily undefined),
- * resulting in a conflict. So undefine it here before needed.
- * Luckily, it does not appear that this macro is actually used in the rest
- * of the generated lex.yy.c file.
- */
-#ifdef ECHO
-# undef ECHO
-#endif /* ECHO */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-#include <fsi_gram.h>
-/* and once again undefine this, just in case */
-#ifdef ECHO
-# undef ECHO
-#endif /* ECHO */
-
-/*
- * There are some things that need to be defined only if using GNU flex.
- * These must not be defined if using standard lex
- */
-#ifdef FLEX_SCANNER
-# ifndef ECHO
-# define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-# endif /* not ECHO */
-#endif /* FLEX_SCANNER */
-
-/*
- * some systems such as DU-4.x have a different GNU flex in /usr/bin
- * which automatically generates yywrap macros and symbols. So I must
- * distinguish between them and when yywrap is actually needed.
- */
-#ifndef yywrap
-int yywrap(void);
-#endif /* not yywrap */
-
-YYSTYPE yylval;
-static char *fsi_filename;
-static char *optr;
-static char ostr[1024];
-static int find_resword(char *);
-static int quoted;
-
-struct r {
- char *rw;
- int tok;
-} rr[] = {
- { "->", tEQ },
- { "arch", tARCH },
- { "as", tAS },
- { "automount", tAUTOMOUNT },
- { "cluster", tCLUSTER },
- { "config", tCONFIG },
- { "direct", tDIRECT },
- { "dumpset", tDUMPSET },
- { "exportfs", tEXPORTFS },
- { "freq", tFREQ },
- { "from", tFROM },
- { "fs", tFS },
- { "fstype", tFSTYPE },
- { "host", tHOST },
- { "hwaddr", tHWADDR },
- { "inaddr", tINADDR },
- { "localhost", tLOCALHOST },
- { "log", tLOG },
- { "mount", tMOUNT },
- { "netif", tNETIF },
- { "netmask", tNETMASK },
- { "nfsalias", tNFSEQ },
- { "opts", tOPTS },
- { "os", tOS },
- { "passno", tPASSNO },
- { "sel", tSEL },
- { "volname", tVOLNAME },
- { 0, 0 },
-};
-#define NRES_WORDS (sizeof(rr)/sizeof(rr[0])-1)
-
-%}
-
-/* This option causes Solaris lex to fail. Use flex. See BUGS file */
-/* no need to use yyunput() */
-%option nounput
-
-/* allocate more output slots so lex scanners don't run out of mem */
-%o 1024
-
-%start F Q
-
-%%
- INIT_STATE; /* witchcraft */
-
-<F>[^ \t\n"={}]+ { return find_resword(yytext); } /* dummy " */
-<F>[ \t] ;
-<F>"\n" { ayylineno++; }
-<F>[={}] { return *yytext; }
-
-<F>\" { BEGIN Q; optr = ostr; quoted = 1; }
-<Q>\n { ayylineno++; yyerror("\" expected"); BEGIN F; }
-<Q>\\b { *optr++ = '\b'; /* escape */ }
-<Q>\\t { *optr++ = '\t'; /* escape */ }
-<Q>\\\" { *optr++ = '\"'; /* escape */ }
-<Q>\\\\ { *optr++ = '\\'; /* escape */ }
-<Q>\\\n { ayylineno++; /* continue */ }
-<Q>\\r { *optr++ = '\r'; /* escape */ }
-<Q>\\n { *optr++ = '\n'; /* escape */ }
-<Q>\\f { *optr++ = '\f'; /* escape */ }
-<Q>"\\ " { *optr++ = ' '; /* force space */ }
-<Q>\\. { yyerror("Unknown \\ sequence"); }
-<Q>([ \t]|"\\\n"){2,} { char *p = (char *) yytext-1; while ((p = strchr(p+1, '\n'))) ayylineno++; }
-<Q>\" { BEGIN F; quoted = 0;
- *optr = '\0';
- yylval.s = strdup(ostr);
- return tSTR;
- }
-<Q>. { *optr++ = *yytext; }
-
-%%
-
-
-static int
-find_resword(char *s)
-{
- int tok = 0;
- int l = 0, m = NRES_WORDS/2, h = NRES_WORDS-1;
- int rc = 0;
-
- m = NRES_WORDS/2;
-
-#define FSTRCMP(p, q) ((*(p) == *(q)) ? strcmp((p)+1, (q)+1) : *(p) - *(q))
-
- while ((l <= h) && (rc = FSTRCMP(s, rr[m].rw))) {
- if (rc < 0)
- h = m - 1;
- else
- l = m + 1;
- m = (h + l) / 2;
- }
-
- if (rc == 0)
- tok = rr[m].tok;
-
- switch (tok) {
- case tLOCALHOST:
- s = "${host}";
- /* fall through... */
- case 0:
- yylval.s = strdup(s);
- tok = tSTR;
- /* fall through... */
- default:
- return tok;
- }
-}
-
-
-int
-yyerror(char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- col_cleanup(0);
- fprintf(stderr, "%s:%d: ", fsi_filename ? fsi_filename : "/dev/stdin", ayylineno);
- vfprintf(stderr, fmt, ap);
- fputc('\n', stderr);
- parse_errors++;
- va_end(ap);
- return 0;
-}
-
-
-ioloc *
-current_location(void)
-{
- ioloc *ip = CALLOC(struct ioloc);
- ip->i_line = ayylineno;
- ip->i_file = fsi_filename;
- return ip;
-}
-
-
-/*
- * some systems such as DU-4.x have a different GNU flex in /usr/bin
- * which automatically generates yywrap macros and symbols. So I must
- * distinguish between them and when yywrap is actually needed.
- */
-#ifndef yywrap
-int yywrap(void)
-{
- return 1;
-}
-#endif /* not yywrap */
diff --git a/contrib/amd/fsinfo/fsi_util.c b/contrib/amd/fsinfo/fsi_util.c
deleted file mode 100644
index 5e7571fd4db2..000000000000
--- a/contrib/amd/fsinfo/fsi_util.c
+++ /dev/null
@@ -1,681 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsi_util.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-/* static variables */
-static int show_range = 10;
-static int col = 0;
-static int total_shown = 0;
-static int total_mmm = 8;
-
-
-static int
-col_output(int len)
-{
- int wrapped = 0;
-
- col += len;
- if (col > 77) {
- fputc('\n', stdout);
- col = len;
- wrapped = 1;
- }
- return wrapped;
-}
-
-
-static void
-show_total(void)
-{
- if (total_mmm != -show_range + 1) {
- char n[8];
- int len;
-
- if (total_mmm < 0)
- fputc('*', stdout);
- xsnprintf(n, sizeof(n), "%d", total_shown);
- len = strlen(n);
- if (col_output(len))
- fputc(' ', stdout);
- fputs(n, stdout);
- fflush(stdout);
- total_mmm = -show_range;
- }
-}
-
-
-void
-col_cleanup(int eoj)
-{
- if (verbose < 0)
- return;
- if (eoj) {
- show_total();
- fputs(")]", stdout);
- }
- if (col) {
- fputc('\n', stdout);
- col = 0;
- }
-}
-
-
-/*
- * Lots of ways of reporting errors...
- */
-void
-error(char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- col_cleanup(0);
- fprintf(stderr, "%s: Error, ", progname);
- vfprintf(stderr, fmt, ap);
- fputc('\n', stderr);
- errors++;
- va_end(ap);
-}
-
-
-void
-lerror(ioloc *l, char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- col_cleanup(0);
- fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
- vfprintf(stderr, fmt, ap);
- fputc('\n', stderr);
- errors++;
- va_end(ap);
-}
-
-
-void
-lwarning(ioloc *l, char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- col_cleanup(0);
- fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
- vfprintf(stderr, fmt, ap);
- fputc('\n', stderr);
- va_end(ap);
-}
-
-
-void
-fatal(char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- col_cleanup(1);
- fprintf(stderr, "%s: Fatal, ", progname);
- vfprintf(stderr, fmt, ap);
- fputc('\n', stderr);
- va_end(ap);
- exit(1);
-}
-
-
-/*
- * Debug log
- */
-void
-fsi_log(char *fmt, ...)
-{
- va_list ap;
-
- if (verbose > 0) {
- va_start(ap, fmt);
- fputc('#', stdout);
- fprintf(stdout, "%s: ", progname);
- vfprintf(stdout, fmt, ap);
- putc('\n', stdout);
- va_end(ap);
- }
-}
-
-
-void
-info_hdr(FILE *ef, char *info)
-{
- fprintf(ef, "# *** NOTE: This file contains %s info\n", info);
-}
-
-
-void
-gen_hdr(FILE *ef, char *hn)
-{
- fprintf(ef, "# *** NOTE: Only for use on %s\n", hn);
-}
-
-
-static void
-make_banner(FILE *fp)
-{
- time_t t = time((time_t *) 0);
- char *cp = ctime(&t);
-
- fprintf(fp,
- "\
-# *** This file was automatically generated -- DO NOT EDIT HERE ***\n\
-# \"%s\" run by %s@%s on %s\
-#\n\
-",
- progname, username, hostname, cp);
-}
-
-
-void
-show_new(char *msg)
-{
- if (verbose < 0)
- return;
-
- total_shown++;
- if (total_mmm > show_range) {
- show_total();
- } else if (total_mmm == 0) {
- fputc('*', stdout);
- fflush(stdout);
- col += 1;
- }
- total_mmm++;
-}
-
-
-void
-show_area_being_processed(char *area, int n)
-{
- static char *last_area = 0;
-
- if (verbose < 0)
- return;
- if (last_area) {
- if (total_shown)
- show_total();
- fputs(")", stdout);
- col += 1;
- }
-
- if (!last_area || !STREQ(area, last_area)) {
- if (last_area) {
- col_cleanup(0);
- total_shown = 0;
- total_mmm = show_range + 1;
- }
- (void) col_output(strlen(area) + 2);
- fprintf(stdout, "[%s", area);
- last_area = area;
- }
-
- fputs(" (", stdout);
- col += 2;
- show_range = n;
- total_mmm = n + 1;
-
- fflush(stdout);
-}
-
-
-/*
- * Open a file with the given prefix and name
- */
-FILE *
-pref_open(char *pref, char *hn, void (*hdr) (FILE *, char *), char *arg)
-{
- char p[MAXPATHLEN];
- FILE *ef;
-
- xsnprintf(p, sizeof(p), "%s%s", pref, hn);
- fsi_log("Writing %s info for %s to %s", pref, hn, p);
- ef = fopen(p, "w");
- if (ef) {
- (*hdr) (ef, arg);
- make_banner(ef);
- } else {
- error("can't open %s for writing", p);
- }
-
- return ef;
-}
-
-
-int
-pref_close(FILE *fp)
-{
- return fclose(fp) == 0;
-}
-
-
-/*
- * Determine where Amd would automount the host/volname pair
- */
-void
-compute_automount_point(char *buf, size_t l, host *hp, char *vn)
-{
- xsnprintf(buf, l, "%s/%s%s", autodir, hp->h_lochost, vn);
-}
-
-
-/*
- * Data constructors..
- */
-automount *
-new_automount(char *name)
-{
- automount *ap = CALLOC(struct automount);
-
- ap->a_ioloc = current_location();
- ap->a_name = name;
- ap->a_volname = 0;
- ap->a_mount = 0;
- ap->a_opts = 0;
- show_new("automount");
- return ap;
-}
-
-
-auto_tree *
-new_auto_tree(char *def, qelem *ap)
-{
- auto_tree *tp = CALLOC(struct auto_tree);
-
- tp->t_ioloc = current_location();
- tp->t_defaults = def;
- tp->t_mount = ap;
- show_new("auto_tree");
- return tp;
-}
-
-
-host *
-new_host(void)
-{
- host *hp = CALLOC(struct host);
-
- hp->h_ioloc = current_location();
- hp->h_mask = 0;
- show_new("host");
- return hp;
-}
-
-
-void
-set_host(host *hp, int k, char *v)
-{
- int m = 1 << k;
-
- if (hp->h_mask & m) {
- yyerror("host field \"%s\" already set", host_strings[k]);
- return;
- }
- hp->h_mask |= m;
-
- switch (k) {
-
- case HF_HOST:{
- char *p = strdup(v);
- dict_ent *de = dict_locate(dict_of_hosts, v);
-
- if (de)
- yyerror("duplicate host %s!", v);
- else
- dict_add(dict_of_hosts, v, (char *) hp);
- hp->h_hostname = v;
- domain_strip(p, hostname);
- if (strchr(p, '.') != 0)
- XFREE(p);
- else
- hp->h_lochost = p;
- }
- break;
-
- case HF_CONFIG:{
- qelem *q;
- qelem *vq = (qelem *) v;
-
- hp->h_mask &= ~m;
- if (hp->h_config)
- q = hp->h_config;
- else
- q = hp->h_config = new_que();
- ins_que(vq, q->q_back);
- }
- break;
-
- case HF_ETHER:{
- qelem *q;
- qelem *vq = (qelem *) v;
-
- hp->h_mask &= ~m;
- if (hp->h_ether)
- q = hp->h_ether;
- else
- q = hp->h_ether = new_que();
- ins_que(vq, q->q_back);
- }
- break;
-
- case HF_ARCH:
- hp->h_arch = v;
- break;
-
- case HF_OS:
- hp->h_os = v;
- break;
-
- case HF_CLUSTER:
- hp->h_cluster = v;
- break;
-
- default:
- abort();
- break;
- }
-}
-
-
-ether_if *
-new_ether_if(void)
-{
- ether_if *ep = CALLOC(struct ether_if);
-
- ep->e_mask = 0;
- ep->e_ioloc = current_location();
- show_new("ether_if");
- return ep;
-}
-
-
-void
-set_ether_if(ether_if *ep, int k, char *v)
-{
- int m = 1 << k;
-
- if (ep->e_mask & m) {
- yyerror("netif field \"%s\" already set", ether_if_strings[k]);
- return;
- }
- ep->e_mask |= m;
-
- switch (k) {
-
- case EF_INADDR:{
- ep->e_inaddr.s_addr = inet_addr(v);
- if ((int) ep->e_inaddr.s_addr == (int) INADDR_NONE)
- yyerror("malformed IP dotted quad: %s", v);
- XFREE(v);
- }
- break;
-
- case EF_NETMASK:{
- u_long nm = 0;
-
- if ((sscanf(v, "0x%lx", &nm) == 1 || sscanf(v, "%lx", &nm) == 1) && nm != 0)
- ep->e_netmask = htonl(nm);
- else
- yyerror("malformed netmask: %s", v);
- XFREE(v);
- }
- break;
-
- case EF_HWADDR:
- ep->e_hwaddr = v;
- break;
-
- default:
- abort();
- break;
- }
-}
-
-
-void
-set_disk_fs(disk_fs *dp, int k, char *v)
-{
- int m = 1 << k;
-
- if (dp->d_mask & m) {
- yyerror("fs field \"%s\" already set", disk_fs_strings[k]);
- return;
- }
- dp->d_mask |= m;
-
- switch (k) {
-
- case DF_FSTYPE:
- dp->d_fstype = v;
- break;
-
- case DF_OPTS:
- dp->d_opts = v;
- break;
-
- case DF_DUMPSET:
- dp->d_dumpset = v;
- break;
-
- case DF_LOG:
- dp->d_log = v;
- break;
-
- case DF_PASSNO:
- dp->d_passno = atoi(v);
- XFREE(v);
- break;
-
- case DF_FREQ:
- dp->d_freq = atoi(v);
- XFREE(v);
- break;
-
- case DF_MOUNT:
- dp->d_mount = &((fsi_mount *) v)->m_q;
- break;
-
- default:
- abort();
- break;
- }
-}
-
-
-disk_fs *
-new_disk_fs(void)
-{
- disk_fs *dp = CALLOC(struct disk_fs);
-
- dp->d_ioloc = current_location();
- show_new("disk_fs");
- return dp;
-}
-
-
-void
-set_mount(fsi_mount *mp, int k, char *v)
-{
- int m = 1 << k;
-
- if (mp->m_mask & m) {
- yyerror("mount tree field \"%s\" already set", mount_strings[k]);
- return;
- }
- mp->m_mask |= m;
-
- switch (k) {
-
- case DM_VOLNAME:
- dict_add(dict_of_volnames, v, (char *) mp);
- mp->m_volname = v;
- break;
-
- case DM_EXPORTFS:
- mp->m_exportfs = v;
- break;
-
- case DM_SEL:
- mp->m_sel = v;
- break;
-
- default:
- abort();
- break;
- }
-}
-
-
-fsi_mount *
-new_mount(void)
-{
- fsi_mount *fp = CALLOC(struct fsi_mount);
-
- fp->m_ioloc = current_location();
- show_new("mount");
- return fp;
-}
-
-
-void
-set_fsmount(fsmount *fp, int k, char *v)
-{
- int m = 1 << k;
-
- if (fp->f_mask & m) {
- yyerror("mount field \"%s\" already set", fsmount_strings[k]);
- return;
- }
- fp->f_mask |= m;
-
- switch (k) {
-
- case FM_LOCALNAME:
- fp->f_localname = v;
- break;
-
- case FM_VOLNAME:
- fp->f_volname = v;
- break;
-
- case FM_FSTYPE:
- fp->f_fstype = v;
- break;
-
- case FM_OPTS:
- fp->f_opts = v;
- break;
-
- case FM_FROM:
- fp->f_from = v;
- break;
-
- case FM_DIRECT:
- break;
-
- default:
- abort();
- break;
- }
-}
-
-
-fsmount *
-new_fsmount(void)
-{
- fsmount *fp = CALLOC(struct fsmount);
-
- fp->f_ioloc = current_location();
- show_new("fsmount");
- return fp;
-}
-
-
-void
-init_que(qelem *q)
-{
- q->q_forw = q->q_back = q;
-}
-
-
-qelem *
-new_que(void)
-{
- qelem *q = CALLOC(qelem);
-
- init_que(q);
- return q;
-}
-
-
-void
-ins_que(qelem *elem, qelem *pred)
-{
- qelem *p;
-
- p = pred->q_forw;
- elem->q_back = pred;
- elem->q_forw = p;
- pred->q_forw = elem;
- p->q_back = elem;
-}
-
-
-void
-rem_que(qelem *elem)
-{
- qelem *p, *p2;
-
- p = elem->q_forw;
- p2 = elem->q_back;
-
- p2->q_forw = p;
- p->q_back = p2;
-}
diff --git a/contrib/amd/fsinfo/fsinfo.8 b/contrib/amd/fsinfo/fsinfo.8
deleted file mode 100644
index f893eb24bd8d..000000000000
--- a/contrib/amd/fsinfo/fsinfo.8
+++ /dev/null
@@ -1,121 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1993 Jan-Simon Pendry.
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)fsinfo.8 8.1 (Berkeley) 6/28/93
-.\" $Id: fsinfo.8,v 1.13.2.1 2006/01/02 18:48:25 ezk Exp $
-.\"
-.TH FSINFO 8 "June 28, 1993"
-.SH NAME
-fsinfo \- coordinate site-wide filesystem information
-.SH SYNOPSIS
-.B fsinfo
-[
-.B \-v
-] [
-.B \-a
-.I autodir
-] [
-.B \-b
-.I bootparams
-] [
-.B \-d
-.I dumpsets
-] [
-.B \-e
-.I exports
-] [
-.B \-f
-.I fstabs
-] [
-.B \-h
-.I hostname
-] [
-.B \-m
-.I automounts
-] [
-.B \-I
-.I dir
-] [
-.B \-D
-.I string[=string]
-] [
-.B \-U
-.I string[=string]
-]
-.I config
-.I ...
-.SH DESCRIPTION
-The
-.B fsinfo
-utility takes a set of system configuration information, and generates
-a coordinated set of
-.I amd
-,
-.I mount
-and
-.I mountd
-configuration files.
-.PP
-The
-.B fsinfo
-command is fully described in the document
-.I "Amd - The 4.4BSD Automounter"
-.SH "SEE ALSO"
-.BR amd (8),
-.BR mount (8),
-.BR mountd (8).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH HISTORY
-The
-.B fsinfo
-command first appeared in 4.4BSD.
-.SH AUTHORS
-Jan-Simon Pendry <jsp@doc.ic.ac.uk>, Department of Computing, Imperial College, London, UK.
-.P
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/fsinfo/fsinfo.c b/contrib/amd/fsinfo/fsinfo.c
deleted file mode 100644
index e441a47fab4b..000000000000
--- a/contrib/amd/fsinfo/fsinfo.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsinfo.c
- *
- */
-
-/*
- * fsinfo
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-#include <fsi_gram.h>
-
-/* globals */
-char **g_argv;
-char *autodir = "/a";
-char *progname;
-char hostname[MAXHOSTNAMELEN + 1];
-char *username;
-char idvbuf[1024];
-dict *dict_of_hosts;
-dict *dict_of_volnames;
-int errors;
-int file_io_errors;
-int parse_errors;
-int verbose;
-qelem *list_of_automounts;
-qelem *list_of_hosts;
-
-/*
- * Output file prefixes
- */
-char *bootparams_pref;
-char *dumpset_pref;
-char *exportfs_pref;
-char *fstab_pref;
-char *mount_pref;
-
-
-/*
- * Argument cracking...
- */
-static void
-fsi_get_args(int c, char *v[])
-{
- int ch;
- int usage = 0;
- char *iptr = idvbuf;
-
- /*
- * Determine program name
- */
- if (v[0]) {
- progname = strrchr(v[0], '/');
- if (progname && progname[1])
- progname++;
- else
- progname = v[0];
- }
-
- if (!progname)
- progname = "fsinfo";
-
- while ((ch = getopt(c, v, "a:b:d:e:f:h:m:D:U:I:qv")) != -1)
-
- switch (ch) {
-
- case 'a':
- autodir = optarg;
- break;
-
- case 'b':
- if (bootparams_pref)
- fatal("-b option specified twice");
- bootparams_pref = optarg;
- break;
-
- case 'd':
- if (dumpset_pref)
- fatal("-d option specified twice");
- dumpset_pref = optarg;
- break;
-
- case 'h':
- xstrlcpy(hostname, optarg, sizeof(hostname));
- break;
-
- case 'e':
- if (exportfs_pref)
- fatal("-e option specified twice");
- exportfs_pref = optarg;
- break;
-
- case 'f':
- if (fstab_pref)
- fatal("-f option specified twice");
- fstab_pref = optarg;
- break;
-
- case 'm':
- if (mount_pref)
- fatal("-m option specified twice");
- mount_pref = optarg;
- break;
-
- case 'q':
- verbose = -1;
- break;
-
- case 'v':
- verbose = 1;
- break;
-
- case 'I':
- case 'D':
- case 'U':
- /* sizeof(iptr) is actually that of idvbuf. See declaration above */
- xsnprintf(iptr, sizeof(idvbuf), "-%c%s ", ch, optarg);
- iptr += strlen(iptr);
- break;
-
- default:
- usage++;
- break;
- }
-
- if (c != optind) {
- g_argv = v + optind - 1;
-#ifdef yywrap
- if (yywrap())
-#endif /* yywrap */
- fatal("Cannot read any input files");
- } else {
- usage++;
- }
-
- if (usage) {
- fprintf(stderr,
- "\
-Usage: %s [-v] [-a autodir] [-h hostname] [-b bootparams] [-d dumpsets]\n\
-\t[-e exports] [-f fstabs] [-m automounts]\n\
-\t[-I dir] [-D|-U string[=string]] config ...\n", progname);
- exit(1);
- }
-
- if (g_argv[0])
- fsi_log("g_argv[0] = %s", g_argv[0]);
- else
- fsi_log("g_argv[0] = (nil)");
-}
-
-
-/*
- * Determine username of caller
- */
-static char *
-find_username(void)
-{
- const char *u = getlogin();
-
- if (!u) {
- struct passwd *pw = getpwuid(getuid());
- if (pw)
- u = pw->pw_name;
- }
-
- if (!u)
- u = getenv("USER");
- if (!u)
- u = getenv("LOGNAME");
- if (!u)
- u = "root";
-
- return strdup(u);
-}
-
-
-/*
- * MAIN
- */
-int
-main(int argc, char *argv[])
-{
- /*
- * Process arguments
- */
- fsi_get_args(argc, argv);
-
- /*
- * If no hostname given then use the local name
- */
- if (!*hostname && gethostname(hostname, sizeof(hostname)) < 0) {
- perror("gethostname");
- exit(1);
- }
- hostname[sizeof(hostname) - 1] = '\0';
-
- /*
- * Get the username
- */
- username = find_username();
-
- /*
- * New hosts and automounts
- */
- list_of_hosts = new_que();
- list_of_automounts = new_que();
-
- /*
- * New dictionaries
- */
- dict_of_volnames = new_dict();
- dict_of_hosts = new_dict();
-
- /*
- * Parse input
- */
- show_area_being_processed("read config", 11);
- if (yyparse())
- errors = 1;
- errors += file_io_errors + parse_errors;
-
- if (errors == 0) {
- /*
- * Do semantic analysis of input
- */
- analyze_hosts(list_of_hosts);
- analyze_automounts(list_of_automounts);
- }
-
- /*
- * Give up if errors
- */
- if (errors == 0) {
- /*
- * Output data files
- */
-
- write_atab(list_of_automounts);
- write_bootparams(list_of_hosts);
- write_dumpset(list_of_hosts);
- write_exportfs(list_of_hosts);
- write_fstab(list_of_hosts);
- }
- col_cleanup(1);
-
- exit(errors);
- return errors; /* should never reach here */
-}
diff --git a/contrib/amd/fsinfo/fsinfo.h b/contrib/amd/fsinfo/fsinfo.h
deleted file mode 100644
index 99b407b04bf0..000000000000
--- a/contrib/amd/fsinfo/fsinfo.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/fsinfo.h
- *
- */
-
-extern FILE *pref_open(char *pref, char *hn, void (*hdr) (FILE *, char *), char *arg);
-extern auto_tree *new_auto_tree(char *, qelem *);
-extern automount *new_automount(char *);
-extern char **g_argv;
-extern char *autodir;
-extern char *bootparams_pref;
-extern char *disk_fs_strings[];
-extern char *dumpset_pref;
-extern char *ether_if_strings[];
-extern char *exportfs_pref;
-extern char *fsmount_strings[];
-extern char *fstab_pref;
-extern char *host_strings[];
-extern char *mount_pref;
-extern char *mount_strings[];
-extern char *progname;
-extern char *username;
-extern char *xcalloc(int, int);
-extern char hostname[];
-extern char idvbuf[];
-extern dict *dict_of_hosts;
-extern dict *dict_of_volnames;
-extern dict *new_dict(void);
-extern dict_ent *dict_locate(dict *, char *);
-extern disk_fs *new_disk_fs(void);
-extern ether_if *new_ether_if(void);
-extern fsmount *new_fsmount(void);
-extern host *new_host(void);
-extern int dict_iter(dict *, int (*)(qelem *));
-extern int errors;
-extern int file_io_errors;
-extern int parse_errors;
-extern int pref_close(FILE *fp);
-extern int verbose;
-extern ioloc *current_location(void);
-extern fsi_mount *new_mount(void);
-extern qelem *new_que(void);
-extern void analyze_automounts(qelem *);
-extern void analyze_hosts(qelem *);
-extern void compute_automount_point(char *, size_t, host *, char *);
-extern void dict_add(dict *, char *, char *);
-extern void error(char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-extern void fatal(char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-extern void gen_hdr(FILE *ef, char *hn);
-extern void info_hdr(FILE *ef, char *info);
-extern void init_que(qelem *);
-extern void ins_que(qelem *, qelem *);
-extern void lerror(ioloc *l, char *fmt, ...)
- __attribute__((__format__(__printf__, 2, 3)));
-extern void fsi_log(char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-extern void lwarning(ioloc *l, char *fmt, ...)
- __attribute__((__format__(__printf__, 2, 3)));
-extern void rem_que(qelem *);
-extern void set_disk_fs(disk_fs *, int, char *);
-extern void set_fsmount(fsmount *, int, char *);
-extern void set_mount(fsi_mount *, int, char *);
-extern void show_area_being_processed(char *area, int n);
-extern void show_new(char *msg);
-extern void warning(void);
-
-extern int yyerror(char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-extern void domain_strip(char *otherdom, char *localdom);
-/*
- * some systems such as DU-4.x have a different GNU flex in /usr/bin
- * which automatically generates yywrap macros and symbols. So I must
- * distinguish between them and when yywrap is actually needed.
- */
-#ifndef yywrap
-extern int yywrap(void);
-#endif /* not yywrap */
-extern int yyparse(void);
-extern int write_atab(qelem *q);
-extern int write_bootparams(qelem *q);
-extern int write_dumpset(qelem *q);
-extern int write_exportfs(qelem *q);
-extern int write_fstab(qelem *q);
-extern void col_cleanup(int eoj);
-extern void set_host(host *hp, int k, char *v);
-extern void set_ether_if(ether_if *ep, int k, char *v);
-extern int yylex(void);
-
-
-#define BITSET(m,b) ((m) |= (1<<(b)))
-#define AM_FIRST(ty, q) ((ty *) ((q)->q_forw))
-#define HEAD(ty, q) ((ty *) q)
-#define ISSET(m,b) ((m) & (1<<(b)))
-#define ITER(v, ty, q) for ((v) = AM_FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v)))
-#define AM_LAST(ty, q) ((ty *) ((q)->q_back))
-#define NEXT(ty, q) ((ty *) (((qelem *) q)->q_forw))
diff --git a/contrib/amd/fsinfo/wr_atab.c b/contrib/amd/fsinfo/wr_atab.c
deleted file mode 100644
index e02db07f05f5..000000000000
--- a/contrib/amd/fsinfo/wr_atab.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/wr_atab.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-
-/*
- * Write a sequence of automount mount map entries
- */
-static int
-write_amount_info(FILE *af, automount *ap, u_int sk)
-{
- int errors = 0;
-
- if (ap->a_mount) {
- /*
- * A pseudo-directory.
- * This can also be a top-level directory, in which
- * case the type:=auto is not wanted...
- *
- * type:=auto;fs:=${map};pref:=whatever/
- */
- automount *ap2;
- if (strlen(ap->a_name) > sk) {
- fprintf(af, "%s type:=auto;fs:=${map};pref:=%s/\n",
- ap->a_name + sk, ap->a_name + sk);
- }
- ITER(ap2, automount, ap->a_mount)
- errors += write_amount_info(af, ap2, sk);
- } else if (ap->a_hardwiredfs) {
-
- /*
- * A hardwired filesystem "hostname:path"
- * rhost:=hostname;rfs:=path
- */
- char *key = ap->a_name + sk;
- char *hostname = ap->a_hardwiredfs;
- char *path = strrchr(hostname, (int) ':');
-
- if (path == NULL) {
- fprintf(stderr, "%s: %s not an NFS filesystem\n", ap->a_name, ap->a_hardwiredfs);
- errors++;
- } else {
- *path = '\0';
- path++;
-
- /*
- * Output the map key
- */
- fputs(key, af);
- fprintf(af, " rhost:=%s", hostname);
- fprintf(af, ";rfs:=%s", path);
- if (ap->a_opts && !STREQ(ap->a_opts, "")) {
- fprintf(af, ";%s", ap->a_opts);
- }
- fputc('\n', af);
- path--;
- *path = ':';
- }
- } else if (ap->a_mounted) {
-
- /*
- * A mounted partition
- * type:=link [ link entries ] type:=nfs [ nfs entries ]
- */
- dict_data *dd;
- dict_ent *de = ap->a_mounted;
- int done_type_link = 0;
- char *key = ap->a_name + sk;
-
- /*
- * Output the map key
- */
- fputs(key, af);
-
- /*
- * First output any Link locations that would not
- * otherwise be correctly mounted. These refer
- * to filesystem which are not mounted in the same
- * place which the automounter would use.
- */
- ITER(dd, dict_data, &de->de_q) {
- fsi_mount *mp = (fsi_mount *) dd->dd_data;
- /*
- * If the mount point and the exported volname are the
- * same then this filesystem will be recognized by
- * the restart code - so we don't need to put out a
- * special rule for it.
- */
- if (mp->m_dk->d_host->h_lochost) {
- char amountpt[1024];
- compute_automount_point(amountpt, sizeof(amountpt),
- mp->m_dk->d_host, mp->m_exported->m_volname);
- if (!STREQ(mp->m_dk->d_mountpt, amountpt)) {
- /*
- * ap->a_volname is the name of the aliased volume
- * mp->m_name is the mount point of the filesystem
- * mp->m_volname is the volume name of the filesystems
- */
-
- /*
- * Find length of key and volume names
- */
- int avlen = strlen(ap->a_volname);
- int mnlen = strlen(mp->m_volname);
-
- /*
- * Make sure a -type:=link is output once
- */
- if (!done_type_link) {
- done_type_link = 1;
- fputs(" -type:=link", af);
- }
-
- /*
- * Output a selector for the hostname,
- * the device from which to mount and
- * where to mount. This will correspond
- * to the values output for the fstab.
- */
- if (mp->m_dk->d_host->h_lochost)
- fprintf(af, " host==%s", mp->m_dk->d_host->h_lochost);
- else
- fprintf(af, " hostd==%s", mp->m_dk->d_host->h_hostname);
- fprintf(af, ";fs:=%s", mp->m_name);
-
- /*
- * ... and a sublink if needed
- */
- if (mnlen < avlen) {
- char *sublink = ap->a_volname + mnlen + 1;
- fprintf(af, "/%s", sublink);
- }
- fputs(" ||", af);
- }
- }
- }
-
- /*
- * Next do the NFS locations
- */
- if (done_type_link)
- fputs(" -", af);
-
- ITER(dd, dict_data, &de->de_q) {
- fsi_mount *mp = (fsi_mount *) dd->dd_data;
- int namelen = mp->m_name_len;
- int exp_namelen = mp->m_exported->m_name_len;
- int volnlen = strlen(ap->a_volname);
- int mvolnlen = strlen(mp->m_volname);
-
- fputc(' ', af);
-
- /*
- * Output any selectors
- */
- if (mp->m_sel)
- fprintf(af, "%s;", mp->m_sel);
-
- /*
- * Print host and volname of exported filesystem
- */
- fprintf(af, "rhost:=%s",
- mp->m_dk->d_host->h_lochost ?
- mp->m_dk->d_host->h_lochost :
- mp->m_dk->d_host->h_hostname);
- fprintf(af, ";rfs:=%s", mp->m_exported->m_volname);
- if (ap->a_opts && !STREQ(ap->a_opts, "")) {
- fprintf(af, ";%s", ap->a_opts);
- }
-
- /*
- * Now determine whether a sublink is required.
- */
- if (exp_namelen < namelen || mvolnlen < volnlen) {
- char sublink[1024];
- sublink[0] = '\0';
- if (exp_namelen < namelen) {
- xstrlcat(sublink, mp->m_name + exp_namelen + 1, sizeof(sublink));
- if (mvolnlen < volnlen)
- xstrlcat(sublink, "/", sizeof(sublink));
- }
- if (mvolnlen < volnlen)
- xstrlcat(sublink, ap->a_volname + mvolnlen + 1, sizeof(sublink));
-
- fprintf(af, ";sublink:=%s", sublink);
- }
- }
- fputc('\n', af);
- } else if (ap->a_symlink) {
-
- /*
- * A specific link.
- *
- * type:=link;fs:=whatever
- */
- fprintf(af, "%s type:=link;fs:=%s\n", ap->a_name + sk, ap->a_symlink);
- }
-
- return errors;
-}
-
-
-/*
- * Write a single automount configuration file
- */
-static int
-write_amount( qelem *q, char *def)
-{
- automount *ap;
- int errors = 0;
- int direct = 0;
-
- /*
- * Output all indirect maps
- */
- ITER(ap, automount, q) {
- FILE *af;
- char *p;
-
- /*
- * If there is no a_mount node then this is really
- * a direct mount, so just keep a count and continue.
- * Direct mounts are output into a special file during
- * the second pass below.
- */
- if (!ap->a_mount) {
- direct++;
- continue;
- }
-
- p = strrchr(ap->a_name, '/');
- if (!p)
- p = ap->a_name;
- else
- p++;
-
- af = pref_open(mount_pref, p, gen_hdr, ap->a_name);
- if (af) {
- show_new(ap->a_name);
- fputs("/defaults ", af);
- if (*def)
- fprintf(af, "%s;", def);
- fputs("type:=nfs\n", af);
- errors += write_amount_info(af, ap, strlen(ap->a_name) + 1);
- errors += pref_close(af);
- }
- }
-
- /*
- * Output any direct map entries which were found during the
- * previous pass over the data.
- */
- if (direct) {
- FILE *af = pref_open(mount_pref, "direct.map", info_hdr, "direct mount");
-
- if (af) {
- show_new("direct mounts");
- fputs("/defaults ", af);
- if (*def)
- fprintf(af, "%s;", def);
- fputs("type:=nfs\n", af);
- ITER(ap, automount, q)
- if (!ap->a_mount)
- errors += write_amount_info(af, ap, 1);
- errors += pref_close(af);
- }
- }
- return errors;
-}
-
-
-/*
- * Write all the needed automount configuration files
- */
-int
-write_atab(qelem *q)
-{
- int errors = 0;
-
- if (mount_pref) {
- auto_tree *tp;
- show_area_being_processed("write automount", 5);
- ITER(tp, auto_tree, q)
- errors += write_amount(tp->t_mount, tp->t_defaults);
- }
-
- return errors;
-}
diff --git a/contrib/amd/fsinfo/wr_bparam.c b/contrib/amd/fsinfo/wr_bparam.c
deleted file mode 100644
index 9220762f2b10..000000000000
--- a/contrib/amd/fsinfo/wr_bparam.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/wr_bparam.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-
-/*
- * Write a host/path in NFS format
- */
-static int
-write_nfsname(FILE *ef, fsmount *fp, char *hn)
-{
- int errors = 0;
- char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname);
-
- domain_strip(h, hn);
- fprintf(ef, "%s:%s", h, fp->f_volname);
- XFREE(h);
- return errors;
-}
-
-
-/*
- * Write a bootparams entry for a host
- */
-static int
-write_boot_info(FILE *ef, host *hp)
-{
- int errors = 0;
-
- fprintf(ef, "%s\troot=", hp->h_hostname);
- errors += write_nfsname(ef, hp->h_netroot, hp->h_hostname);
- fputs(" swap=", ef);
- errors += write_nfsname(ef, hp->h_netswap, hp->h_hostname);
- fputs("\n", ef);
-
- return 0;
-}
-
-
-/*
- * Output a bootparams file
- */
-int
-write_bootparams(qelem *q)
-{
- int errors = 0;
-
- if (bootparams_pref) {
- FILE *ef = pref_open(bootparams_pref, "bootparams", info_hdr, "bootparams");
- if (ef) {
- host *hp;
- ITER(hp, host, q)
- if (hp->h_netroot && hp->h_netswap)
- errors += write_boot_info(ef, hp);
- errors += pref_close(ef);
- } else {
- errors++;
- }
- }
-
- return errors;
-}
diff --git a/contrib/amd/fsinfo/wr_dumpset.c b/contrib/amd/fsinfo/wr_dumpset.c
deleted file mode 100644
index 69c1257e2659..000000000000
--- a/contrib/amd/fsinfo/wr_dumpset.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/wr_dumpset.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-
-static int
-write_dumpset_info(FILE *ef, qelem *q)
-{
- int errors = 0;
- disk_fs *dp;
-
- ITER(dp, disk_fs, q) {
- if (dp->d_dumpset) {
- fprintf(ef, "%s\t%s:%-30s\t# %s\n",
- dp->d_dumpset,
- dp->d_host->h_lochost ?
- dp->d_host->h_lochost :
- dp->d_host->h_hostname,
- dp->d_mountpt,
- dp->d_dev);
- }
- }
- return errors;
-}
-
-
-int
-write_dumpset(qelem *q)
-{
- int errors = 0;
-
- if (dumpset_pref) {
- FILE *ef = pref_open(dumpset_pref, "dumpsets", info_hdr, "exabyte dumpset");
- if (ef) {
- host *hp;
-
- ITER(hp, host, q) {
- if (hp->h_disk_fs) {
- errors += write_dumpset_info(ef, hp->h_disk_fs);
- }
- }
- errors += pref_close(ef);
- } else {
- errors++;
- }
- }
-
- return errors;
-}
diff --git a/contrib/amd/fsinfo/wr_exportfs.c b/contrib/amd/fsinfo/wr_exportfs.c
deleted file mode 100644
index 818d893687cd..000000000000
--- a/contrib/amd/fsinfo/wr_exportfs.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/wr_exportfs.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-
-static int
-write_export_info(FILE *ef, qelem *q, int errors)
-{
- fsi_mount *mp;
-
- ITER(mp, fsi_mount, q) {
- if (mp->m_mask & (1 << DM_EXPORTFS))
- fprintf(ef, "%s\t%s\n", mp->m_volname, mp->m_exportfs);
- if (mp->m_mount)
- errors += write_export_info(ef, mp->m_mount, 0);
- }
-
- return errors;
-}
-
-
-static int
-write_dkexports(FILE *ef, qelem *q)
-{
- int errors = 0;
- disk_fs *dp;
-
- ITER(dp, disk_fs, q) {
- if (dp->d_mount)
- errors += write_export_info(ef, dp->d_mount, 0);
- }
-
- return errors;
-}
-
-
-int
-write_exportfs(qelem *q)
-{
- int errors = 0;
-
- if (exportfs_pref) {
- host *hp;
-
- show_area_being_processed("write exportfs", 5);
- ITER(hp, host, q) {
- if (hp->h_disk_fs) {
- FILE *ef = pref_open(exportfs_pref, hp->h_hostname, gen_hdr, hp->h_hostname);
- if (ef) {
- show_new(hp->h_hostname);
- errors += write_dkexports(ef, hp->h_disk_fs);
- errors += pref_close(ef);
- } else {
- errors++;
- }
- }
- }
- }
-
- return errors;
-}
diff --git a/contrib/amd/fsinfo/wr_fstab.c b/contrib/amd/fsinfo/wr_fstab.c
deleted file mode 100644
index 52cebbf27e11..000000000000
--- a/contrib/amd/fsinfo/wr_fstab.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/fsinfo/wr_fstab.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <fsi_data.h>
-#include <fsinfo.h>
-
-#define GENERIC_OS_NAME "generic"
-
-/* forward definitions */
-static void write_aix1_dkfstab(FILE *ef, disk_fs *dp);
-static void write_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp);
-static void write_aix3_dkfstab(FILE *ef, disk_fs *dp);
-static void write_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp);
-static int write_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *));
-static int write_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *));
-static void write_generic_dkfstab(FILE *ef, disk_fs *dp);
-static void write_generic_dkrmount(FILE *ef, char *hn, fsmount *fp);
-static void write_ultrix_dkfstab(FILE *ef, disk_fs *dp);
-static void write_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp);
-
-/* ----------------------------------------------- */
-
-static struct os_fstab_type {
- char *os_name;
- void (*op_fstab) (FILE *ef, disk_fs *dp);
- void (*op_mount) (FILE *ef, char *hn, fsmount *fp);
-} os_tabs[] = {
-
- {
- "aix1", write_aix1_dkfstab, write_aix1_dkrmount
- }, /* AIX 1 */
- {
- "aix3", write_aix3_dkfstab, write_aix3_dkrmount
- }, /* AIX 3 */
- {
- "generic", write_generic_dkfstab, write_generic_dkrmount
- }, /* Generic */
- {
- "u2_0", write_ultrix_dkfstab, write_ultrix_dkrmount
- }, /* Ultrix */
- {
- "u3_0", write_ultrix_dkfstab, write_ultrix_dkrmount
- }, /* Ultrix */
- {
- "u4_0", write_ultrix_dkfstab, write_ultrix_dkrmount
- }, /* Ultrix */
- {
- 0, 0, 0
- }
-};
-
-
-/* ---------- AIX 1 ------------------------------ */
-
-/*
- * AIX 1 format
- */
-static void
-write_aix1_dkfstab(FILE *ef, disk_fs *dp)
-{
- char *hp = strdup(dp->d_host->h_hostname);
- char *p = strchr(hp, '.');
-
- if (p)
- *p = '\0';
-
- fprintf(ef, "\n%s:\n\tdev = %s\n\tvfs = %s\n\ttype = %s\n\tlog = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
- dp->d_mountpt,
- dp->d_dev,
- dp->d_fstype,
- dp->d_fstype,
- dp->d_log,
- dp->d_mountpt,
- dp->d_opts);
- XFREE(hp);
-}
-
-
-static void
-write_aix1_dkrmount(FILE *ef, char *hn, fsmount *fp)
-{
- char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname);
- char *hp = strdup(h);
- char *p = strchr(hp, '.');
-
- if (p)
- *p = '\0';
- domain_strip(h, hn);
- fprintf(ef, "\n%s:\n\tsite = %s\n\tdev = %s:%s\n\tvfs = %s\n\ttype = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
- fp->f_localname,
- hp,
- h,
- fp->f_volname,
- fp->f_fstype,
- fp->f_fstype,
- fp->f_localname,
- fp->f_opts);
-
- XFREE(hp);
- XFREE(h);
-}
-
-
-/* ---------- AIX 3 ------------------------------ */
-
-/*
- * AIX 3 format
- */
-static void
-write_aix3_dkfstab(FILE *ef, disk_fs *dp)
-{
- if (STREQ(dp->d_fstype, "jfs") &&
- NSTREQ(dp->d_dev, "/dev/", 5) &&
- !dp->d_log)
- error("aix 3 needs a log device for journalled filesystem (jfs) mounts");
-
- fprintf(ef, "\n%s:\n\tdev = %s\n\tvfs = %s\n\ttype = %s\n\tlog = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
- dp->d_mountpt,
- dp->d_dev,
- dp->d_fstype,
- dp->d_fstype,
- dp->d_log,
- dp->d_mountpt,
- dp->d_opts);
-}
-
-
-static void
-write_aix3_dkrmount(FILE *ef, char *hn, fsmount *fp)
-{
- char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname);
-
- domain_strip(h, hn);
- fprintf(ef, "\n%s:\n\tdev = %s:%s\n\tvfs = %s\n\ttype = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n",
- fp->f_localname,
- h,
- fp->f_volname,
- fp->f_fstype,
- fp->f_fstype,
- fp->f_localname,
- fp->f_opts);
-
- XFREE(h);
-}
-
-
-/* ---------- Ultrix ----------------------------- */
-
-static void
-write_ultrix_dkfstab(FILE *ef, disk_fs *dp)
-{
- fprintf(ef, "%s:%s:%s:%s:%d:%d\n",
- dp->d_dev,
- dp->d_mountpt,
- dp->d_fstype,
- dp->d_opts,
- dp->d_freq,
- dp->d_passno);
-}
-
-
-static void
-write_ultrix_dkrmount(FILE *ef, char *hn, fsmount *fp)
-{
- char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname);
-
- domain_strip(h, hn);
- fprintf(ef, "%s@%s:%s:%s:%s:0:0\n",
- fp->f_volname,
- h,
- fp->f_localname,
- fp->f_fstype,
- fp->f_opts);
- XFREE(h);
-}
-
-
-/* ---------- Generic ---------------------------- */
-
-/*
- * Generic (BSD, SunOS, HPUX) format
- */
-static void
-write_generic_dkfstab(FILE *ef, disk_fs *dp)
-{
- fprintf(ef, "%s %s %s %s %d %d\n",
- dp->d_dev,
- dp->d_mountpt,
- dp->d_fstype,
- dp->d_opts,
- dp->d_freq,
- dp->d_passno);
-}
-
-
-static void
-write_generic_dkrmount(FILE *ef, char *hn, fsmount *fp)
-{
- char *h;
-
- if (fp->f_ref) {
- h = strdup(fp->f_ref->m_dk->d_host->h_hostname);
- } else {
- h = strdup(fp->f_from);
- }
- domain_strip(h, hn);
- fprintf(ef, "%s:%s %s %s %s 0 0\n",
- h,
- fp->f_volname,
- fp->f_localname,
- fp->f_fstype,
- fp->f_opts);
- XFREE(h);
-}
-
-
-static struct os_fstab_type *
-find_fstab_type(host *hp)
-{
- struct os_fstab_type *op = 0;
- char *os_name = 0;
-
-again:;
- if (os_name == 0) {
- if (ISSET(hp->h_mask, HF_OS))
- os_name = hp->h_os;
- else
- os_name = GENERIC_OS_NAME;
- }
- for (op = os_tabs; op->os_name; op++)
- if (STREQ(os_name, op->os_name))
- return op;
-
- os_name = GENERIC_OS_NAME;
- goto again;
-}
-
-
-static int
-write_dkfstab(FILE *ef, qelem *q, void (*output) (FILE *, disk_fs *))
-{
- int errors = 0;
- disk_fs *dp;
-
- ITER(dp, disk_fs, q)
- if (!STREQ(dp->d_fstype, "export"))
- (*output) (ef, dp);
-
- return errors;
-}
-
-
-static int
-write_dkrmount(FILE *ef, qelem *q, char *hn, void (*output) (FILE *, char *, fsmount *))
-{
- int errors = 0;
- fsmount *fp;
-
- ITER(fp, fsmount, q)
- (*output) (ef, hn, fp);
-
- return errors;
-}
-
-
-int
-write_fstab(qelem *q)
-{
- int errors = 0;
-
- if (fstab_pref) {
- host *hp;
-
- show_area_being_processed("write fstab", 4);
- ITER(hp, host, q) {
- if (hp->h_disk_fs || hp->h_mount) {
- FILE *ef = pref_open(fstab_pref, hp->h_hostname, gen_hdr, hp->h_hostname);
- if (ef) {
- struct os_fstab_type *op = find_fstab_type(hp);
- show_new(hp->h_hostname);
- if (hp->h_disk_fs)
- errors += write_dkfstab(ef, hp->h_disk_fs, op->op_fstab);
- else
- fsi_log("No local disk mounts on %s", hp->h_hostname);
-
- if (hp->h_mount)
- errors += write_dkrmount(ef, hp->h_mount, hp->h_hostname, op->op_mount);
-
- pref_close(ef);
- }
- } else {
- error("no disk mounts on %s", hp->h_hostname);
- }
- }
- }
- return errors;
-}
diff --git a/contrib/amd/hlfsd/hlfsd.8 b/contrib/amd/hlfsd/hlfsd.8
deleted file mode 100644
index 8c6fb49a9893..000000000000
--- a/contrib/amd/hlfsd/hlfsd.8
+++ /dev/null
@@ -1,323 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1989 Jan-Simon Pendry
-.\" Copyright (c) 1989 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1989 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $Id: hlfsd.8,v 1.11.2.1 2006/01/02 18:48:25 ezk Exp $
-.\"
-.\" HLFSD was written at Columbia University Computer Science Department, by
-.\" Erez Zadok <ezk@cs.columbia.edu> and Alexander Dupuy <dupuy@smarts.com>
-.\" It is distributed under the same terms and conditions as AMD.
-.\"
-.TH HLFSD 8 "14 September 1993"
-.SH NAME
-hlfsd \- home-link file system daemon
-.SH SYNOPSIS
-.B hlfsd
-[
-.B \-fhnpvC
-] [
-.BI \-a " alt_dir"
-] [
-.BI \-c " cache-interval"
-] [
-.BI \-g " group"
-] [
-.BI \-i " reload-interval"
-] [
-.BI \-l " logfile"
-] [
-.BI \-o " mount-options"
-] [
-.BI \-x " log-options"
-] [
-.BI \-D " debug-options"
-] [
-.BI \-P " password-file"
-]
-[
-.I linkname
-.RI [ " subdir " ]
-]
-.SH DESCRIPTION
-.B Hlfsd
-is a daemon which implements a filesystem containing a symbolic link to
-subdirectory within a user's home directory, depending on the user
-which accessed that link. It was primarily designed to redirect
-incoming mail to users' home directories, so that it can read from
-anywhere.
-.LP
-.B Hlfsd
-operates by mounting itself as an
-.SM NFS
-server for the directory containing
-.IR linkname ,
-which defaults to
-.BR /hlfs/home .
-Lookups within that directory are handled by
-.BR hlfsd ,
-which uses the password map to determine how to resolve the lookup.
-The directory will be created if it doesn't already exist. The symbolic link will be to the accessing user's home directory, with
-.I subdir
-appended to it. If not specified,
-.I subdir
-defaults to
-.BR .hlfsdir .
-This directory will also be created if it does not already exist.
-.LP
-A SIGTERM sent to
-.B hlfsd
-will cause it to shutdown. A SIGHUP will flush the internal
-caches, and reload the password map. It will also close and
-reopen the log file, to enable the original log file to be
-removed or rotated. A SIGUSR1 will cause it to dump its internal
-table of user IDs and home directories to the file
-.BR /usr/tmp/hlfsd.dump.XXXXXX .
-.SH OPTIONS
-.TP
-.BI \-a " alt_dir"
-Alternate directory. The name of the directory to which
-the symbolic link returned by
-.B hlfsd
-will point, if it cannot access the home directory of the user. This
-defaults to
-.BR /var/hlfs .
-This directory will be created if it doesn't exist. It is expected
-that either users will read these files, or the system administrators
-will run a script to resend this "lost mail" to its owner.
-.TP
-.BI \-c " cache-interval"
-Caching interval.
-.B Hlfsd
-will cache the validity of home directories for this interval, in
-seconds. Entries which have been verified within the last
-.I cache-interval
-seconds will not be verified again, since the operation could
-be expensive, and the entries are most likely still valid.
-After the interval has expired,
-.B hlfsd
-will re-verify the validity of the user's home directory, and
-reset the cache time-counter. The default value for
-.I cache-interval
-is 300 seconds (5 minutes).
-.TP
-.B \-f
-Force fast startup. This option tells
-.B hlfsd
-to skip startup-time consistency checks such as existence of mount
-directory, alternate spool directory, symlink to be hidden under the
-mount directory, their permissions and validity.
-.TP
-.BI \-g " group"
-Set the special group HLFS_GID to
-.IR group .
-Programs such as
-.B from
-or
-.BR comsat ,
-which access the mailboxes of other users) must be setgid HLFS_GID to
-work properly. The default group is "hlfs". If no group is provided,
-and there is no group "hlfs", this feature is disabled.
-.TP
-.B \-h
-Help. Print a brief help message, and exit.
-.TP
-.BI \-i " reload-interval"
-Map-reloading interval. Each
-.I reload-interval
-seconds,
-.B hlfsd
-will reload the password map.
-.B Hlfsd
-needs the password map for the UIDs and home directory pathnames.
-.B Hlfsd
-schedules a SIGALRM to reload the password maps. A SIGHUP sent to
-.B hlfsd
-will force it to reload the maps immediately. The default
-value for
-.I reload-interval
-is 900 seconds (15 minutes.)
-.TP
-.BI \-l " logfile"
-Specify a log file to which
-.B hlfsd
-will record events. If
-.I logfile
-is the string
-.B syslog
-then the log messages will be sent to the system log daemon by
-.IR syslog (3),
-using the LOG_DAEMON facility.
-This is also the default.
-.TP
-.B \-n
-No verify.
-.B Hlfsd
-will not verify the validity of the symbolic link it will be
-returning, or that the user's home directory contains
-sufficient disk-space for spooling. This can speed up
-.B hlfsd
-at the cost of possibly returning symbolic links to home
-directories which are not currently accessible or are full.
-By default,
-.B hlfsd
-validates the symbolic-link in the background.
-The
-.B \-n
-option overrides the meaning of the
-.B \-c
-option, since no caching is necessary.
-.TP
-.BI \-o " mount-options"
-Mount options. Mount options which
-.B hlfsd
-will use to mount itself on top of
-.I dirname.
-By default,
-.IR mount-options
-is set to "ro". If the system supports symbolic-link caching, default
-options are set to "ro,nocache".
-.TP
-.B \-p
-Print PID.
-Outputs the process-id of
-.B hlfsd
-to standard output where it can be saved into a file.
-.TP
-.B \-v
-Version. Displays version information to standard error.
-.TP
-.BI \-x " log-options"
-Specify run-time logging options. The options are a comma separated
-list chosen from: fatal, error, user, warn, info, map, stats, all.
-.TP
-.BI \-C
-Force
-.B hlfsd
-to run on systems that cannot turn off the NFS attribute-cache. Use of
-this option on those systems is discouraged, as it may result in loss
-or mis-delivery of mail. The option is ignored on systems that can turn
-off the attribute-cache.
-.TP
-.BI \-D " log-options"
-Select from a variety of debugging options. Prefixing an
-option with the string
-.B no
-reverses the effect of that option. Options are cumulative.
-The most useful option is
-.BR all .
-Since this option is only used for debugging other options are not
-documented here. A fuller description is available in the program
-source. A SIGUSR1 sent to
-.B hlfsd
-will cause it to dump its internal password map to the file
-.BR /usr/tmp/hlfsd.dump.XXXXXX .
-.TP
-.BI \-P " password-file"
-Read the user-name, user-id, and home directory information from the file
-.I password-file.
-Normally,
-.B hlfsd
-will use
-.IR getpwent (3)
-to read the password database. This option allows you to override the
-default database, and is useful if you want to map users' mail files to a
-directory other than their home directory. Only the username, uid, and
-home-directory fields of the file
-.I password-file
-are read and checked. All other fields are ignored. The file
-.I password-file
-must otherwise be compliant with Unix System 7 colon-delimited format
-.IR passwd (4).
-.SH FILES
-.TP 5
-.B /hlfs
-directory under which
-.B hlfsd
-mounts itself and manages the symbolic link
-.BR home .
-.TP 5
-.B .hlfsdir
-default sub-directory in the user's home directory, to which the
-.B home
-symbolic link returned by
-.B hlfsd
-points.
-.TP 5
-.B /var/hlfs
-directory to which
-.B home
-symbolic link returned by
-.B hlfsd
-points if it is unable to verify the that
-user's home directory is accessible.
-.SH "SEE ALSO"
-.BR amd (8),
-.BR automount (8),
-.BR cron(8),
-.BR getgrent (3),
-.BR getpwent (3),
-.BR mail(1),
-.BR mnttab (4),
-.BR mount (8),
-.BR mtab (5),
-.BR passwd (4),
-.BR sendmail (8),
-.BR umount (8).
-.LP
-.IR "HLFSD: Delivering Email to Your $HOME" ,
-in
-.IR "Proc. LISA-VII, The 7th Usenix System Administration Conference" ,
-November 1993.
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.SH AUTHORS
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-and
-Alexander Dupuy <dupuy@smarts.com>, System Management ARTS,
-White Plains, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/hlfsd/hlfsd.c b/contrib/amd/hlfsd/hlfsd.c
deleted file mode 100644
index 8703f5982c5e..000000000000
--- a/contrib/amd/hlfsd/hlfsd.c
+++ /dev/null
@@ -1,926 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/hlfsd/hlfsd.c
- *
- * HLFSD was written at Columbia University Computer Science Department, by
- * Erez Zadok <ezk@cs.columbia.edu> and Alexander Dupuy <dupuy@cs.columbia.edu>
- * It is being distributed under the same terms and conditions as amd does.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <hlfsd.h>
-
-/*
- * STATIC VARIABLES:
- */
-static RETSIGTYPE proceed(int);
-static RETSIGTYPE reaper(int);
-static RETSIGTYPE reload(int);
-static char *hlfs_group = DEFAULT_HLFS_GROUP;
-static char default_dir_name[] = DEFAULT_DIRNAME;
-static char *dir_name = default_dir_name;
-static int printpid = 0;
-static int stoplight = 0;
-static void hlfsd_init(void);
-static void usage(void);
-
-static struct itimerval reloadinterval = {
- {DEFAULT_INTERVAL, 0},
- {DEFAULT_INTERVAL, 0}
-};
-
-/*
- * default mount options.
- */
-static char default_mntopts[] = "ro,noac";
-
-/*
- * GLOBALS:
- */
-SVCXPRT *nfsxprt;
-char *alt_spooldir = ALT_SPOOLDIR;
-char *home_subdir = HOME_SUBDIR;
-char *logfile = DEFAULT_LOGFILE;
-char *passwdfile = NULL; /* alternate passwd file to use */
-char *slinkname = 0;
-char hostname[MAXHOSTNAMELEN + 1] = "localhost";
-u_int cache_interval = DEFAULT_CACHE_INTERVAL;
-gid_t hlfs_gid = (gid_t) INVALIDID;
-int masterpid = 0;
-int noverify = 0;
-int orig_umask = 022;
-int serverpid = 0;
-nfstime startup;
-u_short nfs_port;
-
-/* symbol must be available always */
-#ifdef MNTTAB_FILE_NAME
-char *mnttab_file_name = MNTTAB_FILE_NAME;
-#else /* not MNTTAB_FILE_NAME */
-char *mnttab_file_name = NULL;
-#endif /* not MNTTAB_FILE_NAME */
-
-/* forward declarations */
-void hlfsd_going_down(int rc);
-
-
-static void
-usage(void)
-{
- fprintf(stderr,
- "Usage: %s [-Cfhnpv] [-a altdir] [-c cache-interval] [-g group]\n",
- am_get_progname());
- fprintf(stderr, "\t[-i interval] [-l logfile] [-o mntopts] [-P passwdfile]\n");
- show_opts('x', xlog_opt);
-#ifdef DEBUG
- show_opts('D', dbg_opt);
-#endif /* DEBUG */
- fprintf(stderr, "\t[dir_name [subdir]]\n");
- exit(2);
-}
-
-
-void
-fatalerror(char *str)
-{
-#define ERRM ": %m"
- size_t l = strlen(str) + sizeof(ERRM) - 1;
- char *tmp = strnsave(str, l);
- xstrlcat(tmp, ERRM, l);
- fatal(tmp);
-}
-
-
-int
-main(int argc, char *argv[])
-{
- char *dot;
- char *mntopts = (char *) NULL;
- char hostpid_fs[MAXHOSTNAMELEN + 1 + 16]; /* room for ":(pid###)" */
- char progpid_fs[PROGNAMESZ + 1 + 11]; /* room for ":pid" */
- char preopts[128];
- char *progname;
- int forcecache = 0;
- int forcefast = 0;
- int genflags = 0;
- int opt, ret;
- int opterrs = 0;
- int retry;
- int soNFS; /* NFS socket */
- int s = -99;
- mntent_t mnt;
- nfs_args_t nfs_args;
- am_nfs_handle_t anh;
- struct dirent *direntry;
- struct group *grp;
- struct stat stmodes;
- DIR *mountdir;
- MTYPE_TYPE type = MOUNT_TYPE_NFS;
-
-#ifdef HAVE_SIGACTION
- struct sigaction sa;
-#endif /* not HAVE_SIGACTION */
-
-#ifndef HAVE_TRANSPORT_TYPE_TLI
- struct sockaddr_in localsocket;
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
-
- /* get program name and truncate so we don't overflow progpid_fs */
-
- if ((progname = strrchr(argv[0], '/')) != NULL)
- progname++;
- else
- progname = argv[0];
- if ((int) strlen(progname) > PROGNAMESZ) /* truncate to reasonable size */
- progname[PROGNAMESZ] = '\0';
- am_set_progname(progname);
-
- while ((opt = getopt(argc, argv, "a:c:CD:fg:hi:l:no:pP:x:v")) != -1)
- switch (opt) {
-
- case 'a':
- if (!optarg || optarg[0] != '/') {
- printf("%s: invalid directory for -a: %s\n",
- am_get_progname(), optarg);
- exit(3);
- }
- alt_spooldir = optarg;
- break;
-
- case 'c':
- if (!atoi(optarg)) {
- printf("%s: invalid interval for -c: %s\n",
- am_get_progname(), optarg);
- exit(3);
- }
- cache_interval = atoi(optarg);
- break;
-
- case 'C':
- forcecache++;
- break;
-
- case 'f':
- forcefast++;
- break;
-
- case 'g':
- hlfs_group = optarg;
- break;
-
- case 'i':
- if (!atoi(optarg)) {
- printf("%s: invalid interval for -i: %s\n",
- am_get_progname(), optarg);
- exit(3);
- }
- reloadinterval.it_interval.tv_sec = atoi(optarg);
- reloadinterval.it_value.tv_sec = atoi(optarg);
- break;
-
- case 'l':
- logfile = optarg;
- break;
-
- case 'n':
- noverify++;
- break;
-
- case 'o':
- mntopts = optarg;
- break;
-
- case 'p':
- printpid++;
- break;
-
- case 'P':
- passwdfile = optarg;
- break;
-
- case 'v':
- fprintf(stderr, "%s\n", HLFSD_VERSION);
- exit(0);
-
- case 'x':
- opterrs += switch_option(optarg);
- break;
-
- case 'D':
-#ifdef DEBUG
- opterrs += debug_option(optarg);
-#else /* not DEBUG */
- fprintf(stderr, "%s: not compiled with DEBUG -- sorry.\n", am_get_progname());
-#endif /* not DEBUG */
- break;
-
- case 'h':
- case '?':
- opterrs++;
- }
-
- /* set some default debugging options */
- if (xlog_level_init == ~0)
- switch_option("");
- /* need my pid before any dlog/plog */
- am_set_mypid();
-#ifdef DEBUG
- switch_option("debug");
-#endif /* DEBUG */
-
-/*
- * Terminate if did not ask to forcecache (-C) and hlfsd would not be able
- * to set the minimum cache intervals.
- */
-#if !defined(MNT2_NFS_OPT_ACREGMIN) && !defined(MNT2_NFS_OPT_NOAC) && !defined(HAVE_NFS_ARGS_T_ACREGMIN)
- if (!forcecache) {
- fprintf(stderr, "%s: will not be able to turn off attribute caches.\n", am_get_progname());
- exit(1);
- }
-#endif /* !defined(MNT2_NFS_OPT_ACREGMIN) && !defined(MNT2_NFS_OPT_NOAC) && !defined(HAVE_NFS_ARGS_T_ACREGMIN) */
-
-
- switch (argc - optind) {
- case 2:
- home_subdir = argv[optind + 1];
- case 1:
- dir_name = argv[optind];
- case 0:
- break;
- default:
- opterrs++;
- }
-
- if (opterrs)
- usage();
-
- /* ensure that only root can run hlfsd */
- if (geteuid()) {
- fprintf(stderr, "hlfsd can only be run as root\n");
- exit(1);
- }
- setbuf(stdout, (char *) NULL);
- umask(0);
-
- /* find gid for hlfs_group */
- if ((grp = getgrnam(hlfs_group)) == (struct group *) NULL) {
- fprintf(stderr, "%s: cannot get gid for group \"%s\".\n",
- am_get_progname(), hlfs_group);
- } else {
- hlfs_gid = grp->gr_gid;
- }
-
- /* get hostname for logging and open log before we reset umask */
- gethostname(hostname, sizeof(hostname));
- hostname[sizeof(hostname) - 1] = '\0';
- if ((dot = strchr(hostname, '.')) != NULL)
- *dot = '\0';
- orig_umask = umask(0);
- if (logfile)
- switch_to_logfile(logfile, orig_umask, 0);
-
-#ifndef MOUNT_TABLE_ON_FILE
- if (amuDebug(D_MTAB))
- dlog("-D mtab option ignored");
-#endif /* not MOUNT_TABLE_ON_FILE */
-
- /* avoid hanging on other NFS servers if started elsewhere */
- if (chdir("/") < 0)
- fatal("cannot chdir to /: %m");
-
- if (geteuid() != 0)
- fatal("must be root to mount filesystems");
-
- /*
- * dir_name must match "^(/.*)/([^/]+)$", and is split at last '/' with
- * slinkname = `basename $dir_name` - requires dir_name be writable
- */
-
- if (dir_name[0] != '/'
- || ((slinkname = strrchr(dir_name, '/')), *slinkname++ = '\0',
- (dir_name[0] == '\0' || slinkname[0] == '\0'))) {
- if (slinkname)
- *--slinkname = '/';
- printf("%s: invalid mount directory/link %s\n",
- am_get_progname(), dir_name);
- exit(3);
- }
-
- if (!forcefast) {
- /* make sure mount point exists and is at least mode 555 */
- if (stat(dir_name, &stmodes) < 0)
- if (errno != ENOENT || mkdirs(dir_name, 0555) < 0
- || stat(dir_name, &stmodes) < 0)
- fatalerror(dir_name);
-
- if ((stmodes.st_mode & 0555) != 0555) {
- fprintf(stderr, "%s: directory %s not read/executable\n",
- am_get_progname(), dir_name);
- plog(XLOG_WARNING, "directory %s not read/executable",
- dir_name);
- }
-
- /* warn if extraneous stuff will be hidden by mount */
- if ((mountdir = opendir(dir_name)) == NULL)
- fatalerror(dir_name);
-
- while ((direntry = readdir(mountdir)) != NULL) {
- if (!NSTREQ(".", direntry->d_name, NAMLEN(direntry)) &&
- !NSTREQ("..", direntry->d_name, NAMLEN(direntry)) &&
- !NSTREQ(slinkname, direntry->d_name, NAMLEN(direntry)))
- break;
- }
-
- if (direntry != NULL) {
- fprintf(stderr, "%s: %s/%s will be hidden by mount\n",
- am_get_progname(), dir_name, direntry->d_name);
- plog(XLOG_WARNING, "%s/%s will be hidden by mount\n",
- dir_name, direntry->d_name);
- }
- closedir(mountdir);
-
- /* make sure alternate spool dir exists */
- if ((errno = mkdirs(alt_spooldir, OPEN_SPOOLMODE))) {
- fprintf(stderr, "%s: cannot create alternate dir ",
- am_get_progname());
- perror(alt_spooldir);
- plog(XLOG_ERROR, "cannot create alternate dir %s: %m",
- alt_spooldir);
- }
- chmod(alt_spooldir, OPEN_SPOOLMODE);
-
- /* create failsafe link to alternate spool directory */
- *(slinkname-1) = '/'; /* unsplit dir_name to include link */
- if (lstat(dir_name, &stmodes) == 0 &&
- (stmodes.st_mode & S_IFMT) != S_IFLNK) {
- fprintf(stderr, "%s: failsafe %s not a symlink\n",
- am_get_progname(), dir_name);
- plog(XLOG_WARNING, "failsafe %s not a symlink\n",
- dir_name);
- } else {
- unlink(dir_name);
-
- if (symlink(alt_spooldir, dir_name) < 0) {
- fprintf(stderr,
- "%s: cannot create failsafe symlink %s -> ",
- am_get_progname(), dir_name);
- perror(alt_spooldir);
- plog(XLOG_WARNING,
- "cannot create failsafe symlink %s -> %s: %m",
- dir_name, alt_spooldir);
- }
- }
-
- *(slinkname-1) = '\0'; /* resplit dir_name */
- } /* end of "if (!forcefast) {" */
-
- /*
- * Register hlfsd as an nfs service with the portmapper.
- */
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2);
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
- if (ret != 0)
- fatal("cannot create NFS service");
-
-#ifdef HAVE_SIGACTION
- sa.sa_handler = proceed;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGUSR2);
- sigaction(SIGUSR2, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- signal(SIGUSR2, proceed);
-#endif /* not HAVE_SIGACTION */
-
- plog(XLOG_INFO, "Initializing hlfsd...");
- hlfsd_init(); /* start up child (forking) to run svc_run */
-
-#ifdef HAVE_SIGACTION
- sa.sa_handler = reaper;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGCHLD);
- sigaction(SIGCHLD, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- signal(SIGCHLD, reaper);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * In the parent, if -D daemon, we don't need to
- * set this signal handler.
- */
- if (!amuDebug(D_DAEMON)) {
- s = -99;
- while (stoplight != SIGUSR2) {
- plog(XLOG_INFO, "parent waits for child to setup (stoplight=%d)", stoplight);
-#ifdef HAVE_SIGSUSPEND
- {
- sigset_t mask;
- sigemptyset(&mask);
- s = sigsuspend(&mask); /* wait for child to set up */
- }
-#else /* not HAVE_SIGSUSPEND */
- s = sigpause(0); /* wait for child to set up */
-#endif /* not HAVE_SIGSUSPEND */
- sleep(1);
- }
- }
-
- /*
- * setup options to mount table (/etc/{mtab,mnttab}) entry
- */
- xsnprintf(hostpid_fs, sizeof(hostpid_fs),
- "%s:(pid%d)", hostname, masterpid);
- memset((char *) &mnt, 0, sizeof(mnt));
- mnt.mnt_dir = dir_name; /* i.e., "/mail" */
- mnt.mnt_fsname = hostpid_fs;
- if (mntopts) {
- mnt.mnt_opts = mntopts;
- } else {
- xstrlcpy(preopts, default_mntopts, sizeof(preopts));
- /*
- * Turn off all kinds of attribute and symlink caches as
- * much as possible. Also make sure that mount does not
- * show up to df.
- */
-#ifdef MNTTAB_OPT_INTR
- xstrlcat(preopts, ",", sizeof(preopts));
- xstrlcat(preopts, MNTTAB_OPT_INTR, sizeof(preopts));
-#endif /* MNTTAB_OPT_INTR */
-#ifdef MNTTAB_OPT_IGNORE
- xstrlcat(preopts, ",", sizeof(preopts));
- xstrlcat(preopts, MNTTAB_OPT_IGNORE, sizeof(preopts));
-#endif /* MNTTAB_OPT_IGNORE */
-#ifdef MNT2_GEN_OPT_CACHE
- xstrlcat(preopts, ",nocache", sizeof(preopts));
-#endif /* MNT2_GEN_OPT_CACHE */
-#ifdef MNT2_NFS_OPT_SYMTTL
- xstrlcat(preopts, ",symttl=0", sizeof(preopts));
-#endif /* MNT2_NFS_OPT_SYMTTL */
- mnt.mnt_opts = preopts;
- }
-
- /*
- * Make sure that amd's top-level NFS mounts are hidden by default
- * from df.
- * If they don't appear to support the either the "ignore" mnttab
- * option entry, or the "auto" one, set the mount type to "nfs".
- */
-#ifdef HIDE_MOUNT_TYPE
- mnt.mnt_type = HIDE_MOUNT_TYPE;
-#else /* not HIDE_MOUNT_TYPE */
- mnt.mnt_type = "nfs";
-#endif /* not HIDE_MOUNT_TYPE */
- /* some systems don't have a mount type, but a mount flag */
-
-#ifndef HAVE_TRANSPORT_TYPE_TLI
- amu_get_myaddress(&localsocket.sin_addr, NULL);
- localsocket.sin_family = AF_INET;
- localsocket.sin_port = htons(nfsxprt->xp_port);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*
- * Update hostname field.
- * Make some name prog:pid (i.e., hlfsd:174) for hostname
- */
- xsnprintf(progpid_fs, sizeof(progpid_fs),
- "%s:%d", am_get_progname(), masterpid);
-
- /* Most kernels have a name length restriction. */
- if ((int) strlen(progpid_fs) >= (int) MAXHOSTNAMELEN)
- xstrlcpy(progpid_fs + MAXHOSTNAMELEN - 3, "..",
- sizeof(progpid_fs) - MAXHOSTNAMELEN + 3);
-
- genflags = compute_mount_flags(&mnt);
-
- retry = hasmntval(&mnt, MNTTAB_OPT_RETRY);
- if (retry <= 0)
- retry = 1; /* XXX */
-
- memmove(&anh.v2, root_fhp, sizeof(*root_fhp));
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- compute_nfs_args(&nfs_args,
- &mnt,
- genflags,
- nfsncp,
- NULL, /* remote host IP addr is set below */
- NFS_VERSION, /* version 2 */
- "udp", /* XXX: shouldn't this be "udp"? */
- &anh,
- progpid_fs, /* host name for kernel */
- hostpid_fs); /* filesystem name for kernel */
- /*
- * IMPORTANT: set the correct IP address AFTERWARDS. It cannot
- * be done using the normal mechanism of compute_nfs_args(), because
- * that one will allocate a new address and use NFS_SA_DREF() to copy
- * parts to it, while assuming that the ip_addr passed is always
- * a "struct sockaddr_in". That assumption is incorrect on TLI systems,
- * because they define a special macro HOST_SELF which is DIFFERENT
- * than localhost (127.0.0.1)!
- */
- nfs_args.addr = &nfsxprt->xp_ltaddr;
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- compute_nfs_args(&nfs_args,
- &mnt,
- genflags,
- NULL,
- &localsocket,
- NFS_VERSION, /* version 2 */
- "udp", /* XXX: shouldn't this be "udp"? */
- &anh,
- progpid_fs, /* host name for kernel */
- hostpid_fs); /* filesystem name for kernel */
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- /*************************************************************************
- * NOTE: while compute_nfs_args() works ok for regular NFS mounts *
- * the toplvl one is not, and so some options must be corrected by hand *
- * more carefully, *after* compute_nfs_args() runs. *
- *************************************************************************/
- compute_automounter_nfs_args(&nfs_args, &mnt);
-
-/*
- * For some reason, this mount may have to be done in the background, if I am
- * using -D daemon. I suspect that the actual act of mounting requires
- * calling to hlfsd itself to invoke one or more of its nfs calls, to stat
- * /mail. That means that even if you say -D daemon, at least the mount
- * of hlfsd itself on top of /mail will be done in the background.
- * The other alternative I have is to run svc_run, but set a special
- * signal handler to perform the mount in N seconds via some alarm.
- * -Erez Zadok.
- */
- if (!amuDebug(D_DAEMON)) { /* Normal case */
- plog(XLOG_INFO, "normal NFS mounting hlfsd service points");
- if (mount_fs(&mnt, genflags, (caddr_t) &nfs_args, retry, type, 0, NULL, mnttab_file_name, 0) < 0)
- fatal("nfsmount: %m");
- } else { /* asked for -D daemon */
- if (fork() == 0) { /* child runs mount */
- am_set_mypid();
- foreground = 0;
- plog(XLOG_INFO, "child NFS mounting hlfsd service points");
- if (mount_fs(&mnt, genflags, (caddr_t) &nfs_args, retry, type, 0, NULL, mnttab_file_name, 0) < 0) {
- fatal("nfsmount: %m");
- }
- exit(0); /* all went well */
- } else { /* fork failed or parent running */
- plog(XLOG_INFO, "parent waiting 1sec for mount...");
- }
- }
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- /*
- * XXX: this free_knetconfig() was not done for hlfsd before,
- * and apparently there was a reason for it, but why? -Erez
- */
- free_knetconfig(nfs_args.knconf);
- /*
- * local automounter mounts do not allocate a special address, so
- * no need to XFREE(nfs_args.addr) under TLI.
- */
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
- if (printpid)
- printf("%d\n", masterpid);
-
- plog(XLOG_INFO, "hlfsd ready to serve");
- /*
- * If asked not to fork a daemon (-D daemon), then hlfsd_init()
- * will not run svc_run. We must start svc_run here.
- */
- if (amuDebug(D_DAEMON)) {
- plog(XLOG_DEBUG, "starting no-daemon debugging svc_run");
- svc_run();
- }
-
- cleanup(0); /* should never happen here */
- return (0); /* everything went fine? */
-}
-
-
-static void
-hlfsd_init(void)
-{
- int child = 0;
-#ifdef HAVE_SIGACTION
- struct sigaction sa;
-#endif /* HAVE_SIGACTION */
-
- /*
- * Initialize file handles.
- */
- plog(XLOG_INFO, "initializing hlfsd file handles");
- hlfsd_init_filehandles();
-
- /*
- * If not -D daemon then we must fork.
- */
- if (!amuDebug(D_DAEMON))
- child = fork();
-
- if (child < 0)
- fatal("fork: %m");
-
- if (child != 0) { /* parent process - save child pid */
- masterpid = child;
- am_set_mypid(); /* for logging routines */
- return;
- }
-
- /*
- * CHILD CODE:
- * initialize server
- */
-
- plog(XLOG_INFO, "initializing home directory database");
- plt_init(); /* initialize database */
- plog(XLOG_INFO, "home directory database initialized");
-
- masterpid = serverpid = am_set_mypid(); /* for logging routines */
-
- /*
- * SIGALRM/SIGHUP: reload password database if timer expired
- * or user sent HUP signal.
- */
-#ifdef HAVE_SIGACTION
- sa.sa_handler = reload;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGALRM);
- sigaddset(&(sa.sa_mask), SIGHUP);
- sigaction(SIGALRM, &sa, NULL);
- sigaction(SIGHUP, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- signal(SIGALRM, reload);
- signal(SIGHUP, reload);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * SIGTERM: cleanup and exit.
- */
-#ifdef HAVE_SIGACTION
- sa.sa_handler = cleanup;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGTERM);
- sigaction(SIGTERM, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- signal(SIGTERM, cleanup);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * SIGCHLD: interlock synchronization and testing
- */
-#ifdef HAVE_SIGACTION
- sa.sa_handler = interlock;
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGCHLD);
- sigaction(SIGCHLD, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- signal(SIGCHLD, interlock);
-#endif /* not HAVE_SIGACTION */
-
- /*
- * SIGUSR1: dump internal hlfsd maps/cache to file
- */
-#ifdef HAVE_SIGACTION
-# if defined(DEBUG) || defined(DEBUG_PRINT)
- sa.sa_handler = plt_print;
-# else /* not defined(DEBUG) || defined(DEBUG_PRINT) */
- sa.sa_handler = SIG_IGN;
-# endif /* not defined(DEBUG) || defined(DEBUG_PRINT) */
- sa.sa_flags = 0;
- sigemptyset(&(sa.sa_mask));
- sigaddset(&(sa.sa_mask), SIGUSR1);
- sigaction(SIGUSR1, &sa, NULL);
-#else /* not HAVE_SIGACTION */
-# if defined(DEBUG) || defined(DEBUG_PRINT)
- signal(SIGUSR1, plt_print);
-# else /* not defined(DEBUG) || defined(DEBUG_PRINT) */
- signal(SIGUSR1, SIG_IGN);
-# endif /* not defined(DEBUG) || defined(DEBUG_PRINT) */
-#endif /* not HAVE_SIGACTION */
-
- if (setitimer(ITIMER_REAL, &reloadinterval, (struct itimerval *) 0) < 0)
- fatal("setitimer: %m");
-
- clocktime(&startup);
-
- /*
- * If not -D daemon, then start serving here in the child,
- * and the parent will exit. But if -D daemon, then
- * skip this code and make sure svc_run is entered elsewhere.
- */
- if (!amuDebug(D_DAEMON)) {
- /*
- * Dissociate from the controlling terminal
- */
- amu_release_controlling_tty();
-
- /*
- * signal parent we are ready. parent should
- * mount(2) and die.
- */
- if (kill(getppid(), SIGUSR2) < 0)
- fatal("kill: %m");
- plog(XLOG_INFO, "starting svc_run");
- svc_run();
- cleanup(0); /* should never happen, just in case */
- }
-
-}
-
-
-static RETSIGTYPE
-proceed(int signum)
-{
- stoplight = signum;
-}
-
-
-static RETSIGTYPE
-reload(int signum)
-{
- int child;
- int status;
-
- if (getpid() != masterpid)
- return;
-
- /*
- * If received a SIGHUP, close and reopen the log file (so that it
- * can be rotated)
- */
- if (signum == SIGHUP && logfile)
- switch_to_logfile(logfile, orig_umask, 0);
-
- /*
- * parent performs the reload, while the child continues to serve
- * clients accessing the home dir link.
- */
- if ((child = fork()) > 0) {
- serverpid = child; /* parent runs here */
- am_set_mypid();
-
- plt_init();
-
- if (kill(child, SIGKILL) < 0) {
- plog(XLOG_ERROR, "kill child: %m");
- } else { /* wait for child to die before continue */
- if (wait(&status) != child) {
- /*
- * I took out this line because it generates annoying output. It
- * indicates a very small bug in hlfsd which is totally harmless.
- * It causes hlfsd to work a bit harder than it should.
- * Nevertheless, I intend on fixing it in a future release.
- * -Erez Zadok <ezk@cs.columbia.edu>
- */
- /* plog(XLOG_ERROR, "unknown child"); */
- }
- }
- serverpid = masterpid;
- } else if (child < 0) {
- plog(XLOG_ERROR, "unable to fork: %m");
- } else {
- /* let child handle requests while we reload */
- serverpid = getpid();
- am_set_mypid();
- }
-}
-
-
-RETSIGTYPE
-cleanup(int signum)
-{
- struct stat stbuf;
- int umount_result;
-
- if (!amuDebug(D_DAEMON)) {
- if (getpid() != masterpid)
- return;
-
- if (fork() != 0) {
- masterpid = 0;
- am_set_mypid();
- return;
- }
- }
- am_set_mypid();
-
- for (;;) {
- while ((umount_result = UMOUNT_FS(dir_name, mnttab_file_name, 0)) == EBUSY) {
- dlog("cleanup(): umount delaying for 10 seconds");
- sleep(10);
- }
- if (stat(dir_name, &stbuf) == 0 && stbuf.st_ino == ROOTID) {
- plog(XLOG_ERROR, "unable to unmount %s", dir_name);
- plog(XLOG_ERROR, "suspending, unmount before terminating");
- kill(am_mypid, SIGSTOP);
- continue; /* retry unmount */
- }
- break;
- }
-
- if (!amuDebug(D_DAEMON)) {
- plog(XLOG_INFO, "cleanup(): killing processes and terminating");
- kill(masterpid, SIGKILL);
- kill(serverpid, SIGKILL);
- }
-
- plog(XLOG_INFO, "hlfsd terminating with status 0\n");
- _exit(0);
-}
-
-
-static RETSIGTYPE
-reaper(int signum)
-{
- int result;
-
- if (wait(&result) == masterpid) {
- _exit(4);
- }
-}
-
-
-void
-hlfsd_going_down(int rc)
-{
- int mypid = getpid(); /* XXX: should this be the global am_mypid */
-
- if (mypid == masterpid)
- cleanup(0);
- else if (mypid == serverpid)
- kill(masterpid, SIGTERM);
-
- exit(rc);
-}
-
-
-void
-fatal(char *mess)
-{
- if (logfile && !STREQ(logfile, "stderr")) {
- char lessmess[128];
- int messlen;
-
- messlen = strlen(mess);
-
- if (!STREQ(&mess[messlen + 1 - sizeof(ERRM)], ERRM))
- fprintf(stderr, "%s: %s\n", am_get_progname(), mess);
- else {
- xstrlcpy(lessmess, mess, sizeof(lessmess));
- lessmess[messlen - 4] = '\0';
-
- fprintf(stderr, "%s: %s: %s\n",
- am_get_progname(), lessmess, strerror(errno));
- }
- }
- plog(XLOG_FATAL, "%s", mess);
-
- hlfsd_going_down(1);
-}
diff --git a/contrib/amd/hlfsd/hlfsd.h b/contrib/amd/hlfsd/hlfsd.h
deleted file mode 100644
index ed136b6f2306..000000000000
--- a/contrib/amd/hlfsd/hlfsd.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/hlfsd/hlfsd.h
- *
- * HLFSD was written at Columbia University Computer Science Department, by
- * Erez Zadok <ezk@cs.columbia.edu> and Alexander Dupuy <dupuy@cs.columbia.edu>
- * It is being distributed under the same terms and conditions as amd does.
- */
-
-#ifndef _HLFSD_HLFS_H
-#define _HLFSD_HLFS_H
-
-/*
- * MACROS AND CONSTANTS:
- */
-
-#define HLFSD_VERSION "hlfsd 1.2 (1993-2002)"
-#define PERS_SPOOLMODE 0755
-#define OPEN_SPOOLMODE 01777
-#define DOTSTRING "."
-
-/*
- * ROOTID and SLINKID are the fixed "faked" node IDs (inodes) for
- * the '.' (also '..') and the one symlink within the hlfs.
- * They must always be unique, and should never match what a UID
- * could be.
- * They used to be -1 and -2, respectively.
- *
- * I used to cast these to (uid_t) but it failed to compile
- * with /opt/SUNWspro/bin/cc because uid_t is long, while struct fattr's
- * uid field is u_int. Then it failed to compile on some linux systems
- * which define uid_t to be unsigned short, so I used the lowest common
- * size which is unsigned short.
- */
-/*
- * XXX: this will cause problems to systems with UIDs greater than
- * MAX_UNSIGNED_SHORT-3.
- */
-#define ROOTID (((unsigned short) ~0) - 1)
-#define SLINKID (((unsigned short) ~0) - 2)
-#ifndef INVALIDID
-/* this is also defined in include/am_utils.h */
-# define INVALIDID (((unsigned short) ~0) - 3)
-#endif /* not INVALIDID */
-
-#define DOTCOOKIE 1
-#define DOTDOTCOOKIE 2
-#define SLINKCOOKIE 3
-
-#define ALT_SPOOLDIR "/var/hlfs" /* symlink to use if others fail */
-#define HOME_SUBDIR ".hlfsdir" /* dirname in user's home dir */
-#define DEFAULT_DIRNAME "/hlfs/home"
-#define DEFAULT_INTERVAL 900 /* secs b/t re-reads of the password maps */
-#define DEFAULT_CACHE_INTERVAL 300 /* secs during which assume a link is up */
-#define DEFAULT_HLFS_GROUP "hlfs" /* Group name for special hlfs_gid */
-
-#define PROGNAMESZ (MAXHOSTNAMELEN - 5)
-
-#ifdef HAVE_SYSLOG
-# define DEFAULT_LOGFILE "syslog"
-#else /* not HAVE)_SYSLOG */
-# define DEFAULT_LOGFILE 0
-#endif /* not HAVE)_SYSLOG */
-
-
-/*
- * TYPEDEFS:
- */
-typedef struct uid2home_t uid2home_t;
-typedef struct username2uid_t username2uid_t;
-
-
-/*
- * STRUCTURES:
- */
-struct uid2home_t {
- uid_t uid; /* XXX: with or without UID_OFFSET? */
- pid_t child;
- char *home; /* really allocated */
- char *uname; /* an xref ptr to username2uid_t->username */
- u_long last_access_time;
- int last_status; /* 0=used $HOME/.hlfsspool; !0=used alt dir */
-};
-
-struct username2uid_t {
- char *username; /* really allocated */
- uid_t uid; /* XXX: with or without UID_OFFSET? */
- char *home; /* an xref ptr to uid2home_t->home */
-};
-
-/*
- * EXTERNALS:
- */
-extern RETSIGTYPE cleanup(int);
-extern RETSIGTYPE interlock(int);
-extern SVCXPRT *nfs_program_2_transp; /* For quick_reply() */
-extern SVCXPRT *nfsxprt;
-extern char *alt_spooldir;
-extern char *home_subdir;
-extern char *homedir(int, int);
-extern char *mailbox(int, char *);
-extern char *passwdfile;
-extern char *slinkname;
-extern gid_t hlfs_gid;
-extern u_int cache_interval;
-extern int noverify;
-extern int serverpid;
-extern int untab_index(char *username);
-extern am_nfs_fh *root_fhp;
-extern am_nfs_fh root;
-extern nfstime startup;
-extern uid2home_t *plt_search(u_int);
-extern username2uid_t *untab; /* user name table */
-extern void fatal(char *);
-extern void plt_init(void);
-extern void hlfsd_init_filehandles(void);
-
-#if defined(DEBUG) || defined(DEBUG_PRINT)
-extern void plt_dump(uid2home_t *, pid_t);
-extern void plt_print(int);
-#endif /* defined(DEBUG) || defined(DEBUG_PRINT) */
-
-#endif /* _HLFSD_HLFS_H */
diff --git a/contrib/amd/hlfsd/homedir.c b/contrib/amd/hlfsd/homedir.c
deleted file mode 100644
index 2ade32ffb344..000000000000
--- a/contrib/amd/hlfsd/homedir.c
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/hlfsd/homedir.c
- *
- * HLFSD was written at Columbia University Computer Science Department, by
- * Erez Zadok <ezk@cs.columbia.edu> and Alexander Dupuy <dupuy@cs.columbia.edu>
- * It is being distributed under the same terms and conditions as amd does.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <hlfsd.h>
-
-
-/*
- * STATIC VARIABLES AND FUNCTIONS:
- */
-static FILE *passwd_fp = NULL;
-static char pw_name[16], pw_dir[128];
-static int cur_pwtab_num = 0, max_pwtab_num = 0;
-static int hlfsd_diskspace(char *);
-static int hlfsd_stat(char *, struct stat *);
-static int passwd_line = 0;
-static int plt_reset(void);
-static struct passwd passwd_ent;
-static uid2home_t *lastchild;
-static uid2home_t *pwtab;
-static void delay(uid2home_t *, int);
-static void table_add(u_int, const char *, const char *);
-static char mboxfile[MAXPATHLEN];
-static char *root_home; /* root's home directory */
-
-/* GLOBAL FUNCTIONS */
-char *homeof(char *username);
-int uidof(char *username);
-
-/* GLOBALS VARIABLES */
-username2uid_t *untab; /* user name table */
-
-/*
- * Return the home directory pathname for the user with uid "userid".
- */
-char *
-homedir(int userid, int groupid)
-{
- static char linkval[MAXPATHLEN + 1];
- static struct timeval tp;
- uid2home_t *found;
- char *homename;
- struct stat homestat;
- int old_groupid, old_userid;
-
- if ((found = plt_search(userid)) == (uid2home_t *) NULL) {
- return alt_spooldir; /* use alt spool for unknown uid */
- }
- homename = found->home;
-
- if (homename[0] != '/' || homename[1] == '\0') {
- found->last_status = 1;
- return alt_spooldir; /* use alt spool for / or rel. home */
- }
- if ((int) userid == 0) /* force all uid 0 to use root's home */
- xsnprintf(linkval, sizeof(linkval), "%s/%s", root_home, home_subdir);
- else
- xsnprintf(linkval, sizeof(linkval), "%s/%s", homename, home_subdir);
-
- if (noverify) {
- found->last_status = 0;
- return linkval;
- }
-
- /*
- * To optimize hlfsd, we don't actually check the validity of the
- * symlink if it has been checked in the last N seconds. It is
- * very likely that the link, machine, and filesystem are still
- * valid, as long as N is small. But if N is large, that may not be
- * true. That's why the default N is 5 minutes, but we allow the
- * user to override this value via a command line option. Note that
- * we do not update the last_access_time each time it is accessed,
- * but only once every N seconds.
- */
- if (gettimeofday(&tp, (struct timezone *) NULL) < 0) {
- tp.tv_sec = 0;
- } else {
- if ((tp.tv_sec - found->last_access_time) < cache_interval) {
- if (found->last_status == 0) {
- return linkval;
- } else {
- return alt_spooldir;
- }
- } else {
- found->last_access_time = tp.tv_sec;
- }
- }
-
- /*
- * only run this forking code if did not ask for -D fork
- */
- if (!amuDebug(D_FORK)) {
- /* fork child to process request if none in progress */
- if (found->child && kill(found->child, 0))
- found->child = 0;
-
- if (found->child)
- delay(found, 5); /* wait a bit if in progress */
- if (found->child) { /* better safe than sorry - maybe */
- found->last_status = 1;
- return alt_spooldir;
- }
- if ((found->child = fork()) < 0) {
- found->last_status = 1;
- return alt_spooldir;
- }
- if (found->child) { /* PARENT */
- if (lastchild)
- dlog("cache spill uid = %ld, pid = %ld, home = %s",
- (long) lastchild->uid, (long) lastchild->child,
- lastchild->home);
- lastchild = found;
- return (char *) NULL; /* return NULL to parent, so it can continue */
- }
- }
-
- /*
- * CHILD: (or parent if -D fork)
- *
- * Check and create dir if needed.
- * Check disk space and/or quotas too.
- *
- * We don't need to set the _last_status field of found after the fork
- * in the child, b/c that information would be later determined in
- * nfsproc_readlink_2() and the correct exit status would be returned
- * to the parent upon SIGCHLD in interlock().
- *
- */
- am_set_mypid(); /* for logging routines */
- if ((old_groupid = setgid(groupid)) < 0) {
- plog(XLOG_WARNING, "could not setgid to %d: %m", groupid);
- return linkval;
- }
- if ((old_userid = seteuid(userid)) < 0) {
- plog(XLOG_WARNING, "could not seteuid to %d: %m", userid);
- setgid(old_groupid);
- return linkval;
- }
- if (hlfsd_stat(linkval, &homestat) < 0) {
- if (errno == ENOENT) { /* make the spool dir if possible */
- /* don't use recursive mkdirs here */
- if (mkdir(linkval, PERS_SPOOLMODE) < 0) {
- seteuid(old_userid);
- setgid(old_groupid);
- plog(XLOG_WARNING, "can't make directory %s: %m", linkval);
- return alt_spooldir;
- }
- /* fall through to testing the disk space / quota */
- } else { /* the home dir itself must not exist then */
- seteuid(old_userid);
- setgid(old_groupid);
- plog(XLOG_WARNING, "bad link to %s: %m", linkval);
- return alt_spooldir;
- }
- }
-
- /*
- * If gets here, then either the spool dir in the home dir exists,
- * or it was just created. In either case, we now need to
- * test if we can create a small file and write at least one
- * byte into it. This will test that we have both enough inodes
- * and disk blocks to spare, or they fall within the user's quotas too.
- * We are still seteuid to the user at this point.
- */
- if (hlfsd_diskspace(linkval) < 0) {
- seteuid(old_userid);
- setgid(old_groupid);
- plog(XLOG_WARNING, "no more space in %s: %m", linkval);
- return alt_spooldir;
- } else {
- seteuid(old_userid);
- setgid(old_groupid);
- return linkval;
- }
-}
-
-
-static int
-hlfsd_diskspace(char *path)
-{
- char buf[MAXPATHLEN];
- int fd, len;
-
- xsnprintf(buf, sizeof(buf), "%s/._hlfstmp_%lu", path, (long) getpid());
- if ((fd = open(buf, O_RDWR | O_CREAT, 0600)) < 0) {
- plog(XLOG_ERROR, "cannot open %s: %m", buf);
- return -1;
- }
- len = strlen(buf);
- if (write(fd, buf, len) < len) {
- plog(XLOG_ERROR, "cannot write \"%s\" (%d bytes) to %s : %m", buf, len, buf);
- close(fd);
- unlink(buf); /* cleanup just in case */
- return -1;
- }
- if (unlink(buf) < 0) {
- plog(XLOG_ERROR, "cannot unlink %s : %m", buf);
- }
- close(fd);
- return 0;
-}
-
-
-static int
-hlfsd_stat(char *path, struct stat *statp)
-{
- if (stat(path, statp) < 0)
- return -1;
- else if (!S_ISDIR(statp->st_mode)) {
- errno = ENOTDIR;
- return -1;
- }
- return 0;
-}
-
-
-static void
-delay(uid2home_t *found, int secs)
-{
- struct timeval tv;
-
- dlog("delaying on child %ld for %d seconds", (long) found->child, secs);
-
- tv.tv_usec = 0;
-
- do {
- tv.tv_sec = secs;
- if (select(0, 0, 0, 0, &tv) == 0)
- break;
- } while (--secs && found->child);
-}
-
-
-/*
- * This function is called when a child has terminated after
- * servicing an nfs request. We need to check the exit status and
- * update the last_status field of the requesting user.
- */
-RETSIGTYPE
-interlock(int signum)
-{
- int child;
- uid2home_t *lostchild;
- int status;
-
-#ifdef HAVE_WAITPID
- while ((child = waitpid((pid_t) -1, &status, WNOHANG)) > 0) {
-#else /* not HAVE_WAITPID */
- while ((child = wait3(&status, WNOHANG, (struct rusage *) 0)) > 0) {
-#endif /* not HAVE_WAITPID */
-
- /* high chances this was the last child forked */
- if (lastchild && lastchild->child == child) {
- lastchild->child = 0;
-
- if (WIFEXITED(status))
- lastchild->last_status = WEXITSTATUS(status);
- lastchild = (uid2home_t *) NULL;
- } else {
- /* and if not, we have to search for it... */
- for (lostchild = pwtab; lostchild < &pwtab[cur_pwtab_num]; lostchild++) {
- if (lostchild->child == child) {
- if (WIFEXITED(status))
- lostchild->last_status = WEXITSTATUS(status);
- lostchild->child = 0;
- break;
- }
- }
- }
- }
-}
-
-
-/*
- * PASSWORD AND USERNAME LOOKUP TABLES FUNCTIONS
- */
-
-/*
- * get index of UserName table entry which matches username.
- * must not return uid_t because we want to return a negative number.
- */
-int
-untab_index(char *username)
-{
- int max, min, mid, cmp;
-
- max = cur_pwtab_num - 1;
- min = 0;
-
- do {
- mid = (max + min) / 2;
- cmp = strcmp(untab[mid].username, username);
- if (cmp == 0) /* record found! */
- return mid;
- if (cmp > 0)
- max = mid;
- else
- min = mid;
- } while (max > min + 1);
-
- if (STREQ(untab[max].username, username))
- return max;
- if (STREQ(untab[min].username, username))
- return min;
-
- /* if gets here then record was not found */
- return -1;
-}
-
-
-/*
- * Don't make this return a uid_t, because we need to return negative
- * numbers as well (error codes.)
- */
-int
-uidof(char *username)
-{
- int idx;
-
- if ((idx = untab_index(username)) < 0) /* not found */
- return INVALIDID; /* an invalid user id */
- return untab[idx].uid;
-}
-
-
-/*
- * Don't make this return a uid_t, because we need to return negative
- * numbers as well (error codes.)
- */
-char *
-homeof(char *username)
-{
- int idx;
-
- if ((idx = untab_index(username)) < 0) /* not found */
- return (char *) NULL; /* an invalid user id */
- return untab[idx].home;
-}
-
-
-char *
-mailbox(int uid, char *username)
-{
- char *home;
-
- if (uid < 0)
- return (char *) NULL; /* not found */
-
- if ((home = homeof(username)) == (char *) NULL)
- return (char *) NULL;
- if (STREQ(home, "/"))
- xsnprintf(mboxfile, sizeof(mboxfile),
- "/%s/%s", home_subdir, username);
- else
- xsnprintf(mboxfile, sizeof(mboxfile),
- "%s/%s/%s", home, home_subdir, username);
- return mboxfile;
-}
-
-
-static int
-plt_compare_fxn(const voidp x, const voidp y)
-
-{
- uid2home_t *i = (uid2home_t *) x;
- uid2home_t *j = (uid2home_t *) y;
-
- return i->uid - j->uid;
-}
-
-
-static int
-unt_compare_fxn(const voidp x, const voidp y)
-{
- username2uid_t *i = (username2uid_t *) x;
- username2uid_t *j = (username2uid_t *) y;
-
- return strcmp(i->username, j->username);
-}
-
-
-/* perform initialization of user passwd database */
-static void
-hlfsd_setpwent(void)
-{
- if (!passwdfile) {
- setpwent();
- return;
- }
-
- passwd_fp = fopen(passwdfile, "r");
- if (!passwd_fp) {
- plog(XLOG_ERROR, "unable to read passwd file %s: %m", passwdfile);
- return;
- }
- plog(XLOG_INFO, "reading password entries from file %s", passwdfile);
-
- passwd_line = 0;
- memset((char *) &passwd_ent, 0, sizeof(struct passwd));
- passwd_ent.pw_name = (char *) &pw_name;
- passwd_ent.pw_dir = (char *) &pw_dir;
-}
-
-
-/* perform de-initialization of user passwd database */
-static void
-hlfsd_endpwent(void)
-{
- if (!passwdfile) {
- /*
- * Don't actually run this because we will be making more passwd calls
- * afterwards. On Solaris 2.5.1, making getpwent() calls after calling
- * endpwent() results in a memory leak! (and no, even Purify didn't
- * detect it...)
- *
- endpwent();
- */
- return;
- }
-
- if (passwd_fp) {
- fclose(passwd_fp);
- }
-}
-
-
-/* perform record reading/parsing of individual passwd database records */
-static struct passwd *
-hlfsd_getpwent(void)
-{
- char buf[256], *cp;
-
- /* check if to perform standard unix function */
- if (!passwdfile) {
- return getpwent();
- }
-
- /* return here to read another entry */
-readent:
-
- /* return NULL if reached end of file */
- if (feof(passwd_fp))
- return NULL;
-
- pw_name[0] = pw_dir[0] = '\0';
-
- /* read records */
- buf[0] = '\0';
- fgets(buf, 256, passwd_fp);
- passwd_line++;
- if (!buf || buf[0] == '\0')
- goto readent;
-
- /* read user name */
- cp = strtok(buf, ":");
- if (!cp || cp[0] == '\0') {
- plog(XLOG_ERROR, "no user name on line %d of %s", passwd_line, passwdfile);
- goto readent;
- }
- /* pw_name will show up in passwd_ent.pw_name */
- xstrlcpy(pw_name, cp, sizeof(pw_name));
-
- /* skip passwd */
- strtok(NULL, ":");
-
- /* read uid */
- cp = strtok(NULL, ":");
- if (!cp || cp[0] == '\0') {
- plog(XLOG_ERROR, "no uid on line %d of %s", passwd_line, passwdfile);
- goto readent;
- }
- passwd_ent.pw_uid = atoi(cp);
-
- /* skip gid and gcos */
- strtok(NULL, ":");
- strtok(NULL, ":");
-
- /* read home dir */
- cp = strtok(NULL, ":");
- if (!cp || cp[0] == '\0') {
- plog(XLOG_ERROR, "no home dir on line %d of %s", passwd_line, passwdfile);
- goto readent;
- }
- /* pw_dir will show up in passwd_ent.pw_dir */
- xstrlcpy(pw_dir, cp, sizeof(pw_dir));
-
- /* the rest of the fields are unimportant and not being considered */
-
- plog(XLOG_USER, "hlfsd_getpwent: name=%s, uid=%ld, dir=%s",
- passwd_ent.pw_name, (long) passwd_ent.pw_uid, passwd_ent.pw_dir);
-
- return &passwd_ent;
-}
-
-
-/*
- * read and hash the passwd file or NIS map
- */
-void
-plt_init(void)
-{
- struct passwd *pent_p;
-
- if (plt_reset() < 0) /* could not reset table. skip. */
- return;
-
- plog(XLOG_INFO, "reading password map");
-
- hlfsd_setpwent(); /* prepare to read passwd entries */
- while ((pent_p = hlfsd_getpwent()) != (struct passwd *) NULL) {
- table_add(pent_p->pw_uid, pent_p->pw_dir, pent_p->pw_name);
- if (STREQ("root", pent_p->pw_name)) {
- int len;
- if (root_home)
- XFREE(root_home);
- root_home = strdup(pent_p->pw_dir);
- len = strlen(root_home);
- /* remove any trailing '/' chars from root's home (even if just one) */
- while (len > 0 && root_home[len - 1] == '/') {
- len--;
- root_home[len] = '\0';
- }
- }
- }
- hlfsd_endpwent();
-
- qsort((char *) pwtab, cur_pwtab_num, sizeof(uid2home_t),
- plt_compare_fxn);
- qsort((char *) untab, cur_pwtab_num, sizeof(username2uid_t),
- unt_compare_fxn);
-
- if (!root_home)
- root_home = strdup("");
-
- plog(XLOG_INFO, "password map read and sorted");
-}
-
-
-/*
- * This is essentially so that we don't reset known good lookup tables when a
- * YP server goes down.
- */
-static int
-plt_reset(void)
-{
- int i;
-
- hlfsd_setpwent();
- if (hlfsd_getpwent() == (struct passwd *) NULL) {
- hlfsd_endpwent();
- return -1; /* did not reset table */
- }
- hlfsd_endpwent();
-
- lastchild = (uid2home_t *) NULL;
-
- if (max_pwtab_num > 0) /* was used already. cleanup old table */
- for (i = 0; i < cur_pwtab_num; ++i) {
- if (pwtab[i].home) {
- XFREE(pwtab[i].home);
- pwtab[i].home = (char *) NULL;
- }
- pwtab[i].uid = INVALIDID; /* not a valid uid (yet...) */
- pwtab[i].child = (pid_t) 0;
- pwtab[i].uname = (char *) NULL; /* only a ptr to untab[i].username */
- if (untab[i].username) {
- XFREE(untab[i].username);
- untab[i].username = (char *) NULL;
- }
- untab[i].uid = INVALIDID; /* invalid uid */
- untab[i].home = (char *) NULL; /* only a ptr to pwtab[i].home */
- }
- cur_pwtab_num = 0; /* zero current size */
-
- if (root_home)
- XFREE(root_home);
-
- return 0; /* resetting ok */
-}
-
-
-/*
- * u: uid number
- * h: home directory
- * n: user ID name
- */
-static void
-table_add(u_int u, const char *h, const char *n)
-{
- int i;
-
- if (max_pwtab_num <= 0) { /* was never initialized */
- max_pwtab_num = 1;
- pwtab = (uid2home_t *) xmalloc(max_pwtab_num *
- sizeof(uid2home_t));
- memset((char *) &pwtab[0], 0, max_pwtab_num * sizeof(uid2home_t));
- untab = (username2uid_t *) xmalloc(max_pwtab_num *
- sizeof(username2uid_t));
- memset((char *) &untab[0], 0, max_pwtab_num * sizeof(username2uid_t));
- }
-
- /* check if need more space. */
- if (cur_pwtab_num + 1 > max_pwtab_num) {
- /* need more space in table */
- max_pwtab_num *= 2;
- plog(XLOG_INFO, "reallocating table spaces to %d entries", max_pwtab_num);
- pwtab = (uid2home_t *) xrealloc(pwtab,
- sizeof(uid2home_t) * max_pwtab_num);
- untab = (username2uid_t *) xrealloc(untab,
- sizeof(username2uid_t) *
- max_pwtab_num);
- /* zero out newly added entries */
- for (i=cur_pwtab_num; i<max_pwtab_num; ++i) {
- memset((char *) &pwtab[i], 0, sizeof(uid2home_t));
- memset((char *) &untab[i], 0, sizeof(username2uid_t));
- }
- }
-
- /* do NOT add duplicate entries (this is an O(N^2) algorithm... */
- for (i=0; i<cur_pwtab_num; ++i)
- if (u == pwtab[i].uid && u != 0 ) {
- dlog("ignoring duplicate home %s for uid %d (already %s)",
- h, u, pwtab[i].home);
- return;
- }
-
- /* add new password entry */
- pwtab[cur_pwtab_num].home = strdup(h);
- pwtab[cur_pwtab_num].child = 0;
- pwtab[cur_pwtab_num].last_access_time = 0;
- pwtab[cur_pwtab_num].last_status = 0; /* assume best: used homedir */
- pwtab[cur_pwtab_num].uid = u;
-
- /* add new userhome entry */
- untab[cur_pwtab_num].username = strdup(n);
-
- /* just a second pointer */
- pwtab[cur_pwtab_num].uname = untab[cur_pwtab_num].username;
- untab[cur_pwtab_num].uid = u;
- untab[cur_pwtab_num].home = pwtab[cur_pwtab_num].home; /* a ptr */
-
- /* increment counter */
- ++cur_pwtab_num;
-}
-
-
-/*
- * return entry in lookup table
- */
-uid2home_t *
-plt_search(u_int u)
-{
- int max, min, mid;
-
- /*
- * empty table should not happen,
- * but I have a bug with signals to trace...
- */
- if (pwtab == (uid2home_t *) NULL)
- return (uid2home_t *) NULL;
-
- max = cur_pwtab_num - 1;
- min = 0;
-
- do {
- mid = (max + min) / 2;
- if (pwtab[mid].uid == u) /* record found! */
- return &pwtab[mid];
- if (pwtab[mid].uid > u)
- max = mid;
- else
- min = mid;
- } while (max > min + 1);
-
- if (pwtab[max].uid == u)
- return &pwtab[max];
- if (pwtab[min].uid == u)
- return &pwtab[min];
-
- /* if gets here then record was not found */
- return (uid2home_t *) NULL;
-}
-
-
-#if defined(DEBUG) || defined(DEBUG_PRINT)
-void
-plt_print(int signum)
-{
- FILE *dumpfile;
- int dumpfd;
- char dumptmp[] = "/usr/tmp/hlfsd.dump.XXXXXX";
- int i;
-
-#ifdef HAVE_MKSTEMP
- dumpfd = mkstemp(dumptmp);
-#else /* not HAVE_MKSTEMP */
- mktemp(dumptmp);
- if (!dumptmp) {
- plog(XLOG_ERROR, "cannot create temporary dump file");
- return;
- }
- dumpfd = open(dumptmp, O_RDONLY);
-#endif /* not HAVE_MKSTEMP */
- if (dumpfd < 0) {
- plog(XLOG_ERROR, "cannot open temporary dump file");
- return;
- }
- if ((dumpfile = fdopen(dumpfd, "a")) != NULL) {
- plog(XLOG_INFO, "dumping internal state to file %s", dumptmp);
- fprintf(dumpfile, "\n\nNew plt_dump():\n");
- for (i = 0; i < cur_pwtab_num; ++i)
- fprintf(dumpfile,
- "%4d %5lu %10lu %1d %4lu \"%s\" uname=\"%s\"\n",
- i,
- (long) pwtab[i].child,
- pwtab[i].last_access_time,
- pwtab[i].last_status,
- (long) pwtab[i].uid,
- pwtab[i].home,
- pwtab[i].uname);
- fprintf(dumpfile, "\nUserName table by plt_print():\n");
- for (i = 0; i < cur_pwtab_num; ++i)
- fprintf(dumpfile, "%4d : \"%s\" %4lu \"%s\"\n", i,
- untab[i].username, (long) untab[i].uid, untab[i].home);
- close(dumpfd);
- fclose(dumpfile);
- }
-}
-
-
-void
-plt_dump(uid2home_t *lastc, pid_t this)
-{
- FILE *dumpfile;
- int i;
-
- if ((dumpfile = fopen("/var/tmp/hlfsdump", "a")) != NULL) {
- fprintf(dumpfile, "\n\nNEW PLT_DUMP -- ");
- fprintf(dumpfile, "lastchild->child=%d ",
- (int) (lastc ? lastc->child : -999));
- fprintf(dumpfile, ", child from wait3=%lu:\n", (long) this);
- for (i = 0; i < cur_pwtab_num; ++i)
- fprintf(dumpfile, "%4d %5lu: %4lu \"%s\" uname=\"%s\"\n", i,
- (long) pwtab[i].child, (long) pwtab[i].uid,
- pwtab[i].home, pwtab[i].uname);
- fprintf(dumpfile, "\nUserName table by plt_dump():\n");
- for (i = 0; i < cur_pwtab_num; ++i)
- fprintf(dumpfile, "%4d : \"%s\" %4lu \"%s\"\n", i,
- untab[i].username, (long) untab[i].uid, untab[i].home);
- fprintf(dumpfile, "ezk: ent=%d, uid=%lu, home=\"%s\"\n",
- untab_index("ezk"),
- (long) untab[untab_index("ezk")].uid,
- pwtab[untab[untab_index("ezk")].uid].home);
- fprintf(dumpfile, "rezk: ent=%d, uid=%lu, home=\"%s\"\n",
- untab_index("rezk"),
- (long) untab[untab_index("rezk")].uid,
- pwtab[untab[untab_index("rezk")].uid].home);
- fclose(dumpfile);
- }
-}
-#endif /* defined(DEBUG) || defined(DEBUG_PRINT) */
diff --git a/contrib/amd/hlfsd/nfs_prot_svc.c b/contrib/amd/hlfsd/nfs_prot_svc.c
deleted file mode 100644
index 8cea0dca700d..000000000000
--- a/contrib/amd/hlfsd/nfs_prot_svc.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/hlfsd/nfs_prot_svc.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <hlfsd.h>
-
-/* EXTERNAL FUNCTIONS */
-extern voidp nfsproc_null_2_svc(voidp, struct svc_req *);
-extern nfsattrstat *nfsproc_getattr_2_svc(am_nfs_fh *, struct svc_req *);
-extern nfsattrstat *nfsproc_setattr_2_svc(nfssattrargs *, struct svc_req *);
-extern voidp nfsproc_root_2_svc(voidp, struct svc_req *);
-extern nfsdiropres *nfsproc_lookup_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsreadlinkres *nfsproc_readlink_2_svc(am_nfs_fh *, struct svc_req *);
-extern nfsreadres *nfsproc_read_2_svc(nfsreadargs *, struct svc_req *);
-extern voidp nfsproc_writecache_2_svc(voidp, struct svc_req *);
-extern nfsattrstat *nfsproc_write_2_svc(nfswriteargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_create_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_remove_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsstat *nfsproc_rename_2_svc(nfsrenameargs *, struct svc_req *);
-extern nfsstat *nfsproc_link_2_svc(nfslinkargs *, struct svc_req *);
-extern nfsstat *nfsproc_symlink_2_svc(nfssymlinkargs *, struct svc_req *);
-extern nfsdiropres *nfsproc_mkdir_2_svc(nfscreateargs *, struct svc_req *);
-extern nfsstat *nfsproc_rmdir_2_svc(nfsdiropargs *, struct svc_req *);
-extern nfsreaddirres *nfsproc_readdir_2_svc(nfsreaddirargs *, struct svc_req *);
-extern nfsstatfsres *nfsproc_statfs_2_svc(am_nfs_fh *, struct svc_req *);
-
-/* GLOBALS */
-SVCXPRT *nfs_program_2_transp;
-
-/* TYPEDEFS */
-typedef char *(*nfssvcproc_t)(voidp, struct svc_req *);
-
-
-void
-nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
-{
- union {
- am_nfs_fh nfsproc_getattr_2_arg;
- nfssattrargs nfsproc_setattr_2_arg;
- nfsdiropargs nfsproc_lookup_2_arg;
- am_nfs_fh nfsproc_readlink_2_arg;
- nfsreadargs nfsproc_read_2_arg;
- nfswriteargs nfsproc_write_2_arg;
- nfscreateargs nfsproc_create_2_arg;
- nfsdiropargs nfsproc_remove_2_arg;
- nfsrenameargs nfsproc_rename_2_arg;
- nfslinkargs nfsproc_link_2_arg;
- nfssymlinkargs nfsproc_symlink_2_arg;
- nfscreateargs nfsproc_mkdir_2_arg;
- nfsdiropargs nfsproc_rmdir_2_arg;
- nfsreaddirargs nfsproc_readdir_2_arg;
- am_nfs_fh nfsproc_statfs_2_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- nfssvcproc_t local;
-
- nfs_program_2_transp = NULL;
-
- switch (rqstp->rq_proc) {
-
- case NFSPROC_NULL:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (nfssvcproc_t) nfsproc_null_2_svc;
- break;
-
- case NFSPROC_GETATTR:
- xdr_argument = (xdrproc_t) xdr_nfs_fh;
- xdr_result = (xdrproc_t) xdr_attrstat;
- local = (nfssvcproc_t) nfsproc_getattr_2_svc;
- break;
-
- case NFSPROC_SETATTR:
- xdr_argument = (xdrproc_t) xdr_sattrargs;
- xdr_result = (xdrproc_t) xdr_attrstat;
- local = (nfssvcproc_t) nfsproc_setattr_2_svc;
- break;
-
- case NFSPROC_ROOT:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (nfssvcproc_t) nfsproc_root_2_svc;
- break;
-
- case NFSPROC_LOOKUP:
- xdr_argument = (xdrproc_t) xdr_diropargs;
- xdr_result = (xdrproc_t) xdr_diropres;
- local = (nfssvcproc_t) nfsproc_lookup_2_svc;
- /*
- * Cheap way to pass transp down to afs_lookuppn so it can
- * be stored in the am_node structure and later used for
- * quick_reply().
- */
- nfs_program_2_transp = transp;
- break;
-
- case NFSPROC_READLINK:
- xdr_argument = (xdrproc_t) xdr_nfs_fh;
- xdr_result = (xdrproc_t) xdr_readlinkres;
- local = (nfssvcproc_t) nfsproc_readlink_2_svc;
- break;
-
- case NFSPROC_READ:
- xdr_argument = (xdrproc_t) xdr_readargs;
- xdr_result = (xdrproc_t) xdr_readres;
- local = (nfssvcproc_t) nfsproc_read_2_svc;
- break;
-
- case NFSPROC_WRITECACHE:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t) xdr_void;
- local = (nfssvcproc_t) nfsproc_writecache_2_svc;
- break;
-
- case NFSPROC_WRITE:
- xdr_argument = (xdrproc_t) xdr_writeargs;
- xdr_result = (xdrproc_t) xdr_attrstat;
- local = (nfssvcproc_t) nfsproc_write_2_svc;
- break;
-
- case NFSPROC_CREATE:
- xdr_argument = (xdrproc_t) xdr_createargs;
- xdr_result = (xdrproc_t) xdr_diropres;
- local = (nfssvcproc_t) nfsproc_create_2_svc;
- break;
-
- case NFSPROC_REMOVE:
- xdr_argument = (xdrproc_t) xdr_diropargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_remove_2_svc;
- break;
-
- case NFSPROC_RENAME:
- xdr_argument = (xdrproc_t) xdr_renameargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_rename_2_svc;
- break;
-
- case NFSPROC_LINK:
- xdr_argument = (xdrproc_t) xdr_linkargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_link_2_svc;
- break;
-
- case NFSPROC_SYMLINK:
- xdr_argument = (xdrproc_t) xdr_symlinkargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_symlink_2_svc;
- break;
-
- case NFSPROC_MKDIR:
- xdr_argument = (xdrproc_t) xdr_createargs;
- xdr_result = (xdrproc_t) xdr_diropres;
- local = (nfssvcproc_t) nfsproc_mkdir_2_svc;
- break;
-
- case NFSPROC_RMDIR:
- xdr_argument = (xdrproc_t) xdr_diropargs;
- xdr_result = (xdrproc_t) xdr_nfsstat;
- local = (nfssvcproc_t) nfsproc_rmdir_2_svc;
- break;
-
- case NFSPROC_READDIR:
- xdr_argument = (xdrproc_t) xdr_readdirargs;
- xdr_result = (xdrproc_t) xdr_readdirres;
- local = (nfssvcproc_t) nfsproc_readdir_2_svc;
- break;
-
- case NFSPROC_STATFS:
- xdr_argument = (xdrproc_t) xdr_nfs_fh;
- xdr_result = (xdrproc_t) xdr_statfsres;
- local = (nfssvcproc_t) nfsproc_statfs_2_svc;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
-
- memset((char *) &argument, 0, sizeof(argument));
- if (!svc_getargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) &argument)) {
- plog(XLOG_ERROR,
- "NFS xdr decode failed for %d %d %d",
- (int) rqstp->rq_prog, (int) rqstp->rq_vers, (int) rqstp->rq_proc);
- svcerr_decode(transp);
- return;
- }
- result = (*local) (&argument, rqstp);
-
- nfs_program_2_transp = NULL;
-
- if (result != NULL && !svc_sendreply(transp,
- (XDRPROC_T_TYPE) xdr_result,
- result)) {
- svcerr_systemerr(transp);
- }
- if (!svc_freeargs(transp,
- (XDRPROC_T_TYPE) xdr_argument,
- (SVC_IN_ARG_TYPE) & argument)) {
- plog(XLOG_FATAL, "unable to free rpc arguments in nfs_program_2");
- going_down(1);
- }
-}
diff --git a/contrib/amd/hlfsd/stubs.c b/contrib/amd/hlfsd/stubs.c
deleted file mode 100644
index becf402c1ecb..000000000000
--- a/contrib/amd/hlfsd/stubs.c
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/hlfsd/stubs.c
- *
- * HLFSD was written at Columbia University Computer Science Department, by
- * Erez Zadok <ezk@cs.columbia.edu> and Alexander Dupuy <dupuy@cs.columbia.edu>
- * It is being distributed under the same terms and conditions as amd does.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <hlfsd.h>
-
-/*
- * STATIC VARIABLES:
- */
-static nfsfattr rootfattr = {NFDIR, 0040555, 2, 0, 0, 512, 512, 0,
- 1, 0, ROOTID};
-static nfsfattr slinkfattr = {NFLNK, 0120777, 1, 0, 0, NFS_MAXPATHLEN, 512, 0,
- (NFS_MAXPATHLEN + 1) / 512, 0, SLINKID};
- /* user name file attributes */
-static nfsfattr un_fattr = {NFLNK, 0120777, 1, 0, 0, NFS_MAXPATHLEN, 512, 0,
- (NFS_MAXPATHLEN + 1) / 512, 0, INVALIDID};
-static int started;
-static am_nfs_fh slink;
-static am_nfs_fh un_fhandle;
-
-/*
- * GLOBALS:
- */
-am_nfs_fh root;
-am_nfs_fh *root_fhp = &root;
-
-
-/* initialize NFS file handles for hlfsd */
-void
-hlfsd_init_filehandles(void)
-{
- u_int ui;
-
- ui = ROOTID;
- memcpy(root.fh_data, &ui, sizeof(ui));
-
- ui = SLINKID;
- memcpy(slink.fh_data, &ui, sizeof(ui));
-
- ui = INVALIDID;
- memcpy(un_fhandle.fh_data, &ui, sizeof(ui));
-}
-
-
-voidp
-nfsproc_null_2_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-/* compare if two filehandles are equal */
-static int
-eq_fh(const am_nfs_fh *fh1, const am_nfs_fh *fh2)
-{
- return (!memcmp((char *) fh1, (char *) fh2, sizeof(am_nfs_fh)));
-}
-
-
-nfsattrstat *
-nfsproc_getattr_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
-{
- static nfsattrstat res;
- uid_t uid = (uid_t) INVALIDID;
- gid_t gid = (gid_t) INVALIDID;
-
- if (!started) {
- started++;
- rootfattr.na_ctime = startup;
- rootfattr.na_mtime = startup;
- slinkfattr.na_ctime = startup;
- slinkfattr.na_mtime = startup;
- un_fattr.na_ctime = startup;
- un_fattr.na_mtime = startup;
- }
-
- if (getcreds(rqstp, &uid, &gid, nfsxprt) < 0) {
- res.ns_status = NFSERR_STALE;
- return &res;
- }
- if (eq_fh(argp, &root)) {
-#if 0
- /*
- * XXX: increment mtime of parent directory, causes NFS clients to
- * invalidate their cache for that directory.
- * Some NFS clients may need this code.
- */
- if (uid != rootfattr.na_uid) {
- clocktime(&rootfattr.na_mtime);
- rootfattr.na_uid = uid;
- }
-#endif
- res.ns_status = NFS_OK;
- res.ns_u.ns_attr_u = rootfattr;
- } else if (eq_fh(argp, &slink)) {
-
-#ifndef MNT2_NFS_OPT_SYMTTL
- /*
- * This code is needed to defeat Solaris 2.4's (and newer) symlink
- * values cache. It forces the last-modified time of the symlink to be
- * current. It is not needed if the O/S has an nfs flag to turn off the
- * symlink-cache at mount time (such as Irix 5.x and 6.x). -Erez.
- *
- * Additionally, Linux currently ignores the nt_useconds field,
- * so we must update the nt_seconds field every time.
- */
- if (uid != slinkfattr.na_uid) {
- clocktime(&slinkfattr.na_mtime);
- slinkfattr.na_uid = uid;
- }
-#endif /* not MNT2_NFS_OPT_SYMTTL */
-
- res.ns_status = NFS_OK;
- res.ns_u.ns_attr_u = slinkfattr;
- } else {
- if (gid != hlfs_gid) {
- res.ns_status = NFSERR_STALE;
- } else {
- memset((char *) &uid, 0, sizeof(int));
- uid = *(u_int *) argp->fh_data;
- if (plt_search(uid) != (uid2home_t *) NULL) {
- res.ns_status = NFS_OK;
- un_fattr.na_fileid = uid;
- res.ns_u.ns_attr_u = un_fattr;
- dlog("nfs_getattr: successful search for uid=%ld, gid=%ld",
- (long) uid, (long) gid);
- } else { /* not found */
- res.ns_status = NFSERR_STALE;
- }
- }
- }
- return &res;
-}
-
-
-nfsattrstat *
-nfsproc_setattr_2_svc(nfssattrargs *argp, struct svc_req *rqstp)
-{
- static nfsattrstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-voidp
-nfsproc_root_2_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-nfsdiropres *
-nfsproc_lookup_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
-{
- static nfsdiropres res;
- int idx;
- uid_t uid = (uid_t) INVALIDID;
- gid_t gid = (gid_t) INVALIDID;
-
- if (!started) {
- started++;
- rootfattr.na_ctime = startup;
- rootfattr.na_mtime = startup;
- slinkfattr.na_ctime = startup;
- slinkfattr.na_mtime = startup;
- un_fattr.na_ctime = startup;
- un_fattr.na_mtime = startup;
- }
-
- if (eq_fh(&argp->da_fhandle, &slink)) {
- res.dr_status = NFSERR_NOTDIR;
- return &res;
- }
-
- if (getcreds(rqstp, &uid, &gid, nfsxprt) < 0) {
- res.dr_status = NFSERR_NOENT;
- return &res;
- }
- if (eq_fh(&argp->da_fhandle, &root)) {
- if (argp->da_name[0] == '.' &&
- (argp->da_name[1] == '\0' ||
- (argp->da_name[1] == '.' &&
- argp->da_name[2] == '\0'))) {
-#if 0
- /*
- * XXX: increment mtime of parent directory, causes NFS clients to
- * invalidate their cache for that directory.
- * Some NFS clients may need this code.
- */
- if (uid != rootfattr.na_uid) {
- clocktime(&rootfattr.na_mtime);
- rootfattr.na_uid = uid;
- }
-#endif
- res.dr_u.dr_drok_u.drok_fhandle = root;
- res.dr_u.dr_drok_u.drok_attributes = rootfattr;
- res.dr_status = NFS_OK;
- return &res;
- }
-
- if (STREQ(argp->da_name, slinkname)) {
-#ifndef MNT2_NFS_OPT_SYMTTL
- /*
- * This code is needed to defeat Solaris 2.4's (and newer) symlink
- * values cache. It forces the last-modified time of the symlink to be
- * current. It is not needed if the O/S has an nfs flag to turn off the
- * symlink-cache at mount time (such as Irix 5.x and 6.x). -Erez.
- *
- * Additionally, Linux currently ignores the nt_useconds field,
- * so we must update the nt_seconds field every time.
- */
- if (uid != slinkfattr.na_uid) {
- clocktime(&slinkfattr.na_mtime);
- slinkfattr.na_uid = uid;
- }
-#endif /* not MNT2_NFS_OPT_SYMTTL */
- res.dr_u.dr_drok_u.drok_fhandle = slink;
- res.dr_u.dr_drok_u.drok_attributes = slinkfattr;
- res.dr_status = NFS_OK;
- return &res;
- }
-
- if (gid != hlfs_gid) {
- res.dr_status = NFSERR_NOENT;
- return &res;
- }
-
- /* if gets here, gid == hlfs_gid */
- if ((idx = untab_index(argp->da_name)) < 0) {
- res.dr_status = NFSERR_NOENT;
- return &res;
- } else { /* entry found and gid is permitted */
- un_fattr.na_fileid = untab[idx].uid;
- res.dr_u.dr_drok_u.drok_attributes = un_fattr;
- memset((char *) &un_fhandle, 0, sizeof(am_nfs_fh));
- *(u_int *) un_fhandle.fh_data = (u_int) untab[idx].uid;
- xstrlcpy((char *) &un_fhandle.fh_data[sizeof(int)],
- untab[idx].username,
- sizeof(am_nfs_fh) - sizeof(int));
- res.dr_u.dr_drok_u.drok_fhandle = un_fhandle;
- res.dr_status = NFS_OK;
- dlog("nfs_lookup: successful lookup for uid=%ld, gid=%ld: username=%s",
- (long) uid, (long) gid, untab[idx].username);
- return &res;
- }
- } /* end of "if (eq_fh(argp->dir.data, root.data)) {" */
-
- res.dr_status = NFSERR_STALE;
- return &res;
-}
-
-
-nfsreadlinkres *
-nfsproc_readlink_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
-{
- static nfsreadlinkres res;
- uid_t userid = (uid_t) INVALIDID;
- gid_t groupid = hlfs_gid + 1; /* anything not hlfs_gid */
- int retval = 0;
- char *path_val = (char *) NULL;
- char *username;
- static uid_t last_uid = (uid_t) INVALIDID;
-
- if (eq_fh(argp, &root)) {
- res.rlr_status = NFSERR_ISDIR;
- } else if (eq_fh(argp, &slink)) {
- if (getcreds(rqstp, &userid, &groupid, nfsxprt) < 0)
- return (nfsreadlinkres *) NULL;
-
- clocktime(&slinkfattr.na_atime);
-
- res.rlr_status = NFS_OK;
- if (groupid == hlfs_gid) {
- res.rlr_u.rlr_data_u = DOTSTRING;
- } else if (!(res.rlr_u.rlr_data_u = path_val = homedir(userid, groupid))) {
- /*
- * parent process (fork in homedir()) continues
- * processing, by getting a NULL returned as a
- * "special". Child returns result.
- */
- return (nfsreadlinkres *) NULL;
- }
-
- } else { /* check if asked for user mailbox */
-
- if (getcreds(rqstp, &userid, &groupid, nfsxprt) < 0) {
- return (nfsreadlinkres *) NULL;
- }
-
- if (groupid == hlfs_gid) {
- memset((char *) &userid, 0, sizeof(int));
- userid = *(u_int *) argp->fh_data;
- username = (char *) &argp->fh_data[sizeof(int)];
- if (!(res.rlr_u.rlr_data_u = mailbox(userid, username)))
- return (nfsreadlinkres *) NULL;
- } else {
- res.rlr_status = NFSERR_STALE;
- }
- }
-
- /* print info, but try to avoid repetitions */
- if (userid != last_uid) {
- plog(XLOG_USER, "mailbox for uid=%ld, gid=%ld is %s",
- (long) userid, (long) groupid, (char *) res.rlr_u.rlr_data_u);
- last_uid = userid;
- }
-
- /* I don't think it will pass this if -D fork */
- if (serverpid == getpid())
- return &res;
-
- if (!svc_sendreply(nfsxprt, (XDRPROC_T_TYPE) xdr_readlinkres, (SVC_IN_ARG_TYPE) &res))
- svcerr_systemerr(nfsxprt);
-
- /*
- * Child exists here. We need to determine which
- * exist status to return. The exit status
- * is gathered using wait() and determines
- * if we returned $HOME/.hlfsspool or $ALTDIR. The parent
- * needs this info so it can update the lookup table.
- */
- if (path_val && alt_spooldir && STREQ(path_val, alt_spooldir))
- retval = 1; /* could not get real home dir (or uid 0 user) */
- else
- retval = 0;
-
- /*
- * If asked for -D fork, then must return the value,
- * NOT exit, or else the main hlfsd server exits.
- * Bug: where is that status information being collected?
- */
- if (amuDebug(D_FORK))
- return &res;
-
- exit(retval);
-}
-
-
-nfsreadres *
-nfsproc_read_2_svc(nfsreadargs *argp, struct svc_req *rqstp)
-{
- static nfsreadres res = {NFSERR_ACCES};
-
- return &res;
-}
-
-
-voidp
-nfsproc_writecache_2_svc(voidp argp, struct svc_req *rqstp)
-{
- static char res;
-
- return (voidp) &res;
-}
-
-
-nfsattrstat *
-nfsproc_write_2_svc(nfswriteargs *argp, struct svc_req *rqstp)
-{
- static nfsattrstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsdiropres *
-nfsproc_create_2_svc(nfscreateargs *argp, struct svc_req *rqstp)
-{
- static nfsdiropres res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_remove_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_rename_2_svc(nfsrenameargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_link_2_svc(nfslinkargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_symlink_2_svc(nfssymlinkargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsdiropres *
-nfsproc_mkdir_2_svc(nfscreateargs *argp, struct svc_req *rqstp)
-{
- static nfsdiropres res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsstat *
-nfsproc_rmdir_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
-{
- static nfsstat res = {NFSERR_ROFS};
-
- return &res;
-}
-
-
-nfsreaddirres *
-nfsproc_readdir_2_svc(nfsreaddirargs *argp, struct svc_req *rqstp)
-{
- static nfsreaddirres res;
- static nfsentry slinkent = {SLINKID, 0, {SLINKCOOKIE}};
- static nfsentry dotdotent = {ROOTID, "..", {DOTDOTCOOKIE}, &slinkent};
- static nfsentry dotent = {ROOTID, ".", {DOTCOOKIE}, &dotdotent};
-
- slinkent.ne_name = slinkname;
-
- if (eq_fh(&argp->rda_fhandle, &slink)) {
- res.rdr_status = NFSERR_NOTDIR;
- } else if (eq_fh(&argp->rda_fhandle, &root)) {
- clocktime(&rootfattr.na_atime);
-
- res.rdr_status = NFS_OK;
- switch (argp->rda_cookie[0]) {
- case 0:
- res.rdr_u.rdr_reply_u.dl_entries = &dotent;
- break;
- case DOTCOOKIE:
- res.rdr_u.rdr_reply_u.dl_entries = &dotdotent;
- break;
- case DOTDOTCOOKIE:
- res.rdr_u.rdr_reply_u.dl_entries = &slinkent;
- break;
- case SLINKCOOKIE:
- res.rdr_u.rdr_reply_u.dl_entries = (nfsentry *) 0;
- break;
- }
- res.rdr_u.rdr_reply_u.dl_eof = TRUE;
- } else {
- res.rdr_status = NFSERR_STALE;
- }
- return &res;
-}
-
-
-nfsstatfsres *
-nfsproc_statfs_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
-{
- static nfsstatfsres res = {NFS_OK};
-
- res.sfr_u.sfr_reply_u.sfrok_tsize = 1024;
- res.sfr_u.sfr_reply_u.sfrok_bsize = 1024;
-
- /*
- * Some "df" programs automatically assume that file systems
- * with zero blocks are meta-filesystems served by automounters.
- */
- res.sfr_u.sfr_reply_u.sfrok_blocks = 0;
- res.sfr_u.sfr_reply_u.sfrok_bfree = 0;
- res.sfr_u.sfr_reply_u.sfrok_bavail = 0;
-
- return &res;
-}
diff --git a/contrib/amd/include/am_compat.h b/contrib/amd/include/am_compat.h
deleted file mode 100644
index dc3b71d74468..000000000000
--- a/contrib/amd/include/am_compat.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/am_compat.h
- *
- */
-
-/*
- *
- * This file contains compatibility functions and macros, all of which
- * should be auto-discovered, but for one reason or another (mostly
- * brain-damage on the part of system designers and header files) they cannot.
- *
- * Each compatibility macro/function must include instructions on how/when
- * it can be removed the am-utils code.
- *
- */
-
-#ifndef _AM_COMPAT_H
-# define _AM_COMPAT_H
-
-/*
- * incomplete mount options definitions (sunos4, irix6, linux, etc.)
- */
-
-
-/*
- * Complete MNTTAB_OPT_* options based on MNT2_NFS_OPT_* mount options.
- */
-#if defined(MNT2_NFS_OPT_ACDIRMAX) && !defined(MNTTAB_OPT_ACDIRMAX)
-# define MNTTAB_OPT_ACDIRMAX "acdirmax"
-#endif /* defined(MNT2_NFS_OPT_ACDIRMAX) && !defined(MNTTAB_OPT_ACDIRMAX) */
-
-#if defined(MNT2_NFS_OPT_ACDIRMIN) && !defined(MNTTAB_OPT_ACDIRMIN)
-# define MNTTAB_OPT_ACDIRMIN "acdirmin"
-#endif /* defined(MNT2_NFS_OPT_ACDIRMIN) && !defined(MNTTAB_OPT_ACDIRMIN) */
-
-#if defined(MNT2_NFS_OPT_ACREGMAX) && !defined(MNTTAB_OPT_ACREGMAX)
-# define MNTTAB_OPT_ACREGMAX "acregmax"
-#endif /* defined(MNT2_NFS_OPT_ACREGMAX) && !defined(MNTTAB_OPT_ACREGMAX) */
-
-#if defined(MNT2_NFS_OPT_ACREGMIN) && !defined(MNTTAB_OPT_ACREGMIN)
-# define MNTTAB_OPT_ACREGMIN "acregmin"
-#endif /* defined(MNT2_NFS_OPT_ACREGMIN) && !defined(MNTTAB_OPT_ACREGMIN) */
-
-#if !defined(MNTTAB_OPT_IGNORE)
-/* SunOS 4.1.x and others define "noauto" option, but not "auto" */
-# if defined(MNTTAB_OPT_NOAUTO) && !defined(MNTTAB_OPT_AUTO)
-# define MNTTAB_OPT_AUTO "auto"
-# endif /* defined(MNTTAB_OPT_NOAUTO) && !defined(MNTTAB_OPT_AUTO) */
-#endif /* !defined(MNTTAB_OPT_IGNORE) */
-
-#if defined(MNT2_NFS_OPT_NOAC) && !defined(MNTTAB_OPT_NOAC)
-# define MNTTAB_OPT_NOAC "noac"
-#endif /* defined(MNT2_NFS_OPT_NOAC) && !defined(MNTTAB_OPT_NOAC) */
-
-#if defined(MNT2_NFS_OPT_NOCONN) && !defined(MNTTAB_OPT_NOCONN)
-# define MNTTAB_OPT_NOCONN "noconn"
-# ifndef MNTTAB_OPT_CONN
-# define MNTTAB_OPT_CONN "conn"
-# endif /* MNTTAB_OPT_CONN */
-#endif /* defined(MNT2_NFS_OPT_NOCONN) && !defined(MNTTAB_OPT_NOCONN) */
-
-#if defined(MNT2_NFS_OPT_PGTHRESH) && !defined(MNTTAB_OPT_PGTHRESH)
-# define MNTTAB_OPT_PGTHRESH "pgthresh"
-#endif /* defined(MNT2_NFS_OPT_PGTHRESH) && !defined(MNTTAB_OPT_PGTHRESH) */
-
-#if defined(MNT2_NFS_OPT_PRIVATE) && !defined(MNTTAB_OPT_PRIVATE)
-# define MNTTAB_OPT_PRIVATE "private"
-#endif /* defined(MNT2_NFS_OPT_PRIVATE) && !defined(MNTTAB_OPT_PRIVATE) */
-
-#if defined(MNT2_NFS_OPT_RETRANS) && !defined(MNTTAB_OPT_RETRANS)
-# define MNTTAB_OPT_RETRANS "retrans"
-#endif /* defined(MNT2_NFS_OPT_RETRANS) && !defined(MNTTAB_OPT_RETRANS) */
-
-#if defined(MNT2_NFS_OPT_RSIZE) && !defined(MNTTAB_OPT_RSIZE)
-# define MNTTAB_OPT_RSIZE "rsize"
-#endif /* defined(MNT2_NFS_OPT_RSIZE) && !defined(MNTTAB_OPT_RSIZE) */
-
-#if defined(MNT2_NFS_OPT_SOFT) && !defined(MNTTAB_OPT_SOFT)
-# define MNTTAB_OPT_SOFT "soft"
-# ifndef MNTTAB_OPT_HARD
-# define MNTTAB_OPT_HARD "hard"
-# endif /* not MNTTAB_OPT_HARD */
-#endif /* defined(MNT2_NFS_OPT_SOFT) && !defined(MNTTAB_OPT_SOFT) */
-
-#if defined(MNT2_NFS_OPT_TIMEO) && !defined(MNTTAB_OPT_TIMEO)
-# define MNTTAB_OPT_TIMEO "timeo"
-#endif /* defined(MNT2_NFS_OPT_TIMEO) && !defined(MNTTAB_OPT_TIMEO) */
-
-#if defined(MNT2_NFS_OPT_WSIZE) && !defined(MNTTAB_OPT_WSIZE)
-# define MNTTAB_OPT_WSIZE "wsize"
-#endif /* defined(MNT2_NFS_OPT_WSIZE) && !defined(MNTTAB_OPT_WSIZE) */
-
-#if defined(MNT2_NFS_OPT_MAXGRPS) && !defined(MNTTAB_OPT_MAXGROUPS)
-# define MNTTAB_OPT_MAXGROUPS "maxgroups"
-#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && !defined(MNTTAB_OPT_MAXGROUPS) */
-
-#if defined(MNT2_NFS_OPT_PROPLIST) && !defined(MNTTAB_OPT_PROPLIST)
-# define MNTTAB_OPT_PROPLIST "proplist"
-#endif /* defined(MNT2_NFS_OPT_PROPLIST) && !defined(MNTTAB_OPT_PROPLIST) */
-
-#if defined(MNT2_NFS_OPT_NONLM) && !defined(MNTTAB_OPT_NOLOCK)
-# define MNTTAB_OPT_NOLOCK "nolock"
-#endif /* defined(MNT2_NFS_OPT_NONLM) && !defined(MNTTAB_OPT_NOLOCK) */
-
-#if defined(MNT2_NFS_OPT_XLATECOOKIE) && !defined(MNTTAB_OPT_XLATECOOKIE)
-# define MNTTAB_OPT_XLATECOOKIE "xlatecookie"
-#endif /* defined(MNT2_NFS_OPT_XLATECOOKIE) && !defined(MNTTAB_OPT_XLATECOOKIE) */
-
-/*
- * Complete MNTTAB_OPT_* options based on MNT2_CDFS_OPT_* mount options.
- */
-#if defined(MNT2_CDFS_OPT_DEFPERM) && !defined(MNTTAB_OPT_DEFPERM)
-# define MNTTAB_OPT_DEFPERM "defperm"
-#endif /* defined(MNT2_CDFS_OPT_DEFPERM) && !defined(MNTTAB_OPT_DEFPERM) */
-
-#if defined(MNT2_CDFS_OPT_NODEFPERM) && !defined(MNTTAB_OPT_NODEFPERM)
-# define MNTTAB_OPT_NODEFPERM "nodefperm"
-/*
- * DEC OSF/1 V3.x/Digital UNIX V4.0 have M_NODEFPERM only, but
- * both mnttab ops.
- */
-# ifndef MNTTAB_OPT_DEFPERM
-# define MNTTAB_OPT_DEFPERM "defperm"
-# endif /* not MNTTAB_OPT_DEFPERM */
-#endif /* defined(MNT2_CDFS_OPT_NODEFPERM) && !defined(MNTTAB_OPT_NODEFPERM) */
-
-#if defined(MNT2_CDFS_OPT_NOVERSION) && !defined(MNTTAB_OPT_NOVERSION)
-# define MNTTAB_OPT_NOVERSION "noversion"
-#endif /* defined(MNT2_CDFS_OPT_NOVERSION) && !defined(MNTTAB_OPT_NOVERSION) */
-
-#if defined(MNT2_CDFS_OPT_RRIP) && !defined(MNTTAB_OPT_RRIP)
-# define MNTTAB_OPT_RRIP "rrip"
-#endif /* defined(MNT2_CDFS_OPT_RRIP) && !defined(MNTTAB_OPT_RRIP) */
-#if defined(MNT2_CDFS_OPT_NORRIP) && !defined(MNTTAB_OPT_NORRIP)
-# define MNTTAB_OPT_NORRIP "norrip"
-#endif /* defined(MNT2_CDFS_OPT_NORRIP) && !defined(MNTTAB_OPT_NORRIP) */
-
-#if defined(MNT2_CDFS_OPT_GENS) && !defined(MNTTAB_OPT_GENS)
-# define MNTTAB_OPT_GENS "gens"
-#endif /* defined(MNT2_CDFS_OPT_GENS) && !defined(MNTTAB_OPT_GENS) */
-#if defined(MNT2_CDFS_OPT_EXTATT) && !defined(MNTTAB_OPT_EXTATT)
-# define MNTTAB_OPT_EXTATT "extatt"
-#endif /* defined(MNT2_CDFS_OPT_EXTATT) && !defined(MNTTAB_OPT_EXTATT) */
-
-/*
- * Complete MNTTAB_OPT_* options based on MNT2_PCFS_OPT_* mount options.
- */
-#if defined(MNT2_PCFS_OPT_LONGNAME) && !defined(MNTTAB_OPT_LONGNAME)
-# define MNTTAB_OPT_LONGNAME "longnames"
-#endif /* defined(MNT2_PCFS_OPT_LONGNAME) && !defined(MNTTAB_OPT_LONGNAME) */
-#if defined(MNT2_PCFS_OPT_NOWIN95) && !defined(MNTTAB_OPT_NOWIN95)
-# define MNTTAB_OPT_NOWIN95 "nowin95"
-#endif /* defined(MNT2_PCFS_OPT_NOWIN95) && !defined(MNTTAB_OPT_NOWIN95) */
-#if defined(MNT2_PCFS_OPT_SHORTNAME) && !defined(MNTTAB_OPT_SHORTNAME)
-# define MNTTAB_OPT_SHORTNAME "shortnames"
-#endif /* defined(MNT2_PCFS_OPT_SHORTNAME) && !defined(MNTTAB_OPT_SHORTNAME) */
-
-/*
- * Complete MNTTAB_OPT_* options based on MNT2_GEN_OPT_* mount options.
- */
-#if defined(MNT2_GEN_OPT_GRPID) && !defined(MNTTAB_OPT_GRPID)
-# define MNTTAB_OPT_GRPID "grpid"
-#endif /* defined(MNT2_GEN_OPT_GRPID) && !defined(MNTTAB_OPT_GRPID) */
-
-#if defined(MNT2_GEN_OPT_NOCACHE) && !defined(MNTTAB_OPT_NOCACHE)
-# define MNTTAB_OPT_NOCACHE "nocache"
-#endif /* defined(MNT2_GEN_OPT_NOCACHE) && !defined(MNTTAB_OPT_NOCACHE) */
-
-#if defined(MNT2_GEN_OPT_NOSUID) && !defined(MNTTAB_OPT_NOSUID)
-# define MNTTAB_OPT_NOSUID "nosuid"
-#endif /* defined(MNT2_GEN_OPT_NOSUID) && !defined(MNTTAB_OPT_NOSUID) */
-
-#if defined(MNT2_GEN_OPT_OVERLAY) && !defined(MNTTAB_OPT_OVERLAY)
-# define MNTTAB_OPT_OVERLAY "overlay"
-#endif /* defined(MNT2_GEN_OPT_OVERLAY) && !defined(MNTTAB_OPT_OVERLAY) */
-
-/*
- * Complete MNTTAB_OPT_* options and their inverse based on MNT2_GEN_OPT_*
- * options.
- */
-#if defined(MNT2_GEN_OPT_NODEV) && !defined(MNTTAB_OPT_NODEV)
-# define MNTTAB_OPT_NODEV "nodev"
-#endif /* defined(MNT2_GEN_OPT_NODEV) && !defined(MNTTAB_OPT_NODEV) */
-
-#if defined(MNT2_GEN_OPT_NOEXEC) && !defined(MNTTAB_OPT_NOEXEC)
-# define MNTTAB_OPT_NOEXEC "noexec"
-/* this is missing under some versions of Linux */
-# ifndef MNTTAB_OPT_EXEC
-# define MNTTAB_OPT_EXEC "exec"
-# endif /* not MNTTAB_OPT_EXEC */
-#endif /* defined(MNT2_GEN_OPT_NOEXEC) && !defined(MNTTAB_OPT_NOEXEC) */
-
-#if defined(MNT2_GEN_OPT_QUOTA) && !defined(MNTTAB_OPT_QUOTA)
-# define MNTTAB_OPT_QUOTA "quota"
-#endif /* defined(MNT2_GEN_OPT_QUOTA) && !defined(MNTTAB_OPT_QUOTA) */
-
-#if defined(MNT2_GEN_OPT_SYNC) && !defined(MNTTAB_OPT_SYNC)
-# define MNTTAB_OPT_SYNC "sync"
-#endif /* defined(MNT2_GEN_OPT_SYNC) && !defined(MNTTAB_OPT_SYNC) */
-
-
-/*
- * Add missing MNTTAB_OPT_* options.
- */
-#ifndef MNTTAB_OPT_ACTIMEO
-# define MNTTAB_OPT_ACTIMEO "actimeo"
-#endif /* not MNTTAB_OPT_ACTIMEO */
-
-#ifndef MNTTAB_OPT_INTR
-# define MNTTAB_OPT_INTR "intr"
-#endif /* not MNTTAB_OPT_INTR */
-
-#ifndef MNTTAB_OPT_PORT
-# define MNTTAB_OPT_PORT "port"
-#endif /* not MNTTAB_OPT_PORT */
-
-#ifndef MNTTAB_OPT_PUBLIC
-# define MNTTAB_OPT_PUBLIC "public"
-#endif /* not MNTTAB_OPT_PUBLIC */
-
-#ifndef MNTTAB_OPT_RETRANS
-# define MNTTAB_OPT_RETRANS "retrans"
-#endif /* not MNTTAB_OPT_RETRANS */
-
-#ifndef MNTTAB_OPT_RETRY
-# define MNTTAB_OPT_RETRY "retry"
-#endif /* not MNTTAB_OPT_RETRY */
-
-#ifndef MNTTAB_OPT_RO
-# define MNTTAB_OPT_RO "ro"
-#endif /* not MNTTAB_OPT_RO */
-
-#ifndef MNTTAB_OPT_RSIZE
-# define MNTTAB_OPT_RSIZE "rsize"
-#endif /* not MNTTAB_OPT_RSIZE */
-
-#ifndef MNTTAB_OPT_RW
-# define MNTTAB_OPT_RW "rw"
-#endif /* not MNTTAB_OPT_RW */
-
-#ifndef MNTTAB_OPT_TIMEO
-# define MNTTAB_OPT_TIMEO "timeo"
-#endif /* not MNTTAB_OPT_TIMEO */
-
-#ifndef MNTTAB_OPT_WSIZE
-# define MNTTAB_OPT_WSIZE "wsize"
-#endif /* not MNTTAB_OPT_WSIZE */
-
-/* next four are useful for pcfs mounts */
-#ifndef MNTTAB_OPT_USER
-# define MNTTAB_OPT_USER "user"
-#endif /* not MNTTAB_OPT_USER */
-#ifndef MNTTAB_OPT_GROUP
-# define MNTTAB_OPT_GROUP "group"
-#endif /* not MNTTAB_OPT_GROUP */
-#ifndef MNTTAB_OPT_MASK
-# define MNTTAB_OPT_MASK "mask"
-#endif /* not MNTTAB_OPT_MASK */
-#ifndef MNTTAB_OPT_DIRMASK
-# define MNTTAB_OPT_DIRMASK "dirmask"
-#endif /* not MNTTAB_OPT_DIRMASK */
-
-/*
- * Incomplete filesystem definitions (sunos4, irix6, solaris2)
- */
-#if defined(HAVE_FS_CDFS) && defined(MOUNT_TYPE_CDFS) && !defined(MNTTYPE_CDFS)
-# define MNTTYPE_CDFS "hsfs"
-#endif /* defined(HAVE_FS_CDFS) && defined(MOUNT_TYPE_CDFS) && !defined(MNTTYPE_CDFS) */
-
-#ifndef cdfs_args_t
-/*
- * Solaris has an HSFS filesystem, but does not define hsfs_args.
- * XXX: the definition here for solaris is wrong, since under solaris,
- * hsfs_args should be a single integer used as a bit-field for options.
- * so this code has to be fixed later. -Erez.
- */
-struct hsfs_args {
- char *fspec; /* name of filesystem to mount */
- int norrip;
-};
-# define cdfs_args_t struct hsfs_args
-# define HAVE_CDFS_ARGS_T_NORRIP
-#endif /* not cdfs_args_t */
-
-/*
- * if does not define struct pc_args, assume integer bit-field (irix6)
- */
-#if defined(HAVE_FS_PCFS) && !defined(pcfs_args_t)
-# define pcfs_args_t u_int
-#endif /* defined(HAVE_FS_PCFS) && !defined(pcfs_args_t) */
-
-/*
- * if does not define struct ufs_args, assume integer bit-field (linux)
- */
-#if defined(HAVE_FS_UFS) && !defined(ufs_args_t)
-# define ufs_args_t u_int
-#endif /* defined(HAVE_FS_UFS) && !defined(ufs_args_t) */
-
-/*
- * if does not define struct efs_args, assume integer bit-field (linux)
- */
-#if defined(HAVE_FS_EFS) && !defined(efs_args_t)
-# define efs_args_t u_int
-#endif /* defined(HAVE_FS_EFS) && !defined(efs_args_t) */
-
-/*
- * if does not define struct xfs_args, assume integer bit-field (linux)
- */
-#if defined(HAVE_FS_XFS) && !defined(xfs_args_t)
-# define xfs_args_t u_int
-#endif /* defined(HAVE_FS_XFS) && !defined(xfs_args_t) */
-
-#if defined(HAVE_FS_AUTOFS) && defined(MOUNT_TYPE_AUTOFS) && !defined(MNTTYPE_AUTOFS)
-# define MNTTYPE_AUTOFS "autofs"
-#endif /* defined(HAVE_FS_AUTOFS) && defined(MOUNT_TYPE_AUTOFS) && !defined(MNTTYPE_AUTOFS) */
-
-/*
- * If NFS3, then make sure that "proto" and "vers" mnttab options
- * are available.
- */
-#ifdef HAVE_FS_NFS3
-# ifndef MNTTAB_OPT_VERS
-# define MNTTAB_OPT_VERS "vers"
-# endif /* not MNTTAB_OPT_VERS */
-# ifndef MNTTAB_OPT_PROTO
-# define MNTTAB_OPT_PROTO "proto"
-# endif /* not MNTTAB_OPT_PROTO */
-#endif /* not HAVE_FS_NFS3 */
-
-/*
- * If loop device (header file) exists, define mount table option
- */
-#if defined(HAVE_LOOP_DEVICE) && !defined(MNTTAB_OPT_LOOP)
-# define MNTTAB_OPT_LOOP "loop"
-#endif /* defined(HAVE_LOOP_DEVICE) && !defined(MNTTAB_OPT_LOOP) */
-
-/*
- * Define a dummy struct netconfig for non-TLI systems
- */
-#if !defined(HAVE_NETCONFIG_H) && !defined(HAVE_SYS_NETCONFIG_H)
-struct netconfig {
- int dummy;
-};
-#endif /* not HAVE_NETCONFIG_H and not HAVE_SYS_NETCONFIG_H */
-
-/* some OSs don't define INADDR_NONE and assume it's unsigned -1 */
-#ifndef INADDR_NONE
-# define INADDR_NONE 0xffffffffU
-#endif /* INADDR_NONE */
-/* some OSs don't define INADDR_LOOPBACK */
-#ifndef INADDR_LOOPBACK
-# define INADDR_LOOPBACK 0x7f000001
-#endif /* not INADDR_LOOPBACK */
-
-#endif /* not _AM_COMPAT_H */
diff --git a/contrib/amd/include/am_defs.h b/contrib/amd/include/am_defs.h
deleted file mode 100644
index c2185dbfd3e6..000000000000
--- a/contrib/amd/include/am_defs.h
+++ /dev/null
@@ -1,1595 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/am_defs.h
- *
- */
-
-/*
- * Definitions that are not specific to the am-utils package, but
- * are rather generic, and can be used elsewhere.
- */
-
-#ifndef _AM_DEFS_H
-#define _AM_DEFS_H
-
-/*
- * Actions to take if ANSI C.
- */
-#if STDC_HEADERS
-# include <string.h>
-/* for function prototypes */
-# define P(x) x
-# define P_void void
-#else /* not STDC_HEADERS */
-/* empty function prototypes */
-# define P(x) ()
-# define P_void
-# ifndef HAVE_STRCHR
-# define strchr index
-# define strrchr rindex
-# endif /* not HAVE_STRCHR */
-char *strchr(), *strrchr(), *strdup();
-#endif /* not STDC_HEADERS */
-
-/*
- * Handle gcc __attribute__ if available.
- */
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later. */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
-# define __attribute__(Spec) /* empty */
-# endif /* __GNUC__ < 2 ... */
-/*
- * The __-protected variants of `format' and `printf' attributes
- * are accepted by gcc versions 2.6.4 (effectively 2.7) and later.
- */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-# define __format__ format
-# define __printf__ printf
-# endif /* __GNUC__ < 2 ... */
-#endif /* not __attribute__ */
-
-/*
- * How to handle signals of any type
- */
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif /* HAVE_SYS_WAIT_H */
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
-#endif /* not WEXITSTATUS */
-#ifndef WIFEXITED
-# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
-#endif /* not WIFEXITED */
-
-/*
- * Actions to take regarding <time.h> and <sys/time.h>.
- */
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# ifdef _ALL_SOURCE
-/*
- * AIX 5.2 needs struct sigevent from signal.h to be defined, but I
- * don't want to move the inclusion of signal.h this early into this
- * file. Luckily, amd doesn't need the size of this structure in any
- * other structure that it uses. So we sidestep it for now.
- */
-struct sigevent;
-# endif /* _ALL_SOURCE */
-# include <time.h>
-#else /* not TIME_WITH_SYS_TIME */
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else /* not HAVE_SYS_TIME_H */
-# include <time.h>
-# endif /* not HAVE_SYS_TIME_H */
-#endif /* not TIME_WITH_SYS_TIME */
-
-/*
- * Actions to take if <machine/endian.h> exists.
- */
-#ifdef HAVE_MACHINE_ENDIAN_H
-# include <machine/endian.h>
-#endif /* HAVE_MACHINE_ENDIAN_H */
-
-/*
- * Big-endian or little-endian?
- */
-#ifdef WORDS_BIGENDIAN
-# define ARCH_ENDIAN "big"
-#else /* not WORDS_BIGENDIAN */
-# define ARCH_ENDIAN "little"
-#endif /* not WORDS_BIGENDIAN */
-
-/*
- * Actions to take if HAVE_SYS_TYPES_H is defined.
- */
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif /* HAVE_SYS_TYPES_H */
-
-/*
- * Actions to take if HAVE_LIMITS_H is defined.
- */
-#if HAVE_LIMITS_H_H
-# include <limits.h>
-#endif /* HAVE_LIMITS_H */
-
-/*
- * Actions to take if HAVE_UNISTD_H is defined.
- */
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif /* HAVE_UNISTD_H */
-
-/* after <unistd.h>, check if this is a POSIX.1 system */
-#ifdef _POSIX_VERSION
-/* Code for POSIX.1 systems. */
-#endif /* _POSIX_VERSION */
-
-/*
- * Variable length argument lists.
- * Must use only one of the two!
- */
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-/*
- * On Solaris 2.6, <sys/varargs.h> is included in <sys/fs/autofs.h>
- * So this ensures that only one is included.
- */
-# ifndef _SYS_VARARGS_H
-# define _SYS_VARARGS_H
-# endif /* not _SYS_VARARGS_H */
-#else /* not HAVE_STDARG_H */
-# ifdef HAVE_VARARGS_H
-# include <varargs.h>
-# endif /* HAVE_VARARGS_H */
-#endif /* not HAVE_STDARG_H */
-
-/*
- * Pick the right header file and macros for directory processing functions.
- */
-#if HAVE_DIRENT_H
-# include <dirent.h>
-# define NAMLEN(dirent) strlen((dirent)->d_name)
-#else /* not HAVE_DIRENT_H */
-# define dirent direct
-# define NAMLEN(dirent) (dirent)->d_namlen
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif /* HAVE_SYS_NDIR_H */
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif /* HAVE_SYS_DIR_H */
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif /* HAVE_NDIR_H */
-#endif /* not HAVE_DIRENT_H */
-
-/*
- * Actions to take if HAVE_FCNTL_H is defined.
- */
-#if HAVE_FCNTL_H
-# ifdef HAVE_LINUX_LOOP_H
-/* so I can mount large files as loop devices */
-/* XXX: need to move these two LARGEFILE defines to a better place */
-# define _LARGEFILE64_SOURCE
-# define __USE_LARGEFILE64
-# endif /* HAVE_LINUX_LOOP_H */
-# include <fcntl.h>
-#endif /* HAVE_FCNTL_H */
-
-/*
- * Actions to take if HAVE_MEMORY_H is defined.
- */
-#if HAVE_MEMORY_H
-# include <memory.h>
-#endif /* HAVE_MEMORY_H */
-
-/*
- * Actions to take if HAVE_SYS_FILE_H is defined.
- */
-#if HAVE_SYS_FILE_H
-# include <sys/file.h>
-#endif /* HAVE_SYS_FILE_H */
-
-/*
- * Actions to take if HAVE_SYS_IOCTL_H is defined.
- */
-#if HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif /* HAVE_SYS_IOCTL_H */
-
-/*
- * Actions to take if HAVE_SYSLOG_H or HAVE_SYS_SYSLOG_H is defined.
- */
-#ifdef HAVE_SYSLOG_H
-# include <syslog.h>
-#else /* not HAVE_SYSLOG_H */
-# if HAVE_SYS_SYSLOG_H
-# include <sys/syslog.h>
-# endif /* HAVE_SYS_SYSLOG_H */
-#endif /* HAVE_SYSLOG_H */
-
-/*
- * Actions to take if <sys/param.h> exists.
- */
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif /* HAVE_SYS_PARAM_H */
-
-/*
- * Actions to take if <sys/socket.h> exists.
- */
-#ifdef HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif /* HAVE_SYS_SOCKET_H */
-
-/*
- * Actions to take if <rpc/rpc.h> exists.
- */
-#ifdef HAVE_RPC_RPC_H
-/*
- * Turn on PORTMAP, so that additional header files would get included
- * and the important definition for UDPMSGSIZE is included too.
- */
-# ifndef PORTMAP
-# define PORTMAP
-# endif /* not PORTMAP */
-# include <rpc/rpc.h>
-# ifndef XDRPROC_T_TYPE
-typedef bool_t (*xdrproc_t) __P ((XDR *, __ptr_t, ...));
-# endif /* not XDRPROC_T_TYPE */
-#endif /* HAVE_RPC_RPC_H */
-
-/*
- * Actions to take if <rpc/types.h> exists.
- */
-#ifdef HAVE_RPC_TYPES_H
-# include <rpc/types.h>
-#endif /* HAVE_RPC_TYPES_H */
-
-/*
- * Actions to take if <rpc/xdr.h> exists.
- */
-/* Prevent multiple inclusion on Ultrix 4 */
-#if defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__)
-# include <rpc/xdr.h>
-#endif /* defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__) */
-
-/*
- * Actions to take if <malloc.h> exists.
- * Don't include malloc.h if stdlib.h exists, because modern
- * systems complain if you use malloc.h instead of stdlib.h.
- * XXX: let's hope there are no systems out there that need both.
- */
-#if defined(HAVE_MALLOC_H) && !defined(HAVE_STDLIB_H)
-# include <malloc.h>
-#endif /* defined(HAVE_MALLOC_H) && !defined(HAVE_STDLIB_H) */
-
-/*
- * Actions to take if <mntent.h> exists.
- */
-#ifdef HAVE_MNTENT_H
-/* some systems need <stdio.h> before <mntent.h> is included */
-# ifdef HAVE_STDIO_H
-# include <stdio.h>
-# endif /* HAVE_STDIO_H */
-# include <mntent.h>
-#endif /* HAVE_MNTENT_H */
-
-/*
- * Actions to take if <sys/errno.h> exists.
- */
-#ifdef HAVE_SYS_ERRNO_H
-# include <sys/errno.h>
-extern int errno;
-#endif /* HAVE_SYS_ERRNO_H */
-
-/*
- * Actions to take if <sys/fsid.h> exists.
- */
-#ifdef HAVE_SYS_FSID_H
-# include <sys/fsid.h>
-#endif /* HAVE_SYS_FSID_H */
-
-/*
- * Actions to take if <sys/utsname.h> exists.
- */
-#ifdef HAVE_SYS_UTSNAME_H
-# include <sys/utsname.h>
-#endif /* HAVE_SYS_UTSNAME_H */
-
-/*
- * Actions to take if <sys/mntent.h> exists.
- */
-#ifdef HAVE_SYS_MNTENT_H
-# include <sys/mntent.h>
-#endif /* HAVE_SYS_MNTENT_H */
-
-/*
- * Actions to take if <ndbm.h> or <db1/ndbm.h> exist.
- * Should be included before <rpcsvc/yp_prot.h> because on some systems
- * like Linux, it also defines "struct datum".
- */
-#ifdef HAVE_MAP_NDBM
-# include NEW_DBM_H
-# ifndef DATUM
-/* ensure that struct datum is not included again from <rpcsvc/yp_prot.h> */
-# define DATUM
-# endif /* not DATUM */
-#endif /* HAVE_MAP_NDBM */
-
-/*
- * Actions to take if <net/errno.h> exists.
- */
-#ifdef HAVE_NET_ERRNO_H
-# include <net/errno.h>
-#endif /* HAVE_NET_ERRNO_H */
-
-/*
- * Actions to take if <net/if.h> exists.
- */
-#ifdef HAVE_NET_IF_H
-# include <net/if.h>
-#endif /* HAVE_NET_IF_H */
-
-/*
- * Actions to take if <net/route.h> exists.
- */
-#ifdef HAVE_NET_ROUTE_H
-# include <net/route.h>
-#endif /* HAVE_NET_ROUTE_H */
-
-/*
- * Actions to take if <sys/mbuf.h> exists.
- */
-#ifdef HAVE_SYS_MBUF_H
-# include <sys/mbuf.h>
-/*
- * OSF4 (DU-4.0) defines m_next and m_data also in <sys/mount.h> so I must
- # undefine them here to avoid conflicts.
- */
-# ifdef m_next
-# undef m_next
-# endif /* m_next */
-# ifdef m_data
-# undef m_data
-# endif /* m_data */
-/*
- * AIX 3 defines MFREE and m_flags also in <sys/mount.h>.
- */
-# ifdef m_flags
-# undef m_flags
-# endif /* m_flags */
-# ifdef MFREE
-# undef MFREE
-# endif /* MFREE */
-#endif /* HAVE_SYS_MBUF_H */
-
-/*
- * Actions to take if <sys/mman.h> exists.
- */
-#ifdef HAVE_SYS_MMAN_H
-# include <sys/mman.h>
-#endif /* HAVE_SYS_MMAN_H */
-
-/*
- * Actions to take if <netdb.h> exists.
- */
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif /* HAVE_NETDB_H */
-
-/*
- * Actions to take if <netdir.h> exists.
- */
-#ifdef HAVE_NETDIR_H
-# include <netdir.h>
-#endif /* HAVE_NETDIR_H */
-
-/*
- * Actions to take if <net/if_var.h> exists.
- */
-#ifdef HAVE_NET_IF_VAR_H
-# include <net/if_var.h>
-#endif /* HAVE_NET_IF_VAR_H */
-
-/*
- * Actions to take if <netinet/if_ether.h> exists.
- */
-#ifdef HAVE_NETINET_IF_ETHER_H
-# include <netinet/if_ether.h>
-#endif /* HAVE_NETINET_IF_ETHER_H */
-
-/*
- * Actions to take if <netinet/in.h> exists.
- */
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif /* HAVE_NETINET_IN_H */
-
-/*
- * Actions to take if <rpcsvc/yp_prot.h> exists.
- */
-#ifdef HAVE_RPCSVC_YP_PROT_H
-# ifdef HAVE_BAD_HEADERS
-/* avoid circular dependency in aix 4.3 with <rpcsvc/ypclnt.h> */
-struct ypall_callback;
-# endif /* HAVE_BAD_HEADERS */
-# include <rpcsvc/yp_prot.h>
-#endif /* HAVE_RPCSVC_YP_PROT_H */
-
-/*
- * Actions to take if <rpcsvc/ypclnt.h> exists.
- */
-#ifdef HAVE_RPCSVC_YPCLNT_H
-# include <rpcsvc/ypclnt.h>
-#endif /* HAVE_RPCSVC_YPCLNT_H */
-
-/*
- * Actions to take if <sys/ucred.h> exists.
- */
-#ifdef HAVE_SYS_UCRED_H
-# include <sys/ucred.h>
-#endif /* HAVE_SYS_UCRED_H */
-
-
-/*
- * Actions to take if <sys/mount.h> exists.
- */
-#ifdef HAVE_SYS_MOUNT_H
-/*
- * Some operating systems must define these variables to get
- * NFS and other definitions included.
- */
-# ifndef NFSCLIENT
-# define NFSCLIENT 1
-# endif /* not NFSCLIENT */
-# ifndef NFS
-# define NFS 1
-# endif /* not NFS */
-# ifndef PCFS
-# define PCFS 1
-# endif /* not PCFS */
-# ifndef LOFS
-# define LOFS 1
-# endif /* not LOFS */
-# ifndef RFS
-# define RFS 1
-# endif /* not RFS */
-# ifndef MSDOSFS
-# define MSDOSFS 1
-# endif /* not MSDOSFS */
-# ifndef MFS
-# define MFS 1
-# endif /* not MFS */
-# ifndef CD9660
-# define CD9660 1
-# endif /* not CD9660 */
-# include <sys/mount.h>
-#endif /* HAVE_SYS_MOUNT_H */
-
-#ifdef HAVE_SYS_VMOUNT_H
-# include <sys/vmount.h>
-#endif /* HAVE_SYS_VMOUNT_H */
-
-/*
- * Actions to take if <linux/fs.h> exists.
- * There is no point in including this on a glibc2 system,
- * we're only asking for trouble
- */
-#if defined HAVE_LINUX_FS_H && (!defined __GLIBC__ || __GLIBC__ < 2)
-/*
- * There are various conflicts in definitions between RedHat Linux, newer
- * 2.2 kernels, and <netinet/in.h> and <linux/fs.h>.
- */
-# ifdef HAVE_SOCKETBITS_H
-/* conflicts with <socketbits.h> */
-# define _LINUX_SOCKET_H
-# undef BLKFLSBUF
-# undef BLKGETSIZE
-# undef BLKRAGET
-# undef BLKRASET
-# undef BLKROGET
-# undef BLKROSET
-# undef BLKRRPART
-# undef MS_MGC_VAL
-# undef MS_RMT_MASK
-# if defined(__GLIBC__) && __GLIBC__ >= 2
-/* conflicts with <waitflags.h> */
-# undef WNOHANG
-# undef WUNTRACED
-# endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
-/* conflicts with <statfsbuf.h> */
-# define _SYS_STATFS_H
-# endif /* HAVE_SOCKETBITS_H */
-
-# ifdef _SYS_WAIT_H
-# if defined(__GLIBC__) && __GLIBC__ >= 2
-/* conflicts with <bits/waitflags.h> (RedHat/Linux 6.0 and kernels 2.2 */
-# undef WNOHANG
-# undef WUNTRACED
-# endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
-# endif /* _SYS_WAIT_H */
-
-# ifdef HAVE_LINUX_POSIX_TYPES_H
-# include <linux/posix_types.h>
-# endif /* HAVE_LINUX_POSIX_TYPES_H */
-# ifndef _LINUX_BYTEORDER_GENERIC_H
-# define _LINUX_BYTEORDER_GENERIC_H
-# endif /* _LINUX_BYTEORDER_GENERIC_H */
-/* conflicts with <sys/mount.h> in 2.[12] kernels */
-# ifdef _SYS_MOUNT_H
-# undef BLKFLSBUF
-# undef BLKGETSIZE
-# undef BLKRAGET
-# undef BLKRASET
-# undef BLKROGET
-# undef BLKROSET
-# undef BLKRRPART
-# undef BLOCK_SIZE
-# undef MS_MANDLOCK
-# undef MS_MGC_VAL
-# undef MS_NOATIME
-# undef MS_NODEV
-# undef MS_NODIRATIME
-# undef MS_NOEXEC
-# undef MS_NOSUID
-# undef MS_RDONLY
-# undef MS_REMOUNT
-# undef MS_RMT_MASK
-# undef MS_SYNCHRONOUS
-# undef S_APPEND
-# undef S_IMMUTABLE
-/* conflicts with <statfsbuf.h> */
-# define _SYS_STATFS_H
-# endif /* _SYS_MOUNT_H */
-# ifndef _LINUX_STRING_H_
-# define _LINUX_STRING_H_
-# endif /* not _LINUX_STRING_H_ */
-# ifdef HAVE_LINUX_KDEV_T_H
-# define __KERNEL__
-# include <linux/kdev_t.h>
-# undef __KERNEL__
-# endif /* HAVE_LINUX_KDEV_T_H */
-# ifdef HAVE_LINUX_LIST_H
-# define __KERNEL__
-# include <linux/list.h>
-# undef __KERNEL__
-# endif /* HAVE_LINUX_LIST_H */
-# include <linux/fs.h>
-#endif /* HAVE_LINUX_FS_H && (!__GLIBC__ || __GLIBC__ < 2) */
-
-#ifdef HAVE_CDFS_CDFS_MOUNT_H
-# include <cdfs/cdfs_mount.h>
-#endif /* HAVE_CDFS_CDFS_MOUNT_H */
-
-#ifdef HAVE_CDFS_CDFSMOUNT_H
-# include <cdfs/cdfsmount.h>
-#endif /* HAVE_CDFS_CDFSMOUNT_H */
-
-/*
- * Actions to take if <linux/loop.h> exists.
- */
-#ifdef HAVE_LINUX_LOOP_H
-# ifdef HAVE_LINUX_POSIX_TYPES_H
-# include <linux/posix_types.h>
-# endif /* HAVE_LINUX_POSIX_TYPES_H */
-/* next dev_t lines needed due to changes in kernel code */
-# undef dev_t
-# define dev_t unsigned short /* compatible with Red Hat and SuSE */
-# include <linux/loop.h>
-#endif /* HAVE_LINUX_LOOP_H */
-
-/*
- * AUTOFS PROTOCOL HEADER FILES:
- */
-
-/*
- * Actions to take if <linux/auto_fs[4].h> exists.
- * We really don't want <linux/fs.h> pulled in here
- */
-#ifndef _LINUX_FS_H
-#define _LINUX_FS_H
-#endif /* _LINUX_FS_H */
-#ifdef HAVE_LINUX_AUTO_FS4_H
-# include <linux/auto_fs4.h>
-#else /* not HAVE_LINUX_AUTO_FS4_H */
-# ifdef HAVE_LINUX_AUTO_FS_H
-# include <linux/auto_fs.h>
-# endif /* HAVE_LINUX_AUTO_FS_H */
-#endif /* not HAVE_LINUX_AUTO_FS4_H */
-
-/*
- * Actions to take if <sys/fs/autofs.h> exists.
- */
-#ifdef HAVE_SYS_FS_AUTOFS_H
-# include <sys/fs/autofs.h>
-#endif /* HAVE_SYS_FS_AUTOFS_H */
-
-/*
- * Actions to take if <rpcsvc/autofs_prot.h> or <sys/fs/autofs_prot.h> exist.
- */
-#ifdef HAVE_RPCSVC_AUTOFS_PROT_H
-# include <rpcsvc/autofs_prot.h>
-#else /* not HAVE_RPCSVC_AUTOFS_PROT_H */
-# ifdef HAVE_SYS_FS_AUTOFS_PROT_H
-# include <sys/fs/autofs_prot.h>
-# endif /* HAVE_SYS_FS_AUTOFS_PROT_H */
-#endif /* not HAVE_RPCSVC_AUTOFS_PROT_H */
-
-/*
- * Actions to take if <lber.h> exists.
- * This header file is required before <ldap.h> can be included.
- */
-#ifdef HAVE_LBER_H
-# include <lber.h>
-#endif /* HAVE_LBER_H */
-
-/*
- * Actions to take if <ldap.h> exists.
- */
-#ifdef HAVE_LDAP_H
-# include <ldap.h>
-#endif /* HAVE_LDAP_H */
-
-/****************************************************************************
- ** IMPORTANT!!! **
- ** We always include am-utils' amu_autofs_prot.h. **
- ** That is actually defined in "conf/autofs/autofs_${autofs_style}.h" **
- ****************************************************************************/
-#include <amu_autofs_prot.h>
-
-
-/*
- * NFS PROTOCOL HEADER FILES:
- */
-
-/*
- * Actions to take if <nfs/export.h> exists.
- */
-#ifdef HAVE_NFS_EXPORT_H
-# include <nfs/export.h>
-#endif /* HAVE_NFS_EXPORT_H */
-
-/****************************************************************************
- ** IMPORTANT!!! **
- ** We always include am-utils' amu_nfs_prot.h. **
- ** That is actually defined in "conf/nfs_prot/nfs_prot_${host_os_name}.h" **
- ****************************************************************************/
-#include <amu_nfs_prot.h>
-
-/*
- * DO NOT INCLUDE THESE FILES:
- * They conflicts with other NFS headers and are generally not needed.
- */
-#ifdef DO_NOT_INCLUDE
-# ifdef HAVE_NFS_NFS_CLNT_H
-# include <nfs/nfs_clnt.h>
-# endif /* HAVE_NFS_NFS_CLNT_H */
-# ifdef HAVE_LINUX_NFS_H
-# include <linux/nfs.h>
-# endif /* HAVE_LINUX_NFS_H */
-#endif /* DO NOT INCLUDE */
-
-/*
- * Actions to take if one of the nfs headers exists.
- */
-#ifdef HAVE_NFS_NFS_GFS_H
-# include <nfs/nfs_gfs.h>
-#endif /* HAVE_NFS_NFS_GFS_H */
-#ifdef HAVE_NFS_MOUNT_H
-# include <nfs/mount.h>
-#endif /* HAVE_NFS_MOUNT_H */
-#ifdef HAVE_NFS_NFS_MOUNT_H_off
-/* broken on nextstep3 (includes non-existing headers) */
-# include <nfs/nfs_mount.h>
-#endif /* HAVE_NFS_NFS_MOUNT_H */
-#ifdef HAVE_NFS_PATHCONF_H
-# include <nfs/pathconf.h>
-#endif /* HAVE_NFS_PATHCONF_H */
-#ifdef HAVE_SYS_FS_NFS_MOUNT_H
-# include <sys/fs/nfs/mount.h>
-#endif /* HAVE_SYS_FS_NFS_MOUNT_H */
-#ifdef HAVE_SYS_FS_NFS_NFS_CLNT_H
-# include <sys/fs/nfs/nfs_clnt.h>
-#endif /* HAVE_SYS_FS_NFS_NFS_CLNT_H */
-#ifdef HAVE_SYS_FS_NFS_CLNT_H
-# include <sys/fs/nfs_clnt.h>
-#endif /* HAVE_SYS_FS_NFS_CLNT_H */
-
-/* complex rules for linux/nfs_mount.h: broken on so many systems */
-#ifdef HAVE_LINUX_NFS_MOUNT_H
-# ifndef _LINUX_NFS_H
-# define _LINUX_NFS_H
-# endif /* not _LINUX_NFS_H */
-# ifndef _LINUX_NFS2_H
-# define _LINUX_NFS2_H
-# endif /* not _LINUX_NFS2_H */
-# ifndef _LINUX_NFS3_H
-# define _LINUX_NFS3_H
-# endif /* not _LINUX_NFS3_H */
-# ifndef _LINUX_NFS_FS_H
-# define _LINUX_NFS_FS_H
-# endif /* not _LINUX_NFS_FS_H */
-# ifndef _LINUX_IN_H
-# define _LINUX_IN_H
-# endif /* not _LINUX_IN_H */
-# ifndef __KERNEL__
-# define __KERNEL__
-# endif /* __KERNEL__ */
-# include <linux/nfs_mount.h>
-# undef __KERNEL__
-#endif /* HAVE_LINUX_NFS_MOUNT_H */
-
-/*
- * Actions to take if <pwd.h> exists.
- */
-#ifdef HAVE_PWD_H
-# include <pwd.h>
-#endif /* HAVE_PWD_H */
-
-/*
- * Actions to take if <hesiod.h> exists.
- */
-#ifdef HAVE_HESIOD_H
-# include <hesiod.h>
-#endif /* HAVE_HESIOD_H */
-
-/*
- * Actions to take if <arpa/nameser.h> exists.
- * Should be included before <resolv.h>.
- */
-#ifdef HAVE_ARPA_NAMESER_H
-# ifdef NOERROR
-# undef NOERROR
-# endif /* NOERROR */
-/*
- * Conflicts with <sys/tpicommon.h> which is included from <sys/tiuser.h>
- * on Solaris 2.6 systems. So undefine it first.
- */
-# ifdef T_UNSPEC
-# undef T_UNSPEC
-# endif /* T_UNSPEC */
-# include <arpa/nameser.h>
-#endif /* HAVE_ARPA_NAMESER_H */
-
-/*
- * Actions to take if <arpa/inet.h> exists.
- */
-#ifdef HAVE_ARPA_INET_H
-# ifdef HAVE_BAD_HEADERS
-/* aix 4.3: avoid including <net/if_dl.h> */
-struct sockaddr_dl;
-# endif /* HAVE_BAD_HEADERS */
-# include <arpa/inet.h>
-#endif /* HAVE_ARPA_INET_H */
-
-/*
- * Actions to take if <resolv.h> exists.
- */
-#ifdef HAVE_RESOLV_H
-/*
- * On AIX 5.2, both <resolv.h> and <arpa/nameser_compat.h> define MAXDNAME,
- * if compiling with gcc -D_USE_IRS (so that we get extern definitions for
- * hstrerror() and others).
- */
-# if defined(_AIX) && defined(MAXDNAME) && defined(_USE_IRS)
-# undef MAXDNAME
-# endif /* defined(_AIX) && defined(MAXDNAME) && defined(_USE_IRS) */
-# include <resolv.h>
-#endif /* HAVE_RESOLV_H */
-
-/*
- * Actions to take if <sys/uio.h> exists.
- */
-#ifdef HAVE_SYS_UIO_H
-# include <sys/uio.h>
-#endif /* HAVE_SYS_UIO_H */
-
-/*
- * Actions to take if <sys/fs/cachefs_fs.h> exists.
- */
-#ifdef HAVE_SYS_FS_CACHEFS_FS_H
-# include <sys/fs/cachefs_fs.h>
-#endif /* HAVE_SYS_FS_CACHEFS_FS_H */
-
-/*
- * Actions to take if <sys/fs/pc_fs.h> exists.
- */
-#ifdef HAVE_SYS_FS_PC_FS_H
-# include <sys/fs/pc_fs.h>
-#endif /* HAVE_SYS_FS_PC_FS_H */
-
-/*
- * Actions to take if <msdosfs/msdosfsmount.h> exists.
- */
-#ifdef HAVE_MSDOSFS_MSDOSFSMOUNT_H
-# include <msdosfs/msdosfsmount.h>
-#endif /* HAVE_MSDOSFS_MSDOSFSMOUNT_H */
-
-/*
- * Actions to take if <fs/msdosfs/msdosfsmount.h> exists.
- */
-#ifdef HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H
-# include <fs/msdosfs/msdosfsmount.h>
-#endif /* HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H */
-
-/*
- * Actions to take if <sys/fs/tmp.h> exists.
- */
-#ifdef HAVE_SYS_FS_TMP_H
-# include <sys/fs/tmp.h>
-#endif /* HAVE_SYS_FS_TMP_H */
-
-/*
- * Actions to take if <sys/fs/ufs_mount.h> exists.
- */
-#ifdef HAVE_SYS_FS_UFS_MOUNT_H
-# include <sys/fs/ufs_mount.h>
-#endif /* HAVE_SYS_FS_UFS_MOUNT_H */
-#ifdef HAVE_UFS_UFS_UFSMOUNT_H_off
-# error do not include this file here because on netbsd/openbsd it
-# error causes errors with other header files. Instead, add it to the
-# error specific conf/nfs_prot_*.h file.
-# include <ufs/ufs/ufsmount.h>
-#endif /* HAVE_UFS_UFS_UFSMOUNT_H_off */
-
-/*
- * Actions to take if <sys/fs/efs_clnt.h> exists.
- */
-#ifdef HAVE_SYS_FS_EFS_CLNT_H
-# include <sys/fs/efs_clnt.h>
-#endif /* HAVE_SYS_FS_EFS_CLNT_H */
-
-/*
- * Actions to take if <sys/fs/xfs_clnt.h> exists.
- */
-#ifdef HAVE_SYS_FS_XFS_CLNT_H
-# include <sys/fs/xfs_clnt.h>
-#endif /* HAVE_SYS_FS_XFS_CLNT_H */
-
-/*
- * Actions to take if <assert.h> exists.
- */
-#ifdef HAVE_ASSERT_H
-# include <assert.h>
-#endif /* HAVE_ASSERT_H */
-
-/*
- * Actions to take if <cfs.h> exists.
- */
-#ifdef HAVE_CFS_H
-# include <cfs.h>
-#endif /* HAVE_CFS_H */
-
-/*
- * Actions to take if <cluster.h> exists.
- */
-#ifdef HAVE_CLUSTER_H
-# include <cluster.h>
-#endif /* HAVE_CLUSTER_H */
-
-/*
- * Actions to take if <ctype.h> exists.
- */
-#ifdef HAVE_CTYPE_H
-# include <ctype.h>
-#endif /* HAVE_CTYPE_H */
-
-/*
- * Actions to take if <errno.h> exists.
- */
-#ifdef HAVE_ERRNO_H
-# include <errno.h>
-#endif /* HAVE_ERRNO_H */
-
-/*
- * Actions to take if <grp.h> exists.
- */
-#ifdef HAVE_GRP_H
-# include <grp.h>
-#endif /* HAVE_GRP_H */
-
-/*
- * Actions to take if <hsfs/hsfs.h> exists.
- */
-#ifdef HAVE_HSFS_HSFS_H
-# include <hsfs/hsfs.h>
-#endif /* HAVE_HSFS_HSFS_H */
-
-/*
- * Actions to take if <cdfs/cdfsmount.h> exists.
- */
-#ifdef HAVE_CDFS_CDFSMOUNT_H
-# include <cdfs/cdfsmount.h>
-#endif /* HAVE_CDFS_CDFSMOUNT_H */
-
-/*
- * Actions to take if <isofs/cd9660/cd9660_mount.h> exists.
- */
-#ifdef HAVE_ISOFS_CD9660_CD9660_MOUNT_H
-# include <isofs/cd9660/cd9660_mount.h>
-#endif /* HAVE_ISOFS_CD9660_CD9660_MOUNT_H */
-
-/*
- * Actions to take if <mount.h> exists.
- */
-#ifdef HAVE_MOUNT_H
-# include <mount.h>
-#endif /* HAVE_MOUNT_H */
-
-/*
- * Actions to take if <nsswitch.h> exists.
- */
-#ifdef HAVE_NSSWITCH_H
-# include <nsswitch.h>
-#endif /* HAVE_NSSWITCH_H */
-
-/*
- * Actions to take if <rpc/auth_des.h> exists.
- */
-#ifdef HAVE_RPC_AUTH_DES_H
-# include <rpc/auth_des.h>
-#endif /* HAVE_RPC_AUTH_DES_H */
-
-/*
- * Actions to take if <rpc/pmap_clnt.h> exists.
- */
-#ifdef HAVE_RPC_PMAP_CLNT_H
-# include <rpc/pmap_clnt.h>
-#endif /* HAVE_RPC_PMAP_CLNT_H */
-
-/*
- * Actions to take if <rpc/pmap_prot.h> exists.
- */
-#ifdef HAVE_RPC_PMAP_PROT_H
-# include <rpc/pmap_prot.h>
-#endif /* HAVE_RPC_PMAP_PROT_H */
-
-
-/*
- * Actions to take if <rpcsvc/mount.h> exists.
- * AIX does not protect against this file doubly included,
- * so I have to do my own protection here.
- */
-#ifdef HAVE_RPCSVC_MOUNT_H
-# ifndef _RPCSVC_MOUNT_H
-# include <rpcsvc/mount.h>
-# endif /* not _RPCSVC_MOUNT_H */
-#endif /* HAVE_RPCSVC_MOUNT_H */
-
-/*
- * Actions to take if <rpcsvc/nis.h> exists.
- */
-#ifdef HAVE_RPCSVC_NIS_H
-/*
- * Solaris 10 (build 72) defines GROUP_OBJ in <sys/acl.h>, which is included
- * in many other header files. <rpcsvc/nis.h> uses GROUP_OBJ inside enum
- * zotypes. So if you're unlucky enough to include both headers, you get a
- * compile error because the two symbols conflict.
- * A similar conflict arises with Sun cc and the definition of "GROUP".
- *
- * Temp hack: undefine acl.h's GROUP_OBJ and GROUP because they're not needed
- * for am-utils.
- */
-# ifdef GROUP_OBJ
-# undef GROUP_OBJ
-# endif /* GROUP_OBJ */
-# ifdef GROUP
-# undef GROUP
-# endif /* GROUP */
-# include <rpcsvc/nis.h>
-#endif /* HAVE_RPCSVC_NIS_H */
-
-/*
- * Actions to take if <setjmp.h> exists.
- */
-#ifdef HAVE_SETJMP_H
-# include <setjmp.h>
-#endif /* HAVE_SETJMP_H */
-
-/*
- * Actions to take if <signal.h> exists.
- */
-#ifdef HAVE_SIGNAL_H
-# include <signal.h>
-#endif /* HAVE_SIGNAL_H */
-
-/*
- * Actions to take if <string.h> exists.
- */
-#ifdef HAVE_STRING_H
-# include <string.h>
-#endif /* HAVE_STRING_H */
-
-/*
- * Actions to take if <strings.h> exists.
- */
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif /* HAVE_STRINGS_H */
-
-/*
- * Actions to take if <sys/config.h> exists.
- */
-#ifdef HAVE_SYS_CONFIG_H
-# include <sys/config.h>
-#endif /* HAVE_SYS_CONFIG_H */
-
-/*
- * Actions to take if <sys/dg_mount.h> exists.
- */
-#ifdef HAVE_SYS_DG_MOUNT_H
-# include <sys/dg_mount.h>
-#endif /* HAVE_SYS_DG_MOUNT_H */
-
-/*
- * Actions to take if <sys/fs_types.h> exists.
- */
-#ifdef HAVE_SYS_FS_TYPES_H
-/*
- * Define KERNEL here to avoid multiple definitions of gt_names[] on
- * Ultrix 4.3.
- */
-# define KERNEL
-# include <sys/fs_types.h>
-# undef KERNEL
-#endif /* HAVE_SYS_FS_TYPES_H */
-
-/*
- * Actions to take if <sys/fstyp.h> exists.
- */
-#ifdef HAVE_SYS_FSTYP_H
-# include <sys/fstyp.h>
-#endif /* HAVE_SYS_FSTYP_H */
-
-/*
- * Actions to take if <sys/lock.h> exists.
- */
-#ifdef HAVE_SYS_LOCK_H
-# include <sys/lock.h>
-#endif /* HAVE_SYS_LOCK_H */
-
-/*
- * Actions to take if <sys/machine.h> exists.
- */
-#ifdef HAVE_SYS_MACHINE_H
-# include <sys/machine.h>
-#endif /* HAVE_SYS_MACHINE_H */
-
-/*
- * Actions to take if <sys/mntctl.h> exists.
- */
-#ifdef HAVE_SYS_MNTCTL_H
-# include <sys/mntctl.h>
-#endif /* HAVE_SYS_MNTCTL_H */
-
-/*
- * Actions to take if <sys/mnttab.h> exists.
- */
-#ifdef HAVE_SYS_MNTTAB_H
-# include <sys/mnttab.h>
-#endif /* HAVE_SYS_MNTTAB_H */
-
-/*
- * Actions to take if <mnttab.h> exists.
- * Do not include it if MNTTAB is already defined because it probably
- * came from <sys/mnttab.h> and we do not want conflicting definitions.
- */
-#if defined(HAVE_MNTTAB_H) && !defined(MNTTAB)
-# include <mnttab.h>
-#endif /* defined(HAVE_MNTTAB_H) && !defined(MNTTAB) */
-
-/*
- * Actions to take if <netconfig.h> exists.
- */
-#ifdef HAVE_NETCONFIG_H
-# include <netconfig.h>
-/* Some systems (Solaris 2.5.1) don't declare this external */
-extern char *nc_sperror(void);
-#endif /* HAVE_NETCONFIG_H */
-
-/*
- * Actions to take if <sys/netconfig.h> exists.
- */
-#ifdef HAVE_SYS_NETCONFIG_H
-# include <sys/netconfig.h>
-#endif /* HAVE_SYS_NETCONFIG_H */
-
-/*
- * Actions to take if <sys/pathconf.h> exists.
- */
-#ifdef HAVE_SYS_PATHCONF_H
-# include <sys/pathconf.h>
-#endif /* HAVE_SYS_PATHCONF_H */
-
-/*
- * Actions to take if <sys/resource.h> exists.
- */
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif /* HAVE_SYS_RESOURCE_H */
-
-/*
- * Actions to take if <sys/sema.h> exists.
- */
-#ifdef HAVE_SYS_SEMA_H
-# include <sys/sema.h>
-#endif /* HAVE_SYS_SEMA_H */
-
-/*
- * Actions to take if <sys/signal.h> exists.
- */
-#ifdef HAVE_SYS_SIGNAL_H
-# include <sys/signal.h>
-#endif /* HAVE_SYS_SIGNAL_H */
-
-/*
- * Actions to take if <sys/sockio.h> exists.
- */
-#ifdef HAVE_SYS_SOCKIO_H
-# include <sys/sockio.h>
-#endif /* HAVE_SYS_SOCKIO_H */
-
-/*
- * Actions to take if <sys/syscall.h> exists.
- */
-#ifdef HAVE_SYS_SYSCALL_H
-# include <sys/syscall.h>
-#endif /* HAVE_SYS_SYSCALL_H */
-
-/*
- * Actions to take if <sys/syslimits.h> exists.
- */
-#ifdef HAVE_SYS_SYSLIMITS_H
-# include <sys/syslimits.h>
-#endif /* HAVE_SYS_SYSLIMITS_H */
-
-/*
- * Actions to take if <tiuser.h> exists.
- */
-#ifdef HAVE_TIUSER_H
-/*
- * Some systems like AIX have multiple definitions for T_NULL and others
- * that are defined first in <arpa/nameser.h>.
- */
-# ifdef HAVE_ARPA_NAMESER_H
-# ifdef T_NULL
-# undef T_NULL
-# endif /* T_NULL */
-# ifdef T_UNSPEC
-# undef T_UNSPEC
-# endif /* T_UNSPEC */
-# ifdef T_IDLE
-# undef T_IDLE
-# endif /* T_IDLE */
-# endif /* HAVE_ARPA_NAMESER_H */
-# include <tiuser.h>
-#endif /* HAVE_TIUSER_H */
-
-/*
- * Actions to take if <sys/tiuser.h> exists.
- */
-#ifdef HAVE_SYS_TIUSER_H
-# include <sys/tiuser.h>
-#endif /* HAVE_SYS_TIUSER_H */
-
-/*
- * Actions to take if <sys/statfs.h> exists.
- */
-#ifdef HAVE_SYS_STATFS_H
-# include <sys/statfs.h>
-#endif /* HAVE_SYS_STATFS_H */
-
-/*
- * Actions to take if <sys/statvfs.h> exists.
- */
-#ifdef HAVE_SYS_STATVFS_H
-# include <sys/statvfs.h>
-#endif /* HAVE_SYS_STATVFS_H */
-
-/*
- * Actions to take if <sys/vfs.h> exists.
- */
-#ifdef HAVE_SYS_VFS_H
-# include <sys/vfs.h>
-#endif /* HAVE_SYS_VFS_H */
-
-/*
- * Actions to take if <sys/vmount.h> exists.
- */
-#ifdef HAVE_SYS_VMOUNT_H
-# include <sys/vmount.h>
-#endif /* HAVE_SYS_VMOUNT_H */
-
-/*
- * Actions to take if <ufs/ufs_mount.h> exists.
- */
-#ifdef HAVE_UFS_UFS_MOUNT_H
-# include <ufs/ufs_mount.h>
-#endif /* HAVE_UFS_UFS_MOUNT_H */
-
-/*
- * Are S_ISDIR, S_ISREG, et al broken? If not, include <sys/stat.h>.
- * Turned off the not using sys/stat.h based on if the macros are
- * "broken", because they incorrectly get reported as broken on
- * ncr2.
- */
-#ifndef STAT_MACROS_BROKEN_notused
-/*
- * RedHat Linux 4.2 (alpha) has a problem in the headers that causes
- * duplicate definitions, and also some other nasty bugs. Upgrade to Redhat
- * 5.0!
- */
-# ifdef HAVE_SYS_STAT_H
-/* avoid duplicates or conflicts with <linux/stat.h> (RedHat alpha linux) */
-# if defined(S_IFREG) && defined(HAVE_STATBUF_H)
-# include <statbuf.h>
-# undef S_IFBLK
-# undef S_IFCHR
-# undef S_IFDIR
-# undef S_IFIFO
-# undef S_IFLNK
-# undef S_IFMT
-# undef S_IFREG
-# undef S_IFSOCK
-# undef S_IRGRP
-# undef S_IROTH
-# undef S_IRUSR
-# undef S_IRWXG
-# undef S_IRWXO
-# undef S_IRWXU
-# undef S_ISBLK
-# undef S_ISCHR
-# undef S_ISDIR
-# undef S_ISFIFO
-# undef S_ISGID
-# undef S_ISLNK
-# undef S_ISREG
-# undef S_ISSOCK
-# undef S_ISUID
-# undef S_ISVTX
-# undef S_IWGRP
-# undef S_IWOTH
-# undef S_IWUSR
-# undef S_IXGRP
-# undef S_IXOTH
-# undef S_IXUSR
-# endif /* defined(S_IFREG) && defined(HAVE_STATBUF_H) */
-# include <sys/stat.h>
-# endif /* HAVE_SYS_STAT_H */
-#endif /* not STAT_MACROS_BROKEN_notused */
-
-/*
- * Actions to take if <stdio.h> exists.
- */
-#ifdef HAVE_STDIO_H
-# include <stdio.h>
-#endif /* HAVE_STDIO_H */
-
-/*
- * Actions to take if <stdlib.h> exists.
- */
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif /* HAVE_STDLIB_H */
-
-/*
- * Actions to take if <regex.h> exists.
- */
-#ifdef HAVE_REGEX_H
-# include <regex.h>
-#endif /* HAVE_REGEX_H */
-
-/*
- * Actions to take if <tcpd.h> exists.
- */
-#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP)
-# include <tcpd.h>
-#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
-
-
-/****************************************************************************/
-/*
- * Specific macros we're looking for.
- */
-#ifndef HAVE_MEMSET
-# ifdef HAVE_BZERO
-# define memset(ptr, val, len) bzero((ptr), (len))
-# else /* not HAVE_BZERO */
-# error Cannot find either memset or bzero!
-# endif /* not HAVE_BZERO */
-#endif /* not HAVE_MEMSET */
-
-#ifndef HAVE_MEMMOVE
-# ifdef HAVE_BCOPY
-# define memmove(to, from, len) bcopy((from), (to), (len))
-# else /* not HAVE_BCOPY */
-# error Cannot find either memmove or bcopy!
-# endif /* not HAVE_BCOPY */
-#endif /* not HAVE_MEMMOVE */
-
-/*
- * memcmp() is more problematic:
- * Systems that don't have it, but have bcmp(), will use bcmp() instead.
- * Those that have it, but it is bad (SunOS 4 doesn't handle
- * 8 bit comparisons correctly), will get to use am_memcmp().
- * Otherwise if you have memcmp() and it is good, use it.
- */
-#ifdef HAVE_MEMCMP
-# ifdef HAVE_BAD_MEMCMP
-# define memcmp am_memcmp
-extern int am_memcmp(const voidp s1, const voidp s2, size_t len);
-# endif /* HAVE_BAD_MEMCMP */
-#else /* not HAVE_MEMCMP */
-# ifdef HAVE_BCMP
-# define memcmp(a, b, len) bcmp((a), (b), (len))
-# endif /* HAVE_BCMP */
-#endif /* not HAVE_MEMCMP */
-
-#ifndef HAVE_SETEUID
-# ifdef HAVE_SETRESUID
-# define seteuid(x) setresuid(-1,(x),-1)
-# else /* not HAVE_SETRESUID */
-# error Cannot find either seteuid or setresuid!
-# endif /* not HAVE_SETRESUID */
-#endif /* not HAVE_SETEUID */
-
-/*
- * Define type of mntent_t.
- * Defaults to struct mntent, else struct mnttab. If neither is found, and
- * the operating system does keep not mount tables in the kernel, then flag
- * it as an error. If neither is found and the OS keeps mount tables in the
- * kernel, then define our own version of mntent; it will be needed for amd
- * to keep its own internal version of the mount tables.
- */
-#ifdef HAVE_STRUCT_MNTENT
-typedef struct mntent mntent_t;
-#else /* not HAVE_STRUCT_MNTENT */
-# ifdef HAVE_STRUCT_MNTTAB
-typedef struct mnttab mntent_t;
-/* map struct mnttab field names to struct mntent field names */
-# define mnt_fsname mnt_special
-# define mnt_dir mnt_mountp
-# define mnt_opts mnt_mntopts
-# define mnt_type mnt_fstype
-# else /* not HAVE_STRUCT_MNTTAB */
-# ifdef MOUNT_TABLE_ON_FILE
-# error Could not find definition for struct mntent or struct mnttab!
-# else /* not MOUNT_TABLE_ON_FILE */
-typedef struct _am_mntent {
- char *mnt_fsname; /* name of mounted file system */
- char *mnt_dir; /* file system path prefix */
- char *mnt_type; /* MNTTAB_TYPE_* */
- char *mnt_opts; /* MNTTAB_OPT_* */
- int mnt_freq; /* dump frequency, in days */
- int mnt_passno; /* pass number on parallel fsck */
-} mntent_t;
-# endif /* not MOUNT_TABLE_ON_FILE */
-# endif /* not HAVE_STRUCT_MNTTAB */
-#endif /* not HAVE_STRUCT_MNTENT */
-
-/*
- * Provide FD_* macros for systems that lack them.
- */
-#ifndef FD_SET
-# define FD_SET(fd, set) (*(set) |= (1 << (fd)))
-# define FD_ISSET(fd, set) (*(set) & (1 << (fd)))
-# define FD_CLR(fd, set) (*(set) &= ~(1 << (fd)))
-# define FD_ZERO(set) (*(set) = 0)
-#endif /* not FD_SET */
-
-
-/*
- * Complete external definitions missing from some systems.
- */
-
-#ifndef HAVE_EXTERN_SYS_ERRLIST
-extern const char *const sys_errlist[];
-#endif /* not HAVE_EXTERN_SYS_ERRLIST */
-
-#ifndef HAVE_EXTERN_OPTARG
-extern char *optarg;
-extern int optind;
-#endif /* not HAVE_EXTERN_OPTARG */
-
-#if defined(HAVE_CLNT_SPCREATEERROR) && !defined(HAVE_EXTERN_CLNT_SPCREATEERROR)
-extern char *clnt_spcreateerror(const char *s);
-#endif /* defined(HAVE_CLNT_SPCREATEERROR) && !defined(HAVE_EXTERN_CLNT_SPCREATEERROR) */
-
-#if defined(HAVE_CLNT_SPERRNO) && !defined(HAVE_EXTERN_CLNT_SPERRNO)
-extern char *clnt_sperrno(const enum clnt_stat num);
-#endif /* defined(HAVE_CLNT_SPERRNO) && !defined(HAVE_EXTERN_CLNT_SPERRNO) */
-
-#ifndef HAVE_EXTERN_FREE
-extern void free(voidp);
-#endif /* not HAVE_EXTERN_FREE */
-
-#if defined(HAVE_GET_MYADDRESS) && !defined(HAVE_EXTERN_GET_MYADDRESS)
-extern void get_myaddress(struct sockaddr_in *addr);
-#endif /* defined(HAVE_GET_MYADDRESS) && !defined(HAVE_EXTERN_GET_MYADDRESS) */
-
-#if defined(HAVE_GETDOMAINNAME) && !defined(HAVE_EXTERN_GETDOMAINNAME)
-# if defined(HAVE_MAP_NIS) || defined(HAVE_MAP_NISPLUS)
-extern int getdomainname(char *name, int namelen);
-# endif /* defined(HAVE_MAP_NIS) || defined(HAVE_MAP_NISPLUS) */
-#endif /* defined(HAVE_GETDOMAINNAME) && !defined(HAVE_EXTERN_GETDOMAINNAME) */
-
-#if defined(HAVE_GETDTABLESIZE) && !defined(HAVE_EXTERN_GETDTABLESIZE)
-extern int getdtablesize(void);
-#endif /* defined(HAVE_GETDTABLESIZE) && !defined(HAVE_EXTERN_GETDTABLESIZE) */
-
-#if defined(HAVE_GETHOSTNAME) && !defined(HAVE_EXTERN_GETHOSTNAME)
-extern int gethostname(char *name, int namelen);
-#endif /* defined(HAVE_GETHOSTNAME) && !defined(HAVE_EXTERN_GETHOSTNAME) */
-
-#ifndef HAVE_EXTERN_GETLOGIN
-extern char *getlogin(void);
-#endif /* not HAVE_EXTERN_GETLOGIN */
-
-#if defined(HAVE_GETPAGESIZE) && !defined(HAVE_EXTERN_GETPAGESIZE)
-extern int getpagesize(void);
-#endif /* defined(HAVE_GETPAGESIZE) && !defined(HAVE_EXTERN_GETPAGESIZE) */
-
-#ifndef HAVE_EXTERN_GETWD
-extern char *getwd(char *s);
-#endif /* not HAVE_EXTERN_GETWD */
-
-#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) && !defined(HAVE_EXTERN_HOSTS_CTL)
-extern int hosts_ctl(char *daemon, char *client_name, char *client_addr, char *client_user);
-#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) && !defined(HAVE_EXTERN_HOSTS_CTL) */
-
-#ifndef HAVE_EXTERN_INNETGR
-extern int innetgr(char *, char *, char *, char *);
-#endif /* not HAVE_EXTERN_INNETGR */
-
-#if defined(HAVE_MKSTEMP) && !defined(HAVE_EXTERN_MKSTEMP)
-extern int mkstemp(char *);
-#endif /* defined(HAVE_MKSTEMP) && !defined(HAVE_EXTERN_MKSTEMP) */
-
-#ifndef HAVE_EXTERN_SBRK
-extern caddr_t sbrk(int incr);
-#endif /* not HAVE_EXTERN_SBRK */
-
-#if defined(HAVE_SETEUID) && !defined(HAVE_EXTERN_SETEUID)
-extern int seteuid(uid_t euid);
-#endif /* not defined(HAVE_SETEUID) && !defined(HAVE_EXTERN_SETEUID) */
-
-#if defined(HAVE_SETITIMER) && !defined(HAVE_EXTERN_SETITIMER)
-extern int setitimer(int, struct itimerval *, struct itimerval *);
-#endif /* defined(HAVE_SETITIMER) && !defined(HAVE_EXTERN_SETITIMER) */
-
-#ifndef HAVE_EXTERN_SLEEP
-extern unsigned int sleep(unsigned int seconds);
-#endif /* not HAVE_EXTERN_SETITIMER */
-
-#ifndef HAVE_EXTERN_STRCASECMP
-/*
- * define this extern even if function does not exist, for it will
- * be filled in by libamu/strcasecmp.c
- */
-extern int strcasecmp(const char *s1, const char *s2);
-#endif /* not HAVE_EXTERN_STRCASECMP */
-
-#ifndef HAVE_EXTERN_STRDUP
-/*
- * define this extern even if function does not exist, for it will
- * be filled in by libamu/strdup.c
- */
-extern char *strdup(const char *s);
-#endif /* not HAVE_EXTERN_STRDUP */
-
-#ifndef HAVE_EXTERN_STRLCAT
-/*
- * define this extern even if function does not exist, for it will
- * be filled in by libamu/strlcat.c
- */
-extern size_t strlcat(char *dst, const char *src, size_t siz);
-#endif /* not HAVE_EXTERN_STRLCAT */
-
-#ifndef HAVE_EXTERN_STRLCPY
-/*
- * define this extern even if function does not exist, for it will
- * be filled in by libamu/strlcpy.c
- */
-extern size_t strlcpy(char *dst, const char *src, size_t siz);
-#endif /* not HAVE_EXTERN_STRLCPY */
-
-#if defined(HAVE_STRSTR) && !defined(HAVE_EXTERN_STRSTR)
-extern char *strstr(const char *s1, const char *s2);
-#endif /* defined(HAVE_STRSTR) && !defined(HAVE_EXTERN_STRSTR) */
-
-#if defined(HAVE_USLEEP) && !defined(HAVE_EXTERN_USLEEP)
-extern int usleep(u_int useconds);
-#endif /* defined(HAVE_USLEEP) && !defined(HAVE_EXTERN_USLEEP) */
-
-#ifndef HAVE_EXTERN_UALARM
-extern u_int ualarm(u_int usecs, u_int interval);
-#endif /* not HAVE_EXTERN_UALARM */
-
-#if defined(HAVE_WAIT3) && !defined(HAVE_EXTERN_WAIT3)
-extern int wait3(int *statusp, int options, struct rusage *rusage);
-#endif /* defined(HAVE_WAIT3) && !defined(HAVE_EXTERN_WAIT3) */
-
-#if defined(HAVE_VSNPRINTF) && !defined(HAVE_EXTERN_VSNPRINTF)
-extern int vsnprintf(char *, int, const char *, ...);
-#endif /* defined(HAVE_VSNPRINTF) && !defined(HAVE_EXTERN_VSNPRINTF) */
-
-#ifndef HAVE_EXTERN_XDR_CALLMSG
-extern bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *msg);
-#endif /* not HAVE_EXTERN_XDR_CALLMSG */
-
-#ifndef HAVE_EXTERN_XDR_OPAQUE_AUTH
-extern bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *auth);
-#endif /* not HAVE_EXTERN_XDR_OPAQUE_AUTH */
-
-/****************************************************************************/
-/*
- * amd-specific header files.
- */
-#ifdef THIS_HEADER_FILE_IS_INCLUDED_ABOVE
-# include <amu_nfs_prot.h>
-#endif /* THIS_HEADER_FILE_IS_INCLUDED_ABOVE */
-#include <am_compat.h>
-#include <am_xdr_func.h>
-#include <am_utils.h>
-#include <amq_defs.h>
-#include <aux_conf.h>
-
-
-/****************************************************************************/
-/*
- * External definitions that depend on other macros available (or not)
- * and those are probably declared in any of the above headers.
- */
-
-#ifdef HAVE_HASMNTOPT
-# ifdef HAVE_BAD_HASMNTOPT
-extern char *amu_hasmntopt(mntent_t *mnt, char *opt);
-# else /* not HAVE_BAD_HASMNTOPT */
-# define amu_hasmntopt hasmntopt
-# endif /* not HAVE_BAD_HASMNTOPT */
-#else /* not HAVE_HASMNTOPT */
-extern char *amu_hasmntopt(mntent_t *mnt, char *opt);
-#endif /* not HAVE_HASMNTOPT */
-
-#endif /* not _AM_DEFS_H */
diff --git a/contrib/amd/include/am_utils.h b/contrib/amd/include/am_utils.h
deleted file mode 100644
index b7e55ce33e2c..000000000000
--- a/contrib/amd/include/am_utils.h
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/am_utils.h
- *
- */
-
-/*
- * Definitions that are specific to the am-utils package.
- */
-
-#ifndef _AM_UTILS_H
-#define _AM_UTILS_H
-
-
-#include "aux_conf.h"
-
-/**************************************************************************/
-/*** MACROS ***/
-/**************************************************************************/
-
-/*
- * General macros.
- */
-#ifndef FALSE
-# define FALSE 0
-#endif /* not FALSE */
-#ifndef TRUE
-# define TRUE 1
-#endif /* not TRUE */
-#ifndef MAX
-# define MAX(a, b) ((a) > (b) ? (a) : (b))
-#endif /* not MAX */
-#ifndef MIN
-# define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif /* not MIN */
-
-#define ONE_HOUR (60 * 60) /* One hour in seconds */
-
-#ifndef MAXHOSTNAMELEN
-# ifdef HOSTNAMESZ
-# define MAXHOSTNAMELEN HOSTNAMESZ
-# else /* not HOSTNAMESZ */
-# define MAXHOSTNAMELEN 256
-# endif /* not HOSTNAMESZ */
-#endif /* not MAXHOSTNAMELEN */
-
-/*
- * for hlfsd, and amd for detecting uid/gid
- */
-#ifndef INVALIDID
-/* this is also defined in include/am_utils.h */
-# define INVALIDID (((unsigned short) ~0) - 3)
-#endif /* not INVALIDID */
-
-/*
- * String comparison macros
- */
-#define STREQ(s1, s2) (strcmp((s1), (s2)) == 0)
-#define STRCEQ(s1, s2) (strcasecmp((s1), (s2)) == 0)
-#define NSTREQ(s1, s2, n) (strncmp((s1), (s2), (n)) == 0)
-#define NSTRCEQ(s1, s2, n) (strncasecmp((s1), (s2), (n)) == 0)
-#define FSTREQ(s1, s2) ((*(s1) == *(s2)) && STREQ((s1),(s2)))
-
-/*
- * Logging options/flags
- */
-#define XLOG_FATAL 0x0001
-#define XLOG_ERROR 0x0002
-#define XLOG_USER 0x0004
-#define XLOG_WARNING 0x0008
-#define XLOG_INFO 0x0010
-#define XLOG_DEBUG 0x0020
-#define XLOG_MAP 0x0040
-#define XLOG_STATS 0x0080
-#define XLOG_DEFSTR "all,nomap,nostats" /* Default log options */
-#define XLOG_ALL (XLOG_FATAL|XLOG_ERROR|XLOG_USER|XLOG_WARNING|XLOG_INFO|XLOG_MAP|XLOG_STATS)
-
-#define NO_SUBNET "notknown" /* default subnet name for no subnet */
-#define NEXP_AP (1022) /* gdmr: was 254 */
-#define NEXP_AP_MARGIN (128) /* ???? not used */
-
-/*
- * Linked list macros
- */
-#define AM_FIRST(ty, q) ((ty *) ((q)->q_forw))
-#define AM_LAST(ty, q) ((ty *) ((q)->q_back))
-#define NEXT(ty, q) ((ty *) (((qelem *) q)->q_forw))
-#define PREV(ty, q) ((ty *) (((qelem *) q)->q_back))
-#define HEAD(ty, q) ((ty *) q)
-#define ITER(v, ty, q) \
- for ((v) = AM_FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v)))
-
-/* allocate anything of type ty */
-#define ALLOC(ty) ((ty *) xmalloc(sizeof(ty)))
-#define CALLOC(ty) ((ty *) xzalloc(sizeof(ty)))
-/* simply allocate b bytes */
-#define SALLOC(b) xmalloc((b))
-
-/*
- * Systems which have the mount table in a file need to read it before
- * they can perform an unmount() system call.
- */
-#define UMOUNT_FS(dir, mtb_name, unmount_flags) umount_fs(dir, mtb_name, unmount_flags)
-/* next two are imported via $srcdir/conf/umount/umount_*.c */
-extern int umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags);
-#ifdef MNT2_GEN_OPT_FORCE
-extern int umount2_fs(const char *mntdir, u_int unmount_flags);
-#endif /* MNT2_GEN_OPT_FORCE */
-
-/* unmount-related flags (special handling of autofs, forced/lazy, etc.) */
-#define AMU_UMOUNT_FORCE 0x1
-#define AMU_UMOUNT_DETACH 0x2
-#define AMU_UMOUNT_AUTOFS 0x4
-
-/*
- * The following values can be tuned...
- */
-#define ALLOWED_MOUNT_TIME 40 /* 40s for a mount */
-
-/*
- * RPC-related macros.
- */
-#define RPC_XID_PORTMAP 0
-#define RPC_XID_MOUNTD 1
-#define RPC_XID_NFSPING 2
-#define RPC_XID_WEBNFS 3
-#define RPC_XID_MASK (0x0f) /* 16 id's for now */
-#define MK_RPC_XID(type_id, uniq) ((type_id) | ((uniq) << 4))
-
-/*
- * What level of AMD are we backward compatible with?
- * This only applies to externally visible characteristics.
- * Rev.Minor.Branch.Patch (2 digits each)
- */
-#define AMD_COMPAT 5000000 /* 5.0 */
-
-
-/**************************************************************************/
-/*** STRUCTURES AND TYPEDEFS ***/
-/**************************************************************************/
-
-/* some typedefs must come first */
-typedef char *amq_string;
-typedef struct _qelem qelem;
-typedef struct mntlist mntlist;
-
-/*
- * Linked list
- * (the name 'struct qelem' conflicts with linux's unistd.h)
- */
-struct _qelem {
- qelem *q_forw;
- qelem *q_back;
-};
-
-/*
- * Option tables
- */
-struct opt_tab {
- char *opt;
- int flag;
-};
-
-/*
- * Server states
- */
-typedef enum {
- Start,
- Run,
- Finishing,
- Quit,
- Done
-} serv_state;
-
-
-/*
- * List of mount table entries
- */
-struct mntlist {
- struct mntlist *mnext;
- mntent_t *mnt;
-};
-
-/*
- * Mount map
- */
-typedef struct mnt_map mnt_map;
-
-
-/**************************************************************************/
-/*** EXTERNALS ***/
-/**************************************************************************/
-
-/*
- * Useful constants
- */
-extern char *mnttab_file_name; /* Mount table */
-extern char *cpu; /* "CPU type" */
-extern char *endian; /* "big" */
-extern char *hostdomain; /* "southseas.nz" */
-extern char copyright[]; /* Copyright info */
-extern char version[]; /* Version info */
-
-/*
- * Global variables.
- */
-extern AUTH *nfs_auth; /* Dummy authorization for remote servers */
-extern FILE *logfp; /* Log file */
-extern SVCXPRT *nfsxprt;
-extern char *PrimNetName; /* Name of primary connected network */
-extern char *PrimNetNum; /* Name of primary connected network */
-extern char *SubsNetName; /* Name of subsidiary connected network */
-extern char *SubsNetNum; /* Name of subsidiary connected network */
-
-extern void am_set_progname(char *pn); /* "amd" */
-extern const char *am_get_progname(void); /* "amd" */
-extern void am_set_hostname(char *hn);
-extern const char *am_get_hostname(void);
-extern pid_t am_set_mypid(void);
-extern pid_t am_mypid;
-
-extern int foreground; /* Foreground process */
-extern int orig_umask; /* umask() on startup */
-extern int xlog_level; /* Logging level */
-extern int xlog_level_init;
-extern serv_state amd_state; /* Should we go now */
-extern struct in_addr myipaddr; /* (An) IP address of this host */
-extern struct opt_tab xlog_opt[];
-extern u_short nfs_port; /* Our NFS service port */
-
-/*
- * Global routines
- */
-extern CLIENT *get_mount_client(char *unused_host, struct sockaddr_in *sin, struct timeval *tv, int *sock, u_long mnt_version);
-extern RETSIGTYPE sigchld(int);
-extern bool_t xdr_amq_string(XDR *xdrs, amq_string *objp);
-extern bool_t xdr_dirpath(XDR *xdrs, dirpath *objp);
-extern char **strsplit(char *, int, int);
-extern char *expand_selectors(char *);
-extern char *get_version_string(void);
-extern char *inet_dquad(char *, size_t, u_long);
-extern char *print_wires(void);
-extern char *str3cat(char *, char *, char *, char *);
-extern char *strealloc(char *, char *);
-extern char *strip_selectors(char *, char *);
-extern char *strnsave(const char *, int);
-extern int amu_close(int fd);
-extern int bind_resv_port(int, u_short *);
-extern int cmdoption(char *, struct opt_tab *, int *);
-extern int compute_automounter_mount_flags(mntent_t *);
-extern int compute_mount_flags(mntent_t *);
-extern int get_amd_program_number(void);
-extern int getcreds(struct svc_req *, uid_t *, gid_t *, SVCXPRT *);
-extern int hasmntval(mntent_t *, char *);
-extern unsigned int hasmntvalerr(mntent_t *, char *, int *);
-extern char *hasmntstr(mntent_t *, char *);
-extern char *hasmnteq(mntent_t *, char *);
-extern char *haseq(char *);
-extern int is_network_member(const char *net);
-extern int is_interface_local(u_long);
-extern int islocalnet(u_long);
-extern int make_rpc_packet(char *, int, u_long, struct rpc_msg *, voidp, XDRPROC_T_TYPE, AUTH *);
-extern int mkdirs(char *, int);
-extern int mount_fs(mntent_t *, int, caddr_t, int, MTYPE_TYPE, u_long, const char *, const char *, int);
-extern void nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp);
-extern int pickup_rpc_reply(voidp, int, voidp, XDRPROC_T_TYPE);
-extern int switch_option(char *);
-extern int switch_to_logfile(char *logfile, int orig_umask, int truncate_log);
-extern mntlist *read_mtab(char *, const char *);
-#ifndef HAVE_TRANSPORT_TYPE_TLI
-extern struct sockaddr_in *amu_svc_getcaller(SVCXPRT *xprt);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-extern time_t time(time_t *);
-extern void amu_get_myaddress(struct in_addr *iap, const char *preferred_localhost);
-extern void amu_release_controlling_tty(void);
-extern void compute_automounter_nfs_args(nfs_args_t *nap, mntent_t *mntp);
-extern void discard_mntlist(mntlist *mp);
-extern void free_mntlist(mntlist *);
-extern void getwire(char **name1, char **number1);
-extern void going_down(int);
-extern void mnt_free(mntent_t *);
-extern void plog(int, const char *,...)
- __attribute__ ((__format__ (__printf__, 2, 3)));
-extern void rmdirs(char *);
-extern void rpc_msg_init(struct rpc_msg *, u_long, u_long, u_long);
-extern void set_amd_program_number(int program);
-extern void show_opts(int ch, struct opt_tab *);
-extern void unregister_amq(void);
-extern voidp xmalloc(int);
-extern voidp xrealloc(voidp, int);
-extern voidp xzalloc(int);
-extern int check_pmap_up(char *host, struct sockaddr_in* sin);
-extern u_long get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto);
-extern long get_server_pid(void);
-extern void setup_sighandler(int signum, void (*handler)(int));
-extern time_t clocktime(nfstime *nt);
-
-#if defined(DEBUG) && (defined(HAVE_C99_VARARGS_MACROS) || defined(HAVE_GCC_VARARGS_MACROS))
-# ifdef HAVE_C99_VARARGS_MACROS
-#define xsnprintf(str,size,fmt,...) _xsnprintf(__FILE__,__LINE__,(str),(size),(fmt),__VA_ARGS__)
-# endif /* HAVE_C99_VARARGS_MACROS */
-# ifdef HAVE_GCC_VARARGS_MACROS
-#define xsnprintf(str,size,fmt,args...) _xsnprintf(__FILE__,__LINE__,(str),(size),(fmt),args)
-# endif /* HAVE_GCC_VARARGS_MACROS */
-extern int _xsnprintf(const char *filename, int lineno, char *str, size_t size, const char *format, ...);
-#define xvsnprintf(str,size,fmt,ap) _xvsnprintf(__FILE__,__LINE__,(str),(size),(fmt),(ap))
-extern int _xvsnprintf(const char *filename, int lineno, char *str, size_t size, const char *format, va_list ap);
-#else /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
-extern int xsnprintf(char *str, size_t size, const char *format, ...);
-extern int xvsnprintf(char *str, size_t size, const char *format, va_list ap);
-#endif /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
-
-#ifdef DEBUG
-extern void _xstrlcat(const char *filename, int lineno, char *dst, const char *src, size_t len);
-# define xstrlcat(d,s,l) _xstrlcat(__FILE__,__LINE__,(d),(s),(l))
-extern void _xstrlcpy(const char *filename, int lineno, char *dst, const char *src, size_t len);
-# define xstrlcpy(d,s,l) _xstrlcpy(__FILE__,__LINE__,(d),(s),(l))
-#else /* not DEBUG */
-extern void xstrlcat(char *dst, const char *src, size_t len);
-extern void xstrlcpy(char *dst, const char *src, size_t len);
-#endif /* not DEBUG */
-
-#ifdef MOUNT_TABLE_ON_FILE
-extern void rewrite_mtab(mntlist *, const char *);
-extern void unlock_mntlist(void);
-extern void write_mntent(mntent_t *, const char *);
-#endif /* MOUNT_TABLE_ON_FILE */
-
-#if defined(HAVE_SYSLOG_H) || defined(HAVE_SYS_SYSLOG_H)
-extern int syslogging;
-#endif /* defined(HAVE_SYSLOG_H) || defined(HAVE_SYS_SYSLOG_H) */
-
-extern void compute_nfs_args(nfs_args_t *nap, mntent_t *mntp, int genflags, struct netconfig *nfsncp, struct sockaddr_in *ip_addr, u_long nfs_version, char *nfs_proto, am_nfs_handle_t *fhp, char *host_name, char *fs_name);
-extern int create_amq_service(int *udp_soAMQp, SVCXPRT **udp_amqpp, struct netconfig **udp_amqncpp, int *tcp_soAMQp, SVCXPRT **tcp_amqpp, struct netconfig **tcp_amqncpp, u_short preferred_amq_port);
-extern int create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp));
-extern int amu_svc_register(SVCXPRT *, u_long, u_long, void (*)(struct svc_req *, SVCXPRT *), u_long, struct netconfig *);
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
-
-extern int get_knetconfig(struct knetconfig **kncpp, struct netconfig *in_ncp, char *nc_protoname);
-extern struct netconfig *nfsncp;
-extern void free_knetconfig(struct knetconfig *kncp);
-
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
-#ifdef HAVE_FS_AUTOFS
-extern int register_autofs_service(char *autofs_conftype, void (*autofs_dispatch)(struct svc_req *rqstp, SVCXPRT *xprt));
-extern int unregister_autofs_service(char *autofs_conftype);
-#endif /* HAVE_FS_AUTOFS */
-
-
-#ifndef HAVE_STRUCT_FHSTATUS_FHS_FH
-# define fhs_fh fhstatus_u.fhs_fhandle
-#endif /* not HAVE_STRUCT_FHSTATUS_FHS_FH */
-
-
-/*
- * Network File System: the new generation
- * NFS V.3
- */
-#ifdef HAVE_FS_NFS3
-# ifndef NFS_VERSION3
-# define NFS_VERSION3 ((u_int) 3)
-# endif /* not NFS_VERSION3 */
-#endif /* HAVE_FS_NFS3 */
-
-
-/**************************************************************************/
-/*** DEBUGGING ***/
-/**************************************************************************/
-
-/*
- * DEBUGGING:
- */
-
-#ifdef DEBUG
-
-# define D_ALL (~(D_MTAB|D_HRTIME|D_XDRTRACE|D_DAEMON|D_FORK|D_AMQ))
-# define D_DAEMON 0x0001 /* Don't enter daemon mode */
-# define D_TRACE 0x0002 /* Do protocol trace */
-# define D_FULL 0x0004 /* Do full trace */
-# define D_MTAB 0x0008 /* Use local mtab */
-# define D_AMQ 0x0010 /* Don't register amq program */
-# define D_STR 0x0020 /* Debug string munging */
-# ifdef DEBUG_MEM
-# define D_MEM 0x0040 /* Trace memory allocations */
-# else /* not DEBUG_MEM */
-# define D_MEM 0x0000 /* Dummy */
-# endif /* not DEBUG_MEM */
-# define D_FORK 0x0080 /* Don't fork server */
- /* info service specific debugging (hesiod, nis, etc) */
-# define D_INFO 0x0100
-# define D_HRTIME 0x0200 /* Print high resolution time stamps */
-# define D_XDRTRACE 0x0400 /* Trace xdr routines */
-# define D_READDIR 0x0800 /* Show browsable_dir progress */
-
-/*
- * Test mode is test mode: don't daemonize, don't register amq, don't fork,
- * don't touch system mtab, etc.
- */
-# define D_TEST (~(D_MEM|D_STR|D_XDRTRACE))
-
-# define amuDebug(x) (debug_flags & (x))
-# define dlog if (amuDebug(D_FULL)) dplog
-
-/* my favorite debugging tool -Erez */
-#define EZKDBG plog(XLOG_INFO,"EZK:%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__)
-
-# ifdef DEBUG_MEM
-/*
- * If debugging memory, then call a special freeing function that logs
- * more info, and resets the pointer to NULL so it cannot be used again.
- */
-# define XFREE(x) dxfree(__FILE__,__LINE__,x)
-extern void dxfree(char *file, int line, voidp ptr);
-extern void malloc_verify(void);
-# else /* not DEBUG_MEM */
-/*
- * If regular debugging, then free the pointer and reset to NULL.
- * This should remain so for as long as am-utils is in alpha/beta testing.
- */
-# define XFREE(x) do { free((voidp)x); x = NULL;} while (0)
-# endif /* not DEBUG_MEM */
-
-/* functions that depend solely on debugging */
-extern void print_nfs_args(const nfs_args_t *nap, u_long nfs_version);
-extern int debug_option (char *opt);
-extern void dplog(const char *fmt, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
-
-#else /* not DEBUG */
-
-/*
- * If not debugging, then also reset the pointer.
- * It's safer -- and besides, free() should do that anyway.
- */
-# define XFREE(x) do { free((voidp)x); x = NULL;} while (0)
-
-#define amuDebug(x) (0)
-
-#ifdef __GNUC__
-#define dlog(fmt...)
-#else /* not __GNUC__ */
-/* this define means that we CCP leaves code behind the (list,of,args) */
-#define dlog
-#endif /* not __GNUC__ */
-
-#define print_nfs_args(nap, nfs_version)
-#define debug_option(x) (1)
-
-#endif /* not DEBUG */
-
-extern int debug_flags; /* Debug options */
-extern struct opt_tab dbg_opt[];
-
-/**************************************************************************/
-/*** MISC (stuff left to autoconfiscate) ***/
-/**************************************************************************/
-
-#endif /* not _AM_UTILS_H */
diff --git a/contrib/amd/include/am_xdr_func.h b/contrib/amd/include/am_xdr_func.h
deleted file mode 100644
index c4159188c799..000000000000
--- a/contrib/amd/include/am_xdr_func.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/am_xdr_func.h
- *
- */
-
-#ifdef HAVE_FS_NFS3
-
-#define AM_FHSIZE3 64 /* size in bytes of a file handle (v3) */
-#define AM_MOUNTVERS3 ((unsigned long)(3))
-
-/* NFSv3 handle */
-struct am_nfs_fh3 {
- u_int am_fh3_length;
- char am_fh3_data[AM_FHSIZE3];
-};
-typedef struct am_nfs_fh3 am_nfs_fh3;
-
-#define AM_NFSPROC3_LOOKUP ((u_long) 3)
-enum am_nfsstat3 {
- AM_NFS3_OK = 0,
- AM_NFS3ERR_PERM = 1,
- AM_NFS3ERR_NOENT = 2,
- AM_NFS3ERR_IO = 5,
- AM_NFS3ERR_NXIO = 6,
- AM_NFS3ERR_ACCES = 13,
- AM_NFS3ERR_EXIST = 17,
- AM_NFS3ERR_XDEV = 18,
- AM_NFS3ERR_NODEV = 19,
- AM_NFS3ERR_NOTDIR = 20,
- AM_NFS3ERR_ISDIR = 21,
- AM_NFS3ERR_INVAL = 22,
- AM_NFS3ERR_FBIG = 27,
- AM_NFS3ERR_NOSPC = 28,
- AM_NFS3ERR_ROFS = 30,
- AM_NFS3ERR_MLINK = 31,
- AM_NFS3ERR_NAMETOOLONG = 63,
- AM_NFS3ERR_NOTEMPTY = 66,
- AM_NFS3ERR_DQUOT = 69,
- AM_NFS3ERR_STALE = 70,
- AM_NFS3ERR_REMOTE = 71,
- AM_NFS3ERR_BADHANDLE = 10001,
- AM_NFS3ERR_NOT_SYNC = 10002,
- AM_NFS3ERR_BAD_COOKIE = 10003,
- AM_NFS3ERR_NOTSUPP = 10004,
- AM_NFS3ERR_TOOSMALL = 10005,
- AM_NFS3ERR_SERVERFAULT = 10006,
- AM_NFS3ERR_BADTYPE = 10007,
- AM_NFS3ERR_JUKEBOX = 10008
-};
-typedef enum am_nfsstat3 am_nfsstat3;
-
-typedef struct {
- u_int fhandle3_len;
- char *fhandle3_val;
-} am_fhandle3;
-
-enum am_mountstat3 {
- AM_MNT3_OK = 0,
- AM_MNT3ERR_PERM = 1,
- AM_MNT3ERR_NOENT = 2,
- AM_MNT3ERR_IO = 5,
- AM_MNT3ERR_ACCES = 13,
- AM_MNT3ERR_NOTDIR = 20,
- AM_MNT3ERR_INVAL = 22,
- AM_MNT3ERR_NAMETOOLONG = 63,
- AM_MNT3ERR_NOTSUPP = 10004,
- AM_MNT3ERR_SERVERFAULT = 10006
-};
-typedef enum am_mountstat3 am_mountstat3;
-
-struct am_mountres3_ok {
- am_fhandle3 fhandle;
- struct {
- u_int auth_flavors_len;
- int *auth_flavors_val;
- } auth_flavors;
-};
-typedef struct am_mountres3_ok am_mountres3_ok;
-
-struct am_mountres3 {
- am_mountstat3 fhs_status;
- union {
- am_mountres3_ok mountinfo;
- } mountres3_u;
-};
-typedef struct am_mountres3 am_mountres3;
-
-typedef char *am_filename3;
-
-struct am_diropargs3 {
- am_nfs_fh3 dir;
- am_filename3 name;
-};
-typedef struct am_diropargs3 am_diropargs3;
-
-struct am_LOOKUP3args {
- am_diropargs3 what;
-};
-typedef struct am_LOOKUP3args am_LOOKUP3args;
-
-struct am_LOOKUP3resok {
- am_nfs_fh3 object;
-#if 0
- post_op_attr obj_attributes;
- post_op_attr dir_attributes;
-#endif
-};
-typedef struct am_LOOKUP3resok am_LOOKUP3resok;
-
-struct am_LOOKUP3resfail {
-#if 0
- post_op_attr dir_attributes;
-#else
- char dummy; /* cannot have an empty declaration */
-#endif
-};
-typedef struct am_LOOKUP3resfail am_LOOKUP3resfail;
-
-struct am_LOOKUP3res {
- am_nfsstat3 status;
- union {
- am_LOOKUP3resok ok;
- am_LOOKUP3resfail fail;
- } res_u;
-};
-typedef struct am_LOOKUP3res am_LOOKUP3res;
-#endif /* HAVE_FS_NFS3 */
-
-/*
- * Multi-protocol NFS file handle
- */
-union am_nfs_handle {
- /* placeholder for V4 file handle */
-#ifdef HAVE_FS_NFS3
- am_nfs_fh3 v3; /* NFS version 3 handle */
-#endif /* HAVE_FS_NFS3 */
- am_nfs_fh v2; /* NFS version 2 handle */
-};
-typedef union am_nfs_handle am_nfs_handle_t;
-
-
-/*
- * Definitions of all possible xdr functions that are otherwise
- * not defined elsewhere.
- */
-
-#ifndef _AM_XDR_FUNC_H
-#define _AM_XDR_FUNC_H
-
-#ifndef HAVE_XDR_ATTRSTAT
-bool_t xdr_attrstat(XDR *xdrs, nfsattrstat *objp);
-#endif /* not HAVE_XDR_ATTRSTAT */
-#ifndef HAVE_XDR_CREATEARGS
-bool_t xdr_createargs(XDR *xdrs, nfscreateargs *objp);
-#endif /* not HAVE_XDR_CREATEARGS */
-#ifndef HAVE_XDR_DIRLIST
-bool_t xdr_dirlist(XDR *xdrs, nfsdirlist *objp);
-#endif /* not HAVE_XDR_DIRLIST */
-#ifndef HAVE_XDR_DIROPARGS
-bool_t xdr_diropargs(XDR *xdrs, nfsdiropargs *objp);
-#endif /* not HAVE_XDR_DIROPARGS */
-#ifndef HAVE_XDR_DIROPOKRES
-bool_t xdr_diropokres(XDR *xdrs, nfsdiropokres *objp);
-#endif /* not HAVE_XDR_DIROPOKRES */
-#ifndef HAVE_XDR_DIROPRES
-bool_t xdr_diropres(XDR *xdrs, nfsdiropres *objp);
-#endif /* not HAVE_XDR_DIROPRES */
-#ifndef HAVE_XDR_DIRPATH
-bool_t xdr_dirpath(XDR *xdrs, dirpath *objp);
-#endif /* not HAVE_XDR_DIRPATH */
-#ifndef HAVE_XDR_ENTRY
-bool_t xdr_entry(XDR *xdrs, nfsentry *objp);
-#endif /* not HAVE_XDR_ENTRY */
-#ifndef HAVE_XDR_EXPORTNODE
-bool_t xdr_exportnode(XDR *xdrs, exportnode *objp);
-#endif /* not HAVE_XDR_EXPORTNODE */
-#ifndef HAVE_XDR_EXPORTS
-bool_t xdr_exports(XDR *xdrs, exports *objp);
-#endif /* not HAVE_XDR_EXPORTS */
-#ifndef HAVE_XDR_FATTR
-bool_t xdr_fattr(XDR *xdrs, nfsfattr *objp);
-#endif /* not HAVE_XDR_FATTR */
-#ifndef HAVE_XDR_FHANDLE
-bool_t xdr_fhandle(XDR *xdrs, fhandle objp);
-#endif /* not HAVE_XDR_FHANDLE */
-#ifndef HAVE_XDR_FHSTATUS
-bool_t xdr_fhstatus(XDR *xdrs, fhstatus *objp);
-#endif /* not HAVE_XDR_FHSTATUS */
-#ifndef HAVE_XDR_FILENAME
-bool_t xdr_filename(XDR *xdrs, filename *objp);
-#endif /* not HAVE_XDR_FILENAME */
-#ifndef HAVE_XDR_FTYPE
-bool_t xdr_ftype(XDR *xdrs, nfsftype *objp);
-#endif /* not HAVE_XDR_FTYPE */
-#ifndef HAVE_XDR_GROUPNODE
-bool_t xdr_groupnode(XDR *xdrs, groupnode *objp);
-#endif /* not HAVE_XDR_GROUPNODE */
-#ifndef HAVE_XDR_GROUPS
-bool_t xdr_groups(XDR *xdrs, groups *objp);
-#endif /* not HAVE_XDR_GROUPS */
-#ifndef HAVE_XDR_LINKARGS
-bool_t xdr_linkargs(XDR *xdrs, nfslinkargs *objp);
-#endif /* not HAVE_XDR_LINKARGS */
-#ifndef HAVE_XDR_MOUNTBODY
-bool_t xdr_mountbody(XDR *xdrs, mountbody *objp);
-#endif /* not HAVE_XDR_MOUNTBODY */
-#ifndef HAVE_XDR_MOUNTLIST
-bool_t xdr_mountlist(XDR *xdrs, mountlist *objp);
-#endif /* not HAVE_XDR_MOUNTLIST */
-#ifndef HAVE_XDR_NAME
-bool_t xdr_name(XDR *xdrs, name *objp);
-#endif /* not HAVE_XDR_NAME */
-#ifndef HAVE_XDR_NFS_FH
-bool_t xdr_nfs_fh(XDR *xdrs, am_nfs_fh *objp);
-#endif /* not HAVE_XDR_NFS_FH */
-#ifndef HAVE_XDR_NFSCOOKIE
-bool_t xdr_nfscookie(XDR *xdrs, nfscookie objp);
-#endif /* not HAVE_XDR_NFSCOOKIE */
-#ifndef HAVE_XDR_NFSPATH
-bool_t xdr_nfspath(XDR *xdrs, nfspath *objp);
-#endif /* not HAVE_XDR_NFSPATH */
-#ifndef HAVE_XDR_NFSSTAT
-bool_t xdr_nfsstat(XDR *xdrs, nfsstat *objp);
-#endif /* not HAVE_XDR_NFSSTAT */
-#ifndef HAVE_XDR_NFSTIME
-bool_t xdr_nfstime(XDR *xdrs, nfstime *objp);
-#endif /* not HAVE_XDR_NFSTIME */
-#ifndef HAVE_XDR_POINTER
-bool_t xdr_pointer(register XDR *xdrs, char **objpp, u_int obj_size, XDRPROC_T_TYPE xdr_obj);
-#endif /* not HAVE_XDR_POINTER */
-#ifndef HAVE_XDR_READARGS
-bool_t xdr_readargs(XDR *xdrs, nfsreadargs *objp);
-#endif /* not HAVE_XDR_READARGS */
-#ifndef HAVE_XDR_READDIRARGS
-bool_t xdr_readdirargs(XDR *xdrs, nfsreaddirargs *objp);
-#endif /* not HAVE_XDR_READDIRARGS */
-#ifndef HAVE_XDR_READDIRRES
-bool_t xdr_readdirres(XDR *xdrs, nfsreaddirres *objp);
-#endif /* not HAVE_XDR_READDIRRES */
-#ifndef HAVE_XDR_READLINKRES
-bool_t xdr_readlinkres(XDR *xdrs, nfsreadlinkres *objp);
-#endif /* not HAVE_XDR_READLINKRES */
-#ifndef HAVE_XDR_READOKRES
-bool_t xdr_readokres(XDR *xdrs, nfsreadokres *objp);
-#endif /* not HAVE_XDR_READOKRES */
-#ifndef HAVE_XDR_READRES
-bool_t xdr_readres(XDR *xdrs, nfsreadres *objp);
-#endif /* not HAVE_XDR_READRES */
-#ifndef HAVE_XDR_RENAMEARGS
-bool_t xdr_renameargs(XDR *xdrs, nfsrenameargs *objp);
-#endif /* not HAVE_XDR_RENAMEARGS */
-#ifndef HAVE_XDR_SATTR
-bool_t xdr_sattr(XDR *xdrs, nfssattr *objp);
-#endif /* not HAVE_XDR_SATTR */
-#ifndef HAVE_XDR_SATTRARGS
-bool_t xdr_sattrargs(XDR *xdrs, nfssattrargs *objp);
-#endif /* not HAVE_XDR_SATTRARGS */
-#ifndef HAVE_XDR_STATFSOKRES
-bool_t xdr_statfsokres(XDR *xdrs, nfsstatfsokres *objp);
-#endif /* not HAVE_XDR_STATFSOKRES */
-#ifndef HAVE_XDR_STATFSRES
-bool_t xdr_statfsres(XDR *xdrs, nfsstatfsres *objp);
-#endif /* not HAVE_XDR_STATFSRES */
-#ifndef HAVE_XDR_SYMLINKARGS
-bool_t xdr_symlinkargs(XDR *xdrs, nfssymlinkargs *objp);
-#endif /* not HAVE_XDR_SYMLINKARGS */
-#ifndef HAVE_XDR_WRITEARGS
-bool_t xdr_writeargs(XDR *xdrs, nfswriteargs *objp);
-#endif /* not HAVE_XDR_WRITEARGS */
-
-/*
- * NFS3 XDR FUNCTIONS:
- */
-#ifdef HAVE_FS_NFS3
-bool_t xdr_am_fhandle3(XDR *xdrs, am_fhandle3 *objp);
-bool_t xdr_am_mountstat3(XDR *xdrs, am_mountstat3 *objp);
-bool_t xdr_am_mountres3_ok(XDR *xdrs, am_mountres3_ok *objp);
-bool_t xdr_am_mountres3(XDR *xdrs, am_mountres3 *objp);
-bool_t xdr_am_diropargs3(XDR *xdrs, am_diropargs3 *objp);
-bool_t xdr_am_filename3(XDR *xdrs, am_filename3 *objp);
-bool_t xdr_am_LOOKUP3args(XDR *xdrs, am_LOOKUP3args *objp);
-bool_t xdr_am_LOOKUP3res(XDR *xdrs, am_LOOKUP3res *objp);
-bool_t xdr_am_LOOKUP3resfail(XDR *xdrs, am_LOOKUP3resfail *objp);
-bool_t xdr_am_LOOKUP3resok(XDR *xdrs, am_LOOKUP3resok *objp);
-bool_t xdr_am_nfsstat3(XDR *xdrs, am_nfsstat3 *objp);
-bool_t xdr_am_nfs_fh3(XDR *xdrs, am_nfs_fh3 *objp);
-#endif /* HAVE_FS_NFS3 */
-
-#endif /* not _AM_XDR_FUNC_H */
diff --git a/contrib/amd/include/amq_defs.h b/contrib/amd/include/amq_defs.h
deleted file mode 100644
index 75c465171033..000000000000
--- a/contrib/amd/include/amq_defs.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/amq_defs.h
- *
- */
-
-#ifndef _AMQ_DEFS_H
-#define _AMQ_DEFS_H
-
-/*
- * MACROS
- */
-#ifndef AMQ_SIZE
-# define AMQ_SIZE 16384
-#endif /* not AMQ_SIZE */
-#define AMQ_STRLEN 16384
-#define AMQ_PROGRAM ((u_long)300019)
-#define AMQ_VERSION ((u_long)1)
-#define AMQPROC_NULL ((u_long)0)
-#define AMQPROC_MNTTREE ((u_long)1)
-#define AMQPROC_UMNT ((u_long)2)
-#define AMQPROC_STATS ((u_long)3)
-#define AMQPROC_EXPORT ((u_long)4)
-#define AMQPROC_SETOPT ((u_long)5)
-#define AMQPROC_GETMNTFS ((u_long)6)
-#define AMQPROC_MOUNT ((u_long)7)
-#define AMQPROC_GETVERS ((u_long)8)
-#define AMQPROC_GETPID ((u_long)9)
-#define AMQPROC_PAWD ((u_long)10)
-
-/*
- * TYPEDEFS
- */
-typedef long *time_type;
-typedef struct amq_mount_info amq_mount_info;
-typedef struct amq_mount_stats amq_mount_stats;
-typedef struct amq_mount_tree amq_mount_tree;
-typedef struct amq_setopt amq_setopt;
-typedef amq_mount_tree *amq_mount_tree_p;
-
-/*
- * STRUCTURES:
- */
-struct amq_mount_tree {
- amq_string mt_mountinfo;
- amq_string mt_directory;
- amq_string mt_mountpoint;
- amq_string mt_type;
- time_type mt_mounttime;
- u_short mt_mountuid;
- int mt_getattr;
- int mt_lookup;
- int mt_readdir;
- int mt_readlink;
- int mt_statfs;
- struct amq_mount_tree *mt_next;
- struct amq_mount_tree *mt_child;
-};
-
-struct amq_mount_info {
- amq_string mi_type;
- amq_string mi_mountpt;
- amq_string mi_mountinfo;
- amq_string mi_fserver;
- int mi_error;
- int mi_refc;
- int mi_up;
-};
-
-typedef struct {
- u_int amq_mount_info_list_len;
- amq_mount_info *amq_mount_info_list_val;
-} amq_mount_info_list;
-
-typedef struct {
- u_int amq_mount_tree_list_len;
- amq_mount_tree_p *amq_mount_tree_list_val;
-} amq_mount_tree_list;
-
-struct amq_mount_stats {
- int as_drops;
- int as_stale;
- int as_mok;
- int as_merr;
- int as_uerr;
-};
-
-enum amq_opt {
- AMOPT_DEBUG = 0,
- AMOPT_LOGFILE = 1,
- AMOPT_XLOG = 2,
- AMOPT_FLUSHMAPC = 3
-};
-typedef enum amq_opt amq_opt; /* enum typedefs should be after enum */
-
-struct amq_setopt {
- amq_opt as_opt;
- amq_string as_str;
-};
-
-/*
- * EXTERNALS:
- *
- * external definitions for amqproc_*_1() have been moved off to private
- * headers in lib/amu.h, amd/amd.h, etc. They have to be private since the
- * same named functions appear in different places with different prototypes
- * an functionality.
- */
-extern bool_t xdr_amq_mount_info(XDR *xdrs, amq_mount_info *objp);
-extern bool_t xdr_amq_mount_info_list(XDR *xdrs, amq_mount_info_list *objp);
-extern bool_t xdr_amq_mount_stats(XDR *xdrs, amq_mount_stats *objp);
-extern bool_t xdr_amq_mount_tree(XDR *xdrs, amq_mount_tree *objp);
-extern bool_t xdr_amq_mount_tree_list(XDR *xdrs, amq_mount_tree_list *objp);
-extern bool_t xdr_amq_mount_tree_p(XDR *xdrs, amq_mount_tree_p *objp);
-extern bool_t xdr_amq_opt(XDR *xdrs, amq_opt *objp);
-extern bool_t xdr_amq_setopt(XDR *xdrs, amq_setopt *objp);
-extern bool_t xdr_pri_free(XDRPROC_T_TYPE xdr_args, caddr_t args_ptr);
-extern bool_t xdr_time_type(XDR *xdrs, time_type *objp);
-
-#endif /* not _AMQ_DEFS_H */
diff --git a/contrib/amd/include/mount_headers1.h b/contrib/amd/include/mount_headers1.h
deleted file mode 100644
index 41f26e59f99d..000000000000
--- a/contrib/amd/include/mount_headers1.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/mount_headers1.h
- *
- */
-
-
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif /* HAVE_SYS_TYPES_H */
-#ifdef HAVE_SYS_ERRNO_H
-# include <sys/errno.h>
-#endif /* HAVE_SYS_ERRNO_H */
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif /* HAVE_SYS_PARAM_H */
-#ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif /* HAVE_SYS_TIME_H */
-#ifdef HAVE_SYS_UCRED_H
-# include <sys/ucred.h>
-#endif /* HAVE_SYS_UCRED_H */
-#ifdef HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif /* HAVE_SYS_SOCKET_H */
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif /* HAVE_NETINET_IN_H */
-#ifdef HAVE_NET_IF_H
-# include <net/if.h>
-#endif /* HAVE_NET_IF_H */
-#ifdef HAVE_STDIO_H
-# include <stdio.h>
-#endif /* HAVE_STDIO_H */
-
-#ifndef KERNEL
-# define KERNEL_off_for_now_breaks_FreeBSD
-#endif /* not KERNEL */
-
-#ifdef HAVE_SYS_MNTENT_H
-# include <sys/mntent.h>
-#endif /* HAVE_SYS_MNTENT_H */
-#ifdef HAVE_MNTENT_H
-# include <mntent.h>
-#endif /* HAVE_MNTENT_H */
-#ifdef HAVE_SYS_MNTTAB_H
-# include <sys/mnttab.h>
-#endif /* HAVE_SYS_MNTTAB_H */
-#if defined(HAVE_MNTTAB_H) && !defined(MNTTAB)
-/*
- * Do not include it if MNTTAB is already defined because it probably
- * came from <sys/mnttab.h> and we do not want conflicting definitions.
- */
-# include <mnttab.h>
-#endif /* defined(HAVE_MNTTAB_H) && !defined(MNTTAB) */
-
-#ifdef HAVE_SYS_MOUNT_H
-# ifndef NFSCLIENT
-# define NFSCLIENT
-# endif /* not NFSCLIENT */
-# ifndef PCFS
-# define PCFS
-# endif /* not PCFS */
-# ifndef LOFS
-# define LOFS
-# endif /* not LOFS */
-# ifndef RFS
-# define RFS
-# endif /* not RFS */
-# ifndef MSDOSFS
-# define MSDOSFS
-# endif /* not MSDOSFS */
-# ifndef MFS
-# define MFS 1
-# endif /* not MFS */
-# ifndef CD9660
-# define CD9660
-# endif /* not CD9660 */
-# ifndef NFS
-# define NFS
-# endif /* not NFS */
-# include <sys/mount.h>
-#endif /* HAVE_SYS_MOUNT_H */
-
-#ifdef HAVE_SYS_VMOUNT_H
-# include <sys/vmount.h>
-#endif /* HAVE_SYS_VMOUNT_H */
-
-/*
- * There is no point in including this on a glibc2 system
- * we're only asking for trouble
- */
-#if defined HAVE_LINUX_FS_H && (!defined __GLIBC__ || __GLIBC__ < 2)
-/*
- * There's a conflict of definitions on redhat alpha linux between
- * <netinet/in.h> and <linux/fs.h>.
- * Also a conflict in definitions of ntohl/htonl in RH-5.1 sparc64
- * between <netinet/in.h> and <linux/byteorder/generic.h> (2.1 kernels).
- */
-# ifdef HAVE_SOCKETBITS_H
-# define _LINUX_SOCKET_H
-# undef BLKFLSBUF
-# undef BLKGETSIZE
-# undef BLKRAGET
-# undef BLKRASET
-# undef BLKROGET
-# undef BLKROSET
-# undef BLKRRPART
-# undef MS_MGC_VAL
-# undef MS_RMT_MASK
-# endif /* HAVE_SOCKETBITS_H */
-# ifdef HAVE_LINUX_POSIX_TYPES_H
-# include <linux/posix_types.h>
-# endif /* HAVE_LINUX_POSIX_TYPES_H */
-# ifndef _LINUX_BYTEORDER_GENERIC_H
-# define _LINUX_BYTEORDER_GENERIC_H
-# endif /* _LINUX_BYTEORDER_GENERIC_H */
-# ifndef _LINUX_STRING_H_
-# define _LINUX_STRING_H_
-# endif /* not _LINUX_STRING_H_ */
-# ifdef HAVE_LINUX_KDEV_T_H
-# define __KERNEL__
-# include <linux/kdev_t.h>
-# undef __KERNEL__
-# endif /* HAVE_LINUX_KDEV_T_H */
-# ifdef HAVE_LINUX_LIST_H
-# define __KERNEL__
-# include <linux/list.h>
-# undef __KERNEL__
-# endif /* HAVE_LINUX_LIST_H */
-# include <linux/fs.h>
-#endif /* HAVE_LINUX_FS_H && (!__GLIBC__ || __GLIBC__ < 2) */
-
-#ifdef HAVE_SYS_FS_TYPES_H
-# include <sys/fs_types.h>
-#endif /* HAVE_SYS_FS_TYPES_H */
-
-#ifdef HAVE_UFS_UFS_MOUNT_H
-# include <ufs/ufs_mount.h>
-#endif /* HAVE_UFS_UFS_MOUNT_H */
-#ifdef HAVE_UFS_UFS_UFSMOUNT_H_off
-# error do not include this file here because on *bsd it
-# error causes errors with other header files. Instead, add it to the
-# error specific conf/nfs_prot_*.h file.
-# include <ufs/ufs/ufsmount.h>
-#endif /* HAVE_UFS_UFS_UFSMOUNT_H_off */
-
-#ifdef HAVE_CDFS_CDFS_MOUNT_H
-# include <cdfs/cdfs_mount.h>
-#endif /* HAVE_CDFS_CDFS_MOUNT_H */
-#ifdef HAVE_CDFS_CDFSMOUNT_H
-# include <cdfs/cdfsmount.h>
-#endif /* HAVE_CDFS_CDFSMOUNT_H */
-#ifdef HAVE_ISOFS_CD9660_CD9660_MOUNT_H
-# include <isofs/cd9660/cd9660_mount.h>
-#endif /* HAVE_ISOFS_CD9660_CD9660_MOUNT_H */
-
-#ifdef HAVE_SYS_FS_PC_FS_H
-# include <sys/fs/pc_fs.h>
-#endif /* HAVE_SYS_FS_PC_FS_H */
-#ifdef HAVE_MSDOSFS_MSDOSFSMOUNT_H
-# include <msdosfs/msdosfsmount.h>
-#endif /* HAVE_MSDOSFS_MSDOSFSMOUNT_H */
-#ifdef HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H
-# include <fs/msdosfs/msdosfsmount.h>
-#endif /* HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H */
-
-#ifdef HAVE_RPC_RPC_H
-# include <rpc/rpc.h>
-#endif /* HAVE_RPC_RPC_H */
-#ifdef HAVE_RPC_TYPES_H
-# include <rpc/types.h>
-#endif /* HAVE_RPC_TYPES_H */
-/* Prevent multiple inclusion on Ultrix 4 */
-#if defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__)
-# include <rpc/xdr.h>
-#endif /* defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__) */
-
-/* ALWAYS INCLUDE AM-UTILS' SPECIFIC NFS PROTOCOL HEADER NEXT! */
diff --git a/contrib/amd/include/mount_headers2.h b/contrib/amd/include/mount_headers2.h
deleted file mode 100644
index 273e89cae10c..000000000000
--- a/contrib/amd/include/mount_headers2.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/include/mount_headers2.h
- *
- */
-
-
-
-#ifdef HAVE_RPCSVC_MOUNT_H
-# include <rpcsvc/mount.h>
-#endif /* HAVE_RPCSVC_MOUNT_H */
-
-#ifdef HAVE_MOUNT_H
-# include <mount.h>
-#endif /* HAVE_MOUNT_H */
-
-#ifdef HAVE_NFS_NFS_GFS_H
-# include <nfs/nfs_gfs.h>
-#endif /* HAVE_NFS_NFS_GFS_H */
-
-#ifdef HAVE_NFS_MOUNT_H
-# include <nfs/mount.h>
-#endif /* HAVE_NFS_MOUNT_H */
-
-#ifdef HAVE_SYS_FS_NFS_CLNT_H
-# include <sys/fs/nfs_clnt.h>
-#endif /* HAVE_SYS_FS_NFS_CLNT_H */
-
-#ifdef HAVE_LINUX_NFS_MOUNT_H
-# ifndef _LINUX_NFS_H
-# define _LINUX_NFS_H
-# endif /* not _LINUX_NFS_H */
-# ifndef _LINUX_NFS2_H
-# define _LINUX_NFS2_H
-# endif /* not _LINUX_NFS2_H */
-# ifndef _LINUX_NFS3_H
-# define _LINUX_NFS3_H
-# endif /* not _LINUX_NFS3_H */
-# ifndef _LINUX_NFS_FS_H
-# define _LINUX_NFS_FS_H
-# endif /* not _LINUX_NFS_FS_H */
-# ifndef _LINUX_IN_H
-# define _LINUX_IN_H
-# endif /* not _LINUX_IN_H */
-# ifndef __KERNEL__
-# define __KERNEL__
-# endif /* __KERNEL__ */
-# include <linux/nfs_mount.h>
-# undef __KERNEL__
-#endif /* HAVE_LINUX_NFS_MOUNT_H */
diff --git a/contrib/amd/ldap-id.ms b/contrib/amd/ldap-id.ms
deleted file mode 100644
index 3c0d30856645..000000000000
--- a/contrib/amd/ldap-id.ms
+++ /dev/null
@@ -1,306 +0,0 @@
-.pl 10.0i
-.po 0
-.ll 8.5i
-.lt 8.5i
-.nr LL 8.5i
-.nr LT 8.5i
-.ds LF Johansson
-.ds RF [Page %]
-.ds CF
-.ds LH Internet draft
-.ds RH 30 March 1998
-.ds CH Berkeley AMD LDAP Schema
-.hy 0
-.ad l
-.in 0
-INTERNET-DRAFT Leif Johansson
-Intented Category: Experimental Stockholm University
-
-
-
-.ce
-A directory (X.500 and LDAPv3) schema for Berkely automounter
-
-
-.ti 0
-1. Status of this Memo
-
-.fi
-.in 3
-This memo describes a directory (LDAP or X.500) schema for storing
-amd (Berkely-style automounter) mount info maps. The schema is currently
-beeing supported by the (beta version of the) am-utils version 6 package
-[AMUTILS].
-
-.ti 0
-2. Overview and Rationale
-
-Directory services such as X.500 [X500] or LDAP [RFC2251] are a natural
-choice of repository for amd mount map databases. All Object Identifiers
-in this document are prefixed by amdSchema-id to be assigned later. The
-relation between this schema and the automount schema elements in [HOWARD]
-are mostly superficial. The model for the elements in [HOWARD] was the SUN
-automounter which has quite a different syntax for mount maps. Furthermore
-the intended usage of this schema differs from that of [HOWARD] in many
-respects.
-
-.ti 0
-3. DSA requirements
-
-Directory servers implementing this schema SHOULD maintain the
-modifyTimestamp operational attribute. If not the amdMapCacheTtl
-attribute SHOULD be set to 0 indicating to clients that caching of
-map entries SHOULD be turned off. Clients wishing to use the amdMap
-schema MAY use the modifyTimestamp information to set the ttl for
-internal caching schemes. A value of 0 for the amdMapCacheTtl must
-result in clients turning off any local caching.
-
-.ti 0
-4. Syntax definitions
-
-The following attribute syntax is defined in this document:
-
- amdlocationlist
-
-This syntax represents a amd map value. This is the syntax expressed
-in BNF using definitions from [RFC2252]:
-
- amdlocationlist = amdlocationselection |
- amdlocationlist whsp "||" whsp amdlocationselection
-
- amdlocationselection = amdlocation |
- amdlocationselection whsp amdlocation
-
- amdlocation = amdlocationinfo |
- "-" amdlocationinfo |
- "-"
-
- amdlocationinfo = seloropt |
- amdlocationinfo ";" seloropt |
- ";"
-
- seloropt = seletion |
- optass
-
- selection = keystring "==" printablestring
- keystring "!=" printablestring
-
- optass = keystring \":=\" printablestring
-
-X.500 servers or LDAPv3 servers (supporting the binary attribute
-option) may use the following syntax definition:
-
- AmdLocationList ::= SEQUENCE OF {
- SEQUENCE OF {
- location AmdLocation
- }
- }
-
- AmdLocation ::= SET OF {
- CHOICE {
- location [0] AmdLocationInfo
- notlocation [1] AmdLocationInfo
- not [2] NULL
- }
- }
-
- AmdLocationInfo ::= SET OF {
- CHOICE {
- selection [0] AmdSelection
- option [1] AmdOption
- }
- }
-
- AmdSelection ::= CHOICE {
- eq [0] AttributeAndValue
- ne [1] AttributeAndValue
- }
-
- AmdOption ::= AttributeAndValue
-
- AttributeAndValue ::= SEQUENCE {
- attribute IA5String
- value IA5String
- }
-
-.ti 0
-5. Attribute types
-
-The following attribute types are defined in this document:
-
- amdMapName
- amdMapCacheTtl
- amdMapEntry
- amdMapEntryKey
- amdMapEntryValue
-
- amdSchema-a OBJECT IDENTIFIER ::= { amdSchema-id 1 }
-
- amdMapName
- ATTRIBUTE ::= {
- WITH SYNTAX IA5String
- EQUALITY MATCHING RULE caseIgoreExactMatch
- --ID { amdSchema-a 1 }
- DESCRIPTION
- "This attribute is the symbolic and in the naming
- context unique name of an amd map. This corresponds
- in the case of a flat file database to the name of
- the file or the mount-point of the map."
- }
-
-
- amdMapCacheTtl
- ATTRIBUTE ::= {
- WITH SYNTAX Integer
- EQUALITY MATCHING RULE integerExactMatch
- --ID { amdSchema-a 2 }
- SINGLE VALUED
- DESCRIPTION
- "The maximum time-to-live for the entries in this
- map. After this many milliseconds the map has to
- be cleared from local caches and reloaded. A value
- of 0 disables caching."
- }
-
- amdMapEntry
- ATTRIBUTE ::= {
- WITH SYNTAX DistinguishedName
- EQUALITY MATHCING RULE dNCaseIgnoreExactMatch
- --ID { amdSchema-a 3 }
- DESCRIPTION
- "A multivalued attribute listing the distinguished
- names of the amdMapEntries making up this amdMap
- object."
- }
-
- amdMapEntryKey ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX IA5String
- EQUALITY MATCHING RULE stringExactMatch
- --ID { amdSchema-a 4 }
- SINGLE VALUED
- DESCRIPTION
- "The value of this attribute is usually the name of
- a mountpoint for this amdMapEntry."
- }
-
- amdMapEntryValue ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX AmdLocationList
- --ID { amdSchema-a 5 }
- DESCRIPTION
- "This is the actual mount information for the amdMapEntry
- using the syntax described above."
- }
-
- amdMapEntryKey ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX IA5String
- EQUALITY MATCHING RULE stringExactMatch
- --ID { amdSchema-a 4 }
- SINGLE VALUED
- DESCRIPTION
- "The value of this attribute is usually the name of
- a mountpoint for this amdMapEntry."
- }
-
- amdMapEntryValue ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX AmdLocationList
- --ID { amdSchema-a 5 }
- DESCRIPTION
- "This is the actual mount information for the amdMapEntry
- using the syntax described above."
- }
-
-.ti 0
-6. Object classes
-
-The following object classes are defined in this document:
-
- amdMap
- amdMapEntry
-
-defined as follows:
-
- amdSchema-oc ::= { amdSchema-id 2 }
-
- amdMap OBJECT-CLASS ::= {
- SUBCLASS OF { top }
- KIND auxiliary
- --ID { amdSchema-oc 1 }
- MAY CONTAIN { amdMapCacheTtl , cn }
- MUST CONTAIN { amdMapName , amdMapEntry }
- }
-
- amdMapEntry OBJECT-CLASS ::= {
- SUBCLASS OF { top }
- KIND structural
- --ID { amdSchema-oc 2 }
- MUST CONTAIN {
- amdMapName ,
- amdEntryKey ,
- amdEntryValue ,
- }
- MAY CONTAIN { cn }
- DESCRIPTION
- "An entry of this object class describes mount
- information relative to a certain amdMap entry"
- }
-
-.ti 0
-7. Examples
-
-
-
-.ti 0
-8. Security Considerations
-
-Due to the security problems posed by NFS care should be taken not to
-advertise exported filesystems. Therefore it is often desirable to limit
-access to entries carrying amd mount map information to those systems
-to which the corresponding filesystems have been exported.
-
-.ti 0
-9. References
-
- [AMUTILS]
- am-utils homepage: http://shekel.cs.columbia.edu/~erez/am-utils.html
-
- [RFC2251]
- M. Wahl, T. Howes, S. Kille, "Lightweight Directory Access
- Protocol (v3)", RFC 2251, December 1997.
-
- [RFC2252]
- M. Wahl, A. Coulbeck, T. Howes, S. Kille, "Lightweight Directory
- Access Protocol (v3): Attribute Syntax Definitions", RFC 2252,
- December 1997.
-
- [RFC2253]
- M. Wahl, S. Kille, T. Howes, "Lightweight Directory Access
- Protocol (v3): UTF-8 String Representation of Distinguished
- Names", RFC 2253, December 1997.
-
- [HOWARD]
- Luke Howard, "An Approach for Using LDAP as a Network
- Information Service", draft-howard-nis-schema-??.txt, Internet
- draft.
-
- [X500]
- ITU something or other.
-
-.in 3
-
-
-.ti 0
-Author's Address
-
-.nf
-
-Leif Johansson
-Department of Mathematics
-Stockholm University
-S-106 91 Stockholm
- SWEDEN
-
-Email: leifj@matematik.su.se
diff --git a/contrib/amd/ldap-id.txt b/contrib/amd/ldap-id.txt
deleted file mode 100644
index 162f66351850..000000000000
--- a/contrib/amd/ldap-id.txt
+++ /dev/null
@@ -1,360 +0,0 @@
-
-
-
-
-
-
-INTERNET-DRAFT Leif Johansson
-Intented Category: Experimental Stockholm University
-
-
-
- A directory (X.500 and LDAPv3) schema for Berkely automounter
-
-
-1. Status of this Memo
-
- This memo describes a directory (LDAP or X.500) schema for storing amd (Berkely-
- style automounter) mount info maps. The schema is currently beeing supported by
- the (beta version of the) am-utils version 6 package [AMUTILS].
-
-2. Overview and Rationale
-
- Directory services such as X.500 [X500] or LDAP [RFC2251] are a natural choice of
- repository for amd mount map databases. All Object Identifiers in this document
- are prefixed by amdSchema-id to be assigned later. The relation between this
- schema and the automount schema elements in [HOWARD] are mostly superficial. The
- model for the elements in [HOWARD] was the SUN automounter which has quite a
- different syntax for mount maps. Furthermore the intended usage of this schema
- differs from that of [HOWARD] in many respects.
-
-3. DSA requirements
-
- Directory servers implementing this schema SHOULD maintain the modifyTimestamp
- operational attribute. If not the amdMapCacheTtl attribute SHOULD be set to 0
- indicating to clients that caching of map entries SHOULD be turned off. Clients
- wishing to use the amdMap schema MAY use the modifyTimestamp information to set
- the ttl for internal caching schemes. A value of 0 for the amdMapCacheTtl must
- result in clients turning off any local caching.
-
-4. Syntax definitions
-
- The following attribute syntax is defined in this document:
-
- amdlocationlist
-
- This syntax represents a amd map value. This is the syntax expressed in BNF using
- definitions from [RFC2252]:
-
- amdlocationlist = amdlocationselection |
- amdlocationlist whsp "||" whsp amdlocationselection
-
- amdlocationselection = amdlocation |
- amdlocationselection whsp amdlocation
-
-
-
-
-Johansson [Page 1]
-
-
-
-
-
-Internet draft Berkeley AMD LDAP Schema 30 March 1998
-
-
- amdlocation = amdlocationinfo |
- "-" amdlocationinfo |
- "-"
-
- amdlocationinfo = seloropt |
- amdlocationinfo ";" seloropt |
- ";"
-
- seloropt = seletion |
- optass
-
- selection = keystring "==" printablestring
- keystring "!=" printablestring
-
- optass = keystring
-
- X.500 servers or LDAPv3 servers (supporting the binary attribute option) may use
- the following syntax definition:
-
- AmdLocationList ::= SEQUENCE OF {
- SEQUENCE OF {
- location AmdLocation
- }
- }
-
- AmdLocation ::= SET OF {
- CHOICE {
- location [0] AmdLocationInfo
- notlocation [1] AmdLocationInfo
- not [2] NULL
- }
- }
-
- AmdLocationInfo ::= SET OF {
- CHOICE {
- selection [0] AmdSelection
- option [1] AmdOption
- }
- }
-
- AmdSelection ::= CHOICE {
- eq [0] AttributeAndValue
- ne [1] AttributeAndValue
- }
-
- AmdOption ::= AttributeAndValue
- AttributeAndValue ::= SEQUENCE {
- attribute IA5String
-
-
-
-Johansson [Page 2]
-
-
-
-
-
-Internet draft Berkeley AMD LDAP Schema 30 March 1998
-
-
- value IA5String
- }
-
-5. Attribute types
-
- The following attribute types are defined in this document:
-
- amdMapName
- amdMapCacheTtl
- amdMapEntry
- amdMapEntryKey
- amdMapEntryValue
-
- amdSchema-a OBJECT IDENTIFIER ::= { amdSchema-id 1 }
-
- amdMapName ATTRIBUTE ::= {
- WITH SYNTAX IA5String
- EQUALITY MATCHING RULE caseIgoreExactMatch
- --ID { amdSchema-a 1 }
- DESCRIPTION
- "This attribute is the symbolic and in the naming
- context unique name of an amd map. This corresponds
- in the case of a flat file database to the name of
- the file or the mount-point of the map."
- }
-
-
- amdMapCacheTtl
- ATTRIBUTE ::= {
- WITH SYNTAX Integer
- EQUALITY MATCHING RULE integerExactMatch
- --ID { amdSchema-a 2 }
- SINGLE VALUED
- DESCRIPTION
- "The maximum time-to-live for the entries in this
- map. After this many milliseconds the map has to
- be cleared from local caches and reloaded. A value
- of 0 disables caching."
- }
-
- amdMapEntry
- ATTRIBUTE ::= {
- WITH SYNTAX DistinguishedName
- EQUALITY MATHCING RULE dNCaseIgnoreExactMatch
- --ID { amdSchema-a 3 }
- DESCRIPTION
- "A multivalued attribute listing the distinguished
- names of the amdMapEntries making up this amdMap
-
-
-
-Johansson [Page 3]
-
-
-
-
-
-Internet draft Berkeley AMD LDAP Schema 30 March 1998
-
-
- object."
- }
-
- amdMapEntryKey ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX IA5String
- EQUALITY MATCHING RULE stringExactMatch
- --ID { amdSchema-a 4 }
- SINGLE VALUED
- DESCRIPTION
- "The value of this attribute is usually the name of
- a mountpoint for this amdMapEntry."
- }
-
- amdMapEntryValue ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX AmdLocationList
- --ID { amdSchema-a 5 }
- DESCRIPTION
- "This is the actual mount information for the amdMapEntry
- using the syntax described above."
- }
-
- amdMapEntryKey ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX IA5String
- EQUALITY MATCHING RULE stringExactMatch
- --ID { amdSchema-a 4 }
- SINGLE VALUED
- DESCRIPTION
- "The value of this attribute is usually the name of
- a mountpoint for this amdMapEntry."
- }
-
- amdMapEntryValue ::= {
- ATTRIBUTE ::= {
- WITH SYNTAX AmdLocationList
- --ID { amdSchema-a 5 }
- DESCRIPTION
- "This is the actual mount information for the amdMapEntry
- using the syntax described above."
- }
-
-6. Object classes
-
- The following object classes are defined in this document:
-
- amdMap
-
-
-
-Johansson [Page 4]
-
-
-
-
-
-Internet draft Berkeley AMD LDAP Schema 30 March 1998
-
-
- amdMapEntry
-
- defined as follows:
-
- amdSchema-oc ::= { amdSchema-id 2 }
-
- amdMap OBJECT-CLASS ::= {
- SUBCLASS OF { top }
- KIND auxiliary
- --ID { amdSchema-oc 1 }
- MAY CONTAIN { amdMapCacheTtl , cn }
- MUST CONTAIN { amdMapName , amdMapEntry }
- }
-
- amdMapEntry OBJECT-CLASS ::= {
- SUBCLASS OF { top }
- KIND structural
- --ID { amdSchema-oc 2 }
- MUST CONTAIN {
- amdMapName ,
- amdEntryKey ,
- amdEntryValue ,
- } MAY CONTAIN
- { cn } DESCRIPTION "An entry of this
- object class describes mount information relative to a
- certain amdMap entry"
- }
-
-7. Examples
-
-
-
-8. Security Considerations
-
- Due to the security problems posed by NFS care should be taken not to advertise
- exported filesystems. Therefore it is often desirable to limit access to entries
- carrying amd mount map information to those systems to which the corresponding
- filesystems have been exported.
-
-9. References
-
- [AMUTILS]
- am-utils homepage: http://shekel.cs.columbia.edu/~erez/am-utils.html
-
- [RFC2251]
- M. Wahl, T. Howes, S. Kille, "Lightweight Directory Access
- Protocol (v3)", RFC 2251, December 1997.
-
-
-
-
-Johansson [Page 5]
-
-
-
-
-
-Internet draft Berkeley AMD LDAP Schema 30 March 1998
-
-
- [RFC2252]
- M. Wahl, A. Coulbeck, T. Howes, S. Kille, "Lightweight Directory
- Access Protocol (v3): Attribute Syntax Definitions", RFC 2252,
- December 1997.
-
- [RFC2253]
- M. Wahl, S. Kille, T. Howes, "Lightweight Directory Access
- Protocol (v3): UTF-8 String Representation of Distinguished
- Names", RFC 2253, December 1997.
-
- [HOWARD]
- Luke Howard, "An Approach for Using LDAP as a Network
- Information Service", draft-howard-nis-schema-??.txt, Internet
- draft.
-
- [X500]
- ITU something or other.
-
-
-
-Author's Address
-
-
- Leif Johansson
- Department of Mathematics
- Stockholm University
- S-106 91 Stockholm
- SWEDEN
-
- Email: leifj@matematik.su.se
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Johansson [Page 6]
-
-
diff --git a/contrib/amd/ldap.schema b/contrib/amd/ldap.schema
deleted file mode 100644
index 9594d2fee8b6..000000000000
--- a/contrib/amd/ldap.schema
+++ /dev/null
@@ -1,52 +0,0 @@
-# A schema for the Berkeley automounter (AMD)
-# Authored by Erez Zadok and/or source maintainers
-# Definition by Tim Colles <timc at dai.ed.ac.uk>
-# Revised by Adam Morley <adam at gmi.com>
-
-# OID Base is 1.3.6.1.4.1.10180
-#
-# Syntaxes are under 1.3.6.1.4.1.10180.3.175-199
-# Attribute types are under 1.3.6.1.4.1.10180.2.175-199
-# Object classes are under 1.3.6.1.4.1.10180.1.175-199
-
-# Attribute Type Definitions
-
-attributetype ( 1.3.6.1.4.1.10180.2.175
- NAME 'amdmapTimestamp'
- DESC 'Probably the time the map was last modified'
- EQUALITY integerMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
- SINGLE-VALUE )
-
-attributetype ( 1.3.6.1.4.1.10180.2.176
- NAME 'amdmapName'
- DESC 'The symbolic name of the map, ie. map_name'
- EQUALITY caseIgnoreMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
- SINGLE-VALUE )
-
-attributetype ( 1.3.6.1.4.1.10180.2.177
- NAME 'amdmapKey'
- DESC 'The key value for this entry'
- EQUALITY caseIgnoreMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
- SINGLE-VALUE )
-
-attributetype ( 1.3.6.1.4.1.10180.2.178
- NAME 'amdmapValue'
- DESC 'The mount information for this entry'
- EQUALITY caseIgnoreMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
- SINGLE-VALUE )
-
-# Object Class Definitions
-
-objectclass ( 1.3.6.1.4.1.10180.1.175 NAME 'amdmapTimestamp'
- SUP top STRUCTURAL
- DESC 'Timestamp for an AMD map'
- MUST ( cn $ amdmapName $ amdmapTimestamp ) )
-
-objectclass ( 1.3.6.1.4.1.10180.1.176 NAME 'amdmap'
- SUP top STRUCTURAL
- DESC 'Defines an AMD map entry'
- MUST ( cn $ amdmapName $ amdmapKey $ amdmapValue ) )
diff --git a/contrib/amd/libamu/alloca.c b/contrib/amd/libamu/alloca.c
deleted file mode 100644
index 31fb4e0d4e06..000000000000
--- a/contrib/amd/libamu/alloca.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/* alloca.c -- allocate automatically reclaimed memory
- (Mostly) portable public-domain implementation -- D A Gwyn
-
- This implementation of the PWB library alloca function,
- which is used to allocate space off the run-time stack so
- that it is automatically reclaimed upon procedure exit,
- was inspired by discussions with J. Q. Johnson of Cornell.
- J.Otto Tennant <jot@cray.com> contributed the Cray support.
-
- There are some preprocessor constants that can
- be defined when compiling for your specific system, for
- improved efficiency; however, the defaults should be okay.
-
- The general concept of this implementation is to keep
- track of all alloca-allocated blocks, and reclaim any
- that are found to be deeper in the stack than the current
- invocation. This heuristic does not reclaim storage as
- soon as it becomes invalid, but it will do so eventually.
-
- As a special case, alloca(0) reclaims storage without
- allocating any. It is a good idea to use alloca(0) in
- your main control loop, etc. to force garbage collection. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
-#ifdef emacs
-#include "blockinput.h"
-#endif
-
-/* If compiling with GCC 2, this file's not needed. */
-#if !defined (__GNUC__) || __GNUC__ < 2
-
-/* If someone has defined alloca as a macro,
- there must be some other way alloca is supposed to work. */
-#ifndef alloca
-
-#ifdef emacs
-#ifdef static
-/* actually, only want this if static is defined as ""
- -- this is for usg, in which emacs must undefine static
- in order to make unexec workable
- */
-#ifndef STACK_DIRECTION
-you
-lose
--- must know STACK_DIRECTION at compile-time
-#endif /* STACK_DIRECTION undefined */
-#endif /* static */
-#endif /* emacs */
-
-/* If your stack is a linked list of frames, you have to
- provide an "address metric" ADDRESS_FUNCTION macro. */
-
-#if defined (CRAY) && defined (CRAY_STACKSEG_END)
-long i00afunc ();
-#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
-#else
-#define ADDRESS_FUNCTION(arg) &(arg)
-#endif
-
-#if __STDC__
-typedef void *pointer;
-#else
-typedef char *pointer;
-#endif
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-/* Different portions of Emacs need to call different versions of
- malloc. The Emacs executable needs alloca to call xmalloc, because
- ordinary malloc isn't protected from input signals. On the other
- hand, the utilities in lib-src need alloca to call malloc; some of
- them are very simple, and don't have an xmalloc routine.
-
- Non-Emacs programs expect this to call use xmalloc.
-
- Callers below should use malloc. */
-
-#ifndef emacs
-#define malloc xmalloc
-#endif
-extern pointer malloc ();
-
-/* Define STACK_DIRECTION if you know the direction of stack
- growth for your system; otherwise it will be automatically
- deduced at run-time.
-
- STACK_DIRECTION > 0 => grows toward higher addresses
- STACK_DIRECTION < 0 => grows toward lower addresses
- STACK_DIRECTION = 0 => direction of growth unknown */
-
-#ifndef STACK_DIRECTION
-#define STACK_DIRECTION 0 /* Direction unknown. */
-#endif
-
-#if STACK_DIRECTION != 0
-
-#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
-
-#else /* STACK_DIRECTION == 0; need run-time code. */
-
-static int stack_dir; /* 1 or -1 once known. */
-#define STACK_DIR stack_dir
-
-static void
-find_stack_direction ()
-{
- static char *addr = NULL; /* Address of first `dummy', once known. */
- auto char dummy; /* To get stack address. */
-
- if (addr == NULL)
- { /* Initial entry. */
- addr = ADDRESS_FUNCTION (dummy);
-
- find_stack_direction (); /* Recurse once. */
- }
- else
- {
- /* Second entry. */
- if (ADDRESS_FUNCTION (dummy) > addr)
- stack_dir = 1; /* Stack grew upward. */
- else
- stack_dir = -1; /* Stack grew downward. */
- }
-}
-
-#endif /* STACK_DIRECTION == 0 */
-
-/* An "alloca header" is used to:
- (a) chain together all alloca'ed blocks;
- (b) keep track of stack depth.
-
- It is very important that sizeof(header) agree with malloc
- alignment chunk size. The following default should work okay. */
-
-#ifndef ALIGN_SIZE
-#define ALIGN_SIZE sizeof(double)
-#endif
-
-typedef union hdr
-{
- char align[ALIGN_SIZE]; /* To force sizeof(header). */
- struct
- {
- union hdr *next; /* For chaining headers. */
- char *deep; /* For stack depth measure. */
- } h;
-} header;
-
-static header *last_alloca_header = NULL; /* -> last alloca header. */
-
-/* Return a pointer to at least SIZE bytes of storage,
- which will be automatically reclaimed upon exit from
- the procedure that called alloca. Originally, this space
- was supposed to be taken from the current stack frame of the
- caller, but that method cannot be made to work for some
- implementations of C, for example under Gould's UTX/32. */
-
-pointer
-alloca (size)
- unsigned size;
-{
- auto char probe; /* Probes stack depth: */
- register char *depth = ADDRESS_FUNCTION (probe);
-
-#if STACK_DIRECTION == 0
- if (STACK_DIR == 0) /* Unknown growth direction. */
- find_stack_direction ();
-#endif
-
- /* Reclaim garbage, defined as all alloca'd storage that
- was allocated from deeper in the stack than currently. */
-
- {
- register header *hp; /* Traverses linked list. */
-
-#ifdef emacs
- BLOCK_INPUT;
-#endif
-
- for (hp = last_alloca_header; hp != NULL;)
- if ((STACK_DIR > 0 && hp->h.deep > depth)
- || (STACK_DIR < 0 && hp->h.deep < depth))
- {
- register header *np = hp->h.next;
-
- free ((pointer) hp); /* Collect garbage. */
-
- hp = np; /* -> next header. */
- }
- else
- break; /* Rest are not deeper. */
-
- last_alloca_header = hp; /* -> last valid storage. */
-
-#ifdef emacs
- UNBLOCK_INPUT;
-#endif
- }
-
- if (size == 0)
- return NULL; /* No allocation required. */
-
- /* Allocate combined header + user data storage. */
-
- {
- register pointer new = malloc (sizeof (header) + size);
- /* Address of header. */
-
- if (new == 0)
- abort();
-
- ((header *) new)->h.next = last_alloca_header;
- ((header *) new)->h.deep = depth;
-
- last_alloca_header = (header *) new;
-
- /* User storage begins just after header. */
-
- return (pointer) ((char *) new + sizeof (header));
- }
-}
-
-#if defined (CRAY) && defined (CRAY_STACKSEG_END)
-
-#ifdef DEBUG_I00AFUNC
-#include <stdio.h>
-#endif
-
-#ifndef CRAY_STACK
-#define CRAY_STACK
-#ifndef CRAY2
-/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
-struct stack_control_header
- {
- long shgrow:32; /* Number of times stack has grown. */
- long shaseg:32; /* Size of increments to stack. */
- long shhwm:32; /* High water mark of stack. */
- long shsize:32; /* Current size of stack (all segments). */
- };
-
-/* The stack segment linkage control information occurs at
- the high-address end of a stack segment. (The stack
- grows from low addresses to high addresses.) The initial
- part of the stack segment linkage control information is
- 0200 (octal) words. This provides for register storage
- for the routine which overflows the stack. */
-
-struct stack_segment_linkage
- {
- long ss[0200]; /* 0200 overflow words. */
- long sssize:32; /* Number of words in this segment. */
- long ssbase:32; /* Offset to stack base. */
- long:32;
- long sspseg:32; /* Offset to linkage control of previous
- segment of stack. */
- long:32;
- long sstcpt:32; /* Pointer to task common address block. */
- long sscsnm; /* Private control structure number for
- microtasking. */
- long ssusr1; /* Reserved for user. */
- long ssusr2; /* Reserved for user. */
- long sstpid; /* Process ID for pid based multi-tasking. */
- long ssgvup; /* Pointer to multitasking thread giveup. */
- long sscray[7]; /* Reserved for Cray Research. */
- long ssa0;
- long ssa1;
- long ssa2;
- long ssa3;
- long ssa4;
- long ssa5;
- long ssa6;
- long ssa7;
- long sss0;
- long sss1;
- long sss2;
- long sss3;
- long sss4;
- long sss5;
- long sss6;
- long sss7;
- };
-
-#else /* CRAY2 */
-/* The following structure defines the vector of words
- returned by the STKSTAT library routine. */
-struct stk_stat
- {
- long now; /* Current total stack size. */
- long maxc; /* Amount of contiguous space which would
- be required to satisfy the maximum
- stack demand to date. */
- long high_water; /* Stack high-water mark. */
- long overflows; /* Number of stack overflow ($STKOFEN) calls. */
- long hits; /* Number of internal buffer hits. */
- long extends; /* Number of block extensions. */
- long stko_mallocs; /* Block allocations by $STKOFEN. */
- long underflows; /* Number of stack underflow calls ($STKRETN). */
- long stko_free; /* Number of deallocations by $STKRETN. */
- long stkm_free; /* Number of deallocations by $STKMRET. */
- long segments; /* Current number of stack segments. */
- long maxs; /* Maximum number of stack segments so far. */
- long pad_size; /* Stack pad size. */
- long current_address; /* Current stack segment address. */
- long current_size; /* Current stack segment size. This
- number is actually corrupted by STKSTAT to
- include the fifteen word trailer area. */
- long initial_address; /* Address of initial segment. */
- long initial_size; /* Size of initial segment. */
- };
-
-/* The following structure describes the data structure which trails
- any stack segment. I think that the description in 'asdef' is
- out of date. I only describe the parts that I am sure about. */
-
-struct stk_trailer
- {
- long this_address; /* Address of this block. */
- long this_size; /* Size of this block (does not include
- this trailer). */
- long unknown2;
- long unknown3;
- long link; /* Address of trailer block of previous
- segment. */
- long unknown5;
- long unknown6;
- long unknown7;
- long unknown8;
- long unknown9;
- long unknown10;
- long unknown11;
- long unknown12;
- long unknown13;
- long unknown14;
- };
-
-#endif /* CRAY2 */
-#endif /* not CRAY_STACK */
-
-#ifdef CRAY2
-/* Determine a "stack measure" for an arbitrary ADDRESS.
- I doubt that "lint" will like this much. */
-
-static long
-i00afunc (long *address)
-{
- struct stk_stat status;
- struct stk_trailer *trailer;
- long *block, size;
- long result = 0;
-
- /* We want to iterate through all of the segments. The first
- step is to get the stack status structure. We could do this
- more quickly and more directly, perhaps, by referencing the
- $LM00 common block, but I know that this works. */
-
- STKSTAT (&status);
-
- /* Set up the iteration. */
-
- trailer = (struct stk_trailer *) (status.current_address
- + status.current_size
- - 15);
-
- /* There must be at least one stack segment. Therefore it is
- a fatal error if "trailer" is null. */
-
- if (trailer == 0)
- abort ();
-
- /* Discard segments that do not contain our argument address. */
-
- while (trailer != 0)
- {
- block = (long *) trailer->this_address;
- size = trailer->this_size;
- if (block == 0 || size == 0)
- abort ();
- trailer = (struct stk_trailer *) trailer->link;
- if ((block <= address) && (address < (block + size)))
- break;
- }
-
- /* Set the result to the offset in this segment and add the sizes
- of all predecessor segments. */
-
- result = address - block;
-
- if (trailer == 0)
- {
- return result;
- }
-
- do
- {
- if (trailer->this_size <= 0)
- abort ();
- result += trailer->this_size;
- trailer = (struct stk_trailer *) trailer->link;
- }
- while (trailer != 0);
-
- /* We are done. Note that if you present a bogus address (one
- not in any segment), you will get a different number back, formed
- from subtracting the address of the first block. This is probably
- not what you want. */
-
- return (result);
-}
-
-#else /* not CRAY2 */
-/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
- Determine the number of the cell within the stack,
- given the address of the cell. The purpose of this
- routine is to linearize, in some sense, stack addresses
- for alloca. */
-
-static long
-i00afunc (long address)
-{
- long stkl = 0;
-
- long size, pseg, this_segment, stack;
- long result = 0;
-
- struct stack_segment_linkage *ssptr;
-
- /* Register B67 contains the address of the end of the
- current stack segment. If you (as a subprogram) store
- your registers on the stack and find that you are past
- the contents of B67, you have overflowed the segment.
-
- B67 also points to the stack segment linkage control
- area, which is what we are really interested in. */
-
- stkl = CRAY_STACKSEG_END ();
- ssptr = (struct stack_segment_linkage *) stkl;
-
- /* If one subtracts 'size' from the end of the segment,
- one has the address of the first word of the segment.
-
- If this is not the first segment, 'pseg' will be
- nonzero. */
-
- pseg = ssptr->sspseg;
- size = ssptr->sssize;
-
- this_segment = stkl - size;
-
- /* It is possible that calling this routine itself caused
- a stack overflow. Discard stack segments which do not
- contain the target address. */
-
- while (!(this_segment <= address && address <= stkl))
- {
-#ifdef DEBUG_I00AFUNC
- fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
-#endif
- if (pseg == 0)
- break;
- stkl = stkl - pseg;
- ssptr = (struct stack_segment_linkage *) stkl;
- size = ssptr->sssize;
- pseg = ssptr->sspseg;
- this_segment = stkl - size;
- }
-
- result = address - this_segment;
-
- /* If you subtract pseg from the current end of the stack,
- you get the address of the previous stack segment's end.
- This seems a little convoluted to me, but I'll bet you save
- a cycle somewhere. */
-
- while (pseg != 0)
- {
-#ifdef DEBUG_I00AFUNC
- fprintf (stderr, "%011o %011o\n", pseg, size);
-#endif
- stkl = stkl - pseg;
- ssptr = (struct stack_segment_linkage *) stkl;
- size = ssptr->sssize;
- pseg = ssptr->sspseg;
- result += size;
- }
- return (result);
-}
-
-#endif /* not CRAY2 */
-#endif /* CRAY */
-
-#endif /* no alloca */
-#endif /* not GCC version 2 */
diff --git a/contrib/amd/libamu/amu.h b/contrib/amd/libamu/amu.h
deleted file mode 100644
index 1e7834a15261..000000000000
--- a/contrib/amd/libamu/amu.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/amu.h
- *
- */
-
-#ifndef _AMU_H
-#define _AMU_H
-
-/*
- * Decide what maximum level of NFS server to try and mount with.
- */
-#ifdef HAVE_FS_NFS3
-# define NFS_VERS_MAX NFS_VERSION3
-#else /* not HAVE_FS_NFS3 */
-# define NFS_VERS_MAX NFS_VERSION
-#endif /* not HAVE_FS_NFS3 */
-
-/* some systems like ncr2 do not define this in <rpcsvc/mount.h> */
-#ifndef MNTPATHLEN
-# define MNTPATHLEN 1024
-#endif /* not MNTPATHLEN */
-#ifndef MNTNAMLEN
-# define MNTNAMLEN 255
-#endif /* not MNTNAMLEN */
-
-/*
- * external definitions for building libamu.a
- */
-extern voidp amqproc_null_1(voidp argp, CLIENT *rqstp);
-extern amq_mount_tree_p *amqproc_mnttree_1(amq_string *argp, CLIENT *rqstp);
-extern voidp amqproc_umnt_1(amq_string *argp, CLIENT *rqstp);
-extern amq_mount_stats *amqproc_stats_1(voidp argp, CLIENT *rqstp);
-extern amq_mount_tree_list *amqproc_export_1(voidp argp, CLIENT *rqstp);
-extern int *amqproc_setopt_1(amq_setopt *argp, CLIENT *rqstp);
-extern amq_mount_info_list *amqproc_getmntfs_1(voidp argp, CLIENT *rqstp);
-extern int *amqproc_mount_1(voidp argp, CLIENT *rqstp);
-extern amq_string *amqproc_getvers_1(voidp argp, CLIENT *rqstp);
-
-extern long get_server_pid(void);
-
-#endif /* not _AMU_H */
diff --git a/contrib/amd/libamu/clnt_sperrno.c b/contrib/amd/libamu/clnt_sperrno.c
deleted file mode 100644
index d3b48d1cd405..000000000000
--- a/contrib/amd/libamu/clnt_sperrno.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 1997-1998 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * %W% (Berkeley) %G%
- *
- * $Id: clnt_sperrno.c,v 5.2.2.1 1992/02/09 15:08:40 jsp beta $
- *
- */
-
-/*
- * Early RPC seems to be missing these..
- * Extracted from the RPC 3.9 sources as indicated
- */
-
-/* @(#)clnt_perror.c 1.1 87/11/04 3.9 RPCSRC */
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-struct rpc_errtab {
- enum clnt_stat status;
- char *message;
-};
-
-static struct rpc_errtab rpc_errlist[] =
-{
- {RPC_SUCCESS,
- "RPC: Success"},
- {RPC_CANTENCODEARGS,
- "RPC: Can't encode arguments"},
- {RPC_CANTDECODERES,
- "RPC: Can't decode result"},
- {RPC_CANTSEND,
- "RPC: Unable to send"},
- {RPC_CANTRECV,
- "RPC: Unable to receive"},
- {RPC_TIMEDOUT,
- "RPC: Timed out"},
- {RPC_VERSMISMATCH,
- "RPC: Incompatible versions of RPC"},
- {RPC_AUTHERROR,
- "RPC: Authentication error"},
- {RPC_PROGUNAVAIL,
- "RPC: Program unavailable"},
- {RPC_PROGVERSMISMATCH,
- "RPC: Program/version mismatch"},
- {RPC_PROCUNAVAIL,
- "RPC: Procedure unavailable"},
- {RPC_CANTDECODEARGS,
- "RPC: Server can't decode arguments"},
- {RPC_SYSTEMERROR,
- "RPC: Remote system error"},
- {RPC_UNKNOWNHOST,
- "RPC: Unknown host"},
-/* { RPC_UNKNOWNPROTO,
- * "RPC: Unknown protocol" }, */
- {RPC_PMAPFAILURE,
- "RPC: Port mapper failure"},
- {RPC_PROGNOTREGISTERED,
- "RPC: Program not registered"},
- {RPC_FAILED,
- "RPC: Failed (unspecified error)"}
-};
-
-
-/*
- * This interface for use by clntrpc
- */
-char *
-clnt_sperrno(enum clnt_stat stat)
-{
- int i;
-
- for (i = 0; i < sizeof(rpc_errlist) / sizeof(struct rpc_errtab); i++) {
- if (rpc_errlist[i].status == stat) {
- return (rpc_errlist[i].message);
- }
- }
- return ("RPC: (unknown error code)");
-}
diff --git a/contrib/amd/libamu/hasmntopt.c b/contrib/amd/libamu/hasmntopt.c
deleted file mode 100644
index 14cceb53b5cb..000000000000
--- a/contrib/amd/libamu/hasmntopt.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
-n * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/hasmntopt.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-#ifndef MNTMAXSTR
-# define MNTMAXSTR 256
-#endif /* not MNTMAXSTR */
-
-
-/*
- * Some systems don't provide these to the user,
- * but amd needs them, so...
- *
- * From: Piete Brooks <pb@cl.cam.ac.uk>
- */
-static char *
-nextmntopt(char **p)
-{
- char *cp = *p;
- char *rp;
-
- /*
- * Skip past white space
- */
- while (*cp && isspace((int) *cp))
- cp++;
-
- /*
- * Word starts here
- */
- rp = cp;
-
- /*
- * Scan to send of string or separator
- */
- while (*cp && *cp != ',')
- cp++;
-
- /*
- * If separator found the overwrite with null char.
- */
- if (*cp) {
- *cp = '\0';
- cp++;
- }
-
- /*
- * Return value for next call
- */
- *p = cp;
- return rp;
-}
-
-
-/*
- * replacement for hasmntopt if the system does not have it.
- */
-char *
-amu_hasmntopt(mntent_t *mnt, char *opt)
-{
- char t[MNTMAXSTR];
- char *f;
- char *o = t;
- int l = strlen(opt);
-
- xstrlcpy(t, mnt->mnt_opts, sizeof(t));
-
- while (*(f = nextmntopt(&o)))
- if (NSTREQ(opt, f, l))
- return f - t + mnt->mnt_opts;
-
- return 0;
-}
diff --git a/contrib/amd/libamu/misc_rpc.c b/contrib/amd/libamu/misc_rpc.c
deleted file mode 100644
index de0a92036b7f..000000000000
--- a/contrib/amd/libamu/misc_rpc.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/misc_rpc.c
- *
- */
-
-/*
- * Additions to Sun RPC.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-/*
- * Some systems renamed _seterr_reply to __seterr_reply (with two
- * leading underscores)
- */
-#if !defined(HAVE__SETERR_REPLY) && defined(HAVE___SETERR_REPLY)
-# define _seterr_reply __seterr_reply
-#endif /* !defined(HAVE__SETERR_REPLY) && defined(HAVE___SETERR_REPLY) */
-
-
-void
-rpc_msg_init(struct rpc_msg *mp, u_long prog, u_long vers, u_long proc)
-{
- /*
- * Initialize the message
- */
- memset((voidp) mp, 0, sizeof(*mp));
- mp->rm_xid = 0;
- mp->rm_direction = CALL;
- mp->rm_call.cb_rpcvers = RPC_MSG_VERSION;
- mp->rm_call.cb_prog = prog;
- mp->rm_call.cb_vers = vers;
- mp->rm_call.cb_proc = proc;
-}
-
-
-/*
- * Field reply to call to mountd
- */
-int
-pickup_rpc_reply(voidp pkt, int len, voidp where, XDRPROC_T_TYPE where_xdr)
-{
- XDR reply_xdr;
- int ok;
- struct rpc_err err;
- struct rpc_msg reply_msg;
- int error = 0;
-
- /* memset((voidp) &err, 0, sizeof(err)); */
- memset((voidp) &reply_msg, 0, sizeof(reply_msg));
- memset((voidp) &reply_xdr, 0, sizeof(reply_xdr));
-
- reply_msg.acpted_rply.ar_results.where = where;
- reply_msg.acpted_rply.ar_results.proc = where_xdr;
-
- xdrmem_create(&reply_xdr, pkt, len, XDR_DECODE);
-
- ok = xdr_replymsg(&reply_xdr, &reply_msg);
- if (!ok) {
- error = EIO;
- goto drop;
- }
- _seterr_reply(&reply_msg, &err);
- if (err.re_status != RPC_SUCCESS) {
- error = EIO;
- goto drop;
- }
-
-drop:
- if (reply_msg.rm_reply.rp_stat == MSG_ACCEPTED &&
- reply_msg.acpted_rply.ar_verf.oa_base) {
- reply_xdr.x_op = XDR_FREE;
- (void) xdr_opaque_auth(&reply_xdr,
- &reply_msg.acpted_rply.ar_verf);
- }
- xdr_destroy(&reply_xdr);
-
- return error;
-}
-
-
-int
-make_rpc_packet(char *buf, int buflen, u_long proc, struct rpc_msg *mp, voidp arg, XDRPROC_T_TYPE arg_xdr, AUTH *auth)
-{
- XDR msg_xdr;
- int len;
- /*
- * Never cast pointers between different integer types, it breaks badly
- * on big-endian platforms if those types have different sizes.
- *
- * Cast to a local variable instead, and use that variable's address.
- */
- enum_t local_proc = (enum_t) proc;
-
- xdrmem_create(&msg_xdr, buf, buflen, XDR_ENCODE);
-
- /*
- * Basic protocol header
- */
- if (!xdr_callhdr(&msg_xdr, mp))
- return -EIO;
-
- /*
- * Called procedure number
- */
- if (!xdr_enum(&msg_xdr, &local_proc))
- return -EIO;
-
- /*
- * Authorization
- */
- if (!AUTH_MARSHALL(auth, &msg_xdr))
- return -EIO;
-
- /*
- * Arguments
- */
- if (!(*arg_xdr) (&msg_xdr, arg))
- return -EIO;
-
- /*
- * Determine length
- */
- len = xdr_getpos(&msg_xdr);
-
- /*
- * Throw away xdr
- */
- xdr_destroy(&msg_xdr);
-
- return len;
-}
-
-
-/* get uid/gid from RPC credentials */
-int
-getcreds(struct svc_req *rp, uid_t *u, gid_t *g, SVCXPRT *nfsxprt)
-{
- struct authunix_parms *aup = (struct authunix_parms *) NULL;
-#ifdef HAVE_RPC_AUTH_DES_H
- struct authdes_cred *adp;
-#endif /* HAVE_RPC_AUTH_DES_H */
-
- switch (rp->rq_cred.oa_flavor) {
-
- case AUTH_UNIX:
- aup = (struct authunix_parms *) rp->rq_clntcred;
- *u = aup->aup_uid;
- *g = aup->aup_gid;
- break;
-
-#ifdef HAVE_RPC_AUTH_DES_H
- case AUTH_DES:
- adp = (struct authdes_cred *) rp->rq_clntcred;
- *g = INVALIDID; /* some unknown group id */
- if (sscanf(adp->adc_fullname.name, "unix.%lu@", (u_long *) u) == 1)
- break;
- /* fall through */
-#endif /* HAVE_RPC_AUTH_DES_H */
-
- default:
- *u = *g = INVALIDID; /* just in case */
- svcerr_weakauth(nfsxprt);
- return -1;
- }
-
- return 0; /* everything is ok */
-}
diff --git a/contrib/amd/libamu/mount_fs.c b/contrib/amd/libamu/mount_fs.c
deleted file mode 100644
index 74f064ede648..000000000000
--- a/contrib/amd/libamu/mount_fs.c
+++ /dev/null
@@ -1,1003 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/mount_fs.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-/* ensure that mount table options are delimited by a comma */
-#define append_opts(old, l, new) { \
- if (*(old) != '\0') \
- xstrlcat(old, ",", l); \
- xstrlcat(old, new, l); }
-
-/*
- * Standard mount flags
- */
-struct opt_tab mnt_flags[] =
-{
-#if defined(MNT2_GEN_OPT_RDONLY) && defined(MNTTAB_OPT_RO)
- {MNTTAB_OPT_RO, MNT2_GEN_OPT_RDONLY},
-#endif /* defined(MNT2_GEN_OPT_RDONLY) && defined(MNTTAB_OPT_RO) */
-
-#if defined(MNT2_GEN_OPT_NOCACHE) && defined(MNTTAB_OPT_NOCACHE)
- {MNTTAB_OPT_NOCACHE, MNT2_GEN_OPT_NOCACHE},
-#endif /* defined(MNT2_GEN_OPT_NOCACHE) && defined(MNTTAB_OPT_NOCACHE) */
-
- /* the "grpid" mount option can be offered as generic of NFS */
-#ifdef MNTTAB_OPT_GRPID
-# ifdef MNT2_GEN_OPT_GRPID
- {MNTTAB_OPT_GRPID, MNT2_GEN_OPT_GRPID},
-# endif /* MNT2_GEN_OPT_GRPID */
-# ifdef MNT2_NFS_OPT_GRPID
- {MNTTAB_OPT_GRPID, MNT2_NFS_OPT_GRPID},
-# endif /* MNT2_NFS_OPT_GRPID */
-#endif /* MNTTAB_OPT_GRPID */
-
-#if defined(MNT2_GEN_OPT_MULTI) && defined(MNTTAB_OPT_MULTI)
- {MNTTAB_OPT_MULTI, MNT2_GEN_OPT_MULTI},
-#endif /* defined(MNT2_GEN_OPT_MULTI) && defined(MNTTAB_OPT_MULTI) */
-
-#if defined(MNT2_GEN_OPT_NODEV) && defined(MNTTAB_OPT_NODEV)
- {MNTTAB_OPT_NODEV, MNT2_GEN_OPT_NODEV},
-#endif /* defined(MNT2_GEN_OPT_NODEV) && defined(MNTTAB_OPT_NODEV) */
-
-#if defined(MNT2_GEN_OPT_NOEXEC) && defined(MNTTAB_OPT_NOEXEC)
- {MNTTAB_OPT_NOEXEC, MNT2_GEN_OPT_NOEXEC},
-#endif /* defined(MNT2_GEN_OPT_NOEXEC) && defined(MNTTAB_OPT_NOEXEC) */
-
-#if defined(MNT2_GEN_OPT_NOSUB) && defined(MNTTAB_OPT_NOSUB)
- {MNTTAB_OPT_NOSUB, MNT2_GEN_OPT_NOSUB},
-#endif /* defined(MNT2_GEN_OPT_NOSUB) && defined(MNTTAB_OPT_NOSUB) */
-
-#if defined(MNT2_GEN_OPT_NOSUID) && defined(MNTTAB_OPT_NOSUID)
- {MNTTAB_OPT_NOSUID, MNT2_GEN_OPT_NOSUID},
-#endif /* defined(MNT2_GEN_OPT_NOSUID) && defined(MNTTAB_OPT_NOSUID) */
-
-#if defined(MNT2_GEN_OPT_SYNC) && defined(MNTTAB_OPT_SYNC)
- {MNTTAB_OPT_SYNC, MNT2_GEN_OPT_SYNC},
-#endif /* defined(MNT2_GEN_OPT_SYNC) && defined(MNTTAB_OPT_SYNC) */
-
-#if defined(MNT2_GEN_OPT_OVERLAY) && defined(MNTTAB_OPT_OVERLAY)
- {MNTTAB_OPT_OVERLAY, MNT2_GEN_OPT_OVERLAY},
-#endif /* defined(MNT2_GEN_OPT_OVERLAY) && defined(MNTTAB_OPT_OVERLAY) */
-
- /*
- * Do not define MNT2_NFS_OPT_* entries here! This is for generic
- * mount(2) options only, not for NFS mount options. If you need to put
- * something here, it's probably not the right place: see
- * include/am_compat.h.
- */
-
- {0, 0}
-};
-
-
-/* compute generic mount flags */
-int
-compute_mount_flags(mntent_t *mntp)
-{
- struct opt_tab *opt;
- int flags = 0;
-
-#ifdef MNT2_GEN_OPT_NEWTYPE
- flags |= MNT2_GEN_OPT_NEWTYPE;
-#endif /* MNT2_GEN_OPT_NEWTYPE */
-#ifdef MNT2_GEN_OPT_AUTOMOUNTED
- flags |= MNT2_GEN_OPT_AUTOMOUNTED;
-#endif /* not MNT2_GEN_OPT_AUTOMOUNTED */
-
- /*
- * Crack basic mount options
- */
- for (opt = mnt_flags; opt->opt; opt++) {
- flags |= amu_hasmntopt(mntp, opt->opt) ? opt->flag : 0;
- }
-
- return flags;
-}
-
-
-/* compute generic mount flags for automounter mounts */
-int
-compute_automounter_mount_flags(mntent_t *mntp)
-{
- int flags = 0;
-
-#ifdef MNT2_GEN_OPT_IGNORE
- flags |= MNT2_GEN_OPT_IGNORE;
-#endif /* not MNT2_GEN_OPT_IGNORE */
-#ifdef MNT2_GEN_OPT_AUTOMNTFS
- flags |= MNT2_GEN_OPT_AUTOMNTFS;
-#endif /* not MNT2_GEN_OPT_AUTOMNTFS */
-
- return flags;
-}
-
-
-int
-mount_fs(mntent_t *mnt, int flags, caddr_t mnt_data, int retry, MTYPE_TYPE type, u_long nfs_version, const char *nfs_proto, const char *mnttabname, int on_autofs)
-{
- int error = 0;
-#ifdef MOUNT_TABLE_ON_FILE
- char *zopts = NULL, *xopts = NULL;
- size_t l;
-#endif /* MOUNT_TABLE_ON_FILE */
- char *mnt_dir = 0;
-
-#ifdef NEED_AUTOFS_SPACE_HACK
- char *old_mnt_dir = 0;
- /* perform space hack */
- if (on_autofs) {
- old_mnt_dir = mnt->mnt_dir;
- mnt->mnt_dir = mnt_dir = autofs_strdup_space_hack(old_mnt_dir);
- } else
-#endif /* NEED_AUTOFS_SPACE_HACK */
- mnt_dir = strdup(mnt->mnt_dir);
-
- dlog("'%s' fstype " MTYPE_PRINTF_TYPE " (%s) flags %#x (%s)",
- mnt_dir, type, mnt->mnt_type, flags, mnt->mnt_opts);
-
-again:
- error = MOUNT_TRAP(type, mnt, flags, mnt_data);
-
- if (error < 0) {
- plog(XLOG_ERROR, "'%s': mount: %m", mnt_dir);
- /*
- * The following code handles conditions which shouldn't
- * occur. They are possible either because amd screws up
- * in preparing for the mount, or because some human
- * messed with the mount point. Both have been known to
- * happen. -- stolcke 2/22/95
- */
- if (errno == EBUSY) {
- /*
- * Also, sometimes unmount isn't called, e.g., because
- * our mountlist is garbled. This leaves old mount
- * points around which need to be removed before we
- * can mount something new in their place.
- */
- errno = umount_fs(mnt_dir, mnttabname, on_autofs);
- if (errno != 0)
- plog(XLOG_ERROR, "'%s': umount: %m", mnt_dir);
- else {
- plog(XLOG_WARNING, "extra umount required for '%s'", mnt_dir);
- error = MOUNT_TRAP(type, mnt, flags, mnt_data);
- }
- }
- }
-
- if (error < 0 && --retry > 0) {
- sleep(1);
- goto again;
- }
-
-#ifdef NEED_AUTOFS_SPACE_HACK
- /* Undo space hack */
- if (on_autofs)
- mnt->mnt_dir = old_mnt_dir;
-#endif /* NEED_AUTOFS_SPACE_HACK */
-
- if (error < 0) {
- error = errno;
- goto out;
- }
-
-#ifdef MOUNT_TABLE_ON_FILE
- /*
- * Allocate memory for options:
- * dev=..., vers={2,3}, proto={tcp,udp}
- */
- l = strlen(mnt->mnt_opts) + 48;
- zopts = (char *) xmalloc(l);
-
- /* copy standard options */
- xopts = mnt->mnt_opts;
-
- xstrlcpy(zopts, xopts, l);
-
-# ifdef MNTTAB_OPT_DEV
- {
- /* add the extra dev= field to the mount table */
- struct stat stb;
- if (lstat(mnt_dir, &stb) == 0) {
- char optsbuf[48];
- if (sizeof(stb.st_dev) == 2) /* e.g. SunOS 4.1 */
- xsnprintf(optsbuf, sizeof(optsbuf), "%s=%04lx",
- MNTTAB_OPT_DEV, (u_long) stb.st_dev & 0xffff);
- else /* e.g. System Vr4 */
- xsnprintf(optsbuf, sizeof(optsbuf), "%s=%08lx",
- MNTTAB_OPT_DEV, (u_long) stb.st_dev);
- append_opts(zopts, l, optsbuf);
- }
- }
-# endif /* MNTTAB_OPT_DEV */
-
-# if defined(HAVE_FS_NFS3) && defined(MNTTAB_OPT_VERS)
- /*
- * add the extra vers={2,3} field to the mount table,
- * unless already specified by user
- */
- if (nfs_version == NFS_VERSION3 &&
- hasmntval(mnt, MNTTAB_OPT_VERS) != NFS_VERSION3) {
- char optsbuf[48];
- xsnprintf(optsbuf, sizeof(optsbuf),
- "%s=%d", MNTTAB_OPT_VERS, NFS_VERSION3);
- append_opts(zopts, l, optsbuf);
- }
-# endif /* defined(HAVE_FS_NFS3) && defined(MNTTAB_OPT_VERS) */
-
-# ifdef MNTTAB_OPT_PROTO
- /*
- * add the extra proto={tcp,udp} field to the mount table,
- * unless already specified by user.
- */
- if (nfs_proto && !amu_hasmntopt(mnt, MNTTAB_OPT_PROTO)) {
- char optsbuf[48];
- xsnprintf(optsbuf, sizeof(optsbuf), "%s=%s", MNTTAB_OPT_PROTO, nfs_proto);
- append_opts(zopts, l, optsbuf);
- }
-# endif /* MNTTAB_OPT_PROTO */
-
- /* finally, store the options into the mount table structure */
- mnt->mnt_opts = zopts;
-
- /*
- * Additional fields in mntent_t
- * are fixed up here
- */
-# ifdef HAVE_MNTENT_T_MNT_CNODE
- mnt->mnt_cnode = 0;
-# endif /* HAVE_MNTENT_T_MNT_CNODE */
-
-# ifdef HAVE_MNTENT_T_MNT_RO
- mnt->mnt_ro = (amu_hasmntopt(mnt, MNTTAB_OPT_RO) != NULL);
-# endif /* HAVE_MNTENT_T_MNT_RO */
-
-# ifdef HAVE_MNTENT_T_MNT_TIME
-# ifdef HAVE_MNTENT_T_MNT_TIME_STRING
- { /* allocate enough space for a long */
- size_t l = 13 * sizeof(char);
- char *str = (char *) xmalloc(l);
- xsnprintf(str, l, "%ld", time((time_t *) NULL));
- mnt->mnt_time = str;
- }
-# else /* not HAVE_MNTENT_T_MNT_TIME_STRING */
- mnt->mnt_time = time((time_t *) NULL);
-# endif /* not HAVE_MNTENT_T_MNT_TIME_STRING */
-# endif /* HAVE_MNTENT_T_MNT_TIME */
-
- write_mntent(mnt, mnttabname);
-
-# ifdef MNTTAB_OPT_DEV
- if (xopts) {
- XFREE(mnt->mnt_opts);
- mnt->mnt_opts = xopts;
- }
-# endif /* MNTTAB_OPT_DEV */
-#endif /* MOUNT_TABLE_ON_FILE */
-
- out:
- XFREE(mnt_dir);
- return error;
-}
-
-
-/*
- * Compute all NFS attribute cache related flags separately. Note that this
- * function now computes attribute-cache flags for both Amd's automount
- * points (NFS) as well as any normal NFS mount that Amd performs. Edit
- * with caution.
- */
-static void
-compute_nfs_attrcache_flags(nfs_args_t *nap, mntent_t *mntp)
-{
- int acval = 0;
- int err_acval = 1; /* 1 means we found no 'actimeo' value */
-#if defined(HAVE_NFS_ARGS_T_ACREGMIN) || defined(HAVE_NFS_ARGS_T_ACREGMAX) || defined(HAVE_NFS_ARGS_T_ACDIRMIN) || defined(HAVE_NFS_ARGS_T_ACDIRMAX)
- int err_acrdmm; /* for ac{reg,dir}{min,max} */
-#endif /* HAVE_NFS_ARGS_T_AC{REG,DIR}{MIN,MAX} */
-
- /************************************************************************/
- /*** ATTRIBUTE CACHES ***/
- /************************************************************************/
- /*
- * acval is set to 0 at the top of the function. If actimeo mount option
- * exists and defined in mntopts, then its acval is set to it.
- * If the value is non-zero, then we set all attribute cache fields to it.
- * If acval is zero, it means it was never defined in mntopts or the
- * actimeo mount option does not exist, in which case we check for
- * individual mount options per attribute cache.
- * Regardless of the value of acval, mount flags are set based directly
- * on the values of the attribute caches.
- */
-#ifdef MNTTAB_OPT_ACTIMEO
- err_acval = hasmntvalerr(mntp, MNTTAB_OPT_ACTIMEO, &acval); /* attr cache timeout (sec) */
-#endif /* MNTTAB_OPT_ACTIMEO */
-
- /*** acregmin ***/
-#ifdef HAVE_NFS_ARGS_T_ACREGMIN
- err_acrdmm = 1; /* 1 means we found no acregmin value */
- if (!err_acval) {
- nap->acregmin = acval; /* min ac timeout for reg files (sec) */
- } else {
-# ifdef MNTTAB_OPT_ACREGMIN
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMIN, (int *) &nap->acregmin);
-# else /* not MNTTAB_OPT_ACREGMIN */
- nap->acregmin = 0;
-# endif /* not MNTTAB_OPT_ACREGMIN */
- }
- /* set this flag iff we changed acregmin (possibly to zero) */
-# ifdef MNT2_NFS_OPT_ACREGMIN
- if (!err_acval || !err_acrdmm)
- nap->flags |= MNT2_NFS_OPT_ACREGMIN;
-# endif /* MNT2_NFS_OPT_ACREGMIN */
-#endif /* HAVE_NFS_ARGS_T_ACREGMIN */
-
- /*** acregmax ***/
-#ifdef HAVE_NFS_ARGS_T_ACREGMAX
- err_acrdmm = 1; /* 1 means we found no acregmax value */
- if (!err_acval) {
- nap->acregmax = acval; /* max ac timeout for reg files (sec) */
- } else {
-# ifdef MNTTAB_OPT_ACREGMAX
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMAX, (int *) &nap->acregmax);
-# else /* not MNTTAB_OPT_ACREGMAX */
- nap->acregmax = 0;
-# endif /* not MNTTAB_OPT_ACREGMAX */
- }
- /* set this flag iff we changed acregmax (possibly to zero) */
-# ifdef MNT2_NFS_OPT_ACREGMAX
- if (!err_acval || !err_acrdmm)
- nap->flags |= MNT2_NFS_OPT_ACREGMAX;
-# endif /* MNT2_NFS_OPT_ACREGMAX */
-#endif /* HAVE_NFS_ARGS_T_ACREGMAX */
-
- /*** acdirmin ***/
-#ifdef HAVE_NFS_ARGS_T_ACDIRMIN
- err_acrdmm = 1; /* 1 means we found no acdirmin value */
- if (!err_acval) {
- nap->acdirmin = acval; /* min ac timeout for dirs (sec) */
- } else {
-# ifdef MNTTAB_OPT_ACDIRMIN
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMIN, (int *) &nap->acdirmin);
-# else /* not MNTTAB_OPT_ACDIRMIN */
- nap->acdirmin = 0;
-# endif /* not MNTTAB_OPT_ACDIRMIN */
- }
- /* set this flag iff we changed acdirmin (possibly to zero) */
-# ifdef MNT2_NFS_OPT_ACDIRMIN
- if (!err_acval || !err_acrdmm)
- nap->flags |= MNT2_NFS_OPT_ACDIRMIN;
-# endif /* MNT2_NFS_OPT_ACDIRMIN */
-#endif /* HAVE_NFS_ARGS_T_ACDIRMIN */
-
- /*** acdirmax ***/
-#ifdef HAVE_NFS_ARGS_T_ACDIRMAX
- err_acrdmm = 1; /* 1 means we found no acdirmax value */
- if (!err_acval) {
- nap->acdirmax = acval; /* max ac timeout for dirs (sec) */
- } else {
-# ifdef MNTTAB_OPT_ACDIRMAX
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMAX, (int *) &nap->acdirmax);
-# else /* not MNTTAB_OPT_ACDIRMAX */
- nap->acdirmax = 0;
-# endif /* not MNTTAB_OPT_ACDIRMAX */
- }
- /* set this flag iff we changed acdirmax (possibly to zero) */
-# ifdef MNT2_NFS_OPT_ACDIRMAX
- if (!err_acval || !err_acrdmm)
- nap->flags |= MNT2_NFS_OPT_ACDIRMAX;
-# endif /* MNT2_NFS_OPT_ACDIRMAX */
-#endif /* HAVE_NFS_ARGS_T_ACDIRMAX */
-
-
- /* don't cache attributes */
-#if defined(MNTTAB_OPT_NOAC) && defined(MNT2_NFS_OPT_NOAC)
- if (amu_hasmntopt(mntp, MNTTAB_OPT_NOAC) != NULL)
- nap->flags |= MNT2_NFS_OPT_NOAC;
-#endif /* defined(MNTTAB_OPT_NOAC) && defined(MNT2_NFS_OPT_NOAC) */
-}
-
-
-/*
- * Fill in the many possible fields and flags of struct nfs_args.
- *
- * nap: pre-allocated structure to fill in.
- * mntp: mount entry structure (includes options)
- * genflags: generic mount flags already determined
- * nfsncp: (TLI only) netconfig entry for this NFS mount
- * ip_addr: IP address of file server
- * nfs_version: 2, 3, (4 in the future), or 0 if unknown
- * nfs_proto: "udp", "tcp", or NULL.
- * fhp: file handle structure pointer
- * host_name: name of remote NFS host
- * fs_name: remote file system name to mount
- */
-void
-compute_nfs_args(nfs_args_t *nap,
- mntent_t *mntp,
- int genflags,
- struct netconfig *nfsncp,
- struct sockaddr_in *ip_addr,
- u_long nfs_version,
- char *nfs_proto,
- am_nfs_handle_t *fhp,
- char *host_name,
- char *fs_name)
-{
- /* initialize just in case */
- memset((voidp) nap, 0, sizeof(nfs_args_t));
-
- /* compute all of the NFS attribute-cache flags */
- compute_nfs_attrcache_flags(nap, mntp);
-
- /************************************************************************/
- /*** FILEHANDLE DATA AND LENGTH ***/
- /************************************************************************/
-#ifdef HAVE_FS_NFS3
- if (nfs_version == NFS_VERSION3) {
-# if defined(HAVE_NFS_ARGS_T_FHSIZE) || defined(HAVE_NFS_ARGS_T_FH_LEN)
- /*
- * Some systems (Irix/bsdi3) have a separate field in nfs_args for
- * the length of the file handle for NFS V3. They insist that
- * the file handle set in nfs_args be plain bytes, and not
- * include the length field.
- */
- NFS_FH_DREF(nap->NFS_FH_FIELD, &fhp->v3.am_fh3_data);
-# else /* not defined(HAVE_NFS_ARGS_T_FHSIZE) || defined(HAVE_NFS_ARGS_T_FH_LEN) */
- NFS_FH_DREF(nap->NFS_FH_FIELD, &fhp->v3);
-# endif /* not defined(HAVE_NFS_ARGS_T_FHSIZE) || defined(HAVE_NFS_ARGS_T_FH_LEN) */
-# ifdef MNT2_NFS_OPT_NFSV3
- nap->flags |= MNT2_NFS_OPT_NFSV3;
-# endif /* MNT2_NFS_OPT_NFSV3 */
-# ifdef MNT2_NFS_OPT_VER3
- nap->flags |= MNT2_NFS_OPT_VER3;
-# endif /* MNT2_NFS_OPT_VER3 */
- } else
-#endif /* HAVE_FS_NFS3 */
- NFS_FH_DREF(nap->NFS_FH_FIELD, &fhp->v2);
-
-#ifdef HAVE_NFS_ARGS_T_FHSIZE
-# ifdef HAVE_FS_NFS3
- if (nfs_version == NFS_VERSION3)
- nap->fhsize = fhp->v3.am_fh3_length;
- else
-# endif /* HAVE_FS_NFS3 */
- nap->fhsize = FHSIZE;
-#endif /* HAVE_NFS_ARGS_T_FHSIZE */
-
- /* this is the version of the nfs_args structure, not of NFS! */
-#ifdef HAVE_NFS_ARGS_T_FH_LEN
-# ifdef HAVE_FS_NFS3
- if (nfs_version == NFS_VERSION3)
- nap->fh_len = fhp->v3.am_fh3_length;
- else
-# endif /* HAVE_FS_NFS3 */
- nap->fh_len = FHSIZE;
-#endif /* HAVE_NFS_ARGS_T_FH_LEN */
-
- /************************************************************************/
- /*** HOST NAME ***/
- /************************************************************************/
- /*
- * XXX: warning, using xstrlcpy in NFS_HN_DREF, which may corrupt a
- * struct nfs_args, or truncate our concocted "hostname:/path"
- * string prematurely.
- */
- NFS_HN_DREF(nap->hostname, host_name);
-#ifdef MNT2_NFS_OPT_HOSTNAME
- nap->flags |= MNT2_NFS_OPT_HOSTNAME;
-#endif /* MNT2_NFS_OPT_HOSTNAME */
-
- /************************************************************************/
- /*** IP ADDRESS OF REMOTE HOST ***/
- /************************************************************************/
- if (ip_addr) {
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- nap->addr = ALLOC(struct netbuf); /* free()'ed at end of mount_nfs_fh() */
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
- NFS_SA_DREF(nap, ip_addr);
- }
-
- /************************************************************************/
- /*** NFS PROTOCOL (UDP, TCP) AND VERSION ***/
- /************************************************************************/
-#ifdef MNT2_NFS_OPT_TCP
- if (nfs_proto && STREQ(nfs_proto, "tcp"))
- nap->flags |= MNT2_NFS_OPT_TCP;
-#endif /* MNT2_NFS_OPT_TCP */
-
-#ifdef HAVE_NFS_ARGS_T_SOTYPE
- /* bsdi3 uses this */
- if (nfs_proto) {
- if (STREQ(nfs_proto, "tcp"))
- nap->sotype = SOCK_STREAM;
- else if (STREQ(nfs_proto, "udp"))
- nap->sotype = SOCK_DGRAM;
- }
-#endif /* HAVE_NFS_ARGS_T_SOTYPE */
-
-#ifdef HAVE_NFS_ARGS_T_PROTO
- nap->proto = 0; /* bsdi3 sets this field to zero */
-# ifdef IPPROTO_TCP
- if (nfs_proto) {
- if (STREQ(nfs_proto, "tcp")) /* AIX 4.2.x needs this */
- nap->proto = IPPROTO_TCP;
- else if (STREQ(nfs_proto, "udp"))
- nap->proto = IPPROTO_UDP;
- }
-# endif /* IPPROTO_TCP */
-#endif /* HAVE_NFS_ARGS_T_SOTYPE */
-
-#ifdef HAVE_NFS_ARGS_T_VERSION
-# ifdef NFS_ARGSVERSION
- nap->version = NFS_ARGSVERSION; /* BSDI 3.0 and OpenBSD 2.2 */
-# endif /* NFS_ARGSVERSION */
-# ifdef DG_MOUNT_NFS_VERSION
- nap->version = DG_MOUNT_NFS_VERSION; /* dg-ux */
-# endif /* DG_MOUNT_NFS_VERSION */
-#endif /* HAVE_NFS_ARGS_VERSION */
-
- /************************************************************************/
- /*** OTHER NFS SOCKET RELATED OPTIONS AND FLAGS ***/
- /************************************************************************/
-#ifdef MNT2_NFS_OPT_NOCONN
- /* check if user specified to use unconnected or connected sockets */
- if (amu_hasmntopt(mntp, MNTTAB_OPT_NOCONN) != NULL)
- nap->flags |= MNT2_NFS_OPT_NOCONN;
- else if (amu_hasmntopt(mntp, MNTTAB_OPT_CONN) != NULL)
- nap->flags &= ~MNT2_NFS_OPT_NOCONN;
- else {
- /*
- * Some OSs want you to set noconn always. Some want you to always turn
- * it off. Others want you to turn it on/off only if NFS V.3 is used.
- * And all of that changes from revision to another. This is
- * particularly true of OpenBSD, NetBSD, and FreeBSD. So, rather than
- * attempt to auto-detect this, I'm forced to "fix" it in the individual
- * conf/nfs_prot/nfs_prot_*.h files.
- */
-# ifdef USE_UNCONNECTED_NFS_SOCKETS
- if (!(nap->flags & MNT2_NFS_OPT_NOCONN)) {
- nap->flags |= MNT2_NFS_OPT_NOCONN;
- plog(XLOG_WARNING, "noconn option not specified, and was just turned ON (OS override)! (May cause NFS hangs on some systems...)");
- }
-# endif /* USE_UNCONNECTED_NFS_SOCKETS */
-# ifdef USE_CONNECTED_NFS_SOCKETS
- if (nap->flags & MNT2_NFS_OPT_NOCONN) {
- nap->flags &= ~MNT2_NFS_OPT_NOCONN;
- plog(XLOG_WARNING, "noconn option specified, and was just turned OFF (OS override)! (May cause NFS hangs on some systems...)");
- }
-# endif /* USE_CONNECTED_NFS_SOCKETS */
- }
-#endif /* MNT2_NFS_OPT_NOCONN */
-
-#ifdef MNT2_NFS_OPT_RESVPORT
-# ifdef MNTTAB_OPT_RESVPORT
- if (amu_hasmntopt(mntp, MNTTAB_OPT_RESVPORT) != NULL)
- nap->flags |= MNT2_NFS_OPT_RESVPORT;
-# else /* not MNTTAB_OPT_RESVPORT */
- nap->flags |= MNT2_NFS_OPT_RESVPORT;
-# endif /* not MNTTAB_OPT_RESVPORT */
-#endif /* MNT2_NFS_OPT_RESVPORT */
-
- /************************************************************************/
- /*** OTHER FLAGS AND OPTIONS ***/
- /************************************************************************/
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- /* set up syncaddr field */
- nap->syncaddr = (struct netbuf *) NULL;
-
- /* set up knconf field */
- if (get_knetconfig(&nap->knconf, nfsncp, nfs_proto) < 0) {
- plog(XLOG_FATAL, "cannot fill knetconfig structure for nfs_args");
- going_down(1);
- }
- /* update the flags field for knconf */
- nap->flags |= MNT2_NFS_OPT_KNCONF;
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
-
-#ifdef MNT2_NFS_OPT_FSNAME
- nap->fsname = fs_name;
- nap->flags |= MNT2_NFS_OPT_FSNAME;
-#endif /* MNT2_NFS_OPT_FSNAME */
-
- nap->rsize = hasmntval(mntp, MNTTAB_OPT_RSIZE);
-#ifdef MNT2_NFS_OPT_RSIZE
- if (nap->rsize)
- nap->flags |= MNT2_NFS_OPT_RSIZE;
-#endif /* MNT2_NFS_OPT_RSIZE */
- if (nfs_version == NFS_VERSION && nap->rsize > 8192)
- nap->rsize = 8192;
-
- nap->wsize = hasmntval(mntp, MNTTAB_OPT_WSIZE);
-#ifdef MNT2_NFS_OPT_WSIZE
- if (nap->wsize)
- nap->flags |= MNT2_NFS_OPT_WSIZE;
-#endif /* MNT2_NFS_OPT_WSIZE */
- if (nfs_version == NFS_VERSION && nap->wsize > 8192)
- nap->wsize = 8192;
-
- nap->timeo = hasmntval(mntp, MNTTAB_OPT_TIMEO);
-#ifdef MNT2_NFS_OPT_TIMEO
- if (nap->timeo)
- nap->flags |= MNT2_NFS_OPT_TIMEO;
-#endif /* MNT2_NFS_OPT_TIMEO */
-
- nap->retrans = hasmntval(mntp, MNTTAB_OPT_RETRANS);
-#ifdef MNT2_NFS_OPT_RETRANS
- if (nap->retrans)
- nap->flags |= MNT2_NFS_OPT_RETRANS;
-#endif /* MNT2_NFS_OPT_RETRANS */
-
-#ifdef MNT2_NFS_OPT_BIODS
- if ((nap->biods = hasmntval(mntp, MNTTAB_OPT_BIODS)))
- nap->flags |= MNT2_NFS_OPT_BIODS;
-#endif /* MNT2_NFS_OPT_BIODS */
-
-#ifdef MNT2_NFS_OPT_SOFT
- if (amu_hasmntopt(mntp, MNTTAB_OPT_SOFT) != NULL)
- nap->flags |= MNT2_NFS_OPT_SOFT;
-#endif /* MNT2_NFS_OPT_SOFT */
-
-#ifdef MNT2_NFS_OPT_SPONGY
- if (amu_hasmntopt(mntp, MNTTAB_OPT_SPONGY) != NULL) {
- nap->flags |= MNT2_NFS_OPT_SPONGY;
- if (nap->flags & MNT2_NFS_OPT_SOFT) {
- plog(XLOG_USER, "Mount opts soft and spongy are incompatible - soft ignored");
- nap->flags &= ~MNT2_NFS_OPT_SOFT;
- }
- }
-#endif /* MNT2_NFS_OPT_SPONGY */
-
-#if defined(MNT2_GEN_OPT_RONLY) && defined(MNT2_NFS_OPT_RONLY)
- /* Ultrix has separate generic and NFS ro flags */
- if (genflags & MNT2_GEN_OPT_RONLY)
- nap->flags |= MNT2_NFS_OPT_RONLY;
-#endif /* defined(MNT2_GEN_OPT_RONLY) && defined(MNT2_NFS_OPT_RONLY) */
-
-#ifdef MNTTAB_OPT_INTR
- if (amu_hasmntopt(mntp, MNTTAB_OPT_INTR) != NULL)
- /*
- * Either turn on the "allow interrupts" option, or
- * turn off the "disallow interrupts" option"
- */
-# ifdef MNT2_NFS_OPT_INTR
- nap->flags |= MNT2_NFS_OPT_INTR;
-# endif /* MNT2_NFS_OPT_INTR */
-# ifdef MNT2_NFS_OPT_NOINTR
- nap->flags &= ~MNT2_NFS_OPT_NOINTR;
-# endif /* MNT2_NFS_OPT_NOINTR */
-# ifdef MNT2_NFS_OPT_INT
- nap->flags |= MNT2_NFS_OPT_INT;
-# endif /* MNT2_NFS_OPT_INT */
-# ifdef MNT2_NFS_OPT_NOINT
- nap->flags &= ~MNT2_NFS_OPT_NOINT;
-# endif /* MNT2_NFS_OPT_NOINT */
-#endif /* MNTTAB_OPT_INTR */
-
-#ifdef MNTTAB_OPT_NODEVS
- if (amu_hasmntopt(mntp, MNTTAB_OPT_NODEVS) != NULL)
- nap->flags |= MNT2_NFS_OPT_NODEVS;
-#endif /* MNTTAB_OPT_NODEVS */
-
-#ifdef MNTTAB_OPT_COMPRESS
- if (amu_hasmntopt(mntp, MNTTAB_OPT_COMPRESS) != NULL)
- nap->flags |= MNT2_NFS_OPT_COMPRESS;
-#endif /* MNTTAB_OPT_COMPRESS */
-
-#ifdef MNTTAB_OPT_PRIVATE /* mount private, single-client tree */
- if (amu_hasmntopt(mntp, MNTTAB_OPT_PRIVATE) != NULL)
- nap->flags |= MNT2_NFS_OPT_PRIVATE;
-#endif /* MNTTAB_OPT_PRIVATE */
-
-#ifdef MNTTAB_OPT_SYMTTL /* symlink cache time-to-live */
- if ((nap->symttl = hasmntval(mntp, MNTTAB_OPT_SYMTTL)))
- nap->flags |= MNT2_NFS_OPT_SYMTTL;
-#endif /* MNTTAB_OPT_SYMTTL */
-
-#ifdef MNT2_NFS_OPT_PGTHRESH /* paging threshold */
- if ((nap->pg_thresh = hasmntval(mntp, MNTTAB_OPT_PGTHRESH)))
- nap->flags |= MNT2_NFS_OPT_PGTHRESH;
-#endif /* MNT2_NFS_OPT_PGTHRESH */
-
-#if defined(MNT2_NFS_OPT_NOCTO) && defined(MNTTAB_OPT_NOCTO)
- if (amu_hasmntopt(mntp, MNTTAB_OPT_NOCTO) != NULL)
- nap->flags |= MNT2_NFS_OPT_NOCTO;
-#endif /* defined(MNT2_NFS_OPT_NOCTO) && defined(MNTTAB_OPT_NOCTO) */
-
-#if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX)
- if (amu_hasmntopt(mntp, MNTTAB_OPT_POSIX) != NULL) {
- nap->flags |= MNT2_NFS_OPT_POSIX;
- nap->pathconf = NULL;
- }
-#endif /* MNT2_NFS_OPT_POSIX && MNTTAB_OPT_POSIX */
-
-#if defined(MNT2_NFS_OPT_PROPLIST) && defined(MNTTAB_OPT_PROPLIST)
- if (amu_hasmntopt(mntp, MNTTAB_OPT_PROPLIST) != NULL)
- nap->flags |= MNT2_NFS_OPT_PROPLIST;
-#endif /* defined(MNT2_NFS_OPT_PROPLIST) && defined(MNTTAB_OPT_PROPLIST) */
-
-#if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS)
- nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS);
- if (nap->maxgrouplist != 0)
- nap->flags |= MNT2_NFS_OPT_MAXGRPS;
-#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */
-
-#if defined(MNT2_NFS_OPT_NONLM) && defined(MNTTAB_OPT_NOLOCK)
- if (amu_hasmntopt(mntp, MNTTAB_OPT_NOLOCK) != NULL)
- nap->flags |= MNT2_NFS_OPT_NONLM;
-#endif /* defined(MNT2_NFS_OPT_NONLM) && defined(MNTTAB_OPT_NOLOCK) */
-
-#if defined(MNT2_NFS_OPT_XLATECOOKIE) && defined(MNTTAB_OPT_XLATECOOKIE)
- if (amu_hasmntopt(mntp, MNTTAB_OPT_XLATECOOKIE) != NULL)
- nap->flags |= MNT2_NFS_OPT_XLATECOOKIE;
-#endif /* defined(MNT2_NFS_OPT_XLATECOOKIE) && defined(MNTTAB_OPT_XLATECOOKIE) */
-
-#ifdef HAVE_NFS_ARGS_T_OPTSTR
- nap->optstr = mntp->mnt_opts;
-#endif /* HAVE_NFS_ARGS_T_OPTSTR */
-
- /************************************************************************/
- /*** FINAL ACTIONS ***/
- /************************************************************************/
-
-#ifdef HAVE_NFS_ARGS_T_GFS_FLAGS
- /* Ultrix stores generic flags in nfs_args.gfs_flags. */
- nap->gfs_flags = genflags;
-#endif /* HAVE_NFS_ARGS_T_FLAGS */
-
- return; /* end of compute_nfs_args() function */
-}
-
-
-/*
- * Fill in special values for flags and fields of nfs_args, for an
- * automounter NFS mount.
- */
-void
-compute_automounter_nfs_args(nfs_args_t *nap, mntent_t *mntp)
-{
-#ifdef MNT2_NFS_OPT_SYMTTL
- /*
- * Don't let the kernel cache symbolic links we generate, or else lookups
- * will bypass amd and fail to remount stuff as needed.
- */
- plog(XLOG_INFO, "turning on NFS option symttl and setting value to 0");
- nap->flags |= MNT2_NFS_OPT_SYMTTL;
- nap->symttl = 0;
-#endif /* MNT2_NFS_OPT_SYMTTL */
-
- /*
- * This completes the flags for the HIDE_MOUNT_TYPE code in the
- * mount_amfs_toplvl() function in amd/amfs_toplvl.c.
- * Some systems don't have a mount type, but a mount flag.
- */
-#ifdef MNT2_NFS_OPT_AUTO
- nap->flags |= MNT2_NFS_OPT_AUTO;
-#endif /* MNT2_NFS_OPT_AUTO */
-#ifdef MNT2_NFS_OPT_IGNORE
- nap->flags |= MNT2_NFS_OPT_IGNORE;
-#endif /* MNT2_NFS_OPT_IGNORE */
-#ifdef MNT2_GEN_OPT_AUTOMNTFS
- nap->flags |= MNT2_GEN_OPT_AUTOMNTFS;
-#endif /* not MNT2_GEN_OPT_AUTOMNTFS */
-
-#ifdef MNT2_NFS_OPT_DUMBTIMR
- /*
- * Don't let the kernel start computing throughput of Amd. The numbers
- * will be meaningless because of the way Amd does mount retries.
- */
- plog(XLOG_INFO, "%s: disabling nfs congestion window", mntp->mnt_dir);
- nap->flags |= MNT2_NFS_OPT_DUMBTIMR;
-#endif /* MNT2_NFS_OPT_DUMBTIMR */
-
- /* compute all of the NFS attribute-cache flags */
- compute_nfs_attrcache_flags(nap, mntp);
-
- /*
- * Provide a slight bit more security by requiring the kernel to use
- * reserved ports.
- */
-#ifdef MNT2_NFS_OPT_RESVPORT
- nap->flags |= MNT2_NFS_OPT_RESVPORT;
-#endif /* MNT2_NFS_OPT_RESVPORT */
-}
-
-
-#ifdef DEBUG
-/* get string version (in hex) of identifier */
-static char *
-get_hex_string(u_int len, const char *fhdata)
-{
- u_int i;
- static char buf[128]; /* better not go over it! */
- char str[16];
- short int arr[64];
-
- if (!fhdata)
- return NULL;
- buf[0] = '\0';
- memset(&arr[0], 0, (64 * sizeof(short int)));
- memcpy(&arr[0], &fhdata[0], len);
- for (i=0; i<len/sizeof(unsigned short int); i++) {
- xsnprintf(str, sizeof(str), "%04x", ntohs(arr[i]));
- xstrlcat(buf, str, sizeof(buf));
- }
- return buf;
-}
-
-
-/*
- * print a subset of fields from "struct nfs_args" that are otherwise
- * not being provided anywhere else.
- */
-void
-print_nfs_args(const nfs_args_t *nap, u_long nfs_version)
-{
- int fhlen = 32; /* default: NFS V.2 file handle length is 32 */
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- struct netbuf *nbp;
- struct knetconfig *kncp;
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- struct sockaddr_in *sap;
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-
- if (!nap) {
- plog(XLOG_DEBUG, "NULL nfs_args!");
- return;
- }
-
- /* override default file handle size */
-#ifdef FHSIZE
- fhlen = FHSIZE;
-#endif /* FHSIZE */
-#ifdef NFS_FHSIZE
- fhlen = NFS_FHSIZE;
-#endif /* NFS_FHSIZE */
-
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- nbp = nap->addr;
- plog(XLOG_DEBUG, "NA->addr {netbuf} (maxlen=%d, len=%d) = \"%s\"",
- nbp->maxlen, nbp->len,
- get_hex_string(nbp->len, nbp->buf));
- nbp = nap->syncaddr;
- plog(XLOG_DEBUG, "NA->syncaddr {netbuf} %p", nbp);
- kncp = nap->knconf;
- plog(XLOG_DEBUG, "NA->knconf->semantics %lu", (u_long) kncp->knc_semantics);
- plog(XLOG_DEBUG, "NA->knconf->protofmly \"%s\"", kncp->knc_protofmly);
- plog(XLOG_DEBUG, "NA->knconf->proto \"%s\"", kncp->knc_proto);
- plog(XLOG_DEBUG, "NA->knconf->rdev %lu", (u_long) kncp->knc_rdev);
- /* don't print knconf->unused field */
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
-# ifdef NFS_ARGS_T_ADDR_IS_POINTER
- sap = (struct sockaddr_in *) nap->addr;
-# else /* not NFS_ARGS_T_ADDR_IS_POINTER */
- sap = (struct sockaddr_in *) &nap->addr;
-# endif /* not NFS_ARGS_T_ADDR_IS_POINTER */
- plog(XLOG_DEBUG, "NA->addr {sockaddr_in} (len=%d) = \"%s\"",
- (int) sizeof(struct sockaddr_in),
- get_hex_string(sizeof(struct sockaddr_in), (const char *)sap));
-#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- plog(XLOG_DEBUG, "NA->addr.sin_len = %d", sap->sin_len);
-#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
- plog(XLOG_DEBUG, "NA->addr.sin_family = %d", sap->sin_family);
- plog(XLOG_DEBUG, "NA->addr.sin_port = %d", sap->sin_port);
- plog(XLOG_DEBUG, "NA->addr.sin_addr = \"%s\"",
- get_hex_string(sizeof(struct in_addr), (const char *) &sap->sin_addr));
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
-#ifdef HAVE_NFS_ARGS_T_ADDRLEN
- plog(XLOG_DEBUG, "NA->addrlen = %d", nap->addrlen);
-#endif /* ifdef HAVE_NFS_ARGS_T_ADDRLEN */
-
- plog(XLOG_DEBUG, "NA->hostname = \"%s\"", nap->hostname ? nap->hostname : "null");
-#ifdef HAVE_NFS_ARGS_T_NAMLEN
- plog(XLOG_DEBUG, "NA->namlen = %d", nap->namlen);
-#endif /* HAVE_NFS_ARGS_T_NAMLEN */
-
-#ifdef MNT2_NFS_OPT_FSNAME
- plog(XLOG_DEBUG, "NA->fsname = \"%s\"", nap->fsname ? nap->fsname : "null");
-#endif /* MNT2_NFS_OPT_FSNAME */
-
-#ifdef HAVE_NFS_ARGS_T_FHSIZE
- plog(XLOG_DEBUG, "NA->fhsize = %d", nap->fhsize);
- fhlen = nap->fhsize;
-#endif /* HAVE_NFS_ARGS_T_FHSIZE */
-#ifdef HAVE_NFS_ARGS_T_FH_LEN
- plog(XLOG_DEBUG, "NA->fh_len = %d", nap->fh_len);
- fhlen = nap->fh_len;
-#endif /* HAVE_NFS_ARGS_T_FH_LEN */
-
- /*
- * XXX: need to figure out how to correctly print file handles,
- * since some times they are pointers, and sometimes the real structure
- * is stored in nfs_args. Even if it is a pointer, it can be the actual
- * char[] array, or a structure containing multiple fields.
- */
- plog(XLOG_DEBUG, "NA->filehandle = \"%s\"",
- get_hex_string(fhlen, (const char *) &nap->NFS_FH_FIELD));
-
-#ifdef HAVE_NFS_ARGS_T_SOTYPE
- plog(XLOG_DEBUG, "NA->sotype = %d", nap->sotype);
-#endif /* HAVE_NFS_ARGS_T_SOTYPE */
-#ifdef HAVE_NFS_ARGS_T_PROTO
- plog(XLOG_DEBUG, "NA->proto = %d", (int) nap->proto);
-#endif /* HAVE_NFS_ARGS_T_PROTO */
-#ifdef HAVE_NFS_ARGS_T_VERSION
- plog(XLOG_DEBUG, "NA->version = %d", nap->version);
-#endif /* HAVE_NFS_ARGS_T_VERSION */
-
- plog(XLOG_DEBUG, "NA->flags = 0x%x", (int) nap->flags);
-
- plog(XLOG_DEBUG, "NA->rsize = %d", (int) nap->rsize);
- plog(XLOG_DEBUG, "NA->wsize = %d", (int) nap->wsize);
-#ifdef HAVE_NFS_ARGS_T_BSIZE
- plog(XLOG_DEBUG, "NA->bsize = %d", nap->bsize);
-#endif /* HAVE_NFS_ARGS_T_BSIZE */
- plog(XLOG_DEBUG, "NA->timeo = %d", (int) nap->timeo);
- plog(XLOG_DEBUG, "NA->retrans = %d", (int) nap->retrans);
-
-#ifdef HAVE_NFS_ARGS_T_ACREGMIN
- plog(XLOG_DEBUG, "NA->acregmin = %d", (int) nap->acregmin);
- plog(XLOG_DEBUG, "NA->acregmax = %d", (int) nap->acregmax);
- plog(XLOG_DEBUG, "NA->acdirmin = %d", (int) nap->acdirmin);
- plog(XLOG_DEBUG, "NA->acdirmax = %d", (int) nap->acdirmax);
-#endif /* HAVE_NFS_ARGS_T_ACREGMIN */
-#ifdef MNTTAB_OPT_SYMTTL
- plog(XLOG_DEBUG, "NA->symttl = %d", nap->symttl);
-#endif /* MNTTAB_OPT_SYMTTL */
-#ifdef MNTTAB_OPT_PG_THRESH
- plog(XLOG_DEBUG, "NA->pg_thresh = %d", nap->pg_thresh);
-#endif /* MNTTAB_OPT_PG_THRESH */
-
-#ifdef MNT2_NFS_OPT_BIODS
- plog(XLOG_DEBUG, "NA->biods = %d", nap->biods);
-#endif /* MNT2_NFS_OPT_BIODS */
-
-}
-#endif /* DEBUG */
diff --git a/contrib/amd/libamu/mtab.c b/contrib/amd/libamu/mtab.c
deleted file mode 100644
index 50ba994733f0..000000000000
--- a/contrib/amd/libamu/mtab.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/mtab.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-/*
- * Firewall /etc/mtab entries
- */
-void
-mnt_free(mntent_t *mp)
-{
- XFREE(mp->mnt_fsname);
- XFREE(mp->mnt_dir);
- XFREE(mp->mnt_type);
- XFREE(mp->mnt_opts);
-
-#ifdef HAVE_MNTENT_T_MNT_TIME
-# ifdef HAVE_MNTENT_T_MNT_TIME_STRING
- XFREE(mp->mnt_time);
-# endif /* HAVE_MNTENT_T_MNT_TIME_STRING */
-#endif /* HAVE_MNTENT_T_MNT_TIME */
-
- XFREE(mp);
-}
-
-
-/*
- * Discard memory allocated for mount list
- */
-void
-discard_mntlist(mntlist *mp)
-{
- mntlist *mp2;
-
- while ((mp2 = mp)) {
- mp = mp->mnext;
- if (mp2->mnt)
- mnt_free(mp2->mnt);
- XFREE(mp2);
- }
-}
-
-
-/*
- * Throw away a mount list
- */
-void
-free_mntlist(mntlist *mp)
-{
- discard_mntlist(mp);
-#ifdef MOUNT_TABLE_ON_FILE
- unlock_mntlist();
-#endif /* MOUNT_TABLE_ON_FILE */
-}
-
-
-/*
- * Utility routine which returns a pointer to whatever follows an = in a
- * string. Returns null if = is not found in the string.
- */
-char *
-haseq(char *instr)
-{
- if (instr) {
- char *eq = strchr(instr, '=');
- if (eq) return ++eq;
- }
- return NULL;
-}
-
-
-/*
- * Utility routine which returns a pointer to whatever
- * follows an = in a mount option. Returns null if option
- * doesn't exist or doesn't have an '='. Won't fail for opt,foo=.
- */
-char *
-hasmnteq(mntent_t *mnt, char *opt)
-{
- if (mnt && opt) { /* disallow null input pointers */
- if ( *opt ) { /* disallow the null string as an opt */
- char *str = amu_hasmntopt(mnt, opt);
- if ( str ) { /* option was there */
- char *eq = str + strlen(opt); /* Look at char just after option */
- if (*eq == '=') /* Is it '=' ? */
- return ++eq; /* If so, return pointer to remaining str */
- }
- }
- }
- return NULL;
-}
-
-
-/*
- * Wrapper around hasmntvalerr(), which retains backwards compatibiliy with
- * older use of hasmntval().
- *
- * XXX: eventually, all use of hasmntval() should be replaced with
- * hasmntvalerr().
- */
-int
-hasmntval(mntent_t *mnt, char *opt)
-{
- int err, val = 0;
-
- err = hasmntvalerr(mnt, opt, &val);
- if (err) /* if there was an error (hasmntvalerr returned 1) */
- return 0; /* redundant: val==0 above, but leave here for clarity */
- /* otherwise there was no error */
- return val;
-}
-
-
-/*
- * Utility routine which determines the value of a numeric option in the
- * mount options (such as port=%d), and fills in the value in the argument
- * valp (argument won't be touched if no value is set, for example due to an
- * error).
- *
- * Returns non-zero (1) on error; returns 0 on success.
- *
- * XXX: eventually, all use of hasmntval() should be replaced with
- * hasmntvalerr().
- */
-unsigned int
-hasmntvalerr(mntent_t *mnt, char *opt, int *valp)
-{
- char *str = amu_hasmntopt(mnt, opt);
- int err = 1; /* 1 means no good value was set (an error) */
- char *eq, *endptr;
- long int i;
-
- /* exit if no option specificed */
- if (!str) {
- goto out;
- }
-
- eq = hasmnteq(mnt, opt);
-
- if (!eq) { /* no argument to option ('=' sign was missing) */
- plog(XLOG_MAP, "numeric option to \"%s\" missing", opt);
- goto out;
- }
-
- /* if got here, then we had an '=' after option name */
- endptr = NULL;
- i = strtol(eq, &endptr, 0); /* hex and octal allowed ;-) */
- if (!endptr ||
- (endptr != eq && (*endptr == ',' || *endptr == '\0'))) {
- /*
- * endptr set means strtol saw a non-digit. If the non-digit is a
- * comma, it's probably the start of the next option. If the comma is
- * the first char though, complain about it (foo=,bar is made
- * noticeable by this).
- *
- * Similar reasoning for '\0' instead of comma, it's the end of the
- * string.
- */
- *valp = (int) i; /* set good value */
- err = 0; /* no error */
- } else {
- /* whatever was after the '=' sign wasn't a number */
- plog(XLOG_MAP, "invalid numeric option in \"%s\": \"%s\"", opt, str);
- /* fall through to error/exit processing */
- }
-
- out:
- return err;
-}
-
-
-/*
- * Utility routine which returns the string value of
- * an option in the mount options (such as proto=udp).
- * Returns NULL if the option is not specified.
- * Returns malloc'ed string (caller must free!)
- */
-char *
-hasmntstr(mntent_t *mnt, char *opt)
-{
- char *str = amu_hasmntopt(mnt, opt);
-
- if (str) { /* The option was there */
-
- char *eq = hasmnteq(mnt, opt);
-
- if (eq) { /* and had an = after it */
-
- char *endptr = strchr(eq, ',');
-
- /* if saw no comma, return strdup'd string */
- if (!endptr)
- return strdup(eq);
- else {
- /* else we need to copy only the chars needed */
- int len = endptr - eq;
- char *buf = xmalloc(len + 1);
- strncpy(buf, eq, len);
- buf[len] = '\0';
- return buf;
- }
- }
- }
- return NULL;
-}
diff --git a/contrib/amd/libamu/nfs_prot_xdr.c b/contrib/amd/libamu/nfs_prot_xdr.c
deleted file mode 100644
index df8a0b006b55..000000000000
--- a/contrib/amd/libamu/nfs_prot_xdr.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1989 Jan-Simon Pendry
- * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/nfs_prot_xdr.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-bool_t
-xdr_amq_string(XDR *xdrs, amq_string *objp)
-{
- if (!xdr_string(xdrs, objp, AMQ_STRLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
diff --git a/contrib/amd/libamu/strerror.c b/contrib/amd/libamu/strerror.c
deleted file mode 100644
index 49dd2fc3ce9f..000000000000
--- a/contrib/amd/libamu/strerror.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2002-2006 Ion Badulescu
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/strerror.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-/*
- * Convert errno to a string
- */
-char *
-strerror(int errnum)
-{
-#ifdef HAVE_EXTERN_SYS_ERRLIST
- if (errnum < 0 || errnum >= (sizeof(sys_errlist) >> 2)) {
- static char errstr[30];
- xsnprintf(errstr, sizeof(errstr), "Unknown error #%d", errnum);
- return errstr;
- }
- return sys_errlist[error];
-#else /* not HAVE_EXTERN_SYS_ERRLIST */
- return "unknown (strerror not available)";
-#endif /* not HAVE_EXTERN_SYS_ERRLIST */
-}
diff --git a/contrib/amd/libamu/strutil.c b/contrib/amd/libamu/strutil.c
deleted file mode 100644
index 5a1e759bff67..000000000000
--- a/contrib/amd/libamu/strutil.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/strutil.c
- *
- */
-
-/*
- * String Utilities.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-char *
-strnsave(const char *str, int len)
-{
- char *sp = (char *) xmalloc(len + 1);
- memmove(sp, str, len);
- sp[len] = '\0';
-
- return sp;
-}
-
-
-/*
- * Concatenate three strings and store the result in the buffer pointed to
- * by p, making p large enough to hold the strings
- */
-char *
-str3cat(char *p, char *s1, char *s2, char *s3)
-{
- int l1 = strlen(s1);
- int l2 = strlen(s2);
- int l3 = strlen(s3);
-
- p = (char *) xrealloc(p, l1 + l2 + l3 + 1);
- memmove(p, s1, l1);
- memmove(p + l1, s2, l2);
- memmove(p + l1 + l2, s3, l3 + 1);
- return p;
-}
-
-
-/*
- * Split s using ch as delimiter and qc as quote character
- */
-char **
-strsplit(char *s, int ch, int qc)
-{
- char **ivec;
- int ic = 0;
- int done = 0;
-
- ivec = (char **) xmalloc((ic + 1) * sizeof(char *));
-
- while (!done) {
- char *v;
-
- /*
- * skip to split char
- */
- while (*s && (ch == ' ' ? (isascii((unsigned char)*s) && isspace((unsigned char)*s)) : *s == ch))
- *s++ = '\0';
-
- /*
- * End of string?
- */
- if (!*s)
- break;
-
- /*
- * remember start of string
- */
- v = s;
-
- /*
- * skip to split char
- */
- while (*s && !(ch == ' ' ? (isascii((unsigned char)*s) && isspace((unsigned char)*s)) : *s == ch)) {
- if (*s++ == qc) {
- /*
- * Skip past string.
- */
- s++;
- while (*s && *s != qc)
- s++;
- if (*s == qc)
- s++;
- }
- }
-
- if (!*s)
- done = 1;
- *s++ = '\0';
-
- /*
- * save string in new ivec slot
- */
- ivec[ic++] = v;
- ivec = (char **) xrealloc((voidp) ivec, (ic + 1) * sizeof(char *));
- if (amuDebug(D_STR))
- plog(XLOG_DEBUG, "strsplit saved \"%s\"", v);
- }
-
- if (amuDebug(D_STR))
- plog(XLOG_DEBUG, "strsplit saved a total of %d strings", ic);
-
- ivec[ic] = NULL;
-
- return ivec;
-}
-
-
-/*
- * Use generic strlcpy to copy a string more carefully, null-terminating it
- * as needed. However, if the copied string was truncated due to lack of
- * space, then warn us.
- *
- * For now, xstrlcpy returns VOID because it doesn't look like anywhere in
- * the Amd code do we actually use the return value of strncpy/strlcpy.
- */
-void
-#ifdef DEBUG
-_xstrlcpy(const char *filename, int lineno, char *dst, const char *src, size_t len)
-#else /* not DEBUG */
-xstrlcpy(char *dst, const char *src, size_t len)
-#endif /* not DEBUG */
-{
- if (len == 0)
- return;
- if (strlcpy(dst, src, len) >= len)
-#ifdef DEBUG
- plog(XLOG_ERROR, "xstrlcpy(%s:%d): string \"%s\" truncated to \"%s\"",
- filename, lineno, src, dst);
-#else /* not DEBUG */
- plog(XLOG_ERROR, "xstrlcpy: string \"%s\" truncated to \"%s\"", src, dst);
-#endif /* not DEBUG */
-}
-
-
-/*
- * Use generic strlcat to concatenate a string more carefully,
- * null-terminating it as needed. However, if the copied string was
- * truncated due to lack of space, then warn us.
- *
- * For now, xstrlcat returns VOID because it doesn't look like anywhere in
- * the Amd code do we actually use the return value of strncat/strlcat.
- */
-void
-#ifdef DEBUG
-_xstrlcat(const char *filename, int lineno, char *dst, const char *src, size_t len)
-#else /* not DEBUG */
-xstrlcat(char *dst, const char *src, size_t len)
-#endif /* not DEBUG */
-{
- if (len == 0)
- return;
- if (strlcat(dst, src, len) >= len) {
- /* strlcat does not null terminate if the size of src is equal to len. */
- dst[strlen(dst) - 1] = '\0';
-#ifdef DEBUG
- plog(XLOG_ERROR, "xstrlcat(%s:%d): string \"%s\" truncated to \"%s\"",
- filename, lineno, src, dst);
-#else /* not DEBUG */
- plog(XLOG_ERROR, "xstrlcat: string \"%s\" truncated to \"%s\"", src, dst);
-#endif /* not DEBUG */
- }
-}
-
-
-/* our version of snprintf */
-int
-#if defined(DEBUG) && (defined(HAVE_C99_VARARGS_MACROS) || defined(HAVE_GCC_VARARGS_MACROS))
-_xsnprintf(const char *filename, int lineno, char *str, size_t size, const char *format, ...)
-#else /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
-xsnprintf(char *str, size_t size, const char *format, ...)
-#endif /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
-{
- va_list ap;
- int ret = 0;
-
- va_start(ap, format);
-#if defined(DEBUG) && (defined(HAVE_C99_VARARGS_MACROS) || defined(HAVE_GCC_VARARGS_MACROS))
- ret = _xvsnprintf(filename, lineno, str, size, format, ap);
-#else /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
- ret = xvsnprintf(str, size, format, ap);
-#endif /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
- va_end(ap);
-
- return ret;
-}
-
-
-/* our version of vsnprintf */
-int
-#if defined(DEBUG) && (defined(HAVE_C99_VARARGS_MACROS) || defined(HAVE_GCC_VARARGS_MACROS))
-_xvsnprintf(const char *filename, int lineno, char *str, size_t size, const char *format, va_list ap)
-#else /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
-xvsnprintf(char *str, size_t size, const char *format, va_list ap)
-#endif /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
-{
- int ret = 0;
-
-#ifdef HAVE_VSNPRINTF
- ret = vsnprintf(str, size, format, ap);
-#else /* not HAVE_VSNPRINTF */
- ret = vsprintf(str, format, ap); /* less secure version */
-#endif /* not HAVE_VSNPRINTF */
- /*
- * If error or truncation, plog error.
- *
- * WARNING: we use the static 'maxtrunc' variable below to break out any
- * possible infinite recursion between plog() and xvsnprintf(). If it
- * ever happens, it'd indicate a bug in Amd.
- */
- if (ret < 0 || (size_t) ret >= size) { /* error or truncation occured */
- static int maxtrunc; /* hack to avoid inifinite loop */
- if (++maxtrunc > 10)
-#if defined(DEBUG) && (defined(HAVE_C99_VARARGS_MACROS) || defined(HAVE_GCC_VARARGS_MACROS))
- plog(XLOG_ERROR, "xvsnprintf(%s:%d): string %p truncated (ret=%d, format=\"%s\")",
- filename, lineno, str, ret, format);
-#else /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
- plog(XLOG_ERROR, "xvsnprintf: string %p truncated (ret=%d, format=\"%s\")",
- str, ret, format);
-#endif /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
- }
-
- return ret;
-}
diff --git a/contrib/amd/libamu/wire.c b/contrib/amd/libamu/wire.c
deleted file mode 100644
index c1852cdca7f1..000000000000
--- a/contrib/amd/libamu/wire.c
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/wire.c
- *
- */
-
-/*
- * This function returns the subnet (address&netmask) for the primary network
- * interface. If the resulting address has an entry in the hosts file, the
- * corresponding name is returned, otherwise the address is returned in
- * standard internet format.
- * As a side-effect, a list of local IP/net address is recorded for use
- * by the islocalnet() function.
- *
- * Derived from original by Paul Anderson (23/4/90)
- * Updates from Dirk Grunwald (11/11/91)
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-
-#ifdef HAVE_IFADDRS_H
-#include <ifaddrs.h>
-#endif /* HAVE_IFADDRS_H */
-
-#ifdef HAVE_IRS_H
-# include <irs.h>
-#endif /* HAVE_IRS_H */
-
-/*
- * List of locally connected networks
- */
-typedef struct addrlist addrlist;
-struct addrlist {
- addrlist *ip_next;
- u_long ip_addr; /* address of network */
- u_long ip_mask;
- char *ip_net_num; /* number of network */
- char *ip_net_name; /* name of network */
-};
-static addrlist *localnets = NULL;
-
-#if defined(IFF_LOCAL_LOOPBACK) && !defined(IFF_LOOPBACK)
-# define IFF_LOOPBACK IFF_LOCAL_LOOPBACK
-#endif /* defined(IFF_LOCAL_LOOPBACK) && !defined(IFF_LOOPBACK) */
-
-#define C(x) ((x) & 0xff)
-#define GFBUFLEN 1024
-#define S2IN(s) (((struct sockaddr_in *)(s))->sin_addr.s_addr)
-
-
-/* return malloc'ed buffer. caller must free it */
-char *
-print_wires(void)
-{
- addrlist *al;
- char s[256];
- int i;
- char *buf;
- int bufcount = 0;
- int buf_size = 1024;
-
- buf = SALLOC(buf_size); /* initial allocation (may grow!) */
- if (!buf)
- return NULL;
-
- if (!localnets) {
- xstrlcpy(buf, "No networks\n", buf_size);
- return buf;
- }
- /* check if there's more than one network */
- if (!localnets->ip_next) {
- /* use buf_size for sizeof(buf) because of the realloc() below */
- xsnprintf(buf, buf_size,
- "Network: wire=\"%s\" (netnumber=%s).\n",
- localnets->ip_net_name, localnets->ip_net_num);
- return buf;
- }
- buf[0] = '\0'; /* null out buffer before appending */
- for (i = 1, al = localnets; al; al = al->ip_next, i++) {
- xsnprintf(s, sizeof(s), "Network %d: wire=\"%s\" (netnumber=%s).\n",
- i, al->ip_net_name, al->ip_net_num);
- bufcount += strlen(s);
- if (bufcount > buf_size) {
- buf_size *= 2;
- buf = xrealloc(buf, buf_size);
- }
- xstrlcat(buf, s, buf_size);
- }
- return buf;
-}
-
-
-static struct addrlist *
-getwire_lookup(u_long address, u_long netmask, int ishost)
-{
- struct addrlist *al;
- u_long subnet;
- char netNumberBuf[64];
- char buf[GFBUFLEN], *s;
-#ifdef HAVE_IRS_H
- struct nwent *np;
-#else /* not HAVE_IRS_H */
- struct netent *np;
-#endif /* not HAVE_IRS_H */
-
- /*
- * Add interface to local network singly linked list
- */
- al = ALLOC(struct addrlist);
- al->ip_addr = address;
- al->ip_mask = netmask;
- al->ip_net_name = NO_SUBNET; /* fill in a bit later */
- al->ip_net_num = "0.0.0.0"; /* fill in a bit later */
- al->ip_next = NULL;
-
- subnet = ntohl(address) & ntohl(netmask);
-
- if (ishost)
- np = NULL;
- else {
-#ifdef HAVE_IRS_H
- u_long mask = ntohl(netmask);
- static struct irs_acc *irs_gen;
- static struct irs_nw *irs_nw;
- u_long net;
- int maskbits;
- u_char addr[4];
-
- if (irs_gen == NULL)
-#ifdef irs_irp_acc
- /*
- * bsdi4 added another argument to this function, without changing
- * its name. The irs_irp_acc is the one (hacky) distinguishing
- * feature found in <irs.h> that can differentiate between bsdi3 and
- * bsdi4.
- */
- irs_gen = irs_gen_acc("", NULL);
-#else /* not irs_irp_acc */
- irs_gen = irs_gen_acc("");
-#endif /* not irs_irp_acc */
- if (irs_gen && irs_nw == NULL)
- irs_nw = (*irs_gen->nw_map)(irs_gen);
- net = ntohl(address) & (mask = ntohl(netmask));
- addr[0] = (0xFF000000 & net) >> 24;
- addr[1] = (0x00FF0000 & net) >> 16;
- addr[2] = (0x0000FF00 & net) >> 8;
- addr[3] = (0x000000FF & net);
- for (maskbits = 32; !(mask & 1); mask >>= 1)
- maskbits--;
- np = (*irs_nw->byaddr)(irs_nw, addr, maskbits, AF_INET);
-#else /* not HAVE_IRS_H */
- np = getnetbyaddr(subnet, AF_INET);
- /*
- * Some systems (IRIX 6.4) cannot getnetbyaddr on networks such as
- * "128.59.16.0". Instead, they need to look for the short form of
- * the network, "128.59.16". So if the first getnetbyaddr failed, we
- * shift the subnet way from zeros and try again.
- */
- if (!np) {
- u_long short_subnet = subnet;
- while (short_subnet && (short_subnet & 0x000000ff) == 0)
- short_subnet >>= 8;
- np = getnetbyaddr(short_subnet, AF_INET);
- if (np)
- plog(XLOG_WARNING, "getnetbyaddr failed on 0x%x, succeeded on 0x%x",
- (u_int) subnet, (u_int) short_subnet);
- }
-#endif /* not HAVE_IRS_H */
- }
-
- if ((subnet & 0xffffff) == 0) {
- xsnprintf(netNumberBuf, sizeof(netNumberBuf), "%lu", C(subnet >> 24));
- } else if ((subnet & 0xffff) == 0) {
- xsnprintf(netNumberBuf, sizeof(netNumberBuf), "%lu.%lu",
- C(subnet >> 24), C(subnet >> 16));
- } else if ((subnet & 0xff) == 0) {
- xsnprintf(netNumberBuf, sizeof(netNumberBuf), "%lu.%lu.%lu",
- C(subnet >> 24), C(subnet >> 16),
- C(subnet >> 8));
- } else {
- xsnprintf(netNumberBuf, sizeof(netNumberBuf), "%lu.%lu.%lu.%lu",
- C(subnet >> 24), C(subnet >> 16),
- C(subnet >> 8), C(subnet));
- }
-
- /* fill in network number (string) */
- al->ip_net_num = strdup(netNumberBuf);
-
- if (np != NULL)
- s = np->n_name;
- else {
- struct hostent *hp;
-
- subnet = address & netmask;
- hp = gethostbyaddr((char *) &subnet, 4, AF_INET);
- if (hp != NULL)
- s = (char *) hp->h_name;
- else
- s = inet_dquad(buf, sizeof(buf), subnet);
- }
-
- /* fill in network name (string) */
- al->ip_net_name = strdup(s);
- /* Let's be cautious here about buffer overflows -Ion */
- if (strlen(s) > MAXHOSTNAMELEN) {
- al->ip_net_name[MAXHOSTNAMELEN] = '\0';
- plog(XLOG_WARNING, "Long hostname %s truncated to %d characters",
- s, MAXHOSTNAMELEN);
- }
-
- return (al);
-}
-
-
-/*
- * Make a dotted quad from a 32bit IP address
- * addr is in network byte order.
- * sizeof(buf) needs to be at least 16.
- */
-char *
-inet_dquad(char *buf, size_t l, u_long addr)
-{
- addr = ntohl(addr);
- xsnprintf(buf, l, "%ld.%ld.%ld.%ld",
- ((addr >> 24) & 0xff),
- ((addr >> 16) & 0xff),
- ((addr >> 8) & 0xff),
- ((addr >> 0) & 0xff));
- return buf;
-}
-
-
-/*
- * Determine whether a network is on a local network
- * (addr) is in network byte order.
- */
-int
-islocalnet(u_long addr)
-{
- addrlist *al;
-
- for (al = localnets; al; al = al->ip_next)
- if (((addr ^ al->ip_addr) & al->ip_mask) == 0)
- return TRUE;
-
-#ifdef DEBUG
- {
- char buf[16];
- plog(XLOG_INFO, "%s is on a remote network",
- inet_dquad(buf, sizeof(buf), addr));
- }
-#endif /* DEBUG */
-
- return FALSE;
-}
-
-
-/*
- * Determine whether a network name is one of the local networks
- * of a host.
- */
-int
-is_network_member(const char *net)
-{
- addrlist *al;
-
- /*
- * If the network name string does not contain a '/', use old behavior.
- * If it does contain a '/' then interpret the string as a network/netmask
- * pair. If "netmask" doesn't exist, use the interface's own netmask.
- * Also support fully explicit netmasks such as 255.255.255.0 as well as
- * bit-length netmask such as /24 (hex formats such 0xffffff00 work too).
- */
- if (strchr(net, '/') == NULL) {
- for (al = localnets; al; al = al->ip_next)
- if (STREQ(net, al->ip_net_name) || STREQ(net, al->ip_net_num))
- return TRUE;
- } else {
- char *netstr = strdup(net), *maskstr;
- u_long netnum, masknum = 0;
- maskstr = strchr(netstr, '/');
- maskstr[0] = '\0'; /* null terminate netstr */
- maskstr++;
- if (*maskstr == '\0') /* if empty string, make it NULL */
- maskstr = NULL;
- /* check if netmask uses a dotted-quad or bit-length, or not defined at all */
- if (maskstr) {
- if (strchr(maskstr, '.')) {
- /* XXX: inet_addr is obsolste, convert to inet_aton() */
- masknum = inet_addr(maskstr);
- if (masknum == INADDR_NONE) /* can be invalid (-1) or all-1s */
- masknum = 0xffffffff;
- } else if (NSTRCEQ(maskstr, "0x", 2)) {
- masknum = strtoul(maskstr, NULL, 16);
- } else {
- int bits = atoi(maskstr);
- if (bits < 0)
- bits = 0;
- if (bits > 32)
- bits = 32;
- masknum = 0xffffffff << (32-bits);
- }
- }
- netnum = inet_addr(netstr); /* not checking return value, b/c -1 (0xffffffff) is valid */
- XFREE(netstr); /* netstr not needed any longer */
-
- /* now check against each local interface */
- for (al = localnets; al; al = al->ip_next) {
- if ((al->ip_addr & (maskstr ? masknum : al->ip_mask)) == netnum)
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-/*
- * Determine whether a IP address (netnum) is one of the local interfaces,
- * returns TRUE/FALSE.
- * Does not include the loopback interface: caller needs to check that.
- */
-int
-is_interface_local(u_long netnum)
-{
- addrlist *al;
-
- for (al = localnets; al; al = al->ip_next) {
- if (al->ip_addr == netnum)
- return TRUE;
- }
- return FALSE;
-}
-
-
-#ifdef HAVE_GETIFADDRS
-void
-getwire(char **name1, char **number1)
-{
- addrlist *al = NULL, *tail = NULL;
- struct ifaddrs *ifaddrs, *ifap;
-#ifndef HAVE_STRUCT_IFADDRS_IFA_NEXT
- int count = 0, i;
-#endif /* not HAVE_STRUCT_IFADDRS_IFA_NEXT */
-
- ifaddrs = NULL;
-#ifdef HAVE_STRUCT_IFADDRS_IFA_NEXT
- if (getifaddrs(&ifaddrs) < 0)
- goto out;
-
- for (ifap = ifaddrs; ifap != NULL; ifap = ifap->ifa_next) {
-#else /* not HAVE_STRUCT_IFADDRS_IFA_NEXT */
- if (getifaddrs(&ifaddrs, &count) < 0)
- goto out;
-
- for (i = 0,ifap = ifaddrs; i < count; ifap++, i++) {
-#endif /* HAVE_STRUCT_IFADDRS_IFA_NEXT */
-
- if (!ifap || !ifap->ifa_addr || ifap->ifa_addr->sa_family != AF_INET)
- continue;
-
- /*
- * If the interface is the loopback, or it's not running,
- * then ignore it.
- */
- if (S2IN(ifap->ifa_addr) == htonl(INADDR_LOOPBACK))
- continue;
- if ((ifap->ifa_flags & IFF_RUNNING) == 0)
- continue;
-
- if ((ifap->ifa_flags & IFF_POINTOPOINT) == 0)
- al = getwire_lookup(S2IN(ifap->ifa_addr), S2IN(ifap->ifa_netmask), 0);
- else
- al = getwire_lookup(S2IN(ifap->ifa_dstaddr), 0xffffffff, 1);
-
- /* append to the end of the list */
- if (!localnets || tail == NULL) {
- localnets = tail = al;
- tail->ip_next = NULL;
- } else {
- tail->ip_next = al;
- tail = al;
- }
- }
-
-out:
- if (ifaddrs)
- XFREE(ifaddrs);
-
- if (localnets) {
- *name1 = localnets->ip_net_name;
- *number1 = localnets->ip_net_num;
- } else {
- *name1 = NO_SUBNET;
- *number1 = "0.0.0.0";
- }
-}
-
-#else /* not HAVE_GETIFADDRS */
-
-#if defined(HAVE_STRUCT_IFREQ_IFR_ADDR) && defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
-# define SIZE(ifr) (MAX((ifr)->ifr_addr.sa_len, sizeof((ifr)->ifr_addr)) + sizeof(ifr->ifr_name))
-#else /* not defined(HAVE_STRUCT_IFREQ_IFR_ADDR) && defined(HAVE_STRUCT_SOCKADDR_SA_LEN) */
-# define SIZE(ifr) sizeof(struct ifreq)
-#endif /* not defined(HAVE_STRUCT_IFREQ_IFR_ADDR) && defined(HAVE_STRUCT_SOCKADDR_SA_LEN) */
-
-#define clist (ifc.ifc_ifcu.ifcu_req)
-#define count (ifc.ifc_len/sizeof(struct ifreq))
-
-
-void
-getwire(char **name1, char **number1)
-{
- struct ifconf ifc;
- struct ifreq *ifr, ifrpool;
- caddr_t cp, cplim;
- int fd = -1;
- u_long address;
- addrlist *al = NULL, *tail = NULL;
- char buf[GFBUFLEN];
-
-#ifndef SIOCGIFFLAGS
- /* if cannot get interface flags, return nothing */
- plog(XLOG_ERROR, "getwire unable to get interface flags");
- localnets = NULL;
- return;
-#endif /* not SIOCGIFFLAGS */
-
- /*
- * Get suitable socket
- */
- if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- goto out;
-
- /*
- * Fill in ifconf details
- */
- memset(&buf[0], 0, GFBUFLEN);
- ifc.ifc_len = sizeof(buf);
- ifc.ifc_buf = buf;
-
- /*
- * Get network interface configurations
- */
- if (ioctl(fd, SIOCGIFCONF, (caddr_t) & ifc) < 0)
- goto out;
-
- /*
- * Upper bound on array
- */
- cplim = buf + ifc.ifc_len;
-
- /*
- * This is some magic to cope with both "traditional" and the
- * new 4.4BSD-style struct sockaddrs. The new structure has
- * variable length and a size field to support longer addresses.
- * AF_LINK is a new definition for 4.4BSD.
- */
-
- /*
- * Scan the list looking for a suitable interface
- */
- for (cp = buf; cp < cplim; /* increment in the loop body */) {
- memcpy(&ifrpool, cp, sizeof(ifrpool));
- ifr = &ifrpool;
- cp += SIZE(ifr);
-
- if (ifr->ifr_addr.sa_family != AF_INET)
- continue;
-
- address = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
-
- /*
- * Get interface flags
- */
- if (ioctl(fd, SIOCGIFFLAGS, (caddr_t) ifr) < 0)
- continue;
-
- /*
- * If the interface is the loopback, or it's not running,
- * then ignore it.
- */
- if (address == htonl(INADDR_LOOPBACK))
- continue;
- /*
- * Fix for 0.0.0.0 loopback on SunOS 3.X which defines IFF_ROUTE
- * instead of IFF_LOOPBACK.
- */
-#ifdef IFF_ROUTE
- if (ifr->ifr_flags == (IFF_UP|IFF_RUNNING))
- continue;
-#endif /* IFF_ROUTE */
-
- /* if the interface is not UP or not RUNNING, skip it */
- if ((ifr->ifr_flags & IFF_RUNNING) == 0 ||
- (ifr->ifr_flags & IFF_UP) == 0)
- continue;
-
- if ((ifr->ifr_flags & IFF_POINTOPOINT) == 0) {
- /*
- * Get the netmask of this interface
- */
- if (ioctl(fd, SIOCGIFNETMASK, (caddr_t) ifr) < 0)
- continue;
-
- al = getwire_lookup(address, S2IN(&ifr->ifr_addr), 0);
- } else
- al = getwire_lookup(address, 0xffffffff, 1);
-
- /* append to the end of the list */
- if (!localnets) {
- localnets = tail = al;
- tail->ip_next = NULL;
- } else {
- tail->ip_next = al;
- tail = al;
- }
- }
-
-out:
- if (fd >= 0)
- close(fd);
- if (localnets) {
- *name1 = localnets->ip_net_name;
- *number1 = localnets->ip_net_num;
- } else {
- *name1 = NO_SUBNET;
- *number1 = "0.0.0.0";
- }
-}
-#endif /* not HAVE_GETIFADDRS */
diff --git a/contrib/amd/libamu/xdr_func.c b/contrib/amd/libamu/xdr_func.c
deleted file mode 100644
index 6bd0254318c6..000000000000
--- a/contrib/amd/libamu/xdr_func.c
+++ /dev/null
@@ -1,1098 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/xdr_func.c
- *
- */
-
-/*
- * Complete list of all possible xdr functions which may be needed.
- */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-#ifdef __RPCSVC_MOUNT_H__
-# error IRIX6 should not include rpcsvc/mount.h
-#endif /* __RPCSVC_MOUNT_H__ */
-
-/*
- * MACROS:
- */
-#ifdef HAVE_FS_AUTOFS
-# ifndef AUTOFS_MAXCOMPONENTLEN
-# define AUTOFS_MAXCOMPONENTLEN 255
-# endif /* not AUTOFS_MAXCOMPONENTLEN */
-# ifndef AUTOFS_MAXOPTSLEN
-# define AUTOFS_MAXOPTSLEN 255
-# endif /* not AUTOFS_MAXOPTSLEN */
-# ifndef AUTOFS_MAXPATHLEN
-# define AUTOFS_MAXPATHLEN 1024
-# endif /* not AUTOFS_MAXPATHLEN */
-#endif /* HAVE_FS_AUTOFS */
-
-/* forward definitions, are they needed? */
-extern bool_t xdr_exportnode(XDR *xdrs, exportnode *objp);
-extern bool_t xdr_groupnode(XDR *xdrs, groupnode *objp);
-extern bool_t xdr_name(XDR *xdrs, name *objp);
-
-
-#ifndef HAVE_XDR_ATTRSTAT
-bool_t
-xdr_attrstat(XDR *xdrs, nfsattrstat *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_attrstat:");
-
- if (!xdr_nfsstat(xdrs, &objp->ns_status)) {
- return (FALSE);
- }
- switch (objp->ns_status) {
- case NFS_OK:
- if (!xdr_fattr(xdrs, &objp->ns_u.ns_attr_u)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_ATTRSTAT */
-
-
-#ifndef HAVE_XDR_CREATEARGS
-bool_t
-xdr_createargs(XDR *xdrs, nfscreateargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_createargs:");
-
- if (!xdr_diropargs(xdrs, &objp->ca_where)) {
- return (FALSE);
- }
- if (!xdr_sattr(xdrs, &objp->ca_attributes)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_CREATEARGS */
-
-
-#ifndef HAVE_XDR_DIRLIST
-bool_t
-xdr_dirlist(XDR *xdrs, nfsdirlist *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_dirlist:");
-
- if (!xdr_pointer(xdrs, (char **) &objp->dl_entries, sizeof(nfsentry), (XDRPROC_T_TYPE) xdr_entry)) {
- return (FALSE);
- }
- if (!xdr_bool(xdrs, &objp->dl_eof)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_DIRLIST */
-
-
-#ifndef HAVE_XDR_DIROPARGS
-bool_t
-xdr_diropargs(XDR *xdrs, nfsdiropargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_diropargs:");
-
- if (!xdr_nfs_fh(xdrs, &objp->da_fhandle)) {
- return (FALSE);
- }
- if (!xdr_filename(xdrs, &objp->da_name)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_DIROPARGS */
-
-
-#ifndef HAVE_XDR_DIROPOKRES
-bool_t
-xdr_diropokres(XDR *xdrs, nfsdiropokres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_diropokres:");
-
- if (!xdr_nfs_fh(xdrs, &objp->drok_fhandle)) {
- return (FALSE);
- }
- if (!xdr_fattr(xdrs, &objp->drok_attributes)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_DIROPOKRES */
-
-
-#ifndef HAVE_XDR_DIROPRES
-bool_t
-xdr_diropres(XDR *xdrs, nfsdiropres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_diropres:");
-
- if (!xdr_nfsstat(xdrs, &objp->dr_status)) {
- return (FALSE);
- }
- switch (objp->dr_status) {
- case NFS_OK:
- if (!xdr_diropokres(xdrs, &objp->dr_u.dr_drok_u)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_DIROPRES */
-
-
-#ifndef HAVE_XDR_DIRPATH
-bool_t
-xdr_dirpath(XDR *xdrs, dirpath *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_dirpath:");
-
- if (!xdr_string(xdrs, objp, MNTPATHLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_DIRPATH */
-
-
-#ifndef HAVE_XDR_ENTRY
-bool_t
-xdr_entry(XDR *xdrs, nfsentry *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_entry:");
-
- if (!xdr_u_int(xdrs, &objp->ne_fileid)) {
- return (FALSE);
- }
- if (!xdr_filename(xdrs, &objp->ne_name)) {
- return (FALSE);
- }
- if (!xdr_nfscookie(xdrs, objp->ne_cookie)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs, (char **) &objp->ne_nextentry, sizeof(nfsentry), (XDRPROC_T_TYPE) xdr_entry)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_ENTRY */
-
-
-#ifndef HAVE_XDR_EXPORTNODE
-bool_t
-xdr_exportnode(XDR *xdrs, exportnode *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_exportnode:");
-
- if (!xdr_dirpath(xdrs, &objp->ex_dir)) {
- return (FALSE);
- }
- if (!xdr_groups(xdrs, &objp->ex_groups)) {
- return (FALSE);
- }
- if (!xdr_exports(xdrs, &objp->ex_next)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_EXPORTNODE */
-
-
-#ifndef HAVE_XDR_EXPORTS
-bool_t
-xdr_exports(XDR *xdrs, exports *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_exports:");
-
- if (!xdr_pointer(xdrs, (char **) objp, sizeof(exportnode), (XDRPROC_T_TYPE) xdr_exportnode)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_EXPORTS */
-
-
-#ifndef HAVE_XDR_FATTR
-bool_t
-xdr_fattr(XDR *xdrs, nfsfattr *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_fattr:");
-
- if (!xdr_ftype(xdrs, &objp->na_type)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_mode)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_nlink)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_uid)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_gid)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_size)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_blocksize)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_rdev)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_blocks)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_fsid)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->na_fileid)) {
- return (FALSE);
- }
- if (!xdr_nfstime(xdrs, &objp->na_atime)) {
- return (FALSE);
- }
- if (!xdr_nfstime(xdrs, &objp->na_mtime)) {
- return (FALSE);
- }
- if (!xdr_nfstime(xdrs, &objp->na_ctime)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_FATTR */
-
-
-#ifndef HAVE_XDR_FHANDLE
-bool_t
-xdr_fhandle(XDR *xdrs, fhandle objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_fhandle:");
-
- if (!xdr_opaque(xdrs, objp, NFS_FHSIZE)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_FHANDLE */
-
-
-#ifndef HAVE_XDR_FHSTATUS
-bool_t
-xdr_fhstatus(XDR *xdrs, fhstatus *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_fhstatus:");
-
- if (!xdr_u_int(xdrs, &objp->fhs_status)) {
- return (FALSE);
- }
- if (objp->fhs_status == 0 && !xdr_fhandle(xdrs, objp->fhs_fh)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_FHSTATUS */
-
-
-#ifndef HAVE_XDR_FILENAME
-bool_t
-xdr_filename(XDR *xdrs, filename *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_filename:");
-
- if (!xdr_string(xdrs, objp, NFS_MAXNAMLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_FILENAME */
-
-
-#ifndef HAVE_XDR_FTYPE
-bool_t
-xdr_ftype(XDR *xdrs, nfsftype *objp)
-{
- enum_t local_obj = *objp;
-
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_ftype:");
-
- if (!xdr_enum(xdrs, &local_obj)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_FTYPE */
-
-
-#ifndef HAVE_XDR_GROUPNODE
-bool_t
-xdr_groupnode(XDR *xdrs, groupnode *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_groupnode:");
-
- if (!xdr_name(xdrs, &objp->gr_name)) {
- return (FALSE);
- }
- if (!xdr_groups(xdrs, &objp->gr_next)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_GROUPNODE */
-
-
-#ifndef HAVE_XDR_GROUPS
-bool_t
-xdr_groups(XDR *xdrs, groups *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_groups:");
-
- if (!xdr_pointer(xdrs, (char **) objp, sizeof(groupnode), (XDRPROC_T_TYPE) xdr_groupnode)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_GROUPS */
-
-
-#ifndef HAVE_XDR_LINKARGS
-bool_t
-xdr_linkargs(XDR *xdrs, nfslinkargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_linkargs:");
-
- if (!xdr_nfs_fh(xdrs, &objp->la_fhandle)) {
- return (FALSE);
- }
- if (!xdr_diropargs(xdrs, &objp->la_to)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_LINKARGS */
-
-
-#ifndef HAVE_XDR_MOUNTBODY
-bool_t
-xdr_mountbody(XDR *xdrs, mountbody *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_mountbody:");
-
- if (!xdr_name(xdrs, &objp->ml_hostname)) {
- return (FALSE);
- }
- if (!xdr_dirpath(xdrs, &objp->ml_directory)) {
- return (FALSE);
- }
- if (!xdr_mountlist(xdrs, &objp->ml_next)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_MOUNTBODY */
-
-
-#ifndef HAVE_XDR_MOUNTLIST
-bool_t
-xdr_mountlist(XDR *xdrs, mountlist *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_mountlist:");
-
- if (!xdr_pointer(xdrs, (char **) objp, sizeof(mountbody), (XDRPROC_T_TYPE) xdr_mountbody)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_MOUNTLIST */
-
-
-#ifndef HAVE_XDR_NAME
-bool_t
-xdr_name(XDR *xdrs, name *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_name:");
-
- if (!xdr_string(xdrs, objp, MNTNAMLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_NAME */
-
-
-#ifndef HAVE_XDR_NFS_FH
-bool_t
-xdr_nfs_fh(XDR *xdrs, am_nfs_fh *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_nfs_fh:");
-
- if (!xdr_opaque(xdrs, (caddr_t) objp->fh_data, NFS_FHSIZE)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_NFS_FH */
-
-
-#ifndef HAVE_XDR_NFSCOOKIE
-bool_t
-xdr_nfscookie(XDR *xdrs, nfscookie objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_nfscookie:");
-
- if (!xdr_opaque(xdrs, objp, NFS_COOKIESIZE)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_NFSCOOKIE */
-
-
-#ifndef HAVE_XDR_NFSPATH
-bool_t
-xdr_nfspath(XDR *xdrs, nfspath *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_nfspath:");
-
- if (!xdr_string(xdrs, objp, NFS_MAXPATHLEN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_NFSPATH */
-
-
-#ifndef HAVE_XDR_NFSSTAT
-bool_t
-xdr_nfsstat(XDR *xdrs, nfsstat *objp)
-{
- enum_t local_obj = *objp;
-
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_nfsstat:");
-
- if (!xdr_enum(xdrs, &local_obj)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_NFSSTAT */
-
-
-#ifndef HAVE_XDR_NFSTIME
-bool_t
-xdr_nfstime(XDR *xdrs, nfstime *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_nfstime:");
-
- if (!xdr_u_int(xdrs, (u_int *) &objp->nt_seconds)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, (u_int *) &objp->nt_useconds)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_NFSTIME */
-
-
-#ifndef HAVE_XDR_POINTER
-bool_t
-xdr_pointer(register XDR *xdrs, char **objpp, u_int obj_size, XDRPROC_T_TYPE xdr_obj)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_pointer:");
-
- bool_t more_data;
-
- more_data = (*objpp != NULL);
- if (!xdr_bool(xdrs, &more_data)) {
- return (FALSE);
- }
- if (!more_data) {
- *objpp = NULL;
- return (TRUE);
- }
-
- return (xdr_reference(xdrs, objpp, obj_size, xdr_obj));
-}
-#endif /* not HAVE_XDR_POINTER */
-
-
-#ifndef HAVE_XDR_READARGS
-bool_t
-xdr_readargs(XDR *xdrs, nfsreadargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_readargs:");
-
- if (!xdr_nfs_fh(xdrs, &objp->ra_fhandle)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->ra_offset)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->ra_count)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->ra_totalcount)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_READARGS */
-
-
-#ifndef HAVE_XDR_READDIRARGS
-bool_t
-xdr_readdirargs(XDR *xdrs, nfsreaddirargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_readdirargs:");
-
- if (!xdr_nfs_fh(xdrs, &objp->rda_fhandle)) {
- return (FALSE);
- }
- if (!xdr_nfscookie(xdrs, objp->rda_cookie)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->rda_count)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_READDIRARGS */
-
-
-#ifndef HAVE_XDR_READDIRRES
-bool_t
-xdr_readdirres(XDR *xdrs, nfsreaddirres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_readdirres:");
-
- if (!xdr_nfsstat(xdrs, &objp->rdr_status)) {
- return (FALSE);
- }
- switch (objp->rdr_status) {
- case NFS_OK:
- if (!xdr_dirlist(xdrs, &objp->rdr_u.rdr_reply_u)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_READDIRRES */
-
-
-#ifndef HAVE_XDR_READLINKRES
-bool_t
-xdr_readlinkres(XDR *xdrs, nfsreadlinkres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_readlinkres:");
-
- if (!xdr_nfsstat(xdrs, &objp->rlr_status)) {
- return (FALSE);
- }
- switch (objp->rlr_status) {
- case NFS_OK:
- if (!xdr_nfspath(xdrs, &objp->rlr_u.rlr_data_u)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_READLINKRES */
-
-
-#ifndef HAVE_XDR_READOKRES
-bool_t
-xdr_readokres(XDR *xdrs, nfsreadokres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_readokres:");
-
- if (!xdr_fattr(xdrs, &objp->raok_attributes)) {
- return (FALSE);
- }
- if (!xdr_bytes(xdrs,
- (char **) & objp->raok_u.raok_val_u,
- (u_int *) & objp->raok_u.raok_len_u,
- NFS_MAXDATA)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_READOKRES */
-
-
-#ifndef HAVE_XDR_READRES
-bool_t
-xdr_readres(XDR *xdrs, nfsreadres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_readres:");
-
- if (!xdr_nfsstat(xdrs, &objp->rr_status)) {
- return (FALSE);
- }
- switch (objp->rr_status) {
- case NFS_OK:
- if (!xdr_readokres(xdrs, &objp->rr_u.rr_reply_u)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_READRES */
-
-
-#ifndef HAVE_XDR_RENAMEARGS
-bool_t
-xdr_renameargs(XDR *xdrs, nfsrenameargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_renameargs:");
-
- if (!xdr_diropargs(xdrs, &objp->rna_from)) {
- return (FALSE);
- }
- if (!xdr_diropargs(xdrs, &objp->rna_to)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_RENAMEARGS */
-
-
-#ifndef HAVE_XDR_SATTR
-bool_t
-xdr_sattr(XDR *xdrs, nfssattr *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_sattr:");
-
- if (!xdr_u_int(xdrs, &objp->sa_mode)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sa_uid)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sa_gid)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sa_size)) {
- return (FALSE);
- }
- if (!xdr_nfstime(xdrs, &objp->sa_atime)) {
- return (FALSE);
- }
- if (!xdr_nfstime(xdrs, &objp->sa_mtime)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_SATTR */
-
-
-#ifndef HAVE_XDR_SATTRARGS
-bool_t
-xdr_sattrargs(XDR *xdrs, nfssattrargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_sattrargs:");
-
- if (!xdr_nfs_fh(xdrs, &objp->sag_fhandle)) {
- return (FALSE);
- }
- if (!xdr_sattr(xdrs, &objp->sag_attributes)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_SATTRARGS */
-
-
-#ifndef HAVE_XDR_STATFSOKRES
-bool_t
-xdr_statfsokres(XDR *xdrs, nfsstatfsokres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_statfsokres:");
-
- if (!xdr_u_int(xdrs, &objp->sfrok_tsize)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sfrok_bsize)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sfrok_blocks)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sfrok_bfree)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->sfrok_bavail)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_STATFSOKRES */
-
-
-#ifndef HAVE_XDR_STATFSRES
-bool_t
-xdr_statfsres(XDR *xdrs, nfsstatfsres *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_statfsres:");
-
- if (!xdr_nfsstat(xdrs, &objp->sfr_status)) {
- return (FALSE);
- }
- switch (objp->sfr_status) {
- case NFS_OK:
- if (!xdr_statfsokres(xdrs, &objp->sfr_u.sfr_reply_u)) {
- return (FALSE);
- }
- break;
- default:
- break;
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_STATFSRES */
-
-
-#ifndef HAVE_XDR_SYMLINKARGS
-bool_t
-xdr_symlinkargs(XDR *xdrs, nfssymlinkargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_symlinkargs:");
-
- if (!xdr_diropargs(xdrs, &objp->sla_from)) {
- return (FALSE);
- }
- if (!xdr_nfspath(xdrs, &objp->sla_to)) {
- return (FALSE);
- }
- if (!xdr_sattr(xdrs, &objp->sla_attributes)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_SYMLINKARGS */
-
-
-#ifndef HAVE_XDR_WRITEARGS
-bool_t
-xdr_writeargs(XDR *xdrs, nfswriteargs *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_writeargs:");
-
- if (!xdr_nfs_fh(xdrs, &objp->wra_fhandle)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->wra_beginoffset)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->wra_offset)) {
- return (FALSE);
- }
- if (!xdr_u_int(xdrs, &objp->wra_totalcount)) {
- return (FALSE);
- }
- if (!xdr_bytes(xdrs,
- (char **) & objp->wra_u.wra_val_u,
- (u_int *) & objp->wra_u.wra_len_u,
- NFS_MAXDATA)) {
- return (FALSE);
- }
- return (TRUE);
-}
-#endif /* not HAVE_XDR_WRITEARGS */
-
-
-/*
- * NFS V3 XDR FUNCTIONS:
- */
-#ifdef HAVE_FS_NFS3
-bool_t
-xdr_am_fhandle3(XDR *xdrs, am_fhandle3 *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_fhandle3:");
-
- if (!xdr_bytes(xdrs,
- (char **) &objp->fhandle3_val,
- (u_int *) &objp->fhandle3_len,
- AM_FHSIZE3))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_mountstat3(XDR *xdrs, am_mountstat3 *objp)
-{
- enum_t local_obj = *objp;
-
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_mountstat3:");
-
- if (!xdr_enum(xdrs, &local_obj))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_mountres3_ok(XDR *xdrs, am_mountres3_ok *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_mountres3_ok:");
-
- if (!xdr_am_fhandle3(xdrs, &objp->fhandle))
- return (FALSE);
- if (!xdr_array(xdrs,
- (char **) ((voidp) &objp->auth_flavors.auth_flavors_val),
- (u_int *) &objp->auth_flavors.auth_flavors_len,
- ~0,
- sizeof(int),
- (XDRPROC_T_TYPE) xdr_int))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_mountres3(XDR *xdrs, am_mountres3 *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_mountres3:");
-
- if (!xdr_am_mountstat3(xdrs, &objp->fhs_status))
- return (FALSE);
-
- if (objp->fhs_status == AM_MNT3_OK) {
- if (!xdr_am_mountres3_ok(xdrs, &objp->mountres3_u.mountinfo))
- return (FALSE);
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_diropargs3(XDR *xdrs, am_diropargs3 *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_diropargs3:");
-
- if (!xdr_am_nfs_fh3(xdrs, &objp->dir))
- return (FALSE);
- if (!xdr_am_filename3(xdrs, &objp->name))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_filename3(XDR *xdrs, am_filename3 *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_filename3:");
-
- if (!xdr_string(xdrs, objp, ~0))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_LOOKUP3args(XDR *xdrs, am_LOOKUP3args *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_LOOKUP3args:");
-
- if (!xdr_am_diropargs3(xdrs, &objp->what))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_LOOKUP3res(XDR *xdrs, am_LOOKUP3res *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_LOOKUP3res:");
-
- if (!xdr_am_nfsstat3(xdrs, &objp->status))
- return (FALSE);
- switch (objp->status) {
- case AM_NFS3_OK:
- if (!xdr_am_LOOKUP3resok(xdrs, &objp->res_u.ok))
- return (FALSE);
- break;
- default:
- if (!xdr_am_LOOKUP3resfail(xdrs, &objp->res_u.fail))
- return (FALSE);
- break;
- }
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_LOOKUP3resfail(XDR *xdrs, am_LOOKUP3resfail *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_LOOKUP3resfail:");
-
- /*
- * Don't xdr post_op_attr: amd doesn't need them, but they require many
- * additional xdr functions.
- */
-#if 0
- if (!xdr_post_op_attr(xdrs, &objp->dir_attributes))
- return (FALSE);
-#endif
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_LOOKUP3resok(XDR *xdrs, am_LOOKUP3resok *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_LOOKUP3resok:");
-
- if (!xdr_am_nfs_fh3(xdrs, &objp->object))
- return (FALSE);
- /*
- * Don't xdr post_op_attr: amd doesn't need them, but they require many
- * additional xdr functions.
- */
-#if 0
- if (!xdr_post_op_attr(xdrs, &objp->obj_attributes))
- return (FALSE);
- if (!xdr_post_op_attr(xdrs, &objp->dir_attributes))
- return (FALSE);
-#endif
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_nfs_fh3(XDR *xdrs, am_nfs_fh3 *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_nfs_fh3:");
-
- if (!xdr_u_int(xdrs, &objp->am_fh3_length))
- return (FALSE);
- if (objp->am_fh3_length > AM_FHSIZE3)
- return (FALSE);
- if (!xdr_opaque(xdrs, objp->am_fh3_data, objp->am_fh3_length))
- return (FALSE);
- return (TRUE);
-}
-
-
-bool_t
-xdr_am_nfsstat3(XDR *xdrs, am_nfsstat3 *objp)
-{
- if (amuDebug(D_XDRTRACE))
- plog(XLOG_DEBUG, "xdr_am_nfsstat3:");
-
- if (!xdr_enum(xdrs, (enum_t *)objp))
- return (FALSE);
- return (TRUE);
-}
-#endif /* not HAVE_FS_NFS3 */
diff --git a/contrib/amd/libamu/xutil.c b/contrib/amd/libamu/xutil.c
deleted file mode 100644
index 3a33b9c0b149..000000000000
--- a/contrib/amd/libamu/xutil.c
+++ /dev/null
@@ -1,1091 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/libamu/xutil.c
- *
- */
-
-/*
- * Miscellaneous Utilities: Logging, TTY, timers, signals, RPC, memory, etc.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-#include <amu.h>
-
-/*
- * Logfp is the default logging device, and is initialized to stderr by
- * default in dplog/plog below, and in
- * amd/amfs_program.c:amfs_program_exec().
- */
-FILE *logfp = NULL;
-
-static char *am_progname = "unknown"; /* "amd" */
-static char am_hostname[MAXHOSTNAMELEN] = "unknown"; /* Hostname */
-pid_t am_mypid = -1; /* process ID */
-serv_state amd_state; /* amd's state */
-int foreground = 1; /* 1 == this is the top-level server */
-int debug_flags = 0;
-
-#ifdef HAVE_SYSLOG
-int syslogging;
-#endif /* HAVE_SYSLOG */
-int xlog_level = XLOG_ALL & ~XLOG_MAP & ~XLOG_STATS;
-int xlog_level_init = ~0;
-static int amd_program_number = AMQ_PROGRAM;
-
-#ifdef DEBUG_MEM
-# if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY)
-static int mem_bytes;
-static int orig_mem_bytes;
-# endif /* not defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY) */
-#endif /* DEBUG_MEM */
-
-/* forward definitions */
-/* for GCC format string auditing */
-static void real_plog(int lvl, const char *fmt, va_list vargs)
- __attribute__((__format__(__printf__, 2, 0)));
-
-
-#ifdef DEBUG
-/*
- * List of debug options.
- */
-struct opt_tab dbg_opt[] =
-{
- {"all", D_ALL}, /* All non-disruptive options */
- {"amq", D_AMQ}, /* Don't register for AMQ program */
- {"daemon", D_DAEMON}, /* Don't enter daemon mode */
- {"fork", D_FORK}, /* Don't fork server */
- {"full", D_FULL}, /* Program trace */
-#ifdef HAVE_CLOCK_GETTIME
- {"hrtime", D_HRTIME}, /* Print high resolution time stamps */
-#endif /* HAVE_CLOCK_GETTIME */
- /* info service specific debugging (hesiod, nis, etc) */
- {"info", D_INFO},
- {"mem", D_MEM}, /* Trace memory allocations */
- {"mtab", D_MTAB}, /* Use local mtab file */
- {"readdir", D_READDIR}, /* Check on browsable_dirs progress */
- {"str", D_STR}, /* Debug string munging */
- {"test", D_TEST}, /* Full debug - no daemon, no amq, local mtab */
- {"trace", D_TRACE}, /* Protocol trace */
- {"xdrtrace", D_XDRTRACE}, /* Trace xdr routines */
- {0, 0}
-};
-#endif /* DEBUG */
-
-/*
- * List of log options
- */
-struct opt_tab xlog_opt[] =
-{
- {"all", XLOG_ALL}, /* All messages */
-#ifdef DEBUG
- {"debug", XLOG_DEBUG}, /* Debug messages */
-#endif /* DEBUG */ /* DEBUG */
- {"error", XLOG_ERROR}, /* Non-fatal system errors */
- {"fatal", XLOG_FATAL}, /* Fatal errors */
- {"info", XLOG_INFO}, /* Information */
- {"map", XLOG_MAP}, /* Map errors */
- {"stats", XLOG_STATS}, /* Additional statistical information */
- {"user", XLOG_USER}, /* Non-fatal user errors */
- {"warn", XLOG_WARNING}, /* Warnings */
- {"warning", XLOG_WARNING}, /* Warnings */
- {0, 0}
-};
-
-
-void
-am_set_progname(char *pn)
-{
- am_progname = pn;
-}
-
-
-const char *
-am_get_progname(void)
-{
- return am_progname;
-}
-
-
-void
-am_set_hostname(char *hn)
-{
- xstrlcpy(am_hostname, hn, MAXHOSTNAMELEN);
-}
-
-
-const char *
-am_get_hostname(void)
-{
- return am_hostname;
-}
-
-
-pid_t
-am_set_mypid(void)
-{
- am_mypid = getpid();
- return am_mypid;
-}
-
-
-long
-get_server_pid()
-{
- return (long) (foreground ? am_mypid : getppid());
-}
-
-
-voidp
-xmalloc(int len)
-{
- voidp p;
- int retries = 600;
-
- /*
- * Avoid malloc's which return NULL for malloc(0)
- */
- if (len == 0)
- len = 1;
-
- do {
- p = (voidp) malloc((unsigned) len);
- if (p) {
- if (amuDebug(D_MEM))
- plog(XLOG_DEBUG, "Allocated size %d; block %p", len, p);
- return p;
- }
- if (retries > 0) {
- plog(XLOG_ERROR, "Retrying memory allocation");
- sleep(1);
- }
- } while (--retries);
-
- plog(XLOG_FATAL, "Out of memory");
- going_down(1);
-
- abort();
-
- return 0;
-}
-
-
-/* like xmalloc, but zeros out the bytes */
-voidp
-xzalloc(int len)
-{
- voidp p = xmalloc(len);
-
- if (p)
- memset(p, 0, len);
- return p;
-}
-
-
-voidp
-xrealloc(voidp ptr, int len)
-{
- if (amuDebug(D_MEM))
- plog(XLOG_DEBUG, "Reallocated size %d; block %p", len, ptr);
-
- if (len == 0)
- len = 1;
-
- if (ptr)
- ptr = (voidp) realloc(ptr, (unsigned) len);
- else
- ptr = (voidp) xmalloc((unsigned) len);
-
- if (!ptr) {
- plog(XLOG_FATAL, "Out of memory in realloc");
- going_down(1);
- abort();
- }
- return ptr;
-}
-
-
-#ifdef DEBUG_MEM
-void
-dxfree(char *file, int line, voidp ptr)
-{
- if (amuDebug(D_MEM))
- plog(XLOG_DEBUG, "Free in %s:%d: block %p", file, line, ptr);
- /* this is the only place that must NOT use XFREE()!!! */
- free(ptr);
- ptr = NULL; /* paranoid */
-}
-
-
-# if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY)
-static void
-checkup_mem(void)
-{
- struct mallinfo mi = mallinfo();
- u_long uordbytes = mi.uordblks * 4096;
-
- if (mem_bytes != uordbytes) {
- if (orig_mem_bytes == 0)
- mem_bytes = orig_mem_bytes = uordbytes;
- else {
- fprintf(logfp, "%s[%ld]: ", am_get_progname(), (long) am_mypid);
- if (mem_bytes < uordbytes) {
- fprintf(logfp, "ALLOC: %ld bytes", uordbytes - mem_bytes);
- } else {
- fprintf(logfp, "FREE: %ld bytes", mem_bytes - uordbytes);
- }
- mem_bytes = uordbytes;
- fprintf(logfp, ", making %d missing\n", mem_bytes - orig_mem_bytes);
- }
- }
- malloc_verify();
-}
-# endif /* not defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY) */
-#endif /* DEBUG_MEM */
-
-
-/*
- * Take a log format string and expand occurrences of %m
- * with the current error code taken from errno. Make sure
- * 'e' never gets longer than maxlen characters.
- */
-static const char *
-expand_error(const char *f, char *e, size_t maxlen)
-{
- const char *p;
- char *q;
- int error = errno;
- int len = 0;
-
- for (p = f, q = e; (*q = *p) && (size_t) len < maxlen; len++, q++, p++) {
- if (p[0] == '%' && p[1] == 'm') {
- xstrlcpy(q, strerror(error), maxlen);
- len += strlen(q) - 1;
- q += strlen(q) - 1;
- p++;
- }
- }
- e[maxlen-1] = '\0'; /* null terminate, to be sure */
- return e;
-}
-
-
-/*
- * Output the time of day and hostname to the logfile
- */
-static void
-show_time_host_and_name(int lvl)
-{
- static time_t last_t = 0;
- static char *last_ctime = 0;
- time_t t;
-#if defined(HAVE_CLOCK_GETTIME) && defined(DEBUG)
- struct timespec ts;
-#endif /* defined(HAVE_CLOCK_GETTIME) && defined(DEBUG) */
- char nsecs[11]; /* '.' + 9 digits + '\0' */
- char *sev;
-
- nsecs[0] = '\0';
-
-#if defined(HAVE_CLOCK_GETTIME) && defined(DEBUG)
- /*
- * Some systems (AIX 4.3) seem to implement clock_gettime() as stub
- * returning ENOSYS.
- */
- if (clock_gettime(CLOCK_REALTIME, &ts) == 0) {
- t = ts.tv_sec;
- if (amuDebug(D_HRTIME))
- xsnprintf(nsecs, sizeof(nsecs), ".%09ld", ts.tv_nsec);
- }
- else
-#endif /* defined(HAVE_CLOCK_GETTIME) && defined(DEBUG) */
- t = clocktime(NULL);
-
- if (t != last_t) {
- last_ctime = ctime(&t);
- last_t = t;
- }
-
- switch (lvl) {
- case XLOG_FATAL:
- sev = "fatal:";
- break;
- case XLOG_ERROR:
- sev = "error:";
- break;
- case XLOG_USER:
- sev = "user: ";
- break;
- case XLOG_WARNING:
- sev = "warn: ";
- break;
- case XLOG_INFO:
- sev = "info: ";
- break;
- case XLOG_DEBUG:
- sev = "debug:";
- break;
- case XLOG_MAP:
- sev = "map: ";
- break;
- case XLOG_STATS:
- sev = "stats:";
- break;
- default:
- sev = "hmm: ";
- break;
- }
- fprintf(logfp, "%15.15s%s %s %s[%ld]/%s ",
- last_ctime + 4, nsecs, am_get_hostname(),
- am_get_progname(),
- (long) am_mypid,
- sev);
-}
-
-
-#ifdef DEBUG
-/*
- * Switch on/off debug options
- */
-int
-debug_option(char *opt)
-{
- return cmdoption(opt, dbg_opt, &debug_flags);
-}
-
-
-void
-dplog(const char *fmt, ...)
-{
- va_list ap;
-
- if (!logfp)
- logfp = stderr; /* initialize before possible first use */
-
- va_start(ap, fmt);
- real_plog(XLOG_DEBUG, fmt, ap);
- va_end(ap);
-}
-#endif /* DEBUG */
-
-
-void
-plog(int lvl, const char *fmt, ...)
-{
- va_list ap;
-
- if (!logfp)
- logfp = stderr; /* initialize before possible first use */
-
- va_start(ap, fmt);
- real_plog(lvl, fmt, ap);
- va_end(ap);
-}
-
-
-static void
-real_plog(int lvl, const char *fmt, va_list vargs)
-{
- char msg[1024];
- char efmt[1024];
- char *ptr = msg;
- static char last_msg[1024];
- static int last_count = 0, last_lvl = 0;
-
- if (!(xlog_level & lvl))
- return;
-
-#ifdef DEBUG_MEM
-# if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY)
- checkup_mem();
-# endif /* not defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_VERIFY) */
-#endif /* DEBUG_MEM */
-
- /*
- * Note: xvsnprintf() may call plog() if a truncation happened, but the
- * latter has some code to break out of an infinite loop. See comment in
- * xsnprintf() below.
- */
- xvsnprintf(ptr, 1023, expand_error(fmt, efmt, 1024), vargs);
-
- ptr += strlen(ptr);
- if (*(ptr-1) == '\n')
- *--ptr = '\0';
-
-#ifdef HAVE_SYSLOG
- if (syslogging) {
- switch (lvl) { /* from mike <mcooper@usc.edu> */
- case XLOG_FATAL:
- lvl = LOG_CRIT;
- break;
- case XLOG_ERROR:
- lvl = LOG_ERR;
- break;
- case XLOG_USER:
- lvl = LOG_WARNING;
- break;
- case XLOG_WARNING:
- lvl = LOG_WARNING;
- break;
- case XLOG_INFO:
- lvl = LOG_INFO;
- break;
- case XLOG_DEBUG:
- lvl = LOG_DEBUG;
- break;
- case XLOG_MAP:
- lvl = LOG_DEBUG;
- break;
- case XLOG_STATS:
- lvl = LOG_INFO;
- break;
- default:
- lvl = LOG_ERR;
- break;
- }
- syslog(lvl, "%s", msg);
- return;
- }
-#endif /* HAVE_SYSLOG */
-
- *ptr++ = '\n';
- *ptr = '\0';
-
- /*
- * mimic syslog behavior: only write repeated strings if they differ
- */
- switch (last_count) {
- case 0: /* never printed at all */
- last_count = 1;
- if (strlcpy(last_msg, msg, 1024) >= 1024) /* don't use xstrlcpy here (recursive!) */
- fprintf(stderr, "real_plog: string \"%s\" truncated to \"%s\"\n", last_msg, msg);
- last_lvl = lvl;
- show_time_host_and_name(lvl); /* mimic syslog header */
- fwrite(msg, ptr - msg, 1, logfp);
- fflush(logfp);
- break;
-
- case 1: /* item printed once, if same, don't repeat */
- if (STREQ(last_msg, msg)) {
- last_count++;
- } else { /* last msg printed once, new one differs */
- /* last_count remains at 1 */
- if (strlcpy(last_msg, msg, 1024) >= 1024) /* don't use xstrlcpy here (recursive!) */
- fprintf(stderr, "real_plog: string \"%s\" truncated to \"%s\"\n", last_msg, msg);
- last_lvl = lvl;
- show_time_host_and_name(lvl); /* mimic syslog header */
- fwrite(msg, ptr - msg, 1, logfp);
- fflush(logfp);
- }
- break;
-
- case 100:
- /*
- * Don't allow repetitions longer than 100, so you can see when something
- * cycles like crazy.
- */
- show_time_host_and_name(last_lvl);
- xsnprintf(last_msg, sizeof(last_msg),
- "last message repeated %d times\n", last_count);
- fwrite(last_msg, strlen(last_msg), 1, logfp);
- fflush(logfp);
- last_count = 0; /* start from scratch */
- break;
-
- default: /* item repeated multiple times */
- if (STREQ(last_msg, msg)) {
- last_count++;
- } else { /* last msg repeated+skipped, new one differs */
- show_time_host_and_name(last_lvl);
- xsnprintf(last_msg, sizeof(last_msg),
- "last message repeated %d times\n", last_count);
- fwrite(last_msg, strlen(last_msg), 1, logfp);
- if (strlcpy(last_msg, msg, 1024) >= 1024) /* don't use xstrlcpy here (recursive!) */
- fprintf(stderr, "real_plog: string \"%s\" truncated to \"%s\"\n", last_msg, msg);
- last_count = 1;
- last_lvl = lvl;
- show_time_host_and_name(lvl); /* mimic syslog header */
- fwrite(msg, ptr - msg, 1, logfp);
- fflush(logfp);
- }
- break;
- }
-
-}
-
-
-/*
- * Display current debug options
- */
-void
-show_opts(int ch, struct opt_tab *opts)
-{
- int i;
- int s = '{';
-
- fprintf(stderr, "\t[-%c {no}", ch);
- for (i = 0; opts[i].opt; i++) {
- fprintf(stderr, "%c%s", s, opts[i].opt);
- s = ',';
- }
- fputs("}]\n", stderr);
-}
-
-
-int
-cmdoption(char *s, struct opt_tab *optb, int *flags)
-{
- char *p = s;
- int errs = 0;
-
- while (p && *p) {
- int neg;
- char *opt;
- struct opt_tab *dp, *dpn = 0;
-
- s = p;
- p = strchr(p, ',');
- if (p)
- *p = '\0';
-
- /* check for "no" prefix to options */
- if (s[0] == 'n' && s[1] == 'o') {
- opt = s + 2;
- neg = 1;
- } else {
- opt = s;
- neg = 0;
- }
-
- /*
- * Scan the array of debug options to find the
- * corresponding flag value. If it is found
- * then set (or clear) the flag (depending on
- * whether the option was prefixed with "no").
- */
- for (dp = optb; dp->opt; dp++) {
- if (STREQ(opt, dp->opt))
- break;
- if (opt != s && !dpn && STREQ(s, dp->opt))
- dpn = dp;
- }
-
- if (dp->opt || dpn) {
- if (!dp->opt) {
- dp = dpn;
- neg = !neg;
- }
- if (neg)
- *flags &= ~dp->flag;
- else
- *flags |= dp->flag;
- } else {
- /*
- * This will log to stderr when parsing the command line
- * since any -l option will not yet have taken effect.
- */
- plog(XLOG_USER, "option \"%s\" not recognized", s);
- errs++;
- }
-
- /*
- * Put the comma back
- */
- if (p)
- *p++ = ',';
- }
-
- return errs;
-}
-
-
-/*
- * Switch on/off logging options
- */
-int
-switch_option(char *opt)
-{
- int xl = xlog_level;
- int rc = cmdoption(opt, xlog_opt, &xl);
-
- if (rc) {
- rc = EINVAL;
- } else {
- /*
- * Keep track of initial log level, and
- * don't allow options to be turned off.
- */
- if (xlog_level_init == ~0)
- xlog_level_init = xl;
- else
- xl |= xlog_level_init;
- xlog_level = xl;
- }
- return rc;
-}
-
-
-#ifdef LOG_DAEMON
-/*
- * get syslog facility to use.
- * logfile can be "syslog", "syslog:daemon", "syslog:local7", etc.
- */
-static int
-get_syslog_facility(const char *logfile)
-{
- char *facstr;
-
- /* parse facility string */
- facstr = strchr(logfile, ':');
- if (!facstr) /* log file was "syslog" */
- return LOG_DAEMON;
- facstr++;
- if (!facstr || facstr[0] == '\0') { /* log file was "syslog:" */
- plog(XLOG_WARNING, "null syslog facility, using LOG_DAEMON");
- return LOG_DAEMON;
- }
-
-#ifdef LOG_KERN
- if (STREQ(facstr, "kern"))
- return LOG_KERN;
-#endif /* not LOG_KERN */
-#ifdef LOG_USER
- if (STREQ(facstr, "user"))
- return LOG_USER;
-#endif /* not LOG_USER */
-#ifdef LOG_MAIL
- if (STREQ(facstr, "mail"))
- return LOG_MAIL;
-#endif /* not LOG_MAIL */
-
- if (STREQ(facstr, "daemon"))
- return LOG_DAEMON;
-
-#ifdef LOG_AUTH
- if (STREQ(facstr, "auth"))
- return LOG_AUTH;
-#endif /* not LOG_AUTH */
-#ifdef LOG_SYSLOG
- if (STREQ(facstr, "syslog"))
- return LOG_SYSLOG;
-#endif /* not LOG_SYSLOG */
-#ifdef LOG_LPR
- if (STREQ(facstr, "lpr"))
- return LOG_LPR;
-#endif /* not LOG_LPR */
-#ifdef LOG_NEWS
- if (STREQ(facstr, "news"))
- return LOG_NEWS;
-#endif /* not LOG_NEWS */
-#ifdef LOG_UUCP
- if (STREQ(facstr, "uucp"))
- return LOG_UUCP;
-#endif /* not LOG_UUCP */
-#ifdef LOG_CRON
- if (STREQ(facstr, "cron"))
- return LOG_CRON;
-#endif /* not LOG_CRON */
-#ifdef LOG_LOCAL0
- if (STREQ(facstr, "local0"))
- return LOG_LOCAL0;
-#endif /* not LOG_LOCAL0 */
-#ifdef LOG_LOCAL1
- if (STREQ(facstr, "local1"))
- return LOG_LOCAL1;
-#endif /* not LOG_LOCAL1 */
-#ifdef LOG_LOCAL2
- if (STREQ(facstr, "local2"))
- return LOG_LOCAL2;
-#endif /* not LOG_LOCAL2 */
-#ifdef LOG_LOCAL3
- if (STREQ(facstr, "local3"))
- return LOG_LOCAL3;
-#endif /* not LOG_LOCAL3 */
-#ifdef LOG_LOCAL4
- if (STREQ(facstr, "local4"))
- return LOG_LOCAL4;
-#endif /* not LOG_LOCAL4 */
-#ifdef LOG_LOCAL5
- if (STREQ(facstr, "local5"))
- return LOG_LOCAL5;
-#endif /* not LOG_LOCAL5 */
-#ifdef LOG_LOCAL6
- if (STREQ(facstr, "local6"))
- return LOG_LOCAL6;
-#endif /* not LOG_LOCAL6 */
-#ifdef LOG_LOCAL7
- if (STREQ(facstr, "local7"))
- return LOG_LOCAL7;
-#endif /* not LOG_LOCAL7 */
-
- /* didn't match anything else */
- plog(XLOG_WARNING, "unknown syslog facility \"%s\", using LOG_DAEMON", facstr);
- return LOG_DAEMON;
-}
-#endif /* not LOG_DAEMON */
-
-
-/*
- * Change current logfile
- */
-int
-switch_to_logfile(char *logfile, int old_umask, int truncate_log)
-{
- FILE *new_logfp = stderr;
-
- if (logfile) {
-#ifdef HAVE_SYSLOG
- syslogging = 0;
-#endif /* HAVE_SYSLOG */
-
- if (STREQ(logfile, "/dev/stderr"))
- new_logfp = stderr;
- else if (NSTREQ(logfile, "syslog", strlen("syslog"))) {
-
-#ifdef HAVE_SYSLOG
- syslogging = 1;
- new_logfp = stderr;
- openlog(am_get_progname(),
- LOG_PID
-# ifdef LOG_NOWAIT
- | LOG_NOWAIT
-# endif /* LOG_NOWAIT */
-# ifdef LOG_DAEMON
- , get_syslog_facility(logfile)
-# endif /* LOG_DAEMON */
- );
-#else /* not HAVE_SYSLOG */
- plog(XLOG_WARNING, "syslog option not supported, logging unchanged");
-#endif /* not HAVE_SYSLOG */
-
- } else { /* regular log file */
- (void) umask(old_umask);
- if (truncate_log)
- truncate(logfile, 0);
- new_logfp = fopen(logfile, "a");
- umask(0);
- }
- }
-
- /*
- * If we couldn't open a new file, then continue using the old.
- */
- if (!new_logfp && logfile) {
- plog(XLOG_USER, "%s: Can't open logfile: %m", logfile);
- return 1;
- }
-
- /*
- * Close the previous file
- */
- if (logfp && logfp != stderr)
- (void) fclose(logfp);
- logfp = new_logfp;
-
- if (logfile)
- plog(XLOG_INFO, "switched to logfile \"%s\"", logfile);
- else
- plog(XLOG_INFO, "no logfile defined; using stderr");
-
- return 0;
-}
-
-
-void
-unregister_amq(void)
-{
- if (!amuDebug(D_AMQ)) {
- /* find which instance of amd to unregister */
- u_long amd_prognum = get_amd_program_number();
-
- if (pmap_unset(amd_prognum, AMQ_VERSION) != 1)
- dlog("failed to de-register Amd program %lu, version %lu",
- amd_prognum, AMQ_VERSION);
- }
-}
-
-
-void
-going_down(int rc)
-{
- if (foreground) {
- if (amd_state != Start) {
- if (amd_state != Done)
- return;
- unregister_amq();
- }
- }
-
-#ifdef MOUNT_TABLE_ON_FILE
- /*
- * Call unlock_mntlist to free any important resources such as an on-disk
- * lock file (/etc/mtab~).
- */
- unlock_mntlist();
-#endif /* MOUNT_TABLE_ON_FILE */
-
- if (foreground) {
- plog(XLOG_INFO, "Finishing with status %d", rc);
- } else {
- dlog("background process exiting with status %d", rc);
- }
- /* bye bye... */
- exit(rc);
-}
-
-
-/* return the rpc program number under which amd was used */
-int
-get_amd_program_number(void)
-{
- return amd_program_number;
-}
-
-
-/* set the rpc program number used for amd */
-void
-set_amd_program_number(int program)
-{
- amd_program_number = program;
-}
-
-
-/*
- * Release the controlling tty of the process pid.
- *
- * Algorithm: try these in order, if available, until one of them
- * succeeds: setsid(), ioctl(fd, TIOCNOTTY, 0).
- * Do not use setpgid(): on some OSs it may release the controlling tty,
- * even if the man page does not mention it, but on other OSs it does not.
- * Also avoid setpgrp(): it works on some systems, and on others it is
- * identical to setpgid().
- */
-void
-amu_release_controlling_tty(void)
-{
- int fd;
-
- /*
- * In daemon mode, leaving open file descriptors to terminals or pipes
- * can be a really bad idea.
- * Case in point: the redhat startup script calls us through their 'initlog'
- * program, which exits as soon as the original amd process exits. If,
- * at some point, a misbehaved library function decides to print something
- * to the screen, we get a SIGPIPE and die.
- * And guess what: NIS glibc functions will attempt to print to stderr
- * "YPBINDPROC_DOMAIN: Domain not bound" if ypbind is running but can't find
- * a ypserver.
- *
- * So we close all of our "terminal" filedescriptors, i.e. 0, 1 and 2, then
- * reopen them as /dev/null.
- *
- * XXX We should also probably set the SIGPIPE handler to SIG_IGN.
- */
- fd = open("/dev/null", O_RDWR);
- if (fd < 0) {
- plog(XLOG_WARNING, "Could not open /dev/null for rw: %m");
- } else {
- fflush(stdin); close(0); dup2(fd, 0);
- fflush(stdout); close(1); dup2(fd, 1);
- fflush(stderr); close(2); dup2(fd, 2);
- close(fd);
- }
-
-#ifdef HAVE_SETSID
- /* XXX: one day maybe use vhangup(2) */
- if (setsid() < 0) {
- plog(XLOG_WARNING, "Could not release controlling tty using setsid(): %m");
- } else {
- plog(XLOG_INFO, "released controlling tty using setsid()");
- return;
- }
-#endif /* HAVE_SETSID */
-
-#ifdef TIOCNOTTY
- fd = open("/dev/tty", O_RDWR);
- if (fd < 0) {
- /* not an error if already no controlling tty */
- if (errno != ENXIO)
- plog(XLOG_WARNING, "Could not open controlling tty: %m");
- } else {
- if (ioctl(fd, TIOCNOTTY, 0) < 0 && errno != ENOTTY)
- plog(XLOG_WARNING, "Could not disassociate tty (TIOCNOTTY): %m");
- else
- plog(XLOG_INFO, "released controlling tty using ioctl(TIOCNOTTY)");
- close(fd);
- }
- return;
-#endif /* not TIOCNOTTY */
-
- plog(XLOG_ERROR, "unable to release controlling tty");
-}
-
-
-/* setup a single signal handler */
-void
-setup_sighandler(int signum, void (*handler)(int))
-{
-#ifdef HAVE_SIGACTION
- struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
- sa.sa_flags = 0; /* unnecessary */
- sa.sa_handler = handler;
- sigemptyset(&(sa.sa_mask)); /* probably unnecessary too */
- sigaddset(&(sa.sa_mask), signum);
- sigaction(signum, &sa, NULL);
-#else /* not HAVE_SIGACTION */
- (void) signal(signum, handler);
-#endif /* not HAVE_SIGACTION */
-}
-
-
-/*
- * Return current time in seconds. If passed a non-null argyument, then
- * fill it in with the current time in seconds and microseconds (useful
- * for mtime updates).
- */
-time_t
-clocktime(nfstime *nt)
-{
- static struct timeval now; /* keep last time, as default */
-
- if (gettimeofday(&now, NULL) < 0) {
- plog(XLOG_ERROR, "clocktime: gettimeofday: %m");
- /* hack: force time to have incremented by at least 1 second */
- now.tv_sec++;
- }
- /* copy seconds and microseconds. may demote a long to an int */
- if (nt) {
- nt->nt_seconds = (u_int) now.tv_sec;
- nt->nt_useconds = (u_int) now.tv_usec;
- }
- return (time_t) now.tv_sec;
-}
-
-
-/*
- * Make all the directories in the path.
- */
-int
-mkdirs(char *path, int mode)
-{
- /*
- * take a copy in case path is in readonly store
- */
- char *p2 = strdup(path);
- char *sp = p2;
- struct stat stb;
- int error_so_far = 0;
-
- /*
- * Skip through the string make the directories.
- * Mostly ignore errors - the result is tested at the end.
- *
- * This assumes we are root so that we can do mkdir in a
- * mode 555 directory...
- */
- while ((sp = strchr(sp + 1, '/'))) {
- *sp = '\0';
- if (mkdir(p2, mode) < 0) {
- error_so_far = errno;
- } else {
- dlog("mkdir(%s)", p2);
- }
- *sp = '/';
- }
-
- if (mkdir(p2, mode) < 0) {
- error_so_far = errno;
- } else {
- dlog("mkdir(%s)", p2);
- }
-
- XFREE(p2);
-
- return stat(path, &stb) == 0 &&
- (stb.st_mode & S_IFMT) == S_IFDIR ? 0 : error_so_far;
-}
-
-
-/*
- * Remove as many directories in the path as possible.
- * Give up if the directory doesn't appear to have
- * been created by Amd (not mode dr-x) or an rmdir
- * fails for any reason.
- */
-void
-rmdirs(char *dir)
-{
- char *xdp = strdup(dir);
- char *dp;
-
- do {
- struct stat stb;
- /*
- * Try to find out whether this was
- * created by amd. Do this by checking
- * for owner write permission.
- */
- if (stat(xdp, &stb) == 0 && (stb.st_mode & 0200) == 0) {
- if (rmdir(xdp) < 0) {
- if (errno != ENOTEMPTY &&
- errno != EBUSY &&
- errno != EEXIST &&
- errno != EROFS &&
- errno != EINVAL)
- plog(XLOG_ERROR, "rmdir(%s): %m", xdp);
- break;
- } else {
- dlog("rmdir(%s)", xdp);
- }
- } else {
- break;
- }
-
- dp = strrchr(xdp, '/');
- if (dp)
- *dp = '\0';
- } while (dp && dp > xdp);
-
- XFREE(xdp);
-}
diff --git a/contrib/amd/mk-amd-map/mk-amd-map.8 b/contrib/amd/mk-amd-map/mk-amd-map.8
deleted file mode 100644
index f5cef608ea13..000000000000
--- a/contrib/amd/mk-amd-map/mk-amd-map.8
+++ /dev/null
@@ -1,82 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1993 Jan-Simon Pendry
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)mk-amd-map.8 8.1 (Berkeley) 6/28/93
-.\" $Id: mk-amd-map.8,v 1.9.2.1 2006/01/02 18:48:26 ezk Exp $
-.\"
-.TH MK-AMD-MAP 8 "June 28, 1993"
-.SH NAME
-.B mk-amd-map
-\- create database maps for Amd
-.SH SYNOPSIS
-.B mk-amd-map
-[
-.B \-p
-]
-.I mapname
-.SH DESCRIPTION
-.B mk-amd-map
-creates the database maps used by the keyed map lookups in
-amd(8).
-It reads input from the named file
-and outputs them to a correspondingly named
-hashed database.
-.TP
-.B \-p
-This
-option prints the map on standard output instead of generating
-a database. This is usually used to merge continuation lines
-into one physical line.
-.SH SEE ALSO
-.BR amd (8).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH AUTHORS
-Jan-Simon Pendry <jsp@doc.ic.ac.uk>, Department of Computing, Imperial College, London, UK.
-.P
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/mk-amd-map/mk-amd-map.c b/contrib/amd/mk-amd-map/mk-amd-map.c
deleted file mode 100644
index 48d82b0bd0d7..000000000000
--- a/contrib/amd/mk-amd-map/mk-amd-map.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/mk-amd-map/mk-amd-map.c
- */
-
-/*
- * Convert a file map into an ndbm map
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-
-/* (libdb version 2) uses .db extensions but an old dbm API */
-/* check for libgdbm to distinguish it from linux systems */
-#if defined(DBM_SUFFIX) && !defined(HAVE_LIBGDBM)
-# define HAVE_DB_SUFFIX
-#endif /* not defined(DBM_SUFFIX) && !defined(HAVE_LIBGDBM) */
-
-#ifdef HAVE_MAP_NDBM
-
-static int
-store_data(voidp db, char *k, char *v)
-{
- datum key, val;
-
- key.dptr = k;
- val.dptr = v;
- key.dsize = strlen(k) + 1;
- val.dsize = strlen(v) + 1;
- return dbm_store((DBM *) db, key, val, DBM_INSERT);
-}
-
-
-/*
- * Read one line from file.
- */
-static int
-read_line(char *buf, int size, FILE *fp)
-{
- int done = 0;
-
- do {
- while (fgets(buf, size, fp)) {
- int len = strlen(buf);
-
- done += len;
- if (len > 1 && buf[len - 2] == '\\' && buf[len - 1] == '\n') {
- int ch;
- buf += len - 2;
- size -= len - 2;
- *buf = '\n';
- buf[1] = '\0';
-
- /*
- * Skip leading white space on next line
- */
- while ((ch = getc(fp)) != EOF && isascii(ch) && isspace(ch)) ;
- (void) ungetc(ch, fp);
- } else {
- return done;
- }
- }
- } while (size > 0 && !feof(fp));
-
- return done;
-}
-
-
-/*
- * Read through a map.
- */
-static int
-read_file(FILE *fp, char *map, voidp db)
-{
- char key_val[2048];
- int chuck = 0;
- int line_no = 0;
- int errs = 0;
-
- while (read_line(key_val, 2048, fp)) {
- char *kp;
- char *cp;
- char *hash;
- int len = strlen(key_val);
-
- line_no++;
-
- /*
- * Make sure we got the whole line
- */
- if (key_val[len - 1] != '\n') {
- fprintf(stderr, "line %d in \"%s\" is too long", line_no, map);
- chuck = 1;
- } else {
- key_val[len - 1] = '\0';
- }
-
- /*
- * Strip comments
- */
- hash = strchr(key_val, '#');
- if (hash)
- *hash = '\0';
-
- /*
- * Find start of key
- */
- for (kp = key_val; *kp && isascii(*kp) && isspace((int)*kp); kp++) ;
-
- /*
- * Ignore blank lines
- */
- if (!*kp)
- goto again;
-
- /*
- * Find end of key
- */
- for (cp = kp; *cp && (!isascii(*cp) || !isspace((int)*cp)); cp++) ;
-
- /*
- * Check whether key matches, or whether
- * the entry is a wildcard entry.
- */
- if (*cp)
- *cp++ = '\0';
- while (*cp && isascii(*cp) && isspace((int)*cp))
- cp++;
- if (*kp == '+') {
- fprintf(stderr, "Can't interpolate %s\n", kp);
- errs++;
- } else if (*cp) {
- if (db) {
- if (store_data(db, kp, cp) < 0) {
- fprintf(stderr, "Could store %s -> %s\n", kp, cp);
- errs++;
- }
- } else {
- printf("%s\t%s\n", kp, cp);
- }
- } else {
- fprintf(stderr, "%s: line %d has no value field", map, line_no);
- errs++;
- }
-
- again:
- /*
- * If the last read didn't get a whole line then
- * throw away the remainder before continuing...
- */
- if (chuck) {
- while (fgets(key_val, sizeof(key_val), fp) &&
- !strchr(key_val, '\n')) ;
- chuck = 0;
- }
- }
- return errs;
-}
-
-
-static int
-remove_file(char *f)
-{
- if (unlink(f) < 0 && errno != ENOENT)
- return -1;
-
- return 0;
-}
-
-
-int
-main(int argc, char *argv[])
-{
- FILE *mapf; /* the input file to read from */
- int error;
- char *mapsrc;
- DBM *db = NULL;
- static char maptmp[] = "dbmXXXXXX";
-#ifdef HAVE_DB_SUFFIX
- char maptdb[16];
- char *map_name_db = (char *) NULL;
-#else /* not HAVE_DB_SUFFIX */
- char maptpag[16], maptdir[16];
- char *map_name_pag = (char *) NULL, *map_name_dir = (char *) NULL;
-#endif /* not HAVE_DB_SUFFIX */
- size_t l = 0;
- char *sl;
- int printit = 0;
- int usage = 0;
- int ch;
- extern int optind;
-
- /* test options */
- while ((ch = getopt(argc, argv, "p")) != -1)
- switch (ch) {
- case 'p':
- printit = 1;
- break;
- default:
- usage++;
- break;
- }
-
- if (usage || optind != (argc - 1)) {
- fputs("Usage: mk-amd-map [-p] file-map\n", stderr);
- exit(1);
- }
- mapsrc = argv[optind];
-
- /* test if can get to the map directory */
- sl = strrchr(mapsrc, '/');
- if (sl) {
- *sl = '\0';
- if (chdir(mapsrc) < 0) {
- fputs("Can't chdir to ", stderr);
- perror(mapsrc);
- exit(1);
- }
- mapsrc = sl + 1;
- }
-
- /* open source file */
- mapf = fopen(mapsrc, "r");
- if (!mapf) {
- fprintf(stderr, "cannot open source file ");
- perror(mapsrc);
- exit(1);
- }
-
-#ifndef DEBUG
- signal(SIGINT, SIG_IGN);
-#endif /* DEBUG */
-
- if (!printit) {
- /* enough space for ".db" or ".pag" or ".dir" appended */
- l = strlen(mapsrc) + 5;
-#ifdef HAVE_DB_SUFFIX
- map_name_db = (char *) malloc(l);
- error = (map_name_db == NULL);
-#else /* not HAVE_DB_SUFFIX */
- map_name_pag = (char *) malloc(l);
- map_name_dir = (char *) malloc(l);
- error = (map_name_pag == NULL || map_name_dir == NULL);
-#endif /* not HAVE_DB_SUFFIX */
- if (error) {
- perror("mk-amd-map: malloc");
- exit(1);
- }
-
-#ifdef HAVE_MKSTEMP
- {
- /*
- * XXX: hack to avoid compiler complaints about mktemp not being
- * secure, since we have to do a dbm_open on this anyway. So use
- * mkstemp if you can, and then close the fd, but we get a safe
- * and unique file name.
- */
- int dummyfd;
- dummyfd = mkstemp(maptmp);
- if (dummyfd >= 0)
- close(dummyfd);
- }
-#else /* not HAVE_MKSTEMP */
- mktemp(maptmp);
-#endif /* not HAVE_MKSTEMP */
-
- /* remove existing temps (if any) */
-#ifdef HAVE_DB_SUFFIX
- xsnprintf(maptdb, sizeof(maptdb), "%s.db", maptmp);
- if (remove_file(maptdb) < 0) {
- fprintf(stderr, "Can't remove existing temporary file; ");
- perror(maptdb);
- exit(1);
- }
-#else /* not HAVE_DB_SUFFIX */
- xsnprintf(maptpag, sizeof(maptpag), "%s.pag", maptmp);
- xsnprintf(maptdir, sizeof(maptdir), "%s.dir", maptmp);
- if (remove_file(maptpag) < 0 || remove_file(maptdir) < 0) {
- fprintf(stderr, "Can't remove existing temporary files; %s and ", maptpag);
- perror(maptdir);
- exit(1);
- }
-#endif /* not HAVE_DB_SUFFIX */
-
- db = dbm_open(maptmp, O_RDWR|O_CREAT|O_EXCL, 0444);
- if (!db) {
- fprintf(stderr, "cannot initialize temporary database: %s", maptmp);
- exit(1);
- }
- }
-
- /* print db to stdout or to temp database */
- error = read_file(mapf, mapsrc, db);
- fclose(mapf);
- if (error) {
- if (printit)
- fprintf(stderr, "Error reading source file %s\n", mapsrc);
- else
- fprintf(stderr, "Error creating database map for %s\n", mapsrc);
- exit(1);
- }
-
- if (printit)
- exit(0); /* nothing more to do */
-
- /* if gets here, we wrote to a database */
-
- dbm_close(db);
- /* all went well */
-
-#ifdef HAVE_DB_SUFFIX
- /* sizeof(map_name_db) is malloc'ed above */
- xsnprintf(map_name_db, l, "%s.db", mapsrc);
- if (rename(maptdb, map_name_db) < 0) {
- fprintf(stderr, "Couldn't rename %s to ", maptdb);
- perror(map_name_db);
- /* Throw away the temporary map */
- unlink(maptdb);
- exit(1);
- }
-#else /* not HAVE_DB_SUFFIX */
- /* sizeof(map_name_{pag,dir}) are malloc'ed above */
- xsnprintf(map_name_pag, l, "%s.pag", mapsrc);
- xsnprintf(map_name_dir, l, "%s.dir", mapsrc);
- if (rename(maptpag, map_name_pag) < 0) {
- fprintf(stderr, "Couldn't rename %s to ", maptpag);
- perror(map_name_pag);
- /* Throw away the temporary map */
- unlink(maptpag);
- unlink(maptdir);
- exit(1);
- }
- if (rename(maptdir, map_name_dir) < 0) {
- fprintf(stderr, "Couldn't rename %s to ", maptdir);
- perror(map_name_dir);
- /* remove the (presumably bad) .pag file */
- unlink(map_name_pag);
- /* throw away remaining part of original map */
- unlink(map_name_dir);
- /* throw away the temporary map */
- unlink(maptdir);
- fprintf(stderr, "WARNING: existing map \"%s.{dir,pag}\" destroyed\n",
- mapsrc);
- exit(1);
- }
-#endif /* not HAVE_DB_SUFFIX */
-
- exit(0);
-}
-
-#else /* not HAVE_MAP_NDBM */
-
-int
-main()
-{
- fputs("mk-amd-map: This system does not support hashed database files\n", stderr);
- exit(1);
-}
-
-#endif /* not HAVE_MAP_NDBM */
diff --git a/contrib/amd/scripts/Makefile.am b/contrib/amd/scripts/Makefile.am
deleted file mode 100644
index c4380584ec0e..000000000000
--- a/contrib/amd/scripts/Makefile.am
+++ /dev/null
@@ -1,49 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# Package: am-utils
-# Level: Makefile for scripts/ directory
-# Author: Erez Zadok
-
-sbin_SCRIPTS = \
- am-eject \
- amd2ldif \
- amd2sun \
- ctl-amd \
- ctl-hlfsd \
- fixrmtab \
- fix-amd-map \
- lostaltmail \
- wait4amd \
- wait4amd2die
-
-bin_SCRIPTS = \
- expn
-
-sysconf_DATA = \
- amd.conf-sample \
- lostaltmail.conf-sample
-
-# man pages
-man_MANS = \
- amd.conf.5 \
- expn.1
-
-EXTRA_DIST = \
- am-eject.in \
- amd2ldif.in \
- amd2sun.in \
- ctl-amd.in \
- ctl-hlfsd.in \
- fixrmtab.in \
- fix-amd-map.in \
- lostaltmail.in \
- wait4amd.in \
- wait4amd2die.in \
- \
- expn.in \
- \
- amd.conf-sample \
- lostaltmail.conf-sample \
- $(man_MANS)
-
-CLEANFILES = $(sbin_SCRIPTS) $(bin_SCRIPTS)
diff --git a/contrib/amd/scripts/Makefile.in b/contrib/amd/scripts/Makefile.in
deleted file mode 100644
index a20d84627136..000000000000
--- a/contrib/amd/scripts/Makefile.in
+++ /dev/null
@@ -1,381 +0,0 @@
-# Makefile.in generated automatically by automake 1.3.2 from Makefile.am
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-# Package: am-utils
-# Level: Makefile for scripts/ directory
-# Author: Erez Zadok
-
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DISTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-AR = @AR@
-CC = @CC@
-CPP = @CPP@
-LEX = @LEX@
-LIBTOOL = @LIBTOOL@
-LIBTOOL_LDFLAGS = @LIBTOOL_LDFLAGS@
-LTALLOCA = @LTALLOCA@
-LTLIBOBJS = @LTLIBOBJS@
-PACKAGE = @PACKAGE@
-PERL = @PERL@
-RANLIB = @RANLIB@
-VERSION = @VERSION@
-
-sbin_SCRIPTS = \
- am-eject \
- amd2ldif \
- amd2sun \
- ctl-amd \
- ctl-hlfsd \
- fixrmtab \
- fix-amd-map \
- lostaltmail \
- wait4amd \
- wait4amd2die
-
-bin_SCRIPTS = \
- expn
-
-sysconf_DATA = \
- amd.conf-sample \
- lostaltmail.conf-sample
-
-# man pages
-man_MANS = \
- amd.conf.5 \
- expn.1
-
-EXTRA_DIST = \
- am-eject.in \
- amd2ldif.in \
- amd2sun.in \
- ctl-amd.in \
- ctl-hlfsd.in \
- fixrmtab.in \
- fix-amd-map.in \
- lostaltmail.in \
- wait4amd.in \
- wait4amd2die.in \
- \
- expn.in \
- \
- amd.conf-sample \
- lostaltmail.conf-sample \
- $(man_MANS)
-
-CLEANFILES = $(sbin_SCRIPTS) $(bin_SCRIPTS)
-mkinstalldirs = $(SHELL) $(top_srcdir)/aux/mkinstalldirs
-CONFIG_HEADER = ../config.h
-CONFIG_CLEAN_FILES = am-eject amd2ldif amd2sun ctl-amd ctl-hlfsd expn \
-fixrmtab fix-amd-map lostaltmail wait4amd wait4amd2die
-SCRIPTS = $(bin_SCRIPTS) $(sbin_SCRIPTS)
-
-man1dir = $(mandir)/man1
-man5dir = $(mandir)/man5
-MANS = $(man_MANS)
-
-NROFF = nroff
-DATA = $(sysconf_DATA)
-
-DIST_COMMON = Makefile.am Makefile.in am-eject.in amd2ldif.in \
-amd2sun.in ctl-amd.in ctl-hlfsd.in expn.in fix-amd-map.in fixrmtab.in \
-lostaltmail.in wait4amd.in wait4amd2die.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP = --best
-all: Makefile $(SCRIPTS) $(MANS) $(DATA)
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/./aux/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --localdir=./aux --gnu --include-deps scripts/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-am-eject: $(top_builddir)/config.status am-eject.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-amd2ldif: $(top_builddir)/config.status amd2ldif.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-amd2sun: $(top_builddir)/config.status amd2sun.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-ctl-amd: $(top_builddir)/config.status ctl-amd.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-ctl-hlfsd: $(top_builddir)/config.status ctl-hlfsd.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-expn: $(top_builddir)/config.status expn.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-fixrmtab: $(top_builddir)/config.status fixrmtab.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-fix-amd-map: $(top_builddir)/config.status fix-amd-map.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-lostaltmail: $(top_builddir)/config.status lostaltmail.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-wait4amd: $(top_builddir)/config.status wait4amd.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-wait4amd2die: $(top_builddir)/config.status wait4amd2die.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-install-binSCRIPTS: $(bin_SCRIPTS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
- @list='$(bin_SCRIPTS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
- $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
- else if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
- $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
- else :; fi; fi; \
- done
-
-uninstall-binSCRIPTS:
- @$(NORMAL_UNINSTALL)
- list='$(bin_SCRIPTS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
- done
-
-install-sbinSCRIPTS: $(sbin_SCRIPTS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(sbindir)
- @list='$(sbin_SCRIPTS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed '$(transform)'`"; \
- $(INSTALL_SCRIPT) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed '$(transform)'`; \
- else if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(sbindir)/`echo $$p|sed '$(transform)'`"; \
- $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(sbindir)/`echo $$p|sed '$(transform)'`; \
- else :; fi; fi; \
- done
-
-uninstall-sbinSCRIPTS:
- @$(NORMAL_UNINSTALL)
- list='$(sbin_SCRIPTS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed '$(transform)'`; \
- done
-
-install-man1:
- $(mkinstalldirs) $(DESTDIR)$(man1dir)
- @list='$(man1_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.1*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
- else file=$$i; fi; \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
- done
-
-uninstall-man1:
- @list='$(man1_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.1*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
- rm -f $(DESTDIR)$(man1dir)/$$inst; \
- done
-
-install-man5:
- $(mkinstalldirs) $(DESTDIR)$(man5dir)
- @list='$(man5_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.5*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
- else file=$$i; fi; \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst"; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst; \
- done
-
-uninstall-man5:
- @list='$(man5_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.5*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " rm -f $(DESTDIR)$(man5dir)/$$inst"; \
- rm -f $(DESTDIR)$(man5dir)/$$inst; \
- done
-install-man: $(MANS)
- @$(NORMAL_INSTALL)
- $(MAKE) install-man1 install-man5
-uninstall-man:
- @$(NORMAL_UNINSTALL)
- $(MAKE) uninstall-man1 uninstall-man5
-
-install-sysconfDATA: $(sysconf_DATA)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(sysconfdir)
- @list='$(sysconf_DATA)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(sysconfdir)/$$p"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(sysconfdir)/$$p; \
- else if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$p; \
- fi; fi; \
- done
-
-uninstall-sysconfDATA:
- @$(NORMAL_UNINSTALL)
- list='$(sysconf_DATA)'; for p in $$list; do \
- rm -f $(DESTDIR)$(sysconfdir)/$$p; \
- done
-tags: TAGS
-TAGS:
-
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = scripts
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file; \
- done
-info:
-dvi:
-check: all
- $(MAKE)
-installcheck:
-install-exec: install-binSCRIPTS install-sbinSCRIPTS install-sysconfDATA
- @$(NORMAL_INSTALL)
-
-install-data: install-man
- @$(NORMAL_INSTALL)
-
-install: install-exec install-data all
- @:
-
-uninstall: uninstall-binSCRIPTS uninstall-sbinSCRIPTS uninstall-man uninstall-sysconfDATA
-
-install-strip:
- $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
-installdirs:
- $(mkinstalldirs) $(DATADIR)$(bindir) $(DATADIR)$(sbindir) \
- $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 \
- $(DATADIR)$(sysconfdir)
-
-
-mostlyclean-generic:
- -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(DISTCLEANFILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
- -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-mostlyclean: mostlyclean-generic
-
-clean: clean-generic mostlyclean
-
-distclean: distclean-generic clean
- -rm -f config.status
- -rm -f libtool
-
-maintainer-clean: maintainer-clean-generic distclean
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-.PHONY: uninstall-binSCRIPTS install-binSCRIPTS uninstall-sbinSCRIPTS \
-install-sbinSCRIPTS install-man1 uninstall-man1 install-man5 \
-uninstall-man5 install-man uninstall-man uninstall-sysconfDATA \
-install-sysconfDATA tags distdir info dvi installcheck install-exec \
-install-data install uninstall all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/contrib/amd/scripts/am-eject.in b/contrib/amd/scripts/am-eject.in
deleted file mode 100644
index 8754a3bd4751..000000000000
--- a/contrib/amd/scripts/am-eject.in
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/sh
-# auto-unmount floppy/cd directory before ejecting device
-# script taken from Debian Linux's amd
-#
-# Package: am-utils-6.x
-# (Additional) author: Erez Zadok <ezk@cs.columbia.edu>
-
-# set path
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-PATH=@sbindir@:@bindir@:/usr/ucb:/usr/bin:/bin:${PATH}
-export PATH
-
-if [ $# -ne 1 ]; then
- echo "Usage: $0 cd|cdrom|fd|floppy"
- exit 2
-fi
-
-# determine toplevel mount point of amd
-fs=`amq | grep ' toplvl ' | cut -d' ' -f1`
-if [ "$fs" = "" ]; then
- echo "Cannot determine amd toplevel directory"
- exit 2
-fi
-
-# append name of medium
-case "$1" in
- cd|fd) fs=$fs/$1;;
- *) echo "Usage: $0 cd|cdrom|fd|floppy"; exit 2;;
-esac
-
-# is the medium mounted?
-if amq | grep -q "^$fs" >/dev/null 2>&1; then
- # if yes, try to unmount it
- sync
- amq -u $fs
- sleep 2
- if amq | grep -q "^$fs" >/dev/null 2>&1; then
- # failed, bail out
- echo -n "Cannot unmount $fs; in use by:"
- fuser -uv -m $fs
- echo ""
- exit 1
- fi
-else
- echo "$fs not mounted"
-fi
-
-case $1 in
- cd|cdrom) eject cdrom || eject ;; # eject CD-ROM
- fd|floppy) eject floppy || eject
- echo "Ok to remove disk" ;;
-esac
diff --git a/contrib/amd/scripts/amd.conf-sample b/contrib/amd/scripts/amd.conf-sample
deleted file mode 100644
index 880a74ba7552..000000000000
--- a/contrib/amd/scripts/amd.conf-sample
+++ /dev/null
@@ -1,164 +0,0 @@
-# A SAMPLE CONFIGURATION FILE FOR AMD
-
-##############################################################################
-# GLOBAL OPTIONS SECTION (must be first in amd.conf file)
-# For most options, the default value is listed first, but see amd.conf(5)
-[ global ]
-# (amd -n)
-normalize_hostnames = no | yes
-# do we want to strip domain names from hostnames or not?
-domain_strip = yes | no
-# (amd -p)
-print_pid = no | yes
-pid_file = /dev/stdout | /var/run/amd.pid
-# (amd -r)
-restart_mounts = no | yes
-unmount_on_exit = no | yes
-forced_unmounts = no | yes
-# (amd -a)
-auto_dir = /a
-# duration in seconds that a looked up name remain cached (amd -c)
-cache_duration = 300
-# (amd -d)
-local_domain = cs.columbia.edu
-# (amd -k)
-karch = sun4m
-# (amd -A)
-arch = sun4
-# if you don't like autoconf picking up "sunos5" as the os-type, override it
-# (amd -O)
-os = sos5
-# (amd -o)
-osver = 2.5.1
-# full os name
-full_os = linux-2.2.5
-# OS vendor
-vendor = redhat
-# if you print_version after setting up "os", it will show it. (amd -v)
-print_version = no | yes
-# (amd -l)
-log_file = /dev/stderr | /var/log/amd | syslog[:facility]
-# should we truncate the log file on startup?
-truncate_log = no | yes
-# NFS (RPC) retry interval/counter, in tenths of secs (amd -t interval.counter)
-nfs_retry_interval = 8
-nfs_retransmit_counter = 11 (eleven retransmission attempts)
-# The next four are the same as the above two, but allow you to set global
-# values for all UDP vs. TCP mounts separately.
-nfs_retry_interval_udp = 16
-nfs_retransmit_counter_udp = 22
-nfs_retry_interval_tcp = 4
-nfs_retransmit_counter_tcp = 5
-# These two are specific to Amd's top-level (NFSv2/udp) mounts
-# and they can also be set separately.
-nfs_retry_interval_toplvl = 6
-nfs_retransmit_counter_toplvl = 8
-# NFS attribute cache value for Amd's automount points
-# (some OSs use this parameter in units of seconds, and others in 0.1 seconds)
-# See README.attrcache for important information about this parameter.
-auto_attrcache = 0
-# (amd -w)
-dismount_interval = 120
-# (amd -y)
-nis_domain = nisDom-CS.columbia.edu
-# (amd -x)
-log_options = fatal,error,user,warn,info,map,stats,all
-# (amd -D)
-debug_options = all,amq,daemon,fork,full,hrtime,info,mem,mtab,\
- str,readdir,test,trace,xdrtrace
-# path for mtab file during mtab debug mode
-debug_mtab_file = /tmp/mnttab
-# (amd -S)
-plock = yes | no
-# should browsable maps show number of entries to df/statfs (default=no)
-show_statfs_entries = no | yes
-# (hpux) cluster name (amd -C)
-cluster = ???
-# LDAP (Lightweight Directory Access Protocol) options
-ldap_base = "ou=Marketing, o=AMD Ltd, c=US"
-ldap_hostports = ldap.your.domain:389
-ldap_cache_seconds = 0
-ldap_cache_maxmem = 131072
-ldap_proto_version = 2
-# default base name for hesiod maps
-hesiod_base = automount
-# interval to check if a reload of any maps is needed
-map_reload_interval = 3600
-# alternate RPC program number to register with the port mapper
-portmap_program = 300019-300029
-# Ask for a different Amq RPC port (both UDP and TCP).
-# If set to 0 (default), Amd will pick a port automatically.
-preferred_amq_port = 1234
-# use fully qualified host names
-fully_qualified_hosts = no | yes
-# force NFS version or NFS protocol
-nfs_vers = 2 | 3
-nfs_proto = udp | tcp
-# perform Amq service checks via tcpwrappers (tcpd/libwrap)
-use_tcpwrappers = yes | no
-# allow NFS requests from insecure (>=1024) ports
-nfs_allow_insecure_port = no | yes
-# accept local NFS packets from any local interface, not just 127.0.0.1
-nfs_allow_any_interface = no | yes
-# address used for local NFS mount and RPC server (default to localhost)
-localhost_address = foo.example.com | 192.168.1.2
-# number of seconds to timeout before map returns output
-exec_map_timeout = 10
-# normalize multiple/trailing slashes or not?
-normalize_slashes = yes | no
-
-##############################################################################
-# these 8 global options can be overridden by each map individually
-browsable_dirs = no | yes | full
-map_options = cache:=all
-map_type = file|hesiod|ndbm|nis|nisplus|passwd|union|ldap
-# any string that will be used to override to the map /defaults entry
-map_defaults = opts:=nosuid,rw,intr,bg,noquota;type:=link
-mount_type = nfs | autofs
-autofs_use_lofs = yes | no
-search_path = /etc/local:/etc/amdmaps:/misc/yp
-# selectors are not recognized by default in the /defaults entry
-selectors_in_defaults = no | yes
-##############################################################################
-
-##############################################################################
-# DEFINE AN AMD MOUNT POINT
-[ /home ]
-# map name must be defined, all else are optional
-map_name = /etc/amd.home | amd.home
-map_options = cache:=all
-# if map type is not defined, will search all map types (default)
-map_type = file|hesiod|ndbm|nis|nisplus|passwd|union|ldap
-search_path = /etc/local:/etc/amdmaps:/misc/yp
-# an amd or autofs mount point
-mount_type = nfs | autofs
-browsable_dirs = yes | no
-# an optional tag to be used with amd -T tag. untagged entries are always
-# used. Tagged ones get used only if specified with "amd -T"
-tag = test
-
-##############################################################################
-# DEFINE ANOTHER AMD MOUNT POINT
-[ /src ]
-map_name = /usr/local/lib/amdmaps/amu.src
-# regular amd (nfs) mount point (default)
-mount_type = nfs
-# any string that will be used as prefix to the map /defaults entry
-# this overrides what's defined in [global]
-map_defaults = type:=nfs
-
-##############################################################################
-# DEFINE ANOTHER AMD MOUNT POINT
-[ /test ]
-map_name = /etc/lookup-entry.sh
-# an executable map type
-map_type = exec
-
-##############################################################################
-# DEFINE A SUN SYNTAX MOUNT POINT
-[ /proj ]
-map_name = /etc/amd.proj
-# does this map use Sun Automounter map syntax?
-sun_map_syntax = yes
-
-##############################################################################
diff --git a/contrib/amd/scripts/amd.conf.5 b/contrib/amd/scripts/amd.conf.5
deleted file mode 100644
index 36e08cd9a41b..000000000000
--- a/contrib/amd/scripts/amd.conf.5
+++ /dev/null
@@ -1,784 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1990 Jan-Simon Pendry
-.\" Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: amd.conf.5,v 1.39.2.5 2006/04/21 01:12:04 ezk Exp $
-.\"
-.TH AMD.CONF 5 "7 August 1997"
-.SH NAME
-amd.conf \- Amd configuration file
-.SH SYNOPSIS
-.B amd.conf
-.SH DESCRIPTION
-The
-.B amd.conf
-file is the configuration file for Amd, as part of the am-utils suite.
-.P
-.B amd.conf
-contains runtime configuration information for the
-.B Amd
-automounter program.
-.\" **************************************************************************
-.SH FILE FORMAT
-.P
-The file consists of sections and parameters. A section begins with the
-name of the section in square brackets and continues until the next section
-begins or the end the file is reached. Sections contain parameters of the
-form 'name = value'.
-.P
-The file is line-based - that is, each newline-terminated line represents
-either a comment, a section name or a parameter. No line-continuation
-syntax is available.
-.P
-Section, parameter names and their values are case sensitive.
-.P
-Only the first equals sign in a parameter is significant. Whitespace before
-or after the first equals sign is discarded. Leading, trailing and
-internal whitespace in section and parameter names is irrelevant. Leading
-and trailing whitespace in a parameter value is discarded. Internal
-whitespace within a parameter value is not allowed, unless the whole
-parameter value is quoted with double quotes as in 'name = "some value"'.
-.P
-Any line beginning with a pound sign (#) is ignored, as are lines containing
-only whitespace.
-.P
-The values following the equals sign in parameters are all either a string
-(no quotes needed if string does not include spaces) or a boolean, which may
-be given as yes/no. Case is significant in all values. Some items such as
-cache timeouts are numeric.
-.\" **************************************************************************
-.SH SECTIONS
-.SS The [global] section
-Parameters in this section either apply to Amd as a whole, or to all other
-regular map sections which follow. There should be only one global section
-defined in one configuration file.
-.P
-It is highly recommended that this section be specified first in the
-configuration file. If it is not, then regular map sections which precede
-it will not use global values defined later.
-
-.SS Regular [/map] sections
-Parameters in regular (non-global) sections apply to a single map entry.
-For example, if the map section
-.B [/homes]
-is defined, then all parameters following it will be applied to the
-.I /homes
-Amd-managed mount point.
-.\" **************************************************************************
-.SH PARAMETERS
-.SS Parameters common to all sections
-These parameters can be specified either in the global or a map specific
-section. Entries specified in a map-specific section override the default
-value or one defined in the global section. If such a common parameter is
-specified only in the global section, it is applicable to all regular map
-sections that follow.
-.\" **************************************************************************
-.TP
-.BR browsable_dirs " (string, default=no)"
-If "yes," then Amd's top-level mount points will be browsable to
-.BR readdir (3)
-calls. This means you could run for example
-.BR ls (1)
-and see what keys are available to mount in that directory. Not all entries
-are made visible to readdir(3): the "/default" entry, wildcard
-entries, and those with a "/" in them are not included. If you specify
-"full" to this option, all but "/default" will be visible.
-Note that if you run a command which will attempt to
-.BR stat (2)
-the entries, such as often done by "ls -l" or "ls -F," Amd will attempt to
-mount
-.I every
-entry in that map. This is often called a ``mount storm.''
-
-.TP
-.BR map_defaults " (string, default to empty)"
-This option sets a string to be used as the map's /defaults entry,
-overriding any /defaults specified in the map. This allows local users to
-override map defaults without modifying maps globally.
-
-.TP
-.BR map_options " (string, default no options)"
-This option is the same as specifying map options on the command line to
-Amd, such as "cache:=all".
-
-.TP
-.BR map_type " (string, default search all map types)"
-If specified, Amd will initialize the map only for the type given. This is
-useful to avoid the default map search type used by Amd which takes longer
-and can have undesired side-effects such as initializing NIS even if not
-used. Possible values are
-
-.nf
-\fBexec\fR executable maps
-\fBfile\fR plain files
-\fBhesiod\fR Hesiod name service from MIT
-\fBldap\fR Lightweight Directory Access Protocol
-\fBndbm\fR (New) dbm style hash files
-\fBnis\fR Network Information Services (version 2)
-\fBnisplus\fR Network Information Services Plus (version 3)
-\fBpasswd\fR local password files
-\fBunion\fR union maps
-.fi
-
-.TP
-.BR mount_type " (string, default=nfs)"
-All Amd mount types default to NFS. That is, Amd is an NFS server on the
-map mount points, for the local host it is running on. If "autofs" is
-specified, Amd will be an autofs server for those mount points.
-
-.TP
-.BR autofs_use_lofs " (string, default=yes)"
-When set to "yes" and using Autofs, Amd will use lofs-type (loopback) mounts
-for type:=link mounts. This has the advantage of mounting in place, and
-users get to the see the same pathname that they chdir'ed into. If this
-option is set to "no," then Amd will use symlinks instead: that code is more
-tested, but negates autofs's big advantage of in-place mounts.
-
-.TP
-.BR search_path " (string, default no search path)"
-This provides a (colon-delimited) search path for file maps. Using a search
-path, sites can allow for local map customizations and overrides, and can
-distributed maps in several locations as needed.
-
-.TP
-.BR selectors_in_defaults " (boolean, default=no)"
-If "yes," then the /defaults entry of maps will search for and process any
-selectors before setting defaults for all other keys in that map. Useful
-when you want to set different options for a complete map based on some
-parameters. For example, you may want to better the NFS performance over
-slow slip-based networks as follows:
-
-.nf
-/defaults \\
- wire==slip-net;opts:=intr,rsize=1024,wsize=1024 \\
- wire!=slip-net;opts:=intr,rsize=8192,wsize=8192
-.fi
-
-Deprecated form: selectors_on_default
-
-.\" **************************************************************************
-.SS Parameters applicable to the global section only
-
-.TP
-.BR arch " (string, default to compiled in value)"
-Same as the
-.B \-A
-option to Amd. Allows you to override the value of the
-.I arch
-Amd variable.
-
-.TP
-.BR auto_attrcache " (numeric, default=0)"
-Specify in seconds (or units of 0.1 seconds, depending on the OS), what is
-the (kernel-side) NFS attribute cache timeout for @i{Amd}'s own automount
-points. A value of 0 is supposed to turn off attribute caching, meaning
-that @i{Amd} will be consulted via a kernel-RPC each time someone stat()'s
-the mount point (which could be abused as a denial-of-service attack).
-Warning: some OSs are incapable of turning off the NFS attribute cache
-reliably. On such systems, Amd may not work reliably under heavy load. See
-the README.attrcache document in the Am-utils distribution for more details.
-
-.TP
-.BR auto_dir " (string, default=/a)"
-Same as the
-.B \-a
-option to Amd. This sets the private directory where Amd will create
-sub-directories for its real mount points.
-
-.TP
-.BR cache_duration " (numeric, default=300)"
-Same as the
-.B \-c
-option to Amd. Sets the duration in seconds that looked-up or mounted map
-entries remain in the cache.
-
-.TP
-.BR cluster " (string, default no cluster)"
-Same as the
-.B \-C
-option to Amd. Specifies the alternate HP-UX cluster to use.
-
-.TP
-.BR debug_mtab_file " (string, default=/tmp/mnttab)"
-Path to mtab file that is used by Amd to store a list of mounted
-file systems during debug-mtab mode. This option only applies
-to systems that store mtab information on disk.
-.TP
-
-.TP
-.BR debug_options " (string, default no debug options)"
-Same as the
-.B \-D
-option to Amd. Specify any debugging options for Amd. Works only if
-am-utils was configured for debugging using the --enable-debug option. The
-"mem" option, as well as all other options, can be turned on via
---enable-debug=mem. Otherwise debugging options are ignored. Options are
-comma delimited, and can be preceded by the string "no" to negate their
-meaning. You can get the list of supported debugging options by running Amd
-\-H. Possible values are:
-
-.nf
-\fBall\fR all options
-\fBamq\fR register for amq
-\fBdaemon\fR enter daemon mode
-\fBfork\fR fork server
-\fBfull\fR program trace
-\fBhrtime\fR print high resolution time stamps (only if syslog(3) is not used)
-\fBinfo\fR info service specific debugging (hesiod, nis, etc.)
-\fBmem\fR trace memory allocations
-\fBmtab\fR use local "./mtab" file
-\fBreaddir\fR show browsable_dirs progress
-\fBstr\fR debug string munging
-\fBtest\fR full debug but no daemon
-\fBtrace\fR trace protocol and NFS mount arguments
-\fBxdrtrace\fR trace XDR routines
-.fi
-
-.TP
-.BR dismount_interval " (numeric, default=120)"
-Same as the
-.B \-w
-option to Amd. Specify in seconds, the time between attempts to dismount
-file systems that have exceeded their cached times.
-
-.TP
-.BR domain_strip " (boolean, default=yes)"
-If "yes," then the domain
-name part referred to by ${rhost} is stripped off. This is
-useful to keep logs and smaller. If "no," then the domain name
-part is left changed. This is useful when using multiple domains with
-the same maps (as you may have hosts whose domain-stripped name is
-identical).
-
-.TP
-.BR exec_map_timeout " (numeric, default=10)"
-The timeout in seconds that
-.I Amd
-will wait for an executable map program before an answer is returned from
-that program (or script). This value should be set to as small as possible
-while still allowing normal replies to be returned before the timer expires,
-because during the time that the executable map program is queried,
-.I Amd
-is essentially waiting and is thus not responding to any other queries.
-
-.TP
-.BR forced_unmounts " (boolean, default=no)"
-If set to "yes," and the client OS supports forced or lazy unmounts, then
-.I Amd
-will attempt to use them if it gets any of three serious error conditions
-when trying to unmount an existing mount point or mount on top of one: EIO,
-ESTALE, or EBUSY.
-
-This could be useful to recover from serious conditions such as hardware
-failure of mounted disks, or NFS servers which are down permanently, were
-migrated, or changed their IP address. Only "type:=toplvl" mounts hung with
-EBUSY are forcibly unmounted using this option, which is useful to recover
-from a hung
-.IR Amd ).
-
-.TP
-.BR full_os " (string, default to compiled in value)"
-The full name of the operating system, along with its version. Allows you
-to override the compiled-in full name and version of the operating system.
-Useful when the compiled-in name is not desired. For example, the full
-operating system name on linux comes up as ``linux'', but you can override
-it to ``linux-2.2.5.''
-
-.TP
-.BR fully_qualified_hosts " (string, default=no)"
-If "yes,"
-.I Amd
-will perform RPC authentication using fully-qualified host names. This is
-necessary for some systems, and especially when performing cross-domain
-mounting. For this function to work, the
-.I Amd
-variable ${hostd} is used, requiring that ${domain} not be null.
-
-.TP
-.BR hesiod_base " (string, default=automount)"
-Specify the base name for hesiod maps.
-
-.TP
-.BR karch " (string, default to karch of the system)"
-Same as the
-.B \-k
-option to Amd. Allows you to override the kernel-architecture of your
-system. Useful for example on Sun (Sparc) machines, where you can build one
-Amd binary, and run it on multiple machines, yet you want each one to get
-the correct
-.I karch
-variable set (for example, sun4c, sun4m, sun4u, etc.) Note that if not
-specified, Amd will use uname(3) to figure out the kernel architecture of
-the machine.
-
-.TP
-.BR ldap_base " (string, default not set)"
-Specify the base name for LDAP. This often includes LDAP-specific
-values such as country and organization.
-
-.TP
-.BR ldap_cache_maxmem " (numeric, default=131072)"
-Specify the maximum memory Amd should use to cache LDAP entries.
-
-.TP
-.BR ldap_cache_seconds " (numeric, default=0)"
-Specify the number of seconds to keep entries in the cache.
-
-.TP
-.BR ldap_hostports " (string, default not set)"
-Specify the LDAP host and port values.
-
-.TP
-.BR ldap_proto_version " (numeric, default=2)"
-Specify the version of the LDAP protocol to use.
-
-.TP
-.BR local_domain " (string, default no sub-domain)"
-Same as the
-.B \-d
-option to Amd. Specify the local domain name. If this option is not given
-the domain name is determined from the hostname, by removing the first
-component of the fully-qualified host name.
-
-.TP
-.BR localhost_address " (string, default to localhost or 127.0.0.1)"
-Specify the name or IP address for Amd to use when connecting the sockets
-for the local NFS server and the RPC server. This defaults to 127.0.0.1 or
-whatever the host reports as its local address. This parameter is useful on
-hosts with multiple addresses where you want to force Amd to connect to a
-specific address.
-
-.TP
-.BR log_file " (string, default=/dev/stderr)"
-Same as the
-.B \-l
-option to Amd. Specify a file name to log Amd events to.
-If the string
-.B /dev/stderr
-is specified, Amd will send its events to the standard error file descriptor.
-If the string
-.B syslog
-is given, Amd will record its events with the system logger
-.BR syslogd (8).
-The default syslog facility used is LOG_DAEMON. If you
-wish to change it, append its name to the log file name, delimited by a
-single colon. For example, if
-.I logfile
-is the string
-.B syslog:local7
-then Amd will log messages via
-.IR syslog (3)
-using the LOG_LOCAL7 facility (if it exists on the system).
-
-.TP
-.BR log_options " (string, default no logging options)"
-Same as the
-.B \-x
-option to Amd. Specify any logging options for Amd. Options are comma
-delimited, and can be preceded by the string "no" to negate their meaning.
-The "debug" logging option is only available if am-utils was configured with
---enable-debug. You can get the list of supported debugging and logging
-options by running
-.B amd
-.BR \-H .
-Possible values are:
-
-.nf
-\fBall\fR all messages
-\fBdebug\fR debug messages
-\fBerror\fR non-fatal system errors
-\fBfatal\fR fatal errors
-\fBinfo\fR information
-\fBmap\fR map errors
-\fBstats\fR additional statistical information
-\fBuser\fR non-fatal user errors
-\fBwarn\fR warnings
-\fBwarning\fR warnings
-.fi
-
-.TP
-.BR map_reload_interval " (numeric, default=3600)"
-The number of seconds that Amd will wait before it checks to see if any maps
-have changed at their source (NIS servers, LDAP servers, files, etc.). Amd
-will reload only those maps that have changed.
-
-.TP
-.BR nfs_allow_any_interface " (string, default=no)"
-Normally Amd accepts local NFS packets only from 127.0.0.1. If this
-parameter is set to "yes" then Amd will accept local NFS packets from any
-local interface; this is useful on hosts that may have multiple interfaces
-where the system is forced to send all outgoing packets (even those bound to
-the same host) via an address other than 127.0.0.1.
-
-.TP
-.BR nfs_allow_insecure_port " (string, default=no)"
-Normally Amd will refuse requests coming from unprivileged ports (i.e.
-ports >= 1024 on Unix systems), so that only privileged users and the kernel
-can send NFS requests to it. However, some kernels (certain versions of
-Darwin, MacOS X, and Linux) have bugs that cause them to use unprivileged
-ports in certain situations, which causes Amd to stop dead in its tracks.
-This parameter allows Amd to operate normally even on such systems, at the
-expense of a slight decrease in the security of its operations. If you see
-messages like "ignoring request from foo:1234, port not reserved" in your
-Amd log, try enabling this parameter and give it another go.
-
-.TP
-.BR nfs_proto " (string, default to trying version tcp then udp)"
-By default, Amd tries TCP and then UDP. This option forces the overall NFS
-protocol used to TCP or UDP. It overrides what is in the Amd maps, and is
-useful when Amd is compiled with NFSv3 support that may not be stable. With
-this option you can turn off the complete usage of NFSv3 dynamically
-(without having to recompile Amd) until such time as NFSv3 support is
-desired again.
-
-.TP
-.BR nfs_retransmit_counter " (numeric, default=11)"
-Same as the
-.I retransmit
-part of the
-.BI \-t " timeout.retransmit"
-option to Amd.
-Specifies the number of NFS retransmissions that the kernel will use to
-communicate with Amd.
-
-.TP
-.BR nfs_retransmit_counter_udp " (numeric, default=11)"
-Same as the
-.B nfs_retransmit_counter
-option, but for all UDP mounts only.
-
-.TP
-.BR nfs_retransmit_counter_tcp " (numeric, default=11)"
-Same as the
-.B nfs_retransmit_counter
-option, but for all TCP mounts only.
-
-.TP
-.BR nfs_retransmit_counter_toplvl " (numeric, default=11)"
-Same as the
-.B nfs_retransmit_counter
-option, but only for Amd's top-level UDP mounts.
-
-.TP
-.BR nfs_retry_interval " (numeric, default=8)"
-Same as the
-.I timeout
-part of the
-.BI \-t " timeout.retransmit"
-option to Amd. Specifies the NFS timeout interval, in
-.I tenths
-of seconds, between NFS/RPC retries (for UDP and TCP).
-This is the value that the kernel will use to
-communicate with Amd.
-
-Amd relies on the kernel RPC retransmit mechanism to trigger mount retries.
-The values of the
-.B nfs_retransmit_counter
-and the
-.B nfs_retry_interval
-parameters change the overall retry interval. Too long an interval gives
-poor interactive response; too short an interval causes excessive retries.
-
-.TP
-.BR nfs_retry_interval_udp " (numeric, default=8)"
-Same as the
-.B nfs_retry_interval
-option, but for all UDP mounts only.
-
-.TP
-.BR nfs_retry_interval_tcp " (numeric, default=8)"
-Same as the
-.B nfs_retry_interval
-option, but for all TCP mounts only.
-
-.TP
-.BR nfs_retry_interval_toplvl " (numeric, default=8)"
-Same as the
-.B nfs_retry_interval
-option, but only for Amd's top-level UDP mounts.
-
-.TP
-.BR nfs_vers " (numeric, default to trying version 3 then 2)"
-By default, Amd tries version 3 and then version 2. This option forces the
-overall NFS protocol used to version 3 or 2. It overrides what is in the
-Amd maps, and is useful when Amd is compiled with NFSv3 support that may not
-be stable. With this option you can turn off the complete usage of NFSv3
-dynamically (without having to recompile Amd) until such time as NFSv3
-support is desired again.
-
-.TP
-.BR nis_domain " (string, default to local NIS domain name)"
-Same as the
-.B \-y
-option to Amd. Specify an alternative NIS domain from which to fetch the
-NIS maps. The default is the system domain name. This option is ignored if
-NIS support is not available.
-
-.TP
-.BR normalize_hostnames " (boolean, default=no)"
-Same as the
-.B \-n
-option to Amd. If "yes," then the name refereed to by ${rhost} is
-normalized relative to the host database before being used. The effect is
-to translate aliases into ``official'' names.
-
-.TP
-.BR normalize_slashes " (boolean, default=yes)"
-
-If "yes," then Amd will condense all multiple ``/'' (slash) characters into
-one and remove all trailing slashes. If "no," then Amd will not touch
-strings that may contain repeated or trailing slashes. The latter is
-sometimes useful with SMB mounts, which often require multiple slash
-characters in pathnames.
-
-.TP
-.BR os " (string, default to compiled in value)"
-Same as the
-.B \-O
-option to Amd. Allows you to override the compiled-in name of the operating
-system. Useful when the built-in name is not desired for backward
-compatibility reasons. For example, if the build in name is ``sunos5'', you
-can override it to ``sos5'', and use older maps which were written with the
-latter in mind.
-
-.TP
-.BR osver " (string, default to compiled in value)"
-Same as the
-.B \-o
-option to Amd. Overrides the compiled-in version number of the operating
-system. Useful when the built in version is not desired for backward
-compatibility reasons. For example, if the build in version is ``2.5.1'',
-you can override it to ``5.5.1'', and use older maps that were written with
-the latter in mind.
-
-.TP
-.BR pid_file " (string, default=/dev/stdout)"
-Specify a file to store the process ID of the running daemon into. If not
-specified, Amd will print its process id onto the standard output. Useful
-for killing Amd after it had run. Note that the PID of a running Amd can
-also be retrieved via
-.B amq
-.BR \-p .
-This file is used only if the print_pid option is on.
-
-.TP
-.BR plock " (boolean, default=yes)"
-Same as the
-.B \-S
-option to Amd.
-If "yes," lock the running executable pages of Amd into memory. To improve
-Amd's performance, systems that support the
-.BR plock (3)
-or
-.BR mlockall (2)
-call can lock the Amd process into memory. This way there is less chance it
-the operating system will schedule, page out, and swap the Amd process as
-needed. This improves Amd's performance, at the cost of reserving the
-memory used by the Amd process (making it unavailable for other processes).
-
-.TP
-.BR portmap_program " (numeric, default=300019)"
-Specify an alternate Port-mapper RPC program number, other than the official
-number. This is useful when running multiple Amd processes. For example,
-you can run another Amd in "test" mode, without affecting the primary Amd
-process in any way. For safety reasons, the alternate program numbers that
-can be specified must be in the range 300019-300029, inclusive.
-Amq
-has an option
-.B -P
-which can be used to specify an alternate program number of an Amd to
-contact. In this way, amq can fully control any number of Amd processes
-running on the same host.
-
-.TP
-.BR preferred_amq_port " (numeric, default=0)"
-Specify an alternate Port-mapper RPC port number for Amd's
-Amq
-service. This is used for both UDP and TCP. Setting this value to 0 (or
-not defining it) will cause
-Amd
-to select an arbitrary port number. Setting the
-Amq
-RPC service port to a specific number is useful in firewalled or NAT'ed
-environments, where you need to know which port
-Amd
-will listen on.
-
-.TP
-.BR print_pid " (boolean, default=no)"
-Same as the
-.B \-p
-option to Amd. If "yes," Amd will print its process ID upon starting.
-
-.TP
-.BR print_version " (boolean, default=no)"
-Same as the
-.B \-v
-option to Amd, but the version prints and Amd continues to run. If "yes,"
-Amd will print its version information string, which includes some
-configuration and compilation values.
-
-.TP
-.BR restart_mounts " (boolean, default=no)"
-Same as the
-.B \-r
-option to Amd. If "yes"
-Amd
-will scan the mount table to determine which file systems are currently
-mounted. Whenever one of these would have been auto-mounted,
-Amd
-inherits it.
-
-.TP
-.BR show_statfs_entries " (boolean), default=no)"
-If "yes," then all maps which are browsable will also show the number of
-entries (keys) they have when "df" runs. (This is accomplished by returning
-non-zero values to the statfs(2) system call).
-
-.TP
-.BR truncate_log " (boolean), default=no)"
-If "yes," then the log file (if it is a regular file), will be truncated
-upon startup.
-
-.TP
-.BR unmount_on_exit " (boolean), default=no)"
-If "yes," then Amd will attempt to unmount all file systems which it knows
-about. Normally Amd leaves all (esp. NFS) mounted file systems intact.
-Note that Amd does not know about file systems mounted before it starts up,
-unless the restart_mounts option or
-.B \-r
-flag are used.
-
-.TP
-.BR use_tcpwrappers " (boolean), default=yes)"
-If "yes," then Amd will use the tcpd/librwap tcpwrappers library
-(if available) to control
-access to Amd via the /etc/hosts.allow and /etc/hosts.deny files.
-
-.TP
-.BR vendor " (string, default to compiled in value)"
-The name of the vendor of the operating system. Overrides the compiled-in
-vendor name. Useful when the compiled-in name is not desired. For example,
-most Intel based systems set the vendor name to ``unknown'', but you can set
-it to ``redhat.''
-
-.\" **************************************************************************
-.SS Parameters applicable to regular map sections
-
-.TP
-.BR map_name " (string, must be specified)"
-Name of the map where the keys are located.
-
-.TP
-.BR tag " (string, default no tag)"
-Each map entry in the configuration file can be tagged. If no tag is
-specified, that map section will always be processed by Amd. If it is
-specified, then Amd will process the map if the
-.B -T
-option was given to Amd, and the value given to that command-line option
-matches that in the map section.
-
-.\" **************************************************************************
-.SH EXAMPLES
-Here is a real Amd configuration file I use daily.
-.P
-.nf
-# GLOBAL OPTIONS SECTION
-[ global ]
-normalize_hostnames = no
-print_pid = no
-restart_mounts = yes
-auto_dir = /n
-log_file = /var/log/amd
-log_options = all
-#debug_options = all
-plock = no
-selectors_in_defaults = yes
-# config.guess picks up "sunos5" and I don't want to edit my maps yet
-os = sos5
-# if you print_version after setting up "os," it will show it.
-print_version = no
-map_type = file
-search_path = /etc/amdmaps:/usr/lib/amd:/usr/local/AMD/lib
-browsable_dirs = yes
-
-# DEFINE AN AMD MOUNT POINT
-[ /u ]
-map_name = amd.u
-
-[ /proj ]
-map_name = amd.proj
-
-[ /src ]
-map_name = amd.src
-
-[ /misc ]
-map_name = amd.misc
-
-[ /import ]
-map_name = amd.import
-
-[ /tftpboot/.amd ]
-tag = tftpboot
-map_name = amd.tftpboot
-.fi
-.\" **************************************************************************
-.SH "SEE ALSO"
-.BR amd (8),
-.BR amq (8),
-.BR ctl-amd (8),
-.BR hosts_access (5).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH AUTHORS
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/scripts/amd2ldif.in b/contrib/amd/scripts/amd2ldif.in
deleted file mode 100755
index 34cee97cc1c2..000000000000
--- a/contrib/amd/scripts/amd2ldif.in
+++ /dev/null
@@ -1,60 +0,0 @@
-#!@PERL@
-
-$usage=<<EOU;
-Usage $0 mapname base < mapfile >mapfile.ldif
-
-mapname: name of the amd map beeing converted to ldif
-base : The LDAP search base. Do not forget the quotes!
-
-This script should/could be used in a Makefile together
-with ldif2ldbm(8C) to automagically update the ldap
-databases and restart slapd whenever a master copy of
-the maps have changed. Remember "cd /var/yp; make" ?
-EOU
-
-my $fmt = "%-12s: %s\n";
-my $tfmt = "%-15s: %s\n";
-my $mapname = $ARGV[0] or die $usage;
-my $base = $ARGV[1] or die $usage;
-$time = time();
-
-print "dn: cn=amdmap $mapname timestamp, $base\n";
-printf "$tfmt", "cn", "amdmap $mapname timestamp";
-printf "$tfmt", "objectClass", "amdmapTimestamp";
-printf "$tfmt", "amdmapName", "$mapname";
-printf "$tfmt", "amdmapTimestamp", $time;
-printf "$tfmt", "amdmapName", $mapname;
-print "\n";
-
-my $line = "";
-my $done = 0;
-
-while (<STDIN>) {
- chomp;
- if (/\s*(.+)\\\s*/) {
- if ($line) {
- $line .= " ".$1;
- } else {
- $line = $1;
- }
- $done = 0;
- } else {
- s/^\s+//g;
- $line .= $_;
- $done = 1;
- }
- if ($done) {
- my @vals = split(/\s+/,$line);
- my $key = shift @vals;
- my $entry;
-
- print "dn: cn=amdmap $mapname\[$key\], $base\n";
- printf "$fmt","cn","amdmap $mapname\[$key\]";
- printf "$fmt","objectClass", "amdmap";
- printf "$fmt","amdmapName", $mapname;
- printf "$fmt","amdmapKey", $key;
- printf "$fmt","amdmapValue", join(' ',@vals);
- print "\n";
- $line = ""; $done = 0;
- }
-}
diff --git a/contrib/amd/scripts/amd2sun.in b/contrib/amd/scripts/amd2sun.in
deleted file mode 100755
index 7616c83b915c..000000000000
--- a/contrib/amd/scripts/amd2sun.in
+++ /dev/null
@@ -1,51 +0,0 @@
-#!@PERL@
-# convert amd maps to Sun automount maps
-# usage: amd2sun file
-#
-# Package: am-utils-6.x
-# Author: "Mark D. Baushke" <mdb@cisco.com>
-
-print "# file created by amd2sun
-#
-# DO NOT EDIT THIS FILE AT ALL
-# It is automatically generated from the amd mount map - edit that instead
-#
-";
-while (<>) {
- print, next if /^#/;
- chop;
- $line = $_;
- while ($line =~ /\\$/) {
- chop $line;
- $line2 = <>;
- $line2 =~ s/^\s*//;
- $line .= $line2;
- chop $line;
- }
-
- next unless $line =~ /^([^\s]+)\s+(.*)$/;
-
- $fs = $1; $rest=$2;
-
- if ($fs =~ /^\/defaults/) {
- ($defopts = $rest) =~ s/^.*[\s;]opts:=([^;\s]+)[;\s]*.*$/\1/;
- next;
- }
-
- $opts=$defopts;
-
- if ($rest =~ /opts:=([^;\s]+)[;\s]/) {
- $opts = $1;
- }
-
- $opts =~ s/,ping=[-\d]+//g;
-
- ($rhost = $rest) =~ s/^.*[\s;]rhost:=([^;\s]+)[;\s]*.*$/\1/;
- ($rfs = $rest) =~ s/^.*[\s;]rfs:=([^;\s]+)[;\s]*.*$/\1/;
-
- if ($rest =~ /sublink:=([^;\s]+)[;\s]/ ) {
- $rfs .= "/$1";
- }
-
- print "$fs -$opts $rhost:$rfs\n";
-}
diff --git a/contrib/amd/scripts/automount2amd.8 b/contrib/amd/scripts/automount2amd.8
deleted file mode 100644
index bd3b61230ab6..000000000000
--- a/contrib/amd/scripts/automount2amd.8
+++ /dev/null
@@ -1,121 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1990 Jan-Simon Pendry
-.\" Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: automount2amd.8,v 1.8.2.1 2006/01/02 18:48:26 ezk Exp $
-.\"
-.TH AUTOMOUNT2AMD 8L "24 May 1993"
-.SH NAME
-automount2amd \- converts old Sun automount maps to Amd maps
-.SH SYNOPSIS
-.B automount2amd
-.I auto.map
-.SH DESCRIPTION
-.LP
-.B automount2amd
-is used to convert an old Sun automount maps named
-.I auto.map
-to an Amd map.
-
-This perl script will use the following /default entry
-.nf
- type:=nfs;opts:=rw,grpid,nosuid,utimeout=600
-.fi
-If you wish to override that, define the
-.B $DEFAULTS
-environment variable, or modify the script.
-
-If you wish to generate Amd maps using the
-.I hostd
-(host domain) Amd map syntax, then define the environment variable
-.B $DOMAIN
-or modify the script.
-
-.SH EXAMPLE
-Say you have the Sun automount file auto.foo, with these two lines:
-.nf
- home earth:/home
- moon -ro,intr server:/proj/images
-.fi
-Running
-.nf
- automount2amd auto.foo > amd.foo
-.fi
-will produce the Amd map
-.I amd.foo
-with this content:
-.nf
-# generated by automount2amd on Sat Aug 14 17:59:32 US/Eastern 1999
-
-/defaults \\
- type:=nfs;opts:=rw,grpid,nosuid,utimeout=600
-
-home \
- host==earth;type:=link;fs:=/home \\
- rhost:=earth;rfs:=/home
-
-moon \
- -addopts:=ro,intr \\
- host==server;type:=link;fs:=/proj/images \\
- rhost:=server;rfs:=/proj/images
-.fi
-.SH BUGS
-.I automount2amd
-does not understand newer Sun Automount map syntax, those used by autofs.
-.SH "SEE ALSO"
-.BR conv2amd (8), amd (8).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH AUTHORS
-Original author Mike Walker <mike@tab00.larc.nasa.gov>.
-Script modified by Erez Zadok <ezk@cs.sunysb.edu>, Computer Science
-Department, Stony Brook University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/scripts/automount2amd.in b/contrib/amd/scripts/automount2amd.in
deleted file mode 100755
index 79a7b770d556..000000000000
--- a/contrib/amd/scripts/automount2amd.in
+++ /dev/null
@@ -1,72 +0,0 @@
-#!@PERL@ -w
-#
-# Convert Sun automount map format to amd format
-#
-# Package: am-utils-6.x
-# Author: Mike Walker <mike@tab00.larc.nasa.gov>
-# Erez Zadok <ezk@cs.columbia.edu>
-#
-# This program expects maps with the format
-#
-# dir [ -options ] machine:/path [ # optional comment ]
-# ...
-#
-# and generates an equivalent amd map as follows:
-#
-# # generated by automountamd on Fri May 21 9:16:56 1993
-#
-# /defaults \
-# type:=nfs;opts:=rw,grpid,nosuid,utimeout=600
-#
-# dir \
-# hostd==machine.larc.nasa.gov;type:=link;fs:=/path || \
-# domain==larc.nasa.gov;rhost:=machine;rfs:=/path || \
-# rhost:=machine.larc.nasa.gov;rfs:=/path
-# ...
-#
-# You should set the DOMAIN and DEFAULT variables to your preferences.
-#
-# $Id: automount2amd.in,v 1.2 2002/01/15 18:25:25 ezk Exp $
-#
-
-require "ctime.pl";
-
-# amd domain name (doesn't have to be the DNS domain; isn't overloading great!)
-# Should be what you will pass to amd via the -d command-line switch, if any.
-$DOMAIN='';
-
-# amd default settings; consult the docs for what you can/should do here.
-# Note, in particular, that if your disk mount points follow a common scheme
-# you can specify ``rfs:=/common/path/${key}'' and not have to insert that
-# line (twice) in every entry below!
-$DEFAULTS='type:=nfs;opts:=rw,grpid,nosuid,utimeout=600';
-
-
-# print comment header and default string
-printf "# generated by automount2amd on %s\n", &ctime(time);
-printf "/defaults \\\n %s\n\n", $DEFAULTS;
-
-# loop through map
-while (<>) {
- if (m,^(\w\S*)(\s+\-\w\S*\s+|\s+)(\w[^:]*):(\/\S*)\s*(.*),) {
- ($dir, $options, $machine, $path, $rest) = ($1, $2, $3, $4, $5);
- print "#$rest\n" if ($rest =~ m/\w/);
- print "$dir \\\n";
- if ($options =~ m/-/) {
- $options =~ s/\s//g;
- $options =~ s/^-//g;
- printf( " -addopts:=$options \\\n");
- }
- if (defined($DOMAIN) && $DOMAIN ne "") {
- printf(" hostd==%s.%s;type:=link;fs:=%s || \\\n",
- $machine, $DOMAIN, $path);
- printf(" domain==%s;rhost:=%s;rfs:=%s || \\\n",
- $DOMAIN, $machine, $path);
- printf " rhost:=%s.%s;rfs:=%s\n\n", $machine, $DOMAIN, $path;
- } else {
- printf(" host==%s;type:=link;fs:=%s \\\n",
- $machine, $path);
- printf " rhost:=%s;rfs:=%s\n\n", $machine, $path;
- }
- }
-}
diff --git a/contrib/amd/scripts/ctl-amd.in b/contrib/amd/scripts/ctl-amd.in
deleted file mode 100755
index 694b31a9764c..000000000000
--- a/contrib/amd/scripts/ctl-amd.in
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/bin/sh
-# control starting, stopping, or restarting amd.
-# usage: ctl-amd [start|stop|status|restart|condrestart|reload]
-#
-# Package: am-utils-6.x
-# Author: Erez Zadok <ezk@cs.columbia.edu>
-#
-# chkconfig: - 72 28
-# description: Runs the automount daemon that mounts devices and NFS hosts \
-# on demand.
-# processname: amd
-# config: /etc/amd.conf
-#
-
-# set path
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-PATH=@sbindir@:@bindir@:/usr/ucb:/usr/bin:/bin:${PATH}
-export PATH
-
-# kill the named process(es)
-killproc()
-{
-# first try to get PID via an amq RPC
-pid=`amq -p 2>/dev/null`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# try bsd style ps
-pscmd="ps axc"
-pid=`${pscmd} 2>/dev/null | grep "$1" | sed -e 's/^ *//' -e 's/ .*//'`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# try bsd44 style ps
-pscmd="ps -x"
-pid=`${pscmd} 2>/dev/null | grep "$1" | sed -e 's/^ *//' -e 's/ .*//'`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# try svr4 style ps
-pscmd="ps -e"
-pid=`${pscmd} 2>/dev/null | grep "$1" | sed -e 's/^ *//' -e 's/ .*//'`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# failed
-return 1
-}
-
-# before running any real programs, chdir to / to avoid possible hangs on
-# (NFS) mounts which may be restarting.
-cd /
-
-# search for amd.conf file
-CF_FILE="@sysconfdir@/amd.conf"
-# any local copy of the conf file overrides the "global" one
-if [ -f /etc/amd.conf ]
-then
- CF_FILE="/etc/amd.conf"
-fi
-if [ -f @sysconfdir@/amd.conf ]
-then
- CF_FILE="@sysconfdir@/amd.conf"
-fi
-if [ -f /etc/local/amd.conf ]
-then
- CF_FILE="/etc/local/amd.conf"
-fi
-
-# if have the directory /tftpboot/.amd, then add a tag to include it
-CF_TAG=""
-if [ -d /tftpboot/.amd ]
-then
- CF_TAG="-T tftpboot"
-fi
-
-case "$1" in
-'start')
- # Start the amd automounter.
- if [ -x @sbindir@/amd ]
- then
- # do not specify full path of amd so killproc() works
- amd -F $CF_FILE $CF_TAG
- test -x /var/lock/subsys && touch /var/lock/subsys/amd
- fi
- ;;
-
-'stop')
- # prepend space to program name to ensure only amd process dies
- echo "killing amd..."
- killproc " amd"
- wait4amd2die
- rm -f /var/lock/subsys/amd
- ;;
-
-'restart')
- # kill amd, wait for it to die, then restart
- ctl-amd stop
- if [ $? != 0 ]
- then
- echo "NOT restarting amd!"
- else
- echo "Restarting amd..."
- sleep 1
- ctl-amd start
- fi
- ;;
-
-'condrestart')
- if [ -f /var/lock/subsys/amd ]; then
- ctl-amd stop
- ctl-amd start
- fi
- ;;
-
-'reload')
- amq -f
- ;;
-
-'status')
- # run amq -v to produce status
- pid=`amq -p 2>/dev/null`
- if [ $? = 0 ]
- then
- echo "amd (pid $pid) is running..."
- else
- echo "amd is stopped"
- fi
- ;;
-
-# start_msg and stop_msg are for HPUX
-'start_msg')
- echo "Start am-utils 6.1 automounter"
- ;;
-'stop_msg')
- echo "Stop am-utils 6.1 automounter"
- ;;
-
-*)
- echo "Usage: $0 [start|stop|status|restart|condrestart|reload]"
- ;;
-esac
diff --git a/contrib/amd/scripts/ctl-hlfsd.in b/contrib/amd/scripts/ctl-hlfsd.in
deleted file mode 100755
index ee0dd27ca15a..000000000000
--- a/contrib/amd/scripts/ctl-hlfsd.in
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/bin/sh
-# control starting, stopping, or restarting hlfsd.
-# usage: ctl-hlfsd [start | stop | restart]
-#
-# Package: am-utils-6.x
-# Author: Erez Zadok <ezk@cs.columbia.edu>
-#
-# chkconfig: - 72 28
-# description: hlfsd is a daemon similar to amd, used to redirect user
-# mail to home directory of the user
-# processname: hlfsd
-#
-
-# set path
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-PATH=@sbindir@:@bindir@:/usr/ucb:/usr/bin:/bin:${PATH}
-export PATH
-
-# kill the named process(es)
-killproc()
-{
-# try bsd style ps
-pscmd="ps axc"
-pid=`${pscmd} 2>/dev/null | grep "$1" | sed -e 's/^ *//' -e 's/ .*//'`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# try bsd44 style ps
-pscmd="ps -x"
-pid=`${pscmd} 2>/dev/null | grep "$1" | sed -e 's/^ *//' -e 's/ .*//'`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# try svr4 style ps
-pscmd="ps -e"
-pid=`${pscmd} 2>/dev/null | grep "$1" | sed -e 's/^ *//' -e 's/ .*//'`
-if test "$pid" != ""
-then
- kill $pid
- return 0
-fi
-
-# failed
-return 1
-}
-
-# before running any real programs, chdir to / to avoid possible hangs on (NFS)
-# mounts.
-cd /
-
-# locate logs directory
-if [ -d /var/log ]; then
- logdir="/var/log"
-else
- logdir="/tmp"
-fi
-
-# locate the mail spool directory
-if [ -d /var/mail/. ]; then
- maildir="/var/mail"
- altmaildir="/var/alt_mail"
-elif [ -d /var/spool/mail/. ]; then
- maildir="/var/spool/mail"
- altmaildir="/var/spool/alt_mail"
-else
- maildir="/usr/spool/mail"
- altmaildir="/usr/spool/alt_mail"
-fi
-
-# locate any optional password file
-if [ -f @sysconfdir@/passwd ]; then
- PASSWD_FILE="-P @sysconfdir@/passwd"
-else
- PASSWD_FILE=""
-fi
-
-case "$1" in
-'start')
- #
- # Start the hlfsd mail redirector service
- #
- if [ -x @sbindir@/hlfsd -a -h $maildir ]
- then
- echo @sbindir@/hlfsd ${PASSWD_FILE} -a $altmaildir -x all -l $logdir/hlfsd /mail/home .mailspool
- @sbindir@/hlfsd ${PASSWD_FILE} -a $altmaildir -x all -l $logdir/hlfsd /mail/home .mailspool &
- test -x /var/lock/subsys && touch /var/lock/subsys/hlfsd
- fi
- ;;
-
-'stop')
- # prepend space to program name to ensure only amd process dies
- killproc " hlfsd"
- test -f /var/lock/subsys/hlfsd && rm -f /var/lock/subsys/hlfsd
- ;;
-
-'restart')
- # kill hlfsd, wait for it to die, then restart
- echo "killing hlfsd..."
- ctl-hlfsd stop
- echo "Waiting for 10 seconds..."
- sleep 10 # hope that would be enough
- echo "Restarting hlfsd..."
- ctl-hlfsd start
- ;;
-
-*)
- echo "Usage: @sbindir@/ctl-hlfsd [ start | stop | restart ]"
- ;;
-esac
diff --git a/contrib/amd/scripts/expn.1 b/contrib/amd/scripts/expn.1
deleted file mode 100644
index f316247b4a9c..000000000000
--- a/contrib/amd/scripts/expn.1
+++ /dev/null
@@ -1,1369 +0,0 @@
-#!@PERL@
-'di ';
-'ds 00 \\"';
-'ig 00 ';
-#
-# THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin.
-#
-
-# hardcoded constants, should work fine for BSD-based systems
-#require 'sys/socket.ph'; # perl 4
-use Socket; # perl 5
-$AF_INET = &AF_INET;
-$SOCK_STREAM = &SOCK_STREAM;
-$sockaddr = 'S n a4 x8';
-
-# system requirements:
-# must have 'nslookup' and 'hostname' programs.
-
-# $Header: /home/cvsroot/am-utils/scripts/expn.1,v 1.4 2003/07/18 15:17:37 ezk Exp $
-
-# TODO:
-# less magic should apply to command-line addresses
-# less magic should apply to local addresses
-# add magic to deal with cross-domain cnames
-
-# Checklist: (hard addresses)
-# 250 Kimmo Suominen <"|/usr/local/mh/lib/slocal -user kim"@grendel.tac.nyc.ny.us>
-# harry@hofmann.cs.Berkeley.EDU -> harry@tenet (.berkeley.edu) [dead]
-# bks@cs.berkeley.edu -> shiva.CS (.berkeley.edu) [dead]
-# dan@tc.cornell.edu -> brown@tiberius (.tc.cornell.edu)
-
-#############################################################################
-#
-# Copyright (c) 1993 David Muir Sharnoff
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgment:
-# This product includes software developed by the David Muir Sharnoff.
-# 4. The name of David Sharnoff may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE DAVID MUIR SHARNOFF ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL DAVID MUIR SHARNOFF BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# This copyright notice derived from material copyrighted by the Regents
-# of the University of California.
-#
-# Contributions accepted.
-#
-#############################################################################
-
-# overall structure:
-# in an effort to not trace each address individually, but rather
-# ask each server in turn a whole bunch of questions, addresses to
-# be expanded are queued up.
-#
-# This means that all accounting w.r.t. an address must be stored in
-# various arrays. Generally these arrays are indexed by the
-# string "$addr *** $server" where $addr is the address to be
-# expanded "foo" or maybe "foo@bar" and $server is the hostname
-# of the SMTP server to contact.
-#
-
-# important global variables:
-#
-# @hosts : list of servers still to be contacted
-# $server : name of the current we are currently looking at
-# @users = $users{@hosts[0]} : addresses to expand at this server
-# $u = $users[0] : the current address being expanded
-# $names{"$users[0] *** $server"} : the 'name' associated with the address
-# $mxbacktrace{"$users[0] *** $server"} : record of mx expansion
-# $mx_secondary{$server} : other mx relays at the same priority
-# $domainify_fallback{"$users[0] *** $server"} : alternative names to try
-# instead of $server if $server doesn't work
-# $temporary_redirect{"$users[0] *** $server"} : when trying alternates,
-# temporarily channel all tries along current path
-# $giveup{$server} : do not bother expanding addresses at $server
-# $verbose : -v
-# $watch : -w
-# $vw : -v or -w
-# $debug : -d
-# $valid : -a
-# $levels : -1
-# S : the socket connection to $server
-
-$have_nslookup = 1; # we have the nslookup program
-$port = 'smtp';
-$av0 = $0;
-$ENV{'PATH'} .= ":/usr/etc" unless $ENV{'PATH'} =~ m,/usr/etc,;
-$ENV{'PATH'} .= ":/usr/ucb" unless $ENV{'PATH'} =~ m,/usr/ucb,;
-select(STDERR);
-
-$0 = "$av0 - running hostname";
-chop($name = `hostname || uname -n`);
-
-$0 = "$av0 - lookup host FQDN and IP addr";
-($hostname,$aliases,$type,$len,$thisaddr) = gethostbyname($name);
-
-$0 = "$av0 - parsing args";
-$usage = "Usage: $av0 [-1avwd] user[\@host] [user2[host2] ...]";
-for $a (@ARGV) {
- die $usage if $a eq "-";
- while ($a =~ s/^(-.*)([1avwd])/$1/) {
- eval '$'."flag_$2 += 1";
- }
- next if $a eq "-";
- die $usage if $a =~ /^-/;
- &expn(&parse($a,$hostname,undef,1));
-}
-$verbose = $flag_v;
-$watch = $flag_w;
-$vw = $flag_v + $flag_w;
-$debug = $flag_d;
-$valid = $flag_a;
-$levels = $flag_1;
-
-die $usage unless @hosts;
-if ($valid) {
- if ($valid == 1) {
- $validRequirement = 0.8;
- } elsif ($valid == 2) {
- $validRequirement = 1.0;
- } elsif ($valid == 3) {
- $validRequirement = 0.9;
- } else {
- $validRequirement = (1 - (1/($valid-3)));
- print "validRequirement = $validRequirement\n" if $debug;
- }
-}
-
-$0 = "$av0 - building local socket";
-($name,$aliases,$proto) = getprotobyname('tcp');
-($name,$aliases,$port) = getservbyname($port,'tcp')
- unless $port =~ /^\d+/;
-$this = pack($sockaddr, &AF_INET, 0, $thisaddr);
-
-HOST:
-while (@hosts) {
- $server = shift(@hosts);
- @users = split(' ',$users{$server});
- delete $users{$server};
-
- # is this server already known to be bad?
- $0 = "$av0 - looking up $server";
- if ($giveup{$server}) {
- &giveup('mx domainify',$giveup{$server});
- next;
- }
-
- # do we already have an mx record for this host?
- next HOST if &mxredirect($server,*users);
-
- # look it up, or try for an mx.
- $0 = "$av0 - gethostbyname($server)";
-
- ($name,$aliases,$type,$len,$thataddr) = gethostbyname($server);
- # if we can't get an A record, try for an MX record.
- unless($thataddr) {
- &mxlookup(1,$server,"$server: could not resolve name",*users);
- next HOST;
- }
-
- # get a connection, or look for an mx
- $0 = "$av0 - socket to $server";
- $that = pack($sockaddr, &AF_INET, $port, $thataddr);
- socket(S, &AF_INET, &SOCK_STREAM, $proto)
- || die "socket: $!";
- $0 = "$av0 - bind to $server";
- bind(S, $this)
- || die "bind $hostname,0: $!";
- $0 = "$av0 - connect to $server";
- print "debug = $debug server = $server\n" if $debug > 8;
- if (! connect(S, $that) || ($debug == 10 && $server =~ /relay\d.UU.NET$/i)) {
- $0 = "$av0 - $server: could not connect: $!\n";
- $emsg = $!;
- unless (&mxlookup(0,$server,"$server: could not connect: $!",*users)) {
- &giveup('mx',"$server: Could not connect: $emsg");
- }
- next HOST;
- }
- select((select(S),$| = 1)[0]); # don't buffer output to S
-
- # read the greeting
- $0 = "$av0 - talking to $server";
- &alarm("greeting with $server",'');
- while(<S>) {
- alarm(0);
- print if $watch;
- if (/^(\d+)([- ])/) {
- if ($1 != 220) {
- $0 = "$av0 - bad numeric response from $server";
- &alarm("giving up after bad response from $server",'');
- &read_response($2,$watch);
- alarm(0);
- print STDERR "$server: NOT 220 greeting: $_"
- if ($debug || $vw);
- if (&mxlookup(0,$server,"$server: did not respond with a 220 greeting",*users)) {
- close(S);
- next HOST;
- }
- }
- last if ($2 eq " ");
- } else {
- $0 = "$av0 - bad response from $server";
- print STDERR "$server: NOT 220 greeting: $_"
- if ($debug || $vw);
- unless (&mxlookup(0,$server,"$server: did not respond with SMTP codes",*users)) {
- &giveup('',"$server: did not talk SMTP");
- }
- close(S);
- next HOST;
- }
- &alarm("greeting with $server",'');
- }
- alarm(0);
-
- # if this causes problems, remove it
- $0 = "$av0 - sending helo to $server";
- &alarm("sending helo to $server","");
- &ps("helo $hostname");
- while(<S>) {
- print if $watch;
- last if /^\d+ /;
- }
- alarm(0);
-
- # try the users, one by one
- USER:
- while(@users) {
- $u = shift(@users);
- $0 = "$av0 - expanding $u [\@$server]";
-
- # do we already have a name for this user?
- $oldname = $names{"$u *** $server"};
-
- print &compact($u,$server)." ->\n" if ($verbose && ! $valid);
- if ($valid) {
- #
- # when running with -a, we delay taking any action
- # on the results of our query until we have looked
- # at the complete output. @toFinal stores expansions
- # that will be final if we take them. @toExpn stores
- # expansions that are not final. @isValid keeps
- # track of our ability to send mail to each of the
- # expansions.
- #
- @isValid = ();
- @toFinal = ();
- @toExpn = ();
- }
-
-# ($ecode,@expansion) = &expn_vrfy($u,$server);
- (@foo) = &expn_vrfy($u,$server);
- ($ecode,@expansion) = @foo;
- if ($ecode) {
- &giveup('',$ecode,$u);
- last USER;
- }
-
- for $s (@expansion) {
- $s =~ s/[\n\r]//g;
- $0 = "$av0 - parsing $server: $s";
-
- $skipwatch = $watch;
-
- if ($s =~ /^[25]51([- ]).*<(.+)>/) {
- print "$s" if $watch;
- print "(pretending 250$1<$2>)" if ($debug && $watch);
- print "\n" if $watch;
- $s = "250$1<$2>";
- $skipwatch = 0;
- }
-
- if ($s =~ /^250([- ])(.+)/) {
- print "$s\n" if $skipwatch;
- ($done,$addr) = ($1,$2);
- ($newhost, $newaddr, $newname) = &parse($addr,$server,$oldname, $#expansion == 0);
- print "($newhost, $newaddr, $newname) = &parse($addr, $server, $oldname)\n" if $debug;
- if (! $newhost) {
- # no expansion is possible w/o a new server to call
- if ($valid) {
- push(@isValid, &validAddr($newaddr));
- push(@toFinal,$newaddr,$server,$newname);
- } else {
- &verbose(&final($newaddr,$server,$newname));
- }
- } else {
- $newmxhost = &mx($newhost,$newaddr);
- print "$newmxhost = &mx($newhost)\n"
- if ($debug && $newhost ne $newmxhost);
- $0 = "$av0 - parsing $newaddr [@$newmxhost]";
- print "levels = $levels, level{$u *** $server} = ".$level{"$u *** $server"}."\n" if ($debug > 1);
- # If the new server is the current one,
- # it would have expanded things for us
- # if it could have. Mx records must be
- # followed to compare server names.
- # We are also done if the recursion
- # count has been exceeded.
- if (&trhost($newmxhost) eq &trhost($server) || ($levels && $level{"$u *** $server"} >= $levels)) {
- if ($valid) {
- push(@isValid, &validAddr($newaddr));
- push(@toFinal,$newaddr,$newmxhost,$newname);
- } else {
- &verbose(&final($newaddr,$newmxhost,$newname));
- }
- } else {
- # more work to do...
- if ($valid) {
- push(@isValid, &validAddr($newaddr));
- push(@toExpn,$newmxhost,$newaddr,$newname,$level{"$u *** $server"});
- } else {
- &verbose(&expn($newmxhost,$newaddr,$newname,$level{"$u *** $server"}));
- }
- }
- }
- last if ($done eq " ");
- next;
- }
- # 550 is a known code... Should the be
- # included in -a output? Might be a bug
- # here. Does it matter? Can assume that
- # there won't be UNKNOWN USER responses
- # mixed with valid users?
- if ($s =~ /^(550)([- ])/) {
- if ($valid) {
- print STDERR "\@$server:$u ($oldname) USER UNKNOWN\n";
- } else {
- &verbose(&final($u,$server,$oldname,"USER UNKNOWN"));
- }
- last if ($2 eq " ");
- next;
- }
- # 553 is a known code...
- if ($s =~ /^(553)([- ])/) {
- if ($valid) {
- print STDERR "\@$server:$u ($oldname) USER AMBIGUOUS\n";
- } else {
- &verbose(&final($u,$server,$oldname,"USER AMBIGUOUS"));
- }
- last if ($2 eq " ");
- next;
- }
- # 252 is a known code...
- if ($s =~ /^(252)([- ])/) {
- if ($valid) {
- print STDERR "\@$server:$u ($oldname) REFUSED TO VRFY\n";
- } else {
- &verbose(&final($u,$server,$oldname,"REFUSED TO VRFY"));
- }
- last if ($2 eq " ");
- next;
- }
- &giveup('',"$server: did not grok '$s'",$u);
- last USER;
- }
-
- if ($valid) {
- #
- # now we decide if we are going to take these
- # expansions or roll them back.
- #
- $avgValid = &average(@isValid);
- print "avgValid = $avgValid\n" if $debug;
- if ($avgValid >= $validRequirement) {
- print &compact($u,$server)." ->\n" if $verbose;
- while (@toExpn) {
- &verbose(&expn(splice(@toExpn,0,4)));
- }
- while (@toFinal) {
- &verbose(&final(splice(@toFinal,0,3)));
- }
- } else {
- print "Tossing some valid to avoid invalid ".&compact($u,$server)."\n" if ($avgValid > 0.0 && ($vw || $debug));
- print &compact($u,$server)." ->\n" if $verbose;
- &verbose(&final($u,$server,$newname));
- }
- }
- }
-
- &alarm("sending 'quit' to $server",'');
- $0 = "$av0 - sending 'quit' to $server";
- &ps("quit");
- while(<S>) {
- print if $watch;
- last if /^\d+ /;
- }
- close(S);
- alarm(0);
-}
-
-$0 = "$av0 - printing final results";
-print "----------\n" if $vw;
-select(STDOUT);
-for $f (sort @final) {
- print "$f\n";
-}
-unlink("/tmp/expn$$");
-exit(0);
-
-
-# abandon all attempts deliver to $server
-# register the current addresses as the final ones
-sub giveup
-{
- local($redirect_okay,$reason,$user) = @_;
- local($us,@so,$nh,@remaining_users);
- local($pk,$file,$line);
- ($pk, $file, $line) = caller;
-
- $0 = "$av0 - giving up on $server: $reason";
- #
- # add back a user if we gave up in the middle
- #
- push(@users,$user) if $user;
- #
- # don't bother with this system anymore
- #
- unless ($giveup{$server}) {
- $giveup{$server} = $reason;
- print STDERR "$reason\n";
- }
- print "Giveup at $file:$line!!! redirect okay = $redirect_okay; $reason\n" if $debug;
- #
- # Wait!
- # Before giving up, see if there is a chance that
- # there is another host to redirect to!
- # (Kids, don't do this at home! Hacking is a dangerous
- # crime and you could end up behind bars.)
- #
- for $u (@users) {
- if ($redirect_okay =~ /\bmx\b/) {
- next if &try_fallback('mx',$u,*server,
- *mx_secondary,
- *already_mx_fellback);
- }
- if ($redirect_okay =~ /\bdomainify\b/) {
- next if &try_fallback('domainify',$u,*server,
- *domainify_fallback,
- *already_domainify_fellback);
- }
- push(@remaining_users,$u);
- }
- @users = @remaining_users;
- for $u (@users) {
- print &compact($u,$server)." ->\n" if ($verbose && $valid && $u);
- &verbose(&final($u,$server,$names{"$u *** $server"},$reason));
- }
-}
-#
-# This routine is used only within &giveup. It checks to
-# see if we really have to giveup or if there is a second
-# chance because we did something before that can be
-# backtracked.
-#
-# %fallback{"$user *** $host"} tracks what is able to fallback
-# %fellback{"$user *** $host"} tracks what has fallen back
-#
-# If there is a valid backtrack, then queue up the new possibility
-#
-sub try_fallback
-{
- local($method,$user,*host,*fall_table,*fellback) = @_;
- local($us,$fallhost,$oldhost,$ft,$i);
-
- if ($debug > 8) {
- print "Fallback table $method:\n";
- for $i (sort keys %fall_table) {
- print "\t'$i'\t\t'$fall_table{$i}'\n";
- }
- print "Fellback table $method:\n";
- for $i (sort keys %fellback) {
- print "\t'$i'\t\t'$fellback{$i}'\n";
- }
- print "U: $user H: $host\n";
- }
-
- $us = "$user *** $host";
- if (defined $fellback{$us}) {
- #
- # Undo a previous fallback so that we can try again
- # Nested fallbacks are avoided because they could
- # lead to infinite loops
- #
- $fallhost = $fellback{$us};
- print "Already $method fell back from $us -> \n" if $debug;
- $us = "$user *** $fallhost";
- $oldhost = $fallhost;
- } elsif (($method eq 'mx') && (defined $mxbacktrace{$us}) && (defined $mx_secondary{$mxbacktrace{$us}})) {
- print "Fallback an MX expansion $us -> \n" if $debug;
- $oldhost = $mxbacktrace{$us};
- } else {
- print "Oldhost($host, $us) = " if $debug;
- $oldhost = $host;
- }
- print "$oldhost\n" if $debug;
- if (((defined $fall_table{$us}) && ($ft = $us)) || ((defined $fall_table{$oldhost}) && ($ft = $oldhost))) {
- print "$method Fallback = ".$fall_table{$ft}."\n" if $debug;
- local(@so,$newhost);
- @so = split(' ',$fall_table{$ft});
- $newhost = shift(@so);
- print "Falling back ($method) $us -> $newhost (from $oldhost)\n" if $debug;
- if ($method eq 'mx') {
- if (! defined ($mxbacktrace{"$user *** $newhost"})) {
- if (defined $mxbacktrace{"$user *** $oldhost"}) {
- print "resetting oldhost $oldhost to the original: " if $debug;
- $oldhost = $mxbacktrace{"$user *** $oldhost"};
- print "$oldhost\n" if $debug;
- }
- $mxbacktrace{"$user *** $newhost"} = $oldhost;
- print "mxbacktrace $user *** $newhost -> $oldhost\n" if $debug;
- }
- $mx{&trhost($oldhost)} = $newhost;
- } else {
- $temporary_redirect{$us} = $newhost;
- }
- if (@so) {
- print "Can still $method $us: @so\n" if $debug;
- $fall_table{$ft} = join(' ',@so);
- } else {
- print "No more fallbacks for $us\n" if $debug;
- delete $fall_table{$ft};
- }
- if (defined $create_host_backtrack{$us}) {
- $create_host_backtrack{"$user *** $newhost"}
- = $create_host_backtrack{$us};
- }
- $fellback{"$user *** $newhost"} = $oldhost;
- &expn($newhost,$user,$names{$us},$level{$us});
- return 1;
- }
- delete $temporary_redirect{$us};
- $host = $oldhost;
- return 0;
-}
-# return 1 if you could send mail to the address as is.
-sub validAddr
-{
- local($addr) = @_;
- $res = &do_validAddr($addr);
- print "validAddr($addr) = $res\n" if $debug;
- $res;
-}
-sub do_validAddr
-{
- local($addr) = @_;
- local($urx) = "[-A-Za-z_.0-9+]+";
-
- # \u
- return 0 if ($addr =~ /^\\/);
- # ?@h
- return 1 if ($addr =~ /.\@$urx$/);
- # @h:?
- return 1 if ($addr =~ /^\@$urx\:./);
- # h!u
- return 1 if ($addr =~ /^$urx!./);
- # u
- return 1 if ($addr =~ /^$urx$/);
- # ?
- print "validAddr($addr) = ???\n" if $debug;
- return 0;
-}
-# Some systems use expn and vrfy interchangeably. Some only
-# implement one or the other. Some check expn against mailing
-# lists and vrfy against users. It doesn't appear to be
-# consistent.
-#
-# So, what do we do? We try everything!
-#
-#
-# Ranking of result codes: good: 250, 251/551, 252, 550, anything else
-#
-# Ranking of inputs: best: user@host.domain, okay: user
-#
-# Return value: $error_string, @responses_from_server
-sub expn_vrfy
-{
- local($u,$server) = @_;
- local(@c) = ('expn', 'vrfy');
- local(@try_u) = $u;
- local(@ret,$code);
-
- if (($u =~ /(.+)@(.+)/) && (&trhost($2) eq &trhost($server))) {
- push(@try_u,$1);
- }
-
- TRY:
- for $c (@c) {
- for $try_u (@try_u) {
- &alarm("${c}'ing $try_u on $server",'',$u);
- &ps("$c $try_u");
- alarm(0);
- $s = <S>;
- if ($s eq '') {
- return "$server: lost connection";
- }
- if ($s !~ /^(\d+)([- ])/) {
- return "$server: garbled reply to '$c $try_u'";
- }
- if ($1 == 250) {
- $code = 250;
- @ret = ("",$s);
- push(@ret,&read_response($2,$debug));
- return (@ret);
- }
- if ($1 == 551 || $1 == 251) {
- $code = $1;
- @ret = ("",$s);
- push(@ret,&read_response($2,$debug));
- next;
- }
- if ($1 == 252 && ($code == 0 || $code == 550)) {
- $code = 252;
- @ret = ("",$s);
- push(@ret,&read_response($2,$watch));
- next;
- }
- if ($1 == 550 && $code == 0) {
- $code = 550;
- @ret = ("",$s);
- push(@ret,&read_response($2,$watch));
- next;
- }
- &read_response($2,$watch);
- }
- }
- return "$server: expn/vrfy not implemented" unless @ret;
- return @ret;
-}
-# sometimes the old parse routine (now parse2) didn't
-# reject funky addresses.
-sub parse
-{
- local($oldaddr,$server,$oldname,$one_to_one) = @_;
- local($newhost, $newaddr, $newname, $um) = &parse2($oldaddr,$server,$oldname,$one_to_one);
- if ($newaddr =~ m,^["/],) {
- return (undef, $oldaddr, $newname) if $valid;
- return (undef, $um, $newname);
- }
- return ($newhost, $newaddr, $newname);
-}
-
-# returns ($new_smtp_server,$new_address,$new_name)
-# given a response from a SMTP server ($newaddr), the
-# current host ($server), the old "name" and a flag that
-# indicates if it is being called during the initial
-# command line parsing ($parsing_args)
-sub parse2
-{
- local($newaddr,$context_host,$old_name,$parsing_args) = @_;
- local(@names) = $old_name;
- local($urx) = "[-A-Za-z_.0-9+]+";
- local($unmangle);
-
- #
- # first, separate out the address part.
- #
-
- #
- # [NAME] <ADDR [(NAME)]>
- # [NAME] <[(NAME)] ADDR
- # ADDR [(NAME)]
- # (NAME) ADDR
- # [(NAME)] <ADDR>
- #
- if ($newaddr =~ /^\<(.*)\>$/) {
- print "<A:$1>\n" if $debug;
- ($newaddr) = &trim($1);
- print "na = $newaddr\n" if $debug;
- }
- if ($newaddr =~ /^([^\<\>]*)\<([^\<\>]*)\>([^\<\>]*)$/) {
- # address has a < > pair in it.
- print "N:$1 <A:$2> N:$3\n" if $debug;
- ($newaddr) = &trim($2);
- unshift(@names, &trim($3,$1));
- print "na = $newaddr\n" if $debug;
- }
- if ($newaddr =~ /^([^\(\)]*)\(([^\(\)]*)\)([^\(\)]*)$/) {
- # address has a ( ) pair in it.
- print "A:$1 (N:$2) A:$3\n" if $debug;
- unshift(@names,&trim($2));
- local($f,$l) = (&trim($1),&trim($3));
- if (($f && $l) || !($f || $l)) {
- # address looks like:
- # foo (bar) baz or (bar)
- # not allowed!
- print STDERR "Could not parse $newaddr\n" if $vw;
- return(undef,$newaddr,&firstname(@names));
- }
- $newaddr = $f if $f;
- $newaddr = $l if $l;
- print "newaddr now = $newaddr\n" if $debug;
- }
- #
- # @foo:bar
- # j%k@l
- # a@b
- # b!a
- # a
- #
- $unmangle = $newaddr;
- if ($newaddr =~ /^\@($urx)\:(.+)$/) {
- print "(\@:)" if $debug;
- # this is a bit of a cheat, but it seems necessary
- return (&domainify($1,$context_host,$2),$2,&firstname(@names),$unmangle);
- }
- if ($newaddr =~ /^(.+)\@($urx)$/) {
- print "(\@)" if $debug;
- return (&domainify($2,$context_host,$newaddr),$newaddr,&firstname(@names),$unmangle);
- }
- if ($parsing_args) {
- if ($newaddr =~ /^($urx)\!(.+)$/) {
- return (&domainify($1,$context_host,$newaddr),$newaddr,&firstname(@names),$unmangle);
- }
- if ($newaddr =~ /^($urx)$/) {
- return ($context_host,$newaddr,&firstname(@names),$unmangle);
- }
- print STDERR "Could not parse $newaddr\n";
- }
- print "(?)" if $debug;
- return(undef,$newaddr,&firstname(@names),$unmangle);
-}
-# return $u (@$server) unless $u includes reference to $server
-sub compact
-{
- local($u, $server) = @_;
- local($se) = $server;
- local($sp);
- $se =~ s/(\W)/\\$1/g;
- $sp = " (\@$server)";
- if ($u !~ /$se/i) {
- return "$u$sp";
- }
- return $u;
-}
-# remove empty (spaces don't count) members from an array
-sub trim
-{
- local(@v) = @_;
- local($v,@r);
- for $v (@v) {
- $v =~ s/^\s+//;
- $v =~ s/\s+$//;
- push(@r,$v) if ($v =~ /\S/);
- }
- return(@r);
-}
-# using the host part of an address, and the server name, add the
-# servers' domain to the address if it doesn't already have a
-# domain. Since this sometimes fails, save a back reference so
-# it can be unrolled.
-sub domainify
-{
- local($host,$domain_host,$u) = @_;
- local($domain,$newhost);
-
- # cut of trailing dots
- $host =~ s/\.$//;
- $domain_host =~ s/\.$//;
-
- if ($domain_host !~ /\./) {
- #
- # domain host isn't, keep $host whatever it is
- #
- print "domainify($host,$domain_host) = $host\n" if $debug;
- return $host;
- }
-
- #
- # There are several weird situations that need to be
- # accounted for. They have to do with domain relay hosts.
- #
- # Examples:
- # host server "right answer"
- #
- # shiva.cs cs.berkeley.edu shiva.cs.berkeley.edu
- # shiva cs.berkeley.edu shiva.cs.berekley.edu
- # cumulus reed.edu @reed.edu:cumulus.uucp
- # tiberius tc.cornell.edu tiberius.tc.cornell.edu
- #
- # The first try must always be to cut the domain part out of
- # the server and tack it onto the host.
- #
- # A reasonable second try is to tack the whole server part onto
- # the host and for each possible repeated element, eliminate
- # just that part.
- #
- # These extra "guesses" get put into the %domainify_fallback
- # array. They will be used to give addresses a second chance
- # in the &giveup routine
- #
-
- local(%fallback);
-
- local($long);
- $long = "$host $domain_host";
- $long =~ tr/A-Z/a-z/;
- print "long = $long\n" if $debug;
- if ($long =~ s/^([^ ]+\.)([^ ]+) \2(\.[^ ]+\.[^ ]+)/$1$2$3/) {
- # matches shiva.cs cs.berkeley.edu and returns shiva.cs.berkeley.edu
- print "condensed fallback $host $domain_host -> $long\n" if $debug;
- $fallback{$long} = 9;
- }
-
- local($fh);
- $fh = $domain_host;
- while ($fh =~ /\./) {
- print "FALLBACK $host.$fh = 1\n" if $debug > 7;
- $fallback{"$host.$fh"} = 1;
- $fh =~ s/^[^\.]+\.//;
- }
-
- $fallback{"$host.$domain_host"} = 2;
-
- ($domain = $domain_host) =~ s/^[^\.]+//;
- $fallback{"$host$domain"} = 6
- if ($domain =~ /\./);
-
- if ($host =~ /\./) {
- #
- # Host is already okay, but let's look for multiple
- # interpretations
- #
- print "domainify($host,$domain_host) = $host\n" if $debug;
- delete $fallback{$host};
- $domainify_fallback{"$u *** $host"} = join(' ',sort {$fallback{$b} <=> $fallback{$a};} keys %fallback) if %fallback;
- return $host;
- }
-
- $domain = ".$domain_host"
- if ($domain !~ /\..*\./);
- $newhost = "$host$domain";
-
- $create_host_backtrack{"$u *** $newhost"} = $domain_host;
- print "domainify($host,$domain_host) = $newhost\n" if $debug;
- delete $fallback{$newhost};
- $domainify_fallback{"$u *** $newhost"} = join(' ',sort {$fallback{$b} <=> $fallback{$a};} keys %fallback) if %fallback;
- if ($debug) {
- print "fallback = ";
- print $domainify_fallback{"$u *** $newhost"}
- if defined($domainify_fallback{"$u *** $newhost"});
- print "\n";
- }
- return $newhost;
-}
-# return the first non-empty element of an array
-sub firstname
-{
- local(@names) = @_;
- local($n);
- while(@names) {
- $n = shift(@names);
- return $n if $n =~ /\S/;
- }
- return undef;
-}
-# queue up more addresses to expand
-sub expn
-{
- local($host,$addr,$name,$level) = @_;
- if ($host) {
- $host = &trhost($host);
-
- if (($debug > 3) || (defined $giveup{$host})) {
- unshift(@hosts,$host) unless $users{$host};
- } else {
- push(@hosts,$host) unless $users{$host};
- }
- $users{$host} .= " $addr";
- $names{"$addr *** $host"} = $name;
- $level{"$addr *** $host"} = $level + 1;
- print "expn($host,$addr,$name)\n" if $debug;
- return "\t$addr\n";
- } else {
- return &final($addr,'NONE',$name);
- }
-}
-# compute the numerical average value of an array
-sub average
-{
- local(@e) = @_;
- return 0 unless @e;
- local($e,$sum);
- for $e (@e) {
- $sum += $e;
- }
- $sum / @e;
-}
-# print to the server (also to stdout, if -w)
-sub ps
-{
- local($p) = @_;
- print ">>> $p\n" if $watch;
- print S "$p\n";
-}
-# return case-adjusted name for a host (for comparison purposes)
-sub trhost
-{
- # treat foo.bar as an alias for Foo.BAR
- local($host) = @_;
- local($trhost) = $host;
- $trhost =~ tr/A-Z/a-z/;
- if ($trhost{$trhost}) {
- $host = $trhost{$trhost};
- } else {
- $trhost{$trhost} = $host;
- }
- $trhost{$trhost};
-}
-# re-queue users if an mx record dictates a redirect
-# don't allow a user to be redirected more than once
-sub mxredirect
-{
- local($server,*users) = @_;
- local($u,$nserver,@still_there);
-
- $nserver = &mx($server);
-
- if (&trhost($nserver) ne &trhost($server)) {
- $0 = "$av0 - mx redirect $server -> $nserver\n";
- for $u (@users) {
- if (defined $mxbacktrace{"$u *** $nserver"}) {
- push(@still_there,$u);
- } else {
- $mxbacktrace{"$u *** $nserver"} = $server;
- print "mxbacktrace{$u *** $nserver} = $server\n"
- if ($debug > 1);
- &expn($nserver,$u,$names{"$u *** $server"});
- }
- }
- @users = @still_there;
- if (! @users) {
- return $nserver;
- } else {
- return undef;
- }
- }
- return undef;
-}
-# follow mx records, return a hostname
-# also follow temporary redirections coming from &domainify and
-# &mxlookup
-sub mx
-{
- local($h,$u) = @_;
-
- for (;;) {
- if (defined $mx{&trhost($h)} && $h ne $mx{&trhost($h)}) {
- $0 = "$av0 - mx expand $h";
- $h = $mx{&trhost($h)};
- return $h;
- }
- if ($u) {
- if (defined $temporary_redirect{"$u *** $h"}) {
- $0 = "$av0 - internal redirect $h";
- print "Temporary redirect taken $u *** $h -> " if $debug;
- $h = $temporary_redirect{"$u *** $h"};
- print "$h\n" if $debug;
- next;
- }
- $htr = &trhost($h);
- if (defined $temporary_redirect{"$u *** $htr"}) {
- $0 = "$av0 - internal redirect $h";
- print "temporary redirect taken $u *** $h -> " if $debug;
- $h = $temporary_redirect{"$u *** $htr"};
- print "$h\n" if $debug;
- next;
- }
- }
- return $h;
- }
-}
-# look up mx records with the name server.
-# re-queue expansion requests if possible
-# optionally give up on this host.
-sub mxlookup
-{
- local($lastchance,$server,$giveup,*users) = @_;
- local(*T);
- local(*NSLOOKUP);
- local($nh, $pref,$cpref);
- local($o0) = $0;
- local($nserver);
- local($name,$aliases,$type,$len,$thataddr);
- local(%fallback);
-
- return 1 if &mxredirect($server,*users);
-
- if ((defined $mx{$server}) || (! $have_nslookup)) {
- return 0 unless $lastchance;
- &giveup('mx domainify',$giveup);
- return 0;
- }
-
- $0 = "$av0 - nslookup of $server";
- open(T,">/tmp/expn$$") || die "open > /tmp/expn$$: $!\n";
- print T "set querytype=MX\n";
- print T "$server\n";
- close(T);
- $cpref = 1.0E12;
- undef $nserver;
- open(NSLOOKUP,"nslookup < /tmp/expn$$ 2>&1 |") || die "open nslookup: $!";
- while(<NSLOOKUP>) {
- print if ($debug > 2);
- if (/mail exchanger = ([-A-Za-z_.0-9+]+)/) {
- $nh = $1;
- if (/preference = (\d+)/) {
- $pref = $1;
- if ($pref < $cpref) {
- $nserver = $nh;
- $cpref = $pref;
- } elsif ($pref) {
- $fallback{$pref} .= " $nh";
- }
- }
- }
- if (/Non-existent domain/) {
- #
- # These addresses are hosed. Kaput! Dead!
- # However, if we created the address in the
- # first place then there is a chance of
- # salvation.
- #
- 1 while(<NSLOOKUP>);
- close(NSLOOKUP);
- return 0 unless $lastchance;
- &giveup('domainify',"$server: Non-existent domain",undef,1);
- return 0;
- }
-
- }
- close(NSLOOKUP);
- unlink("/tmp/expn$$");
- unless ($nserver) {
- $0 = "$o0 - finished mxlookup";
- return 0 unless $lastchance;
- &giveup('mx domainify',"$server: Could not resolve address");
- return 0;
- }
-
- # provide fallbacks in case $nserver doesn't work out
- if (defined $fallback{$cpref}) {
- $mx_secondary{$server} = $fallback{$cpref};
- }
-
- $0 = "$av0 - gethostbyname($nserver)";
- ($name,$aliases,$type,$len,$thataddr) = gethostbyname($nserver);
-
- unless ($thataddr) {
- $0 = $o0;
- return 0 unless $lastchance;
- &giveup('mx domainify',"$nserver: could not resolve address");
- return 0;
- }
- print "MX($server) = $nserver\n" if $debug;
- print "$server -> $nserver\n" if $vw && !$debug;
- $mx{&trhost($server)} = $nserver;
- # redeploy the users
- unless (&mxredirect($server,*users)) {
- return 0 unless $lastchance;
- &giveup('mx domainify',"$nserver: only one level of mx redirect allowed");
- return 0;
- }
- $0 = "$o0 - finished mxlookup";
- return 1;
-}
-# if mx expansion did not help to resolve an address
-# (ie: foo@bar became @baz:foo@bar, then undo the
-# expansion).
-# this is only used by &final
-sub mxunroll
-{
- local(*host,*addr) = @_;
- local($r) = 0;
- print "looking for mxbacktrace{$addr *** $host}\n"
- if ($debug > 1);
- while (defined $mxbacktrace{"$addr *** $host"}) {
- print "Unrolling MX expansion: \@$host:$addr -> "
- if ($debug || $verbose);
- $host = $mxbacktrace{"$addr *** $host"};
- print "\@$host:$addr\n"
- if ($debug || $verbose);
- $r = 1;
- }
- return 1 if $r;
- $addr = "\@$host:$addr"
- if ($host =~ /\./);
- return 0;
-}
-# register a completed expansion. Make the final address as
-# simple as possible.
-sub final
-{
- local($addr,$host,$name,$error) = @_;
- local($he);
- local($hb,$hr);
- local($au,$ah);
-
- if ($error =~ /Non-existent domain/) {
- #
- # If we created the domain, then let's undo the
- # damage...
- #
- if (defined $create_host_backtrack{"$addr *** $host"}) {
- while (defined $create_host_backtrack{"$addr *** $host"}) {
- print "Un&domainifying($host) = " if $debug;
- $host = $create_host_backtrack{"$addr *** $host"};
- print "$host\n" if $debug;
- }
- $error = "$host: could not locate";
- } else {
- #
- # If we only want valid addresses, toss out
- # bad host names.
- #
- if ($valid) {
- print STDERR "\@$host:$addr ($name) Non-existent domain\n";
- return "";
- }
- }
- }
-
- MXUNWIND: {
- $0 = "$av0 - final parsing of \@$host:$addr";
- ($he = $host) =~ s/(\W)/\\$1/g;
- if ($addr !~ /@/) {
- # addr does not contain any host
- $addr = "$addr@$host";
- } elsif ($addr !~ /$he/i) {
- # if host part really something else, use the something
- # else.
- if ($addr =~ m/(.*)\@([^\@]+)$/) {
- ($au,$ah) = ($1,$2);
- print "au = $au ah = $ah\n" if $debug;
- if (defined $temporary_redirect{"$addr *** $ah"}) {
- $addr = "$au\@".$temporary_redirect{"$addr *** $ah"};
- print "Rewrite! to $addr\n" if $debug;
- next MXUNWIND;
- }
- }
- # addr does not contain full host
- if ($valid) {
- if ($host =~ /^([^\.]+)(\..+)$/) {
- # host part has a . in it - foo.bar
- ($hb, $hr) = ($1, $2);
- if ($addr =~ /\@([^\.\@]+)$/ && ($1 eq $hb)) {
- # addr part has not .
- # and matches beginning of
- # host part -- tack on a
- # domain name.
- $addr .= $hr;
- } else {
- &mxunroll(*host,*addr)
- && redo MXUNWIND;
- }
- } else {
- &mxunroll(*host,*addr)
- && redo MXUNWIND;
- }
- } else {
- $addr = "${addr}[\@$host]"
- if ($host =~ /\./);
- }
- }
- }
- $name = "$name " if $name;
- $error = " $error" if $error;
- if ($valid) {
- push(@final,"$name<$addr>");
- } else {
- push(@final,"$name<$addr>$error");
- }
- "\t$name<$addr>$error\n";
-}
-
-sub alarm
-{
- local($alarm_action,$alarm_redirect,$alarm_user) = @_;
- alarm(3600);
- $SIG{ALRM} = 'handle_alarm';
-}
-# this involves one great big ugly hack.
-# the "next HOST" unwinds the stack!
-sub handle_alarm
-{
- &giveup($alarm_redirect,"Timed out during $alarm_action",$alarm_user);
- next HOST;
-}
-
-# read the rest of the current smtp daemon's response (and toss it away)
-sub read_response
-{
- local($done,$watch) = @_;
- local(@resp);
- print $s if $watch;
- while(($done eq "-") && ($s = <S>) && ($s =~ /^\d+([- ])/)) {
- print $s if $watch;
- $done = $1;
- push(@resp,$s);
- }
- return @resp;
-}
-# print args if verbose. Return them in any case
-sub verbose
-{
- local(@tp) = @_;
- print "@tp" if $verbose;
-}
-# to pass perl -w:
-@tp;
-$flag_a;
-$flag_d;
-$flag_1;
-%already_domainify_fellback;
-%already_mx_fellback;
-&handle_alarm;
-################### BEGIN PERL/TROFF TRANSITION
-.00 ;
-
-'di
-.nr nl 0-1
-.nr % 0
-.\\"'; __END__
-.\" ############## END PERL/TROFF TRANSITION
-.TH EXPN 1 "March 11, 1993"
-.AT 3
-.SH NAME
-expn \- recursively expand mail aliases
-.SH SYNOPSIS
-.B expn
-.RI [ -a ]
-.RI [ -v ]
-.RI [ -w ]
-.RI [ -d ]
-.RI [ -1 ]
-.IR user [@ hostname ]
-.RI [ user [@ hostname ]]...
-.SH DESCRIPTION
-.B expn
-will use the SMTP
-.B expn
-and
-.B vrfy
-commands to expand mail aliases.
-It will first look up the addresses you provide on the command line.
-If those expand into addresses on other systems, it will
-connect to the other systems and expand again. It will keep
-doing this until no further expansion is possible.
-.SH OPTIONS
-The default output of
-.B expn
-can contain many lines which are not valid
-email addresses. With the
-.I -aa
-flag, only expansions that result in legal addresses
-are used. Since many mailing lists have an illegal
-address or two, the single
-.IR -a ,
-address, flag specifies that a few illegal addresses can
-be mixed into the results. More
-.I -a
-flags vary the ratio. Read the source to track down
-the formula. With the
-.I -a
-option, you should be able to construct a new mailing
-list out of an existing one.
-.LP
-If you wish to limit the number of levels deep that
-.B expn
-will recurse as it traces addresses, use the
-.I -1
-option. For each
-.I -1
-another level will be traversed. So,
-.I -111
-will traverse no more than three levels deep.
-.LP
-The normal mode of operation for
-.B expn
-is to do all of its work silently.
-The following options make it more verbose.
-It is not necessary to make it verbose to see what it is
-doing because as it works, it changes its
-.BR argv [0]
-variable to reflect its current activity.
-To see how it is expanding things, the
-.IR -v ,
-verbose, flag will cause
-.B expn
-to show each address before
-and after translation as it works.
-The
-.IR -w ,
-watch, flag will cause
-.B expn
-to show you its conversations with the mail daemons.
-Finally, the
-.IR -d ,
-debug, flag will expose many of the inner workings so that
-it is possible to eliminate bugs.
-.SH ENVIRONMENT
-No environment variables are used.
-.SH FILES
-.B /tmp/expn$$
-.B temporary file used as input to
-.BR nslookup .
-.SH SEE ALSO
-.BR aliases (5),
-.BR sendmail (8),
-.BR nslookup (8),
-RFC 823, and RFC 1123.
-.SH BUGS
-Not all mail daemons will implement
-.B expn
-or
-.BR vrfy .
-It is not possible to verify addresses that are served
-by such daemons.
-.LP
-When attempting to connect to a system to verify an address,
-.B expn
-only tries one IP address. Most mail daemons
-will try harder.
-.LP
-It is assumed that you are running domain names and that
-the
-.BR nslookup (8)
-program is available. If not,
-.B expn
-will not be able to verify many addresses. It will also pause
-for a long time unless you change the code where it says
-.I $have_nslookup = 1
-to read
-.I $have_nslookup =
-.IR 0 .
-.LP
-Lastly,
-.B expn
-does not handle every valid address. If you have an example,
-please submit a bug report.
-.SH CREDITS
-In 1986 or so, Jon Broome wrote a program of the same name
-that did about the same thing. It has since suffered bit rot
-and Jon Broome has dropped off the face of the earth!
-(Jon, if you are out there, drop me a line)
-.SH AVAILABILITY
-The latest version of
-.B expn
-is available through anonymous ftp at
-.IR ftp://ftp.idiom.com/pub/muir-programs/expn .
-.SH AUTHOR
-.I David Muir Sharnoff\ \ \ \ <muir@idiom.com>
diff --git a/contrib/amd/scripts/expn.in b/contrib/amd/scripts/expn.in
deleted file mode 100755
index 9ae575729366..000000000000
--- a/contrib/amd/scripts/expn.in
+++ /dev/null
@@ -1,1369 +0,0 @@
-#!@PERL@
-'di ';
-'ds 00 \\"';
-'ig 00 ';
-#
-# THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin.
-#
-
-# hardcoded constants, should work fine for BSD-based systems
-#require 'sys/socket.ph'; # perl 4
-use Socket; # perl 5
-$AF_INET = &AF_INET;
-$SOCK_STREAM = &SOCK_STREAM;
-
-# system requirements:
-# must have 'nslookup' and 'hostname' programs.
-
-# $Header: /home/cvsroot/am-utils/scripts/expn.in,v 1.5 2002/07/11 14:28:20 ezk Exp $
-
-# TODO:
-# less magic should apply to command-line addresses
-# less magic should apply to local addresses
-# add magic to deal with cross-domain cnames
-
-# Checklist: (hard addresses)
-# 250 Kimmo Suominen <"|/usr/local/mh/lib/slocal -user kim"@grendel.tac.nyc.ny.us>
-# harry@hofmann.cs.Berkeley.EDU -> harry@tenet (.berkeley.edu) [dead]
-# bks@cs.berkeley.edu -> shiva.CS (.berkeley.edu) [dead]
-# dan@tc.cornell.edu -> brown@tiberius (.tc.cornell.edu)
-
-#############################################################################
-#
-# Copyright (c) 1993 David Muir Sharnoff
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the David Muir Sharnoff.
-# 4. The name of David Sharnoff may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE DAVID MUIR SHARNOFF ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL DAVID MUIR SHARNOFF BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# This copyright notice derived from material copyrighted by the Regents
-# of the University of California.
-#
-# Contributions accepted.
-#
-#############################################################################
-
-# overall structure:
-# in an effort to not trace each address individually, but rather
-# ask each server in turn a whole bunch of questions, addresses to
-# be expanded are queued up.
-#
-# This means that all accounting w.r.t. an address must be stored in
-# various arrays. Generally these arrays are indexed by the
-# string "$addr *** $server" where $addr is the address to be
-# expanded "foo" or maybe "foo@bar" and $server is the hostname
-# of the SMTP server to contact.
-#
-
-# important global variables:
-#
-# @hosts : list of servers still to be contacted
-# $server : name of the current we are currently looking at
-# @users = $users{@hosts[0]} : addresses to expand at this server
-# $u = $users[0] : the current address being expanded
-# $names{"$users[0] *** $server"} : the 'name' associated with the address
-# $mxbacktrace{"$users[0] *** $server"} : record of mx expansion
-# $mx_secondary{$server} : other mx relays at the same priority
-# $domainify_fallback{"$users[0] *** $server"} : alternative names to try
-# instead of $server if $server doesn't work
-# $temporary_redirect{"$users[0] *** $server"} : when trying alternates,
-# temporarily channel all tries along current path
-# $giveup{$server} : do not bother expanding addresses at $server
-# $verbose : -v
-# $watch : -w
-# $vw : -v or -w
-# $debug : -d
-# $valid : -a
-# $levels : -1
-# S : the socket connection to $server
-
-$have_nslookup = 1; # we have the nslookup program
-$port = 'smtp';
-$av0 = $0;
-$ENV{'PATH'} .= ":/usr/etc" unless $ENV{'PATH'} =~ m,/usr/etc,;
-$ENV{'PATH'} .= ":/usr/ucb" unless $ENV{'PATH'} =~ m,/usr/ucb,;
-select(STDERR);
-
-$0 = "$av0 - running hostname";
-chop($name = `hostname || uname -n`);
-
-$0 = "$av0 - lookup host FQDN and IP addr";
-($hostname,$aliases,$type,$len,$thisaddr) = gethostbyname($name);
-
-$0 = "$av0 - parsing args";
-$usage = "Usage: $av0 [-1avwd] user[\@host] [user2[\@host2] ...]";
-for $a (@ARGV) {
- die $usage if $a eq "-";
- while ($a =~ s/^(-.*)([1avwd])/$1/) {
- eval '$'."flag_$2 += 1";
- }
- next if $a eq "-";
- die $usage if $a =~ /^-/;
- &expn(&parse($a,$hostname,undef,1));
-}
-$verbose = $flag_v;
-$watch = $flag_w;
-$vw = $flag_v + $flag_w;
-$debug = $flag_d;
-$valid = $flag_a;
-$levels = $flag_1;
-
-die $usage unless @hosts;
-if ($valid) {
- if ($valid == 1) {
- $validRequirement = 0.8;
- } elsif ($valid == 2) {
- $validRequirement = 1.0;
- } elsif ($valid == 3) {
- $validRequirement = 0.9;
- } else {
- $validRequirement = (1 - (1/($valid-3)));
- print "validRequirement = $validRequirement\n" if $debug;
- }
-}
-
-$0 = "$av0 - building local socket";
-($name,$aliases,$proto) = getprotobyname('tcp');
-($name,$aliases,$port) = getservbyname($port,'tcp')
- unless $port =~ /^\d+/;
-$this = sockaddr_in(0, $thisaddr);
-
-HOST:
-while (@hosts) {
- $server = shift(@hosts);
- @users = split(' ',$users{$server});
- delete $users{$server};
-
- # is this server already known to be bad?
- $0 = "$av0 - looking up $server";
- if ($giveup{$server}) {
- &giveup('mx domainify',$giveup{$server});
- next;
- }
-
- # do we already have an mx record for this host?
- next HOST if &mxredirect($server,*users);
-
- # look it up, or try for an mx.
- $0 = "$av0 - gethostbyname($server)";
-
- ($name,$aliases,$type,$len,$thataddr) = gethostbyname($server);
- # if we can't get an A record, try for an MX record.
- unless($thataddr) {
- &mxlookup(1,$server,"$server: could not resolve name",*users);
- next HOST;
- }
-
- # get a connection, or look for an mx
- $0 = "$av0 - socket to $server";
- $that = sockaddr_in($port, $thataddr);
- socket(S, &AF_INET, &SOCK_STREAM, $proto)
- || die "socket: $!";
- $0 = "$av0 - bind to $server";
- bind(S, $this)
- || die "bind $hostname,0: $!";
- $0 = "$av0 - connect to $server";
- print "debug = $debug server = $server\n" if $debug > 8;
- if (! connect(S, $that) || ($debug == 10 && $server =~ /relay\d.UU.NET$/i)) {
- $0 = "$av0 - $server: could not connect: $!\n";
- $emsg = $!;
- unless (&mxlookup(0,$server,"$server: could not connect: $!",*users)) {
- &giveup('mx',"$server: Could not connect: $emsg");
- }
- next HOST;
- }
- select((select(S),$| = 1)[0]); # don't buffer output to S
-
- # read the greeting
- $0 = "$av0 - talking to $server";
- &alarm("greeting with $server",'');
- while(<S>) {
- alarm(0);
- print if $watch;
- if (/^(\d+)([- ])/) {
- if ($1 != 220) {
- $0 = "$av0 - bad numeric response from $server";
- &alarm("giving up after bad response from $server",'');
- &read_response($2,$watch);
- alarm(0);
- print STDERR "$server: NOT 220 greeting: $_"
- if ($debug || $vw);
- if (&mxlookup(0,$server,"$server: did not respond with a 220 greeting",*users)) {
- close(S);
- next HOST;
- }
- }
- last if ($2 eq " ");
- } else {
- $0 = "$av0 - bad response from $server";
- print STDERR "$server: NOT 220 greeting: $_"
- if ($debug || $vw);
- unless (&mxlookup(0,$server,"$server: did not respond with SMTP codes",*users)) {
- &giveup('',"$server: did not talk SMTP");
- }
- close(S);
- next HOST;
- }
- &alarm("greeting with $server",'');
- }
- alarm(0);
-
- # if this causes problems, remove it
- $0 = "$av0 - sending helo to $server";
- &alarm("sending helo to $server","");
- &ps("helo $hostname");
- while(<S>) {
- print if $watch;
- last if /^\d+ /;
- }
- alarm(0);
-
- # try the users, one by one
- USER:
- while(@users) {
- $u = shift(@users);
- $0 = "$av0 - expanding $u [\@$server]";
-
- # do we already have a name for this user?
- $oldname = $names{"$u *** $server"};
-
- print &compact($u,$server)." ->\n" if ($verbose && ! $valid);
- if ($valid) {
- #
- # when running with -a, we delay taking any action
- # on the results of our query until we have looked
- # at the complete output. @toFinal stores expansions
- # that will be final if we take them. @toExpn stores
- # expansions that are not final. @isValid keeps
- # track of our ability to send mail to each of the
- # expansions.
- #
- @isValid = ();
- @toFinal = ();
- @toExpn = ();
- }
-
-# ($ecode,@expansion) = &expn_vrfy($u,$server);
- (@foo) = &expn_vrfy($u,$server);
- ($ecode,@expansion) = @foo;
- if ($ecode) {
- &giveup('',$ecode,$u);
- last USER;
- }
-
- for $s (@expansion) {
- $s =~ s/[\n\r]//g;
- $0 = "$av0 - parsing $server: $s";
-
- $skipwatch = $watch;
-
- if ($s =~ /^[25]51([- ]).*<(.+)>/) {
- print "$s" if $watch;
- print "(pretending 250$1<$2>)" if ($debug && $watch);
- print "\n" if $watch;
- $s = "250$1<$2>";
- $skipwatch = 0;
- }
-
- if ($s =~ /^250([- ])(.+)/) {
- print "$s\n" if $skipwatch;
- ($done,$addr) = ($1,$2);
- ($newhost, $newaddr, $newname) = &parse($addr,$server,$oldname, $#expansion == 0);
- print "($newhost, $newaddr, $newname) = &parse($addr, $server, $oldname)\n" if $debug;
- if (! $newhost) {
- # no expansion is possible w/o a new server to call
- if ($valid) {
- push(@isValid, &validAddr($newaddr));
- push(@toFinal,$newaddr,$server,$newname);
- } else {
- &verbose(&final($newaddr,$server,$newname));
- }
- } else {
- $newmxhost = &mx($newhost,$newaddr);
- print "$newmxhost = &mx($newhost)\n"
- if ($debug && $newhost ne $newmxhost);
- $0 = "$av0 - parsing $newaddr [@$newmxhost]";
- print "levels = $levels, level{$u *** $server} = ".$level{"$u *** $server"}."\n" if ($debug > 1);
- # If the new server is the current one,
- # it would have expanded things for us
- # if it could have. Mx records must be
- # followed to compare server names.
- # We are also done if the recursion
- # count has been exceeded.
- if (&trhost($newmxhost) eq &trhost($server) || ($levels && $level{"$u *** $server"} >= $levels)) {
- if ($valid) {
- push(@isValid, &validAddr($newaddr));
- push(@toFinal,$newaddr,$newmxhost,$newname);
- } else {
- &verbose(&final($newaddr,$newmxhost,$newname));
- }
- } else {
- # more work to do...
- if ($valid) {
- push(@isValid, &validAddr($newaddr));
- push(@toExpn,$newmxhost,$newaddr,$newname,$level{"$u *** $server"});
- } else {
- &verbose(&expn($newmxhost,$newaddr,$newname,$level{"$u *** $server"}));
- }
- }
- }
- last if ($done eq " ");
- next;
- }
- # 550 is a known code... Should the be
- # included in -a output? Might be a bug
- # here. Does it matter? Can assume that
- # there won't be UNKNOWN USER responses
- # mixed with valid users?
- if ($s =~ /^(550)([- ])/) {
- if ($valid) {
- print STDERR "\@$server:$u ($oldname) USER UNKNOWN\n";
- } else {
- &verbose(&final($u,$server,$oldname,"USER UNKNOWN"));
- }
- last if ($2 eq " ");
- next;
- }
- # 553 is a known code...
- if ($s =~ /^(553)([- ])/) {
- if ($valid) {
- print STDERR "\@$server:$u ($oldname) USER AMBIGUOUS\n";
- } else {
- &verbose(&final($u,$server,$oldname,"USER AMBIGUOUS"));
- }
- last if ($2 eq " ");
- next;
- }
- # 252 is a known code...
- if ($s =~ /^(252)([- ])/) {
- if ($valid) {
- print STDERR "\@$server:$u ($oldname) REFUSED TO VRFY\n";
- } else {
- &verbose(&final($u,$server,$oldname,"REFUSED TO VRFY"));
- }
- last if ($2 eq " ");
- next;
- }
- &giveup('',"$server: did not grok '$s'",$u);
- last USER;
- }
-
- if ($valid) {
- #
- # now we decide if we are going to take these
- # expansions or roll them back.
- #
- $avgValid = &average(@isValid);
- print "avgValid = $avgValid\n" if $debug;
- if ($avgValid >= $validRequirement) {
- print &compact($u,$server)." ->\n" if $verbose;
- while (@toExpn) {
- &verbose(&expn(splice(@toExpn,0,4)));
- }
- while (@toFinal) {
- &verbose(&final(splice(@toFinal,0,3)));
- }
- } else {
- print "Tossing some valid to avoid invalid ".&compact($u,$server)."\n" if ($avgValid > 0.0 && ($vw || $debug));
- print &compact($u,$server)." ->\n" if $verbose;
- &verbose(&final($u,$server,$newname));
- }
- }
- }
-
- &alarm("sending 'quit' to $server",'');
- $0 = "$av0 - sending 'quit' to $server";
- &ps("quit");
- while(<S>) {
- print if $watch;
- last if /^\d+ /;
- }
- close(S);
- alarm(0);
-}
-
-$0 = "$av0 - printing final results";
-print "----------\n" if $vw;
-select(STDOUT);
-for $f (sort @final) {
- print "$f\n";
-}
-unlink("/tmp/expn$$");
-exit(0);
-
-
-# abandon all attempts deliver to $server
-# register the current addresses as the final ones
-sub giveup
-{
- local($redirect_okay,$reason,$user) = @_;
- local($us,@so,$nh,@remaining_users);
- local($pk,$file,$line);
- ($pk, $file, $line) = caller;
-
- $0 = "$av0 - giving up on $server: $reason";
- #
- # add back a user if we gave up in the middle
- #
- push(@users,$user) if $user;
- #
- # don't bother with this system anymore
- #
- unless ($giveup{$server}) {
- $giveup{$server} = $reason;
- print STDERR "$reason\n";
- }
- print "Giveup at $file:$line!!! redirect okay = $redirect_okay; $reason\n" if $debug;
- #
- # Wait!
- # Before giving up, see if there is a chance that
- # there is another host to redirect to!
- # (Kids, don't do this at home! Hacking is a dangerous
- # crime and you could end up behind bars.)
- #
- for $u (@users) {
- if ($redirect_okay =~ /\bmx\b/) {
- next if &try_fallback('mx',$u,*server,
- *mx_secondary,
- *already_mx_fellback);
- }
- if ($redirect_okay =~ /\bdomainify\b/) {
- next if &try_fallback('domainify',$u,*server,
- *domainify_fallback,
- *already_domainify_fellback);
- }
- push(@remaining_users,$u);
- }
- @users = @remaining_users;
- for $u (@users) {
- print &compact($u,$server)." ->\n" if ($verbose && $valid && $u);
- &verbose(&final($u,$server,$names{"$u *** $server"},$reason));
- }
-}
-#
-# This routine is used only within &giveup. It checks to
-# see if we really have to giveup or if there is a second
-# chance because we did something before that can be
-# backtracked.
-#
-# %fallback{"$user *** $host"} tracks what is able to fallback
-# %fellback{"$user *** $host"} tracks what has fallen back
-#
-# If there is a valid backtrack, then queue up the new possibility
-#
-sub try_fallback
-{
- local($method,$user,*host,*fall_table,*fellback) = @_;
- local($us,$fallhost,$oldhost,$ft,$i);
-
- if ($debug > 8) {
- print "Fallback table $method:\n";
- for $i (sort keys %fall_table) {
- print "\t'$i'\t\t'$fall_table{$i}'\n";
- }
- print "Fellback table $method:\n";
- for $i (sort keys %fellback) {
- print "\t'$i'\t\t'$fellback{$i}'\n";
- }
- print "U: $user H: $host\n";
- }
-
- $us = "$user *** $host";
- if (defined $fellback{$us}) {
- #
- # Undo a previous fallback so that we can try again
- # Nested fallbacks are avoided because they could
- # lead to infinite loops
- #
- $fallhost = $fellback{$us};
- print "Already $method fell back from $us -> \n" if $debug;
- $us = "$user *** $fallhost";
- $oldhost = $fallhost;
- } elsif (($method eq 'mx') && (defined $mxbacktrace{$us}) && (defined $mx_secondary{$mxbacktrace{$us}})) {
- print "Fallback an MX expansion $us -> \n" if $debug;
- $oldhost = $mxbacktrace{$us};
- } else {
- print "Oldhost($host, $us) = " if $debug;
- $oldhost = $host;
- }
- print "$oldhost\n" if $debug;
- if (((defined $fall_table{$us}) && ($ft = $us)) || ((defined $fall_table{$oldhost}) && ($ft = $oldhost))) {
- print "$method Fallback = ".$fall_table{$ft}."\n" if $debug;
- local(@so,$newhost);
- @so = split(' ',$fall_table{$ft});
- $newhost = shift(@so);
- print "Falling back ($method) $us -> $newhost (from $oldhost)\n" if $debug;
- if ($method eq 'mx') {
- if (! defined ($mxbacktrace{"$user *** $newhost"})) {
- if (defined $mxbacktrace{"$user *** $oldhost"}) {
- print "resetting oldhost $oldhost to the original: " if $debug;
- $oldhost = $mxbacktrace{"$user *** $oldhost"};
- print "$oldhost\n" if $debug;
- }
- $mxbacktrace{"$user *** $newhost"} = $oldhost;
- print "mxbacktrace $user *** $newhost -> $oldhost\n" if $debug;
- }
- $mx{&trhost($oldhost)} = $newhost;
- } else {
- $temporary_redirect{$us} = $newhost;
- }
- if (@so) {
- print "Can still $method $us: @so\n" if $debug;
- $fall_table{$ft} = join(' ',@so);
- } else {
- print "No more fallbacks for $us\n" if $debug;
- delete $fall_table{$ft};
- }
- if (defined $create_host_backtrack{$us}) {
- $create_host_backtrack{"$user *** $newhost"}
- = $create_host_backtrack{$us};
- }
- $fellback{"$user *** $newhost"} = $oldhost;
- &expn($newhost,$user,$names{$us},$level{$us});
- return 1;
- }
- delete $temporary_redirect{$us};
- $host = $oldhost;
- return 0;
-}
-# return 1 if you could send mail to the address as is.
-sub validAddr
-{
- local($addr) = @_;
- $res = &do_validAddr($addr);
- print "validAddr($addr) = $res\n" if $debug;
- $res;
-}
-sub do_validAddr
-{
- local($addr) = @_;
- local($urx) = "[-A-Za-z_.0-9+]+";
-
- # \u
- return 0 if ($addr =~ /^\\/);
- # ?@h
- return 1 if ($addr =~ /.\@$urx$/);
- # @h:?
- return 1 if ($addr =~ /^\@$urx\:./);
- # h!u
- return 1 if ($addr =~ /^$urx!./);
- # u
- return 1 if ($addr =~ /^$urx$/);
- # ?
- print "validAddr($addr) = ???\n" if $debug;
- return 0;
-}
-# Some systems use expn and vrfy interchangeably. Some only
-# implement one or the other. Some check expn against mailing
-# lists and vrfy against users. It doesn't appear to be
-# consistent.
-#
-# So, what do we do? We try everything!
-#
-#
-# Ranking of result codes: good: 250, 251/551, 252, 550, anything else
-#
-# Ranking of inputs: best: user@host.domain, okay: user
-#
-# Return value: $error_string, @responses_from_server
-sub expn_vrfy
-{
- local($u,$server) = @_;
- local(@c) = ('expn', 'vrfy');
- local(@try_u) = $u;
- local(@ret,$code);
-
- if (($u =~ /(.+)@(.+)/) && (&trhost($2) eq &trhost($server))) {
- push(@try_u,$1);
- }
-
- TRY:
- for $c (@c) {
- for $try_u (@try_u) {
- &alarm("${c}'ing $try_u on $server",'',$u);
- &ps("$c $try_u");
- alarm(0);
- $s = <S>;
- if ($s eq '') {
- return "$server: lost connection";
- }
- if ($s !~ /^(\d+)([- ])/) {
- return "$server: garbled reply to '$c $try_u'";
- }
- if ($1 == 250) {
- $code = 250;
- @ret = ("",$s);
- push(@ret,&read_response($2,$debug));
- return (@ret);
- }
- if ($1 == 551 || $1 == 251) {
- $code = $1;
- @ret = ("",$s);
- push(@ret,&read_response($2,$debug));
- next;
- }
- if ($1 == 252 && ($code == 0 || $code == 550)) {
- $code = 252;
- @ret = ("",$s);
- push(@ret,&read_response($2,$watch));
- next;
- }
- if ($1 == 550 && $code == 0) {
- $code = 550;
- @ret = ("",$s);
- push(@ret,&read_response($2,$watch));
- next;
- }
- &read_response($2,$watch);
- }
- }
- return "$server: expn/vrfy not implemented" unless @ret;
- return @ret;
-}
-# sometimes the old parse routine (now parse2) didn't
-# reject funky addresses.
-sub parse
-{
- local($oldaddr,$server,$oldname,$one_to_one) = @_;
- local($newhost, $newaddr, $newname, $um) = &parse2($oldaddr,$server,$oldname,$one_to_one);
- if ($newaddr =~ m,^["/],) {
- return (undef, $oldaddr, $newname) if $valid;
- return (undef, $um, $newname);
- }
- return ($newhost, $newaddr, $newname);
-}
-
-# returns ($new_smtp_server,$new_address,$new_name)
-# given a response from a SMTP server ($newaddr), the
-# current host ($server), the old "name" and a flag that
-# indicates if it is being called during the initial
-# command line parsing ($parsing_args)
-sub parse2
-{
- local($newaddr,$context_host,$old_name,$parsing_args) = @_;
- local(@names) = $old_name;
- local($urx) = "[-A-Za-z_.0-9+]+";
- local($unmangle);
-
- #
- # first, separate out the address part.
- #
-
- #
- # [NAME] <ADDR [(NAME)]>
- # [NAME] <[(NAME)] ADDR
- # ADDR [(NAME)]
- # (NAME) ADDR
- # [(NAME)] <ADDR>
- #
- if ($newaddr =~ /^\<(.*)\>$/) {
- print "<A:$1>\n" if $debug;
- ($newaddr) = &trim($1);
- print "na = $newaddr\n" if $debug;
- }
- if ($newaddr =~ /^([^\<\>]*)\<([^\<\>]*)\>([^\<\>]*)$/) {
- # address has a < > pair in it.
- print "N:$1 <A:$2> N:$3\n" if $debug;
- ($newaddr) = &trim($2);
- unshift(@names, &trim($3,$1));
- print "na = $newaddr\n" if $debug;
- }
- if ($newaddr =~ /^([^\(\)]*)\(([^\(\)]*)\)([^\(\)]*)$/) {
- # address has a ( ) pair in it.
- print "A:$1 (N:$2) A:$3\n" if $debug;
- unshift(@names,&trim($2));
- local($f,$l) = (&trim($1),&trim($3));
- if (($f && $l) || !($f || $l)) {
- # address looks like:
- # foo (bar) baz or (bar)
- # not allowed!
- print STDERR "Could not parse $newaddr\n" if $vw;
- return(undef,$newaddr,&firstname(@names));
- }
- $newaddr = $f if $f;
- $newaddr = $l if $l;
- print "newaddr now = $newaddr\n" if $debug;
- }
- #
- # @foo:bar
- # j%k@l
- # a@b
- # b!a
- # a
- #
- $unmangle = $newaddr;
- if ($newaddr =~ /^\@($urx)\:(.+)$/) {
- print "(\@:)" if $debug;
- # this is a bit of a cheat, but it seems necessary
- return (&domainify($1,$context_host,$2),$2,&firstname(@names),$unmangle);
- }
- if ($newaddr =~ /^(.+)\@($urx)$/) {
- print "(\@)" if $debug;
- return (&domainify($2,$context_host,$newaddr),$newaddr,&firstname(@names),$unmangle);
- }
- if ($parsing_args) {
- if ($newaddr =~ /^($urx)\!(.+)$/) {
- return (&domainify($1,$context_host,$newaddr),$newaddr,&firstname(@names),$unmangle);
- }
- if ($newaddr =~ /^($urx)$/) {
- return ($context_host,$newaddr,&firstname(@names),$unmangle);
- }
- print STDERR "Could not parse $newaddr\n";
- }
- print "(?)" if $debug;
- return(undef,$newaddr,&firstname(@names),$unmangle);
-}
-# return $u (@$server) unless $u includes reference to $server
-sub compact
-{
- local($u, $server) = @_;
- local($se) = $server;
- local($sp);
- $se =~ s/(\W)/\\$1/g;
- $sp = " (\@$server)";
- if ($u !~ /$se/i) {
- return "$u$sp";
- }
- return $u;
-}
-# remove empty (spaces don't count) members from an array
-sub trim
-{
- local(@v) = @_;
- local($v,@r);
- for $v (@v) {
- $v =~ s/^\s+//;
- $v =~ s/\s+$//;
- push(@r,$v) if ($v =~ /\S/);
- }
- return(@r);
-}
-# using the host part of an address, and the server name, add the
-# servers' domain to the address if it doesn't already have a
-# domain. Since this sometimes fails, save a back reference so
-# it can be unrolled.
-sub domainify
-{
- local($host,$domain_host,$u) = @_;
- local($domain,$newhost);
-
- # cut of trailing dots
- $host =~ s/\.$//;
- $domain_host =~ s/\.$//;
-
- if ($domain_host !~ /\./) {
- #
- # domain host isn't, keep $host whatever it is
- #
- print "domainify($host,$domain_host) = $host\n" if $debug;
- return $host;
- }
-
- #
- # There are several weird situations that need to be
- # accounted for. They have to do with domain relay hosts.
- #
- # Examples:
- # host server "right answer"
- #
- # shiva.cs cs.berkeley.edu shiva.cs.berkeley.edu
- # shiva cs.berkeley.edu shiva.cs.berekley.edu
- # cumulus reed.edu @reed.edu:cumulus.uucp
- # tiberius tc.cornell.edu tiberius.tc.cornell.edu
- #
- # The first try must always be to cut the domain part out of
- # the server and tack it onto the host.
- #
- # A reasonable second try is to tack the whole server part onto
- # the host and for each possible repeated element, eliminate
- # just that part.
- #
- # These extra "guesses" get put into the %domainify_fallback
- # array. They will be used to give addresses a second chance
- # in the &giveup routine
- #
-
- local(%fallback);
-
- local($long);
- $long = "$host $domain_host";
- $long =~ tr/A-Z/a-z/;
- print "long = $long\n" if $debug;
- if ($long =~ s/^([^ ]+\.)([^ ]+) \2(\.[^ ]+\.[^ ]+)/$1$2$3/) {
- # matches shiva.cs cs.berkeley.edu and returns shiva.cs.berkeley.edu
- print "condensed fallback $host $domain_host -> $long\n" if $debug;
- $fallback{$long} = 9;
- }
-
- local($fh);
- $fh = $domain_host;
- while ($fh =~ /\./) {
- print "FALLBACK $host.$fh = 1\n" if $debug > 7;
- $fallback{"$host.$fh"} = 1;
- $fh =~ s/^[^\.]+\.//;
- }
-
- $fallback{"$host.$domain_host"} = 2;
-
- ($domain = $domain_host) =~ s/^[^\.]+//;
- $fallback{"$host$domain"} = 6
- if ($domain =~ /\./);
-
- if ($host =~ /\./) {
- #
- # Host is already okay, but let's look for multiple
- # interpretations
- #
- print "domainify($host,$domain_host) = $host\n" if $debug;
- delete $fallback{$host};
- $domainify_fallback{"$u *** $host"} = join(' ',sort {$fallback{$b} <=> $fallback{$a};} keys %fallback) if %fallback;
- return $host;
- }
-
- $domain = ".$domain_host"
- if ($domain !~ /\..*\./);
- $newhost = "$host$domain";
-
- $create_host_backtrack{"$u *** $newhost"} = $domain_host;
- print "domainify($host,$domain_host) = $newhost\n" if $debug;
- delete $fallback{$newhost};
- $domainify_fallback{"$u *** $newhost"} = join(' ',sort {$fallback{$b} <=> $fallback{$a};} keys %fallback) if %fallback;
- if ($debug) {
- print "fallback = ";
- print $domainify_fallback{"$u *** $newhost"}
- if defined($domainify_fallback{"$u *** $newhost"});
- print "\n";
- }
- return $newhost;
-}
-# return the first non-empty element of an array
-sub firstname
-{
- local(@names) = @_;
- local($n);
- while(@names) {
- $n = shift(@names);
- return $n if $n =~ /\S/;
- }
- return undef;
-}
-# queue up more addresses to expand
-sub expn
-{
- local($host,$addr,$name,$level) = @_;
- if ($host) {
- $host = &trhost($host);
-
- if (($debug > 3) || (defined $giveup{$host})) {
- unshift(@hosts,$host) unless $users{$host};
- } else {
- push(@hosts,$host) unless $users{$host};
- }
- $users{$host} .= " $addr";
- $names{"$addr *** $host"} = $name;
- $level{"$addr *** $host"} = $level + 1;
- print "expn($host,$addr,$name)\n" if $debug;
- return "\t$addr\n";
- } else {
- return &final($addr,'NONE',$name);
- }
-}
-# compute the numerical average value of an array
-sub average
-{
- local(@e) = @_;
- return 0 unless @e;
- local($e,$sum);
- for $e (@e) {
- $sum += $e;
- }
- $sum / @e;
-}
-# print to the server (also to stdout, if -w)
-sub ps
-{
- local($p) = @_;
- print ">>> $p\n" if $watch;
- print S "$p\n";
-}
-# return case-adjusted name for a host (for comparison purposes)
-sub trhost
-{
- # treat foo.bar as an alias for Foo.BAR
- local($host) = @_;
- local($trhost) = $host;
- $trhost =~ tr/A-Z/a-z/;
- if ($trhost{$trhost}) {
- $host = $trhost{$trhost};
- } else {
- $trhost{$trhost} = $host;
- }
- $trhost{$trhost};
-}
-# re-queue users if an mx record dictates a redirect
-# don't allow a user to be redirected more than once
-sub mxredirect
-{
- local($server,*users) = @_;
- local($u,$nserver,@still_there);
-
- $nserver = &mx($server);
-
- if (&trhost($nserver) ne &trhost($server)) {
- $0 = "$av0 - mx redirect $server -> $nserver\n";
- for $u (@users) {
- if (defined $mxbacktrace{"$u *** $nserver"}) {
- push(@still_there,$u);
- } else {
- $mxbacktrace{"$u *** $nserver"} = $server;
- print "mxbacktrace{$u *** $nserver} = $server\n"
- if ($debug > 1);
- &expn($nserver,$u,$names{"$u *** $server"});
- }
- }
- @users = @still_there;
- if (! @users) {
- return $nserver;
- } else {
- return undef;
- }
- }
- return undef;
-}
-# follow mx records, return a hostname
-# also follow temporary redirections coming from &domainify and
-# &mxlookup
-sub mx
-{
- local($h,$u) = @_;
-
- for (;;) {
- if (defined $mx{&trhost($h)} && $h ne $mx{&trhost($h)}) {
- $0 = "$av0 - mx expand $h";
- $h = $mx{&trhost($h)};
- return $h;
- }
- if ($u) {
- if (defined $temporary_redirect{"$u *** $h"}) {
- $0 = "$av0 - internal redirect $h";
- print "Temporary redirect taken $u *** $h -> " if $debug;
- $h = $temporary_redirect{"$u *** $h"};
- print "$h\n" if $debug;
- next;
- }
- $htr = &trhost($h);
- if (defined $temporary_redirect{"$u *** $htr"}) {
- $0 = "$av0 - internal redirect $h";
- print "temporary redirect taken $u *** $h -> " if $debug;
- $h = $temporary_redirect{"$u *** $htr"};
- print "$h\n" if $debug;
- next;
- }
- }
- return $h;
- }
-}
-# look up mx records with the name server.
-# re-queue expansion requests if possible
-# optionally give up on this host.
-sub mxlookup
-{
- local($lastchance,$server,$giveup,*users) = @_;
- local(*T);
- local(*NSLOOKUP);
- local($nh, $pref,$cpref);
- local($o0) = $0;
- local($nserver);
- local($name,$aliases,$type,$len,$thataddr);
- local(%fallback);
-
- return 1 if &mxredirect($server,*users);
-
- if ((defined $mx{$server}) || (! $have_nslookup)) {
- return 0 unless $lastchance;
- &giveup('mx domainify',$giveup);
- return 0;
- }
-
- $0 = "$av0 - nslookup of $server";
- open(T,">/tmp/expn$$") || die "open > /tmp/expn$$: $!\n";
- print T "set querytype=MX\n";
- print T "$server\n";
- close(T);
- $cpref = 1.0E12;
- undef $nserver;
- open(NSLOOKUP,"nslookup < /tmp/expn$$ 2>&1 |") || die "open nslookup: $!";
- while(<NSLOOKUP>) {
- print if ($debug > 2);
- if (/mail exchanger = ([-A-Za-z_.0-9+]+)/) {
- $nh = $1;
- if (/preference = (\d+)/) {
- $pref = $1;
- if ($pref < $cpref) {
- $nserver = $nh;
- $cpref = $pref;
- } elsif ($pref) {
- $fallback{$pref} .= " $nh";
- }
- }
- }
- if (/Non-existent domain/) {
- #
- # These addresses are hosed. Kaput! Dead!
- # However, if we created the address in the
- # first place then there is a chance of
- # salvation.
- #
- 1 while(<NSLOOKUP>);
- close(NSLOOKUP);
- return 0 unless $lastchance;
- &giveup('domainify',"$server: Non-existent domain",undef,1);
- return 0;
- }
-
- }
- close(NSLOOKUP);
- unlink("/tmp/expn$$");
- unless ($nserver) {
- $0 = "$o0 - finished mxlookup";
- return 0 unless $lastchance;
- &giveup('mx domainify',"$server: Could not resolve address");
- return 0;
- }
-
- # provide fallbacks in case $nserver doesn't work out
- if (defined $fallback{$cpref}) {
- $mx_secondary{$server} = $fallback{$cpref};
- }
-
- $0 = "$av0 - gethostbyname($nserver)";
- ($name,$aliases,$type,$len,$thataddr) = gethostbyname($nserver);
-
- unless ($thataddr) {
- $0 = $o0;
- return 0 unless $lastchance;
- &giveup('mx domainify',"$nserver: could not resolve address");
- return 0;
- }
- print "MX($server) = $nserver\n" if $debug;
- print "$server -> $nserver\n" if $vw && !$debug;
- $mx{&trhost($server)} = $nserver;
- # redeploy the users
- unless (&mxredirect($server,*users)) {
- return 0 unless $lastchance;
- &giveup('mx domainify',"$nserver: only one level of mx redirect allowed");
- return 0;
- }
- $0 = "$o0 - finished mxlookup";
- return 1;
-}
-# if mx expansion did not help to resolve an address
-# (ie: foo@bar became @baz:foo@bar, then undo the
-# expansion).
-# this is only used by &final
-sub mxunroll
-{
- local(*host,*addr) = @_;
- local($r) = 0;
- print "looking for mxbacktrace{$addr *** $host}\n"
- if ($debug > 1);
- while (defined $mxbacktrace{"$addr *** $host"}) {
- print "Unrolling MX expansion: \@$host:$addr -> "
- if ($debug || $verbose);
- $host = $mxbacktrace{"$addr *** $host"};
- print "\@$host:$addr\n"
- if ($debug || $verbose);
- $r = 1;
- }
- return 1 if $r;
- $addr = "\@$host:$addr"
- if ($host =~ /\./);
- return 0;
-}
-# register a completed expansion. Make the final address as
-# simple as possible.
-sub final
-{
- local($addr,$host,$name,$error) = @_;
- local($he);
- local($hb,$hr);
- local($au,$ah);
-
- if ($error =~ /Non-existent domain/) {
- #
- # If we created the domain, then let's undo the
- # damage...
- #
- if (defined $create_host_backtrack{"$addr *** $host"}) {
- while (defined $create_host_backtrack{"$addr *** $host"}) {
- print "Un&domainifying($host) = " if $debug;
- $host = $create_host_backtrack{"$addr *** $host"};
- print "$host\n" if $debug;
- }
- $error = "$host: could not locate";
- } else {
- #
- # If we only want valid addresses, toss out
- # bad host names.
- #
- if ($valid) {
- print STDERR "\@$host:$addr ($name) Non-existent domain\n";
- return "";
- }
- }
- }
-
- MXUNWIND: {
- $0 = "$av0 - final parsing of \@$host:$addr";
- ($he = $host) =~ s/(\W)/\\$1/g;
- if ($addr !~ /@/) {
- # addr does not contain any host
- $addr = "$addr@$host";
- } elsif ($addr !~ /$he/i) {
- # if host part really something else, use the something
- # else.
- if ($addr =~ m/(.*)\@([^\@]+)$/) {
- ($au,$ah) = ($1,$2);
- print "au = $au ah = $ah\n" if $debug;
- if (defined $temporary_redirect{"$addr *** $ah"}) {
- $addr = "$au\@".$temporary_redirect{"$addr *** $ah"};
- print "Rewrite! to $addr\n" if $debug;
- next MXUNWIND;
- }
- }
- # addr does not contain full host
- if ($valid) {
- if ($host =~ /^([^\.]+)(\..+)$/) {
- # host part has a . in it - foo.bar
- ($hb, $hr) = ($1, $2);
- if ($addr =~ /\@([^\.\@]+)$/ && ($1 eq $hb)) {
- # addr part has not .
- # and matches beginning of
- # host part -- tack on a
- # domain name.
- $addr .= $hr;
- } else {
- &mxunroll(*host,*addr)
- && redo MXUNWIND;
- }
- } else {
- &mxunroll(*host,*addr)
- && redo MXUNWIND;
- }
- } else {
- $addr = "${addr}[\@$host]"
- if ($host =~ /\./);
- }
- }
- }
- $name = "$name " if $name;
- $error = " $error" if $error;
- if ($valid) {
- push(@final,"$name<$addr>");
- } else {
- push(@final,"$name<$addr>$error");
- }
- "\t$name<$addr>$error\n";
-}
-
-sub alarm
-{
- local($alarm_action,$alarm_redirect,$alarm_user) = @_;
- alarm(3600);
- $SIG{ALRM} = 'handle_alarm';
-}
-# this involves one great big ugly hack.
-# the "next HOST" unwinds the stack!
-sub handle_alarm
-{
- &giveup($alarm_redirect,"Timed out during $alarm_action",$alarm_user);
- next HOST;
-}
-
-# read the rest of the current smtp daemon's response (and toss it away)
-sub read_response
-{
- local($done,$watch) = @_;
- local(@resp);
- print $s if $watch;
- while(($done eq "-") && ($s = <S>) && ($s =~ /^\d+([- ])/)) {
- print $s if $watch;
- $done = $1;
- push(@resp,$s);
- }
- return @resp;
-}
-# print args if verbose. Return them in any case
-sub verbose
-{
- local(@tp) = @_;
- print "@tp" if $verbose;
-}
-# to pass perl -w:
-@tp;
-$flag_a;
-$flag_d;
-$flag_1;
-%already_domainify_fellback;
-%already_mx_fellback;
-&handle_alarm;
-################### BEGIN PERL/TROFF TRANSITION
-.00 ;
-
-'di
-.nr nl 0-1
-.nr % 0
-.\\"'; __END__
-.\" ############## END PERL/TROFF TRANSITION
-.TH EXPN 1 "March 11, 1993"
-.AT 3
-.SH NAME
-expn \- recursively expand mail aliases
-.SH SYNOPSIS
-.B expn
-.RI [ -a ]
-.RI [ -v ]
-.RI [ -w ]
-.RI [ -d ]
-.RI [ -1 ]
-.IR user [@ hostname ]
-.RI [ user [@ hostname ]]...
-.SH DESCRIPTION
-.B expn
-will use the SMTP
-.B expn
-and
-.B vrfy
-commands to expand mail aliases.
-It will first look up the addresses you provide on the command line.
-If those expand into addresses on other systems, it will
-connect to the other systems and expand again. It will keep
-doing this until no further expansion is possible.
-.SH OPTIONS
-The default output of
-.B expn
-can contain many lines which are not valid
-email addresses. With the
-.I -aa
-flag, only expansions that result in legal addresses
-are used. Since many mailing lists have an illegal
-address or two, the single
-.IR -a ,
-address, flag specifies that a few illegal addresses can
-be mixed into the results. More
-.I -a
-flags vary the ratio. Read the source to track down
-the formula. With the
-.I -a
-option, you should be able to construct a new mailing
-list out of an existing one.
-.LP
-If you wish to limit the number of levels deep that
-.B expn
-will recurse as it traces addresses, use the
-.I -1
-option. For each
-.I -1
-another level will be traversed. So,
-.I -111
-will traverse no more than three levels deep.
-.LP
-The normal mode of operation for
-.B expn
-is to do all of its work silently.
-The following options make it more verbose.
-It is not necessary to make it verbose to see what it is
-doing because as it works, it changes its
-.BR argv [0]
-variable to reflect its current activity.
-To see how it is expanding things, the
-.IR -v ,
-verbose, flag will cause
-.B expn
-to show each address before
-and after translation as it works.
-The
-.IR -w ,
-watch, flag will cause
-.B expn
-to show you its conversations with the mail daemons.
-Finally, the
-.IR -d ,
-debug, flag will expose many of the inner workings so that
-it is possible to eliminate bugs.
-.SH ENVIRONMENT
-No environment variables are used.
-.SH FILES
-.PD 0
-.B /tmp/expn$$
-.B temporary file used as input to
-.BR nslookup .
-.SH SEE ALSO
-.BR aliases (5),
-.BR sendmail (8),
-.BR nslookup (8),
-RFC 823, and RFC 1123.
-.SH BUGS
-Not all mail daemons will implement
-.B expn
-or
-.BR vrfy .
-It is not possible to verify addresses that are served
-by such daemons.
-.LP
-When attempting to connect to a system to verify an address,
-.B expn
-only tries one IP address. Most mail daemons
-will try harder.
-.LP
-It is assumed that you are running domain names and that
-the
-.BR nslookup (8)
-program is available. If not,
-.B expn
-will not be able to verify many addresses. It will also pause
-for a long time unless you change the code where it says
-.I $have_nslookup = 1
-to read
-.I $have_nslookup =
-.IR 0 .
-.LP
-Lastly,
-.B expn
-does not handle every valid address. If you have an example,
-please submit a bug report.
-.SH CREDITS
-In 1986 or so, Jon Broome wrote a program of the same name
-that did about the same thing. It has since suffered bit rot
-and Jon Broome has dropped off the face of the earth!
-(Jon, if you are out there, drop me a line)
-.SH AVAILABILITY
-The latest version of
-.B expn
-is available through anonymous ftp at
-.IR ftp://ftp.idiom.com/pub/muir-programs/expn .
-.SH AUTHOR
-.I David Muir Sharnoff\ \ \ \ <muir@idiom.com>
diff --git a/contrib/amd/scripts/fix-amd-map.in b/contrib/amd/scripts/fix-amd-map.in
deleted file mode 100755
index 9bbc9b6a21bc..000000000000
--- a/contrib/amd/scripts/fix-amd-map.in
+++ /dev/null
@@ -1,52 +0,0 @@
-#!@PERL@
-#
-# fix an old-syntax amd map to new one
-#
-# takes any number of files on the command line, and produces
-# a fixed map on stdout.
-#
-# Package: am-utils-6.x
-# Author: Erez Zadok <ezk@cs.columbia.edu>
-#
-
-##############################################################################
-### MAINTAINER EDITABLE SECTION
-
-# Mappings of old names to new ones:
-# Update when needed, do not forget commas but not on the last entry!
-# For your convenience, this is the complete list of all OSs that were
-# supported by amd-upl102, in their old names:
-#
-# 386bsd acis43 aix3 aoi aux bsd43 bsd44 bsdi11
-# concentrix dgux fpx4 freebsd hcx hlh42 hpux irix3 irix4 irix5 isc3
-# linux mach2 mach3 netbsd news4 next osf1 pyrOSx riscix riscos
-# rtu6 sos3 sos4 sos5 stellix svr4 u2_2 u3_0 u4_0 u4_2 u4_3 u4_4
-# umax43 utek utx32 xinu43
-#
-%mappings = (
- "sos4", "sunos4",
- "sos5", "sunos5",
- "freebsd", "freebsd2"
-);
-
-##############################################################################
-### DO NOT EDIT ANYTHING BELOW
-
-# This is a trivial parser and works as follows:
-# (1) read each line
-# (2) search of regexps that start with '=', continue with a word to replace
-# and end with a non-value name (whitespace, ';', or newline
-while (<>) {
- # skip trivial lines
- if ($_ =~ /^$/ || $_ =~ /^#/) {
- print;
- next;
- }
- # modify the line if needed
- foreach $m (keys %mappings) {
- $val = $mappings{$m};
- $_ =~ s/=$m([^a-zA-Z0-9_])/=$val$1/g;
- }
- # print the (possibly) modified line
- print;
-}
diff --git a/contrib/amd/scripts/fixrmtab b/contrib/amd/scripts/fixrmtab
deleted file mode 100755
index 33b7bcfdb6ce..000000000000
--- a/contrib/amd/scripts/fixrmtab
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-#
-# Invalidate /etc/rmtab entries for hosts named.
-# Restart mountd for changes to take effect.
-#
-# usage: fixrmtab host1 host2 ...
-#
-# Package: am-utils-6.0
-# Author: Andreas Stolcke <stolcke@icsi.berkeley.edu>
-
-#set -x
-
-RMTAB=/etc/rmtab
-TMP=/tmp/rmtab.$$
-
-if [ ! -f /etc/rmtab ]; then
- exit 0
-fi
-
-for host in $*
-do
- sed -e '/^'$host':/s/^./#/' $RMTAB > $TMP && cp $TMP $RMTAB
-done
-rm -f $TMP
diff --git a/contrib/amd/scripts/fixrmtab.in b/contrib/amd/scripts/fixrmtab.in
deleted file mode 100755
index 23003806e4c0..000000000000
--- a/contrib/amd/scripts/fixrmtab.in
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-#
-# Invalidate /etc/rmtab entries for hosts named.
-# Restart mountd for changes to take effect.
-#
-# usage: fixrmtab host1 host2 ...
-#
-# Package: am-utils-6.x
-# Author: Andreas Stolcke <stolcke@icsi.berkeley.edu>
-
-#set -x
-
-RMTAB=/etc/rmtab
-TMP=/tmp/rmtab.$$
-
-if [ ! -f /etc/rmtab ]; then
- exit 0
-fi
-
-for host in $*
-do
- sed -e '/^'$host':/s/^./#/' $RMTAB > $TMP && cp $TMP $RMTAB
-done
-rm -f $TMP
diff --git a/contrib/amd/scripts/lostaltmail.conf-sample b/contrib/amd/scripts/lostaltmail.conf-sample
deleted file mode 100644
index a20158c14f83..000000000000
--- a/contrib/amd/scripts/lostaltmail.conf-sample
+++ /dev/null
@@ -1,84 +0,0 @@
-# -*- perl -*-
-##############################################################################
-# #
-# CONFIGURABLE VALUES #
-# #
-##############################################################################
-
-$MAILGRUNT="postmaster"; # To whom to send log mail if mail is prefered.
-
-$TMPDIR="/tmp/"; # Place lostmail can do its dirty work.
-
-$LOCAL_LOCK_EXT=".lock"; # Name of file local mailer uses to lock
- # spool file. This the correct setting for
- # /bin/mail
-
-$SYSTEM_FROM_ADDRESS="Mailer-Daemon";
-
-$MAILDIR="/var/alt_mail"; # What directory should I run out of.
-$MAILER='/usr/lib/sendmail -t'; # Which mailer should I use.
-
-$LOCALMAILJUNK='.*~|\#.*|core'; # Files name patterns that might appear in
- # alt_mail and should be ignored. This REGEXP
- # gets or'ed with $MAILJUNK below.
-
-$SMTPHOST='localhost'; # The name of a local host which speaks SMTP
- # and knows *all* your aliases. You probably
- # don't want to change this. If the machine
- # running lost_alt mail doesn't run an SMTP,
- # daemon then something is either wrong or you
- # should be setting `noverify' to prevent
- # SMTP verification.
-
-$HOSTNAME='localhost'; # Hostname to use for SMTP HELO
-
-# Subject of lost log mail message. Must define $MAILGRUNT.
-# I overwrite this variable in the subroutine Clean_up. Please make sure I
-# haven't noodle-headdly forgotten to remove that hack in the distribution!
-# No newline here please. The script will insert it for you.
-$LOG_SUBJECT="Log of lostmail resends";
-
-##############################################################################
-# #
-# DEFAULTED CONFIGURATIONS #
-# #
-##############################################################################
-
-$LOGFILE="$TMPDIR" . "lostlog";
-
-
-# MAILJUNK is a pattern of ignorable alt_mail files which are either common
-# to most platforms or actually produced by this script. You should customize
-# this REGEXP by hacking at $LOCALMAILJUNK above.
-$MAILJUNK='[a-z]\.[0-9]*|\.\.?|lost\+found';
-
-$LOCKEXT=".lostlock"; # our lock file extension. Should not need to
- # modify
-
-$MESSAGE_DELIM="^From[^:]"; # /bin/mail message delimiter. Your milage
- # may differ
-
-$HEADER_BODY_DELIM="\n"; # RFC 822 header-body delimiter.
-
-$RESENT_TO="Resent-To: "; #
-$RESENT_FROM="Resent-From: "; # Resent headers (RFC 822).
-$RESENT_DATE="Resent-Date: "; # You probably don't want to muck with these.
-$RESENT_INFO="X-Resent-Info: "; # (special one to alert folks about mail).
-
-
-##############################################################################
-# #
-# LOSTMAIL DEFINITIONS (DON'T TOUCH) #
-# #
-##############################################################################
-
-$FALSE=0;
-$TRUE=(! $FALSE);
-
-$OK=$TRUE;
-$ABORT_RESEND=2;
-$LOCK_RETRIES=10; # The number of seconds/retries lost mail
- # should wait before requeing or aborting a
- # resend.
-
-TRUE; # Ansures true return from include file.
diff --git a/contrib/amd/scripts/lostaltmail.in b/contrib/amd/scripts/lostaltmail.in
deleted file mode 100755
index 467dedd24e5a..000000000000
--- a/contrib/amd/scripts/lostaltmail.in
+++ /dev/null
@@ -1,658 +0,0 @@
-#!@PERL@ -sw
-#
-# Package: am-utils-6.0
-# Author: James Tanis <jtt@cs.columbia.edu>
-#
-
-############################################################################
-#
-# lostaltmail -- remail files files found alt_mail (or -a argument to hlfsd) to
-# whomever should receive it. This version is for SMTP varient which
-# support VRFY as a non-expanding verifier!!! (sendmail V8 is a an
-# example).
-#
-# Usage: lostaltmail [-debug] [-nomail] [-noverify]
-#
-# GLOBAL VARIABLES (as if you care :-) )
-# Probably a very incomplete list.
-#
-# Everything in the config file for this program *and* ...
-#
-# $debug: set it from the command line with -debug. Does the obvious
-# $nomail: set it from the command line with -nomail. *Not* implied by
-# $debug
-# $currentTO: The addresss we are currently checking on. Actually this is
-# left over from an earlier version of lostaltmail and will hopefully
-# go away.
-# $noverify: set it from the address line. Avoid verification of $currentTO.
-# This should be relatively safe as long as you are willing to
-# endure bounces from mail that cannot be redelivered as opposed to
-# just getting a warning. UNTESTED (but should work).
-#
-# $logopen: state variable indicating weather the log file (should there be
-# one) is in fact open.
-#
-# @allentries: Array of all the directory entries in $MAILDIR
-# @allnames: Array of all *likely* recipients. It is created from @allentries
-# sans junk files (see $MAILJUNK and $LOCALMAILJUNK)
-# @wanderers: Array of all the files associated with a *single* address
-# which might need remailing. Should lostaltmail die unexpectedly,
-# it might leave a temporary file containing messages it was
-# currently trying to deliver. These will get picked and resent
-# later.
-#
-# VRFY: Handle onto SMTP verification channel. Not to be confused with mail
-# delivery; only verification occurs accross this handle.
-#
-############################################################################
-
-##############################################################################
-# #
-# SMTP_SEND #
-# #
-##############################################################################
-#
-# Send a message to the smtp channel. Inserts the necessary NEWLINE if it
-# does not exist;
-# I stole this from myself. It shouldn nott be printing errors to STDERR, but
-# this is a quick hack.
-#
-sub smtp_send {
- local ($msg) = @_;
- local ($length);
-
- $length=length($msg);
-
- if ( $msg !~ /^.*\n$/ ) {
- $msg = $msg . "\n";
- $length++;
- }
-
-
- if ( ! syswrite (VRFY, $msg, $length)) {
- print STDERR "Failing SMTP write: $msg";
- return 0;
- }
-
- return 1;
-}
-
-##############################################################################
-# #
-# SMTP_RECV #
-# #
-##############################################################################
-#
-# Read in lines from SMTP connection and return the final
-# Really hideous -- please excuse.
-#
-sub smtp_recv {
- local ($line,$rin, $win, $ein, $readbuf, $ret);
- $readbuf = "";
-
- $rin = $win = $ein = ''; # Null fd sets,
- vec ($rin, fileno(VRFY), 1) = 1; # Stolen straight from the example;
- $ein = $rin | $win; # This is probably useless
-
-
-LINE_OF_INPUT:
- while (1) { # Read in all the input
-
- if ((select ( $rin, $win, $ein, 600.0))[0] == 0 ) {
- print "select returned -1" if ($debug);
- return -1; # timeout
- }
- sysread (VRFY, $readbuf, 1024);
- chop ($readbuf);
-
- foreach $line ( split('\n', $readbuf)) {
-
- # This loop is actually needed since V8 has a multi-line greet.
-
- ( $line =~ /^(\d\d\d).*/ && ($SMTP_retval=$1)) ||
- warn "Badly formed reply from SMTP peer: $line\n";
-
- # Space after return code indicates EOT
-
- if ($line =~ /^\d\d\d /) {
- $ret = $line; # Oddly $line is in a different context here;
- # and thus we need to export it out of the
- # while loop via $ret.
- last LINE_OF_INPUT;
- }
- } # End of read.
- } # End of input.
-
- return $ret;
-}
-
-
-
-
-##############################################################################
-# #
-# LOG_INFO #
-# #
-##############################################################################
-#
-#
-# Opens appropriate logging file -- STDOUT (cron) or temp file (mail).
-#
-sub Log_info {
- local($message) = @_;
-
- if ( !$logopened ) {
- if ( $MAILGRUNT eq "" || $debug) {
- open (LOGFILE, ">-") || die "Unable to open stdout";
- }
- else {
- # Snarf the log into a tmp file for final mailing to MAILGRUNT
- $logfile = $LOGFILE . ".$$";
- open (LOGFILE, (">". "$logfile")) || die "Unable to create log file";
- }
- }
-
- $logopened=1; # Note that the log is now open
-
- # Heart of the function.
- print LOGFILE "$message";
-
- print LOGFILE "\n" if ( index($message,"\n") == -1 );
-}
-
-##############################################################################
-# #
-# LOCK_FILE #
-# #
-##############################################################################
-
-#
-# Tries to grab a lock on the supplied file name.
-# Spins for a bit if it can't on the assumption that the lock will be released
-# quickly. If it times out and it's allowed to requeue, it will defer
-# until later, other wise write a message to loginfo.
-
-# If a recurring error or really unexpected situation arrises, return
-# ABORT_RESEND
-#
-# PARAMETERS
-# mailfile: path to the file to resend.
-# should_requeue: BOOLEAN - TRUE if the mailfile should be put on the
-# queue for a later retry if we can not finish
-# now.
-
-sub Lock_file {
-
- local($mailfile,$should_requeue,$i,$new_lost_file) = @_;
-
-# We need to rename the current mailbox so that mail can loop back into it if
-# the resent mail just gets looped right back to us.
- $new_lost_file = $mailfile . ".$$";
-
-# make a tmpfile name based on mailfile;
- $lostlockfile = "$mailfile" . "$LOCKEXT";
-
- if ( ! open(LOCKFILE, (">" . $lostlockfile)) ) {
- printf(STDERR "Could not create lostlockfile for %s: %s\n", $mailfile,$!);
- return $ABORT_RESEND;
- }
- close(LOCKFILE);
-
- $maillockfile = "$mailfile" . "$LOCAL_LOCK_EXT";
-
- for ($i=0; $i < $LOCK_RETRIES && ! link ($lostlockfile, $maillockfile);
- $i++) {
- sleep(1);
- }
-
- unlink($lostlockfile); # No matter what eliminate our cruft
-
- if ( $i == $LOCK_RETRIES ) {
- &Log_info("Could not grab lock on: " . "$mailfile" . " :timed out");
- if ( $should_requeue ) {
- &Log_info("Requeing " . "$mailfile" . " for later retry");
- $retry_list .= " $mailfile";
- }
- else {
- &Log_info("Giving up on: " . "$mailfile");
- }
-
- return $ABORT_RESEND;
- }
-
- # We created the link and therefore have the lock
-
- if (rename ($mailfile, $new_lost_file) == 0 ){
- # Failed to rename file -- this is serious.
- unlink($maillockfile);
- return $ABORT_RESEND;
- }
-
- unlink($maillockfile);
- return $new_lost_file;
-
-}
-
-##############################################################################
-# #
-# PARSE NEXT MAIL MESSAGE #
-# #
-##############################################################################
-#
-# Parameters:
-# mailfile: handle of mailfile to use.
-#
-# Parses the next message in the mail file and inserts it in $current_msg
-#
-sub Get_next_msg {
- local($mailfile,$found_body_delimiter) = @_;
-
- # If this is the first message in the spool file, read the first line
- # otherwise use the MESSAGE_DELIM line from the previous message (which we
- # were forced to overread).
-
- $done=$FALSE;
- $found_body_delimiter=$FALSE;
-
- # This if eats the very first "From " line and should never fire again.
- if ( ! defined $current_msg ) {<$mailfile>};
- undef ($current_msg); # Erase the old message.
-
-
- # Read the mailfile and pass through all the lines up until the next
- # message delimiter. Kill any previous resend headers.
- while ( <$mailfile> ) {
- last if (/$MESSAGE_DELIM/);
- next if ( !$found_body_delimiter && /[Rr][Ee][Ss][Ee][Nn][Tt]-.+:/);
- if ( !$found_body_delimiter && /^$HEADER_BODY_DELIM/) {
- &Splice_in_resent_headers();
- $found_body_delimiter=$TRUE;
- }
- if (defined($current_msg)) {
- $current_msg .= $_;
- } else {
- $current_msg = $_;
- }
- }
-
- # Return TRUE when we have hit the end of the file.
- if (!defined($_) || $_ eq "" ) {
- return $TRUE;
- } else {
- return $FALSE;
- }
-}
-
-##############################################################################
-# #
-# SPLICE IN RESENT_HEADERS #
-# #
-##############################################################################
-#
-# Insert the Resent- headers at the *current location* of the message stream
-# (In Engish, print out a few Resent-X: lines and return :-) )
-# In addition splice in the X-resent-info: header.
-
-#
-# Paremters: None.
-# Return: None
-#
-sub Splice_in_resent_headers {
- local($date,$utctime,$weekday,$time,$month,$hostname);
-
- $current_msg .= "$RESENT_TO" . "$currentTO" . "\n";
- $current_msg .= "$RESENT_FROM" . "$SYSTEM_FROM_ADDRESS" . "\n";
-
- # Calculate date and time. It is a bit of a shame to do this each time
- # the time needs to be acurate.
-
- @utctime=gmtime(time);
-
- $weekday=(Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$utctime[6]];
-
-
- # If the minutes or second do not take two columns each, patch em up.
- if ( $utctime[1] < 10 ) {
- if ( $utctime[0] < 10 ) {
- $time=sprintf("%d:0%d:0%d",$utctime[2],$utctime[1],$utctime[0]);
- }
- else {
- $time=sprintf("%d:0%d:%d",$utctime[2],$utctime[1],$utctime[0]);
- }
- }
- else {
- if ( $utctime[0] < 10 ) {
- $time=sprintf("%d:%d:0%d",$utctime[2],$utctime[1],$utctime[0]);
- }
- else {
- $time=sprintf("%d:%2d:%2d",$utctime[2],$utctime[1],$utctime[0]);
- }
- }
-
- $month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$utctime[4]];
-
- # Ensure Y2K format
- $date=sprintf("%s, %d %s %d %s UTC", $weekday, $utctime[3], $month, $utctime[5]+1900, $time);
-
- $current_msg .= "$RESENT_DATE" . $date . "\n";
-
- if ( defined $RESENT_INFO && $RESENT_INFO ne "") {
- $hostname=`uname -n`;
- $current_msg .= "$RESENT_INFO" . "Lost mail resent from ". $hostname;
- }
-
- return;
-}
-
-##############################################################################
-# #
-# DO_REMAIL #
-# #
-##############################################################################
-#
-# Actually resends the mail. Talks to the process configured as $MAILER
-# We need better handling.
-#
-sub Do_remail {
- open (MAILER, "| $MAILER $currentTO") || return $ABORT_RESEND;
- print MAILER $current_msg;
- close (MAILER);
-}
-
-##############################################################################
-# #
-# CLEAN_UP #
-# #
-##############################################################################
-#
-# Clean up my messes.
-#
-sub Clean_up {
- local ($hostname);
-
- # Ugly local hack that you should never have seen, but I forgot to
- # remove. Hopefully it did not kill you (I tried as you see), but you
- # should eiter remove or update it for yourself. I find the message
- # subject needs to have the hostname to be useful.
- #
- chop ($hostname=`uname -n`);
- $LOG_SUBJECT="$LOG_SUBJECT from $hostname" if ( $hostname =~ /.*\.cs\.columbia\.edu/ );
- #
- # End of ugly local hack
-
- # Mail any log info to MAILGRUNT.
- if (defined($logfile) && $logfile ne "" ) {
- close (LOGFILE); # Flush logfile output.
- if ( -s $logfile ) {
- open (MAILER, "| $MAILER $MAILGRUNT");
-
- print MAILER "To: $MAILGRUNT\n";
- print MAILER "Subject: $LOG_SUBJECT\n";
- print MAILER "$HEADER_BODY_DELIM";
-
- open (LOGFILE, "< $logfile");
-
- while (<LOGFILE>) {
- print MAILER $_;
- }
- close (MAILER);
- close (LOGFILE);
- }
-
- unlink($logfile);
- }
- exit(0);
-}
-
-
-##############################################################################
-# #
-# COLLECT_WANDERERS #
-# #
-##############################################################################
-
-#
-# Collects other files that appear to be mail file for the $currentTO
-# but were not remailed successfully.
-#
-# Parameters: none (but uses $currentTO)
-# Return: True if a old mail directory is found. False otherwise.
-# Side effects: $wanderers set.
-#
-sub Collect_wanderers {
-
- undef (@wanderers);
-
- # Slurp in the directory and close.
-
- return ($found);
-}
-
-#############################################################################
-# #
-# REMAIL ALL #
-# #
-#############################################################################
-
-#
-# Takes an array of files that all seem to share a common repcipient and
-# remails them if possible.
-#
-# Parameters: None (uses @wanderers).
-#
-sub Remail_all {
- local($file,$i);
-
- $i=0;
- foreach $file (@wanderers) {
- if ( !open (LOSTFILE, "< $file")) {
- &Log_info("Could not open " . "$file" . " for remailing");
- next;
- }
-
- do { # Power loop!
- $done = &Get_next_msg(LOSTFILE); # Retrieve the next message...
- &Do_remail; # and remail it.
- } until $done;
- undef ($current_msg); # Erase the final remailed message.
-
- close(LOSTFILE); # Tidy up.
-
- unlink ($file); # Remove the remailed file
- $i++;
- }
-
-}
-
-#############################################################################
-# #
-# CHECK_USER #
-# #
-#############################################################################
-
-#
-# Checks the password tables for the uid of $currentTO. If the user is
-# uid 0 (ie *supposed* to get mail in altmail) or unknown the resend is
-# aborted.
-#
-#
-sub Check_user {
- local (@passwdinfo);
- undef (@passwdinfo);
-
- if (!$noverify && !&vrfy_user($currentTO) ) {
- &Log_info("Possible non user mail file: $currentTO");
- return $ABORT_RESEND;
- }
-
- @passwdinfo = getpwnam($currentTO);
-
- print "Non user mailable mail: Name: $currentTO\n"
- if ( $debug && ! defined @passwdinfo );
-
- return !$ABORT_RESEND if ( ! defined @passwdinfo ); # A non user but evidently mailable
-
- print "Check User(): Name: $currentTO -- UID: $passwdinfo[2]\n" if ($debug);
-
- return $ABORT_RESEND if ( $passwdinfo[2] == 0 );
-
-
- return !$ABORT_RESEND;
-}
-
-#############################################################################
-# #
-# VRFY USER #
-# #
-#############################################################################
-#
-# Use SMTP VRFY to insure that argument is in fact a legal mail id.
-# Boolean: TRUE if mailable account, FALSE if not.
-
-sub vrfy_user {
-
- local ($mailname,$repl) = @_;
-
- if ( !&smtp_send("vrfy $mailname") ) {
- &Log_info("Failed sending to vrfy smtp command for: $mailname");
- return 0;
- }
-
- $repl = &smtp_recv;
-
- print "VRFY REPLY: $repl\n" if ($debug);
-
- return ( $repl =~ /^2\d\d/ );
-
-
-}
-
-
-#############################################################################
-# #
-# MAIN PROC #
-# #
-#############################################################################
-
-# dummy code to shut up perl -w
-$debug = 0 if !defined($debug);
-print $nomail if $debug > 1;
-print $RESENT_FROM if $debug > 1;
-print $logopen if $debug > 1;
-print $LOCAL_LOCK_EXT if $debug > 1;
-print $RESENT_TO if $debug > 1;
-print $LOCKEXT if $debug > 1;
-print $RESENT_DATE if $debug > 1;
-print $MESSAGE_DELIM if $debug > 1;
-print $SMTP_retval if $debug > 1;
-print $found if $debug > 1;
-print $retry_list if $debug > 1;
-print $MAILJUNK if $debug > 1;
-print $noverify if $debug > 1;
-print $SYSTEM_FROM_ADDRESS if $debug > 1;
-
-# BEGIN: stuff
-$prefix="@prefix@";
-$CONFIGDIR="@sysconfdir@"; # Directory where global config lives
-require "$CONFIGDIR/lostaltmail.conf" if (-f "$CONFIGDIR/lostaltmail.conf");
-require "/etc/global/lostaltmail.conf" if (-f "/etc/global/lostaltmail.conf");
-require "/etc/os/lostaltmail.conf" if (-f "/etc/os/lostaltmail.conf");
-require "/etc/local/lostaltmail.conf" if (-f "/etc/local/lostaltmail.conf");
-
-
-require "ctime.pl";
-use Socket;
-#require "sys/socket.ph";
-
-# SET some initial state variales
-$logopen = 0;
-
-#
-# Change to alt_dir
-#
-# Important!! This directory should be local. Folks will be responsible
-# for finding this out for themselves.
-#
-if (!defined($MAILDIR) || $MAILDIR eq "") {
- die "MAILDIR must be defined\n";
-}
-chdir ( $MAILDIR ) || die "Cannot change to $MAILDIR (`x' bit not set?)";
-
-#
-# slurp in directory
-#
-opendir (MAIL, ".") || die "Cannot open $MAILDIR (`r' bit not set?)";
-@allentries= readdir (MAIL);
-closedir (MAIL);
-@allnames = grep (!/$LOCALMAILJUNK|$MAILJUNK/, @allentries);
-
-# Open chanel to SMTP for verification -- unless this option is
-# configured off.
-
-if ( ! $noverify ) {
- local($addr, $port,$sockaddr);
-
- socket (VRFY, &AF_INET, &SOCK_STREAM, 0) ||
- die "Could not create TCP socket (SMTP channel)";
-
- $addr = (gethostbyname($SMTPHOST))[4]; # Just use the first addr
-
- die "Could not obtain STMP host ($SMTPHOST) address"
- if ( $addr eq "" );
-
- $port = (getservbyname('smtp','tcp'))[2]; # Get smtp port.
- die "Could not obtain SMTP port number" if (!defined($port));
-
- printf("SMTP: address: %s port: $port\n",
- join ('.',unpack('C4',$addr))) if ($debug);
-
- $sockaddr = sockaddr_in($port, $addr);
-
- printf("Sockaddr: %s\n", join (' ',unpack('C14',$sockaddr))) if ($debug);
-
- connect (VRFY, $sockaddr) ||
- die "Could not connect to SMTP daemon on $SMTPHOST";
-
- print "Establshed SMTP channel\n" if ($debug);
-
- &smtp_recv; # Greet wait
- &smtp_send("helo $SMTPHOST"); # Helo message for picky SMTPs
- &smtp_recv; # Helo reply
-
- # Connection is up and ready to VRFY
-}
-
-# main stuff starts here
-foreach $currentTO (@allnames) {
- next if ( &Check_user == $ABORT_RESEND);
-
- # just delete the file if too small to be real mail
- if ((stat($currentTO))[7] < 5) {
- print "Too small to be real mail, unlinking $currentTO" if $debug;
- unlink $currentTO;
- }
-
- undef (@wanderers); # Just reset this at each pass.
- @wanderers=grep (/$currentTO\.\d+/, @allentries);
-
- $remail_file = &Lock_file($currentTO,$FALSE); # Need to lock the spool.
-
- next if ( $remail_file eq $ABORT_RESEND); # Could not get that lock
-
- push (@wanderers, $remail_file); # Try to resend "old" files.
- print "List to remail: @wanderers\n" if ($debug);
- # check if there is something to remail
- &Remail_all if ( defined @wanderers && !$nomail);
-}
-
-# this stuff should run at the end
-foreach $file (grep (/$LOCALMAILJUNK/,@allentries)) {
-
- if ($debug) {
- print "Would unlink $file\n" if ($debug);
- } else {
- unlink $file if (-f $file);
- }
-
-}
-&Clean_up; # Do a clean exit.
diff --git a/contrib/amd/scripts/redhat-ctl-amd.in b/contrib/amd/scripts/redhat-ctl-amd.in
deleted file mode 100755
index 4d00d472c24a..000000000000
--- a/contrib/amd/scripts/redhat-ctl-amd.in
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/bin/bash
-#
-# Version: 1.3
-#
-# chkconfig: - 72 28
-# description: Runs the automount daemon that mounts devices and NFS hosts \
-# on demand.
-# processname: amd
-# config: /etc/amd.conf
-#
-
-# we require the /etc/amd.conf file
-[ -f /etc/amd.conf ] || exit 0
-[ -f /etc/sysconfig/amd ] || exit 0
-
-# Source function library.
-. /etc/init.d/functions
-
-# Recover AMDOPTS from /etc/sysconfig/amd.
-if [ -f /etc/sysconfig/amd ] ; then
- . /etc/sysconfig/amd
-fi
-
-RETVAL=0
-prog=amd
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-amd=@sbindir@/amd
-
-start() {
- echo -n "Starting $prog: "
- daemon $amd -F /etc/amd.conf $AMDOPTS $OPTIONS $MOUNTPTS
- RETVAL=$?
- echo
- [ $RETVAL = 0 ] && touch /var/lock/subsys/amd
- return $RETVAL
-}
-
-stop() {
-
- echo -n "Stopping $prog: "
- # modeled from /usr/sbin/ctl-amd
- pid=`/usr/sbin/amq -p 2>/dev/null`
- if [ "$pid" = "" ] ; then
- # amq -p did not give pid, so try ps
- pid=`ps acx 2>/dev/null | grep "amd" | sed -e 's/^ *//' -e 's/ .*//'`
- fi
- if [ "$pid" = "" ] ; then
- failure "amd shutdown pid"
- echo
- return 1
- fi
- kill $pid
- # and this part is from wait4amd2die
- delay=5
- count=6
- i=1
- maxcount=`expr $count + 1`
- while [ $i != $maxcount ]; do
- # run amq
- /usr/sbin/amq > /dev/null 2>&1
- if [ $? != 0 ]
- then
- # amq failed to run (because amd is dead)
- success "amd shutdown"
- rm -f /var/lock/subsys/amd
- echo
- return 0
- fi
- sleep $delay
- i=`expr $i + 1`
- done
- failure "amd shutdown (still up)"
- echo
- return 1
-}
-# See how we were called.
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- status)
- status $amd
- ;;
- restart)
- stop
- start
- ;;
- condrestart)
- if [ -f /var/lock/subsys/amd ]; then
- stop
- start
- fi
- ;;
- reload)
- action "Reloading $prog:" killall -HUP $amd
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"
- exit 1
-esac
-
-exit 0
diff --git a/contrib/amd/scripts/test-attrcache.in b/contrib/amd/scripts/test-attrcache.in
deleted file mode 100755
index 061308b42dbe..000000000000
--- a/contrib/amd/scripts/test-attrcache.in
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/bin/sh
-# Script to test the attribute cache behavior of the local OS client.
-# If this script fails, it means that Amd cannot turn off the attrcache
-# reliably on this host, and Amd therefore may not run reliably. See
-# the README.attrcache file distributed with this am-utils.
-# -Erez Zadok, September 29, 2005
-
-# set PATH (must install am-utils first)
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-PATH=@sbindir@:@bindir@:/usr/ucb:/usr/bin:/bin:${PATH}
-export PATH
-
-# test if amd is running
-amq -p > /dev/null 2>&1
-if test $? = 0
-then
- echo "### Amd already running... please shutdown Amd first"
- exit 1
-fi
-
-mapfile="/tmp/amd.testmap.$$"
-logfile="/var/log/amd"
-delay=1
-a=/a
-
-CreateMap1 () {
- echo "### Creating correct map"
- cat - >$mapfile <<EOF
-a type:=link;fs:=/tmp/a
-EOF
-}
-
-CreateMap2 () {
- echo "### Creating weird map"
- cat - >$mapfile <<EOF
-a type:=link;fs:=/tmp/b
-EOF
-}
-
-StopAMD () {
- ctl-amd stop
-# do not delete files we may need to use to debug Amd
-# rm -f /tmp/a /tmp/b $mapfile $logfile
-}
-
-touch /tmp/a
-touch /tmp/b
-
-CreateMap1
-echo amd -x all -D all -r -l $logfile $a $mapfile -cache:=mapdefault,sync
-amd -x all -D all -r -l $logfile $a $mapfile -cache:=mapdefault,sync
-sleep 3 # give amd chance to start properly
-amq
-inode_a=`ls -lLi /tmp/a | awk '{print $1}'`
-inode_b=`ls -lLi /tmp/b | awk '{print $1}'`
-ls -lLi $a/a
-ls -lLi $a/b
-ls -l $mapfile
-
-# how many times to try until we call it a success...
-maxtry=10
-while test $maxtry -gt 0
-do
- echo "$maxtry tries left ..."
- let maxtry=maxtry-1
- amq
- CreateMap1
- sleep $delay
-
- ls -l $mapfile
- echo "### looking at a... should get a"
- ino=`ls -lLi $a/a | awk '{print $1}'`
- if test -z "$ino"
- then
- ls -li $a/a
- amq
- amq -m
- stat $a
- echo "a link does not exist!"
- StopAMD
- exit 1
- fi
- if test $ino -ne $inode_a
- then
- ls -li $a/a
- amq
- amq -m
- stat $a
- echo "a link does not point to A!"
- StopAMD
- exit 1
- fi
-
-# Here is the main trick we try: force amd to flush one entry, then
-# change the amd map on disk, and then see if the kernel will have
-# flushed the attribute cache; if it did, then Amd will see the
-# correctly changed map entry.
-
- amq -u $a/a
- sleep $delay
- stat $a
-
- CreateMap2
- sleep $delay
-
- ls -l $mapfile
- echo "### looking at a... should get b"
- ino=`ls -lLi $a/a | awk '{print $1}'`
- if test -z "$ino"
- then
- ls -li $a/a
- amq
- amq -m
- stat $a
- echo "a link does not exist!"
- StopAMD
- exit 1
- fi
- if test $ino -ne $inode_b
- then
- ls -li $a/a
- amq
- amq -m
- stat $a
- echo "a link does not point to B!"
- StopAMD
- exit 1
- fi
-
- amq -u $a/a
- sleep $delay
- stat $a
-done
-StopAMD
diff --git a/contrib/amd/scripts/wait4amd.in b/contrib/amd/scripts/wait4amd.in
deleted file mode 100755
index 5e6c33a579c4..000000000000
--- a/contrib/amd/scripts/wait4amd.in
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/sh
-# wait for amd to start up and then execute program
-# usage: wait4amd <hostname> [<command> [args ...]]
-# If only hostname is supplied, command defaults to rsh $hostname
-#
-# Package: am-utils-6.x
-# Author: Erez Zadok <ezk@cs.columbia.edu>
-
-#set -x
-
-if [ "X$1" = "X" ]; then
- echo "Usage: wait4amd <hostname> [<command> [args ...]]"
- exit 1
-else
- hostname=$1
- shift
-fi
-
-# set path
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-PATH=@sbindir@:@bindir@:${PATH}
-export PATH
-
-while true
-do
- amq -h $hostname > /dev/null 2>&1
- if [ $? != 0 ]
- then
- # failed
- echo "Amd not up. Sleeping..."
- sleep 5;
- else
- echo "Amd is active on host $hostname!"
- cmd=$*
- if [ -z "${cmd}" ]
- then
- cmd="rlogin $hostname"
- fi
- echo "Running: $cmd"
- $cmd
- echo "Sleep 1 second"
- sleep 1
- fi
-done
diff --git a/contrib/amd/scripts/wait4amd2die.in b/contrib/amd/scripts/wait4amd2die.in
deleted file mode 100755
index 94a08513f889..000000000000
--- a/contrib/amd/scripts/wait4amd2die.in
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-# wait for amd to die on local host before returning from program.
-# Usage: wait4amd2die [delay [count]]
-# If not specified, delay=5 seconds and count=6 (total 30 seconds)
-# If at end of total delay amd is till up, return 1; else return 0.
-#
-# Package: am-utils-6.x
-# Author: Erez Zadok <ezk@cs.columbia.edu>
-
-#set -x
-
-# set path
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-PATH=@sbindir@:@bindir@:/usr/bin:/bin:${PATH}
-export PATH
-
-# how long to wait?
-if test -n "$1"
-then
- delay=$1
-else
- delay=3
-fi
-# how many times to delay
-if test -n "$2"
-then
- count=$2
-else
- count=10
-fi
-
-i=1
-maxcount=`expr $count + 1`
-while [ $i != $maxcount ]; do
- # run amq
- @sbindir@/amq > /dev/null 2>&1
- if [ $? != 0 ]
- then
- # amq failed to run (because amd is dead)
- echo "wait4amd2die: amd is down!"
- exit 0
- fi
- echo "wait4amd2die: delay $delay sec ($i of $count)..."
- sleep $delay
- i=`expr $i + 1`
-done
-echo "wait4amd2die: amd is still up..."
-exit 1
diff --git a/contrib/amd/tasks b/contrib/amd/tasks
deleted file mode 100644
index 24b6834cba6a..000000000000
--- a/contrib/amd/tasks
+++ /dev/null
@@ -1,111 +0,0 @@
- AM-UTILS-6.1 TASKS TODO
-
-Please volunteer to do any of the following:
-
-- autofs support: see README.autofs for details.
-
-- deal with everything that has XXX on it in the sources
-- documentation update ("XXX: FILL IN" sections).
-
-- compatibility with Sun's automount maps?
- should be easier via the amd.conf file to specify type of map
-
-- convert to using my own rpcgen .x files for amq/amq/nfs (v2 and v3)
-
-- use packaging info for various OSs (such as RPM, Redhat Package Manager)
-
-- $mindelay and $maxdelay in milliseconds
-
-- multiple nfsl should be matched if one matched and nfs mount failed. fall
- through.
-- support multiple "fail-over read-only" NFS mounts in Solaris 2.6+.
-
-- random nfs rhost:={srv1, srv2, srv3}
-
-- nfslx, same as nfsl, but using linkx
-
-- loadable info_*, amfs_*, and ops_* modules (lazy evaluation).
-
-- hlfsd should daemonize even if -DDEBUG, then use -D nofork
-
-- fixmount should use generic code from transp/transp_{tli,sockets}.c
-
-- reverse notion of -F and other cmd-line options, so they override the
- amd.conf file (right now amd.conf overrides cmd-line options).
-
-- add am-utils URL and COPYRIGHT to all distributed scripts and sources and
- programs etc. also to amq -v output.
-
-- ion: browsable_dirs only works for nis if in [global] broken if it is file
- maps.
-
-- browsable 'auto' style maps.
-
-- mention signals in amd man page
-
-- ALLOWED_MOUNT_TIME of 40 seconds is way too long!
-- detecting down'ed hosts faster: use default portmap TTL variables?
-- push get_nfs_version() down into a child process
-
-- type:=program should not require umount command. can use default
- umount(). it works for smbmount/umount.
-
-- document var[0-7] variables/selectors
-
-- need a way to export a nfs-mount point after it is being mounted (jukebox
- mounts). can do this with type:=program.
-
-- support port=n, for machines that use NFS on a different port
-
-- nfsl may be buggy when fs:= is specified explicitly (lockup?)
-
-- y2k: amq /home (mounted time uses YY instead of YYYY)
-
-- new amd.conf option to disable amq listener altogether (security)
- Should be available even if DEBUG is off.
-
-- new amd.conf option dynamic_system_params to recompute osver, karch,
- etc. from uname() dynamically.
-
-- solaris 8 doesn't pick up hsfs/pcfs/etc *_args structures and mount flags
-
-- avoid having to compile ops_nfs3.o
-
-- linux support for ext3
-
-- be able to pass generic mount options to systems w/ a mount(2) that
- supports it (Linux). Perhaps genopt="foo,bar" syntax.
-
-- support several different nfs servers inside one nfsx entry
-
-- reimplement the "parallel mounting" for multiple matching sub-entries
-
-- fix amd.conf parser so it can parse key=value without spaces around the
- "=" sign. Note this isn't so trivial because 'value' may include "="
- signs.
-
-- NFSv4 support (such a short "tasks" entry given how much work it is :-)
-
-
-* documentation
-- document what can and what can't be a top-level mount type (i.e. a
- map-backed or map-holding type). Currently that's toplvl, auto, and
- direct.
-- document how to add a direct map to amd.conf.
-
-* autofs stuff
-Linux:
-- host mounts broken with autofs v3
-- nfsx status unknown
-- local filesystems (ufs, etc) status unknown
-
-Solaris:
-- host mounts status unknown
-- nfsx status unknown
-- local filesystems (ufs, etc) status unknown
-
-FreeBSD:
-- just do it
-
-All:
-- mntfs->mf_fo->opt_fs can contain garbage sometimes??
diff --git a/contrib/amd/vers.m4 b/contrib/amd/vers.m4
deleted file mode 100644
index 7343910d5f2d..000000000000
--- a/contrib/amd/vers.m4
+++ /dev/null
@@ -1 +0,0 @@
-[6.1.5]dnl
diff --git a/contrib/amd/wire-test/wire-test.8 b/contrib/amd/wire-test/wire-test.8
deleted file mode 100644
index 539a849ae451..000000000000
--- a/contrib/amd/wire-test/wire-test.8
+++ /dev/null
@@ -1,88 +0,0 @@
-.\"
-.\" Copyright (c) 1997-2006 Erez Zadok
-.\" Copyright (c) 1990 Jan-Simon Pendry
-.\" Copyright (c) 1990 Imperial College of Science, Technology & Medicine
-.\" Copyright (c) 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jan-Simon Pendry at Imperial College, London.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgment:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" %W% (Berkeley) %G%
-.\"
-.\" $Id: wire-test.8,v 1.10.2.1 2006/01/02 18:48:26 ezk Exp $
-.\"
-.TH WIRE-TEST 8 "26 Feb 1993"
-.SH NAME
-wire-test \- test your network interfaces and local IP address
-.SH SYNOPSIS
-.B wire-test
-[
-.I host
-]
-.SH DESCRIPTION
-.LP
-.B wire-test
-is used to find out what amd thinks are the first two network
-interfaces and network names/numbers used, as well as the IP address
-used for amd to NFS-mount itself.
-
-If
-.I host
-is specified, then
-.B wire-test
-will test for the working combinations of NFS protocol and version from
-the current client to the NFS server
-.I host.
-If not specified,
-.I host
-defaults to "localhost".
-
-.SH "SEE ALSO"
-.BR amd (8).
-.LP
-``am-utils''
-.BR info (1)
-entry.
-.LP
-.I "Linux NFS and Automounter Administration"
-by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001).
-.LP
-.I http://www.am-utils.org
-.LP
-.I "Amd \- The 4.4 BSD Automounter"
-.SH AUTHORS
-Erez Zadok <ezk@cs.sunysb.edu>, Computer Science Department, Stony Brook
-University, Stony Brook, New York, USA.
-.P
-Other authors and contributors to am-utils are listed in the
-.B AUTHORS
-file distributed with am-utils.
diff --git a/contrib/amd/wire-test/wire-test.c b/contrib/amd/wire-test/wire-test.c
deleted file mode 100644
index bcaaf5a31519..000000000000
--- a/contrib/amd/wire-test/wire-test.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 1997-2006 Erez Zadok
- * Copyright (c) 1990 Jan-Simon Pendry
- * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry at Imperial College, London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgment:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *
- * File: am-utils/wire-test/wire-test.c
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-#include <am_defs.h>
-
-#define STRMAX 100
-
-char hostname[MAXHOSTNAMELEN + 1];
-
-
-int
-main(int argc, char **argv)
-{
- char *networkName1, *networkNumber1;
- struct in_addr myipaddr; /* (An) IP address of this host */
- char *testhost, *proto, *tmp_buf;
- int nv, ret;
- struct sockaddr_in *ip;
- struct hostent *hp = 0;
-
- am_set_progname(argv[0]);
-
- if (gethostname(hostname, sizeof(hostname)) < 0) {
- perror(argv[0]);
- exit(1);
- }
- hostname[sizeof(hostname) - 1] = '\0';
-
- /* get list of networks */
- getwire(&networkName1, &networkNumber1);
- tmp_buf = print_wires();
- if (tmp_buf) {
- fprintf(stderr, "%s", tmp_buf);
- XFREE(tmp_buf);
- }
-
- /* also print my IP address */
- amu_get_myaddress(&myipaddr, NULL);
- fprintf(stderr, "My IP address is 0x%x.\n", (unsigned int) htonl(myipaddr.s_addr));
-
- /*
- * NFS VERSION/PROTOCOL TESTS:
- * If argv[1] is specified perform nfs tests to that host, else use
- * localhost.
- */
- if (argc > 1)
- testhost = argv[1];
- else
- testhost = "localhost";
- hp = gethostbyname(testhost);
- if (!hp) {
- fprintf(stderr, "NFS vers/proto failed: no such hostname \"%s\"\n", testhost);
- exit(1);
- }
- ip = (struct sockaddr_in *) xmalloc(sizeof(struct sockaddr_in));
- memset((voidp) ip, 0, sizeof(*ip));
- /* as per POSIX, sin_len need not be set (used internally by kernel) */
- ip->sin_family = AF_INET;
- memmove((voidp) &ip->sin_addr, (voidp) hp->h_addr, sizeof(ip->sin_addr));
- ip->sin_port = htons(NFS_PORT);
-
- xlog_level = 0; /* turn off debugging */
- fprintf(stderr, "NFS Version and protocol tests to host \"%s\"...\n", testhost);
- proto = "udp";
- for (nv=2; nv<=3; ++nv) {
- fprintf(stderr, "\ttesting vers=%d, proto=\"%s\" -> ", nv, proto);
- ret = get_nfs_version(testhost, ip, nv, proto);
- if (ret == 0)
- fprintf(stderr, "failed!\n");
- else
- fprintf(stderr, "found version %d.\n", ret);
- }
-
- proto = "tcp";
- for (nv=2; nv<=3; ++nv) {
- fprintf(stderr, "\ttesting vers=%d, proto=\"%s\" -> ", nv, proto);
- ret = get_nfs_version(testhost, ip, nv, proto);
- if (ret == 0)
- fprintf(stderr, "failed!\n");
- else
- fprintf(stderr, "found version %d.\n", ret);
- }
-
- exit(0);
- return 0; /* should never reach here */
-}