Index: contrib/amd/AUTHORS =================================================================== --- contrib/amd/AUTHORS +++ /dev/null @@ -1,427 +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 - -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 - -Co-maintainer of am-utils since late 1999: Linux and Solaris autofs support, -Linux NFSv3 support, major code reorganization, etc... - -* Randall S. Winchester - -May 7, 1997: contributed a special version of upl102 that included NFS V.3 -support. Some of the code was contributed by Christos Zoulas -. 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 - -Back in 1995, contributed code for linux. A new parser for file system -specific options that only exist under linux. - -* Leif Johansson - -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 - -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 - -July, 6 1997: contributed patches to hesiod on bsdi3. - -* Tom Schmidt - -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 - -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 - -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 -and Dominik Kubla . - -* Rainer Orth - -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 - -August 25, 1997: make amd work when talking to NIS+ servers in NIS -compatibility mode. Fix originally came from Matthieu Herrb -. - -* Chris Metcalf - -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 - -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 - -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 - -August 10, 1997: netbsd and other bsd systems have a mask flag for -pcfs_args (msdos mount). - -* Christos Zoulas - -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 - -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 - -November 14, 1997: typo in the subscription instructions to amd-dev. - -* Guntram Wolski - -November 15, 1997: pointed out mismatching documentation for the -o option. - -* Michael Hucka - -January 11, 1997: pointed out reversed definition of NFS mount options vers -and proto. - -* Albert Chin - -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 - -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 - -January 30, 1998: minor typo fixed to tftp example in am-utils.texi. - -* Donald Buczek - -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 - -April 20, 1998: allow arbitrary number of interfaces in wire listing. - -* David O'Brien - -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 - -October 29, 1998: swap arguments to kill(2) in amd.c. - -* Mike Mitchell - -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" - -December 3, 1998: case insensitive host name match for nfsl. - -* David Wolfskill -January 28, 1999: don't turn on/off noconn option if it was already in that -state. - -* Jeffrey C Honig -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 -March 26, 1999: ensure lostaltmail displays Y2K compliant dates. - -* Jon Peatfield -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 -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 -July 26, 1999: added NFS3 support for AIX mounting. - -* Christophe Kalt -July 14, 1999: add netgrpd() syntax function which uses FQHN. - -* Andrew J. Korty -September 5, 1999: pawd works for type:=nfsl. - -* Nick Williams -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 -November 16, 1999: fix to ldap code so repeated calls to string2he don't -corrupt the string passed. - -* Amitha Perera -December 9, 1999: detect all wire() interfaces correctly. - -* Steven Danz -January 25, 2000: allow browsable auto maps. - -* Wolfram Klaus . -November 21, 2000: recognize proplist mnttab flag. - -* Thomas Klausner -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 -February 1, 2001: important Linux NFS error number mapping fixed - -* Ahmon Dancy -February 9, 2001: Apple Rhapsody/Darwin/OS X port - -* Sebastien Bahloul -July 3, 2001: LDAP fixes and updates to support new APIs - -March 27, 2002: LDAP bug and port to HPUX-11. - -* Philippe Troin -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 -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 -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 ). - -* Matthias Scheler -June 14, 2002: patch to use "xlatecookie" NFS mount option. - -* Jun-ichiro itojun Hagino . -June 11, 2002: minor fixes to support NetBSD 1.6A. - -* Sean Fagan -March 14, 2003: detect and use the MNT2_GEN_OPT_AUTOMNTFS mount flag -on OS X / Darwin. - -* Hendrik Scholz -June 9, 2003: mk-amd-map should open temp db file using O_EXCL. - -* Mark Davies -July 14, 2003: define "xlatecookie" mnttab option if not defined (for -NetBSD). Support null hesiod entries if they start with a ".". - -* Eric S. Raymond -December 9, 2003: fix unbalanced [] typo in fsinfo man page. - -* Martin Blapp -July 6, 2004: recognize fields in pcfs_args_t in FreeBSD 5. - -* Dan Nelson -August 2, 2004: pawd to recognize "host" type mounts. - -* Hauke Fath -August 3, 2004: pawd to recognize "linkx" type mounts. - -* Michael van Elst -September 1, 2004: bug fix to avoid race condition in calls to mntctl on -AIX. - -* Jonathan Chen -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 -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 -January 28, 2005: basic instructions how to setup Amd on Mac OS-X. - -* Dan Ottavio -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 -January 3, 2005: implementation of executable maps for Amd. - -* Jim Zajkowski -March 14, 2005: small patch to amd2ldif. - -* Adam Morley -January 27, 2005: synchronize what amd2ldif does vs. what the ldap.schema -expects. - -* Graeme Wilford -July 4, 2005: buffer overflow in pawd. - Index: contrib/amd/BUGS =================================================================== --- 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 mailing list (see www.am-utils.org). - - -(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 -#include -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 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 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" 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" 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 us know if you have a fix; see www.am-utils.org.) - - -(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. Index: contrib/amd/COPYING =================================================================== --- contrib/amd/COPYING +++ /dev/null @@ -1,32 +0,0 @@ -Copyright (c) 1997-2014 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. 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. Index: contrib/amd/ChangeLog =================================================================== --- contrib/amd/ChangeLog +++ /dev/null @@ -1,13085 +0,0 @@ -2014-10-28 Christos Zoulas - - ******************************************************************* - *** Released am-utils-6.2 *** - ******************************************************************* - - * add ylwrap.amd, sick and tired of patching broken ylwrap. - -2014-09-05 Christos Zoulas - - * factor out the size check for both readdir methods - (raven at themaw.net) - -2014-09-03 Christos Zoulas - - * configure test for 64 bit xdr function (raven at themaw.net) - -2014-09-01 Christos Zoulas - - * bug fix from raven at themaw.net to prevent writing v3 handle - to a v2 structure. - -2014-07-21 Christos Zoulas - - * fix permission problems with access - * auto_nfs_version = 3 now works for me. - -2014-07-20 Christos Zoulas - - * refresh some autoconf files - * force autoconf version since earlier versions don't work - * changes from raven at themaw.net to support NFSv3 for automounted - toplevel filesystems presented to the list in May. A few bug fixes - and integration changes by me. The code now works well enough to - mount the filesystem with NFSv3 and automount children but readdir - does not work yet (so no listing of automounted filesystems). - The new code is not enabled by default. To enable use - auto_nfs_version = 3 - in your configuration file. - -2014-03-26 Christos Zoulas - - From Ian Kent - - * use mktemp in scripts/fixrmtab - * fix documentatio nits - * [linux] Add ext2, ext3, ext4 specific mount options - * fix tcpwrappers (hosts.{allow,deny} problems for specific host - entries - -2014-03-20 Christos Zoulas - - - * don't background autofs umount - * avoid fh NULL dereference on umount - * handle ENOENT umount return for autofs mounts - * fix error message in get_nfs_version - * fix debug log deadlock - * [linux] retry umount on EBUSY - * handle failed umount on exit - -2014-03-09 Christos Zoulas - - * Remove BSD advertising clause. - * Remove expn program which is not used by anything - -2013-12-05 Christos Zoulas - - * Change the way we handle multiple lex scanners and yacc parsers - in a single program. Our old patch to ylwrap does not work anymore - because the bison parsers need shared symbols that start with yy - and we can't easily select which ones work. So now we use -P and - -p to let lex and yacc do the work for us. This requires a patch - to ylwrap, but it is smaller. - - -2013-12-05 Christos Zoulas - - * Change the way we handle multiple lex scanners and yacc parsers - in a single program. Our old patch to ylwrap does not work anymore - because the bison parsers need shared symbols that start with yy - and we can't easily select which ones work. So now we use -P and - -p to let lex and yacc do the work for us. This requires a patch - to ylwrap, but it is smaller. - -2013-05-14 Christos Zoulas - - * update to handle new autoconf and regen files - -2012-11-23 Christos Zoulas - - * recognize mountport=, noacl options - * simplify the bootstrap process, by forcing - all the files to be rebuild with autoreconf -f - i - -2012-10-03 Christos Zoulas - - * add missing ops_nfs4.c to the Makefile.am - -2012-09-14 Christos Zoulas - - * add locking option handling for lustre - * fix noatime, nodiratime, mandlock for linux - -2012-07-25 Christos Zoulas - - * bug fixes for lustre rhost parsing - -2012-06-27 Christos Zoulas - - * Disable 1/2-baked sun map support to avoid SIGSEGV - -2012-06-16 Christos Zoulas - - ******************************************************************* - *** Released am-utils-6.2-rc1 *** - ******************************************************************* - - * Fix libtool.m4 to work with later versions of autoconf. - * In buildall, use eval so that quoted strings work - * Centralize nfs version checking function, and introduce - new configuration variable nfs_vers_ping, which is the - max version we ping for. This is not documented yet, because - there might be a better way separate the max version we can - use vs the max version we ping for. - -2012-06-09 Christos Zoulas - - * fix issue with parsing nfsv4 security option strings - -2012-05-01 Christos Zoulas - - * Handle EPERM return from v4 file handles - in old linux kernels - -2012-03-09 Christos Zoulas - - * fix linux autofs detection - * fix wrong types in new amq mount xdr processing - -2012-01-25 Christos Zoulas - - * FreeBSD portability fixes - -2012-01-23 Christos Zoulas - - * Avoid type punned warnings - -2011-12-29 Christos Zoulas - - * fix bug I introduced in get_nfs_version that caused it to return 0 - * add direct support for ext{2,3,4} - -2011-12-15 Christos Zoulas - - * Include on linux, to grab extra mount flags - * Add support for lustre - -2011-11-28 Christos Zoulas - - * For nfsl mounts, match against either the short local - host name or the fqdn name. - -2011-10-06 Christos Zoulas - - * Add NFSv4 support (loosely based on Ramya's code). - Currently if the NFSv4 mount fails with ENOENT we fail - back to NFSv3, unless -DNO_FALLBACK. - * Replace strdup with xstrdup. It is not nice to replace - system functions with ones that behave differently. - * Add various consistency checks (caller function checks - variable for NULL, but callee does not). - * Fix error handling in various paths. - * Don't check before using XFREE(). free(NULL) works. - -2011-09-15 Christos Zoulas - - * amq -i addition (prints info about the map files) - -2011-09-14 Christos Zoulas - - * Solaris OS and compiler fixes from: - Hofmann, Frank - Sayle, Alex - - (void)&var generates warnings, removed - - __inline is invalid, changed with inline - - and other headers have extra dependendcies - ` -2011-08-11 Christos Zoulas - - * fix potential buffer overflow in expand_error() - (Richard Kettlewell). Does not seem to be exploitable. - - * simplify %option parsing to appease ancient flex. - -2011-06-21 Christos Zoulas - - * add support for linux autofs version 5 (untested) - -2011-06-18 Christos Zoulas - - * roll back to an older version of libtool that works - - * newer versions of config.guess and config.sub - - * minor fixes to buildall - -2011-05-19 Christos Zoulas - - * m4/macros/libtool.m4: for AIX AC_LANG_PROGRAM is incorrectly - used and the latest autoconf gives an error. For now just - quote it. - - * configure.in: Fedora Core 15 and RedHat 6 now don't define - af_family_t in , but in . - Include so that we get - indirectly. This caused the detection - test to fail. - -2010-11-24 Erez Zadok - - * m4/macros/os_cflags.m4: for linux, define _GNU_SOURCE (to get - definitions for O_LARGEFILE and more). - -2010-11-20 Christos Zoulas - - * Update news items, add release readme, mark as rc1 - - * Fix addopts code to work with options that are key=value - when the built-in hasmntopt() code is not used. The problem - was that the code passed "key=" to hasmntopt not "key". - -2009-12-10 Christos Zoulas - - * Copy all fields of the am_opts structure - When we introduced am_loc we also added a function to - create a duplicate of an am_opts structure. As it turns - out, that only made a partial copy of the struct and some - fields (e.g. opt_cache) was left blank in the new structure. - Unfortunately any code that was checking the options - through the mntfs structure was mislead by the partial - copy: caching was disabled completely, for example, and - since browsing relies on caching being enabled it wasn't - working either. - From: Krisztian Kovacs - - * Initialize RPC authentication flavor to AUTH_UNIX instead - of zero. RHEL 5 uses version 6 of the mount_arg structure - that includes the desired RPC authorization flavour. - Unfortunately amd initializes that value to zero, meaning - AUTH_NULL, resulting in all NFS servers denying operations. - From: Krisztian Kovacs - - * Make sure to remove nodes in the proper order when going - down. Depending on what order the nodes got created it's - possible that the parent of a node has a bigger am_mapno - (index in exported_ap[]) so that it gets freed before - its child while the child's am_parent pointer is still - pointing to the already freed block of memory. - This change makes sure that umount_exported() cleans up - all children of a node first before freeing the node. - From: Krisztian Kovacs - - * Fix Linux-specific stuff in ops_tmpfs.c - AUTOFS_TMPFS_FS_FLAGS is defined only in the Linux-specific - conf_linux.c file, so it cannot be built on Solaris. - From: Krisztian Kovacs - - * Add missing parenthesis to fix defined(XXX - From: Krisztian Kovacs - - * In the previous commit we've already made a change that - makes this code unnecessary since the node is returned - even if the backing file server is known to be down. - Since the code path is unused it should be removed. - From: Krisztian Kovacs - - * amfs_generic_lookup_child() tries to find an alternate - file server if it detects that the current one is down. - However, in the comparison used to decide if a possible - mount is the same as the current one it compares the am_loc - pointers instead of the actual mntfs pointers. Since - amfs_lookup_one_location() creates a brand new am_loc - structure for the returned mntfs structure the am_loc - pointer will be different even if the mntfs it's pointing - to is the same. - This tricks amfs_generic_lookup_child() think it has - found an alternate file server while it hasn't and thus - starts multiple racing mounts for the very same node and - mntfs. - From: Krisztian Kovacs - - * In the new am_loc scheme mounted mntfs structures still - have their mf_fo structure left intact. So when restart - creates a fake mntfs for an already mounted filesystem it - should not free mf_fo right away. - From: Krisztian Kovacs - - * Setting the error flag of the mntfs for which the share - is already mounted results in the mount point not being - removed when it times out. (Amd considers it an error - mntfs and thus umount becomse a no-op.) - From: Krisztian Kovacs - - * Right now AMD sets all timeout values to their defaults - even if you explicitly set them to zero. This patch - introduces separate flags that store if the respective - values have been set and the code path setting default - values checks these flags instead of testing the values - for zero. [Linux only] - From: Krisztian Kovacs - - * Fix mntfs related lookup/(un)mount race conditions, by - introducing a new structure linking an mntfs to a node. - From: Krisztian Kovacs - - * We have to free the buffers allocated by the XDR routines when - decoding the mount response after copying them to their final place. - From: Krisztian Kovacs - -2009-12-09 Christos Zoulas - - * Free continuation in amfs_retry() if we don't call amfs_bgmount() - Normally it's amfs_bgmount() which frees the continuation. However, if - the mount is already in progress and we're in amfs_retry() for another - node we don't try mounting the filesystem once again. Still, we have - to free the continuation as we won't get called again and thus would - leak the continuation structure and our am_loc references. - From: Krisztian Kovacs - - * Fix use-after-free and double free of mntfs private data - ops_nfs.c(nfs_init) does not clear private data pointer after free(). - This leads to use-after-free and double free in case mount() fails. - (found by valgrind) - From: Krisztian Kovacs - -2009-11-23 Christos Zoulas - - * The temporary filename buffer was leaked in lock_mtab(). - From: Krisztian Kovacs - -2009-10-27 Christos Zoulas - - * Deal with errno.h->sys/errno.h better - -2009-10-26 Christos Zoulas - - * Fix issue with autoconf 2.63 - - * Fix compile warnings for gcc-4.4.x - -2009-04-15 Christos Zoulas - - * Share the LDAP connection between different maps to save resources - on the LDAP server. (Olaf Flebbe ) - -2009-03-20 Christos Zoulas - - * Fix largefile re-definitions - - * Fix compilation error caused in previous patch - -2009-02-19 Christos Zoulas - - * Add a synchronous unmount amq rpc that will wait for the remote - filesystem to be unmounted, or return an error. Enabled by amq -uu - -2009-01-11 Erez Zadok - - * amd/ops_udf.c: don't define functions/variables which may not be - used. - - * amd/ops_tmpfs.c (mount_tmpfs): force gcc not to complain about - unused variables. - - * config.guess.long: properly support Fedora Core. - -2009-01-09 Christos Zoulas - - * Fix nfs mounts on linux 2.6.26 by explicitly initializing context. - - * Treat an empty sublink as an unset sublink; this allows us to - say sublink:=; in a spec to override the default. (This produces - Bad selector error, but it works. XXX: We need to decide how to - unset a selector. I proposed an unset keyword a while ago). - -2009-01-06 Christos Zoulas - - * re-renerate all generated files with newer versions of the - auto-tools. - - * move INSTALL to INSTALL.am-utils to avoid conflicts - - * fix incompatibilities with new m4 and new autoconf. - - * add UDF filesystem support. - - * fix NetBSD nfs file handle detection. - -2009-01-02 Christos Zoulas - - * add nocasetrans, nojoliet, rrcaseins for cd9660 filesystems - -2008-12-03 Christos Zoulas - - * allow ldap queries try a comma-separated list of servers given as: - - ldap_hostports = host1:port1,host2,host3:port3 - - original patch from Florian Geyer - -2008-09-19 Christos Zoulas - - * the auth_create gid on NetBSD is int - - * deal with lossage from flex -P - - * fix missing/incorrect prototypes - -2008-09-17 Christos Zoulas - - * fix manual page section issues (sorting, non-existant) - - * add missing forward declarations - - * avoid null pointer derefs (coverity) - - * more portable endian detection support - - * implement tmpfs support - - * use sizeof var instead of constant - - * fix yyerror declaration and definition - - * fix yy function renaming, and correct some renaming issues. - - * work around automake < 1.9 issue where ylwrap is not being run - for a single yacc or lex file. - - * NetBSD - - handle headers that need other headers to compile - - add exfs and tmpfs specific glue - - add options log, noatime, nocoredump, nodevmtime, softdep, - symperm, union - - NetBSD's new mount system call needs the size of the opaque - filesystem specific structure, but passing 0 for now works. - We would need to change a lot more code to pass the size from - the fs-specific calls, so for now punt. - - recvfrom takes socklen_t * on NetBSD - - handle newer NetBSD using statvfs - - NetBSD calls its ufs ffs - - * Linux - - Most recent kernels have trouble with trying to parse the pid - hostname and do locking. What before was a silent failure, now - there is a warning printed and the mount is rejected. This is - the simplest fix: - (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=479884) - -2007-04-13 Erez Zadok - - * amd/sun_map.c (sun_append_str): When translating '&' from Sun - automounter maps, replace it with "${key}" in the Amd map, not - with the value of the key at the time. This way '*' maps work - too. - - * config.guess.long: don't use -q option to grep because some - systems don't support it. Bug fix for solaris. - -2007-03-11 Christos Zoulas - - * amd/opts.c (expand_op): Don't call xstrlcpy() to truncate a - string. It causes spurious xstrlcpy() syslog() errors. Use - memcpy() and explicitly terminate the string. - -2007-01-20 Erez Zadok - - * updated copyright year to 2007 on all files. - -2006-12-27 Erez Zadok - - * minor new port: ia64-hp-hpux11.23 - - * m4/macros/check_libwrap_severity.m4 (LIBS): also test if caller - needs to define rfc931_timeout. - - * amd/sun2amd.c: define rfc931_timeout and allow/deny_severity for - libwrap. - - * amd/amq_svc.c: some versions of libwrap require the caller to - define rfc931_timeout in addition to allow/deny_severity. - - * amd/amfs_toplvl.c (amfs_toplvl_init): properly detect when - forced unmount functionality exists for all systems. - - * libamu/mount_fs.c (compute_nfs_args): reset nfs_args_t->pathconf - only if field exists. - - * conf/nfs_prot/nfs_prot_hpux11.h: prevent HPUX 11.23 from - including or (TLI definitions are already - included from elsewhere). - - * configure.in: detect nfs_args_t->pathconf field. - -2006-11-27 Erez Zadok - - * doc/Makefile.am: properly publish html files using newer - text2html. - -2006-11-27 Erez Zadok - - * doc/Makefile.am: obfuscate emails in ChangeLog before it is - published on web site. - - * obfuscate many more emails in the distro, esp. of files which get - posted on the am-utils web site. - -2006-11-26 Erez Zadok - - * minor new port: i386-apple-darwin8.8.1. - - * doc/am-utils.texi: remove obvious URLs used by spammers, and - replace them with links to the am-utils web site, which uses PNG - images to obfuscate the actual email/mailman URLs. - -2006-10-30 Erez Zadok - - * doc/am-utils.texi (Password maps): minor typo reported by - Christoph P. Kukulies. - -2006-10-26 Erez Zadok - - * minor new port: i386-pc-linux-fc6. - - * m4/macros/linux_headers.m4: handle newer Linux kernels which - removed UTS_RELEASE from . - -2006-10-25 Erez Zadok - - * minor new ports: i386-pc-linux-centos4.4 and - powerpc-apple-darwin8.7.0. - - * config.guess.long: recognize CentOS Linux. - -2006-06-20 Erez Zadok - - * minor new port: i386-pc-solaris2.11-nexentaos (GNU/OpenSolaris). - - * config.guess.long: recognize NexentaOS (GNU/OpenSolaris) - - * config.guess, config.sub: updates from latest official GNU - distributions. - -2006-05-11 Erez Zadok - - * Minor new ports: i386-unknown-freebsd6.1 (RELEASE), - powerpc-apple-darwin8.6.0, and i386-unknown-openbsd3.9. - -2006-05-10 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * libamu/mtab.c (hasmntval): fix inverted meaning of error from - hasmntvalerr(). - -2006-04-14 Erez Zadok - - * 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 - - * amd/amfs_generic.c (amfs_lookup_mntfs): fix use-after-free bug - (Coverity). - -2006-03-27 Erez Zadok - - * 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 - - * minor new port: i386-pc-linux-suse10.1 (beta 8). - -2006-03-21 Christos Zoulas - - * amd/am_ops.c (merge_opts): Remove useless check found by - Coverity; xmalloc never returns NULL. - -2006-03-21 Erez Zadok - - * 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 - , 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 - - * 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 - - * amd/nfs_subr.c (mp_to_fh): fixed old-style filehandles--the pid - comparison was failing. - -2006-03-08 Erez Zadok - - * configure.in: properly test for either or - (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-16 Daniel P. Ottavio - - * amd/sum_map_tok.l: Fixed a bug in a regular expression that - prevented dashes in hostnames. This was posted in BZ by Thomas - A. Fine. - - * README.sun2amd: Fixed a typo. Sentence mentions use of autofs - type when it should be host type. - -2006-01-04 Erez Zadok - - * 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 - - * updated copyright year to 2006 on all files. - -2005-12-20 Erez Zadok - - * 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 - - * minor new ports: i386-unknown-netbsdelf2.1, - i386-unknown-netbsdelf3.0 (RELEASE), and i386-unknown-openbsd3.8. - -2005-12-02 Erez Zadok - - * m4/macros/check_field.m4: remove double inclusion of msdosfs - headers, which are included in mount_header1.h (netbsd 2.1 doesn't - protect which causes compile errors). - -2005-11-08 Erez Zadok - - * minor new port: i386-unknown-freebsd6.0 (RELEASE) - -2005-10-26 Erez Zadok - - * 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 - - * amq/pawd.c (transform_dir): resolve path repeatedly until - finished. Bug fix from Jonathan Chen . - Added safety check to prevent infinite loops. - -2005-10-19 Erez Zadok - - * 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 - - * 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 - - * doc/am-utils.texi (nfs_vers, nfs_proto parameters): clarify and - correct mistaken description of nfs_proto. - -2005-10-10 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.1a1 *** - ******************************************************************* - - * README.sun2amd: revised. - -2005-10-09 Daniel P. Ottavio - - * amd/info_nis.c (nis_search): Bug fix for bugzilla #428; make - sure that sun_entry2amd() is not called when yp_match() returns an - error, this is done by checking that 'res' is 0. Bug fix (same - BZ#); free the output allocated by yp_match() instead of freeing - the return value of sun_entry2amd(). - - * amd/sun_map.c (sun_entry2amd): Fix a comment. - - * README.sun2amd: Made a first pass at describing the status of - the sun2amd feature. - Moved the date. - -2005-10-09 Erez Zadok - - * README.sun2amd: place holder. - - * Makefile.am (EXTRA_DIST): distribute new README.sun2amd file. - -2005-10-07 Erez Zadok - - * 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 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. - - * amd/Makefile.am (amd_LDADD, sun2amd_LDADD): put libaminfo.a - before libamu.la. Some linkers (e.g., IRIX-6.5) incorrectly - complain about undefined symbols. - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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. - - * libamu/xutil.c: explain purpose of file. Move mkdirs/rmdirs - code from old util.c. - -2005-10-01 Erez Zadok - - * 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 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 - . - - * 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 - - * 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 - - * 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 - . - - * 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 - - * 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 - - * README.attrcache: 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. - - * README.attrcache: new file documenting in detail OS bugs - relating to attribute caching, which can affect Amd's reliability - under heavy load. - Update status of freebsd and openbsd. - - * 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 - - * 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-15 Erez Zadok - - * amd/nfs_subr.c (nfsproc_getattr_2_svc): initialize 'retry', just - in case. - (fh_to_mp3): increment amd_stats.d_stale counter only if we are - actually returning ESTALE. - - * amd/info_exec.c (exec_parse_qanswer), amd/info_file.c - (file_search_or_reload), amd/info_hesiod.c (hesiod_search), - amd/info_ldap.c (amu_ldap_search), amd/info_ndbm.c (search_ndbm), - amd/info_nis.c (nis_search), amd/info_nisplus.c (nisplus_search, - nisplus_search): don't dereference mnt_map->cfm which may be null - if we're not using an amd.conf file. - -2005-09-14 Erez Zadok - - * libamu/xutil.c (unregister_amq): if failed to de-register Amd - from portmapper, report it under dlog (debugging), not as an - annoying plog that always shows up. - -2005-09-13 Erez Zadok - - * mk-amd-map/mk-amd-map.c (read_file_file), libamu/util.c - (strsplit), libamu/hasmntopt.c (nextmntopt), amd/sun_map.c - (sun_entry2amd), amd/sun2amd.c (sun2amd_convert_convert), - amd/mapc.c (mapc_add_kv), amd/info_file.c (file_search_or_reload), - amd/info_exec.c (exec_parse_qanswer): cast isspace() and isascii() - arg to unsigned char, which is safer as per Christos. - - * amd/sun_map.c (sun_entry2amd): isspace takes an int, not a char. - - * configure.in: keep a dummy unused AM_PROG_LEX, because old - Automake (1.6.3) looks for it if you refer to LEX in your - Makefile.am files. Silly thing, fixed in newer versions of - Automake (1.9.2). - -2005-09-11 Erez Zadok - - * Makefile.am (EXTRA_DIST_M4): add prog_{lex,yacc}.m4 to distro. - - * configure.in: use new macros AMU_PROG_YACC and AMU_PROG_LEX. - - * m4/macros/prog_yacc.m4: new macro to check if bison/yacc/byacc - exist, but exist with an error if none found. - - * m4/macros/prog_lex.m4: new macro to check if f/lex exist, but - exit with an error if not found (am-utils requires f/lex). - -2005-09-07 Erez Zadok - - * 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 - - * 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-28 Daniel P. Ottavio - - * amd/sun_map.c (sun_entry2amd) : Wipe out any trailing white - spaces or '\n' before passing strings to the parser. - - * amd/amd.h : oops, reverting bad changes - - * amd/info_file.c : oops, reverting bad changes - - * amd/mapc.c : oops, reverting bad changes - - * amd/sun_map_parse.y : oops, reverting bad changes - -2005-08-27 Erez Zadok - - * libamu/xutil.c: amd_program_number is a u_long now. - (unregister_amq): if pmap_unset failed to de-register Amd from the - portmapper, print an error message. - (get_amd_program_number): returns a u_long now. - (set_amd_program_number): take a u_long now. - - * include/am_utils.h: get_amd_program_number() returns u_long now. - set_amd_program_number() takes a u_long now. - - * amq/amq.c: amd_program_number is a u_long, not int. - - * amd/nfs_start.c (mount_automounter): when registering Amd with - the portmapper (for Amq service), don't fail if just one of TCP or - UDP failed to register, but only if both transports failed. That - way Amq can still contact Amd using the transport that did - register correctly. However, now, if both transports failed to - register, then set amd_state to "Done" so it would shutdown - cleanly. - - * conf/transp/transp_{sockets,tli{}.c (amu_svc_register): better - comments. - - * libamu/xutil.c: debug_flags should always be initialized to - D_CONTROL (amq,daemon,fork). - (debug_option): allow setting initial immutable debug_flags via - amd.conf; afterward, prevent it (i.e., one tries it via "amq -D"). - - * 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-27 Daniel P. Ottavio - - * amd/info_file.c (file_search_or_reload): Changed the key - variable that is passed to the sun_entry2amd. - - * amd/mapc.c (mapc_add_kv): Add support for multiple entries - packed into one line. This is a workaround for handling Sun style - mounts that contains multiple entries on one line: "multi-mount - entries". The sun2amd conversion tools will convert such entries - into type:=auto and pack each of the auto-entries into one line - separated by '\n'. The mapc_add_kv function will now recognize - such entries and add then. - - * amd/sun2amd.c (sun2amd_convert): Add print statement that - includes the line number during a parser failure. - - * sun_map.c: Fix the AMD_MAP_PREF_KW definition. Fix spelling. - (sun_mountpts2amd): removed this function - (sun_hsfs2amd): added some more comments - (sun_nfs2amd): moved support for multi-mount entries from this - function to sun_multi2amd(). - (sun_multi2amd): New function to handle multi-mount entries. This - function will convert the Sun version to an Amd type:=auto. Each - extra auto entry will be appended to the same line separated by a - '\n'. - (sun_entry2amd): Fixed a bug if-statement. This function now - checks for multi-mount entries. - - * amd/sun_map.h: Add a fstype member to the sun_mountpt struct. - - * amd/sun_map_parse.y: Parser now supports fstype for multi-mount - entries. - - * amd/sun_map_tok.l: No longer print the line and column number - when parsing. This is because the parser is handed strings not - files. Therefore, the line number will always be 1. It is now up - to the higher level tools to echo line information during error - when they feed the parser. - -2005-08-24 Erez Zadok - - * configure.in: wrap all LDAP and HESIOD tests in test whether - --with-OPT was used. - -2005-08-20 Daniel P. Ottavio - - * amd/sun_map.c: Clean up #defines - (sun_entry2amd) : Verify that the key and entry values passed are - not NULL. Free the Sun entry struct when done. - - * amd/sun_map.h: Add some "not implemented yet" comments to the - map and mmap structures. - - * amd/sun_map_parse.y: Removed automap include functionality, it - will need to be re-implemented using a pre-processor. - Clean up function calls. - -2005-08-16 Daniel P. Ottavio - - * amd/sun2amd.c (sun2amd_convert): If the input line is too long - don't return an error just null terminate and continue. Fix bug: - the map key was not written. - - * amd/sun_map.c: Add a new Amd device, and cdfs constant. - (sun_locations2amd): Write the NFS type keyword - for each host of the mount entry. Add a space between each mount - location. - (sun_hsfs2amd): New function to support hsfs to - cdfs. - (sun_nfs2amd): Don't write the nfs type here. Fix - comments. - (sun_entry2amd): Change function parameter var for - clarity. Add support for hsfs. - - * amd/sun_map_parse.y (sun_map_parse_read): Reset the entry list - after it has been returned. - -2005-08-16 Erez Zadok - - * amd/get_args.c (get_args): initialize debug_flags if they've - never been set. - -2005-08-15 Erez Zadok - - * amd/mapc.c (mapc_create): mapc find takes 4th arg, the mount - point. Now, we can properly initialize the cfm structure of the - mnt_map, so we can have access to the flags (e.g., SUN_MAP_SYNTAX) - inside each info_*.c file. - (mapc_find): takes 4rd arg (mntpt) and passes it to calls to - mapc_create. - (root_newmap): pass NULL as 4th arg (mntpt). - - * amd/amfs_generic.c (amfs_parse_defaults): remove ugly hack to - initialize map cfm structure (including flags) so late. - - * amd/autil.c (amfs_mkcacheref): pass mount point as 4th arg to - mapc_find. - - * amd/amfs_root.c (amfs_root_mount): pass NULL as new 4th arg to - mapc_find. - - * amd/amd.h: extern for mapc_find changed to pass the mount point. - - * libamu/xutil.c: debug_flags should be unsigned. - (dbg_opt): fix comments for updated debug_flags, add "defaults". - (debug_option): Don't allow "immutable" (D_IMMUTABLE) flags to be - changed, because they could mess Amd's state and only make sense - to be set once when Amd starts. Currently these immutable flags - are "daemon," "fork," "amq," and "mtab." If Amd not compiled with - debugging, set default "control" options (daemon,fork,amq). - (unregister_amq): proper use of D_AMQ. - - * include/am_utils.h: define new D_BASIC, D_CONTROL, D_DEFAULT, - D_IMMUTABLE, and D_MASK. Updated definitions of D_ALL and D_TEST. - debug_flags extern should be unsigned. - - * scripts/amd.conf-sample (debug_options): mention new "defaults" - option. - - * scripts/amd.conf.5,doc/am-utils.texi: document new debug option - "defaults" and properly explain the corrected meanings of - "daemon," "fork," "amq," and their "no" inversions. Better - explain "all" and "test" too. Correct default debug_mtab file to - /tmp/mtab. - - * hlfsd/stubs.c (nfsproc_readlink_2_svc): proper use of D_FORK. - - * hlfsd/homedir.c (homedir): proper use of D_FORK. - - * hlfsd/hlfsd.c (main, hlfsd_init, cleanup): proper use of - D_DAEMON. - - * amd/nfs_start.c (mount_automounter): proper use of D_AMQ. - - * amd/amd.h (DEBUG_MNTTAB_FILE): change default to /tmp/mtab, - which is more common on more systems (instead of /tmp/mnttab). - - * amd/amd.c (main): properly use D_DAEMON. - -2005-08-14 Erez Zadok - - * libamu/xutil.c (xlog_opt): define new pseudo log_option named - "defaults", which is an alias for "fatal,error,user,warning,info". - - * scripts/amd.conf.5, doc/am-utils.texi, amd/amd.8: document new - log_option "defaults". - - * amq/amq.8: typo. Arg name for -D is "debug_options" not - "log_options". - - * libamu/xutil.c: make xlog_level static, and initialize it to - XLOG_DEFAULT. - (cmdoption): take unsigned int as flags argument, and print any - errors as XLOG_ERROR (which cannot be turned off). - (switch_option): remove old code which disallowed you from turning - off flags that were set when Amd started up. Now, you can turn - any log option on/off at start time or later on (via amq -x), - other than the two mandatory options (fatal+error). - - * include/am_utils.h (XLOG_*): remove unused XLOG_DEFSTR. Define - XLOG_MASK to mask out unused flag bits. Define XLOG_DEFAULT to be - what it was before (fatal + error + user + warning + info), but - use the new mask. Remove extern's for xlog_level and - xlog_level_init. Change extern for cmdoption() to take an - unsigned flags argument. - - * doc/am-utils.texi, amq/amq.8, scripts/amd.conf.5, amd/amd.8: - document mandatory log options - (fatal+error) which cannot be turned off and are always on by - default. They must be on so that Amd can report crucial errors, - including those related to setting flags on/off. - - * hlfsd/hlfsd.c (main): remove hack to initialize log_options. - - * wire-test/wire-test.c: remove reference to unused xlog_level. - - * amd/mapc.c (mapc_create): 'alloc' flags variable should be - unsigned. - - * amd/get_args.c (get_args): no need for hack using - xlog_level_init. - - * amd/Makefile.am: separate sources common to amd and sun2amd into - a special, locally-built only, static library called libaminfo.a. - - * libamu/xutil.c (real_plog, xsnprintf): call new xvsnprintf() - wrapper function. - (xvsnprintf): new function which already gets a va_list. This was - needed to avoid nesting va_list's (which apparently isn't - allowed). - - * include/am_utils.h: prototype for new xvsnprintf wrapper. - - * 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-14 Daniel P. Ottavio - - * amd/info_file.c: add key to sun_entry2amd()'s parameters - - * amd/info_hesiod.c: add key to sun_entry2amd()'s parameters - - * amd/info_ldap.c: add key to sun_entry2amd()'s parameters - - * amd/info_ndbm.c: add key to sun_entry2amd()'s parameters - - * amd/info_nis.c: add key to sun_entry2amd()'s parameters - - * amd/info_nisplus.c: add key to sun_entry2amd()'s parameters - - * amd/sun_map.c: New functions to support sun translation to amd. - The function sun_entry2amd's parameters were expanded to include - the key value. sun_entry_2amd() now returns NULL on error. - - * amd/sun_map.h: Expand sun_entry2amd's parameters to include key - value. - - * amd/sun_map_parse.y: Change how file system types are parsed out - of the list of options for each entry. The previous way was not - working properly so now we just look for the 'fstype' keyword in - each option. If it exists we copy its key value. - Added some comments to sun_map_parse_read(). - - * amd/amd.h: Added an extern from info_file.c called - file_read_line(). Previously this function was static but is now - used in sun2amd.c. - - * amd/info_file.c: Changed the static function read_line() to a - public function called file_read_line(). This function is now - used in sun2amd.c - - * amd/sun2amd.8: Filled in the contents of this man page. This is - a conversion utility that converts Sun maps to Amd maps. - - * amd/sun2amd.c: Implemented a working version of this utility. - -2005-08-11 Erez Zadok - - * amd/sun_map_parse.y: instead of using a custom FOO_alloc() - function, use Amd's CALLOC(struct FOO) macro. - - * amd/sun_map.h: remove extern definitions to functions no longer - needed. - - * amd/sun_map.c: removed superfluous *_alloc() functions, some of - which caused conflicts with same-named symbols in the parser - (since we rename 'yyalloc' to 'sun_map_alloc'). - - * configure.in: keep AC_INIT on same line, for nightly snapshot - build script. - - * amd/Makefile.am: f/lex libraries are incompatible with multiple - scanners, so don't link Amd with libl.a/libfl.a. - -2005-08-10 Daniel P. Ottavio - - * amd/sun_map_tok.l: Clean up regular expression so HPUX stops - whining. - -2005-08-09 Daniel P. Ottavio - - * amd/sun_map_parse.y: Moved license below special yacc bracket to - be portable with HPUX's yacc. Clean up externs. - - * amd/sun_map_tok.l: Moved license below special lex bracket to be - portable with HPUX's lex. Fixed definitions to allow for a - non-flex lex to parse strings instead of files. Added some casts - to strlcpy usage to silence warnings. Moved the % options because - HPUX was complaining, - -2005-08-08 Daniel P. Ottavio - - * amd/sun_map_tok.l: Applied some definition goop to handle the - ECHO symbol that lex defines. This symbol causes problems on - RedHat-EL-powerPC platforms. Replaced strncpy with strlcpy. - Renamed the function sun_map_yyinput to sun_map_input. This - function is a utility function that is not generated by lex. - Therefore, the 'yy' may cause confusion. - -2005-08-08 Erez Zadok - - * amd/sun_map_tok.l: allocate more output slots so lex scanners - don't run out of memory. - - * amd/sun_map_parse.y: declare extern for sun_map_parse(). - - * libamu/xutil.c (xsnprintf): ensure proper comparisons between - signed and unsigned quantities. - -2005-08-06 Erez Zadok - - * libamu/util.c, amd/autil.c (strsplit): moved strsplit() function - from Amd code to to libamu, so sun2amd could use it. - - * amd/Makefile.am (sbin_PROGRAMS): build sun2amd binary and man - page. - (EXTRA_sun2amd_OBJECTS): sun2amd needs to link with all info_*.c files - - * amd/sun2amd.8: placeholder for man page. - - * amd/sun2amd.c: placeholder for C version of translator from Sun - syntax maps to Amd maps. - - * */*.[0-9]: include file name in nroff source comment. - - * ALL: use '0' properly when assigning or passing it to functions. - If in the context pointer, use NULL. If in the context of a - single char (say within a string), the use '\0'. This is just to - make the code clearer. - - * m4/macros/header_templates.m4: template for HAVE_MAP_SUN. - - * amd/mapc.c (maptypes): add placeholder for Sun-syntax map - methods. - - * amd/Makefile.am (EXTRA_amd_SOURCES): compile info_sun.c - - * amd/info_sun.c: placeholder for meta info parser to get info - from Sun automount-style /etc/auto_master, possibly following - into multiple info services (via /etc/nsswitch.conf). - - * libamu/xutil.c (xsnprintf): if vsnprintf truncated the output - string to avoid an overflow, print an error. Include some code to - break out any possible infinite loop between plog() and - xsnprintf(). - (real_plog): now we can use (carefully) xsnprintf() directly. - - * amd/sun_map.[hc]: cleanup and formatting. - - * amd/sun_map_parse.y: to match the literal string "fstype=" use - double quotes, not single quotes. - - * amd/get_args.c (get_args): call conf_parse() using conf_in. - - * amd/amd.h: use renamed parser symbols (yyparse -> conf_parse; - yyin -> conf_in). - - * ylwrap: Enhance wrapper to avoid the #define hacks done by Gdb, - and suggested by the Automake manual. This enhanced parser will - prefix each conflicting yacc/lex symbol with a unique name - produced from INPUT. For example, if INPUT is foo_parse.y, then - yyparse() becomes foo_parse(). This requires that both your .l - and corresponding .y files have the same prefix (e.g., foo_parse.y - and foo_tok.l). - - * amd/Makefile.am (BUILT_SOURCES): define which yacc/lex .h/.c - source files are built automatically, and therefore should not be - in the distro (IMHO), and should be cleaned upon "make clean". - (amd_SOURCES): include new sun_map_parse.y and sun_map_tok.l files. - - * ylwrap: new file needed because we have two parsers now. - - * amd/sun_map_{parse.y,tok.l}: cleanup and formatting. - -2005-08-06 Daniel P. Ottavio - - * amd/Makefile.am: Added new files sun_map.h, sun_map.c, - sun_map_parse.y, and sun_map_tok.l. These files add support for - parsing Sun style maps. The yacc/lex files needed custom rules so - they don't cause symbol conflicts with each other. - - * amd/amd.h: Added "#define INFO_MAX_LINE_LEN" that specifies the - line limit for info services. - - * amd/info_exec.c: Replaced MAX_LINE_LEN with INFO_MAX_LINE_LEN - - * amd/info_file.c: Replaced MAX_LINE_LEN with INFO_MAX_LINE_LEN, - added support for parsing Sun style maps. The support for Sun - maps is done using the sun_entry2amd() function. This function is - called for each entry line that is read only when Sun parsing is - enabled. For each entry line that is passed to the function a - copy of the Amd equivalent is returned. - - * amd/sun_map.h: new header file for Sun style map support - - * amd/sun_map.c: new source file for Sun style map support, clean - up comments, additional sun2amd conversion routines - - * amd/sun_map_parse.y: new yacc file for parsing Sun style maps, - fix copyright notice, put filename below license. - - * amd/sun_map_tok.l: new lex file for parsing Sun style maps, fix - copyright notice, put filename below license. - - * amd/get_args.c: replace usage of strlcat with xstrlcat - - * include/am_utils.h: added 'extern void xstrlcat()' - - * libamu/util.c: Added a xstrlcat() function that wraps the - syscall strlcat() so that string truncations can be logged. - -2005-08-06 Erez Zadok - - * amd/info_file.c (file_search, file_reload): pass mnt_map to - file_search_or_reload. - (file_search_or_reload): ensure that mnt_map is never NULL. - - * amd/info_nis.c (nis_search): call sun_entry2amd() if - sun_map_syntax=yes. - - * amd/info_ldap.c (amu_ldap_search): call sun_entry2amd() if - sun_map_syntax=yes. - - * amd/info_hesiod.c (hesiod_search): call sun_entry2amd() if - sun_map_syntax=yes. - - * amd/info_ndbm.c (ndbm_search): pass mnt_map to search_ndbm. - (search_ndbm): call sun_entry2amd() if sun_map_syntax=yes. - - * amd/info_nisplus.c (nisplus_search): call sun_entry2amd() if - sun_map_syntax=yes. - - * amd/info_exec.c (exec_search): pass mnt_map to - exec_parse_qanswer. - (exec_parse_qanswer): call sun_entry2amd() if sun_map_syntax=yes. - - * doc/am-utils.texi (sun_map_syntax Parameter): document new - common parameter. - - * scripts/amd.conf.5: selectors_in_defaults is a common parameter, - not just [global]. Use consistent capitalization of Amd/Amq. - Document new sun_map_syntax parameter. - - * scripts/amd.conf-sample: properly list all of the parameters - which are common to both the [global] and the per-map sections. - (sun_map_syntax): example of new parameter. - - * 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. - - * amd/conf.c ({ropt,gopt}_sun_map_syntax): new function to parse - sun_map_syntax flag (global or per map). - - * amd/amd.h (CFM_SUN_MAP_SYNTAX): new flag for users to say if the - map uses Sun automounter syntax. - - * cvs-server.txt: update instructions after branching 6.1-stable. - -2005-08-02 Erez Zadok - - ******************************************************************* - *** 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 - - * 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 before to - get the definition of size_t on Debian-3.1r0a. - -2005-07-29 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * configure.in: better help for users, if nfs_args can't be found. - -2005-07-15 Erez Zadok - - * 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 - - * 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 - - * conf/mount/mount_linux.c: add a couple more NFSv2 error codes - that are compatible with NFSv3. - -2005-07-07 Erez Zadok - - * 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 - - * 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 - - * amq/pawd.c (getawd): avoid buffer overflow. Bug fix from Graeme - Wilford . - -2005-06-30 Erez Zadok - - * 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 - - * 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 - - * conf/mount/mount_aix.c (mount_aix3): minor cleanup of filehandle - copying code. - -2005-06-23 Erez Zadok - - * 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 - - * BUGS: update Solaris information about use of f/lex and - yacc/bison. - -2005-06-20 Erez Zadok - - * minor new port: i386-pc-linux-suse9.3. - -2005-06-20 Rainer Orth - - * configure.in (linux/nfs_mount.h): Move __KERNEL__ definition up - so u32 is available for . - -2005-06-16 Erez Zadok - - * 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 - - * 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 - - * scripts/amd.conf-sample (map_type): typo, said mount_type - instead of map_type for the 'exec' example. - -2005-06-11 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.1 *** - ******************************************************************* - -2005-06-04 Erez Zadok - - * 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 - - ******************************************************************* - *** 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 - - * libamu/Makefile.am (EXTRA_DIST): remove alloca.c as it's no - longer needed. - -2005-05-28 Erez Zadok - - * 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 , 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 - - * 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 , which, if found, - appears to be preferable to . Use it to find - . 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 - - ******************************************************************* - *** Released am-utils-6.1-rc6 *** - ******************************************************************* - -2005-05-25 Erez Zadok - - * conf/nfs_prot/nfs_prot_aix5_2.h: AIX 5.3 complains about - missing definition of struct thread_credentials in - 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 - - * 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 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 - - * minor new port: i386-pc-linux-deb3.0. - -2005-05-22 Erez Zadok - - * minor new ports: i386-unknown-netbsdelf2.0.2 and - i386-unknown-openbsd3.7. - -2005-05-20 Erez Zadok - - * 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 , which is broken on several - systems. - - * configure.in: test for . Separate special test - for 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 - - * 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 - - ******************************************************************* - *** 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 - - * amd/nfs_subr.c: check for NULL pointer before dereferencing it. - -2005-05-16 Erez Zadok - - * 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 . 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 . - -2005-05-13 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.1-rc4 *** - ******************************************************************* - -2005-05-11 Daniel P. Ottavio - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.1-rc2 *** - ******************************************************************* - -2005-05-08 Erez Zadok - - * amd/amfs_generic.c (amfs_lookup_mntfs): removed redundant use of - old_def_opts variable. - -2005-05-08 Daniel P. Ottavio - - * 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 . - -2005-05-05 Erez Zadok - - * config.guess.long: detect SuSE Enterprise Server and call it - "sles" not "suse". - -2005-05-02 Erez Zadok - - * 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 . - - * minor new ports: powerpc64-unknown-linux-rhel4, and - powerpc64-unknown-linux-sles9. - -2005-05-01 Daniel P. Ottavio - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * amd/nfs_subr.c (fh_to_mp3): Increased the n of strncpy() - to make sure it null terminates. - -2005-03-29 Daniel P. Ottavio - - * 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 - - * include/am_defs.h: Clarify comment. - -2005-03-21 Erez Zadok - - * include/am_defs.h: undefine "GROUP" so Solaris 10 with gcc-2.96 - won't complain about a conflict for this definition between - and . - -2005-03-20 Erez Zadok - - * 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 - - ******************************************************************* - *** Released am-utils-6.1-rc1 *** - ******************************************************************* - -2005-03-18 Erez Zadok - - * 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 - - * scripts/amd2ldif.in, ldap.schema: fixes by Adam Morley - 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 - - * 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 - - * 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 - . - -2005-03-12 Erez Zadok - - * minor new ports: i386-pc-linux-rhel4. - - * minor new ports: powerpc-apple-darwin7.8.0. - -2005-03-10 Erez Zadok - - * 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 - - * 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 - - * 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 - , modified, cleaned-up, and fixed. - -2005-03-07 Erez Zadok - - * amd/info_file.c (file_init_or_mtime): consolidate identical - file_init and file_mtime into one function. - -2005-03-05 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * minor new port i386-unknown-freebsd6.0 (6.0-CURRENT-SNAP001). - -2005-02-23 Erez Zadok - - * 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 - - * 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 - - * 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 - - * */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 - - * 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 - - * 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 . - - * 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 . - - * 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 - - * 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 - - * 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 - - * 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 . - -2005-01-17 Ion Badulescu - - * 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 - - * 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 - . - - * 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 - - * 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 - - * 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 - . - - * 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 . - - * 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 . - - * 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 - . - - * 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 - . - - * 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 - - * 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 and - 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 - , which is included in many other header files. - 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 - - * 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 - - * updated copyright year to 2005 on all files. - -2004-11-29 Erez Zadok - - * scripts/amd.conf.5: Small fixes to typos in man page, from - Thomas Klausner . - -2004-10-22 Erez Zadok - - * ldap.schema: add this file to distribution. - -2004-09-15 Erez Zadok - - * doc/am-utils.texi: fix old URLs. - -2004-09-01 Erez Zadok - - * conf/mtab/mtab_aix.c (read_mtab): avoid a race condition between - multiple calls to mntctl(). Patch suggested by Michael van Elst - . - -2004-08-07 Erez Zadok - - * 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 - - * 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 - - * amq/pawd.c (find_mt): recognize "linkx" type mounts. Patch from - Hauke Fath . Support "nfsx" while - we're at it. - - * doc/am-utils.texi: mention bugzilla. Fix broken URL HREF's. - -2004-08-02 Erez Zadok - - * amq/pawd.c (find_mt): recognize "host" type mounts. Patch from - Dan Nelson . - -2004-07-30 Erez Zadok - - * doc/am-utils.texi, NEWS: minor typos fixed. - -2004-07-30 Erez Zadok - - * 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 - - * m4/macros/{try_compile_anyfs,check_field}.m4: include - if it exists. Part of a set of - FreeBSD 5 patches from Martin Blapp . - - * include/am_defs.h: include 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 , new on FreeBSD 5. - -2004-07-29 Erez Zadok - - * 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 - . 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 - - * 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 - - * 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 - - * minor new port: i386-unknown-freebsd4.10 - -2004-04-29 Ion Badulescu - - * 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 - - 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 - - * 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 - - * amd/map.c (free_map_if_success): avoid dereferencing a pointer - to potentially freed memory - -2004-02-26 Erez Zadok - - * minor new port: i386-unknown-freebsd5.2.1. - -2004-01-30 Ion Badulescu - - * scripts/ctl-hlfsd.in: don't run hlfsd with -D fork - -2004-01-25 Erez Zadok - - * minor new port: sparc64-unknown-linux-deb3.0 - - * config.guess.long: recoognize Debian Linux. - -2004-01-22 Erez Zadok - - * 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 - - * 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 - - * 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 - - * doc/am-utils.texi: amd-workers is defunct. - -2004-01-19 Erez Zadok - - * cvs-server.txt: updated instructions - -2004-01-18 Erez Zadok - - * minor new port: i386-unknown-freebsd5.2. - -2004-01-05 Erez Zadok - - * 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 - - * 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 - - * 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 - - * tasks: things to do after migrating ftp/Web sites. - -2003-12-09 Erez Zadok - - * fsinfo/fsinfo.8: fixed typo (unbalanced []) in man page. Bug - report from Eric S. Raymond . - -2003-11-18 Erez Zadok - - * Makefile.am (EXTRA_DIST_M4): exclude removed file - m4/macros/struct_nfs_fh3.m4 from distro. - -2003-10-24 Rainer Orth - - * libamu/xdr_func.c (xdr_am_nfs_fh3): Use AM_FHSIZE3 instead of - FHSIZE3 (may be undefined). - -2003-10-24 Ion Badulescu - - 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 - - * 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 - - * 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 - - * 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 - - * BUGS: document the limitations of bind mounts on Linux - -2003-10-21 Ion Badulescu - - * buildall: added support for -i (make install) - -2003-10-16 Rainer Orth - - * NEWS: New minor port i386-pc-solaris2.10 (Solaris 10). - * INSTALL: Mention its test status. - -2003-10-16 Erez Zadok - - * 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 - - * 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 - - * 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 - - 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 - - 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 - - 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 - - * doc/am-utils.texi (opts Option): Fix Tru64 UNIX name in proplist - mount option. - -2003-10-09 Rainer Orth - - * libamu/mount_fs.c (compute_nfs_args) [HAVE_NFS_ARGS_T_FH_LEN]: - Don't reference removed fh3. - -2003-10-09 Rainer Orth - - * 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 - - * 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 - - 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 - - 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 - - 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 - - * 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 - - * 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 - - * 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 - - 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 - - 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 - - * amd/amq_svc.c: Provide alloca prerequisites. - - * conf/transp/transp_tli.c (register_autofs_service): Fix typo. - -2003-09-23 Ion Badulescu - - * 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 - - * conf/autofs/autofs_solaris_v1.c (autofs_mount_fs): compile fix - -2003-09-19 Ion Badulescu - - * 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 - - * 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 - - * Released beta version 6.1b4 - -2003-09-15 Ion Badulescu - - * 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 - - * 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 - - * BUGS: Mention fix for broken Solaris 8 - patches. - -2003-08-31 Erez Zadok - - * 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 - - * configure.in: start 6.1b4-pre officially (belated) - - * minor new port: i686-apple-darwin6.6 - -2003-08-27 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * conf/nfs_prot/nfs_prot_bsdi3.h: support na_uid and na_gid. - -2003-08-27 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * NEWS, configure.in: bumped version up to 6.1b4-pre - -2003-08-13 Ion Badulescu - - * Released beta version 6.1b3 - -2003-08-13 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * conf/autofs/autofs_solaris_v2_v3.c (autofs_umount_fs): fix - compile warning - -2003-08-04 Ion Badulescu - - * 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 - - * conf/nfs_prot/nfs_prot_openbsd.h: include - here with the proper workarounds for openbsd3.3 (define MAXQUOTAS, - define dummy struct netexport, and include - wrapped in _KERNEL). - - * conf/nfs_prot/nfs_prot_freebsd3.h: include - here with the proper workarounds for freebsd5.1 (define dummy - struct ufs_extattr_per_mount). - - * conf/nfs_prot/nfs_prot_bsdi2.h: include - here with the proper workarounds for bsdi2 (define MAXQUOTAS and - dummy struct netexport). - - * include/mount_headers1.h: do not include - 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 - - * 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 - - * 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 - - * 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 (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 - - * 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 - - * 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 - - * 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 - - * NEWS, doc/am-utils.texi, scripts/amd.conf.5: revised explanation - of autofs_use_lofs. - -2003-07-30 Rainer Orth - - * amd/ops_efs.c (efs_mount): Replace on_autofs arg with - MFF_ON_AUTOFS flag. - (efs_umount): Likewise. - -2003-07-30 Erez Zadok - - * conf/umount/umount_bsd44.c (umount_fs): convert to new way of - unmounting which takes autofs into account. - -2003-07-30 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 . - -2003-07-17 Philippe Troin - - * 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 - - * 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 - - * scripts/amd.conf-sample: Remove obsolete comment. - -2003-07-16 Erez Zadok - - * 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 . - -2003-07-16 Rainer Orth - - * BUGS (Solaris 8): Update patch revisions, mention old autofs - patches, fix filenames and rpcgen command. - -2003-07-15 Erez Zadok - - * 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 - - * 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 . - - * 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 - - * 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 - . - -2003-07-14 Ion Badulescu - - * BUGS (Note): document the Solaris 8 bug (the upgrade to autofs - v4 without updating all the header files) - -2003-07-13 Ion Badulescu - - * 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 - - * BUGS: Document buggy behavior of Solaris /usr/ccs/bin/lex. In - short, use flex. - -2003-07-13 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * amd/amd.8: reference am-utils info page in amd man page, as per - Thomas Klausner . - - * 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 - - * 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 - - * 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 - - * amd/conf_parse.y, amd/conf_tok.l: pretty comments on # cpp - macros. - -2003-07-10 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - . - -2003-05-08 Ion Badulescu - - * 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 - - * amd/ops_xfs.c (mount_xfs): compile fix (s/genflags/flags/) - -2003-04-23 Erez Zadok - - * conf/transp/transp_sockets.c (create_amq_service): minor cpp - directive indentation and commenting. - -2003-04-22 Ion Badulescu - - * 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 - - * conf/autofs/autofs_solaris_v2_v3.c: removed autofs_free_data(), - left over from the recent cleanup - -2003-04-13 Erez Zadok - - * 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 (originally from Koji - Imada). - -2003-04-10 Erez Zadok - - * 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 - - * 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 - - * 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 . - -2003-03-31 Erez Zadok - - * fsinfo/fsinfo.8: typo co-ordinate -> coordinate. Typo report - from Perry E. Metzger" . - -2003-03-25 Erez Zadok - - * 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 - - * minor new port: sparc64-unknown-linux-suse7.3. - -2003-03-20 Erez Zadok - - * minor new port: i386-unknown-freebsd5.0. - - * configure.in: detect nfsclient/nfsargs.h. - - * conf/nfs_prot/nfs_prot_freebsd3.h: include - , needed in FreeBSD 5.0. - -2003-03-15 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * BUGS: record IBM's patch number for the AIX 5.2 NFS over IPv6 - bug. - -2003-02-02 Erez Zadok - - * NEWS: minor new port: ia64-unknown-linux-rh2.1AS - -2003-01-31 Ion Badulescu - - * 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 - - * 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 - - * 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 . - (D_ALL): don't include D_XDRTRACE, too verbose and normally - unnecessary - -2003-01-28 Erez Zadok - - * ltmain.sh, config.guess, config.sub, doc/texinfo.tex: updates - from latest official GNU versions. - -2003-01-25 Erez Zadok - - * BUGS (Note): document AIX-5.1 NFS-client side bug (hangs in - vmount). - -2003-01-25 Ion Badulescu - - * Released beta version 6.1b2 - -2003-01-24 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - - * 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 - - * updated copyright year to 2003 on all files - -2002-12-10 Erez Zadok - - * 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 - - * 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 - - * 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 - - 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 - - * NEWS: updated - - * doc/am-utils.texi (opts Option): document sftlookup - - * conf/autofs/autofs_solaris_v2_v3.c: compile fixes - -2002-11-22 Erez Zadok - - * amd/info_ldap.c (amu_ldap_rebind): gopt.ldap_cache_seconds is - %ld not %d. - -2002-11-21 Erez Zadok - - * {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 - - * 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 - - * 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 - - * doc/am-utils.texi (Keep-alives): removed outdated info about not - maintaining the state of TCP NFS servers - -2002-11-04 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * config.guess, config.sub, doc/texinfo.tex: updates from - the latest GNU distributions (2002-09-05). - -2002-10-30 Erez Zadok - - * 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 - - * 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 - - * 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 - and Tim Colles . - - * 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 . - -2002-09-17 Ion Badulescu - - * 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 - - * 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 - - * 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 - - 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 - - * amd/amfs_auto.c (free_continuation): avoid double-free'ing the - mntfs if there was an error/timeout - -2002-09-04 Ion Badulescu - - * 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 ] - -2002-09-03 Ion Badulescu - - Patches from George Ross : - - * 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 - - * 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 - - * scripts/expn.{1,in}: fixed typos as reported by Thomas Klausner - . - -2002-06-26 Erez Zadok - - * 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 - - * Released beta version 6.1b1 - -2002-06-24 Ion Badulescu - - * 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, add the - unknown new field into the middle of the old 4.2 structure - -2002-06-24 Ion Badulescu - - * 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 - - * 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 - - * conf/autofs/autofs_linux.c: compile fixes for autofs v3 - -2002-06-23 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * amd/nfs_start.c (mount_automounter): Security fix. if user sets - -D noamq, don't even create listening socket. Suggestion by Ed - Ravin . - -2002-06-22 Ion Badulescu - - * hlfsd/homedir.c (homedir): use setgid() instead of setegid() - - * ALL: #ifdef cleanups, unify some TLI/socket function prototypes - -2002-06-22 Erez Zadok - - * conf/nfs_prot/nfs_prot_netbsd1_4.h: minor port to support - na_gid and na_uid. NetBSD patch from Jun-ichiro itojun Hagino - . - - * 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 - for NetBSD. - -2002-06-22 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * doc/am-utils.texi: fix typos. Can't use ":" in @cindex entries. - -2002-06-22 Erez Zadok - - * 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 . - - * 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 - . Rework of old code, support for wildcards in - LDAP queries, and an FD leak fix. - -2002-06-22 Ion Badulescu - - * 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 - - * ltmain.sh: use libtool 1.4d, needed support for newer AIX. - -2002-06-21 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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 - - * config.guess.long: support SuSE version names in long - config.guess format. - -2002-05-01 Erez Zadok - - * scripts/lostaltmail.in (vrfy_user): unlink temp files if too - small. - -2002-04-07 Ion Badulescu - - * hlfsd/hlfsd.c (main): compile fix for --enable-debug=no - -2002-03-29 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * amd/info_ldap.c: patch from "Sebastien Bahloul" - to fix a simple initialization bug - and change "HE" to HE_ENT so as to compile on HPUX. - -2002-02-26 Erez Zadok - - * 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 - - * scripts/lostaltmail.in: don't verify user if -noverify option - was turned on. fix comment typo. - -2002-02-11 Erez Zadok - - * amd/Makefile.am (TESTS): enable one test script, test1.sh. - - * amd/test1.sh: re-commit simple test script. - -2002-02-11 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * aux/macros/check_field.m4: need also a new version of - AC_CHECK_MEMBERS (plural). - -2002-02-06 Erez Zadok - - * 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 - - * remove old '%W%' SCCS IDs from all sources. - -2002-01-21 Ion Badulescu - - * 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 - - * hlfsd/hlfsd.h (HLFSD_VERSION): up version of hlfsd to 1.2, - because we made some important changes. - -2002-01-20 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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" - . - -2002-01-13 Erez Zadok - - * 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 - - * 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 if it exists. Define - LARGEFILE support macros, possibly needed for loop devices. - Redefine dev_t apropriately for loop devices. - - * configure.in: check for . - -2002-01-10 Ion Badulescu - - * 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 - - * 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 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 - - * 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 - - * 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 - - * 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 - - * 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 . - -2001-12-02 Erez Zadok - - * 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 - - * 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 - - * tasks: updated - - * NEWS: document the fixed autofs fd leak - - * amq/amq.8: better document the -f option - -2001-11-29 Erez Zadok - - * libamu/mount_fs.c (mnt_flags): same this as for nolock option - handling, do for maxgrps. - -2001-11-29 Ion Badulescu - - * 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 - - * 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 . - -2001-11-27 Erez Zadok - - * 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 - - * */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 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 - - * 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 - - * 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 - - * 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 - - * amd/amfs_auto.c (amfs_auto_readdir_browsable): cast to u_long, - for IA64 Linux. - -2001-11-12 Ion Badulescu - - * 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 - - * configure.in: bumped version up to 6.1a5-pre - - * NEWS: fixed speeling mistaike - -2001-10-29 Ion Badulescu - - * released snapshot am-utils-6.1a4 - -2001-10-26 Ion Badulescu - - 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 - - * 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 - - * 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 - - 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 - - * 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 - - 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 - - * aux/macros/os_cflags.m4 (irix6*): Enforce N32 ABI/mips3 ISA with cc. - * BUGS: Explain this. - -2001-10-02 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 . - -2001-07-19 Ion Badulescu - - * 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 - - * doc/am-utils.texi: Added @dircategory Administration. - -2001-07-12 Philippe Troin - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - 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 - - * conf/mount/mount_linux.c: typo: added comma after '0' element. - -2001-05-19 Ion Badulescu - - * 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 - - * conf/mount/mount_linux.c (linux_nfs_error): don't report success - (0) as error (NE_IO)! - -2001-05-18 Ion Badulescu - - * 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 - - * 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 - - * conf/mount/mount_linux.c: fixed stupid error in the linux - nfs_errormap[], which was mapping ENOENT to success!!! - -2001-04-28 Ion Badulescu - - * 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 - - * 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 - - * conf/mount/mount_linux.c (do_mount_linux): removed plog() of - binary data - -2001-04-05 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * Makefile.am (install-snapshot): use a different symlink target - for the experimental snapshots. - -2001-02-23 Erez Zadok - - * Makefile.am (EXTRA_DIST_CONF): include nfs_prot_darwin.h in - distributions. - -2001-02-22 Erez Zadok - - * 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 - - * 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 - - * 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 - - * aux/macros/check_fs_mntent.m4 (ac_safe): remove debugging "echo" - command. - -2001-02-18 Erez Zadok - - * 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 - - * AUTHORS: added Ahmon Dancy - - * (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 - - * conf/mount/mount_linux.c: made linux_nfs_error() more robust. - -2001-02-01 Erez Zadok - - * 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 - - * 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 - - * 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 - - 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 - - * 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 - - * 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 - - * 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 - - * ALL: bump copyright year to 2001. - -2001-01-05 Erez Zadok - - * acconfig.h: correct comments for NODEV/NONDEV mount options - -Fri Jan 5 05:12:02 2001 Erez Zadok - - * 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 - here so we don't have to include this header. - -2001-01-04 Erez Zadok - - * 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 . - -2000-12-06 Ion Badulescu - - * include/am_defs.h: force non-inclusion of via - - - * 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 - - * doc/am-utils.texi (opts Option): document lock/nolock - -2000-12-02 Ion Badulescu - - * 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 on a glibc2 - system; include if it exists, instead of - - - * 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 - and the MS_BIND generic mount option - -2000-11-29 Ion Badulescu - - * 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 - - 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 - - * split amd/ops_autofs.c into conf/autofs/autofs_.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 - - * libamu/wire.c (getwire_lookup): truncate the hostname to - MAXHOSTNAMELEN characters. - -2000-11-26 Erez Zadok - - * include/am_utils.h (MAXHOSTNAMELEN): if not defined, set this to - 256 bytes, not 64. Suggestion form Kris Kennaway - . - -2000-11-26 Erez Zadok - - * 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 - - * 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 - - -2000-11-22 Ion Badulescu - - * 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 - - * 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 - - * libamu/mount_fs.c (mnt_flags, compute_nfs_args): recognize - proplist mnttab flag. Bug fix from Wolfram Klaus - . - -2000-11-19 Erez Zadok - - * 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 - - * 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 - - * 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 - - * scripts/am-eject.in: accept "cdrom" and "floppy" as arguments. - -2000-11-05 Ion Badulescu - - 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 - - * MIRRORS (Note): added a mirror at ufl.edu - -2000-10-11 Erez Zadok - - * 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 - - * scripts/ctl-amd.in: add targets condrestart (redhat) and - reload. - -2000-10-04 Erez Zadok - - * scripts/lostaltmail.in (vrfy_user): ensure that MAILDIR is - defined. - -2000-09-18 Erez Zadok - - * amd/opts.c (backslash): Bell char (ASCII 007) should be \g, not - \a. - -2000-09-17 Erez Zadok - - * include/am_utils.h: removed unused field opt_autopref - - * amd/opts.c: removed unused variable $autopref - -2000-09-05 Erez Zadok - - * 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 - - * buildall (Usage): typo in usage string - -2000-08-25 Erez Zadok - - * 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 - - * 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 - - * scripts/amd.conf-sample: -O is CLI equivalent to "os" - amd.conf parameter - -2000-07-30 Erez Zadok - - * scripts/amd.conf-sample (nfs_retransmit_counter): correct - meaning and use of parameter - -2000-07-23 Erez Zadok - - * doc/am-utils.texi: updated URLs to www.am-utils.org. - -2000-07-04 Erez Zadok - - * doc/am-utils.texi (Supported Platforms): document osf4.0f - -2000-06-19 Erez Zadok - - * 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 - - * amd/opts.c (eval_selectors): don't deref opt after it's been - XFREE'd - -2000-06-11 Erez Zadok - - * amd/opts.c: move mount_type expansion until later in the list, - so common variable are "hit" first. - -2000-06-11 Ion Badulescu - - * 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 - - * 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 - - * conf/nfs_prot/nfs_prot_bsdi2.h: getifaddrs() on bsdi2 is broken. - Don't use it. - -2000-06-09 Rainer Orth - - * 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 - - * 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 - - * 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 . 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 . - - * 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 - . - - * README: updated instructions - - * bootstrap: remove log file before existing - -2000-06-06 Erez Zadok - - * 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 - - * cvs-server.txt: instructions for maintainers to access the CVS - server for am-utils. - -2000-06-03 Ion Badulescu - - * 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 - - * 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 . - - * config.{guess,sub}: make sure chmod'ed a+rx. Updated from - latest GNU copies. - -2000-05-30 Ion Badulescu - - * aux/configure.in: bump up the version to 6.1a2 - -2000-05-29 Ion Badulescu - - * released snapshot am-utils-6.1a1 - -2000-05-29 Ion Badulescu - - * 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 - - * doc/am-utils.texi (Network Filesystem Group): minor typos - -2000-05-28 Ion Badulescu - - * 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 - - * 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 - - * libamu/wire.c (getwire_lookup): handle calling irs_gen_acc with - one or two arguments (bsdi3 vs. bsdi4) - -2000-05-27 Ion Badulescu - - * libamu/xutil.c (amu_release_controlling_tty): removed an unused - variable from the previous patch - -2000-05-26 Ion Badulescu - - * 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 and - , it really doesn't work - -2000-05-16 Ion Badulescu - - * 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 - - * Makefile.am (EXTRA_DIST_CONF): added conf/autofs/autofs_linux.h - -2000-05-10 Ion Badulescu - - * 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 - - * 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 - - * 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 - - * Merged changes from stable branch - -2000-04-30 Erez Zadok - - * 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 and . - - * 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 - - * minor new ports: i686-pc-linux-gnu-rh6.2, - i386-unknown-freebsdelf3.4, i586-pc-linux-gnu-rh6.2. - -2000-04-03 Erez Zadok - - * aux/acconfig.h: move all #undef macros above @TOP@, so they can - be recognized by pickier autoconf. - -2000-04-03 Erez Zadok - - * aux/macros/cache_check_dynamic.m4 (ac_tmp): use correct echo -n - or \c. - -2000-03-25 Erez Zadok - - * include/am_defs.h: ditto - - * aux/macros/{mount_headers,try_compile_anyfs}.m4: force - non-inclusion of . Breaks build on newer 2.3 - kernels. - -2000-02-26 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * doc/am-utils.texi (nfs_vers/nfs_proto): description of two - parameters was reversed. Reported by Paul Jenner - . - -2000-02-16 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 (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 - - ******************************************************************* - *** Released am-utils-6.0.3 *** - ******************************************************************* - -2000-02-06 Erez Zadok - - * 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 - - * released snapshot am-utils-6.0.3s5 - -2000-01-25 Erez Zadok - - * 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 - to allow browsable auto maps. - -2000-01-24 Erez Zadok - - * 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 - . - -2000-01-20 Erez Zadok - - * 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 - 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 - - * minor port to i386-pc-bsdi4.1. - -2000-01-13 Erez Zadok - - * 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 - - * 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 - - * ALL: bump copyright year to 2000. - -1999-12-16 Erez Zadok - - * 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 - - * 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 - - * released snapshot am-utils-6.0.3s2 - -1999-12-09 Erez Zadok - - * 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 . - -Thu Dec 9 19:09:38 1999 Rainer Orth - - * 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 . - * 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 - - * aux/macros/*.m4: prepare for hpux-12 (assume same as hpux-11) - -1999-11-16 Erez Zadok - - * 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 - - * MIRRORS (Asia): two new mirrors in Japan. - -1999-11-10 Erez Zadok - - * 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 - - * 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 . - -1999-10-13 Erez Zadok - - * released snapshot am-utils-6.0.3s1 - -1999-10-12 Erez Zadok - - * 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 - - * amd/amfs_auto.c (amfs_auto_bgmount): patch from Nick Williams - . 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 - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0.2 *** - ******************************************************************* - -1999-09-27 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 . - (mapc_sync): mapc_reload_map() always succeeds. - -1999-09-22 Erez Zadok - - * 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" - . - - * aux/configure.in: check for vsnprintf. - -1999-09-21 Erez Zadok - - * 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 - - * minor port i386-unknown-freebsdelf3.3 - - * released snapshot am-utils-6.0.2s1 - -1999-09-17 Erez Zadok - - * 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 - . - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0.1 *** - ******************************************************************* - -1999-09-08 Erez Zadok - - * 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 - - * aux/macros/check_field.m4 (ac_upcase_var_name): include - 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.com. - - * aux/macros/try_compile_anyfs.m4: include . - Bug reported by christos@zoulas.com. - - * aux/macros/mount_headers.m4: include - -1999-09-06 Erez Zadok - - * libamu/xutil.c (expand_error): use strerror if available instead - of sys_errlist. Bug reported by - 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" - -1999-08-29 Erez Zadok - - * 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 - - * 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 - - * scripts/ctl-{amd,hlfsd}.in: update RH tags for start/stop - scripts. - -1999-08-24 Erez Zadok - - * 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 - - * released snapshot am-utils-6.0.1s10 - -Sun Aug 22 16:18:59 1999 Erez Zadok - - * 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 - - * 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 . - - * conf/transp/transp_tli.c (create_autofs_service): use correct - autofs_port. IP packet security fix from Jeffrey C Honig - . - - * conf/transp/transp_sockets.c (bindnfs_port): remove unnecessary - function. IP packet security fix from Jeffrey C Honig - . - (create_nfs_service): use bind_resv_port() directly. ensure that - privileged ports are used. IP packet security fix from Jeffrey C - Honig . - - * 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 . - - * amd/amq_subr.c (ok_security): use IPPORT_RESERVED, instead of - hard-coded 1024. IP packet security fix from Jeffrey C Honig - . - (amqproc_mount_1_svc): provide information on the caller making an - amq -M request. IP packet security fix from Jeffrey C Honig - . - - * 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 . - - * 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 - - * amd/info_ldap.c (get_ldap_timestamp): initialize variable err. - (amu_ldap_search): initialize variable err. - -1999-08-16 Erez Zadok - - * libamu/wire.c: written using getifaddrs() for BSD systems, - contributed by BSDI, Jeffrey C Honig ). - -1999-08-15 Erez Zadok - - * 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 - - * 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 . - - * 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 . Fixed to use addopts for - any automount map options specified. - -1999-08-09 Erez Zadok - - * released snapshot am-utils-6.0.1s9 - -1999-08-09 Erez Zadok - - * 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 - - * 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 . - - * include/am_defs.h: fix conflicts on linux 2.2 systems with older - libc5. Bug fix from Peter Breitenlohner . - - * 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 - - * conf/mtab/mtab_aix.c (mnt_dup): add support for nfs3 - mounting, as per Dale Talcott . 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 - - * minor port i386-unknown-openbsd2.5 - -1999-07-17 Erez Zadok - - * 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 - - * released snapshot am-utils-6.0.1s8 - -1999-06-23 Erez Zadok - - * 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 (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 and - on 2.2 linux kernels. - include as needed (RedHat/Linux 6.0) - -1999-04-20 Erez Zadok - - * 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 - - * aux/GNUmakefile: invoke aclocal with new --altdir flag. - -1999-04-16 Erez Zadok - - * minor new port: i386-unknown-netbsd1.4 (ALPHA) - - * aux/macros/check_field.m4: no need to include - and because they are also included - from MOUNT_HEADERS. Causes multiple inclusion of unprotected - headers on netbsd-1.4_ALPHA. - -1999-04-15 Erez Zadok - - * 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 - - * newer automake wants texinfo.tex to be in aux/ not doc/ - -1999-03-30 Erez Zadok - - * 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 . - - * scripts/lostaltmail.in (Splice_in_resent_headers): ensure Y2K - compliant format. Patch from Paul Balyoz - - - * 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 - . - -1999-03-24 Erez Zadok - - * minor port i386-pc-bsdi4.0.1 - -1999-03-20 Erez Zadok - - * doc/am-utils.texi (Supported Platforms): add forgotten listing - for powerpc-linux. - -1999-03-18 Erez Zadok - - * scripts/amd.conf.5: fix typo. From Jeffrey C Honig - . - - * doc/am-utils.texi: document iso9660 options norrip, gens, and - extatt. - (opts Option): documented dumbtimr and noauto options. From - Jeffrey C Honig . - - * 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 - as needed. - - * aux/configure.in: check for isofs mount options for bsdi4: - norrip, gens, and extatt. Reported by Jeffrey C Honig - . - - * aux/macros/check_mnt2_cdfs_opt.m4: check for ISOFSMNT_* flags - (bsdi4). - -1999-03-17 Erez Zadok - - * conf/nfs_prot/nfs_prot_freebsd3.h: ditto. - - * conf/nfs_prot/nfs_prot_bsdi3.h: include , - for bsdi4, as per Jeffrey C Honig . - -1999-03-15 Erez Zadok - - * 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 . - - * fixmount/Makefile.am (DISTCLEANFILES): make distclean should - remove checkmount.c. Reported by Jeffrey C Honig . - - * Makefile.am (DISTCLEANFILES): make distclean should remove - amu_nfs_prot.h, config.cache.old, and dbgcf.h. Reported by - Jeffrey C Honig . - -1999-03-13 Erez Zadok - - * released snapshot am-utils-6.0.1s6 - -1999-03-12 Erez Zadok - - * INSTALL: document freebsdelf. - - * doc/am-utils.texi (Supported Platforms): document freebsdelf. - -1999-03-08 Erez Zadok - - * 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 - . - -1999-02-17 Erez Zadok - - * */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 - - * 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 - - * 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 - - -1999-02-04 Erez Zadok - - * released snapshot am-utils-6.0.1s4 - -1999-02-03 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 . - -1999-01-20 Erez Zadok - - * 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 - - * buildall: all if statements should have an else clause because - of Ultrix's /bin/sh. - -1999-01-15 Erez Zadok - - * 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 - -1999-01-13 Erez Zadok - - * 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 - - * 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 - - * 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 - - * BUGS (mips-dec-ultrix4.3): Update Ultrix caveats. - -Tue Jan 12 00:05:42 1999 Rainer Orth - - * 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 - - * 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 - - * amd/info_hesiod.c (hesiod_isup): New function. - * amd/mapc.c (maptypes): Add it. - -1999-01-10 Erez Zadok - - * released snapshot am-utils-6.0.1s1 - -1999-01-09 Erez Zadok - - * ALL: bump copyright year to 1999. - -Fri Jan 8 15:24:15 1999 Rainer Orth - - * 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 - - * 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 - - * aux/configure.in (AM_PROG_YACC): Replaced by AC_PROG_YACC, not - in current automake. - -Thu Jan 7 02:55:18 1999 Rainer Orth - - * 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 - - * doc/texinfo.tex: updated off of latest GNU mirror. - -1999-01-04 Erez Zadok - - * 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 - - ******************************************************************* - *** Released am-utils-6.0 *** - ******************************************************************* - -1998-12-28 Erez Zadok - - * conf/nfs_prot/nfs_prot_sunos5_7.h: support ldap in solaris 2.7. - -1998-12-27 Erez Zadok - - * conf/nfs_prot/nfs_prot_bsdi3.h: don't use reserved ports on - bsdi4 for NFS V3/nfs mounts. - -1998-12-26 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * conf/mount/mount_aix.c: minor code cleanup - - * aux/configure.in: check for extern definition to xdr_groups. - -1998-12-15 Erez Zadok - - * minor new port: powerpc-ibm-aix4.3.1.0 - - * aux/macros/*.m4: updates for aix 4.3 - -1998-12-14 Erez Zadok - - * 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 - - * amd/amfs_nfsl.c (amfs_nfsl_ffserver): use case insensitive host - name match. Bug fix from Douglas K. Rand" . - -1998-11-20 Erez Zadok - - * 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" , from the FreeBSD source tree. Use - real variable whose pointer is on the stack for decoding a long - int. - -1998-11-11 Erez Zadok - - * scripts/ctl-{amd,hlfsd}.in: include comments useful for redhat's - chkconfig utility. - -1998-11-10 Erez Zadok - - * released snapshot am-utils-6.0b2s3 - - * conf/transp/transp_sockets.c (create_nfs_service): remove C++ - style comments. - -1998-11-04 Erez Zadok - - * 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 . - - * All files: spell comments and strings. - -1998-11-03 Erez Zadok - - * 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 - - * amd/amd.c (main): bug fix: swapped arguments to kill(2). Fix - from Danny Rathjens . - -1998-10-28 Erez Zadok - - * released snapshot am-utils-6.0b2s1 - -1998-10-27 Erez Zadok - - * 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 - - ******************************************************************* - *** Released am-utils-6.0b1 *** - ******************************************************************* - -1998-10-18 Erez Zadok - - * 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 in 2.1 - kernels. - -1998-10-18 Erez Zadok - - * A.i386-unknown-netbsd1.3.2/amu_nfs_prot.h: trim down and cleanup - for netbsd 1.3.2. - -1998-10-17 Erez Zadok - - * 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" - 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 - - * 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" . - - * scripts/amd.conf.5: minor typo reported by "David O'Brien" - in .TH section of man page. - - * amd/info_nis.c (am_yp_all): don't leak key-val entries. Patch - from Thomas Richter . - -1998-10-12 Erez Zadok - - * doc/am-utils.texi (Program Filesystem): minor typo fixed as per - Andreas Stolcke . - - * 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 - - * aux/macros/{check_mtype_type,check_mtype_printf_type}.m4: most - systems now use "char *" as their mount type. - -1998-10-08 Erez Zadok - - * 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 - - * 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 and - (2.1 kernels). - -1998-09-28 Erez Zadok - - * 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 - - * conf/mount/mount_linux.c (parse_opts): check for pcfs support - only if autoconfigured. - -1998-09-18 Erez Zadok - - * Makefile.am (EXTRA_DIST): distribute README.yk2 file. - - * README.y2k: explain y2k compliance status of am-utils. - -1998-09-16 Erez Zadok - - * 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 - - * aux/configure.in: check for , 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 - - * hlfsd/stubs.c (getcreds): force sscanf arg to u_long. - -Tue Jul 14 20:34:25 1998 Erez Zadok - - * released snapshot am-utils-6.0a17s1 - -Wed Jul 8 21:49:15 1998 Erez Zadok - - * 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 - - * aux/macros/{mount_headers,try_compile_anyfs,try_compile_nfs}.m4, - include/am_defs.h: include before - because on redhat 5.1, there is a bug (misuse) of - headers in (it defines _LINUX_TYPES_H instead of - __KERNEL_STRICT_NAMES). - - * aux/configure.in: check for because it is - need for RedHat 5.1. - -Wed Jun 17 00:05:33 1998 Erez Zadok - - * 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 - - * 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 - - * amd/ops_autofs.c (mount_autofs): cast pid to long. - -Tue Apr 28 15:12:36 1998 Rainer Orth - - * 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 - - * 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 - - * conf/nfs_prot/nfs_prot_sunos5_4.h (MNTTYPE_CACHEFS): Define, - missing from . - - * conf/mtab/mtab_ultrix.c: Need separate inclusion of - without KERNEL defined here. - - * aux/macros/mount_headers.m4: Need to include , - , 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 - - ******************************************************************* - *** Released am-utils-6.0a16 *** - ******************************************************************* - -Wed Apr 22 01:20:39 1998 Erez Zadok - - * 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 - - * 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 slightly modified. - -Mon Apr 20 00:37:20 1998 Erez Zadok - - * 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 - - * 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 - - * amd/amd.c (daemon_mode): set a temporary secure umask(0022) - before writing log file and restore it afterwards. Patch from - Donald Buczek . - - * 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 . - - * libamu/xutil.c (switch_to_logfile): compare logfile name and - syslog string with correct length. Patch from Donald Buczek - . - - * amd/restart.c (restart): correctly inherit existing NFS V.3 - mounts upon restart. Patch from Donald Buczek - . - -Sat Apr 18 19:01:19 1998 Erez Zadok - - * 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 - - * converted to using libtool-1.2. - -Tue Mar 10 16:52:09 1998 Erez Zadok - - * 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 - - * aux/config.{guess,sub}: used from gcc-2.8.1. - -Sat Mar 7 15:33:27 1998 Erez Zadok - - * 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 - - * 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 (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 - - * include/am_defs.h: #define KERNEL to avoid definition of - gt_names[] conf/mtab/mtab_ultrix.c: #include before - 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 before AMU_NFS_PROTOCOL_HEADER for svc_req - definition in prototypes - - * aux/macros/mount_headers.m4: include before - AMU_NFS_PROTOCOL_HEADER: 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 - -Sat Mar 7 13:56:05 1998 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 . - - * 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 - - * 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 - - * doc/am-utils.texi: lots of documentation fixes from Rainer Orth - . - -Sat Feb 28 22:16:35 1998 Erez Zadok - - * 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) - - * 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 - - * 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 - - * aux/macros/check_lib2.m4 (AC_CHECK_LIB2): fix macro so it - includes auxiliary library only if needed. - -1998-02-22 Erez Zadok - - * amd/conf_tok.l: undefine ECHO again, so it doesn't get used - later. - -Sun Feb 22 01:41:08 1998 Erez Zadok - - * 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 - - * 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 - - * 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 - - * scripts/ctl-hlfsd.in: turn -D fork so primary process never - hangs. - -Sat Feb 21 02:45:51 1998 Erez Zadok - - * include/am_defs.h: don't include and - , just remaining definitions in - -Thu Jan 29 00:44:28 1998 Erez Zadok - - * released snapshot am-utils-6.0a16s5 - - * conf/mount/mount_irix6.c (mount_irix): pass {u,e,x}fs_args to - mount(2). - - * check for 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 . - - * 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 - 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 - - * 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 . - -Wed Jan 28 12:20:56 1998 Erez Zadok - - * 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 , 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 - , 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 - - * 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 - - * 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 - - * include/am_utils.h (dlog): amuDebug macros reduced to shorter - forms. - -Fri Jan 23 18:38:30 1998 Erez Zadok - - * released snapshot am-utils-6.0a16s3 - - * include/am_defs.h: on Solaris 2.6, is included - in 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 - - * README: show how to configure in additional support such as - hesiod using various --enable-* flags. - -Wed Jan 14 15:13:02 1998 Erez Zadok - - * 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 - -1998-01-14 Erez Zadok - - * aux/configure.in: look for "isofs" as a possible mount type for - cdfs (RedHat Linux). - -Wed Jan 14 02:07:05 1998 Erez Zadok - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a15 *** - ******************************************************************* - -Sun Jan 11 15:06:34 1998 Erez Zadok - - * 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 - - * 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 - 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 on redhat alpha linux. Also turn off usage of - 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 - and which must be avoided. - - * aux/configure.in: check for , 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * A.m68k-next-nextstep3/amu_nfs_prot.h: define missing S_ISDIR - macro based on existence on others, and include . - -Thu Dec 11 14:14:38 1997 Erez Zadok - - * aux/macros/try_compile_nfs.m4 (AC_TRY_COMPILE): turn off - inclusion of 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 - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a14 *** - ******************************************************************* - -Sun Nov 16 21:56:16 1997 Erez Zadok - - * doc/am-utils.texi (Supported Platforms): updated table of new - ports. - -Sat Nov 15 06:36:27 1997 Erez Zadok - - * 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 - 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 - . - -1997-11-15 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a13 *** - ******************************************************************* - -Fri Oct 24 05:04:37 1997 Erez Zadok - - * 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: is for - kernel only on bsdi2, so do not include it. - -Fri Oct 24 00:29:42 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * conf/checkmount/checkmount_bsd44.c: include prototype. - -Fri Sep 26 01:26:24 1997 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.0a12 *** - ******************************************************************* - -Fri Sep 26 00:13:48 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - and 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 - 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 - - * 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 - - * 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 - - * conf/transp/transp_sockets.c (pmap_ping): patch from Dan Riley - 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 . - - * Lots of fixes from Christos Zoulas 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 - - * amd/ops_fs.c (mount_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 . - -Mon Sep 22 00:34:19 1997 Erez Zadok - - * conf/nfs_prot/nfs_prot_sunos4.h: include 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * conf/transp/transp_tli.c (amu_clnt_create_best_vers): avoid - infinite loop. - -Sun Sep 7 18:23:23 1997 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.0a11 *** - ******************************************************************* - -Fri Sep 5 11:55:10 1997 Erez Zadok - - * amd/amd.c (main): if plock() succeeded, don't try to display - errno message. Patch from Chris Metcalf - - - * 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 . - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a10 *** - ******************************************************************* - -Mon Sep 1 15:39:51 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - to make amd works when talking to NIS+ servers in NIS - compatibility mode. - -Mon Sep 1 00:46:56 1997 Erez Zadok - - * amd/mapc.c (MAX_CHAIN): increased maximum chain size to 1024. - -Sun Aug 31 20:20:40 1997 Erez Zadok - - * 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 . - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a9 *** - ******************************************************************* - -Thu Aug 7 00:52:14 1997 Erez Zadok - - * conf/nfs_prot/nfs_prot_ncr2.h: new file, for NCR2 - (i486-ncr-sysv4.3.03) headers. Needed to complete missing stuff - from and . - - * 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 . - - * 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 - , 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 - - * 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 - - * 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 - - * amd/amd.c (init_global_options): find the kernel architecture - from uname() if possible. - -Mon Jul 28 03:53:59 1997 Erez Zadok - - * new working port: i386-unknown-openbsd2.1 - -Fri Jul 25 03:16:31 1997 Erez Zadok - - * 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 - - * conf/mount/mount_svr4.c (mount_svr4): use STREQ to compare mount - types, not ==. Fix from Christos Zoulas . - - * mk-amd-map/mk-amd-map.8: man page taken from bsd44. - -Thu Jul 24 00:01:55 1997 Erez Zadok - - * conf/mount/mount_linux.c: made the nfs error mapping code into a - small function. - -Wed Jul 23 16:11:49 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - -Tue Jul 22 04:02:05 1997 Erez Zadok - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a8 *** - ******************************************************************* - -Mon Jul 21 21:33:19 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 and also - define a conflicting one via lex. Newer versions of f/lex are ok. - -Wed Jul 16 00:17:45 1997 Erez Zadok - - * 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 - - * 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 - ), 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 - - * 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 - - * 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 - - * 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 . - -Fri Jul 11 02:16:06 1997 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.0a7 *** - ******************************************************************* - -Thu Jul 10 12:19:25 1997 Erez Zadok - - * 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 - . - - * aux/config.guess: added recognition for sun3's running 4.2bsd, - from Tom Schmidt . 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 - . - - * 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 - . - - * conf/nfs_prot/nfs_prot_sunos5_3.h: port to sparc-sun-solaris2.3 - completed. - -Wed Jul 9 18:14:59 1997 Erez Zadok - - * port to sparc-unknown-netbsd1.2E done, not tested. Includes NFS - V.3. - -Tue Jul 8 17:35:07 1997 Erez Zadok - - * 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 before - 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 - - * 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 - - * COPYING: put in some legal stuff in this file. - -Mon Jul 7 19:10:44 1997 Erez Zadok - - * NFS V3 now works under Irix5, thanks to patches from - Andreas Stolcke . - - * 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 - . - -Mon Jul 7 19:04:14 1997 Erez Zadok - - * amd/ops_nfs.c (mount_nfs_fh): fixed NFS V.3 support for bsdi3. - -Sun Jul 6 14:22:24 1997 Erez Zadok - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a6 *** - ******************************************************************* - -Sat Jul 5 03:17:09 1997 Erez Zadok - - * 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 - - * 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 - - * 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 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 - - * conf/nfs_prot/nfs_prot_sunos4.h: added rpc/rpc.h and - sys/errno.h. - -Thu Jul 3 17:49:00 1997 Erez Zadok - - * 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 - - * 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 - - * aux/macros/check_mnt2_gen_opt.m4: turned back on the checking - for M_* macros, but ensure that is not included at - all so it won't conflict with other M_* macros. - -Tue Jul 1 21:16:51 1997 Erez Zadok - - * 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 - - * 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 . - - * 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 - 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 - - * 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 - - * 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 - - * 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 - - * 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 to parse an - amd configuration file. - -Wed Jun 25 23:15:42 1997 Erez Zadok - - * converted all files that used strcmp() == 0 or != 0 to using - the STREQ() macro. - -Mon Jun 23 22:31:14 1997 Erez Zadok - - * 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 - - * amd/mapc.c: Included patch from Leif Johansson - to ensure that systems without an RE - library can compile. - - * libamu/mount_fs.c (mount_fs): Included patch from Andreas - Stolcke , 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 , 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 - - * 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 - - * 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 - - * 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 - - * scripts/fix-amd-map.in (name): replace all matching patterns on - line. - -Sun May 25 19:33:41 1997 Erez Zadok - - ******************************************************************* - *** Released am-utils-6.0a5 *** - ******************************************************************* - -Sun May 25 13:37:24 1997 Erez Zadok - - * 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 - - * 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 - - * 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 . 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 - - * 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 on OSF systems. - - * fsinfo/fsi_util.c (set_ether_if): take out extern definition of - inet_addr(). It should come from 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 - - * 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 - - * 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 - - * 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 - - * amq/amq.c: many newline characters were missing from various - stderr printfs. - -Sat May 10 13:09:06 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a4 *** - ******************************************************************* - -Wed Mar 26 21:15:36 1997 Erez "HWank1" Zadok - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a3 *** - ******************************************************************* - -Wed Mar 19 17:49:18 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 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 . - -Tue Mar 4 17:16:52 1997 Erez "HWank1" Zadok - - * 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 - - * 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 - - * ported mk-amd-map. - - * buildall: added -K option to buildall, to run mkconf. - -Fri Feb 28 01:10:25 1997 Erez "HWank1" Zadok - - ******************************************************************* - *** Released am-utils-6.0a2 *** - ******************************************************************* - -Thu Feb 27 13:58:59 1997 Erez "HWank1" Zadok - - * 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 - - * 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 - - * 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 - - * include/am_defs.h: include (HPUX) if exists. - - * aux/macros/try_compile_nfs.m4: include (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 (HPUX) if exists. - -Wed Feb 26 00:32:35 1997 Erez "HWank1" Zadok - - * 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 - - * 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 to all of the source and header - files that required it. - -Mon Feb 24 01:27:02 1997 Erez Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - ******************************************************************* - *** Released am-utils-6.0a1 *** - ******************************************************************* - -Thu Feb 6 02:55:19 1997 Erez "HWank1" Zadok - - * 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 - - * 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 - - * amd/rpc_fwd.c: removed all TLI (HAVE_T_OPEN) code. - -Wed Jan 29 18:25:07 1997 Erez "HWank1" Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * amd/info_hesiod.c: renamed macro HAS_HESIOD_RELOAD to - HAVE_HS_ZONE_TRANSFER. - -Mon Dec 30 17:33:23 1996 Erez "HWank1" Zadok - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - ******************************************************************* - *** Initial ChangeLog Entry *** - ******************************************************************* Index: contrib/amd/FAQ =================================================================== --- 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 -the am-utils list (see www.am-utils.org). - -Thank you, -The Am-utils development team. - - - -*** 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. - - Index: contrib/amd/FREEBSD-Xlist =================================================================== --- contrib/amd/FREEBSD-Xlist +++ /dev/null @@ -1,268 +0,0 @@ -$FreeBSD$ -*LSM.am-utils -*Makefile.* -*README.autofs -*README.osx -*ac*.m4 -*.old -*acconfig.h -*aux -*autom4te.cache* -*buildall -*config* -*depcomp -*install-sh -*lt* -*missing -*mkinstalldirs -*stamp-h.in -*amd/test1.sh -*amd/Makefile.* -*amq/Makefile.* -*commit -*cvs-server.txt -*conf/checkmount/checkmount_aix.c -*conf/checkmount/checkmount_default.c -*conf/checkmount/checkmount_osf.c -*conf/checkmount/checkmount_svr4.c -*conf/checkmount/checkmount_ultrix.c -*conf/fh_dref/fh_dref_aix3.h -*conf/fh_dref/fh_dref_aix42.h -*conf/fh_dref/fh_dref_bsd44.h -*conf/fh_dref/fh_dref_default.h -*conf/fh_dref/fh_dref_hpux.h -*conf/fh_dref/fh_dref_irix.h -*conf/fh_dref/fh_dref_isc3.h -*conf/fh_dref/fh_dref_linux.h -*conf/fh_dref/fh_dref_nextstep.h -*conf/fh_dref/fh_dref_osf2.h -*conf/fh_dref/fh_dref_osf4.h -*conf/fh_dref/fh_dref_sunos3.h -*conf/fh_dref/fh_dref_sunos4.h -*conf/fh_dref/fh_dref_svr4.h -*conf/hn_dref/hn_dref_default.h, -*conf/hn_dref/hn_dref_isc3.h -*conf/hn_dref/hn_dref_linux.h -*conf/mount/mount_aix.c -*conf/mount/mount_aix3.c -*conf/mount/mount_bsdi3.c -*conf/mount/mount_default.c -*conf/mount/mount_freebsd3.c -*conf/mount/mount_hpux.c -*conf/mount/mount_irix5.c -*conf/mount/mount_irix6.c -*conf/mount/mount_isc3.c -*conf/mount/mount_linux.c -*conf/mount/mount_mach3.c -*conf/mount/mount_stellix.c -*conf/mount/mount_svr4.c -*conf/mtab/mtab_aix.c -*conf/mtab/mtab_file.c -*conf/mtab/mtab_isc3.c -*conf/mtab/mtab_linux.c -*conf/mtab/mtab_mach3.c -*conf/mtab/mtab_osf.c -*conf/mtab/mtab_svr4.c -*conf/mtab/mtab_ultrix.c -*conf/nfs_prot/nfs_prot_aix3.h -*conf/nfs_prot/nfs_prot_aix4.h -*conf/nfs_prot/nfs_prot_aix4_2.h -*conf/nfs_prot/nfs_prot_aix4_3.h -*conf/nfs_prot/nfs_prot_aix5_1.h -*conf/nfs_prot/nfs_prot_aix5_2.h -*conf/nfs_prot/nfs_prot_bsdi2.h -*conf/nfs_prot/nfs_prot_bsdi3.h -*conf/nfs_prot/nfs_prot_darwin.h -*conf/nfs_prot/nfs_prot_default.h -*conf/nfs_prot/nfs_prot_hpux.h -*conf/nfs_prot/nfs_prot_hpux11.h -*conf/nfs_prot/nfs_prot_irix5.h -*conf/nfs_prot/nfs_prot_irix6.h -*conf/nfs_prot/nfs_prot_linux.h -*conf/nfs_prot/nfs_prot_ncr2.h -*conf/nfs_prot/nfs_prot_netbsd.h -*conf/nfs_prot/nfs_prot_netbsd1_3.h -*conf/nfs_prot/nfs_prot_netbsd1_4.h -*conf/nfs_prot/nfs_prot_nextstep.h -*conf/nfs_prot/nfs_prot_openbsd.h -*conf/nfs_prot/nfs_prot_osf2.h -*conf/nfs_prot/nfs_prot_osf4.h -*conf/nfs_prot/nfs_prot_osf5.h -*conf/nfs_prot/nfs_prot_osf5_1.h -*conf/nfs_prot/nfs_prot_sunos3.h -*conf/nfs_prot/nfs_prot_sunos4.h -*conf/nfs_prot/nfs_prot_sunos5_3.h -*conf/nfs_prot/nfs_prot_sunos5_4.h -*conf/nfs_prot/nfs_prot_sunos5_5.h -*conf/nfs_prot/nfs_prot_sunos5_6.h -*conf/nfs_prot/nfs_prot_sunos5_7.h -*conf/nfs_prot/nfs_prot_sunos5_8.h -*conf/nfs_prot/nfs_prot_svr4.h -*conf/nfs_prot/nfs_prot_ultrix.h -*conf/autofs/autofs_linux.h -*conf/autofs/autofs_linux.c -*conf/autofs/autofs_solaris_v1.h -*conf/autofs/autofs_solaris_v1.c -*conf/autofs/autofs_solaris_v2_v3.h -*conf/autofs/autofs_solaris_v2_v3.c -*conf/sa_dref/sa_dref_386bsd.h -*conf/sa_dref/sa_dref_aix3.h -*conf/sa_dref/sa_dref_aoi.h -*conf/sa_dref/sa_dref_default.h -*conf/sa_dref/sa_dref_isc3.h -*conf/sa_dref/sa_dref_linux.h -*conf/sa_dref/sa_dref_svr4.h -*conf/transp/transp_tli.c -*conf/trap/trap_aix3.h -*conf/trap/trap_aux.h -*conf/trap/trap_dgux.h -*conf/trap/trap_freebsd3.h -*conf/trap/trap_hcx.h -*conf/trap/trap_hpux.h -*conf/trap/trap_hpux11.h -*conf/trap/trap_irix.h -*conf/trap/trap_isc3.h -*conf/trap/trap_linux.h -*conf/trap/trap_mach3.h -*conf/trap/trap_news4.h -*conf/trap/trap_rtu6.h -*conf/trap/trap_stellix.h -*conf/trap/trap_svr4.h -*conf/trap/trap_ultrix.h -*conf/umount/umount_aix.c -*conf/umount/umount_default.c -*conf/umount/umount_linux.c -*conf/umount/umount_osf.c -*doc/Makefile.am -*doc/Makefile.in -*doc/am-utils.dvi -*doc/am-utils.info -*doc/am-utils.info-1 -*doc/am-utils.info-2 -*doc/am-utils.info-3 -*doc/am-utils.info-4 -*doc/am-utils.info-5 -*doc/am-utils.info-6 -*doc/am-utils.info-7 -*doc/am-utils.ps -*doc/hlfsd.ps -*doc/mdate-sh -*fixmount/Makefile.* -*fsinfo/Makefile.* -*hlfsd/Makefile.* -*libamu/Makefile.* -*libamu/alloca.c -*libamu/clnt_sperrno.c -*libamu/memcmp.c -*libamu/strcasecmp.c -*libamu/strdup.c -*libamu/strstr.c -*libamu/strlcat.c -*libamu/strlcpy.c -*libamu/ualarm.c -*mk-amd-map/Makefile.* -*wire-test/Makefile.* -*m4/GNUmakefile -*m4/amdgrep* -*m4/amindent* -*m4/autopat* -*m4/chop-aclocal.pl* -*m4/copy-if-newbig* -*m4/mk-aclocal* -*m4/mkconf* -*m4/rmtspc* -*m4/update_build_version* -*m4/macros/HEADER -*m4/macros/TRAILER -*m4/macros/c_void_p.m4 -*m4/macros/cache_check_dynamic.m4 -*m4/macros/check_amu_fs.m4 -*m4/macros/check_checkmount_style.m4 -*m4/macros/check_extern.m4 -*m4/macros/check_fhandle.m4 -*m4/macros/check_field.m4 -*m4/macros/check_fs_headers.m4 -*m4/macros/check_fs_mntent.m4 -*m4/macros/check_gnu_getopt.m4 -*m4/macros/check_hide_mount_type.m4 -*m4/macros/check_lib2.m4 -*m4/macros/check_map_funcs.m4 -*m4/macros/check_mnt2_cdfs_opt.m4 -*m4/macros/check_mnt2_gen_opt.m4 -*m4/macros/check_mnt2_nfs_opt.m4 -*m4/macros/check_mnttab_file_name.m4 -*m4/macros/check_mnttab_location.m4 -*m4/macros/check_mnttab_opt.m4 -*m4/macros/check_mnttab_style.m4 -*m4/macros/check_mnttab_type.m4 -*m4/macros/check_mount_style.m4 -*m4/macros/check_mount_trap.m4 -*m4/macros/check_mount_type.m4 -*m4/macros/check_mtype_printf_type.m4 -*m4/macros/check_mtype_type.m4 -*m4/macros/check_network_transport_type.m4 -*m4/macros/check_nfs_fh_dref.m4 -*m4/macros/check_nfs_hn_dref.m4 -*m4/macros/check_nfs_prot_headers.m4 -*m4/macros/check_nfs_sa_dref.m4 -*m4/macros/check_nfs_socket_connection.m4 -*m4/macros/check_os_libs.m4 -*m4/macros/check_restartable_signal_handler.m4 -*m4/macros/check_umount_style.m4 -*m4/macros/check_unmount_args.m4 -*m4/macros/check_unmount_call.m4 -*m4/macros/expand_cpp_hex.m4 -*m4/macros/expand_cpp_int.m4 -*m4/macros/expand_cpp_string.m4 -*m4/macros/expand_run_string.m4 -*m4/macros/extern_optarg.m4 -*m4/macros/extern_sys_errlist.m4 -*m4/macros/field_mntent_t_mnt_time_string.m4 -*m4/macros/func_bad_memcmp.m4 -*m4/macros/func_bad_yp_all.m4 -*m4/macros/header_templates.m4 -*m4/macros/host_macros.m4 -*m4/macros/linux_headers.m4 -*m4/macros/localconfig.m4 -*m4/macros/mount_headers.m4 -*m4/macros/name_package.m4 -*m4/macros/name_version.m4 -*m4/macros/opt_amu_cflags.m4 -*m4/macros/opt_cppflags.m4 -*m4/macros/opt_debug.m4 -*m4/macros/opt_ldflags.m4 -*m4/macros/opt_libs.m4 -*m4/macros/os_cflags.m4 -*m4/macros/os_cppflags.m4 -*m4/macros/os_ldflags.m4 -*m4/macros/package_bugreport.m4 -*m4/macros/package_name.m4 -*m4/macros/package_version.m4 -*m4/macros/save_state.m4 -*m4/macros/struct_field_nfs_fh.m4 -*m4/macros/struct_mntent.m4 -*m4/macros/struct_mnttab.m4 -*m4/macros/struct_nfs_args.m4 -*m4/macros/struct_nfs_fh.m4 -*m4/macros/struct_nfs_fh3.m4 -*m4/macros/struct_nfs_gfs_mount.m4 -*m4/macros/try_compile_anyfs.m4 -*m4/macros/try_compile_nfs.m4 -*m4/macros/try_compile_rpc.m4 -*m4/macros/type_auth_create_gidlist.m4 -*m4/macros/type_cachefs_args.m4 -*m4/macros/type_cdfs_args.m4 -*m4/macros/type_efs_args.m4 -*m4/macros/type_lofs_args.m4 -*m4/macros/type_mfs_args.m4 -*m4/macros/type_pcfs_args.m4 -*m4/macros/type_recvfrom_fromlen.m4 -*m4/macros/type_rfs_args.m4 -*m4/macros/type_svc_in_arg.m4 -*m4/macros/type_time_t.m4 -*m4/macros/type_tmpfs_args.m4 -*m4/macros/type_ufs_args.m4 -*m4/macros/type_xdrproc_t.m4 -*m4/macros/type_xfs_args.m4 -*m4/macros/type_yp_order_outorder.m4 -*m4/macros/with_addon.m4 Index: contrib/amd/FREEBSD-upgrade =================================================================== --- contrib/amd/FREEBSD-upgrade +++ /dev/null @@ -1,103 +0,0 @@ -# ex:ts=8 -$FreeBSD$ - -AMD (am-utils) 6.1.5 - originals can be found at: ftp://ftp.am-utils.org/pub/am-utils/ - -For the import of AMD many files were pruned by: - - tar -X FREEBSD-Xlist -xf am-utils-6.1.5.tar.gz - -and `find . -name '.cvsignore' -delete` - -Then imported by: - - cvs import -m 'Virgin import of AMD (am-utils) v6.1.5' \ - src/contrib/amd COLUMBIA amd_6_1_5 - -After the import, a separate extraction of am-utils was GNU configured in -the "normal" way. The resulting config.h file should be compared with -src/usr.sbin/amd/include/config.h, and src/usr.sbin/amd/include/config.h -updated as needed. - -To make local changes to amd, simply patch and commit to the main -branch (aka HEAD). Never make local changes on the vendor (COLUMBIA) branch. - -Note, we don't trim anything in scripts/ as sysadmins may find the bits -as a useful reference. - -All local changes should be submitted to "am-utils@am-utils.org" or -https://bugzilla.am-utils.org for inclusion in the next vendor release. - -Local changes: - - amd/amd.8 - - corrected formatting of SEE ALSO - r1.17 Uniformly refer to a file system as "file system" - r1.16 Add the am-utils homepage to SEE ALSO - r1.15 s/BSD/.Bx/ where appropriate - r1.14 Avoid using parenthesis enclosure macros - r1.13 split punctuation characters + misc fixes - r1.12 mdoc(7)NG - r1.11 Catch a left over reference to "/a" - r1.10 Document change to the default mount dir. - r1.9 Mention "amd -H" in the synopsis - r1.8 Fix miscellaneous mdoc macro argument limit infringements - r1.7 Don't refer to non-existent automount(8) - r1.6 Fix errors in .Xr usage - r1.3 un-mandocafied, un4.4BSD'ed - r1.2 sort cross references - amd/amd.c - r1.7 use /.amd_mnt as default for -a - amq/amq.8 - r1.9 Uniformly refer to a file system as "file system". - r1.8 s/BSD/.Bx/ where appropriate. - r1.6 mdoc(7)NG. - r1.5 Remove reference to non-existent manpage - r1.4 Fix typos - r1.3 un-mandocafied, un4.4BSD'ed - amq/pawd.1 - r1.3 un-mandocafied, un4.4BSD'ed - r1.2 sorting of references - conf/nfs_prot/nfs_prot_freebsd3.h - r1.11 Userland part of nfs client/server split and cleanup - r1.6 restore the standard name nfs_fh3 - r1.3 Fully use our own generated files for NFSv3 - r1.2 rpcgen our own files for NFSv3 support - fixmount/fixmount.8 - r1.8 Uniformly refer to a file system as "file system" - r1.6 split punctuation characters + misc fixes. - r1.5 mdoc(7)NG. - r1.4 ".Mn mountd" -> ".Nm mountd" - r1.3 un-mandocafied, un4.4BSD'ed - r1.2 More sorting of references. - fsinfo/fsinfo.8 - r1.9 add section number to .Xr directive - r1.7 Uniformly refer to a file system as "file system" - r1.6 split punctuation characters + misc fixes - r1.5 mdoc(7)NG - r1.3 describe all of the command line options - r1.2 un-mandocafied, un4.4BSD'ed - hlfsd/hlfsd.8 - - Fix a broken SEE ALSO section and some mdoc issues - mk-amd-map/mk-amd-map.8 - r1.4 removed HISTORY info from the .Os call. - r1.2 un-mandocafied, un4.4BSD'ed - scripts/amd.conf.5 - r1.15 Bring man page back in shape - r1.13 Uniformly refer to a file system as "file system" - r1.12 Avoid using parenthesis enclosure macros - r1.11 mdoc(7)NG - r1.10 Fix miscellaneous mdoc macro argument limit infringements - r1.8 Fix a bunch of broken cross-references - r1.7 Bad reference of uname(2) -> uname(3) - r1.6 Grammer fix and style nits. - r1.5 xfer typo - r1.4 un-mandocafied, un4.4BSD'ed - r1.3 More sorting of references. - wire-test/wire-test.8 - r1.2 un-mandocafied, un4.4BSD'ed - -mbr@FreeBSD.org -obrien@NUXI.com -05-November-1999 Index: contrib/amd/INSTALL =================================================================== --- contrib/amd/INSTALL +++ /dev/null @@ -1,370 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, -Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell command `./configure && make && make install' -should configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf limitation. Until the limitation is lifted, you can use -this workaround: - - CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. Index: contrib/amd/MIRRORS.html =================================================================== --- contrib/amd/MIRRORS.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - Am-Utils 6.x Mirror Sites - - - -
-

Am-Utils 6.x Software Mirror Sites

- -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 AT am-utils.org" with the -full URL, maintainer's email, and geographical location. - -

- -

North America

- - -

Europe

- - -

Asia

- - -
- Last updated: 2006-11-27 - - - - - Index: contrib/amd/MIRRORS.txt =================================================================== --- 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 AT 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 AT am-utils.org - Minnesota: - ftp://ftp.cs.umn.edu/pub/am-utils - Maintainer: dokas AT cs.umn.edu -#Avoid for now: empty directory -# Virginia (Newport News): -# ftp://ftp.ferginc.com/pub/unix/am-utils -# Maintainer: Branson.Matheson AT FergInc.com -#server gone? (Jan 5, 2004) -# Ohio (Kent State University): -# ftp://info.mcs.kent.edu/pub/am-utils -# Maintainer: root AT mcs.kent.edu - Florida (University of Florida) - ftp://ftp.cise.ufl.edu/pub/mirrors/am-utils - Maintainer: mirror AT cise.ufl.edu - -Europe: - Germany: - ftp://ftp.fu-berlin.de/unix/network/am-utils - Maintainer: ftp-adm AT ftp.fu-berlin.de - Germany: - ftp://ftp.tu-darmstadt.de/pub/networking/filesystems/am-utils/ - Maintainer: networking AT ftp.tu-darmstadt.de - Sweden: - ftp://ftp.sunet.se/pub/unix/admin/am-utils - Maintainer: archive AT ftp.sunet.se -# not responding (Jan 5, 2004) -# Sweden (Stockholm University, Math Depat): -# ftp://mirror.matematik.su.se/pub/am-utils -# Maintainer: leifj AT matematik.su.se - UK: - ftp://sunsite.org.uk/package/am-utils - Maintainer: lmjm AT icparc.ic.ac.uk - -Asia: - Japan: - ftp://ftp.u-aizu.ac.jp/pub/net/amd/am-utils - Maintainer: ftp-admin AT u-aizu.ac.jp - Japan: - ftp://core.ring.gr.jp/pub/net/am-utils/ - Maintainer: ftpadmin AT ring.gr.jp - Japan: - ftp://ftp.ring.gr.jp/pub/net/am-utils/ - Maintainer: ftpadmin AT ring.gr.jp - -# gone? (Jan 5, 2004) -# Australia: -# Melbourne: -# ftp://ftp.sage-au.org.au/pub/network/filesystem/am-utils -# Maintainer: mirror AT ftp.sage-au.org.au Index: contrib/amd/NEWS =================================================================== --- contrib/amd/NEWS +++ /dev/null @@ -1,1567 +0,0 @@ -*** Notes specific to am-utils version 6.2 - - - Removed license advertising clause - - Removed expn program - -*** Notes specific to am-utils version 6.2-rc1 - -Filesystem Support: - - Add support for NFSv4 - - Add support for Lustre - - Add support for ext{2,3,4} - - Add support for linux autofs version 5 - - Add support for TMPFS and UDF -New features: - - Add amq -i (prints information about maps) - - Add synchronous unmount code for amq -uu - - Allow a comma-separated list of LDAP servers for failover -Changes in behavior: - - Empty variable assignments, now unset the variable value. - - Share LDAP connections between different maps to save resources -Portability fixes: - - Changes to work with Linux-2.6.x, Linux-3.x and NetBSD-5.x, NetBSD-6.x, - FreeBSD 7.x, Solaris -Bug fixes: - - Many bug fixes, see ChangeLog - -*** Notes specific to am-utils version 6.2a3 - -- minor new ports: - i386-apple-darwin8.8.1 - i386-pc-linux-centos4.4 (RHEL4 clone) - i386-pc-linux-fc6 (Fedora Core 6) - i386-pc-solaris2.11-nexentaos (GNU/OpenSolaris) - ia64-hp-hpux11.23 (gcc and cc) - powerpc-apple-darwin8.7.0 - -- Bugs fixed: - * reduce annoying warnings from xstrlcpy when expanding options. - * translate '*' Sun maps correctly with "${key}" - -*** Notes specific to am-utils version 6.2a2 - -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() or -netgrp(,). - -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-freebsd6.1 (RELEASE) - i386-unknown-netbsdelf2.1 - i386-unknown-netbsdelf3.0 (RELEASE) - i386-unknown-openbsd3.8 - i386-unknown-openbsd3.9 - powerpc-apple-darwin8.5.0 - powerpc-apple-darwin8.6.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 - * handle old-style filehandles correctly (for mount points longer - than 28 chars) - * use-after-free bug in amfs_lookup_mntfs (Coverity) - * 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) - -*** Notes specific to am-utils version 6.2a1 - -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. - -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. - -Changed slightly how Amd behaves when you try to change log_options after -Amd started (options can be turned on/off via "amq -x ARG"). It used to be -that Amd won't let you turn off options which were on when Amd started. -That limited users' ability to reduce Amd's logging levels to a minimum. -Now, Amd will allow you to turn on/off any option, other than the two -options "fatal" and "error." Both are on by default and considered -mandatory. These two don't produce a lot of log messages, so your logs will -remain small, but they are important to keep on, so Amd can report serious -problems (including errors relating to incorrectly setting other log -options). - -Amd now understands a new log_option called "defaults" which is synonymous -with "fatal,error,user,warning,info" (and is also what logging happens by -default). - -Amd now understands a new debug_option called "defaults" which is synonymous -with "all,nohrtime,nomtab,noxdrtrace". - -Changed the misleading inverted logic of certain debug_options: - -1. "xdrtrace" is included in "all" because "all" (as the name implies), - should be *all* options, not just a subset. If you want the old behavior - of "all" then use "defaults" (all only adds "xdrtrace" which can be - chatty on some systems). - -2. Certain debug options are hereby declared immutable: they may not be - changed by "amq -D" after Amd starts, because it doesn't make much sense - to change them after Amd starts, and it could really mess up Amd. These - immutable flags are currently "daemon," "fork," "amq," and "mtab." - -3. the debug option "daemon" *will* cause Amd to daemonize. Before, it was - causing Amd NOT to daemonize. This was greatly confusing, especially - since the code, documentation, and comments often conflicted with each - other. If you don't want Amd to daemonize, which is useful for debugging - it, then use the debug option "nodaemon" -- it makes a lot more sense. - -4. Similarly, the "fork" option *will* cause Hlfsd to fork. Use "nofork" if - you don't want Hlfsd to fork. This option is only applicable to Hlfsd. - -5. Similarly, the "amq" option, which is now on by default, will cause Amd - to register itself with the RPC portmapper (for Amq), as is done - normally. If you don't want Amd to register with the portmapper, use - "noamq" -- this naming convention makes more sense. This was also - confusingly documented and coded in places. - - Note: unfortunately, these changes to the "daemon," "fork," and "amq" - debug options may be incompatible with people's previous use of Amd. - Some of you may have to update your amd.conf slightly or your startup - options (if they're hard-coded in your amd startup script). Sorry, but - we have to fix those old problems sooner or later. However, if you never - set any debug_options, or you used to "all," then you won't be affected - by the change in meaning of these three flags. - -- minor new ports: - i386-pc-linux-deb3.1 - i386-unknown-netbsdelf3.0 (BETA) - powerpc-apple-darwin8.2.0 - -- Bugs fixed: - * abort with an error if yacc/lex programs not found - * 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 - * 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 - -*** 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/mtab". - -- 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 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. Index: contrib/amd/README =================================================================== --- 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., 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.68, automake-1.11.1, and libtool 2.2.6b 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 via Bugzilla or the am-utils list (see -www.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. Index: contrib/amd/README.attrcache =================================================================== --- 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 us via Bugzilla or the am-utils mailing list -(see www.am-utils.org), so we can record it in this file. - -Sincerely, -Erez. Index: contrib/amd/README.ldap =================================================================== --- contrib/amd/README.ldap +++ /dev/null @@ -1,57 +0,0 @@ -LDAP support for am-utils was originally done by Leif Johansson -. 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 AT 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" -To: "Erez Zadok" -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 AT 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 - Index: contrib/amd/README.y2k =================================================================== --- contrib/amd/README.y2k +++ /dev/null @@ -1,26 +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 -reported that they evaluated 6.0a16 and found it to be compliant. - -On March 26, 1999, Paul Balyoz 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. -WWW: http://www.am-utils.org Index: contrib/amd/amd/am_ops.c =================================================================== --- contrib/amd/amd/am_ops.c +++ /dev/null @@ -1,484 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* - * 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_EXT - &ext2_ops, /* Unix (linux) F/S */ - &ext3_ops, /* Unix (linux) F/S */ - &ext4_ops, /* Unix (linux) F/S */ -#endif /* HAVE_FS_EXT */ -#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_TMPFS - &tmpfs_ops, /* /tmp (in memory) F/S */ -#endif /* HAVE_FS_TMPFS */ -#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 */ -#ifdef HAVE_FS_UDF - &udf_ops, /* UDF F/S */ -#endif /* HAVE_FS_UDF */ -#ifdef HAVE_FS_LUSTRE - &lustre_ops, /* Lustre */ -#endif /* HAVE_FS_LUSTRE */ - - /* - * 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 = xstrdup(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, sizeof(oneopt)); - /* if option has a value such as rsize=1024, chop the value part */ - if ((eq = strchr(oneopt, '='))) - *eq = '\0'; - /* find reverse option of oneopt */ - revoneopt = reverse_option(oneopt); - /* if option or its 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 = NULL; - 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 = NULL; - 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 = xstrdup("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 = xstrdup(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 = xstrdup(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 *) NULL, fo->opt_fs, "/", link_dir); - normalize_slash(link_dir); - XFREE(fo->opt_sublink); - fo->opt_sublink = link_dir; - } - - /* - * Check the filesystem is happy - */ - 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; -} Index: contrib/amd/amd/amd.h =================================================================== --- contrib/amd/amd/amd.h +++ /dev/null @@ -1,923 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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/mtab" -#endif /* MOUNT_TABLE_ON_FILE */ - -/* Max line length that info services can handle */ -#define INFO_MAX_LINE_LEN 1500 - -/* 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? */ -#define CFM_SUN_MAP_SYNTAX 0x00040000 /* Sun map syntax? */ -#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_loc am_loc; -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 *, voidp, voidp, voidp, 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 *); - -/* - * NFS progran dispatcher - */ -typedef void (*dispatcher_t)(struct svc_req *rqstp, SVCXPRT *transp); - - -/* - * 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) */ - int nfs_vers_ping; /* NFS rpc ping 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 */ - u_int nentries; /* Number of entries in the map */ - 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; /* Mount info */ - 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 */ -}; - -/* - * Locations: bindings between keys and mntfs - */ -struct am_loc { - am_opts *al_fo; - mntfs *al_mnt; - int al_refc; -}; - - -/* - * 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 */ - int s_fsinfo; /* Count of fsinfo */ - int s_pathconf; /* Count of pathconf */ -}; - -/* - * 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 */ - am_loc *am_al; /* Mounted filesystem */ - am_loc **am_alarray; /* 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 */ - int am_fd[2]; /* parent child pipe fd's for sync umount */ -}; - -/* - * 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 int *amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp); -extern int *amqproc_sync_umnt_1_svc_parent(voidp argp, struct svc_req *rqstp); -extern amq_sync_umnt *amqproc_sync_umnt_1_svc_child(voidp argp, struct svc_req *rqstp); -extern amq_sync_umnt *amqproc_sync_umnt_1_svc_async(voidp argp, struct svc_req *rqstp); -extern amq_map_info_list *amqproc_getmapinfo_1_svc(voidp argp, struct svc_req *rqstp); - -/* other external definitions */ -extern am_nfs_handle_t *get_root_nfs_fh(char *dir, am_nfs_handle_t *nfh); -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 bool_t xdr_amq_map_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 conf_parse(void); /* "yyparse" renamed */ -extern FILE *conf_in; /* "yyin" renamed */ - -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 am_loc *dup_loc(am_loc *); -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 am_loc *new_loc(void); -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 free_loc(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 int file_read_line(char *, int, FILE *); -extern void forcibly_timeout_mp(am_node *); -extern void free_map(am_node *); -extern void free_opts(am_opts *); -extern am_opts *copy_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 *, 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 mp_to_fh3(am_node *mp, am_nfs_fh3 *fhp); -extern void new_ttl(am_node *); -extern void nfs_quick_reply(am_node *mp, int error); -extern void normalize_slash(char *); -extern void notify_child(am_node *, au_etype, int, int); -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 SVCXPRT *current_transp; /* For nfs_quick_reply() */ -extern dispatcher_t nfs_dispatcher; -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 */ - -/* - * UDF File System - * Many systems can't support this, and in any case most of the - * functionality is available with program FS. - */ -#ifdef HAVE_FS_UDF -extern am_ops udf_ops; -#endif /* HAVE_FS_UDF */ - -#ifdef HAVE_FS_LUSTRE -extern am_ops lustre_ops; -#endif /* HAVE_FS_LUSTRE */ - -/* - * Caching File System (Solaris) - */ -#ifdef HAVE_FS_CACHEFS -extern am_ops cachefs_ops; -#endif /* HAVE_FS_CACHEFS */ - -/* - * In memory /tmp filesystem (Linux, NetBSD) - */ -#ifdef HAVE_FS_TMPFS -extern am_ops tmpfs_ops; -#endif /* HAVE_FS_TMPFS */ -/* - * 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 (ext*) */ -#ifdef HAVE_FS_EXT -extern am_ops ext2_ops; /* Un*x file system */ -extern am_ops ext3_ops; /* Un*x file system */ -extern am_ops ext4_ops; /* Un*x file system */ -#endif /* HAVE_FS_EXT */ - -/* 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, voidp cookie, voidp dp, voidp 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, voidp cookie, voidp dp, voidp 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 */ Index: contrib/amd/amd/amd.8 =================================================================== --- contrib/amd/amd/amd.8 +++ /dev/null @@ -1,405 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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.8 -.\" $FreeBSD$ -.\" -.Dd February 26, 2016 -.Dt AMD 8 -.Os -.Sh NAME -.Nm amd -.Nd automatically mount file systems -.Sh SYNOPSIS -.Nm -.Fl H -.Nm -.Op Fl F Ar conf_file -.Nm -.Op Fl nprvHS -.Op Fl a Ar mount_point -.Op Fl c Ar duration -.Op Fl d Ar domain -.Op Fl k Ar kernel-arch -.Op Fl l Ar logfile -.Op Fl o Ar op_sys_ver -.Op Fl t Ar timeout.retransmit -.Op Fl w Ar interval -.Op Fl x Ar log-option -.Op Fl y Ar YP-domain -.Op Fl A Ar arch -.Op Fl C Ar cluster-name -.Op Fl D Ar option -.Op Fl F Ar conf_file -.Op Fl O Ar op_sys_name -.Op Fl T Ar tag -.Oo -.Ar directory mapname -.Op Fl map-options -.Oc -.Ar ... -.Sh DESCRIPTION -.Bf -symbolic -This daemon is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility -is a daemon that automatically mounts file systems -whenever a file or directory -within that file system is accessed. -File systems are automatically unmounted when they -appear to be quiescent. -.Pp -The -.Nm -utility -operates by attaching itself as an -.Tn NFS -server to each of the specified -.Ar directories . -Lookups within the specified directories -are handled by -.Nm , -which uses the map defined by -.Ar mapname -to determine how to resolve the lookup. -Generally, this will be a host name, some file system information -and some mount options for the given file system. -.Pp -In the first form depicted above, -.Nm -will print a short help string. -In the second form, if no options are -specified, or if the -.Fl F -is used, -.Nm -will read configuration parameters from the file -.Ar conf_file -which defaults to -.Pa /etc/amd.conf . -The last form is described below. -.Sh OPTIONS -.Bl -tag -width indent -.It Fl a Ar temporary-directory -Specify an alternative location for the real mount points. -The default is -.Pa /.amd_mnt . -.It Fl c Ar duration -Specify a -.Ar duration , -in seconds, that a looked up name remains -cached when not in use. -The default is 5 minutes. -.It Fl d Ar domain -Specify the local domain name. -If this option is not -given the domain name is determined from the hostname. -.It Fl k Ar kernel-arch -Specifies the kernel architecture. -This is used solely -to set the ${karch} selector. -.It Fl l Ar logfile -Specify a logfile in which to record mount and unmount events. -If -.Ar logfile -is the string -.Dq Li syslog , -then the log messages will be sent to the system log daemon by -.Xr syslog 3 . -The default syslog facility used is -.Dv LOG_DAEMON . -If you -wish to change it, append its name to the log file name, delimited by a -single colon. -For example, if -.Ar logfile -is the string -.Dq Li syslog:local7 -then -.Nm -will log messages via -.Xr syslog 3 -using the -.Dv LOG_LOCAL7 -facility (if it exists on the system). -.It Fl n -Normalize hostnames. -The name referred to by ${rhost} is normalized relative to the -host database before being used. -The effect is to translate -aliases into -.Dq official -names. -.It Fl o Ar 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 -.Dq Li 2.5.1 , -you can override it to -.Dq Li 5.5.1 , -and use older maps that were written with the latter in mind. -.It Fl p -Print PID. -Outputs the process ID of -.Nm -to standard output where it can be saved into a file. -.It Fl r -Restart existing mounts. -The -.Nm -utility -will scan the mount file table to determine which file systems -are currently mounted. -Whenever one of these would have -been auto-mounted, -.Nm -.Em inherits -it. -.It Fl t Ar timeout.retransmit -Specify the NFS -.Ar timeout -interval, -in tenths of a second, between -.Tn 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. -.Pp -The -.Xr amd 8 -utility -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. -.It Fl v -Version. -Displays version and configuration information on standard error. -.It Fl w Ar interval -Specify an -.Ar interval , -in seconds, between attempts to dismount -file systems that have exceeded their cached times. -The default is 2 minutes. -.TP -.It Fl x Ar options -Specify run-time logging options. The options are a comma separated -list chosen from: -.Li fatal, error, user, warn, info, map, stats, defaults, all . -Note that "fatal" and "error" are mandatory and cannot be turned off. -.TP -.It Fl y Ar domain -Specify an alternative -.Tn NIS -domain from which to fetch the -.Tn NIS -maps. -The default is the system domain name. This option is ignored if NIS -support is not available. -.It Fl A Ar arch -Specifies the OS architecture. -This is used solely to set the ${arch} -selector. -.It Fl C Ar cluster-name -Specify an alternative HP-UX cluster name to use. -.It Fl D Ar option -Select from a variety of debug options. -Prefixing an -option with the string -.Dq Li no -reverses the effect of that option. -Options are cumulative. -The most useful option is -.Dq Li all . -.Pp -Since -.Fl D -is only used for debugging other options are not documented here: -the current supported set of options is listed by the -.Fl v -option -and a fuller description is available in the program source. -.It Fl F Ar conf_file -Specify an -.Nm -configuration file to use. -See -.Xr 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 -.Xr amd.conf 5 -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. -.It Fl H -Print help and usage string. -.It Fl O Ar 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 -.Dq Li sunos5 , -you can override it to -.Dq Li sos5 -and use older maps which were written with the latter in mind. -.It Fl S -Do not lock the running executable pages of -.Nm -into memory. -To improve -.Nm Ns 's -performance, systems that support the -.Xr plock 3 -call, could lock the -.Nm -process into memory. -This way there is less chance -the operating system will schedule, page out, and swap the -.Nm -process as -needed. -This tends to improve -.Nm Ns 's -performance, at the cost of reserving the -memory used by the -.Nm -process (making it unavailable for other processes). -If this behavior is not desired, use the -.Fl S -option. -.It Fl T Ar tag -Specify a tag to use with -.Xr amd.conf 5 . -All map entries tagged with -.Ar tag -will be processed. -Map entries that are not tagged are always processed. -Map entries that are tagged with a tag other than -.Ar tag -will not be processed. -.El -.Sh FILES -.Bl -tag -width ".Pa /etc/amd.conf" -.It Pa /.amd_mnt -directory under which file systems are dynamically mounted -.It Pa /etc/amd.conf -default configuration file -.El -.Sh CAVEATS -Some care may be required when creating a mount map. -.Pp -Symbolic links on an -.Tn NFS -file system can be incredibly inefficient. -In most implementations of -.Tn NFS , -their interpolations are not cached -by the kernel and each time a symbolic link is encountered during a -.Em lookuppn -translation it costs an -.Tn RPC -call to the -.Tn 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. -.Pp -A weird imagination is most useful to gain full advantage of all -the features. -.Sh SEE ALSO -.Xr domainname 1 , -.Xr hostname 1 , -.Xr syslog 3 , -.Xr amd.conf 5 , -.Xr mtab 5 , -.Xr amq 8 , -.Xr automount 8 , -.Xr mount 8 , -.Xr umount 8 -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Nm -utility first appeared in -.Bx 4.4 . -.Sh AUTHORS -.An Jan-Simon Pendry Aq jsp@doc.ic.ac.uk , -Department of Computing, Imperial College, London, UK. -.Pp -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook -University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/amd/amd.c =================================================================== --- contrib/amd/amd/amd.c +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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: amd.c,v 1.8.2.6 2004/01/06 03:15:16 ezk Exp $ - * File: am-utils/amd/amd.c - * - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * Automounter - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - -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 = "/.amd_mnt"; - - /* 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= 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); - return 1; - } - hostname[sizeof(hostname) - 1] = '\0'; - - /* - * Check it makes sense - */ - if (!*hostname) { - plog(XLOG_FATAL, "host name is not set"); - going_down(1); - return 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. - * (Also initialize amd.conf parameters, maps, and more.) - */ - 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); - return 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); - return 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 */ -} Index: contrib/amd/amd/amfs_auto.c =================================================================== --- contrib/amd/amd/amfs_auto.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/**************************************************************************** - *** 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) -{ - if (mp->am_parent == NULL) - return EINVAL; - /* - * 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_al->al_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 = xstrdup(""); - } else { - /* - * the prefix specified as an option - */ - mp->am_pref = xstrdup(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 *) NULL, 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; -} Index: contrib/amd/amd/amfs_direct.c =================================================================== --- contrib/amd/amd/amfs_direct.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/**************************************************************************** - *** 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_al->al_mnt->mf_private) - amfs_mkcacheref(mp->am_al->al_mnt); - 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; -} Index: contrib/amd/amd/amfs_error.c =================================================================== --- contrib/amd/amd/amfs_error.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -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 xstrdup("(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, voidp cookie, voidp dp, voidp ep, u_int count) -{ - return ESTALE; -} Index: contrib/amd/amd/amfs_generic.c =================================================================== --- contrib/amd/amd/amfs_generic.c +++ /dev/null @@ -1,1255 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/**************************************************************************** - *** MACROS *** - ****************************************************************************/ -#define IN_PROGRESS(cp) ((cp)->mp->am_al->al_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 */ - am_loc **al; /* Current location */ -}; - - -/**************************************************************************** - *** FORWARD DEFINITIONS *** - ****************************************************************************/ -static am_node *amfs_lookup_node(am_node *mp, char *fname, int *error_return); -static am_loc *amfs_lookup_one_location(am_node *new_mp, mntfs *mf, char *ivec, - char *def_opts, char *pfname); -static am_loc **amfs_lookup_loc(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 = NULL; - - 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_al == NULL || mp->am_al->al_mnt == NULL || mp->am_al->al_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_al->al_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 == NULL) - ereturn(ENOSPC); - - *error_return = -1; - return new_mp; -} - - - -static am_loc * -amfs_lookup_one_location(am_node *new_mp, mntfs *mf, char *ivec, - char *def_opts, char *pfname) -{ - am_ops *p; - am_opts *fs_opts; - am_loc *new_al; - mntfs *new_mf; - char *mp_dir = NULL; -#ifdef HAVE_FS_AUTOFS - int on_autofs = 1; -#endif /* HAVE_FS_AUTOFS */ - - /* match the operators */ - /* - * although we alloc the fs_opts here, the pointer is 'owned' by the am_loc and will - * be free'd on destruction of the am_loc. If we don't allocate a loc, then we need - * to free this. - */ - 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 && fs_opts->opt_sublink[0]) { - /* - * 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. - * we search for a matching backend share, since - * we will construct our own al_loc to handle - * any customisations for this usage. - */ - 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); - free_opts(fs_opts); - XFREE(fs_opts); - return NULL; - } - - dlog("Got a hit with %s", p->fs_type); - new_al = new_loc(); - free_mntfs(new_al->al_mnt); - new_al->al_mnt = new_mf; - new_al->al_fo = fs_opts; /* now the loc is in charge of free'ing this mem */ - -#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_al; -} - - -static am_loc ** -amfs_lookup_loc(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; /* The mntfs for the map of our parent */ - am_loc **al_array; /* the generated list of locations */ - int count; - - dlog("in amfs_lookup_loc"); - - 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_al->al_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, xstrdup(def_opts)); - def_opts = xstrdup(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++; - } - - al_array = calloc(num_ivecs + 1, sizeof(am_loc *)); - - /* construct the array of struct locations for this key */ - for (count = 0, cur_ivec = ivecs; *cur_ivec; cur_ivec++) { - am_loc *new_al; - - 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 = xstrdup(orig_def_opts); - dlog("Resetting the default options, a single dash '-' was found."); - } else { - /* append options to /default options */ - def_opts = str3cat((char *) NULL, orig_def_opts, ";", *cur_ivec + 1); - dlog("Resetting def_opts to \"%s\"", def_opts); - } - continue; - } - - /* - * If a loc 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", pfname); - break; - } - continue; - } - - new_al = amfs_lookup_one_location(new_mp, mf, *cur_ivec, def_opts, pfname); - if (new_al == NULL) - continue; - al_array[count++] = new_al; - } - - /* We're done with ivecs */ - XFREE(ivecs); - XFREE(info); - XFREE(orig_def_opts); - XFREE(def_opts); - if (count == 0) { /* no match */ - XFREE(al_array); - ereturn(ENOENT); - } - - return al_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_al->al_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_al->al_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->al++; - } - 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->al) - cp->al++; - /* explicitly forbid further retries after timeout */ - cp->retry = FALSE; - } - if (error || !IN_PROGRESS(cp)) - error = amfs_bgmount(cp); - else - /* Normally it's amfs_bgmount() which frees the continuation. However, if - * the mount is already in progress and we're in amfs_retry() for another - * node we don't try mounting the filesystem once again. Still, we have - * to free the continuation as we won't get called again and thus would - * leak the continuation structure and our am_loc references. - */ - free_continuation(cp); - - reschedule_timeout_mp(); -} - - -/* - * Discard an old continuation - */ -static void -free_continuation(struct continuation *cp) -{ - am_loc **alp; - - 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, - */ - for (alp = cp->mp->am_alarray; *alp; alp++) { - free_loc(*alp); - } - XFREE(cp->mp->am_alarray); - cp->mp->am_alarray = 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; - am_loc *loc; - mntfs *mf; - int this_error = -1; /* Per-mount error */ - int hard_error = -1; /* Cumulative per-node error */ - - if (mp->am_al) - free_loc(mp->am_al); - - /* - * 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_al = *cp->al; *cp->al; cp->al++, mp->am_al = *cp->al) { - am_ops *p; - - loc = dup_loc(mp->am_al); - mf = loc->al_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; - } - - XFREE(mp->am_link); - mp->am_link = NULL; - - if (loc->al_fo && loc->al_fo->opt_sublink && loc->al_fo->opt_sublink[0]) - mp->am_link = xstrdup(loc->al_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 (loc->al_fo && loc->al_fo->opt_delay) { - /* - * If there is a delay timer on the location - * then don't try to mount if the timer - * has not expired. - */ - int i = atoi(loc->al_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: - if (!FSRV_ISDOWN(mf->mf_server)) { - /* mark the mount as failed unless the server is down */ - 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_loc(loc); - /* continue */ - } - - /* - * If we get here, then either the mount succeeded or - * there is no more mount information available. - */ - if (this_error) { - if (mp->am_al) - free_loc(mp->am_al); - mp->am_al = loc = new_loc(); - mf = loc->al_mnt; - -#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 = loc->al_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. - */ - if (mm->cfm && mm->cfm->cfm_defaults) { - dlog("map %s map_defaults override: %s", mf->mf_mount, mm->cfm->cfm_defaults); - dflts = xstrdup(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_al->al_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 */ - if (new_mp->am_al) - free_loc(new_mp->am_al); - new_mp->am_al = NULL; - - /* - * Construct a continuation - */ - cp = ALLOC(struct continuation); - cp->callout = 0; - cp->mp = new_mp; - cp->retry = TRUE; - cp->start = clocktime(NULL); - cp->al = new_mp->am_alarray; - - /* - * 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_dispatcher() 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_al && new_mp->am_al->al_mnt && - (new_mp->am_al->al_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; - am_loc **al_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_al->al_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; - - al_array = amfs_lookup_loc(new_mp, error_return); - if (!al_array) { - new_mp->am_error = new_mp->am_al->al_mnt->mf_error = *error_return; - free_map(new_mp); - return NULL; - } - - /* store the array inside the am_node */ - new_mp->am_alarray = al_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 xstrdup(fo->opt_rfs ? fo->opt_rfs : "."); -} Index: contrib/amd/amd/amfs_host.c =================================================================== --- contrib/amd/amd/amfs_host.c +++ /dev/null @@ -1,710 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -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 -#ifdef HAVE_FS_NFS4 -#ifndef NO_FALLBACK - || nfs_version == NFS_VERSION4 -#endif /* NO_FALLBACK */ -#endif /* HAVE_FS_NFS4 */ - ) { - - 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 = NULL; - am_nfs_handle_t *fp = NULL; - 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] = NULL; - } else { - k = j; - error = fetch_fhandle(client, ep[j]->ex_dir, &fp[j], - mf->mf_server->fs_version); - if (error) - ep[j] = NULL; - } - } - - /* - * 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, sizeof(fs_name)); - if ((rfs_dir = strchr(fs_name, ':')) == (char *) NULL) { - 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); - XFREE(ep); - 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 = NULL; - 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); -} Index: contrib/amd/amd/amfs_link.c =================================================================== --- contrib/amd/amd/amfs_link.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 == NULL || fo->opt_sublink[0] == '\0') - fo->opt_sublink = xstrdup(fo->opt_fs); - XFREE(fo->opt_fs); - fo->opt_fs = link_hack; - } - - return xstrdup(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; -} Index: contrib/amd/amd/amfs_linkx.c =================================================================== --- contrib/amd/amd/amfs_linkx.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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; -} Index: contrib/amd/amd/amfs_nfsl.c =================================================================== --- contrib/amd/amd/amfs_nfsl.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* 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 && fo->opt_sublink[0]) - 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()) && !STRCEQ(ho, hostd)) { - plog(XLOG_INFO, "amfs_nfsl: \"%s\" is not the local host \"%s\", " - "or \"%s\" using type:=nfs", ho, am_get_hostname(), hostd); - 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, *ho; - struct stat stb; - - if (mf->mf_fo == NULL) { - plog(XLOG_ERROR, "%s: NULL mf_fo", __func__); - return NULL; - } - ho = mf->mf_fo->opt_rhost; - - if (mf->mf_fo->opt_sublink && mf->mf_fo->opt_sublink[0]) - 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()) && - !STRCEQ(ho, hostd)) || 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); - } -} Index: contrib/amd/amd/amfs_nfsx.c =================================================================== --- contrib/amd/amd/amfs_nfsx.c +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 == NULL || fo->opt_sublink[0] == '\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 *) NULL, 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 = NULL; - char *host; - char *pref; - int error = 0; - - info = xstrdup(mf->mf_info); - if (info == NULL) - return errno; - - 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 = NULL; - { - char *mp = NULL; - char *xinfo = NULL; - char *fs = mf->mf_fo->opt_fs; - char *rfs = NULL; - 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; - } - XFREE(rfs); - XFREE(mp); - XFREE(xinfo); - } - - XFREE(ivec); - errexit: - 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 = NULL; - n->n_error = -1; - } - } - - return glob_error; -} Index: contrib/amd/amd/amfs_program.c =================================================================== --- contrib/amd/amd/amfs_program.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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; - - if (mf->mf_fo == NULL) - return 0; - - /* save unmount (or umount) command */ - if (mf->mf_fo->opt_unmount != NULL) - mf->mf_private = (opaque_t) xstrdup(mf->mf_fo->opt_unmount); - else - mf->mf_private = (opaque_t) xstrdup(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 = xstrdup(info); - xivec = strsplit(info, ' ', '\''); - - /* - * Put stdout to stderr - */ - (void) fclose(stdout); - if (!logfp) - logfp = stderr; /* initialize before possible first use */ - if (dup(fileno(logfp)) == -1) - goto out; - if (fileno(logfp) != fileno(stderr)) { - (void) fclose(stderr); - if (dup(fileno(logfp)) == -1) - goto out; - } - - /* - * 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); - error = errno; - plog(XLOG_ERROR, "exec failed: %m"); - errno = error; - } - -out: - /* - * Save error number - */ - error = errno; - - /* - * 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); -} Index: contrib/amd/amd/amfs_root.c =================================================================== --- contrib/amd/amd/amfs_root.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/**************************************************************************** - *** 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, NULL); - mf->mf_prfree = mapc_free; - - return 0; -} Index: contrib/amd/amd/amfs_toplvl.c =================================================================== --- contrib/amd/amd/amfs_toplvl.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/**************************************************************************** - *** 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)) && (defined(HAVE_UVMOUNT) || defined(HAVE_UMOUNT2)) - 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) && (HAVE_UVMOUNT || HAVE_UMOUNT2) */ - 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= 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_NOLOCK - xstrlcat(opts, ",", sizeof(opts)); - xstrlcat(opts, MNTTAB_OPT_NOLOCK, sizeof(opts)); -#endif /* MNTTAB_OPT_NOLOCK */ - -#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; -} Index: contrib/amd/amd/amfs_union.c =================================================================== --- contrib/amd/amd/amfs_union.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/**************************************************************************** - *** 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) - (void)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_al->al_mnt == mf) { - /* return value from create_amfs_union_node is ignored by mapc_keyiter */ - (void) mapc_keyiter((mnt_map *) mp->am_al->al_mnt->mf_private, - create_amfs_union_node, - mp); - break; - } - } -} Index: contrib/amd/amd/amq_subr.c =================================================================== --- contrib/amd/amd/amq_subr.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 - */ -int * -amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp) -{ - static int res = AMQ_UMNT_OK; - am_node *mp = find_ap(*(char **) argp); - - if (mp) - forcibly_timeout_mp(mp); - - return &res; -} - - -/* - * Synchronously unmount a single node - parent side. - */ -int * -amqproc_sync_umnt_1_svc_parent(voidp argp, struct svc_req *rqstp) -{ - amqproc_umnt_1_svc(argp, rqstp); - return NULL; -} - - -/* - * Synchronously unmount a single node - child side. - */ -amq_sync_umnt * -amqproc_sync_umnt_1_svc_child(voidp argp, struct svc_req *rqstp) -{ - static amq_sync_umnt rv; - amq_sync_umnt buf; - ssize_t n; - - am_node *mp = find_ap(*(char **) argp); - - memset(&rv, 0, sizeof(rv)); - rv.au_etype = AMQ_UMNT_READ; - if (mp && mp->am_fd[0] >= 0) { - n = read(mp->am_fd[0], &buf, sizeof(buf)); - if (n == sizeof(buf)) - rv = buf; - } - return &rv; -} - - -/* - * Synchronously unmount a single node - use if we can't fork (asynchronous). - */ -amq_sync_umnt * -amqproc_sync_umnt_1_svc_async(voidp argp, struct svc_req *rqstp) -{ - static amq_sync_umnt rv; - - memset(&rv, 0, sizeof(rv)); - rv.au_etype = AMQ_UMNT_FORK; - rv.au_errno = errno; - - amqproc_umnt_1_svc(argp, rqstp); - - return &rv; -} - - -/* - * 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 */ -} - -extern qelem map_list_head; -amq_map_info_list * -amqproc_getmapinfo_1_svc(voidp argp, struct svc_req *rqstp) -{ - return (amq_map_info_list *) ((void *)&map_list_head); /* 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_al->al_mnt->mf_ops->fs_type, "toplvl")) - continue; - if (STREQ(mp->am_al->al_mnt->mf_ops->fs_type, "auto")) - continue; - mountpoint = (mp->am_link ? mp->am_link : mp->am_al->al_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_al->al_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_al->al_mnt->mf_mount)) { - return (FALSE); - } - if (!xdr_amq_string(xdrs, &mp->am_al->al_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); -} - - -bool_t -xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead) -{ - mntfs *mf; - u_int len = 0; - - /* - * Compute length of list - */ - 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_amq_map_info_qelem(XDR *xdrs, qelem *qhead) -{ - mnt_map *m; - u_int len = 0; - int x; - char *n; - - /* - * Compute length of list - */ - ITER(m, mnt_map, qhead) { - len++; - } - - if (!xdr_u_int(xdrs, &len)) - return (FALSE); - - /* - * Send individual data items - */ - ITER(m, mnt_map, qhead) { - if (!xdr_amq_string(xdrs, &m->map_name)) { - return (FALSE); - } - - n = m->wildcard ? m->wildcard : ""; - if (!xdr_amq_string(xdrs, &n)) { - return (FALSE); - } - - if (!xdr_long(xdrs, (long *) &m->modify)) { - return (FALSE); - } - - x = m->flags; - if (!xdr_int(xdrs, &x)) { - return (FALSE); - } - - x = m->nentries; - if (!xdr_int(xdrs, &x)) { - return (FALSE); - } - - x = m->reloads; - if (!xdr_int(xdrs, &x)) { - return (FALSE); - } - - if (!xdr_int(xdrs, &m->refc)) { - return (FALSE); - } - - if (m->isup) - x = (*m->isup)(m, m->map_name); - else - x = -1; - if (!xdr_int(xdrs, &x)) { - 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)); -} Index: contrib/amd/amd/amq_svc.c =================================================================== --- contrib/amd/amd/amq_svc.c +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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, rfc931_timeout=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) -{ - struct request_info req; - - request_init(&req, RQ_DAEMON, AMD_SERVICE_NAME, RQ_CLIENT_SIN, addr, 0); - sock_methods(&req); - - if (hosts_access(&req)) - return 1; - - return 0; -} -#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */ - - -/* - * Prepare the parent and child: - * 1) Setup IPC pipe. - * 2) Set signal masks. - * 3) Fork by calling background() so that NumChildren is updated. - */ -static int -amq_fork(opaque_t argp) -{ -#ifdef HAVE_SIGACTION - sigset_t new, mask; -#else /* not HAVE_SIGACTION */ - int mask; -#endif /* not HAVE_SIGACTION */ - am_node *mp; - pid_t pid; - - mp = find_ap(*(char **) argp); - if (mp == NULL) { - errno = 0; - return -1; - } - - if (pipe(mp->am_fd) == -1) { - mp->am_fd[0] = -1; - mp->am_fd[1] = -1; - return -1; - } - -#ifdef HAVE_SIGACTION - sigemptyset(&new); /* initialize signal set we wish to block */ - sigaddset(&new, SIGHUP); - sigaddset(&new, SIGINT); - sigaddset(&new, SIGQUIT); - sigaddset(&new, SIGCHLD); - sigprocmask(SIG_BLOCK, &new, &mask); -#else /* not HAVE_SIGACTION */ - mask = - sigmask(SIGHUP) | - sigmask(SIGINT) | - sigmask(SIGQUIT) | - sigmask(SIGCHLD); - mask = sigblock(mask); -#endif /* not HAVE_SIGACTION */ - - switch ((pid = background())) { - case -1: /* error */ - dlog("amq_fork failed"); - return -1; - - case 0: /* child */ - close(mp->am_fd[1]); /* close output end of pipe */ - mp->am_fd[1] = -1; - return 0; - - default: /* parent */ - close(mp->am_fd[0]); /* close input end of pipe */ - mp->am_fd[0] = -1; - -#ifdef HAVE_SIGACTION - sigprocmask(SIG_SETMASK, &mask, NULL); -#else /* not HAVE_SIGACTION */ - sigsetmask(mask); -#endif /* not HAVE_SIGACTION */ - return pid; - } -} - - -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; - amqsvcproc_t child; - amqsvcproc_t parent; - pid_t pid; - -#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)) { - 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) */ - - local = NULL; - child = NULL; - parent = NULL; - - 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; - - case AMQPROC_SYNC_UMNT: - xdr_argument = (xdrproc_t) xdr_amq_string; - xdr_result = (xdrproc_t) xdr_amq_sync_umnt; - parent = (amqsvcproc_t) amqproc_sync_umnt_1_svc_parent; - child = (amqsvcproc_t) amqproc_sync_umnt_1_svc_child; - /* used if fork fails */ - local = (amqsvcproc_t) amqproc_sync_umnt_1_svc_async; - break; - - case AMQPROC_GETMAPINFO: - xdr_argument = (xdrproc_t) xdr_void; - xdr_result = (xdrproc_t) xdr_amq_map_info_qelem; - local = (amqsvcproc_t) amqproc_getmapinfo_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; - } - - pid = -1; - result = NULL; - - if (child) { - switch ((pid = amq_fork(&argument))) { - case -1: /* error */ - break; - - case 0: /* child */ - result = (*child) (&argument, rqstp); - local = NULL; - break; - - default: /* parent */ - result = (*parent) (&argument, rqstp); - local = NULL; - break; - } - } - - if (local) - 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); - } - - if (pid == 0) - exit(0); /* the child is done! */ -} Index: contrib/amd/amd/autil.c =================================================================== --- contrib/amd/amd/autil.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -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_al->al_mnt; - /* - * Arrange to timeout this node - */ - if (mf && ((mp->am_flags & AMF_ROOT) || - (mf->mf_flags & (MFF_MOUNTING | MFF_UNMOUNTING)))) { - /* - * We aren't going to schedule a timeout, so we need to notify the - * child here unless we are already unmounting, in which case that - * process is responsible for notifying the child. - */ - 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); - notify_child(mp, AMQ_UMNT_FAILED, EBUSY, 0); - } - } 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); - - /* - * We used to free the mf_mo (options) here, however they're now stored - * and managed with the mntfs and do not need to be free'd here (this ensures - * that we use the same options to monitor/unmount the system as we used - * to mount it). - */ - } - - 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_al->al_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_al->al_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_al->al_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"); - - if (mp->am_al == NULL) { - plog(XLOG_ERROR, "%s: Can't assign error", __func__); - return; - } - /* - * Save the old error code - */ - error = mp->am_error; - if (error <= 0) - error = mp->am_al->al_mnt->mf_error; - /* - * Allocate a new error reference - */ - free_loc(mp->am_al); - mp->am_al = new_loc(); - /* - * Put back the error code - */ - mp->am_al->al_mnt->mf_error = error; - mp->am_al->al_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_mount); - 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 - * 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_al->al_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? */ - u_long nfs_version = get_nfs_dispatcher_version(nfs_dispatcher); - - memset(&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_handle_t *fhp, 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, &anh); - 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(&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 */ -#ifdef HAVE_TRANSPORT_TYPE_TLI - compute_nfs_args(&nfs_args, - &mnt, - genflags, - nfsncp, - NULL, /* remote host IP addr is set below */ - nfs_version, - "udp", - fhp, - 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, - "udp", - fhp, - 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_al->al_mnt; - - if (!foreground) { /* firewall - should never happen */ - /* - * This is a coding error. Make sure we hear about it! - */ - plog(XLOG_FATAL, "am_unmounted: illegal use in background (%s)", - mp->am_name); - notify_child(mp, AMQ_UMNT_OK, 0, 0); /* XXX - be safe? */ - 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_al->al_mnt) - clocktime(&mp->am_parent->am_fattr.na_mtime); - - if (mp->am_parent && (mp->am_flags & AMF_REMOUNT)) { - char *fname = xstrdup(mp->am_name); - am_node *mp_parent = mp->am_parent; - mntfs *mf_parent = mp_parent->am_al->al_mnt; - am_node fake_mp; - int error = 0; - - /* - * We need to use notify_child() after free_map(), so save enough - * to do that in fake_mp. - */ - fake_mp.am_fd[1] = mp->am_fd[1]; - mp->am_fd[1] = -1; - - 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) - (void)mf_parent->mf_ops->mount_child(mp, &error); - if (error > 0) { - errno = error; - plog(XLOG_ERROR, "am_unmounted: could not remount %s: %m", fname); - notify_child(&fake_mp, AMQ_UMNT_OK, 0, 0); - } else { - notify_child(&fake_mp, AMQ_UMNT_FAILED, EBUSY, 0); - } - 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_alarray). - */ - notify_child(mp, AMQ_UMNT_OK, 0, 0); /* do this regardless */ - if (!mp->am_alarray) - 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; -} Index: contrib/amd/amd/clock.c =================================================================== --- contrib/amd/amd/clock.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -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; -} Index: contrib/amd/amd/conf.c =================================================================== --- contrib/amd/amd/conf.c +++ /dev/null @@ -1,1473 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* - * 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_auto_nfs_version(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_nfs_vers_ping(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_sun_map_syntax(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_sun_map_syntax(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}, - {"auto_nfs_version", gopt_auto_nfs_version}, - {"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}, - {"nfs_vers_ping", gopt_nfs_vers_ping}, - {"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}, - {"sun_map_syntax", gopt_sun_map_syntax}, - {"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 - * (that is, they could be inherited from the global section). - */ - cfm->cfm_flags = gopt.flags & (CFM_BROWSABLE_DIRS | - CFM_BROWSABLE_DIRS_FULL | - CFM_MOUNT_TYPE_AUTOFS | - CFM_SELECTORS_IN_DEFAULTS | - CFM_SUN_MAP_SYNTAX ); -} - - -/* - * 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 = xstrdup(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 = xstrdup(val); - return 0; -} - -static int -gopt_auto_nfs_version(const char *val) -{ - if (strcmp(val, "2") == 0) - nfs_dispatcher = nfs_program_2; - else if (strcmp(val, "3") == 0) - nfs_dispatcher = nfs_program_3; - else { - fprintf(stderr, "conf: bad auto nfs version : \"%s\"\n", val); - return 1; - } - 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 = xstrdup(val); - return 0; -} - - -static int -gopt_debug_mtab_file(const char *val) -{ - gopt.debug_mtab_file = xstrdup(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 = xstrdup(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 = xstrdup(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 = xstrdup(val); - return 0; -} - - -static int -gopt_pid_file(const char *val) -{ - gopt.pid_file = xstrdup(val); - return 0; -} - - -static int -gopt_local_domain(const char *val) -{ - gopt.sub_domain = xstrdup(val); - return 0; -} - - -static int -gopt_localhost_address(const char *val) -{ - gopt.localhost_address = xstrdup(val); - return 0; -} - - -static int -gopt_ldap_base(const char *val) -{ -#ifdef HAVE_MAP_LDAP - gopt.ldap_base = xstrdup(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 = xstrdup(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 = xstrdup(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 = xstrdup(val); - return 0; -} - - -static int -gopt_map_options(const char *val) -{ - gopt.map_options = xstrdup(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 = xstrdup(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 = xstrdup(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; icfm_dir) - cfm->cfm_dir = xstrdup(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, "sun_map_syntax")) - return ropt_sun_map_syntax(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 = xstrdup(val); - return 0; -} - - -static int -ropt_map_defaults(const char *val, cf_map_t *cfm) -{ - cfm->cfm_defaults = xstrdup(val); - return 0; -} - - -static int -ropt_map_options(const char *val, cf_map_t *cfm) -{ - cfm->cfm_opts = xstrdup(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 = xstrdup(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 = xstrdup(val); - return 0; -} - - -static int -ropt_sun_map_syntax(const char *val, cf_map_t *cfm) -{ - if (STREQ(val, "yes")) { - cfm->cfm_flags |= CFM_SUN_MAP_SYNTAX; - return 0; - - } else if (STREQ(val, "no")) { - cfm->cfm_flags &= ~CFM_SUN_MAP_SYNTAX; - return 0; - } - - fprintf(stderr, "conf: unknown value to sun_map_syntax \"%s\"\n", val); - return 1; /* unknown value */ -} - - -static int -ropt_tag(const char *val, cf_map_t *cfm) -{ - cfm->cfm_tag = xstrdup(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; -} Index: contrib/amd/amd/conf_parse.y =================================================================== --- contrib/amd/amd/conf_parse.y +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -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 NONWS_STRING -%token NONWSEQ_STRING -%token 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 */ -} Index: contrib/amd/amd/conf_tok.l =================================================================== --- contrib/amd/amd/conf_tok.l +++ /dev/null @@ -1,189 +0,0 @@ -%{ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -/* - * Some systems include a definition for the macro ECHO in , - * 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 -#include -#include -/* 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 __IGNORE(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. - */ -#if !defined(yywrap) || defined(yylex) -int yywrap(void); -#endif /* not yywrap or yylex */ - -#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 -%option noinput - -/* 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); - conf_lval.strtype = xstrdup(yytext); - amu_return(LEFT_BRACKET); - } - -\] { - dprintf("%8d: Right bracket \"%s\"\n", yytext); - conf_lval.strtype = xstrdup(yytext); - amu_return(RIGHT_BRACKET); - } - -= { - dprintf("%8d: Equal \"%s\"\n", yytext); - conf_lval.strtype = xstrdup(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); - conf_lval.strtype = xstrdup(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'; - conf_lval.strtype = xstrdup(&yytext[1]); - amu_return(QUOTED_NONWSEQ_STRING); - } - -{NONWSEQCHAR}{NONWSEQCHAR}* { - dprintf("%8d: Non-WS-EQ string \"%s\"\n", yytext); - conf_lval.strtype = xstrdup(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. - */ -#if !defined(yywrap) || defined(yylex) -int yywrap(void) -{ - return 1; -} -#endif /* not yywrap or yylex */ Index: contrib/amd/amd/get_args.c =================================================================== --- contrib/amd/amd/get_args.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* include auto-generated version file */ -#include - -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-2014 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); - xstrlcat(vers, tmpbuf, len); - xsnprintf(tmpbuf, sizeof(tmpbuf), "Report bugs to %s.\n", PACKAGE_BUGREPORT); - xstrlcat(vers, tmpbuf, len); -#if 0 - /* - * XXX This block (between from the #if 0 to #endif was in the - * XXX original was in the original merge however in the interest - * XXX of reproduceable builds and the fact that this is redundant - * XXX information, it is effectively removed. - */ - xsnprintf(tmpbuf, sizeof(tmpbuf), "Configured by %s@%s on date %s.\n", - USER_NAME, HOST_NAME, CONFIG_DATE); - xstrlcat(vers, tmpbuf, len); - xsnprintf(tmpbuf, sizeof(tmpbuf), "Built by %s@%s on date %s.\n", - BUILD_USER, BUILD_HOST, BUILD_DATE); - xstrlcat(vers, tmpbuf, len); -#endif - xsnprintf(tmpbuf, sizeof(tmpbuf), "cpu=%s (%s-endian), arch=%s, karch=%s.\n", - cpu, endian, gopt.arch, gopt.karch); - xstrlcat(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); - xstrlcat(vers, tmpbuf, len); - xsnprintf(tmpbuf, sizeof(tmpbuf), "domain=%s, host=%s, hostd=%s.\n", - hostdomain, am_get_hostname(), hostd); - xstrlcat(vers, tmpbuf, len); - - xstrlcat(vers, "Map support for: ", len); - mapc_showtypes(tmpbuf, sizeof(tmpbuf)); - xstrlcat(vers, tmpbuf, len); - xstrlcat(vers, ".\nAMFS: ", len); - ops_showamfstypes(tmpbuf, sizeof(tmpbuf)); - xstrlcat(vers, tmpbuf, len); - xstrlcat(vers, ", inherit.\nFS: ", len); /* hack: "show" that we support type:=inherit */ - ops_showfstypes(tmpbuf, sizeof(tmpbuf)); - xstrlcat(vers, tmpbuf, len); - - /* append list of networks if available */ - if (wire_buf) { - xstrlcat(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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* 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, NULL, NULL, &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(mnt_map *m, int fd, char *map, char *key, char **pval, time_t *tp) -{ - char qanswer[INFO_MAX_LINE_LEN], *dc = NULL; - 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((unsigned char)*cp) && !isspace((unsigned char)*cp); cp++) - ;; - - /* Ignore blank lines */ - if (!*cp) - goto again; - - /* - * Return a copy of the data - */ - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) - dc = sun_entry2amd(key, cp); - else - dc = xstrdup(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; i0 (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(m, mapfd, map, key, pval, tp); - } - - return errno; -} Index: contrib/amd/amd/info_file.c =================================================================== --- contrib/amd/amd/info_file.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* 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); - - -int -file_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((unsigned char)ch) && isspace((unsigned char)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(mnt_map *m, - FILE *fp, - char *map, - char *key, - char **val, - void (*fn) (mnt_map *m, char *, char *)) -{ - char key_val[INFO_MAX_LINE_LEN]; - int chuck = 0; - int line_no = 0; - - while (file_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((unsigned char)*kp) && isspace((unsigned char)*kp); kp++) ; - - /* - * Ignore blank lines - */ - if (!*kp) - goto again; - - /* - * Find end of key - */ - for (cp = kp; *cp && (!isascii((unsigned char)*cp) || !isspace((unsigned char)*cp)); cp++) ; - - /* - * Check whether key matches - */ - if (*cp) - *cp++ = '\0'; - - if (fn || (*key == *kp && STREQ(key, kp))) { - while (*cp && isascii((unsigned char)*cp) && isspace((unsigned char)*cp)) - cp++; - if (*cp) { - /* - * Return a copy of the data - */ - char *dc; - /* if m->cfm == NULL, not using amd.conf file */ - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) - dc = sun_entry2amd(kp, cp); - else - dc = xstrdup(cp); - if (fn) { - (*fn) (m, xstrdup(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 *) NULL); - - if (mapf) { - int error = file_search_or_reload(m, mapf, map, NULL, NULL, 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(m, mapf, map, key, pval, NULL); - } - (void) fclose(mapf); - return error; - } - return errno; -} Index: contrib/amd/amd/info_hesiod.c =================================================================== --- contrib/amd/amd/info_hesiod.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -#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) { - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) { - *pval = sun_entry2amd(key, *rvec); - XFREE(*rvec); - } else - *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 */ -} Index: contrib/amd/amd/info_ldap.c =================================================================== --- contrib/amd/amd/info_ldap.c +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 , 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* - * 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; -}; - -static ALD *ldap_connection; - -/* - * FORWARD DECLARATIONS: - */ -static int amu_ldap_rebind(ALD *a); -static int get_ldap_timestamp(ALD *a, char *map, time_t *ts); - -int amu_ldap_init(mnt_map *m, char *map, time_t *tsu); -int amu_ldap_search(mnt_map *m, char *map, char *key, char **pval, time_t *ts); -int amu_ldap_mtime(mnt_map *m, 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 *first = NULL, *cur = NULL; - - if (NULL == s_orig) - return NULL; - s = xstrdup(s_orig); - for (p = strtok(s, ","); p; p = strtok(NULL, ",")) { - if (cur != NULL) { - cur->next = ALLOC(HE_ENT); - cur = cur->next; - } else - first = cur = ALLOC(HE_ENT); - - cur->next = NULL; - c = strchr(p, ':'); - if (c) { /* Host and port */ - *c++ = '\0'; - cur->host = xstrdup(p); - cur->port = atoi(c); - } else { - cur->host = xstrdup(p); - cur->port = LDAP_PORT; - } - plog(XLOG_USER, "Adding ldap server %s:%d", - cur->host, cur->port); - } - XFREE(s); - return first; -} - - -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")); - return ENOENT; - } else { - dlog("Map %s is ldap\n", map); - } - -#ifndef LDAP_CONNECTION_PER_MAP - if (ldap_connection != NULL) { - m->map_data = (void *) ldap_connection; - return 0; - } -#endif - - 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); - } - dlog("Bound to %s:%d\n", aldh->hostent->host, aldh->hostent->port); - if (get_ldap_timestamp(aldh, map, ts)) { - ald_free(aldh); - return (ENOENT); - } - dlog("Got timestamp for map %s: %ld\n", map, (u_long) *ts); - ldap_connection = aldh; - m->map_data = (void *) ldap_connection; - - 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); - continue; - } -#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 for " - "%s:%d\n", gopt.ldap_proto_version, h->host, h->port); - continue; - } - } -#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); - continue; - } - 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]) { - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) - *pval = sun_entry2amd(key, vals[0]); - else - *pval = xstrdup(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); -} Index: contrib/amd/amd/info_ndbm.c =================================================================== --- contrib/amd/amd/info_ndbm.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -/* 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(mnt_map *m, 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) { - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) - *val = sun_entry2amd(key, v.dptr); - else - *val = xstrdup(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(m, 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); -} Index: contrib/amd/amd/info_nis.c =================================================================== --- contrib/amd/amd/info_nis.c +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* - * 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 = xstrdup(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; - - plog(XLOG_INFO, "NIS map %s reloading using yp_all", map); - /* - * 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 **pval, 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), pval, &outlen); - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX) && res == 0) { - char *oldval = *pval; - *pval = sun_entry2amd(key, oldval); - /* We always need to free the output of the yp_match call. */ - XFREE(oldval); - if (*pval == NULL) - return -1; /* sun2amd parser error */ - } - - /* - * 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 - * -James Tanis */ -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 */ Index: contrib/amd/amd/info_nisplus.c =================================================================== --- contrib/amd/amd/info_nisplus.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -#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 "); - 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)); - } - - if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) { - *val = sun_entry2amd(key, data.value); - XFREE(data.value); /* strnsave malloc'ed it above */ - } else - *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); -} Index: contrib/amd/amd/info_passwd.c =================================================================== --- contrib/amd/amd/info_passwd.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#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 = NULL; - struct passwd *pw; - - if (STREQ(key, "/defaults")) { - *pval = xstrdup("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 = xstrdup(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 = xstrdup(val); - return 0; - } - -enoent: - XFREE(dir); - - return ENOENT; -} Index: contrib/amd/amd/info_sun.c =================================================================== --- contrib/amd/amd/info_sun.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_sun.c - * - */ - -/* - * Get info from Sun automount-style /etc/auto_master, possibly following - * into multiple info services (via /etc/nsswitch.conf). - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* XXX: just a placeholder. fill in */ Index: contrib/amd/amd/info_union.c =================================================================== --- contrib/amd/amd/info_union.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#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 = xstrdup(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 *)) -{ - static const char fseq[] = "fs:="; - char *mapd = xstrdup(map + UNION_PREFLEN); - char **v = strsplit(mapd, ':', '\"'); - char **dir; - - /* - * Add fake /defaults entry - */ - (*fn) (m, xstrdup("/defaults"), xstrdup("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) + sizeof(fseq); - - 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, "%s%s", fseq, *dir); - (*fn) (m, xstrdup(dp->d_name), val); - } - closedir(dirp); - } - - /* - * Add wildcard entry - */ - { - size_t l = strlen(*(dir-1)) + sizeof(fseq); - char *val = xmalloc(l); - - xsnprintf(val, l, "%s%s", fseq, *(dir-1)); - (*fn) (m, xstrdup("*"), val); - } - XFREE(mapd); - XFREE(v); - return 0; -} Index: contrib/amd/amd/map.c =================================================================== --- contrib/amd/amd/map.c +++ /dev/null @@ -1,1098 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#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 **) NULL; -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_al->al_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 - * 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] = NULL; - - /* - * 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_al->al_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_al = new_loc(); - mp->am_alarray = NULL; - mp->am_name = xstrdup(dir); - mp->am_path = xstrdup(dir); - mp->am_gen = new_gen(); -#ifdef HAVE_FS_AUTOFS - mp->am_autofs_fh = NULL; -#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; - mp->am_fd[0] = -1; - mp->am_fd[1] = -1; -} - - -void -notify_child(am_node *mp, au_etype au_etype, int au_errno, int au_signal) -{ - amq_sync_umnt rv; - int err; - - if (mp->am_fd[1] >= 0) { /* we have a child process */ - rv.au_etype = au_etype; - rv.au_signal = au_signal; - rv.au_errno = au_errno; - - err = write(mp->am_fd[1], &rv, sizeof(rv)); - /* XXX: do something else on err? */ - if (err < sizeof(rv)) - plog(XLOG_INFO, "notify_child: write returned %d instead of %d.", - err, (int) sizeof(rv)); - close(mp->am_fd[1]); - mp->am_fd[1] = -1; - } -} - - -/* - * Free a mount node. - * The node must be already unmounted. - */ -void -free_map(am_node *mp) -{ - remove_am(mp); - - if (mp->am_fd[1] != -1) - plog(XLOG_FATAL, "free_map: called prior to notifying the child for %s.", - mp->am_path); - - XFREE(mp->am_link); - XFREE(mp->am_name); - XFREE(mp->am_path); - XFREE(mp->am_pref); - XFREE(mp->am_transp); - - if (mp->am_al) - free_loc(mp->am_al); - - if (mp->am_alarray) { - am_loc **temp_al; - for (temp_al = mp->am_alarray; *temp_al; temp_al++) - free_loc(*temp_al); - XFREE(mp->am_alarray); - } - -#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_al->al_mnt->mf_flags & MFF_MOUNTED) && - STREQ(mp->am_al->al_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; -} - - -/* - * 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_handle_t * -get_root_nfs_fh(char *dir, am_nfs_handle_t *nfh) -{ - am_node *mp = get_root_ap(dir); - if (mp) { - if (nfs_dispatcher == nfs_program_2) - mp_to_fh(mp, &nfh->v2); - else - mp_to_fh3(mp, &nfh->v3); - 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_al->al_mnt && mp->am_al->al_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_al->al_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; - - (void) mp->am_al->al_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_mf; - char *rootmap = ROOT_MAP; - root_node = exported_ap_alloc(); - - /* - * Allocate a new map - */ - init_map(root_node, ""); - - /* - * Allocate a new mounted filesystem - */ - root_mf = find_mntfs(&amfs_root_ops, (am_opts *) NULL, "", rootmap, "", "", ""); - - /* - * Replace the initial null reference - */ - free_mntfs(root_node->am_al->al_mnt); - root_node->am_al->al_mnt = root_mf; - - /* - * Initialize the root - */ - if (root_mf->mf_ops->fs_init) - (*root_mf->mf_ops->fs_init) (root_mf); - - /* - * Mount the root - */ - root_mf->mf_error = root_mf->mf_ops->mount_fs(root_node, root_mf); -} - - -/* - * Cause all the nodes to be unmounted by timing - * them out. - */ -void -umount_exported(void) -{ - int i, work_done; - - do { - work_done = 0; - - for (i = last_used_map; i >= 0; --i) { - am_node *mp = exported_ap[i]; - mntfs *mf; - - if (!mp) - continue; - - /* - * Wait for children to be removed first - */ - if (mp->am_child) - continue; - - mf = mp->am_al->al_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)) { - - work_done++; - - /* - * 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); - } - if (!(mf->mf_flags & (MFF_UNMOUNTING|MFF_MOUNTED))) - exported_ap[i] = NULL; - } else { - /* - * Any other node gets forcibly timed out. - */ - mp->am_flags &= ~AMF_NOTIMEOUT; - mp->am_al->al_mnt->mf_flags &= ~MFF_RSTKEEP; - mp->am_ttl = 0; - mp->am_timeo = 1; - mp->am_timeo_w = 0; - } - } - } while (work_done); -} - - -/* - * 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_al->al_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_al->al_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_al->al_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_al->al_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) { - notify_child(mp, AMQ_UMNT_SIGNAL, 0, 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) { - notify_child(mp, AMQ_UMNT_FAILED, rc, 0); - 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 (rc != ENOENT) { - 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() will call notify_child() appropriately. - */ - 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_al->al_mnt; - -#ifdef notdef - plog(XLOG_INFO, "\"%s\" on %s timed out (flags 0x%x)", - mp->am_path, mf->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; - } - notify_child(mp, AMQ_UMNT_SERVER, 0, 0); - return 0; - } - - dlog("\"%s\" on %s timed out", mp->am_path, mf->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) && - !(mf->mf_flags & MFF_ON_AUTOFS)) { - 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_al->al_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, NULL); -} - - -/* - * 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, NULL); -} Index: contrib/amd/amd/mapc.c =================================================================== --- contrib/amd/amd/mapc.c +++ /dev/null @@ -1,1258 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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}, - {NULL, 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 *); -static void mapc_clear_kvhash(kv **); - -/* 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 */ - -/* 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 */ - -/* 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 */ - -/* Sun-syntax MAPS */ -#ifdef HAVE_MAP_SUN -/* XXX: fill in */ -#endif /* HAVE_MAP_SUN */ - -/* 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 */ -#ifdef notyet /* probe function needs to be there or SEGV */ -#ifdef HAVE_MAP_SUN - { - /* XXX: fill in */ - "sun", - NULL, - NULL, - NULL, /* isup function */ - NULL, - NULL, - 0 - }, -#endif /* HAVE_MAP_SUN */ -#endif - { - "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); - - if (val != NULL && strchr(val, '\n') != NULL) { - /* - * If the entry value contains multiple lines we need to break - * them up and add them recursively. This is a workaround to - * support Sun style multi-mounts. Amd converts Sun style - * mulit-mounts to type:=auto. The problem is that Sun packs all - * the entries on one line. When Amd does the conversion it puts - * each type:=auto entry on the same line separated by '\n'. - */ - char *entry, *tok; - - /* - * The first line should contain the first entry. The key for - * this entry is the key passed into this function. - */ - if ((tok = strtok(val, "\n")) != NULL) { - mapc_add_kv(m, key, xstrdup(tok)); - } - - /* - * For the rest of the entries we need to tokenize them by '\n' - * and separate the keys from there entries. - */ - while ((tok = strtok(NULL, "\n")) != NULL) { - key = tok; - /* find the entry */ - for (entry = key; *entry && !isspace((unsigned char)*entry); entry++); - if (*entry) { - *entry++ = '\0'; - } - - mapc_add_kv(m, xstrdup(key), xstrdup(entry)); - } - - XFREE(val); - return; - } - -#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; - } - } else - memset(&re, 0, sizeof(re)); -#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; - m->nentries++; -} - - -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 = NULL; -} - - -/* - * 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]; - 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); - m->nentries = 0; - 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); - mapc_clear_kvhash(maphash); - if (m->wildcard) { - XFREE(m->wildcard); - m->wildcard = NULL; - } - m->modify = t; - ret = 1; - } - - dlog("calling mapc_search for wildcard"); - error = mapc_search(m, wildcard, &m->wildcard); - if (error) - m->wildcard = NULL; - return ret; -} - - -/* - * Create a new map - */ -static mnt_map * -mapc_create(char *map, char *opt, const char *type, const char *mntpt) -{ - mnt_map *m = ALLOC(struct mnt_map); - map_type *mt; - time_t modify = 0; - u_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; - m->nentries = 0; - 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 = xstrdup(map); - m->refc = 1; - m->wildcard = NULL; - m->reloads = 0; - /* initialize per-map information (flags, etc.) */ - m->cfm = find_cf_map(mntpt); - - /* - * synchronize cache with reality - */ - mapc_sync(m); - - return m; -} - - -/* - * Free the cached data in a map hash - */ -static void -mapc_clear_kvhash(kv **kvhash) -{ - int i; - - /* - * For each of the hash slots, chain - * along free'ing the data. - */ - for (i = 0; i < NKVHASH; i++) { - kv *k = kvhash[i]; - while (k) { - kv *n = k->next; - XFREE(k->key); - XFREE(k->val); - XFREE(k); - k = n; - } - } -} - - -/* - * Free the cached data in a map - */ -static void -mapc_clear(mnt_map *m) -{ - mapc_clear_kvhash(m->kvhash); - - /* - * Zero the hash slots - */ - memset((voidp) m->kvhash, 0, sizeof(m->kvhash)); - - /* - * Free the wildcard if it exists - */ - XFREE(m->wildcard); - m->wildcard = NULL; - - m->nentries = 0; -} - - -/* - * Find a map, or create one if it does not exist - */ -mnt_map * -mapc_find(char *map, char *opt, const char *maptype, const char *mntpt) -{ - 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, mntpt); - 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 = NULL; - - /* - * 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, NULL, 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 = xstrdup(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, xstrdup(key), xstrdup(*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 = xstrdup(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, 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, xstrdup(dir), xstrdup(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 */ -} Index: contrib/amd/amd/mntfs.c =================================================================== --- contrib/amd/amd/mntfs.c +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -qelem mfhead = {&mfhead, &mfhead}; - -int mntfs_allocated; - - -am_loc * -dup_loc(am_loc *loc) -{ - loc->al_refc++; - if (loc->al_mnt) { - dup_mntfs(loc->al_mnt); - } - return loc; -} - -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 = 0; - if (mo) - mf->mf_fo = copy_opts(mo); - - mf->mf_mount = xstrdup(mp); - mf->mf_info = xstrdup(info); - mf->mf_auto = xstrdup(auto_opts); - mf->mf_mopts = xstrdup(mopts); - mf->mf_remopts = xstrdup(remopts); - mf->mf_loopdev = NULL; - mf->mf_refc = 1; - mf->mf_flags = 0; - mf->mf_error = -1; - mf->mf_cid = 0; - mf->mf_private = NULL; - mf->mf_prfree = NULL; - - if (ops->ffserver) - mf->mf_server = (*ops->ffserver) (mf); - else - mf->mf_server = NULL; -} - - -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); - - 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 = NULL; - } - - 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 *) NULL, "//nil//", ".", "", "", ""); -} - -am_loc * -new_loc(void) -{ - am_loc *loc = CALLOC(struct am_loc); - loc->al_fo = 0; - loc->al_mnt = new_mntfs(); - loc->al_refc = 1; - return loc; -} - - -static void -uninit_mntfs(mntfs *mf) -{ - if (mf->mf_fo) { - free_opts(mf->mf_fo); - XFREE(mf->mf_fo); - } - XFREE(mf->mf_auto); - XFREE(mf->mf_mopts); - XFREE(mf->mf_remopts); - XFREE(mf->mf_info); - if (mf->mf_private && mf->mf_prfree) - (*mf->mf_prfree) (mf->mf_private); - - 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; -} - -static void -discard_loc(voidp v) -{ - am_loc *loc = v; - if (loc->al_fo) { - free_opts(loc->al_fo); - XFREE(loc->al_fo); - } - XFREE(loc); -} - -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_loc(opaque_t arg) -{ - am_loc *loc = (am_loc *) arg; - dlog("free_loc %p", loc); - - if (loc->al_refc <= 0) { - plog(XLOG_ERROR, "IGNORING free_loc for 0x%p", loc); - return; - } - - if (loc->al_mnt) - free_mntfs(loc->al_mnt); - if (--loc->al_refc == 0) { - discard_loc(loc); - } -} - -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)) { - return mf; - } - - mf2 = find_mntfs(ops, mo, mp, info, auto_opts, mopts, remopts); - free_mntfs(mf); - return mf2; -} Index: contrib/amd/amd/nfs_prot_svc.c =================================================================== --- contrib/amd/amd/nfs_prot_svc.c +++ /dev/null @@ -1,488 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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; -dispatcher_t nfs_dispatcher = nfs_program_2; - -/* 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); - } -} - -void -nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp) -{ - union { - am_GETATTR3args am_nfs3_getattr_3_arg; - am_SETATTR3args am_nfs3_setattr_3_arg; - am_LOOKUP3args am_nfs3_lookup_3_arg; - am_ACCESS3args am_nfs3_access_3_arg; - am_READLINK3args am_nfs3_readlink_3_arg; - am_READ3args am_nfs3_read_3_arg; - am_WRITE3args am_nfs3_write_3_arg; - am_CREATE3args am_nfs3_create_3_arg; - am_MKDIR3args am_nfs3_mkdir_3_arg; - am_SYMLINK3args am_nfs3_symlink_3_arg; - am_MKNOD3args am_nfs3_mknod_3_arg; - am_REMOVE3args am_nfs3_remove_3_arg; - am_RMDIR3args am_nfs3_rmdir_3_arg; - am_RENAME3args am_nfs3_rename_3_arg; - am_LINK3args am_nfs3_link_3_arg; - am_READDIR3args am_nfs3_readdir_3_arg; - am_READDIRPLUS3args am_nfs3_readdirplus_3_arg; - am_FSSTAT3args am_nfs3_fsstat_3_arg; - am_FSINFO3args am_nfs3_fsinfo_3_arg; - am_PATHCONF3args am_nfs3_pathconf_3_arg; - am_COMMIT3args am_nfs3_commit_3_arg; - } argument; - char *result; - xdrproc_t _xdr_argument, _xdr_result; - nfssvcproc_t local; - - switch (rqstp->rq_proc) { - case AM_NFS3_NULL: - _xdr_argument = (xdrproc_t) xdr_void; - _xdr_result = (xdrproc_t) xdr_void; - local = (nfssvcproc_t) am_nfs3_null_3_svc; - break; - - case AM_NFS3_GETATTR: - _xdr_argument = (xdrproc_t) xdr_am_GETATTR3args; - _xdr_result = (xdrproc_t) xdr_am_GETATTR3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_getattr_3_svc; - break; - - case AM_NFS3_SETATTR: - _xdr_argument = (xdrproc_t) xdr_am_SETATTR3args; - _xdr_result = (xdrproc_t) xdr_am_SETATTR3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_setattr_3_svc; - break; - - case AM_NFS3_LOOKUP: - _xdr_argument = (xdrproc_t) xdr_am_LOOKUP3args; - _xdr_result = (xdrproc_t) xdr_am_LOOKUP3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_lookup_3_svc; - break; - - case AM_NFS3_ACCESS: - _xdr_argument = (xdrproc_t) xdr_am_ACCESS3args; - _xdr_result = (xdrproc_t) xdr_am_ACCESS3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_access_3_svc; - break; - - case AM_NFS3_READLINK: - _xdr_argument = (xdrproc_t) xdr_am_READLINK3args; - _xdr_result = (xdrproc_t) xdr_am_READLINK3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_readlink_3_svc; - break; - - case AM_NFS3_READ: - _xdr_argument = (xdrproc_t) xdr_am_READ3args; - _xdr_result = (xdrproc_t) xdr_am_READ3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_read_3_svc; - break; - - case AM_NFS3_WRITE: - _xdr_argument = (xdrproc_t) xdr_am_WRITE3args; - _xdr_result = (xdrproc_t) xdr_am_WRITE3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_write_3_svc; - break; - - case AM_NFS3_CREATE: - _xdr_argument = (xdrproc_t) xdr_am_CREATE3args; - _xdr_result = (xdrproc_t) xdr_am_CREATE3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_create_3_svc; - break; - - case AM_NFS3_MKDIR: - _xdr_argument = (xdrproc_t) xdr_am_MKDIR3args; - _xdr_result = (xdrproc_t) xdr_am_MKDIR3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_mkdir_3_svc; - break; - - case AM_NFS3_SYMLINK: - _xdr_argument = (xdrproc_t) xdr_am_SYMLINK3args; - _xdr_result = (xdrproc_t) xdr_am_SYMLINK3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_symlink_3_svc; - break; - - case AM_NFS3_MKNOD: - _xdr_argument = (xdrproc_t) xdr_am_MKNOD3args; - _xdr_result = (xdrproc_t) xdr_am_MKNOD3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_mknod_3_svc; - break; - - case AM_NFS3_REMOVE: - _xdr_argument = (xdrproc_t) xdr_am_REMOVE3args; - _xdr_result = (xdrproc_t) xdr_am_REMOVE3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_remove_3_svc; - break; - - case AM_NFS3_RMDIR: - _xdr_argument = (xdrproc_t) xdr_am_RMDIR3args; - _xdr_result = (xdrproc_t) xdr_am_RMDIR3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_rmdir_3_svc; - break; - - case AM_NFS3_RENAME: - _xdr_argument = (xdrproc_t) xdr_am_RENAME3args; - _xdr_result = (xdrproc_t) xdr_am_RENAME3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_rename_3_svc; - break; - - case AM_NFS3_LINK: - _xdr_argument = (xdrproc_t) xdr_am_LINK3args; - _xdr_result = (xdrproc_t) xdr_am_LINK3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_link_3_svc; - break; - - case AM_NFS3_READDIR: - _xdr_argument = (xdrproc_t) xdr_am_READDIR3args; - _xdr_result = (xdrproc_t) xdr_am_READDIR3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_readdir_3_svc; - break; - - case AM_NFS3_READDIRPLUS: - _xdr_argument = (xdrproc_t) xdr_am_READDIRPLUS3args; - _xdr_result = (xdrproc_t) xdr_am_READDIRPLUS3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_readdirplus_3_svc; - break; - - case AM_NFS3_FSSTAT: - _xdr_argument = (xdrproc_t) xdr_am_FSSTAT3args; - _xdr_result = (xdrproc_t) xdr_am_FSSTAT3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_fsstat_3_svc; - break; - - case AM_NFS3_FSINFO: - _xdr_argument = (xdrproc_t) xdr_am_FSINFO3args; - _xdr_result = (xdrproc_t) xdr_am_FSINFO3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_fsinfo_3_svc; - break; - - case AM_NFS3_PATHCONF: - _xdr_argument = (xdrproc_t) xdr_am_PATHCONF3args; - _xdr_result = (xdrproc_t) xdr_am_PATHCONF3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_pathconf_3_svc; - break; - - case AM_NFS3_COMMIT: - _xdr_argument = (xdrproc_t) xdr_am_COMMIT3args; - _xdr_result = (xdrproc_t) xdr_am_COMMIT3res; - local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_commit_3_svc; - break; - - default: - svcerr_noproc (transp); - return; - } - - memset ((char *)&argument, 0, sizeof (argument)); - - if (!svc_getargs(transp, (xdrproc_t) _xdr_argument, (caddr_t) &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); - if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) { - svcerr_systemerr (transp); - } - - if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) { - plog(XLOG_FATAL, "unable to free rpc arguments in nfs_program_3"); - going_down(1); - } - return; -} Index: contrib/amd/amd/nfs_start.c =================================================================== --- contrib/amd/amd/nfs_start.c +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#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 = NULL; - 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 *) NULL, (fd_set *) NULL, - tvp->tv_sec ? tvp : (struct timeval *) NULL); - } - -#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 *) NULL, (fd_set *) NULL, &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 - 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_dispatcher, - get_nfs_dispatcher_version(nfs_dispatcher)); - 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 noamq, 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) - */ - int tcp_ok = 0, udp_ok = 0; - - unregister_amq(); /* unregister leftover Amd, if any, just in case */ - - tcp_ok = amu_svc_register(tcp_amqp, get_amd_program_number(), AMQ_VERSION, - amq_program_1, IPPROTO_TCP, tcp_amqncp); - if (!tcp_ok) - plog(XLOG_FATAL, - "unable to register (AMQ_PROGRAM=%lu, AMQ_VERSION, tcp)", - get_amd_program_number()); - - udp_ok = amu_svc_register(udp_amqp, get_amd_program_number(), AMQ_VERSION, - amq_program_1, IPPROTO_UDP, udp_amqncp); - if (!udp_ok) - plog(XLOG_FATAL, - "unable to register (AMQ_PROGRAM=%lu, AMQ_VERSION, udp)", - get_amd_program_number()); - - /* return error only if both failed */ - if (!tcp_ok && !udp_ok) { - amd_state = Done; - return 3; - } - } - - /* - * 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; -} Index: contrib/amd/amd/nfs_subr.c =================================================================== --- contrib/amd/amd/nfs_subr.c +++ /dev/null @@ -1,1863 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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; -}; - -struct am_fh3 { - 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[AM_FHSIZE3-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_al->al_mnt->mf_ops->readlink) { - int retry = 0; - mp = (*mp->am_al->al_mnt->mf_ops->readlink) (mp, &retry); - if (mp == NULL) { - *error_return = retry; - return 0; - } - /* reschedule_timeout_mp(); */ - } - - if (mp->am_link) { - ln = mp->am_link; - } else { - ln = mp->am_al->al_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 = 0; - time_t now = clocktime(NULL); - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "getattr:"); - - mp = fh_to_mp3(argp, &retry, VLOOK_CREATE); - if (mp == NULL) { - 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 == NULL) { - 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_al->al_mnt->mf_ops->lookup_child(mp, argp->da_name, &error, VLOOK_CREATE); - if (ap && error < 0) - ap = mp->am_al->al_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_al->al_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 == NULL) { - 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 == NULL) { - 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_al->al_mnt->mf_ops->lookup_child(mp, argp->da_name, &retry, VLOOK_DELETE); - if (mp == NULL) { - /* - * 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 == NULL) { - 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_al->al_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 == NULL) { - 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_al->al_mnt && mp->am_al->al_mnt->mf_mopts) { - mnt.mnt_opts = mp->am_al->al_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_al->al_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; -} - -static am_node * -validate_ap(am_node *node, int *rp, u_int fhh_gen) -{ - am_node *ap = node; - /* - * 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 (node != NULL && node->am_gen != fhh_gen) - ap = NULL; - - /* - * 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_al->al_mnt && FSRV_ISDOWN(ap->am_al->al_mnt->mf_server) && ap->am_parent) { - int error; - am_node *orig_ap = ap; - - dlog("%s: %s (%s) is hung: lookup alternative file server", __func__, - orig_ap->am_path, orig_ap->am_al->al_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_al->al_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_al->al_mnt->mf_ops->mount_child(ap, &error); - } else { - ap = NULL; - 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 /* 0 */ - - /* - * Disallow references to objects being unmounted, unless - * they are automount points. - */ - if (ap->am_al->al_mnt && (ap->am_al->al_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_al->al_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; -} - -/* - * 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 = NULL; - - 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("%s: new filehandle: %s", __func__, path); - - ap = path_to_exported_ap(path); - XFREE(path); - } else { - dlog("%s: old filehandle: %d", __func__, 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("%s: wrong pid %ld != my pid %ld", __func__, - (long) fp->u.s.fhh_pid, get_server_pid()); - goto done; - } - - /* - * Get hold of the supposed mount node - */ - ap = get_exported_ap(fp->u.s.fhh_id); - } -done: - return validate_ap(ap, rp, fp->fhh_gen); -} - -static am_node * -fh_to_mp(am_nfs_fh *fhp) -{ - int dummy; - - return fh_to_mp3(fhp, &dummy, VLOOK_CREATE); -} - -static am_node * -fh3_to_mp3(am_nfs_fh3 *fhp, int *rp, int vop) -{ - struct am_fh3 *fp = (struct am_fh3 *) fhp->am_fh3_data; - am_node *ap = NULL; - - if (fp->u.s.fhh_type != 0) { - /* New filehandle type */ - int len = sizeof(*fp) - 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("%s: new filehandle: %s", __func__, path); - - ap = path_to_exported_ap(path); - XFREE(path); - } else { - dlog("%s: old filehandle: %d", __func__, 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("%s: wrong pid %ld != my pid %ld", __func__, - (long) fp->u.s.fhh_pid, get_server_pid()); - goto done; - } - - /* - * Get hold of the supposed mount node - */ - ap = get_exported_ap(fp->u.s.fhh_id); - } -done: - return validate_ap(ap, rp, fp->fhh_gen); -} - -static am_node * -fh3_to_mp(am_nfs_fh3 *fhp) -{ - int dummy; - - return fh3_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); */ - } -} -void -mp_to_fh3(am_node *mp, am_nfs_fh3 *fhp) -{ - u_int pathlen; - struct am_fh3 *fp = (struct am_fh3 *) fhp->am_fh3_data; - - memset((char *) fhp, 0, sizeof(am_nfs_fh3)); - fhp->am_fh3_length = AM_FHSIZE3; - - /* Store the generation number */ - fp->fhh_gen = mp->am_gen; - - pathlen = strlen(mp->am_path); - if (pathlen <= sizeof(*fp) - 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); */ - } -} - -#ifdef HAVE_FS_NFS3 -static am_ftype3 ftype_to_ftype3(nfsftype ftype) -{ - if (ftype == NFFIFO) - return AM_NF3FIFO; - else - return ftype; -} - -static void nfstime_to_am_nfstime3(nfstime *time, am_nfstime3 *time3) -{ - time3->seconds = time->seconds; - time3->nseconds = time->useconds * 1000; -} - -static void rdev_to_am_specdata3(u_int rdev, am_specdata3 *rdev3) -{ - /* No device node here */ - rdev3->specdata1 = (u_int) -1; - rdev3->specdata2 = (u_int) -1; -} - -static void fattr_to_fattr3(nfsfattr *fattr, am_fattr3 *fattr3) -{ - fattr3->type = ftype_to_ftype3(fattr->na_type); - fattr3->mode = (am_mode3) fattr->na_mode; - fattr3->nlink = fattr->na_nlink; - fattr3->uid = (am_uid3) fattr->na_uid; - fattr3->gid = (am_uid3) fattr->na_gid; - fattr3->size = (am_size3) fattr->na_size; - fattr3->used = (am_size3) fattr->na_size; - rdev_to_am_specdata3(fattr->na_rdev, &fattr3->rdev); - fattr3->fsid = (uint64) fattr->na_fsid; - fattr3->fileid = (uint64) fattr->na_fileid; - nfstime_to_am_nfstime3(&fattr->na_atime, &fattr3->atime); - nfstime_to_am_nfstime3(&fattr->na_mtime, &fattr3->mtime); - nfstime_to_am_nfstime3(&fattr->na_ctime, &fattr3->ctime); -} - -static void fattr_to_wcc_attr(nfsfattr *fattr, am_wcc_attr *wcc_attr) -{ - wcc_attr->size = (am_size3) fattr->na_size; - nfstime_to_am_nfstime3(&fattr->na_mtime, &wcc_attr->mtime); - nfstime_to_am_nfstime3(&fattr->na_ctime, &wcc_attr->ctime); -} - -static am_nfsstat3 return_estale_or_rofs(am_nfs_fh3 *fh, - am_pre_op_attr *pre_op, - am_post_op_attr *post_op) -{ - am_node *mp; - - mp = fh3_to_mp(fh); - if (!mp) { - pre_op->attributes_follow = 0; - post_op->attributes_follow = 0; - return nfs_error(ESTALE); - } else { - am_fattr3 *fattr3 = &post_op->am_post_op_attr_u.attributes; - am_wcc_attr *wcc_attr = &pre_op->am_pre_op_attr_u.attributes; - nfsfattr *fattr = &mp->am_fattr; - pre_op->attributes_follow = 1; - fattr_to_wcc_attr(fattr, wcc_attr); - post_op->attributes_follow = 1; - fattr_to_fattr3(fattr, fattr3); - return nfs_error(EROFS); - } -} - -static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, - am_wcc_data *wcc_data, int unlinkp) -{ - static am_nfsstat3 res; - am_nfs_fh3 *dir = &argp->dir; - am_filename3 name = argp->name; - am_pre_op_attr *pre_op_dir = &wcc_data->before; - am_post_op_attr *post_op_dir = &wcc_data->after; - nfsfattr *fattr; - am_wcc_attr *wcc_attr; - am_node *mp, *ap; - int retry; - - post_op_dir->attributes_follow = 0; - - mp = fh3_to_mp3(dir, &retry, VLOOK_DELETE); - if (!mp) { - pre_op_dir->attributes_follow = 0; - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - res = nfs_error(retry); - goto out; - } - - pre_op_dir->attributes_follow = 1; - fattr = &mp->am_fattr; - wcc_attr = &pre_op_dir->am_pre_op_attr_u.attributes; - fattr_to_wcc_attr(fattr, wcc_attr); - - 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, name); - - ap = mp->am_al->al_mnt->mf_ops->lookup_child(mp, name, &retry, VLOOK_DELETE); - if (!ap) { - /* - * 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 = AM_NFS3_OK; - } - -out: - return res; -} - -voidp -am_nfs3_null_3_svc(voidp argp, struct svc_req *rqstp) -{ - static char * result; - - return (voidp) &result; -} - -am_GETATTR3res * -am_nfs3_getattr_3_svc(am_GETATTR3args *argp, struct svc_req *rqstp) -{ - static am_GETATTR3res result; - am_nfs_fh3 *fh = (am_nfs_fh3 *) &argp->object; - am_fattr3 *fattr3; - nfsfattr *fattr; - am_node *mp; - int retry = 0; - time_t now = clocktime(NULL); - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "getattr_3:"); - - mp = fh3_to_mp3(fh, &retry, VLOOK_CREATE); - if (!mp) { - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\tretry=%d", retry); - - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - result.status = nfs_error(retry); - return &result; - } - - fattr = &mp->am_fattr; - fattr3 = (am_fattr3 *) &result.res_u.ok.obj_attributes; - fattr_to_fattr3(fattr, fattr3); - - result.status = AM_NFS3_OK; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\tstat(%s), size = %lu, mtime=%d.%d", - mp->am_path, - (u_long) fattr3->size, - (u_int) fattr3->mtime.seconds, - (u_int) fattr3->mtime.nseconds); - - /* 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 &result; -} - -am_SETATTR3res * -am_nfs3_setattr_3_svc(am_SETATTR3args *argp, struct svc_req *rqstp) -{ - static am_SETATTR3res result; - am_nfs_fh3 *fh = (am_nfs_fh3 *) &argp->object; - am_pre_op_attr *pre_op_obj = &result.res_u.fail.obj_wcc.before; - am_post_op_attr *post_op_obj = &result.res_u.fail.obj_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "setattr_3:"); - - result.status = return_estale_or_rofs(fh, pre_op_obj, post_op_obj); - - return &result; -} - -am_LOOKUP3res * -am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp) -{ - static am_LOOKUP3res result; - am_nfs_fh3 *dir = &argp->what.dir; - am_post_op_attr *post_op_dir; - am_post_op_attr *post_op_obj; - am_node *mp; - int retry; - uid_t uid; - gid_t gid; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "lookup_3:"); - - /* 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 = fh3_to_mp3(dir, &retry, VLOOK_CREATE); - if (!mp) { - post_op_dir = &result.res_u.fail.dir_attributes; - post_op_dir->attributes_follow = 0; - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - result.status = nfs_error(retry); - } else { - post_op_dir = &result.res_u.ok.dir_attributes; - post_op_obj = &result.res_u.ok.obj_attributes; - am_filename3 name; - am_fattr3 *fattr3; - nfsfattr *fattr; - am_node *ap; - int error; - - /* dir attributes */ - post_op_dir->attributes_follow = 1; - fattr = &mp->am_fattr; - fattr3 = &post_op_dir->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - post_op_obj->attributes_follow = 0; - - name = argp->what.name; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\tlookup_3(%s, %s)", mp->am_path, name); - - ap = mp->am_al->al_mnt->mf_ops->lookup_child(mp, name, &error, VLOOK_CREATE); - if (ap && error < 0) - ap = mp->am_al->al_mnt->mf_ops->mount_child(ap, &error); - if (ap == 0) { - if (error < 0) { - amd_stats.d_drops++; - return 0; - } - result.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_fh3(ap, &result.res_u.ok.object); - - /* mount attributes */ - post_op_obj->attributes_follow = 1; - fattr = &ap->am_fattr; - fattr3 = &post_op_obj->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - result.status = AM_NFS3_OK; - } - mp->am_stats.s_lookup++; - } - return &result; -} - -am_ACCESS3res * -am_nfs3_access_3_svc(am_ACCESS3args *argp, struct svc_req *rqstp) -{ - static am_ACCESS3res result; - - am_nfs_fh3 *obj = &argp->object; - u_int accessbits = argp->access; - u_int accessmask = AM_ACCESS3_LOOKUP|AM_ACCESS3_READ; - am_post_op_attr *post_op_obj; - am_node *mp; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "access_3:"); - - mp = fh3_to_mp(obj); - if (!mp) { - post_op_obj = &result.res_u.fail.obj_attributes; - post_op_obj->attributes_follow = 0; - result.status = nfs_error(ENOENT); - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "access_3: ENOENT"); - } else { - nfsfattr *fattr = &mp->am_fattr; - am_fattr3 *fattr3; - post_op_obj = &result.res_u.ok.obj_attributes; - fattr3 = &post_op_obj->am_post_op_attr_u.attributes; - post_op_obj->attributes_follow = 1; - fattr_to_fattr3(fattr, fattr3); - - result.res_u.ok.access = accessbits & accessmask; - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "access_3: b=%x m=%x", accessbits, accessmask); - - result.status = AM_NFS3_OK; - } - - return &result; -} - -am_READLINK3res * -am_nfs3_readlink_3_svc(am_READLINK3args *argp, struct svc_req *rqstp) -{ - static am_READLINK3res result; - - am_nfs_fh3 *symlink = (am_nfs_fh3 *) &argp->symlink; - am_post_op_attr *post_op_sym; - am_node *mp; - int retry = 0; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "readlink_3:"); - - mp = fh3_to_mp3(symlink, &retry, VLOOK_CREATE); - if (!mp) { - readlink_retry: - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - post_op_sym = &result.res_u.fail.symlink_attributes; - post_op_sym->attributes_follow = 0; - result.status = nfs_error(retry); - } else { - nfsfattr *fattr; - am_fattr3 *fattr3; - char *ln; - - ln = do_readlink(mp, &retry); - if (!ln) - goto readlink_retry; - - if (amuDebug(D_TRACE) && ln) - plog(XLOG_DEBUG, "\treadlink_3(%s) = %s", mp->am_path, ln); - - result.res_u.ok.data = ln; - - post_op_sym = &result.res_u.ok.symlink_attributes; - post_op_sym->attributes_follow = 1; - fattr = &mp->am_fattr; - fattr3 = &post_op_sym->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - mp->am_stats.s_readlink++; - result.status = AM_NFS3_OK; - } - - return &result; -} - -am_READ3res * -am_nfs3_read_3_svc(am_READ3args *argp, struct svc_req *rqstp) -{ - static am_READ3res result; - - am_nfs_fh3 *file = (am_nfs_fh3 *) &argp->file; - am_post_op_attr *post_op_file; - am_node *mp; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "read_3:"); - - post_op_file = &result.res_u.fail.file_attributes; - result.status = nfs_error(EACCES); - - mp = fh3_to_mp(file); - if (!mp) - post_op_file->attributes_follow = 0; - else { - nfsfattr *fattr = &mp->am_fattr; - am_fattr3 *fattr3 = &post_op_file->am_post_op_attr_u.attributes; - post_op_file->attributes_follow = 1; - fattr_to_fattr3(fattr, fattr3); - } - - return &result; -} - -am_WRITE3res * -am_nfs3_write_3_svc(am_WRITE3args *argp, struct svc_req *rqstp) -{ - static am_WRITE3res result; - - am_nfs_fh3 *file = (am_nfs_fh3 *) &argp->file; - am_pre_op_attr *pre_op_file = &result.res_u.fail.file_wcc.before; - am_post_op_attr *post_op_file = &result.res_u.fail.file_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "write_3:"); - - result.status = return_estale_or_rofs(file, pre_op_file, post_op_file); - - return &result; -} - -am_CREATE3res * -am_nfs3_create_3_svc(am_CREATE3args *argp, struct svc_req *rqstp) -{ - static am_CREATE3res result; - - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->where.dir; - am_pre_op_attr *pre_op_dir = &result.res_u.fail.dir_wcc.before; - am_post_op_attr *post_op_dir = &result.res_u.fail.dir_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "create_3:"); - - result.status = return_estale_or_rofs(dir, pre_op_dir, post_op_dir); - - return &result; -} - -am_MKDIR3res * -am_nfs3_mkdir_3_svc(am_MKDIR3args *argp, struct svc_req *rqstp) -{ - static am_MKDIR3res result; - - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->where.dir; - am_pre_op_attr *pre_op_dir = &result.res_u.fail.dir_wcc.before; - am_post_op_attr *post_op_dir = &result.res_u.fail.dir_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "mkdir_3:"); - - result.status = return_estale_or_rofs(dir, pre_op_dir, post_op_dir); - - return &result; -} - -am_SYMLINK3res * -am_nfs3_symlink_3_svc(am_SYMLINK3args *argp, struct svc_req *rqstp) -{ - static am_SYMLINK3res result; - - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->where.dir; - am_pre_op_attr *pre_op_dir = &result.res_u.fail.dir_wcc.before; - am_post_op_attr *post_op_dir = &result.res_u.fail.dir_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "symlink_3:"); - - result.status = return_estale_or_rofs(dir, pre_op_dir, post_op_dir); - - return &result; -} - -am_MKNOD3res * -am_nfs3_mknod_3_svc(am_MKNOD3args *argp, struct svc_req *rqstp) -{ - static am_MKNOD3res result; - - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->where.dir; - am_pre_op_attr *pre_op_dir = &result.res_u.fail.dir_wcc.before; - am_post_op_attr *post_op_dir = &result.res_u.fail.dir_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "mknod_3:"); - - result.status = return_estale_or_rofs(dir, pre_op_dir, post_op_dir); - return &result; -} - -am_REMOVE3res * -am_nfs3_remove_3_svc(am_REMOVE3args *argp, struct svc_req *rqstp) -{ - static am_REMOVE3res result; - - am_diropargs3 *obj = &argp->object; - am_wcc_data dir_wcc; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "remove_3:"); - - result.status = unlink3_or_rmdir3(obj, &dir_wcc, TRUE); - - result.res_u.ok.dir_wcc = dir_wcc; - - return &result; -} - -am_RMDIR3res * -am_nfs3_rmdir_3_svc(am_RMDIR3args *argp, struct svc_req *rqstp) -{ - static am_RMDIR3res result; - - am_diropargs3 *obj = &argp->object; - am_wcc_data dir_wcc; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "rmdir_3:"); - - result.status = unlink3_or_rmdir3(obj, &dir_wcc, TRUE); - - result.res_u.ok.dir_wcc = dir_wcc; - - return &result; -} - -am_RENAME3res * -am_nfs3_rename_3_svc(am_RENAME3args *argp, struct svc_req *rqstp) -{ - static am_RENAME3res result; - - am_nfs_fh3 *fromdir = (am_nfs_fh3 *) &argp->from.dir; - am_nfs_fh3 *todir = (am_nfs_fh3 *) &argp->to.dir; - am_filename3 name = argp->to.name; - am_node *to_mp, *from_mp; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "rename_3:"); - - if (!(from_mp = fh3_to_mp(fromdir)) || !(to_mp = fh3_to_mp(todir))) - result.status = nfs_error(ESTALE); - /* - * If the kernel is doing clever things with referenced files - * then let it pretend... - */ - else { - am_wcc_attr *wcc_attr; - am_fattr3 *fattr3; - am_wcc_data *to_wcc_data, *from_wcc_data; - am_pre_op_attr *pre_op_to, *pre_op_from; - am_post_op_attr *post_op_to, *post_op_from; - nfsfattr *fattr; - - to_wcc_data = &result.res_u.ok.todir_wcc; - - pre_op_to = &to_wcc_data->before; - post_op_to = &to_wcc_data->after; - - pre_op_to->attributes_follow = 1; - fattr = &to_mp->am_fattr; - wcc_attr = &pre_op_to->am_pre_op_attr_u.attributes; - fattr_to_wcc_attr(fattr, wcc_attr); - post_op_to->attributes_follow = 1; - fattr3 = &post_op_to->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - from_wcc_data = &result.res_u.ok.fromdir_wcc; - - pre_op_from = &from_wcc_data->before; - post_op_from = &from_wcc_data->after; - - pre_op_from->attributes_follow = 1; - fattr = &from_mp->am_fattr; - wcc_attr = &pre_op_from->am_pre_op_attr_u.attributes; - fattr_to_wcc_attr(fattr, wcc_attr); - post_op_from->attributes_follow = 1; - fattr3 = &post_op_from->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - if (NSTREQ(name, ".nfs", 4)) - result.status = AM_NFS3_OK; - /* - * otherwise a failure - */ - else - result.status = nfs_error(EROFS); - } - - return &result; -} - -am_LINK3res * -am_nfs3_link_3_svc(am_LINK3args *argp, struct svc_req *rqstp) -{ - static am_LINK3res result; - - am_nfs_fh3 *file = (am_nfs_fh3 *) &argp->file; - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->link.dir; - am_post_op_attr *post_op_file; - am_pre_op_attr *pre_op_dir; - am_post_op_attr *post_op_dir; - am_node *mp_file, *mp_dir; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "link_3:"); - - post_op_file = &result.res_u.fail.file_attributes; - post_op_file->attributes_follow = 0; - - mp_file = fh3_to_mp(file); - if (mp_file) { - nfsfattr *fattr = &mp_file->am_fattr; - am_fattr3 *fattr3 = &post_op_file->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - } - - pre_op_dir = &result.res_u.fail.linkdir_wcc.before; - pre_op_dir->attributes_follow = 0; - post_op_dir = &result.res_u.fail.linkdir_wcc.after; - post_op_dir->attributes_follow = 0; - - mp_dir = fh3_to_mp(dir); - if (mp_dir) { - nfsfattr *fattr = &mp_dir->am_fattr; - am_fattr3 *fattr3 = &post_op_dir->am_post_op_attr_u.attributes; - am_wcc_attr *wcc_attr = &pre_op_dir->am_pre_op_attr_u.attributes; - - pre_op_dir->attributes_follow = 1; - fattr_to_wcc_attr(fattr, wcc_attr); - post_op_dir->attributes_follow = 1; - fattr_to_fattr3(fattr, fattr3); - } - - if (!mp_file || !mp_dir) - result.status = nfs_error(ESTALE); - else - result.status = nfs_error(EROFS); - - return &result; -} - -am_READDIR3res * -am_nfs3_readdir_3_svc(am_READDIR3args *argp, struct svc_req *rqstp) -{ - static am_READDIR3res result; - static am_entry3 entries[MAX_READDIR_ENTRIES]; - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->dir; - am_cookie3 cookie = argp->cookie; - am_cookieverf3 cookieverf; - am_count3 count = argp->count; - am_post_op_attr *post_op_dir; - am_node *mp; - int retry; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "readdir_3:"); - - memcpy(&cookieverf, &argp->cookieverf, sizeof(am_cookieverf3)); - - mp = fh3_to_mp3(dir, &retry, VLOOK_CREATE); - if (mp == NULL) { - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - post_op_dir = &result.res_u.fail.dir_attributes; - post_op_dir->attributes_follow = 0; - result.status = nfs_error(retry); - } else { - am_dirlist3 *list = &result.res_u.ok.reply; - am_nfsstat3 status; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\treaddir_3(%s)", mp->am_path); - - status = mp->am_al->al_mnt->mf_ops->readdir(mp, - (voidp)&cookie, list, entries, count); - if (status == 0) { - post_op_dir = &result.res_u.ok.dir_attributes; - nfsfattr *fattr; - am_fattr3 *fattr3; - - fattr = &mp->am_fattr; - fattr3 = &post_op_dir->am_post_op_attr_u.attributes; - post_op_dir->attributes_follow = 1; - fattr_to_fattr3(fattr, fattr3); - result.status = AM_NFS3_OK; - } else { - post_op_dir = &result.res_u.fail.dir_attributes; - post_op_dir->attributes_follow = 0; - result.status = nfs_error(status); - } - - mp->am_stats.s_readdir++; - } - - return &result; -} - -am_READDIRPLUS3res * -am_nfs3_readdirplus_3_svc(am_READDIRPLUS3args *argp, struct svc_req *rqstp) -{ - static am_READDIRPLUS3res result; - am_nfs_fh3 *dir = (am_nfs_fh3 *) &argp->dir; - am_post_op_attr *post_op_dir; - nfsfattr *fattr; - am_fattr3 *fattr3; - am_node *mp; - int retry; - - mp = fh3_to_mp3(dir, &retry, VLOOK_CREATE); - if (mp == NULL) { - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - post_op_dir = &result.res_u.fail.dir_attributes; - post_op_dir->attributes_follow = 0; - result.status = nfs_error(retry); - } else { - post_op_dir = &result.res_u.ok.dir_attributes; - fattr = &mp->am_fattr; - fattr3 = &post_op_dir->am_post_op_attr_u.attributes; - post_op_dir->attributes_follow = 1; - fattr_to_fattr3(fattr, fattr3); - result.status = AM_NFS3ERR_NOTSUPP; - } - - return &result; -} - -am_FSSTAT3res * -am_nfs3_fsstat_3_svc(am_FSSTAT3args *argp, struct svc_req *rqstp) -{ - static am_FSSTAT3res result; - - am_nfs_fh3 *fsroot = (am_nfs_fh3 *) &argp->fsroot; - am_post_op_attr *post_op_fsroot; - am_node *mp; - int retry; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "fsstat_3:"); - - mp = fh3_to_mp3(fsroot, &retry, VLOOK_CREATE); - if (!mp) { - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - post_op_fsroot = &result.res_u.fail.obj_attributes; - post_op_fsroot->attributes_follow = 0; - result.status = nfs_error(retry); - } else { - am_FSSTAT3resok *ok = &result.res_u.ok; - u_int blocks, bfree, bavail; - nfsfattr *fattr; - am_fattr3 *fattr3; - mntent_t mnt; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\tfsstat_3(%s)", mp->am_path); - - fattr = &mp->am_fattr; - post_op_fsroot = &ok->obj_attributes; - post_op_fsroot->attributes_follow = 1; - fattr3 = &post_op_fsroot->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - /* - * just return faked up file system information - */ - ok->tbytes = 1024; - ok->invarsec = 0; - - /* check if map is browsable and show_statfs_entries=yes */ - if ((gopt.flags & CFM_SHOW_STATFS_ENTRIES) && - mp->am_al->al_mnt && mp->am_al->al_mnt->mf_mopts) { - mnt.mnt_opts = mp->am_al->al_mnt->mf_mopts; - if (amu_hasmntopt(&mnt, "browsable")) { - count_map_entries(mp, &blocks, &bfree, &bavail); - } - ok->fbytes = bfree; - ok->abytes = bavail; - ok->ffiles = bfree; - ok->afiles = bavail; - ok->tfiles = blocks; - } else { - ok->fbytes = 0; - ok->abytes = 0; - ok->ffiles = 0; - ok->afiles = 0; - ok->tfiles = 0; /* set to 1 if you don't want empty automounts */ - } - - result.status = AM_NFS3_OK; - mp->am_stats.s_statfs++; - } - - return &result; -} - -#define FSF3_HOMOGENEOUS 0x0008 - -am_FSINFO3res * -am_nfs3_fsinfo_3_svc(am_FSINFO3args *argp, struct svc_req *rqstp) -{ - static am_FSINFO3res result; - - am_nfs_fh3 *fsroot = (am_nfs_fh3 *) &argp->fsroot; - am_post_op_attr *post_op_fsroot; - am_node *mp; - int retry; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "fsinfo_3:"); - - mp = fh3_to_mp3(fsroot, &retry, VLOOK_CREATE); - if (!mp) { - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - post_op_fsroot = &result.res_u.fail.obj_attributes; - post_op_fsroot->attributes_follow = 0; - result.status = nfs_error(retry); - } else { - am_FSINFO3resok *ok = &result.res_u.ok; - nfsfattr *fattr; - am_fattr3 *fattr3; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\tfsinfo_3(%s)", mp->am_path); - - fattr = &mp->am_fattr; - post_op_fsroot = &ok->obj_attributes; - post_op_fsroot->attributes_follow = 1; - fattr3 = &post_op_fsroot->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - /* - * just return faked up file system information - */ - ok->rtmax = 0; - ok->rtpref = 0; - ok->rtmult = 0; - ok->wtmax = 0; - ok->wtpref = 0; - ok->wtmult = 0; - ok->dtpref = 1024; - ok->maxfilesize = 0; - ok->time_delta.seconds = 1; - ok->time_delta.nseconds = 0; - ok->properties = FSF3_HOMOGENEOUS; - - result.status = AM_NFS3_OK; - mp->am_stats.s_fsinfo++; - } - - return &result; -} - -am_PATHCONF3res * -am_nfs3_pathconf_3_svc(am_PATHCONF3args *argp, struct svc_req *rqstp) -{ - static am_PATHCONF3res result; - - am_nfs_fh3 *obj = (am_nfs_fh3 *) &argp->object; - am_post_op_attr *post_op_obj; - am_node *mp; - int retry; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "pathconf_3:"); - - mp = fh3_to_mp3(obj, &retry, VLOOK_CREATE); - if (!mp) { - if (retry < 0) { - amd_stats.d_drops++; - return 0; - } - post_op_obj = &result.res_u.fail.obj_attributes; - post_op_obj->attributes_follow = 0; - result.status = nfs_error(retry); - } else { - am_PATHCONF3resok *ok = &result.res_u.ok; - nfsfattr *fattr; - am_fattr3 *fattr3; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "\tpathconf_3(%s)", mp->am_path); - - fattr = &mp->am_fattr; - post_op_obj = &ok->obj_attributes; - post_op_obj->attributes_follow = 1; - fattr3 = &post_op_obj->am_post_op_attr_u.attributes; - fattr_to_fattr3(fattr, fattr3); - - ok->linkmax = 0; - ok->name_max = NAME_MAX; - ok->no_trunc = 1; - ok->chown_restricted = 1; - ok->case_insensitive = 0; - ok->case_preserving = 1; - - result.status = AM_NFS3_OK; - mp->am_stats.s_pathconf++; - } - - return &result; -} - -am_COMMIT3res * -am_nfs3_commit_3_svc(am_COMMIT3args *argp, struct svc_req *rqstp) -{ - static am_COMMIT3res result; - - am_nfs_fh3 *file = (am_nfs_fh3 *) &argp->file; - am_pre_op_attr *pre_op_file = &result.res_u.fail.file_wcc.before; - am_post_op_attr *post_op_file = &result.res_u.fail.file_wcc.after; - - if (amuDebug(D_TRACE)) - plog(XLOG_DEBUG, "commit_3:"); - - result.status = return_estale_or_rofs(file, pre_op_file, post_op_file); - - return &result; -} -#endif /* HAVE_FS_NFS3 */ Index: contrib/amd/amd/ops_TEMPLATE.c =================================================================== --- contrib/amd/amd/ops_TEMPLATE.c +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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, void cookie, voidp dp, voidp 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, void cookie, voidp dp, voidp 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; -} Index: contrib/amd/amd/ops_cachefs.c =================================================================== --- contrib/amd/amd/ops_cachefs.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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) xstrdup(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 - * (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; -} Index: contrib/amd/amd/ops_cdfs.c =================================================================== --- contrib/amd/amd/ops_cdfs.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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) */ - -#if defined(MNT2_CDFS_OPT_NOCASETRANS) && defined(MNTTAB_OPT_NOCASETRANS) - if (amu_hasmntopt(&mnt, MNTTAB_OPT_NOCASETRANS)) - cdfs_flags |= MNT2_CDFS_OPT_NOCASETRANS; -#endif /* defined(MNT2_CDFS_OPT_NOCASETRANS) && defined(MNTTAB_OPT_NOCASETRANS) */ - -#if defined(MNT2_CDFS_OPT_NOJOLIET) && defined(MNTTAB_OPT_NOJOLIET) - if (amu_hasmntopt(&mnt, MNTTAB_OPT_NOJOLIET)) - cdfs_flags |= MNT2_CDFS_OPT_NOJOLIET; -#endif /* defined(MNT2_CDFS_OPT_NOJOLIET) && defined(MNTTAB_OPT_NOJOLIET) */ - -#if defined(MNT2_CDFS_OPT_RRCASEINS) && defined(MNTTAB_OPT_RRCASEINS) - if (amu_hasmntopt(&mnt, MNTTAB_OPT_RRCASEINS)) - cdfs_flags |= MNT2_CDFS_OPT_RRCASEINS; -#endif /* defined(MNT2_CDFS_OPT_RRCASEINS) && defined(MNTTAB_OPT_RRCASEINS) */ - - 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); -} Index: contrib/amd/amd/ops_efs.c =================================================================== --- contrib/amd/amd/ops_efs.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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 */ -#if defined(HAVE_EFS_ARGS_T_VERSION) && defined(EFS_MNT_VERSION) - efs_args.version = EFS_MNT_VERSION; -#endif /* HAVE_EFS_ARGS_T_VERSION && EFS_MNT_VERSION */ - - /* - * 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); -} - Index: contrib/amd/amd/ops_ext.c =================================================================== --- contrib/amd/amd/ops_ext.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_ext.c - * - */ - -/* - * Irix UN*X file system: EXT (Extended File System) - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* forward declarations */ -static char *ext_match(am_opts *fo); -static int ext2_mount(am_node *am, mntfs *mf); -static int ext3_mount(am_node *am, mntfs *mf); -static int ext4_mount(am_node *am, mntfs *mf); -static int ext_umount(am_node *am, mntfs *mf); - -/* - * Ops structure - */ -am_ops ext2_ops = -{ - "ext2", - ext_match, - 0, /* ext_init */ - ext2_mount, - ext_umount, - amfs_error_lookup_child, - amfs_error_mount_child, - amfs_error_readdir, - 0, /* ext_readlink */ - 0, /* ext_mounted */ - 0, /* ext_umounted */ - amfs_generic_find_srvr, - 0, /* ext_get_wchan */ - FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ -#ifdef HAVE_FS_AUTOFS - AUTOFS_EXT_FS_FLAGS, -#endif /* HAVE_FS_AUTOFS */ -}; - -am_ops ext3_ops = -{ - "ext3", - ext_match, - 0, /* ext_init */ - ext3_mount, - ext_umount, - amfs_error_lookup_child, - amfs_error_mount_child, - amfs_error_readdir, - 0, /* ext_readlink */ - 0, /* ext_mounted */ - 0, /* ext_umounted */ - amfs_generic_find_srvr, - 0, /* ext_get_wchan */ - FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ -#ifdef HAVE_FS_AUTOFS - AUTOFS_EXT_FS_FLAGS, -#endif /* HAVE_FS_AUTOFS */ -}; - -am_ops ext4_ops = -{ - "ext4", - ext_match, - 0, /* ext_init */ - ext4_mount, - ext_umount, - amfs_error_lookup_child, - amfs_error_mount_child, - amfs_error_readdir, - 0, /* ext_readlink */ - 0, /* ext_mounted */ - 0, /* ext_umounted */ - amfs_generic_find_srvr, - 0, /* ext_get_wchan */ - FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ -#ifdef HAVE_FS_AUTOFS - AUTOFS_EXT_FS_FLAGS, -#endif /* HAVE_FS_AUTOFS */ -}; - -/* - * EXT needs local filesystem and device. - */ -static char * -ext_match(am_opts *fo) -{ - - if (!fo->opt_dev) { - plog(XLOG_USER, "ext: no device specified"); - return 0; - } - - dlog("EXT: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs); - - /* - * Determine magic cookie to put in mtab - */ - return xstrdup(fo->opt_dev); -} - - -static int -mount_ext(char *mntdir, char *fs_name, char *opts, int on_autofs, char * - mount_type, const char *mnttab_type) -{ - ext_args_t ext_args; - mntent_t mnt; - int flags; - - /* - * Figure out the name of the file system type. - */ - MTYPE_TYPE type = mount_type; - - memset((voidp) &ext_args, 0, sizeof(ext_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; - 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, (caddr_t) &ext_args, 0, type, 0, NULL, mnttab_file_name, on_autofs); -} - - -static int -ext_mount(am_node *am, mntfs *mf, char *mount_type, - const char *mnttab_type) -{ - int on_autofs = mf->mf_flags & MFF_ON_AUTOFS; - int error; - - error = mount_ext(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs, - mount_type, mnttab_type); - if (error) { - errno = error; - plog(XLOG_ERROR, "mount_ext: %m"); - return error; - } - - return 0; -} - -static int -ext2_mount(am_node *am, mntfs *mf) -{ - return ext_mount(am, mf, MOUNT_TYPE_EXT2, MNTTAB_TYPE_EXT2); -} - -static int -ext3_mount(am_node *am, mntfs *mf) -{ - return ext_mount(am, mf, MOUNT_TYPE_EXT3, MNTTAB_TYPE_EXT3); -} - -static int -ext4_mount(am_node *am, mntfs *mf) -{ - return ext_mount(am, mf, MOUNT_TYPE_EXT4, MNTTAB_TYPE_EXT4); -} - -static int -ext_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); -} Index: contrib/amd/amd/ops_lofs.c =================================================================== --- contrib/amd/amd/ops_lofs.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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); -} Index: contrib/amd/amd/ops_lustre.c =================================================================== --- contrib/amd/amd/ops_lustre.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2011 Christos Zoulas - * 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. - * - * 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_lustre.c - * - */ - -/* - * Lustre file system - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#ifdef HAVE_FS_LUSTRE -#include -#include - -/* forward declarations */ -static char *lustre_match(am_opts *fo); -static int lustre_mount(am_node *am, mntfs *mf); -static int lustre_umount(am_node *am, mntfs *mf); - -/* - * Ops structure - */ -am_ops lustre_ops = -{ - "lustre", - lustre_match, - 0, /* lustre_init */ - lustre_mount, - lustre_umount, - amfs_error_lookup_child, - amfs_error_mount_child, - amfs_error_readdir, - 0, /* lustre_readlink */ - 0, /* lustre_mounted */ - 0, /* lustre_umounted */ - amfs_generic_find_srvr, - 0, /* lustre_get_wchan */ - FS_MKMNT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ -#ifdef HAVE_FS_AUTOFS - AUTOFS_LUSTRE_FS_FLAGS, -#endif /* HAVE_FS_AUTOFS */ -}; - - -/* - * Lustre needs remote filesystem and host. - */ -static char * -lustre_match(am_opts *fo) -{ - char *xmtab, *cp; - size_t l; - char *rhost, *ptr, *remhost; - struct in_addr addr; - - if (fo->opt_fs && !fo->opt_rfs) - fo->opt_rfs = fo->opt_fs; - if (!fo->opt_rfs) { - plog(XLOG_USER, "lustre: no remote filesystem specified"); - return NULL; - } - if (!fo->opt_rhost) { - plog(XLOG_USER, "lustre: no remote host specified"); - return NULL; - } - - /* - * Determine magic cookie to put in mtab - */ - rhost = xstrdup(fo->opt_rhost); - remhost = NULL; - for (ptr = strtok(rhost, ":"); ptr; ptr = strtok(NULL, ":")) { - char *at = strchr(ptr, '@'); - if (at == NULL) { - plog(XLOG_USER, "lustre: missing protocol in host `%s'", ptr); - XFREE(rhost); - return NULL; - } - *at = '\0'; - /* - * Convert symbolic addresses to numbers that the kernel likes - */ - if (inet_aton(ptr, &addr) == 0) { - struct hostent *hp; - if ((hp = gethostbyname(ptr)) == NULL) { - plog(XLOG_USER, "lustre: unknown host `%s'", ptr); - XFREE(rhost); - return NULL; - } - if (hp->h_length != sizeof(addr.s_addr)) { - plog(XLOG_USER, "lustre: bad address length %zu != %d for %s", - sizeof(addr), hp->h_length, ptr); - XFREE(rhost); - return NULL; - } - memcpy(&addr.s_addr, hp->h_addr, sizeof(addr)); - } - *at = '@'; - - cp = remhost; - if (remhost) - remhost = strvcat(cp, ":", inet_ntoa(addr), at, NULL); - else - remhost = strvcat(inet_ntoa(addr), at, NULL); - XFREE(cp); - } - if (remhost == NULL) { - plog(XLOG_USER, "lustre: empty host"); - XFREE(rhost); - return NULL; - } - - XFREE(rhost); - XFREE(fo->opt_rhost); - fo->opt_rhost = remhost; - - l = strlen(fo->opt_rhost) + strlen(fo->opt_rfs) + 2; - xmtab = xmalloc(l); - xsnprintf(xmtab, l, "%s:%s", fo->opt_rhost, fo->opt_rfs); - dlog("lustre: mounting remote server \"%s\", remote fs \"%s\" on \"%s\"", - fo->opt_rhost, fo->opt_rfs, fo->opt_fs); - - - return xmtab; -} - -static int -lustre_mount(am_node *am, mntfs *mf) -{ - mntent_t mnt; - int genflags, error; - int on_autofs = mf->mf_flags & MFF_ON_AUTOFS; - - /* - * Figure out the name of the file system type. - */ - MTYPE_TYPE type = MOUNT_TYPE_LUSTRE; - - /* - * Fill in the mount structure - */ - memset(&mnt, 0, sizeof(mnt)); - mnt.mnt_dir = mf->mf_mount; - mnt.mnt_fsname = mf->mf_info; - mnt.mnt_type = MNTTAB_TYPE_LUSTRE; - mnt.mnt_opts = mf->mf_mopts; - - genflags = compute_mount_flags(&mnt); -#ifdef HAVE_FS_AUTOFS - if (on_autofs) - genflags |= autofs_compute_mount_flags(&mnt); -#endif /* HAVE_FS_AUTOFS */ - - /* - * Call generic mount routine - */ - error = mount_fs(&mnt, genflags, NULL, 0, type, 0, - NULL, mnttab_file_name, on_autofs); - if (error) { - errno = error; - plog(XLOG_ERROR, "mount_lustre: %m"); - return error; - } - - return 0; -} - - -static int -lustre_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); -} -#endif Index: contrib/amd/amd/ops_mfs.c =================================================================== --- contrib/amd/amd/ops_mfs.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_nfs.c =================================================================== --- contrib/amd/amd/ops_nfs.c +++ /dev/null @@ -1,1092 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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; - -/* - * clamp the filehandle version to 3, so that we can fail back to nfsv3 - * since nfsv4 does not have file handles - */ -#define SET_FH_VERSION(fs) \ - (fs)->fs_version > NFS_VERSION3 ? NFS_VERSION3 : (fs)->fs_version; - -/* 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 = NULL; - 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); - - XFREE(res3.mountres3_u.mountinfo.fhandle.fhandle3_val); - if (res3.mountres3_u.mountinfo.auth_flavors.auth_flavors_val) - XFREE(res3.mountres3_u.mountinfo.auth_flavors.auth_flavors_val); - } 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); - } - 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 = NULL; - 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 = SET_FH_VERSION(fs); - } - - fp->fh_fs = dup_srvr(fs); - fp->fh_path = xstrdup(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; - dlog("%s: New %d mountd port", __func__, fp->fh_sin.sin_port); - } else - dlog("%s: Already had %d mountd port", __func__, fp->fh_sin.sin_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 /* HAVE_FS_NFS3 */ - 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; - -#ifdef NO_FALLBACK - /* - * We don't need file handles for NFS version 4, but we can fall back to - * version 3, so we allocate anyway - */ -#ifdef HAVE_FS_NFS4 - if (mf->mf_server->fs_version == NFS_VERSION4) - return 0; -#endif /* HAVE_FS_NFS4 */ -#endif /* NO_FALLBACK */ - - 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); - mf->mf_private = NULL; - mf->mf_prfree = NULL; - - 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; - void *argsp; - nfs_args_t nfs_args; -#ifdef HAVE_FS_NFS4 - nfs4_args_t nfs4_args; -#endif /* HAVE_FS_NFS4 */ - - /* - * 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 - */ -#ifdef 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). - */ - argsp = &nfs_args; -# 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) */ -# ifdef HAVE_FS_NFS4 - } else if (nfs_version == NFS_VERSION4) { - argsp = &nfs4_args; - type = MOUNT_TYPE_NFS4; - mnt.mnt_type = MNTTAB_TYPE_NFS4; -# endif /* HAVE_FS_NFS4 */ - } else -#endif /* HAVE_FS_NFS3 */ - { - argsp = &nfs_args; - type = MOUNT_TYPE_NFS; - mnt.mnt_type = MNTTAB_TYPE_NFS; - } - 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(argsp, - &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(argsp, nfs_version); - plog(XLOG_DEBUG, "Generic mount flags 0x%x used for NFS mount", genflags); - } - error = mount_fs(&mnt, genflags, argsp, retry, type, - nfs_version, nfs_proto, mnttab_file_name, on_autofs); - XFREE(mnt.mnt_opts); - discard_nfs_args(argsp, nfs_version); - -#ifdef HAVE_FS_NFS4 -# ifndef NO_FALLBACK - /* - * If we are using a v4 file handle, we try a v3 if we get back: - * ENOENT: NFS v4 has a different export list than v3 - * EPERM: Kernels <= 2.6.18 return that, instead of ENOENT - */ - if ((error == ENOENT || error == EPERM) && nfs_version == NFS_VERSION4) { - plog(XLOG_DEBUG, "Could not find NFS 4 mount, trying again with NFS 3"); - fs->fs_version = NFS_VERSION3; - error = mount_nfs_fh(fhp, mntdir, fs_name, mf); - if (error) - fs->fs_version = NFS_VERSION4; - } -# endif /* NO_FALLBACK */ -#endif /* HAVE_FS_NFS4 */ - - return error; -} - - -static int -nfs_mount(am_node *am, mntfs *mf) -{ - int error = 0; - mntent_t mnt; - - if (!mf->mf_private && mf->mf_server->fs_version != 4) { - plog(XLOG_ERROR, "Missing filehandle for %s", mf->mf_info); - return EINVAL; - } - - if (mf->mf_mopts == NULL) { - plog(XLOG_ERROR, "Missing mount options 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; - - dlog("attempting nfs umount"); - 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 = SET_FH_VERSION(fs); - 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 *) NULL, mf); - call_mountd(&f, MOUNTPROC_UMNT, (fwd_fun *) NULL, (wchan_t) NULL); - *colon = ':'; - } -} Index: contrib/amd/amd/ops_nfs3.c =================================================================== --- contrib/amd/amd/ops_nfs3.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_nfs4.c =================================================================== --- contrib/amd/amd/ops_nfs4.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_nfs4.c - * - */ - -/* - * Network file system version 4.0 - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_nullfs.c =================================================================== --- contrib/amd/amd/ops_nullfs.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_pcfs.c =================================================================== --- contrib/amd/amd/ops_pcfs.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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); -} Index: contrib/amd/amd/ops_tfs.c =================================================================== --- contrib/amd/amd/ops_tfs.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_tmpfs.c =================================================================== --- contrib/amd/amd/ops_tmpfs.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* forward declarations */ -static char *tmpfs_match(am_opts *fo); -static int tmpfs_mount(am_node *am, mntfs *mf); -static int tmpfs_umount(am_node *am, mntfs *mf); - -/* - * Ops structure - */ -am_ops tmpfs_ops = -{ - "tmpfs", - tmpfs_match, - 0, /* tmpfs_init */ - tmpfs_mount, - tmpfs_umount, - amfs_error_lookup_child, - amfs_error_mount_child, - amfs_error_readdir, - 0, /* tmpfs_readlink */ - 0, /* tmpfs_mounted */ - 0, /* tmpfs_umounted */ - amfs_generic_find_srvr, - 0, /* tmpfs_get_wchan */ - FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ -#if defined(HAVE_FS_AUTOFS) && defined(AUTOFS_TMPFS_FS_FLAGS) - AUTOFS_TMPFS_FS_FLAGS, -#endif /* HAVE_FS_AUTOFS */ -}; - - -/* - * EFS needs local filesystem and device. - */ -static char * -tmpfs_match(am_opts *fo) -{ - - if (!fo->opt_dev) { - plog(XLOG_USER, "tmpfs: 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 xstrdup(fo->opt_dev); -} - - -static int -mount_tmpfs(char *mntdir, char *fs_name, char *opts, int on_autofs) -{ - tmpfs_args_t tmpfs_args; - mntent_t mnt; - int flags; - const char *p; - - /* - * Figure out the name of the file system type. - */ - MTYPE_TYPE type = MOUNT_TYPE_TMPFS; - - p = NULL; - memset((voidp) &tmpfs_args, 0, sizeof(tmpfs_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_TMPFS; - 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 defined(HAVE_TMPFS_ARGS_T_TA_VERSION) && defined(TMPFS_ARGS_VERSION) - tmpfs_args.ta_version = TMPFS_ARGS_VERSION; -#endif /* HAVE_TMPFS_ARGS_T_TA_VERSION && TMPFS_ARGS_VERSION */ -#ifdef HAVE_TMPFS_ARGS_T_TA_NODES_MAX - if ((p = amu_hasmntopt(&mnt, "nodes")) == NULL) - p = "1000000"; - tmpfs_args.ta_nodes_max = atoi(p); -#endif /* HAVE_TMPFS_ARGS_T_TA_SIZE_MAX */ -#ifdef HAVE_TMPFS_ARGS_T_TA_SIZE_MAX - if ((p = amu_hasmntopt(&mnt, "size")) == NULL) - p = "10000000"; - tmpfs_args.ta_size_max = atoi(p); -#endif /* HAVE_TMPFS_ARGS_T_TA_SIZE_MAX */ -#ifdef HAVE_TMPFS_ARGS_T_TA_ROOT_UID - if ((p = amu_hasmntopt(&mnt, "uid")) == NULL) - p = "0"; - tmpfs_args.ta_root_uid = atoi(p); -#endif /* HAVE_TMPFS_ARGS_T_TA_ROOT_UID */ -#ifdef HAVE_TMPFS_ARGS_T_TA_ROOT_GID - if ((p = amu_hasmntopt(&mnt, "gid")) == NULL) - p = "0"; - tmpfs_args.ta_root_gid = atoi(p); -#endif /* HAVE_TMPFS_ARGS_T_TA_ROOT_GID */ -#ifdef HAVE_TMPFS_ARGS_T_TA_ROOT_MODE - if ((p = amu_hasmntopt(&mnt, "mode")) == NULL) - p = "01777"; - tmpfs_args.ta_root_mode = strtol(p, NULL, 8); -#endif /* HAVE_TMPFS_ARGS_T_TA_ROOT_MODE */ - - /* - * Call generic mount routine - */ - return mount_fs(&mnt, flags, (caddr_t) &tmpfs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs); -} - - -static int -tmpfs_mount(am_node *am, mntfs *mf) -{ - int on_autofs = mf->mf_flags & MFF_ON_AUTOFS; - int error; - - error = mount_tmpfs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs); - if (error) { - errno = error; - plog(XLOG_ERROR, "mount_tmpfs: %m"); - return error; - } - - return 0; -} - - -static int -tmpfs_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); -} - Index: contrib/amd/amd/ops_udf.c =================================================================== --- contrib/amd/amd/ops_udf.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_udf.c - * - */ - -/* - * UDF file system - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* forward definitions */ -static char *udf_match(am_opts *fo); -static int udf_mount(am_node *am, mntfs *mf); -static int udf_umount(am_node *am, mntfs *mf); - -/* - * Ops structure - */ -am_ops udf_ops = -{ - "udf", - udf_match, - 0, /* udf_init */ - udf_mount, - udf_umount, - amfs_error_lookup_child, - amfs_error_mount_child, - amfs_error_readdir, - 0, /* udf_readlink */ - 0, /* udf_mounted */ - 0, /* udf_umounted */ - amfs_generic_find_srvr, - 0, /* udf_get_wchan */ - FS_MKMNT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ -#ifdef HAVE_FS_AUTOFS - AUTOFS_UDF_FS_FLAGS, -#endif /* HAVE_FS_AUTOFS */ -}; - -#if defined(HAVE_UDF_ARGS_T_NOBODY_GID) || defined(HAVE_UDF_ARGS_T_NOBODY_UID) -static int -a_num(const char *s, const char *id_type) -{ - int id; - char *ep; - - id = strtol(s, &ep, 0); - if (*ep || s == ep || id < 0) { - plog(XLOG_ERROR, "mount_udf: unknown %s: %s", id_type, s); - return 0; - } - return id; -} -#endif /* defined(HAVE_UDF_ARGS_T_NOBODY_GID) || defined(HAVE_UDF_ARGS_T_NOBODY_UID) */ - -#if defined(HAVE_UDF_ARGS_T_NOBODY_GID) -static gid_t -a_gid(const char *s, const char *id_type) -{ - struct group *gr; - - if ((gr = getgrnam(s)) != NULL) - return gr->gr_gid; - return a_num(s, id_type); -} -#endif /* defined(HAVE_UDF_ARGS_T_NOBODY_GID) */ - -#if defined(HAVE_UDF_ARGS_T_NOBODY_UID) -static uid_t -a_uid(const char *s, const char *id_type) -{ - struct passwd *pw; - - if ((pw = getpwnam(s)) != NULL) - return pw->pw_uid; - return a_num(s, id_type); -} -#endif /* defined(HAVE_UDF_ARGS_T_NOBODY_UID) */ - -/* - * UDF needs remote filesystem. - */ -static char * -udf_match(am_opts *fo) -{ - - if (!fo->opt_dev) { - plog(XLOG_USER, "udf: no source device specified"); - return 0; - } - dlog("UDF: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs); - - /* - * Determine magic cookie to put in mtab - */ - return xstrdup(fo->opt_dev); -} - -static int -mount_udf(char *mntdir, char *fs_name, char *opts, int on_autofs) -{ - udf_args_t udf_args; - mntent_t mnt; - int flags; - char *str; -#if defined(HAVE_UDF_ARGS_T_NOBODY_UID) || defined(HAVE_UDF_ARGS_T_ANON_UID) - uid_t uid_nobody; - gid_t gid_nobody; -#endif /* defined(HAVE_UDF_ARGS_T_NOBODY_UID) || defined(HAVE_UDF_ARGS_T_ANON_UID) */ - /* - * Figure out the name of the file system type. - */ - MTYPE_TYPE type = MOUNT_TYPE_UDF; - -#if defined(HAVE_UDF_ARGS_T_NOBODY_UID) || defined(HAVE_UDF_ARGS_T_ANON_UID) - uid_nobody = a_uid("nobody", "user"); - if (uid_nobody == 0) { - plog(XLOG_ERROR, "mount_udf: invalid uid for nobody"); - return EPERM; - } -#endif /* defined(HAVE_UDF_ARGS_T_NOBODY_UID) || defined(HAVE_UDF_ARGS_T_ANON_UID) */ - -#if defined(HAVE_UDF_ARGS_T_NOBODY_GID) || defined(HAVE_UDF_ARGS_T_ANON_GID) - gid_nobody = a_gid("nobody", "group"); - if (gid_nobody == 0) { - plog(XLOG_ERROR, "mount_udf: invalid gid for nobody"); - return EPERM; - } -#endif /* defined(HAVE_UDF_ARGS_T_NOBODY_GID) || defined(HAVE_UDF_ARGS_T_ANON_GID) */ - - str = NULL; - memset((voidp) &udf_args, 0, sizeof(udf_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_UDF; - mnt.mnt_opts = opts; - - flags = compute_mount_flags(&mnt); - -#ifdef HAVE_UDF_ARGS_T_UDFMFLAGS -# if defined(MNT2_UDF_OPT_CLOSESESSION) && defined(MNTTAB_OPT_CLOSESESSION) - if (amu_hasmntopt(&mnt, MNTTAB_OPT_CLOSESESSION)) - udf_args.udfmflags |= MNT2_UDF_OPT_CLOSESESSION; -# endif /* defined(MNT2_UDF_OPT_CLOSESESSION) && defined(MNTTAB_OPT_CLOSESESSION) */ -#endif /* HAVE_UDF_ARGS_T_UDFMFLAGS */ - -#ifdef HAVE_UDF_ARGS_T_NOBODY_UID - udf_args.nobody_uid = uid_nobody; -#endif /* HAVE_UDF_ARGS_T_NOBODY_UID */ - -#ifdef HAVE_UDF_ARGS_T_NOBODY_GID - udf_args.nobody_gid = gid_nobody; -#endif /* HAVE_UDF_ARGS_T_NOBODY_GID */ - -#ifdef HAVE_UDF_ARGS_T_ANON_UID - udf_args.anon_uid = uid_nobody; /* default to nobody */ - if ((str = hasmntstr(&mnt, MNTTAB_OPT_USER)) != NULL) { - udf_args.anon_uid = a_uid(str, MNTTAB_OPT_USER); - XFREE(str); - } -#endif /* HAVE_UDF_ARGS_T_ANON_UID */ - -#ifdef HAVE_UDF_ARGS_T_ANON_GID - udf_args.anon_gid = gid_nobody; /* default to nobody */ - if ((str = hasmntstr(&mnt, MNTTAB_OPT_GROUP)) != NULL) { - udf_args.anon_gid = a_gid(str, MNTTAB_OPT_GROUP); - XFREE(str); - } -#endif /* HAVE_UDF_ARGS_T_ANON_GID */ - -#ifdef HAVE_UDF_ARGS_T_GMTOFF - udf_args.gmtoff = 0; - if ((str = hasmntstr(&mnt, MNTTAB_OPT_GMTOFF)) != NULL) { - udf_args.gmtoff = a_num(str, MNTTAB_OPT_GMTOFF); - XFREE(str); - } -#endif /* HAVE_UDF_ARGS_T_GMTOFF */ - -#ifdef HAVE_UDF_ARGS_T_SESSIONNR - udf_args.sessionnr = 0; - if ((str = hasmntstr(&mnt, MNTTAB_OPT_SESSIONNR)) != NULL) { - udf_args.sessionnr = a_num(str, MNTTAB_OPT_SESSIONNR); - XFREE(str); - } -#endif /* HAVE_UDF_ARGS_T_SESSIONNR */ - -#ifdef HAVE_UDF_ARGS_T_VERSION -# ifdef UDFMNT_VERSION - udf_args.version = UDFMNT_VERSION; -# endif /* UDFMNT_VERSION */ -#endif /* HAVE_UDF_ARGS_T_VERSION */ - -#ifdef HAVE_UDF_ARGS_T_FSPEC - udf_args.fspec = fs_name; -#endif /* HAVE_UFS_ARGS_T_FSPEC */ - - /* - * Call generic mount routine - */ - return mount_fs(&mnt, flags, (caddr_t)&udf_args, 0, type, 0, NULL, - mnttab_file_name, on_autofs); -} - -static int -udf_mount(am_node *am, mntfs *mf) -{ - int on_autofs; - int error; - - on_autofs = mf->mf_flags & MFF_ON_AUTOFS; - error = mount_udf(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs); - if (error) { - errno = error; - plog(XLOG_ERROR, "mount_udf: %m"); - return error; - } - return 0; -} - - -static int -udf_umount(am_node *am, mntfs *mf) -{ - int unmount_flags; - - unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0; - return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags); -} Index: contrib/amd/amd/ops_ufs.c =================================================================== --- contrib/amd/amd/ops_ufs.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 = -{ -#ifndef __NetBSD__ - "ufs", -#else - "ffs", -#endif - 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 xstrdup(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); -} Index: contrib/amd/amd/ops_umapfs.c =================================================================== --- contrib/amd/amd/ops_umapfs.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_unionfs.c =================================================================== --- contrib/amd/amd/ops_unionfs.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* FEEL FREE TO IMPLEMENT THIS... :-) */ Index: contrib/amd/amd/ops_xfs.c =================================================================== --- contrib/amd/amd/ops_xfs.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 xstrdup(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); -} Index: contrib/amd/amd/opts.c =================================================================== --- contrib/amd/amd/opts.c +++ /dev/null @@ -1,1560 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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[] = ""; -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 - */ -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 = xstrdup(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 (fx == NULL || 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) { -#ifdef notdef - /* We allow empty assignments */ - plog(XLOG_USER, "key %s: Bad selector \"%s\"", mapkey, f); -#endif - 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) -{ - 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)) { - /* - * Don't call xstrlcpy() to truncate a string here. It causes - * spurious xstrlcpy() syslog() errors. Use memcpy() and - * explicitly terminate the string. - */ - memcpy(ep, vptr, vlen+1); - ep += vlen; - *ep = '\0'; - } 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 = xstrdup(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 = xstrdup(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); -} - -am_opts * -copy_opts(am_opts *old) -{ - am_opts *newopts; - newopts = CALLOC(struct am_opts); - -#define _AM_OPT_COPY(field) do { \ - if (old->field) \ - newopts->field = xstrdup(old->field); \ - } while (0) - - _AM_OPT_COPY(fs_glob); - _AM_OPT_COPY(fs_local); - _AM_OPT_COPY(fs_mtab); - _AM_OPT_COPY(opt_dev); - _AM_OPT_COPY(opt_delay); - _AM_OPT_COPY(opt_dir); - _AM_OPT_COPY(opt_fs); - _AM_OPT_COPY(opt_group); - _AM_OPT_COPY(opt_mount); - _AM_OPT_COPY(opt_opts); - _AM_OPT_COPY(opt_remopts); - _AM_OPT_COPY(opt_pref); - _AM_OPT_COPY(opt_cache); - _AM_OPT_COPY(opt_rfs); - _AM_OPT_COPY(opt_rhost); - _AM_OPT_COPY(opt_sublink); - _AM_OPT_COPY(opt_type); - _AM_OPT_COPY(opt_mount_type); - _AM_OPT_COPY(opt_unmount); - _AM_OPT_COPY(opt_umount); - _AM_OPT_COPY(opt_user); - _AM_OPT_COPY(opt_maptype); - _AM_OPT_COPY(opt_cachedir); - _AM_OPT_COPY(opt_addopts); - - return newopts; -} - - -/* - * 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; -} Index: contrib/amd/amd/readdir.c =================================================================== --- contrib/amd/amd/readdir.c +++ /dev/null @@ -1,952 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 - * - */ - - -#include -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/**************************************************************************** - *** 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); - -static const u_int dotdotcookie = DOT_DOT_COOKIE; - -/**************************************************************************** - *** FUNCTIONS *** - ****************************************************************************/ -/* - * Was: NEW_TOPLVL_READDIR - * Search a chain for an entry with some name. - * -Erez Zadok - */ -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 - */ -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_al->al_mnt; - if (!mf) { - plog(XLOG_DEBUG, "make_entry_chain: mp->am_al->al_mnt is (NULL)"); - return retval; - } - mmp = (mnt_map *) mf->mf_private; - if (!mmp) { - plog(XLOG_DEBUG, "make_entry_chain: mp->am_al->al_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 = NULL; - retval = &chain[0]; - } - return retval; - } - - /* we have space. put entry in next cell */ - ++last_cookie; - chain[num_entries].ne_fileid = last_cookie; - (void)memcpy(chain[num_entries].ne_cookie, &last_cookie, - sizeof(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 = NULL; - 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 *) (uintptr_t) 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("%s: default search", __func__); - /* - * 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]; - (void)memset(ep[0].ne_cookie, 0, sizeof(u_int)); - - /* 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 = NULL; - (void)memcpy(ep[1].ne_cookie, &dotdotcookie, sizeof(dotdotcookie)); - - /* - * 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; ine_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) { - u_int cookie; - (void)memcpy(&cookie, ne->ne_cookie, sizeof(cookie)); - plog(XLOG_DEBUG, "gen2+ key %4d \"%s\" fi=%d ck=%d", - j++, ne->ne_name, ne->ne_fileid, cookie); - } - plog(XLOG_DEBUG, "EOF is %d", dp->dl_eof); - } - return 0; - } /* end of "if (gen == 0)" statement */ - - dlog("%s: real child", __func__); - - if (gen == DOT_DOT_COOKIE) { - dlog("%s: End of readdir in %s", __func__, mp->am_path); - dp->dl_eof = TRUE; - dp->dl_entries = NULL; - 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 = NULL; - 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; -} - -static int -amfs_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, u_int count) -{ - u_int gen = *(u_int *) (uintptr_t) cookie; - am_node *xp; - - dp->dl_eof = FALSE; /* assume readdir not done */ - - /* 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("%s: default search", __func__); - /* - * 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 */ -#define NEEDROOM (2 * (2 * (sizeof(*ep) + sizeof("..") + 4) + sizeof(*dp))) - if (count < NEEDROOM) { - dlog("%s: not enough room %u < %zu", __func__, count, NEEDROOM); - 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]; - (void)memset(ep[0].ne_cookie, 0, sizeof(u_int)); - - /* 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 = NULL; - (void)memcpy(ep[1].ne_cookie, (xp ? &xp->am_gen : &dotdotcookie), - sizeof(dotdotcookie)); - - 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) { - u_int cookie; - (void)memcpy(&cookie, ne->ne_cookie, sizeof(cookie)); - plog(XLOG_DEBUG, "gen1 key %4d \"%s\" fi=%d ck=%d", - j++, ne->ne_name, ne->ne_fileid, cookie); - } - } - return 0; - } - dlog("%s: real child", __func__); - - if (gen == DOT_DOT_COOKIE) { - dlog("%s: End of readdir in %s", __func__, mp->am_path); - dp->dl_eof = TRUE; - dp->dl_entries = NULL; - 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) { - (void)memcpy(ep->ne_cookie, &xp_next->am_gen, sizeof(xp_next->am_gen)); - } else { - (void)memcpy(ep->ne_cookie, &dotdotcookie, sizeof(dotdotcookie)); - 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 = NULL; - - if (amuDebug(D_READDIR)) { - nfsentry *ne; - int j; - for (j=0,ne=ep; ne; ne=ne->ne_nextentry) { - u_int cookie; - (void)memcpy(&cookie, ne->ne_cookie, sizeof(cookie)); - plog(XLOG_DEBUG, "gen2 key %4d \"%s\" fi=%d ck=%d", - j++, ne->ne_name, ne->ne_fileid, cookie); - } - } - return 0; - } - return ESTALE; -} - -/* - * Search a chain for an entry with some name. - */ -static int -key_already_in_chain3(char *keyname, const am_entry3 *chain) -{ - const am_entry3 *tmpchain = chain; - - while (tmpchain) { - if (keyname && tmpchain->name && STREQ(keyname, tmpchain->name)) - return 1; - tmpchain = tmpchain->nextentry; - } - - return 0; -} - -/* - * Create a chain of entries which are not linked. - */ -static am_entry3 * -make_entry_chain3(am_node *mp, const am_entry3 *current_chain, int fully_browsable) -{ - static uint64 last_cookie = (uint64) 2; /* monotonically increasing */ - static am_entry3 chain[MAX_CHAIN]; - static int max_entries = MAX_CHAIN; - char *key; - int num_entries = 0, i; - u_int preflen = 0; - am_entry3 *retval = (am_entry3 *) NULL; - mntfs *mf; - mnt_map *mmp; - - if (!mp) { - plog(XLOG_DEBUG, "make_entry_chain3: mp is (NULL)"); - return retval; - } - mf = mp->am_al->al_mnt; - if (!mf) { - plog(XLOG_DEBUG, "make_entry_chain3: mp->am_al->al_mnt is (NULL)"); - return retval; - } - mmp = (mnt_map *) mf->mf_private; - if (!mmp) { - plog(XLOG_DEBUG, "make_entry_chain3: mp->am_al->al_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_chain3(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_chain3: no more space in chain"); - if (num_entries > 0) { - chain[num_entries - 1].nextentry = NULL; - retval = &chain[0]; - } - return retval; - } - - /* we have space. put entry in next cell */ - ++last_cookie; - chain[num_entries].fileid = last_cookie; - chain[num_entries].cookie = last_cookie; - chain[num_entries].name = key; - if (num_entries < max_entries - 1) { /* link to next one */ - chain[num_entries].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].nextentry = NULL; - retval = &chain[0]; - } - - return retval; -} - -static size_t needroom3(void) -{ - /* - * Check for enough room. This is extremely approximate but should - * be enough space. Really need 2 times: - * (8byte fileid - * 8byte cookie - * 8byte name pointer - * 8byte next entry addres) = sizeof(am_entry3) - * 2byte name + 1byte terminator - * plus the size of the am_dirlist3 structure */ - return ((2 * ((sizeof(am_entry3) + sizeof("..") + 1))) + sizeof(am_dirlist3)); -} - -/* This one is called only if map is browsable */ -static int -amfs_readdir3_browsable(am_node *mp, am_cookie3 cookie, - am_dirlist3 *dp, am_entry3 *ep, u_int count, - int fully_browsable) -{ - uint64 gen = *(uint64 *) (uintptr_t) cookie; - int chain_length, i; - static am_entry3 *te, *te_next; - static int j; - - dp->eof = FALSE; /* assume readdir not done */ - - if (amuDebug(D_READDIR)) - plog(XLOG_DEBUG, "amfs_readdir3_browsable gen=%lu, count=%d", (long unsigned) gen, count); - - if (gen == 0) { - size_t needed = needroom3(); - /* - * 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("%s: default search", __func__); - - if (count < needed) { - dlog("%s: not enough room %u < %zu", __func__, count, needed); - 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->entries = ep; - - /* construct "." */ - ep[0].fileid = mp->am_gen; - ep[0].name = "."; - ep[0].nextentry = &ep[1]; - ep[0].cookie = 0; - - /* construct ".." */ - if (mp->am_parent) - ep[1].fileid = mp->am_parent->am_gen; - else - ep[1].fileid = mp->am_gen; - - ep[1].name = ".."; - ep[1].nextentry = NULL; - ep[1].cookie = dotdotcookie; - - /* - * 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_chain3(mp, dp->entries, fully_browsable); - if (!te) - return 0; - if (amuDebug(D_READDIR)) { - am_entry3 *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; inextentry; - if (!te_next) - break; - } - if (te_next) { - am_entry3 *te_saved = te_next->nextentry; - te_next->nextentry = NULL; /* terminate "te" chain */ - te_next = te_saved; /* save rest of "te" for next iteration */ - dp->eof = FALSE; /* tell readdir there's more */ - } else { - dp->eof = TRUE; /* tell readdir that's it */ - } - ep[1].nextentry = te; /* append this chunk of "te" chain */ - if (amuDebug(D_READDIR)) { - am_entry3 *ne; - for (j = 0, ne = te; ne; ne = ne->ne_nextentry) - plog(XLOG_DEBUG, "gen2 key %4d \"%s\"", j++, ne->name); - for (j = 0, ne = ep; ne; ne = ne->ne_nextentry) { - plog(XLOG_DEBUG, "gen2+ key %4d \"%s\" fi=%lu ck=%lu", - j++, ne->name, (long unsigned) ne->fileid, (long unsigned) ne->cookie); - } - plog(XLOG_DEBUG, "EOF is %d", dp->eof); - } - return 0; - } /* end of "if (gen == 0)" statement */ - - dlog("%s: real child", __func__); - - if (gen == DOT_DOT_COOKIE) { - dlog("%s: End of readdir in %s", __func__, mp->am_path); - dp->eof = TRUE; - dp->entries = NULL; - 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->eof = TRUE; - dp->entries = ep; - - te = te_next; /* reset 'te' from last saved te_next */ - if (!te) { /* another indicator of end of readdir */ - dp->entries = NULL; - 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->nextentry; - if (!te_next) - break; - } - if (te_next) { - am_entry3 *te_saved = te_next->nextentry; - te_next->nextentry = NULL; /* terminate "te" chain */ - te_next = te_saved; /* save rest of "te" for next iteration */ - dp->eof = FALSE; /* tell readdir there's more */ - } - ep = te; /* send next chunk of "te" chain */ - dp->entries = ep; - if (amuDebug(D_READDIR)) { - am_entry3 *ne; - plog(XLOG_DEBUG, - "entries=%p, te_next=%p, eof=%d", dp->entries, te_next, dp->eof); - for (ne = te; ne; ne = ne->nextentry) - plog(XLOG_DEBUG, "gen3 key %4d \"%s\"", j++, ne->name); - } - return 0; -} - -static int -amfs_readdir3(am_node *mp, am_cookie3 cookie, - am_dirlist3 *dp, am_entry3 *ep, u_int count) -{ - uint64 gen = *(uint64 *) (uintptr_t) cookie; - am_node *xp; - - if (amuDebug(D_READDIR)) - plog(XLOG_DEBUG, "amfs_readdir3 gen=%lu, count=%d", (long unsigned) gen, count); - - dp->eof = FALSE; /* assume readdir not done */ - - /* when gen is 0, we start reading from the beginning of the directory */ - if (gen == 0) { - size_t needed = needroom3(); - /* - * 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("%s: default search", __func__); - - if (count < needed) { - dlog("%s: not enough room %u < %zu", __func__, count, needed); - return EINVAL; - } - - xp = next_nonerror_node(mp->am_child); - dp->entries = ep; - - /* construct "." */ - ep[0].fileid = mp->am_gen; - ep[0].name = "."; - ep[0].cookie = 0; - ep[0].nextentry = &ep[1]; - - /* construct ".." */ - if (mp->am_parent) - ep[1].fileid = mp->am_parent->am_gen; - else - ep[1].fileid = mp->am_gen; - ep[1].name = ".."; - ep[1].nextentry = NULL; - ep[1].cookie = (xp ? xp->am_gen : dotdotcookie); - - if (!xp) - dp->eof = TRUE; /* by default assume readdir done */ - - if (amuDebug(D_READDIR)) { - am_entry3 *ne; - int j; - for (j = 0, ne = ep; ne; ne = ne->nextentry) { - plog(XLOG_DEBUG, "gen1 key %4d \"%s\" fi=%lu ck=%lu", - j++, ne->name, (long unsigned) ne->fileid, (long unsigned) ne->cookie); - } - } - return 0; - } - dlog("%s: real child", __func__); - - if (gen == (uint64) DOT_DOT_COOKIE) { - dlog("%s: End of readdir in %s", __func__, mp->am_path); - dp->eof = TRUE; - dp->entries = NULL; - 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->entries = ep; - do { - am_node *xp_next = next_nonerror_node(xp->am_osib); - - if (xp_next) { - ep->cookie = xp_next->am_gen; - } else { - ep->cookie = (uint64) dotdotcookie; - dp->eof = TRUE; - } - - ep->fileid = xp->am_gen; - ep->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->nextentry = ep + 1; - ep++; - --todo; - } else { - todo = 0; - } - } while (todo > 0); - - ep->nextentry = NULL; - - if (amuDebug(D_READDIR)) { - am_entry3 *ne; - int j; - for (j = 0, ne = ep; ne; ne = ne->nextentry) { - plog(XLOG_DEBUG, "gen2 key %4d \"%s\" fi=%lu ck=%lu", - j++, ne->name, (long unsigned) ne->fileid, (long unsigned) ne->cookie); - } - } - return 0; - } - return ESTALE; -} - -/* - * 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, voidp cookie, voidp dp, voidp ep, u_int count) -{ - int browsable, full; - - /* check if map is browsable */ - browsable = 0; - if (mp->am_al->al_mnt && mp->am_al->al_mnt->mf_mopts) { - mntent_t mnt; - mnt.mnt_opts = mp->am_al->al_mnt->mf_mopts; - if (amu_hasmntopt(&mnt, "fullybrowsable")) - browsable = 2; - else if (amu_hasmntopt(&mnt, "browsable")) - browsable = 1; - } - full = (browsable == 2); - - if (nfs_dispatcher == nfs_program_2) { - if (browsable) - return amfs_readdir_browsable(mp, cookie, dp, ep, count, full); - else - return amfs_readdir(mp, cookie, dp, ep, count); - } else { - if (browsable) - return amfs_readdir3_browsable(mp, (am_cookie3) (uintptr_t) cookie, dp, ep, count, full); - else - return amfs_readdir3(mp, (am_cookie3) (uintptr_t) cookie, dp, ep, count); - } -} Index: contrib/amd/amd/restart.c =================================================================== --- contrib/amd/amd/restart.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -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 = NULL; - mo.opt_rfs = NULL; - cp = strchr(me->mnt_fsname, ':'); - if (cp) { - *cp = '\0'; - mo.opt_rhost = xstrdup(me->mnt_fsname); - mo.opt_rfs = xstrdup(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 = xstrdup(me->mnt_fsname); - mo.opt_rfs = xstrdup("/"); - 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 */ - /* - * 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 - */ - XFREE(mo.opt_rhost); - 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 = NULL; - - 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 = NULL; - 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_dispatcher, - get_nfs_dispatcher_version(nfs_dispatcher)) != 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); -} Index: contrib/amd/amd/rpc_fwd.c =================================================================== --- contrib/amd/amd/rpc_fwd.c +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 = NULL, *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 *) NULL) < 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:; -} Index: contrib/amd/amd/sched.c =================================================================== --- contrib/amd/amd/sched.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -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 *) NULL)) > 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); -} Index: contrib/amd/amd/srvr_amfs_auto.c =================================================================== --- contrib/amd/amd/srvr_amfs_auto.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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 = xstrdup("localhost"); - fs->fs_ip = NULL; - fs->fs_cid = 0; - fs->fs_pinger = AM_PINGER; - fs->fs_flags = FSF_VALID | FSF_PING_UNINIT; - fs->fs_type = "local"; - fs->fs_private = NULL; - fs->fs_prfree = NULL; - - 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 - */ - 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); -} Index: contrib/amd/amd/srvr_nfs.c =================================================================== --- contrib/amd/amd/srvr_nfs.c +++ /dev/null @@ -1,1075 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 */ - /* 'Y' invalid, 'N' valid, 'P' permanent */ - 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) - -#if defined(HAVE_FS_NFS4) -# define NUM_NFS_VERS 3 -#elif defined(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 != 'P') { - np->np_mountd_inval = 'Y'; - 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, "%s: nfs_version = 0, changed to 2", __func__); - } else - plog(XLOG_INFO, "%s: nfs_version: %d", __func__, (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); - return; - } - /* - * 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 = NULL; - - /* - * 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 = 'N'; - 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, "%s: nfs_version = 0 fixed", __func__); - - plog(XLOG_INFO, "%s: NFS version %d on %s", __func__, - (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. - */ - switch (np->np_mountd_inval) { - case 'Y': - recompute_portmap(fs); - break; - case 'N': - np->np_mountd_inval = 'Y'; - break; - case 'P': - break; - default: - abort(); - } - } - 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 == 'Y') - 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 = xstrdup(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 /* 0 */ -} - - -/* - * 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; - int fs_version = nfs_valid_version(gopt.nfs_vers_ping) && - gopt.nfs_vers_ping < fs->fs_version ? gopt.nfs_vers_ping : fs->fs_version; - - /* - * Send an NFS ping to this node - */ - - if (ping_len[fs_version - NFS_VERSION] == 0) - create_ping_payload(fs_version); - - /* - * Queue the packet... - */ - error = fwd_packet(MK_RPC_XID(RPC_XID_NFSPING, np->np_xid), - ping_buf[fs_version - NFS_VERSION], - ping_len[fs_version - NFS_VERSION], - fs->fs_ip, - (struct sockaddr_in *) NULL, - (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; - 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; - - if (mf->mf_fo == NULL) { - plog(XLOG_ERROR, "%s: NULL mf_fo", __func__); - return NULL; - } - host = mf->mf_fo->opt_rhost; - /* - * 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, "%s: NFS mount failed, trying again with NFSv2/UDP", - __func__); - 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, "%s: force NFS version to %d", __func__, - (int) nfs_version); - } - if (gopt.nfs_proto) { - nfs_proto = gopt.nfs_proto; - plog(XLOG_INFO, "%s: force NFS protocol transport to %s", __func__, - nfs_proto); - } - } - - /* - * lookup host address and canonical name - */ - hp = gethostbyname(host); - - /* - * New code from Bob Harris - * 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 = CALLOC(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++; - 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 NFSv4/tcp if the client supports it (cf. RFC 2054, 7). - */ - if (!nfs_version) { -#if defined(HAVE_FS_NFS4) - nfs_version = NFS_VERSION4; -#elif defined(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) || defined(HAVE_FS_NFS4) - nfs_proto = "tcp"; -#else /* not defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3) || defined(HAVE_FS_NFS4) */ - nfs_proto = "udp"; -#endif /* not defined(MNTTAB_OPT_PROTO) || defined(HAVE_FS_NFS3) || defined(HAVE_FS_NFS4) */ - 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, - gopt.nfs_vers); - 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, - gopt.nfs_vers); - 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("%s: using port %d for nfs on %s", __func__, - (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 = xstrdup(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 - * 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; - if (np->np_mountd_inval != 'P') { - 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; - } else { - fs->fs_flags = FSF_VALID; - } - - } - - fs->fs_refc++; - 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 = xstrdup(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 = htons(hasmntval(&mnt, "mountport")); - if (np->np_mountd == 0) { - np->np_mountd_inval = 'Y'; - np->np_xid = XID_ALLOC(); - np->np_error = -1; - } else { - plog(XLOG_INFO, "%s: using mountport: %d", __func__, - (int) ntohs(np->np_mountd)); - np->np_mountd_inval = 'P'; - np->np_xid = 0; - np->np_error = 0; - } - - /* - * 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; -} Index: contrib/amd/amd/sun2amd.8 =================================================================== --- contrib/amd/amd/sun2amd.8 +++ /dev/null @@ -1,92 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 Erez Zadok -.\" Copyright (c) 2005 Daniel P. Ottavio -.\" 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. 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/sun2amd.8 -.\" -.TH SUN2AMD 8L "14 August 2005" - -.SH NAME -sun2amd \- converts Sun automount maps to Amd maps - -.SH SYNOPSIS -.B sun2amd -[-hH] [-i infile] [-o outfile] - -.SH DESCRIPTION -.B sun2amd -is used to convert Sun style automount maps to Amd style automount -maps. By default -.B sun2amd -reads from stdin and writes to stdout. - -.SH OPTIONS -.TP -.B -h -Help -.TP -.B -i -Read Sun map information from specified file. -.TP -.B -o -Write Amd map information to specified file. - -.SH EXAMPLE -To convert a Sun automount file called auto_foo to an Amd file called -auto.amd type: - -.B sun2amd --i auto_foo -o auto.amd - -.SH BUGS -* Can not convert master maps yet. - -* NFS is the only automount type currently supported. - -total_bug_count = number_found + 1; - -.SH "SEE ALSO" -.BR automount(8), -.BR amd(8) - -.I "Linux NFS and Automounter Administration" -by Erez Zadok, ISBN 0-7821-2739-8, (Sybex, 2001). -.LP -.I http://www.am-utils.org -.LP - -.SH AUTHOR -Daniel P. Ottavio -.I Index: contrib/amd/amd/sun2amd.c =================================================================== --- contrib/amd/amd/sun2amd.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 1997-2014 Erez Zadok - * Copyright (c) 2005 Daniel P. Ottavio - * 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. 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/sun2amd.c - * - */ - -/* - * Translate Sun-syntax maps to Amd maps - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* dummies to make the program compile and link */ -struct amu_global_options gopt; -#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, rfc931_timeout=0; -# endif /* NEED_LIBWRAP_SEVERITY_VARIABLES */ -#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */ - - -/* - * Parse the stream sun_in, convert the map information to amd, write - * the results to amd_out. - */ -static int -sun2amd_convert(FILE *sun_in, FILE *amd_out) -{ - char line_buff[INFO_MAX_LINE_LEN], *tmp, *key, *entry; - int pos, line = 0, retval = 1; - - /* just to be safe */ - memset(line_buff, 0, sizeof(line_buff)); - - /* Read the input line by line and do the conversion. */ - while ((pos = file_read_line(line_buff, sizeof(line_buff), sun_in))) { - line++; - line_buff[pos - 1] = '\0'; - - /* remove comments */ - if ((tmp = strchr(line_buff, '#')) != NULL) { - *tmp = '\0'; - } - - /* find start of key */ - key = line_buff; - while (*key != '\0' && isspace((unsigned char)*key)) { - key++; - } - - /* ignore blank lines */ - if (*key == '\0') { - continue; - } - - /* find the end of the key and NULL terminate */ - tmp = key; - while (*tmp != '\0' && isspace((unsigned char)*tmp) == 0) { - tmp++; - } - if (*tmp == '\0') { - plog(XLOG_ERROR, "map line %d has no entry", line); - goto err; - } - *tmp++ = '\0'; - if (*tmp == '\0') { - plog(XLOG_ERROR, "map line %d has no entry", line); - goto err; - } - entry = tmp; - - /* convert the sun entry to an amd entry */ - if ((tmp = sun_entry2amd(key, entry)) == NULL) { - plog(XLOG_ERROR, "parse error on line %d", line); - goto err; - } - - if (fprintf(amd_out, "%s %s\n", key, tmp) < 0) { - plog(XLOG_ERROR, "can't write to output stream: %s", strerror(errno)); - goto err; - } - - /* just to be safe */ - memset(line_buff, 0, sizeof(line_buff)); - } - - /* success */ - retval = 0; - - err: - return retval; -} - - -/* - * wrapper open function - */ -static FILE * -sun2amd_open(const char *path, const char *mode) -{ - FILE *retval = NULL; - - if ((retval = fopen(path,mode)) == NULL) { - plog(XLOG_ERROR,"could not open file %s",path); - } - - return retval; -} - - -/* - * echo the usage and exit - */ -static void -sun2amd_usage(void) -{ - fprintf(stderr, - "usage : sun2amd [-hH] [-i infile] [-o outfile]\n" - "-h\thelp\n" - "-i\tspecify an infile (defaults to stdin)\n" - "-o\tspecify an outfile (defaults to stdout)\n"); -} - - -int -main(int argc, char **argv) -{ - /* default in/out to stdin/stdout */ - FILE *sun_in = stdin, *amd_out = stdout; - int opt, retval = 1; - - while ((opt = getopt(argc, argv , "i:o:hH")) != -1) { - switch (opt) { - - case 'i': - if ((sun_in = sun2amd_open(optarg,"r")) == NULL) { - goto err; - } - break; - - case 'o': - if ((amd_out = sun2amd_open(optarg,"w")) == NULL) { - goto err; - } - break; - - case 'h': - case 'H': - sun2amd_usage(); - goto err; - } - } - - retval = sun2amd_convert(sun_in,amd_out); - - err: - exit(retval); -} Index: contrib/amd/amd/sun_map.h =================================================================== --- contrib/amd/amd/sun_map.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 1997-2014 Erez Zadok - * Copyright (c) 2005 Daniel P. Ottavio - * 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. 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/sun_map.h - * - */ - -#ifndef _SUN_MAP_H -#define _SUN_MAP_H - -/* host */ -struct sun_host { - qelem head; /* link-list header */ - char *name; /* hostname */ - int weight; /* weight given to the host */ -}; - -/* location */ -struct sun_location { - qelem head; /* link-list header */ - char *path; /* server path */ - struct sun_host *host_list; /* list of hosts */ -}; - -/* sun mount option */ -struct sun_opt { - qelem head; /* link-list header */ - char *str; /* option string */ -}; - -/* mount point */ -struct sun_mountpt { - qelem head; /* link-list header */ - char *path; /* optional mount point path */ - char *fstype; /* filesystem type */ - struct sun_opt *opt_list; /* list of option strings */ - struct sun_location *location_list; /* list of 'struct s2a_location' */ -}; - -/* automount entry */ -struct sun_entry { - qelem head; /* link-list header */ - char *key; /* auto map key */ - char *fstype; /* filesystem type */ - struct sun_opt *opt_list; /* list of mount options */ - struct sun_location *location_list; /* list of mount locations */ - struct sun_mountpt *mountpt_list; /* list of mount points */ -}; - -/* - * automount map file - * - * XXX: Only a place holder structure, not implemented yet. - */ -struct sun_map { - qelem head; /* link-list header */ - char *path; /* directory path of the map file */ - char *mount_dir; /* top level mount point for this map */ - int lookup; /* lookup type i.e file, yp, program, etc. */ - int direct_bool; /* set true if this map is a direct map */ - struct sun_opt *opt_list; /* list of global map options */ - struct sun_opt *include_list; /* list of included map files */ - struct sun_entry *entry_list; /* list of 'struct s2a_entry' */ -}; - -/* - * master map file - * - * XXX: Only a place holder structure, not implemented yet. - */ -struct sun_mmap { - qelem head; /* link-list header */ - struct sun_opt *include_list; /* list of included master maps */ - struct sun_map *amap_list; /* list of 'struct s2a_amap' */ -}; - -struct sun_list { - qelem *first; - qelem *last; -}; - - -/* - * EXTERNS - */ -extern char *sun_entry2amd(const char *, const char *); -extern struct sun_entry *sun_map_parse_read(const char *); -extern void sun_list_add(struct sun_list *, qelem *); - -#endif /* not _SUN_MAP_H */ Index: contrib/amd/amd/sun_map.c =================================================================== --- contrib/amd/amd/sun_map.c +++ /dev/null @@ -1,595 +0,0 @@ -/* - * Copyright (c) 1997-2014 Erez Zadok - * Copyright (c) 2005 Daniel P. Ottavio - * 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. 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/sun_map.c - * - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - - -/* - * Add a data pointer to the end of the list. - */ -void -sun_list_add(struct sun_list *list, qelem *item) -{ - if (list->last == NULL) { - list->last = item; - list->first = item; - item->q_back = NULL; - } - else { - list->last->q_forw = item; - item->q_back = list->last; - list->last = item; - } - - item->q_forw = NULL; -} - - -/* - * Sun2Amd conversion routines - */ - -/* - * AMD entry keywords - */ -#define AMD_OPTS_KW "addopts:=" /* add entry options */ -#define AMD_RHOST_KW "rhost:=" /* remote host */ -#define AMD_RFS_KW "rfs:=" /* remote file system */ -#define AMD_FS_KW "fs:=" /* local file system */ -#define AMD_DEV_KW "dev:=" /* device */ -#define AMD_TYPE_NFS_KW "type:=nfs;" /* fs type nfs */ -#define AMD_TYPE_AUTO_KW "type:=auto;" /* fs type auto */ -#define AMD_TYPE_CDFS_KW "type:=cdfs;" /* fs type cd */ -#define AMD_MAP_FS_KW "fs:=${map};" /* set the mount map as current map */ -#define AMD_MAP_PREF_KW "pref:=${key}/" /* set the mount map as current map */ - -/* - * A set of string Sun fstypes. - */ -#define SUN_NFS_TYPE "nfs" -#define SUN_HSFS_TYPE "hsfs" /* CD fs */ -#define SUN_AUTOFS_TYPE "autofs" -#define SUN_CACHEFS_TYPE "cachefs" - -#define SUN_KEY_SUB "&" /* Sun key substitution */ - -/* a set a Sun variable substitutions for map entries */ -#define SUN_ARCH "$ARCH" /* host architecture */ -#define SUN_CPU "$CPU" /* processor type */ -#define SUN_HOST "$HOST" /* host name */ -#define SUN_OSNAME "$OSNAME" /* OS name */ -#define SUN_OSREL "$OSREL" /* OS release */ -#define SUN_OSVERS "$OSVERS" /* OS version */ -#define SUN_NATISA "$NATISA" /* native instruction set */ - -/* a set of Amd variable substitutions */ -#define AMD_ARCH "${arch}" /* host architecture */ -#define AMD_HOST "${host}" /* host name */ -#define AMD_OSNAME "${os}" /* OS name */ -#define AMD_OSVER "${osver}" /* OS version */ - - -/* - * Return a copy of src that has all occurrences of 'str' replaced - * with sub. - * - * param src - the original string - * param str - string that is the replaced with str - * param sub - string that replaces an occurrences of 'delim' - * - * return - new string with str substitutions, NULL on error - */ -static char * -sun_strsub(const char *src, const char *str, const char *sub) -{ - - char *retval = NULL, *str_start, *str_end, *src_end; - size_t total_size, first_half, second_half, sub_size; - - /* assign pointers to the start and end of str */ - if ((str_start = strstr(src, str)) == NULL) { - return retval; - } - str_end = (strlen(str) - 1) + str_start; - - /* assign to the end of the src. */ - src_end = (strlen(src) - 1) + (char*)src; - - /* size from the beginning of src to the start of str */ - first_half = (size_t)(str_start - src); - - /* size from the end of str to the end of src */ - second_half = (size_t)(src_end - str_end); - - sub_size = strlen(sub); - - total_size = (first_half + sub_size + second_half + 1); - - retval = (char*)xmalloc(total_size); - memset(retval, 0, total_size); - - /* - * Put together the string such that the first half is copied - * followed the sub and second half. - * - * We use strncpy instead of xstrlcpy because we are intentionally - * causing truncation and we don't want this to cause errors in the - * log. - */ - (void)strncpy(retval, src, first_half); - (void)strncat(retval, sub, sub_size); - (void)strncat(retval, str_end + 1, second_half); - - if (strstr(retval, str) != NULL) { - /* - * If there is another occurrences of str call this function - * recursively. - */ - char* tmp; - if ((tmp = sun_strsub(retval, str, sub)) != NULL) { - XFREE(retval); - retval = tmp; - } - } - return retval; -} - - -/* - * Return a new string that is a copy of str, all occurrences of a Sun - * variable substitutions are replaced by there equivalent Amd - * substitutions. - * - * param str - source string - * - * return - A new string with the expansions, NULL if str does not - * exist in src or error. - */ -static char * -sun_expand2amd(const char *str) -{ - - char *retval = NULL, *tmp = NULL, *tmp2 = NULL; - const char *pos; - - /* - * Iterator through the string looking for '$' chars. For each '$' - * found try to replace it with Sun variable substitutions. If we - * find a '$' that is not a substation each of the i.e $blah than - * each of the replace attempt will fail and we'll move on to the - * next char. - */ - tmp = xstrdup(str); - for (pos = str; *pos != '\0'; pos++) { - if (*pos != '$') { - continue; - } - if (tmp2 != NULL) { - XFREE(tmp); - tmp = tmp2; - } - - /* - * If a 'replace' does not return NULL than a variable was - * successfully substituted. - */ - - /* architecture */ - if ((tmp2 = sun_strsub(tmp, SUN_ARCH, AMD_ARCH)) != NULL) { - continue; - } - /* cpu - there is not POSIX uname for cpu so just use machine */ - if ((tmp2 = sun_strsub(tmp, SUN_CPU, AMD_ARCH)) != NULL) { - continue; - } - /* hostname */ - if ((tmp2 = sun_strsub(tmp, SUN_HOST, AMD_HOST)) != NULL) { - continue; - } - /* os name */ - if ((tmp2 = sun_strsub(tmp, SUN_OSNAME, AMD_OSNAME)) != NULL) { - continue; - } - /* - * os release - Amd doesn't hava a OS release var just usr os - * version or now. - */ - if ((tmp2 = sun_strsub(tmp, SUN_OSREL, AMD_OSVER)) != NULL) { - continue; - } - /* os version */ - if ((tmp2 = sun_strsub(tmp, SUN_OSVERS, AMD_OSVER)) != NULL) { - continue; - } - /* native instruction set - there is no POSIX natisa so just use system */ - if ((tmp2 = sun_strsub(tmp, SUN_NATISA, AMD_ARCH)) != NULL) { - continue; - } - } - if (tmp2 == NULL) { - retval = tmp; - } - else { - retval = tmp2; - XFREE(tmp); - } - - return retval; -} - - -/* - * This is a wrapper function for appending Amd entry information to a - * buffer. Any Sun variable substitutions will be converted into Amd - * equivalents. - * - * param dest - destination buffer - * param deslen - destination buffer length - * param key - entry key, this might be needed for key substitutions - * param str - string to append - */ -static void -sun_append_str(char *dest, - size_t destlen, - const char *key, - const char *str) -{ - char *sub = NULL, *sub2 = NULL, *out = NULL; - - /* By default we are going to just write the original string. */ - out = (char*)str; - - /* - * Resolve variable substitutions in two steps; 1) replace any key - * map substitutions with the entry key 2) expand any variable - * substitutions i.e $HOST. - * - * Try to replace the key substitution '&'. If this function returns - * with a new string, one or more key subs. where replaced with the - * entry key. - */ - if ((sub = sun_strsub(str, SUN_KEY_SUB, "${key}")) != NULL) { - out = sub; - /* - * Try to convert any variable substitutions. If this function - * returns a new string one or more var subs where expanded. - */ - if ((sub2 = sun_expand2amd(sub)) != NULL) { - out = sub2; - } - } - /* - * Try to convert any variable substitutions. If this function - * returns a new string one or more var subs where expanded. - */ - else if (out != NULL && (sub = sun_expand2amd(out)) != NULL) { - out = sub; - } - - if (out != NULL) { - xstrlcat(dest, out, destlen); - } - XFREE(sub); - XFREE(sub2); -} - - -/* - * Convert the list of Sun mount options to Amd mount options. The - * result is concatenated to dest. - * - * param dest - destination buffer - * param destlen - destination buffer length - * param key - automount key - * param opt_list - list of Sun mount options - */ -static void -sun_opts2amd(char *dest, - size_t destlen, - const char *key, - const struct sun_opt *opt_list) -{ - const struct sun_opt *opt; - - xstrlcat(dest, AMD_OPTS_KW, destlen); - - /* Iterate through each option and append it to the buffer. */ - for(opt = opt_list; opt != NULL; opt = NEXT(struct sun_opt, opt)) { - sun_append_str(dest, destlen, key, opt->str); - /* If there are more options add some commas. */ - if (NEXT(struct sun_opt, opt) != NULL) { - xstrlcat(dest, ",", destlen); - } - } - xstrlcat(dest, ";", destlen); -} - - -/* - * Convert the list of Sun mount locations to a list of Amd mount - * locations. The result is concatenated to dest. - * - * param dest - destination buffer - * param destlen - destination buffer length - * param key - automount key - * param local_list - list of Sun mount locations - */ -static void -sun_locations2amd(char *dest, - size_t destlen, - const char *key, - const struct sun_location *local_list) -{ - const struct sun_location *local; - const struct sun_host *host; - - for (local = local_list; - local != NULL; - local = NEXT(struct sun_location,local)) { - /* - * Check to see if the list of hosts is empty. Some mount types - * i.e cd-rom may have mount location with no host. - */ - if (local->host_list != NULL) { - /* Write each host that belongs to this location. */ - for (host = local->host_list; - host != NULL; - host = NEXT(struct sun_host, host)) { - /* set fstype NFS */ - xstrlcat(dest, AMD_TYPE_NFS_KW, destlen); - /* add rhost key word */ - xstrlcat(dest, AMD_RHOST_KW, destlen); - /* add host name */ - sun_append_str(dest, destlen, key, host->name); - xstrlcat(dest, ";", destlen); - /* add remote fs key word */ - xstrlcat(dest, AMD_RFS_KW, destlen); - /* add local path */ - sun_append_str(dest, destlen, key, local->path); - if (NEXT(struct sun_host, host) != NULL) { - xstrlcat(dest, ";", destlen); - xstrlcat(dest, " ", destlen); - } - } - } - else { - /* no host location */ - xstrlcat(dest, AMD_FS_KW, destlen); - sun_append_str(dest, destlen, key, local->path); - } - if (NEXT(struct sun_location, local) != NULL) { - /* add a space to separate each location */ - xstrlcat(dest, " ", destlen); - } - } -} - - -/* - * Convert a Sun HSFS mount point to an Amd. The result is - * concatenated intp dest. - * - * param dest - destination buffer - * param destlen - destination buffer length - * param key - automount key - * param s_entry - Sun entry - */ -static void -sun_hsfs2amd(char *dest, - size_t destlen, - const char *key, - const struct sun_entry *s_entry) -{ - /* set fstype CDFS */ - xstrlcat(dest, AMD_TYPE_CDFS_KW, destlen); - /* set the cdrom device */ - xstrlcat(dest, AMD_DEV_KW, destlen); - /* XXX: For now just assume that there is only one device. */ - xstrlcat(dest, s_entry->location_list->path, destlen); -} - - -/* - * Convert a Sun NFS automount entry to an Amd. The result is concatenated - * into dest. - * - * param dest - destination buffer - * param destlen - destination buffer length - * param key - automount key - * param s_entry - Sun entry - */ -static void -sun_nfs2amd(char *dest, - size_t destlen, - const char *key, - const struct sun_entry *s_entry) -{ - if (s_entry->location_list != NULL) { - /* write out the list of mountpoint locations */ - sun_locations2amd(dest, destlen, key, s_entry->location_list); - } -} - - -/* - * Convert a Sun multi-mount point entry to an Amd. This is done - * using the Amd type auto. Each auto entry is separated with a \n. - * - * param dest - destination buffer - * param destlen - destination buffer length - * param key - automount key - * param s_entry - Sun entry - */ -static void -sun_multi2amd(char *dest, - size_t destlen, - const char *key, - const struct sun_entry *s_entry) -{ - const struct sun_mountpt *mountpt; - - /* We need to setup a auto fs Amd automount point. */ - xstrlcat(dest, AMD_TYPE_AUTO_KW, destlen); - xstrlcat(dest, AMD_MAP_FS_KW, destlen); - xstrlcat(dest, AMD_MAP_PREF_KW, destlen); - - /* write the mountpts to dest */ - for (mountpt = s_entry->mountpt_list; - mountpt != NULL; - mountpt = NEXT(struct sun_mountpt, mountpt)) { - xstrlcat(dest, "\n", destlen); - /* write the key */ - xstrlcat(dest, key, destlen); - /* write the mount path */ - sun_append_str(dest, destlen, key, mountpt->path); - /* space */ - xstrlcat(dest, " ", destlen); - /* Write all the host locations for this mount point. */ - sun_locations2amd(dest, destlen, key, mountpt->location_list); - } -} - - -/* - * Convert the sun_entry into an Amd equivalent string. - * - * param key - automount key - * param s_entry - Sun style automap entry - * - * return - Amd entry on succes, NULL on error - */ -char * -sun_entry2amd(const char *key, const char *s_entry_str) -{ - char *retval = NULL; - char line_buff[INFO_MAX_LINE_LEN]; - int ws; - struct sun_entry *s_entry = NULL; - - /* The key should not be NULL. */ - if (key == NULL) { - plog(XLOG_ERROR,"Sun key value was null"); - goto err; - } - /* The Sun entry string should never be NULL. */ - if (s_entry_str == NULL) { - plog(XLOG_ERROR,"Sun entry value was null"); - goto err; - } - - /* Make sure there are no trailing white spaces or '\n'. */ - xstrlcpy(line_buff, s_entry_str, sizeof(line_buff)); - ws = strlen(line_buff) - 1; - while (ws >= 0 && (isspace((unsigned char)line_buff[ws]) || line_buff[ws] == '\n')) { - line_buff[ws--] = '\0'; - } - - /* Parse the sun entry line. */ - s_entry = sun_map_parse_read(line_buff); - if (s_entry == NULL) { - plog(XLOG_ERROR,"could not parse Sun style map"); - goto err; - } - - memset(line_buff, 0, sizeof(line_buff)); - - if (s_entry->opt_list != NULL) { - /* write the mount options to the buffer */ - sun_opts2amd(line_buff, sizeof(line_buff), key, s_entry->opt_list); - } - - /* Check if this is a multi-mount entry. */ - if (s_entry->mountpt_list != NULL) { - /* multi-mount point */ - sun_multi2amd(line_buff, sizeof(line_buff), key, s_entry); - retval = xstrdup(line_buff); - } - else { - /* single mount point */ - if (s_entry->fstype != NULL) { - if (NSTREQ(s_entry->fstype, SUN_NFS_TYPE, strlen(SUN_NFS_TYPE))) { - /* NFS Type */ - sun_nfs2amd(line_buff, sizeof(line_buff), key, s_entry); - retval = xstrdup(line_buff); - } - else if (NSTREQ(s_entry->fstype, SUN_HSFS_TYPE, strlen(SUN_HSFS_TYPE))) { - /* HSFS Type (CD fs) */ - sun_hsfs2amd(line_buff, sizeof(line_buff), key, s_entry); - retval = xstrdup(line_buff); - } - /* - * XXX: The following fstypes are not yet supported. - */ - else if (NSTREQ(s_entry->fstype, SUN_AUTOFS_TYPE, strlen(SUN_AUTOFS_TYPE))) { - /* AutoFS Type */ - plog(XLOG_ERROR, "Sun fstype %s is currently not supported by Amd.", - s_entry->fstype); - goto err; - - } - else if (NSTREQ(s_entry->fstype, SUN_CACHEFS_TYPE, strlen(SUN_CACHEFS_TYPE))) { - /* CacheFS Type */ - plog(XLOG_ERROR, "Sun fstype %s is currently not supported by Amd.", - s_entry->fstype); - goto err; - } - else { - plog(XLOG_ERROR, "Sun fstype %s is currently not supported by Amd.", - s_entry->fstype); - goto err; - } - } - else { - plog(XLOG_INFO, "No SUN fstype specified defaulting to NFS."); - sun_nfs2amd(line_buff, sizeof(line_buff), key, s_entry); - retval = xstrdup(line_buff); - } - } - - err: - XFREE(s_entry); - return retval; -} Index: contrib/amd/amd/sun_map_parse.y =================================================================== --- contrib/amd/amd/sun_map_parse.y +++ /dev/null @@ -1,492 +0,0 @@ -%{ -/* - * Copyright (c) 1997-2014 Erez Zadok - * Copyright (c) 2005 Daniel P. Ottavio - * 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. 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/sun_map_parse.y - * - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -#define SUN_FSTYPE_STR "fstype=" - - -extern int sun_map_lex(void); -extern int sun_map_error(const char *); -extern void sun_map_tok_setbuff(const char *); -extern int sun_map_parse(void); - -struct sun_entry *sun_map_parse_read(const char *); - -static struct sun_list *sun_entry_list = NULL; -static struct sun_list *sun_opt_list = NULL; -static struct sun_list *sun_host_list = NULL; -static struct sun_list *sun_location_list = NULL; -static struct sun_list *mountpt_list = NULL; -static char *tmpFsType = NULL; - - -/* - * Each get* function returns a pointer to the corresponding global - * list structure. If the structure is NULL than a new instance is - * returned. - */ -static struct sun_list *get_sun_opt_list(void); -static struct sun_list *get_sun_host_list(void); -static struct sun_list *get_sun_location_list(void); -static struct sun_list *get_mountpt_list(void); -static struct sun_list *get_sun_entry_list(void); - -%} - -%union { - char strval[2048]; -} - -%token NEWLINE COMMENT WSPACE -%token WORD - -%% - -amap : file - ; - -file : new_lines entries - | entries - ; - -entries : entry - | entry new_lines - | entry new_lines entries - ; - -new_lines : NEWLINE - | NEWLINE new_lines - ; - -entry : locations { - - struct sun_list *list; - struct sun_entry *entry; - - /* allocate an entry */ - entry = CALLOC(struct sun_entry); - - /* - * Assign the global location list to this entry and reset the - * global pointer. Reseting the global pointer will create a new - * list instance next time get_sun_location_list() is called. - */ - list = get_sun_location_list(); - entry->location_list = (struct sun_location *)list->first; - sun_location_list = NULL; - - /* Add this entry to the entry list. */ - sun_list_add(get_sun_entry_list(), (qelem *)entry); -} - -| '-' options WSPACE locations { - - struct sun_list *list; - struct sun_entry *entry; - - entry = CALLOC(struct sun_entry); - - /* An fstype may have been defined in the 'options'. */ - if (tmpFsType != NULL) { - entry->fstype = tmpFsType; - tmpFsType = NULL; - } - - /* - * Assign the global location list to this entry and reset the - * global pointer. Reseting the global pointer will create a new - * list instance next time get_sun_location_list() is called. - */ - list = get_sun_location_list(); - entry->location_list = (struct sun_location *)list->first; - sun_location_list = NULL; - - /* - * Assign the global opt list to this entry and reset the global - * pointer. Reseting the global pointer will create a new list - * instance next time get_sun_opt_list() is called. - */ - list = get_sun_opt_list(); - entry->opt_list = (struct sun_opt *)list->first; - sun_opt_list = NULL; - - /* Add this entry to the entry list. */ - sun_list_add(get_sun_entry_list(), (qelem *)entry); -} - -| mountpoints { - - struct sun_list *list; - struct sun_entry *entry; - - /* allocate an entry */ - entry = CALLOC(struct sun_entry); - - /* - * Assign the global mountpt list to this entry and reset the global - * pointer. Reseting the global pointer will create a new list - * instance next time get_mountpt_list() is called. - */ - list = get_mountpt_list(); - entry->mountpt_list = (struct sun_mountpt *)list->first; - mountpt_list = NULL; - - /* Add this entry to the entry list. */ - sun_list_add(get_sun_entry_list(), (qelem *)entry); -} - -| '-' options WSPACE mountpoints { - - struct sun_list *list; - struct sun_entry *entry; - - /* allocate an entry */ - entry = CALLOC(struct sun_entry); - - /* An fstype may have been defined in the 'options'. */ - if (tmpFsType != NULL) { - entry->fstype = tmpFsType; - tmpFsType = NULL; - } - - /* - * Assign the global mountpt list to this entry and reset the global - * pointer. Reseting the global pointer will create a new list - * instance next time get_mountpt_list() is called. - */ - list = get_mountpt_list(); - entry->mountpt_list = (struct sun_mountpt *)list->first; - mountpt_list = NULL; - - /* - * Assign the global opt list to this entry and reset the global - * pointer. Reseting the global pointer will create a new list - * instance next time get_sun_opt_list() is called. - */ - list = get_sun_opt_list(); - entry->opt_list = (struct sun_opt *)list->first; - sun_opt_list = NULL; - - /* Add this entry to the entry list. */ - sun_list_add(get_sun_entry_list(), (qelem *)entry); -} -; - -mountpoints : mountpoint - | mountpoint WSPACE mountpoints - ; - -mountpoint : WORD WSPACE location { - - struct sun_list *list; - struct sun_mountpt *mountpt; - - /* allocate a mountpt */ - mountpt = CALLOC(struct sun_mountpt); - - /* - * Assign the global loaction list to this entry and reset the - * global pointer. Reseting the global pointer will create a new - * list instance next time get_sun_location_list() is called. - */ - list = get_sun_location_list(); - mountpt->location_list = (struct sun_location *)list->first; - sun_location_list = NULL; - - mountpt->path = xstrdup($1); - - /* Add this mountpt to the mountpt list. */ - sun_list_add(get_mountpt_list(), (qelem *)mountpt); -} - -| WORD WSPACE '-' options WSPACE location { - - struct sun_list *list; - struct sun_mountpt *mountpt; - - /* allocate a mountpt */ - mountpt = CALLOC(struct sun_mountpt); - - /* An fstype may have been defined in the 'options'. */ - if (tmpFsType != NULL) { - mountpt->fstype = tmpFsType; - tmpFsType = NULL; - } - - /* - * Assign the global location list to this entry and reset the - * global pointer. Reseting the global pointer will create a new - * list instance next time get_sun_location_list() is called. - */ - list = get_sun_location_list(); - mountpt->location_list = (struct sun_location *)list->first; - sun_location_list = NULL; - - /* - * Assign the global opt list to this entry and reset the global - * pointer. Reseting the global pointer will create a new list - * instance next time get_sun_opt_list() is called. - */ - list = get_sun_opt_list(); - mountpt->opt_list = (struct sun_opt *)list->first; - sun_opt_list = NULL; - - mountpt->path = xstrdup($1); - - /* Add this mountpt to the mountpt list. */ - sun_list_add(get_mountpt_list(), (qelem *)mountpt); -} -; - -locations : location - | location WSPACE locations - ; - -location : hosts ':' WORD { - - struct sun_list *list; - struct sun_location *location; - - /* allocate a new location */ - location = CALLOC(struct sun_location); - - /* - * Assign the global opt list to this entry and reset the global - * pointer. Reseting the global pointer will create a new list - * instance next time get_sun_opt_list() is called. - */ - list = get_sun_host_list(); - location->host_list = (struct sun_host *)list->first; - sun_host_list = NULL; - - location->path = xstrdup($3); - - /* Add this location to the location list. */ - sun_list_add(get_sun_location_list(), (qelem *)location); -} - -| ':' WORD { - - struct sun_location *location; - - /* allocate a new location */ - location = CALLOC(struct sun_location); - - location->path = xstrdup($2); - - /* Add this location to the location list. */ - sun_list_add(get_sun_location_list(), (qelem *)location); -} -; - -hosts : host - | host ',' hosts - ; - -host : WORD { - - /* allocate a new host */ - struct sun_host *host = CALLOC(struct sun_host); - - host->name = xstrdup($1); - - /* Add this host to the host list. */ - sun_list_add(get_sun_host_list(),(qelem *)host); -} - -| WORD weight { - - /* - * It is assumed that the host for this rule was allocated by the - * 'weight' rule and assigned to be the last host item on the host - * list. - */ - struct sun_host *host = (struct sun_host *)sun_host_list->last; - - host->name = xstrdup($1); -} -; - -weight : '(' WORD ')' { - - int val; - /* allocate a new host */ - struct sun_host *host = CALLOC(struct sun_host); - - val = atoi($2); - - host->weight = val; - - /* Add this host to the host list. */ - sun_list_add(get_sun_host_list(), (qelem *)host); -} -; - -options : option - | option ',' options - ; - -option : WORD { - - char *type; - - /* check if this is an fstype option */ - if ((type = strstr($1,SUN_FSTYPE_STR)) != NULL) { - /* parse out the fs type from the Sun fstype keyword */ - if ((type = type + strlen(SUN_FSTYPE_STR)) != NULL) { - /* - * This global fstype str will be assigned to the current being - * parsed later in the parsing. - */ - tmpFsType = xstrdup(type); - } - } - else { - /* - * If it is not an fstype option allocate an opt struct and assign - * the value. - */ - struct sun_opt *opt = CALLOC(struct sun_opt); - opt->str = xstrdup($1); - /* Add this opt to the opt list. */ - sun_list_add(get_sun_opt_list(), (qelem *)opt); - } -} - -; - -%% - -/* - * Parse 'map_data' which is assumed to be a Sun-syle map. If - * successful a sun_entry is returned. - * - * The parser is designed to parse map entries with out the keys. For - * example the entry: - * - * usr -ro pluto:/usr/local - * - * should be passed to the parser as: - * - * -ro pluto:/usr/local - * - * The reason for this is that the Amd info services already strip off - * the key when they read map info. - */ -struct sun_entry * -sun_map_parse_read(const char *map_data) -{ - struct sun_entry *retval = NULL; - - /* pass map_data to lex */ - sun_map_tok_setbuff(map_data); - - /* call yacc */ - sun_map_parse(); - - if (sun_entry_list != NULL) { - /* return the first Sun entry in the list */ - retval = (struct sun_entry*)sun_entry_list->first; - sun_entry_list = NULL; - } - else { - plog(XLOG_ERROR, "Sun map parser did not produce data structs."); - } - - return retval; -} - - -static struct sun_list * -get_sun_entry_list(void) -{ - if (sun_entry_list == NULL) { - sun_entry_list = CALLOC(struct sun_list); - } - return sun_entry_list; -} - - -static struct sun_list * -get_mountpt_list(void) -{ - if (mountpt_list == NULL) { - mountpt_list = CALLOC(struct sun_list); - } - return mountpt_list; -} - - -static struct sun_list * -get_sun_location_list(void) -{ - if (sun_location_list == NULL) { - sun_location_list = CALLOC(struct sun_list); - } - return sun_location_list; -} - - -static struct sun_list * -get_sun_host_list(void) -{ - if (sun_host_list == NULL) { - sun_host_list = CALLOC(struct sun_list); - } - return sun_host_list; -} - - -static struct sun_list * -get_sun_opt_list(void) -{ - if (sun_opt_list == NULL) { - sun_opt_list = CALLOC(struct sun_list); - } - return sun_opt_list; -} Index: contrib/amd/amd/sun_map_tok.l =================================================================== --- contrib/amd/amd/sun_map_tok.l +++ /dev/null @@ -1,233 +0,0 @@ -%{ -/* - * Copyright (c) 1997-2014 Erez Zadok - * Copyright (c) 2005 Daniel P. Ottavio - * 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. 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/sun_map_tok.l - * - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -/* - * Some systems include a definition for the macro ECHO in , - * 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 -#include -#include -/* 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 __IGNORE(fwrite( yytext, yyleng, 1, yyout )) -# endif /* not ECHO */ -#endif /* FLEX_SCANNER */ - -int yylex(void); -int sun_map_error(const char *); - -/* - * We need to configure lex to parse from a string - * instead of a file. Each version of lex has it's - * own way of doing this (sigh). - */ - -/* assign the buffer to parse */ -void sun_map_tok_setbuff(const char* buff); - -/* buffer that contains the string to parse */ -const char *sun_map_tok_buff = NULL; - -#ifdef FLEX_SCANNER -/* - * The flex scanner uses the YY_INPUT to parse the input. - * We need to redefine it so that it can parse strings. - * In addition to the above string buffer we need to have - * a position pointer and a end pointer. - */ - -/* current position of the buffer */ -const char *sun_map_tok_pos = NULL; - -/* size of the buffer */ -const char *sun_map_tok_end = NULL; - -/* copies the current position + maxsize into buff */ -int sun_map_input(char *buff, int maxsize); - -# undef YY_INPUT -# define YY_INPUT(buff,result,maxsize) (result = sun_map_input(buff,maxsize)) - -#else -/* - * If this is not Flex than fall back to an AT&T style lex. - * We can parse strings by redefining input and unput. - */ -#undef input -#undef unput -#define input() (*(char *)sun_map_tok_buff++) -#define unput(c) (*(char *)--sun_map_tok_buff = c) - -#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. - */ -#if !defined(yywrap) || defined(yylex) -int yywrap(void); -#endif /* not yywrap or yylex */ - -/* no need to use yywrap() */ -#define YY_SKIP_YYWRAP - -int sun_map_line = 1; -int sun_map_tokpos = 1; - -%} - -/* This option causes Solaris lex to fail. Use flex. See BUGS file */ -/* no need to use yyunput() */ -%option nounput -%option noinput - -/* allocate more output slots so lex scanners don't run out of mem */ -%o 1024 - -WORD_REX [A-Za-z0-9_/&\.$=]+[A-Za-z0-9_/&\.$=-]* -COMMENT_REX ^#.*\n -WSPACE_REX [ \t]* -NEWLINE_REX [ \t]*\n -CONTINUE_REX "\\"\n - -%% - -{WORD_REX} { - sun_map_tokpos += yyleng; - xstrlcpy((char *)sun_map_lval.strval,(const char *)yytext,sizeof(sun_map_lval.strval)); - return WORD; - } - -{WSPACE_REX} { - sun_map_tokpos += yyleng; - return WSPACE; - } - -{NEWLINE_REX} { - sun_map_tokpos = 0; - sun_map_line++; - return NEWLINE; - } - -{CONTINUE_REX} { - sun_map_tokpos = 0; - sun_map_line++; - } - -{COMMENT_REX} { - sun_map_line++; - } - -. { - return yytext[0]; - } - -%% - - -int -sun_map_error(const char* s) -{ - return 1; -} - -#ifdef FLEX_SCANNER -void -sun_map_tok_setbuff(const char* buff) -{ - sun_map_tok_end = buff + strlen(buff); - sun_map_tok_pos = buff; - sun_map_tok_buff = buff; -} - - -int -sun_map_input(char *buff, int maxsize) -{ - int size = MIN(maxsize, (sun_map_tok_end - sun_map_tok_pos)); - if (size > 0) { - memcpy(buff,sun_map_tok_pos,size); - sun_map_tok_pos += size; - } - - return size; -} -#else -void -sun_map_tok_setbuff(const char* buff) -{ - sun_map_tok_buff = buff; -} - -#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. - */ -#if !defined(yywrap) || defined(yylex) -int yywrap(void) -{ - return 1; -} -#endif /* not yywrap or yylex */ Index: contrib/amd/amd/test1.sh =================================================================== --- contrib/amd/amd/test1.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -./amd -v 2> /dev/null Index: contrib/amd/amq/amq.h =================================================================== --- contrib/amd/amq/amq.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_sync_umnt *amqproc_sync_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 amq_map_info_list *amqproc_getmapinfo_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 */ Index: contrib/amd/amq/amq.8 =================================================================== --- contrib/amd/amq/amq.8 +++ /dev/null @@ -1,307 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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.8 -.\" $FreeBSD$ -.\" -.Dd August 31, 2016 -.Dt AMQ 8 -.Os -.Sh NAME -.Nm amq -.Nd automounter query tool -.Sh SYNOPSIS -.Nm -.Op Fl fimpqsvwHTU -.Op Fl h Ar hostname -.Op Fl l Ar log_file -.Op Fl x Ar log_options -.Op Fl D Ar debug_options -.Op Fl P Ar program_number -.Op Oo Fl u Oc Ar directory ... -.Sh DESCRIPTION -.Bf -symbolic -This command is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility -provides a simple way of determining the current state of the -.Xr amd 8 -program. -Communication is by -.Tn RPC . -Three modes of operation are supported by the current protocol. -By default -a list of mount points and auto-mounted file systems is output. -An -alternative host can be specified using the -.Fl h -option. -.Pp -If -.Ar directory -names are given, as output by default, then per file system -information is displayed. -.Sh OPTIONS -.Bl -tag -width indent -.It Fl f -Ask the automounter to flush the internal caches and reload all the maps. -.It Fl h Ar hostname -Specify an alternate host to query. -By default the local host is used. -In -an -.Tn HP-UX -cluster, the root server is queried by default, since that is the system on -which the automounter is normally run. -.TP -.It Fl i -Print information about the mount maps. -.TP -.It Fl l Ar log_file -Tell -.Xr amd 8 -to use -.Ar log_file -as the log file name. -For security reasons, this must be the same log file -which -.Xr amd 8 -used when started. -This option is therefore only useful to -refresh -.Nm amd Ns 's -open file handle on the log file, so that it can be rotated -and compressed via daily cron jobs. -.It Fl m -Ask the automounter to provide a list of mounted file systems, including the -number of references to each file system and any error which occurred while -mounting. -.It Fl p -Return the process ID of the remote or locally running -.Xr amd 8 . -Useful when you -need to send a signal to the local -.Xr amd 8 -process, and would rather not have to -search through the process table. -This option is used in the -.Pa ctl-amd -script. -.TP -.It Fl q -Suppress error messages produced when attempting synchronous unmounts -with the -.B \-u -option. -.TP -.It Fl s -Ask the automounter to provide system-wide mount statistics. -.It Fl u -Ask the automounter to unmount the file systems named in -.Ar directory -instead of providing -information about them. -Unmounts are requested, not forced. -They merely -cause the mounted file system to timeout, which will be picked up by -.Nm amd Ns 's -main scheduler thus causing the normal timeout action to be taken. -If the -.B \-u -option is repeated, -.B amq -will attempt to unmount the file system synchronously by waiting until -the timeout action is taken and returning an error if the unmount -fails. -Any error messages produced may be suppressed with the -.B \-q -option. -.TP -.It Fl v -Ask the automounter for its version information. This is a subset of the -information output by -.Xr amd 8 Ns 's -.Fl v -option. -.It Fl w -Translate a full pathname as returned by -.Xr getcwd 3 -into a short -.Xr amd 8 -pathname that goes through its mount points. -This option requires that -.Xr amd 8 -is running. -.It Fl x Ar log_options -Ask the automounter to use the logging options specified in -.Ar log_options -from now on. Note that the "fatal" and "error" options cannot be turned -off. -.It Fl D Ar debug_options -.BI \-D " debug_options" -Ask the automounter to use the debugging options specified in -.Ar debug_options -from now on. -.It Fl H -Display short usage message. -.It Fl P Ar program_number -Contact an alternate running -.Xr amd 8 -that had registered itself on a different -.Tn RPC -.Ar program_number -and apply all other operations to that instance of the automounter. -This is -useful when you run multiple copies of -.Xr amd 8 , -and need to manage each -one separately. -If not specified, -.Nm -will use the default program number for -.Xr amd 8 , -300019. -For security reasons, the only alternate program numbers -.Xr amd 8 -can use range from 300019 to 300029, inclusive. -.It Fl T -Contact -.Xr amd 8 -using the TCP transport only. -Normally -.Nm -will try TCP, and if that failed, will try UDP. -.It Fl U -Contact -.Xr amd 8 -using UDP (connectionless) transport only. -Normally -.Nm -will try TCP, and if that failed, will try UDP. -.El -.Sh FILES -.Bl -tag -width ".Pa amq.x" -compact -.It Pa amq.x -.Tn RPC -protocol description. -.El -.Sh CAVEATS -The -.Nm -utility -uses a Sun registered -.Tn RPC -program number (300019 decimal) which may not -be in the -.Xr rpc 5 -database. -.Pp -If the TCP wrappers library is available, and the -.Va use_tcpwrappers -global -.Xr amd.conf 5 -option is set to -.Dq Li yes , -then -.Xr amd 8 -will verify that the host running -.Nm -is authorized to connect. -The -.Dq Li amd -service name must be used in the -.Pa /etc/hosts.allow -and -.Pa /etc/hosts.deny -files. -For example, to allow only localhost to connect to -.Xr amd 8 , -add this line to -.Pa /etc/hosts.allow : -.Pp -.Dl "amd: localhost" -.Pp -and this line to -.Pa /etc/hosts.deny : -.Pp -.RS -.Dl "amd: ALL" -.Sh SEE ALSO -.Xr amd.conf 5 , -.Xr hosts_access 5 . -.Xr amd 8 , -.\" .Xr ctl-amd 8 , -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Nm -utility -first appeared in -.Bx 4.4 . -.Sh AUTHORS -.An Jan-Simon Pendry Aq jsp@doc.ic.ac.uk , -Department of Computing, Imperial College, London, UK. -.Pp -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook -University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to -.Nm am-utils -are listed in the -.Pa AUTHORS -file distributed with -.Nm am-utils . Index: contrib/amd/amq/amq.c =================================================================== --- contrib/amd/amq/amq.c +++ /dev/null @@ -1,851 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* locals */ -static int flush_flag; -static int getpid_flag; -static int getpwd_flag; -static int getvers_flag; -static int minfo_flag; -static int mapinfo_flag; -static int quiet_flag; -static int stats_flag; -static int unmount_flag; -static int use_tcp_flag; -static int use_udp_flag; -static u_long amd_program_number = AMQ_PROGRAM; -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 -}; - - -static void -time_print(time_type tt) -{ - time_t t = (time_t)(intptr_t)tt; - struct tm *tp = localtime(&t); - printf("%02d/%02d/%04d %02d:%02d:%02d", - 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); -} - -/* - * 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: - { - printf("%-*.*s %-*.*s %-*.*s %s\n\t%-5d %-7d %-6d %-7d %-7d %-6d", - *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); - time_print(mt->mt_mounttime); - printf("\n"); - } - break; - - case Stats: - { - printf("%-*.*s %-5d %-7d %-6d %-7d %-7d %-6d ", - *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); - time_print(mt->mt_mounttime); - printf("\n"); - } - 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; - } -} - -static void -show_map(amq_map_info *mi) -{ -} - -static void -show_mapinfo(amq_map_info_list *ml, enum show_opt e, int *nwid, int *wwid) -{ - u_int i; - - switch (e) { - - case Calc: - { - for (i = 0; i < ml->amq_map_info_list_len; i++) { - amq_map_info *mi = &ml->amq_map_info_list_val[i]; - int nw = strlen(mi->mi_name); - int ww = strlen(mi->mi_wildcard ? mi->mi_wildcard : "(null"); - if (nw > *nwid) - *nwid = nw; - if (ww > *wwid) - *wwid = ww; - } - } - break; - - case Full: - { - printf("%-*.*s %-*.*s %-8.8s %-7.7s %-7.7s %-7.7s %-s Modified\n", - *nwid, *nwid, "Name", - *wwid, *wwid, "Wild", - "Flags", "Refcnt", "Entries", "Reloads", "Stat"); - for (i = 0; i < ml->amq_map_info_list_len; i++) { - amq_map_info *mi = &ml->amq_map_info_list_val[i]; - printf("%-*.*s %*.*s %-8x %-7d %-7d %-7d %s ", - *nwid, *nwid, mi->mi_name, - *wwid, *wwid, mi->mi_wildcard, - mi->mi_flags, mi->mi_refc, mi->mi_nentries, mi->mi_reloads, - mi->mi_up == -1 ? "root" : (mi->mi_up ? " up" : "down")); - time_print(mi->mi_modify); - 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) */ - - -static void -print_umnt_error(amq_sync_umnt *rv, const char *fs) -{ - - switch (rv->au_etype) { - case AMQ_UMNT_OK: - break; - case AMQ_UMNT_FAILED: - printf("unmount failed: %s\n", strerror(rv->au_errno)); - break; - case AMQ_UMNT_FORK: - if (rv->au_errno == 0) - printf("%s is not mounted\n", fs); - else - printf("falling back to asynchronous unmount: %s\n", - strerror(rv->au_errno)); - break; - case AMQ_UMNT_READ: - printf("pipe read error: %s\n", strerror(rv->au_errno)); - break; - case AMQ_UMNT_SERVER: - printf("amd server down\n"); - break; - case AMQ_UMNT_SIGNAL: - printf("got signal: %d\n", rv->au_signal); - break; - /* - * Omit default so the compiler can check for missing cases. - * - default: - break; - */ - } -} - - -static int -amu_sync_umnt_to_retval(amq_sync_umnt *rv) -{ - switch (rv->au_etype) { - case AMQ_UMNT_FORK: - if (rv->au_errno == 0) { - /* - * We allow this error so that things like: - * amq -uu /l/cd0d && eject cd0 - * will work when /l/cd0d is not mounted. - * XXX - We still print an error message. - */ - return 0; - } - /*FALLTHROUGH*/ - default: - return rv->au_etype; - } -} - - -static int -clnt_failed(CLIENT *clnt, char *server) -{ - fprintf(stderr, "%s: ", am_get_progname()); - clnt_perror(clnt, server); - return 1; -} - - -/* - * 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:il:mqsuvx: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 'i': - mapinfo_flag = 1; - nodefault = 1; - 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 'q': - quiet_flag = 1; - nodefault = 1; - break; - - case 's': - stats_flag = 1; - nodefault = 1; - break; - - case 'u': - unmount_flag++; - 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 [-fimpqsvwHTU] [-h hostname] [-l log_file|\"syslog\"]\n\ -\t[-x log_options] [-D debug_options]\n\ -\t[-P program_number] [[-u[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; - amq_mount_tree_list *mlp; - amq_mount_tree_p mt; - u_int i; - int flag; - - wd = getcwd(path, MAXPATHLEN+1); - if (!wd) { - fprintf(stderr, "%s: getcwd failed (%s)", am_get_progname(), - strerror(errno)); - exit(1); - } - mlp = amqproc_export_1((voidp) 0, clnt); - 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); - } - } - - - /* - * Map - */ - if (mapinfo_flag) { - int dummy; - amq_map_info_list *ml = amqproc_getmapinfo_1(&dummy, clnt); - if (ml) { - int mwid = 0, wwid = 0; - show_mapinfo(ml, Calc, &mwid, &wwid); - mwid++; - if (wwid) - wwid++; - show_mapinfo(ml, Full, &mwid, &wwid); - } else { - fprintf(stderr, "%s: amd on %s cannot provide map 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 > 1) { - amq_sync_umnt *sup; - /* - * Synchronous unmount request - */ - sup = amqproc_sync_umnt_1(&fs, clnt); - if (sup) { - if (quiet_flag == 0) - print_umnt_error(sup, fs); - errs = amu_sync_umnt_to_retval(sup); - } else { - errs = clnt_failed(clnt, server); - } - } else 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 { - errs = clnt_failed(clnt, server); - } - } - } 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 { - errs = clnt_failed(clnt, server); - } - - } 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 { - errs = clnt_failed(clnt, server); - } - } - exit(errs); - return errs; /* should never reach here */ -} Index: contrib/amd/amq/amq_clnt.c =================================================================== --- contrib/amd/amq/amq_clnt.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -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_sync_umnt * -amqproc_sync_umnt_1(amq_string *argp, CLIENT *clnt) -{ - static amq_sync_umnt res; - enum clnt_stat rv; - - memset((char *) &res, 0, sizeof(res)); - if ((rv = clnt_call(clnt, AMQPROC_SYNC_UMNT, - (XDRPROC_T_TYPE) xdr_amq_string, (SVC_IN_ARG_TYPE) argp, - (XDRPROC_T_TYPE) xdr_amq_sync_umnt, (SVC_IN_ARG_TYPE) &res, - TIMEOUT)) != RPC_SUCCESS) { - return (NULL); - } - return &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); -} - -amq_map_info_list * -amqproc_getmapinfo_1(voidp argp, CLIENT *clnt) -{ - static amq_map_info_list res; - - memset((char *) &res, 0, sizeof(res)); - if (clnt_call(clnt, AMQPROC_GETMAPINFO, (XDRPROC_T_TYPE) xdr_void, argp, - (XDRPROC_T_TYPE) xdr_amq_map_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); -} Index: contrib/amd/amq/amq_xdr.c =================================================================== --- contrib/amd/amq/amq_xdr.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -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_map_info(XDR *xdrs, amq_map_info *objp) -{ - if (!xdr_amq_string(xdrs, &objp->mi_name)) { - return (FALSE); - } - - if (!xdr_amq_string(xdrs, &objp->mi_wildcard)) { - return (FALSE); - } - - if (!xdr_time_type(xdrs, &objp->mi_modify)) { - return (FALSE); - } - - if (!xdr_int(xdrs, &objp->mi_flags)) { - return (FALSE); - } - - if (!xdr_int(xdrs, &objp->mi_nentries)) { - return (FALSE); - } - - if (!xdr_int(xdrs, &objp->mi_reloads)) { - 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_map_info_list(XDR *xdrs, amq_map_info_list *objp) -{ - if (!xdr_array(xdrs, - (char **) ((voidp) &objp->amq_map_info_list_val), - (u_int *) &objp->amq_map_info_list_len, - ~0, - sizeof(amq_map_info), - (XDRPROC_T_TYPE) xdr_amq_map_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)); -} Index: contrib/amd/amq/pawd.1 =================================================================== --- contrib/amd/amq/pawd.1 +++ /dev/null @@ -1,111 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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.1 -.\" $FreeBSD$ -.\" -.Dd February 26, 2016 -.Dt PAWD 1 -.Os -.Sh NAME -.Nm pawd -.Nd print automounter working directory -.Sh SYNOPSIS -.Nm -.Op Ar path ... -.Sh DESCRIPTION -.Bf -symbolic -This command is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility -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 -.Xr amd 8 Ns 's -local mount points. -Using them is unsafe, because -.Xr amd 8 -may unmount managed file systems from the mount points, and thus including -them in paths may not always find the files within. -.Pp -Without any arguments, -.Nm -will print the automounter adjusted current working directory. -With any -number of arguments, it will print the adjusted -.Ar path -of each one of the -arguments. -.Sh SEE ALSO -.Xr pwd 1 , -.Xr amd 8 , -.Xr amq 8 -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Nm -utility first appeared in -.Fx 3.0 . -.Sh AUTHORS -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook -University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/amq/pawd.c =================================================================== --- contrib/amd/amq/pawd.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* 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); -} Index: contrib/amd/aux_conf.h.in =================================================================== --- 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 */ Index: contrib/amd/bootstrap =================================================================== --- contrib/amd/bootstrap +++ /dev/null @@ -1,64 +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 - -validateversion() { - local v="$(autoreconf --version 2>&1 | head -1)" - case "$v" in - *2.69) ;; - *) echo "am-utils requires autoconf 2.69, you have:" - echo " $v" - exit 1;; - esac -} - -# 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 the rest of the scripts -echo "AMU: autoreconf..." -validateversion -if autoreconf -f -i; then - : -else - echo "autoreconf command failed. fix errors and rerun $0." - exit 2 -fi - -# save timestamp -echo "AMU: save timestamp..." -echo timestamp > stamp-h.in - -exit 0 Index: contrib/amd/conf/checkmount/checkmount_bsd44.c =================================================================== --- contrib/amd/conf/checkmount/checkmount_bsd44.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#if __NetBSD_Version__ > 200030000 -#define statfs statvfs -#endif - -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; if_mntfromname, ':'))) { - *colon = '\0'; - if (STREQ(colon + 1, path) && - is_same_host(mntp->f_mntfromname, host, hostaddr)) - return 1; - } - } - - return 0; -} Index: contrib/amd/conf/fh_dref/fh_dref_freebsd22.h =================================================================== --- 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) Index: contrib/amd/conf/mtab/mtab_bsd.c =================================================================== --- contrib/amd/conf/mtab/mtab_bsd.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#if __NetBSD_Version__ > 200030000 -#define statfs statvfs -#endif - -static mntent_t * -mnt_dup(struct statfs *mp) -{ - mntent_t *new_mp = ALLOC(mntent_t); - char *ty; - - new_mp->mnt_fsname = xstrdup(mp->f_mntfromname); - new_mp->mnt_dir = xstrdup(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 = xstrdup(ty); - new_mp->mnt_opts = xstrdup("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 = NULL; - - return mhp; -} Index: contrib/amd/conf/nfs_prot/nfs_prot_freebsd2.h =================================================================== --- contrib/amd/conf/nfs_prot/nfs_prot_freebsd2.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#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 /* 0 */ - - -#endif /* not _AMU_NFS_PROT_H */ Index: contrib/amd/conf/nfs_prot/nfs_prot_freebsd3.h =================================================================== --- contrib/amd/conf/nfs_prot/nfs_prot_freebsd3.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 - * $Id: nfs_prot_freebsd3.h,v 1.5.2.7 2004/01/06 03:15:19 ezk Exp $ - * $FreeBSD$ - * - */ - -#ifndef _AMU_NFS_PROT_H -#define _AMU_NFS_PROT_H - -/* nfs_prot.h defines struct `nfs_fh3', but it is a ``dmr "unwarranted - * chumminess with the C implementation". We need the more complete - * structure, which is defined below. So get the stock `nfs_fh3' - * out of the way. - */ -struct nfs_fh3; -#define nfs_fh3 nfs_fh3_fbsd_ - -#ifdef HAVE_RPCSVC_NFS_PROT_H -# include -#endif /* HAVE_RPCSVC_NFS_PROT_H */ - -#undef nfs_fh3 - -#ifdef HAVE_NFS_RPCV2_H -# include -#endif /* HAVE_NFS_RPCV2_H */ -#ifdef HAVE_NFS_NFS_H -# include -# include -#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 . - */ -struct ufs_extattr_per_mount; -# endif /* HAVE_UFS_UFS_EXTATTR_H */ -# include -#endif /* HAVE_UFS_UFS_UFSMOUNT_H */ - -/* nfsclient/nfsargs.h was introduced in FreeBSD 5.0, and is needed */ -#ifdef HAVE_NFSCLIENT_NFSARGS_H -# include -#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_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 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 */ - -/* since we don't use Am-utils's aux/macros/struct_nfs_fh3.m4, we don't get - their special searching. So restore the standard name. */ -typedef struct nfs_fh3_freebsd3 nfs_fh3; - -#endif /* NFSMNT_NFSV3 */ - -#endif /* not _AMU_NFS_PROT_H */ Index: contrib/amd/conf/sa_dref/sa_dref_bsd44.h =================================================================== --- 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 Index: contrib/amd/conf/transp/transp_sockets.c =================================================================== --- contrib/amd/conf/transp/transp_sockets.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* - * 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 *) NULL) < 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 *) NULL) < 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: - * return 1 on success, 0 otherwise. - */ -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) -{ - /* on Sockets: svc_register returns 1 on success, 0 otherwise */ - 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), u_long nfs_version) -{ - *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 (%lu, %lu, 0)", - (u_long) NFS_PROGRAM, 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, - "%s: cannot create connection to contact portmapper on host \"%s\"%s", - __func__, 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, - "%s: failed to contact portmapper on host \"%s\": %s", - __func__, 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, u_long def) -{ - 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_valid_version(nfs_version)) { - if (nfs_valid_version(def)) - nfs_version = def; - else - nfs_version = NFS_VERS_MAX; - again = 1; - } - tv.tv_sec = 2; /* retry every 2 seconds, but also timeout */ - tv.tv_usec = 0; - - for (; nfs_version >= NFS_VERS_MIN; nfs_version--) { - - 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); - if (clnt_stat == RPC_SUCCESS) - break; - } else { - #ifdef HAVE_CLNT_SPCREATEERROR - errstr = clnt_spcreateerror(""); - #else /* not HAVE_CLNT_SPCREATEERROR */ - errstr = ""; - #endif /* not HAVE_CLNT_SPCREATEERROR */ - } - - if (errstr) { - plog(XLOG_INFO, "%s: NFS(%lu,%s) failed for %s: %s", __func__, - nfs_version, proto, host, errstr); - } - } - - if (nfs_version < NFS_VERS_MIN) - nfs_version = 0; - - plog(XLOG_INFO, "%s: returning NFS(%lu,%s) on host %s", __func__, - 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 */ Index: contrib/amd/conf/trap/trap_default.h =================================================================== --- contrib/amd/conf/trap/trap_default.h +++ /dev/null @@ -1,3 +0,0 @@ -/* $FreeBSD$ */ -/* $srcdir/conf/trap/trap_default.h */ -#define MOUNT_TRAP(type, mnt, flags, mnt_data) mount(type, mnt->mnt_dir, flags, mnt_data) Index: contrib/amd/conf/umount/umount_bsd44.c =================================================================== --- contrib/amd/conf/umount/umount_bsd44.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -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 */ Index: contrib/amd/doc/am-utils.texi =================================================================== --- contrib/amd/doc/am-utils.texi +++ /dev/null @@ -1,8745 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c -@c Copyright (c) 1997-2014 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. 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-2014 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 1 -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-2014 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 -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 -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 the ``am-utils'' list (see -@url{http://www.am-utils.org/} under ``Mailing Lists'') 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://www.am-utils.org/} under ``Mailing -Lists.'' After subscribing, you can post a message to this list. 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://www.am-utils.org/} under ``Mailing Lists.'' -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://www.am-utils.org/} under ``Mailing Lists.'' - -@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 AT 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} (see @url{http://www.am-utils.org/} under -``Mailing Lists''). - -@end enumerate - -@unnumberedsec Am-utils Book -@cindex Am-utils book -@cindex Amd book -@cindex Automounter book -@cindex book - -@uref{http://www.cs.sunysb.edu/~ezk,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 (@uref{http://www.cs.sunysb.edu/~ezk,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 AT 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:=mhj -@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 -
-@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 -
-@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/} 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 closesession -@cindex Mount flags; closesession -For UDF mounts, close the session when unmounting. - -@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 gmtoff=@var{n} -@cindex Mount flags; gmtoff -For UDF mounts, set the time zone offset from UTC to @var{n} seconds, -with positive values indicating east of the Prime Meridian. If not -set, the user's current time zone will be used. - -@item group=@var{n} -@cindex Mount flags; group -For PCFS and UDF 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 nocasetrans -@cindex Mount flags; nocasetrans -Don't do case translation. Useful for CD-ROMS formatted as -ISO-9660. - -@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 nojoliet -@cindex Mount flags; nojoliet -Turn off the Joliet extensions. Useful for CD-ROMS formatted as ISO-9660. - -@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 rrcaseins -@cindex Mount flags; rrcaseins -Enable the Rock Ridge Interchange Protocol (RRIP) case insensitive extensions. -Useful for CD-ROMS formatted as ISO-9660. - -@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 sessionnr=@var{n} -@cindex Mount Flags; sessionnr -For multisession UDF mounts, use session number @var{n} when mounting. - -@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 and UDF 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@@example.com 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, udf, 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 (cannot be turned off) -@item error -Non-fatal errors (cannot be turned off) -@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 -@item defaults -An alias for "fatal,error,user,warning,info". -@end table - -Initially a set of default logging flags is enabled. This is as if -@samp{-x defaults} -or -@samp{-x fatal,error,user,warning,info} -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 options (excluding hrtime and mtab) -@item defaults -``sensible'' default options (all--excluding hrtime, mtab, and xdrtrace) -@item test -full debug options plus mtab,nodaemon,nofork,noamq -@item amq -register @i{Amd} with the RPC portmapper, for @i{Amq} -@item daemon -enter daemon mode -@item fork -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 mount-table file (defaults to @file{/tmp/mtab}, @pxref{debug_mtab_file Parameter}) -@item readdir -show readdir progress -@item str -debug string munging -@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. -* UDF Filesystem:: Universal Disk Format filesystem. -* 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, UDF 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 UDF Filesystem, Loopback Filesystem, CD-ROM Filesystem, Filesystem Types -@comment node-name, next, previous, up -@section CD-ROM Filesystem (@samp{udf}) -@cindex CD-ROM Filesystem -@cindex udf, filesystem type -@cindex Filesystem type; udf - -The @dfn{udf} (@samp{type:=udf}) filesystem mounts media with a -Universal Disk Format (UDF) filesystem on it, e.g., a video DVD. - -@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 media unless the -@samp{ro} option is specified. A udf entry might be: - -@example -udf os==sunos4;type:=udf;dev:=/dev/sr0 \ - os==sunos5;addopts:=ro;type:=udf;dev:=/dev/dsk/c0t6d0s2 -@end example - -@c ---------------------------------------------------------------- -@node Loopback Filesystem, Memory/RAM Filesystem, UDF 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:: -* sun_map_syntax 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, sun_map_syntax 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 sun_map_syntax Parameter, , selectors_in_defaults Parameter, Common Parameters -@comment node-name, next, previous, up -@subsection @t{sun_map_syntax} Parameter -@cindex sun_map_syntax Parameter - -(type=boolean, default=@samp{no}). If @samp{yes}, then @i{Amd} will -parse the map according to the Sun Automount syntax. - - -@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/mtab"). 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=``defaults''). 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 defaults -an alias for "fatal,error,user,warning,info" -@item debug -debug messages -@item error -non-fatal system errors (cannot be turned off) -@item fatal -fatal errors (cannot be turned off) -@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 = defaults -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 -q option:: Suppress synchronous unmounting errors. -* 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 -q 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 -q option, Amq -s option, Amq -P option, Controlling Amd -@comment node-name, next, previous, up -@subsection @i{Amq} @code{-q} option -@cindex Unmounting a filesystem - -Suppress any error messages produced when a synchronous unmount fails. -See @ref{Amq -u option}. - -@c ---------------------------------------------------------------- -@node Amq -s option, Amq -T option, Amq -q 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. If @code{-u} -is repeated, then @i{Amd} will attempt to unmount the filesystem -synchronously. This makes things like - -@example -amq -uu /t/cd0d && eject cd0 -@end example - -@noindent -work as expected. Any error messages this might produce can be -suppressed with the @code{-q} option. See @ref{Amq -q option}. - -@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 the @code{-x} flag, it disallows turning off the -@samp{fatal} or @samp{error} flags. Both are on by default. They are -mandatory so that @i{Amd} could report important errors, including -errors relating to turning flags on/off. - -@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{}, 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{} - | "@{" @i{list(}host_attrs@i{)} "@}" @var{} - ; - -host_attrs : host_attr "=" @var{} - | 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{} "@{" @i{list(}netif_attrs@i{)} "@}" ; - -netif_attrs : netif_attr "=" @var{} ; - -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{} "@{" @i{list(}fs_data@i{)} "@}" ; - -fs_data : fs_data_attr "=" @var{} - | mount - ; - -fs_data_attr - : "fstype" | "opts" | "passno" - | "freq" | "dumpset" | "log" - ; -@end example - -Here, @var{} 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{} "@{" @i{list(}vol_tree_info@i{)} vol_tree "@}" ; - -vol_tree_info - : "exportfs" @var{} - | "volname" @var{} - | "sel" @var{} - ; -@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{} @i{list(}localinfo@i{)} ; - -localinfo : localinfo_attr @var{} ; - -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{} ; - -automount_tree - : @i{list(}automount_attr@i{)} - ; - -automount_attr - : @var{} "=" @var{} - | @var{} "->" @var{} - | @var{} "@{" automount_tree "@}" - ; -@end example - -If @var{} 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 -@uref{http://www.cs.sunysb.edu/~ezk,Erez Zadok} and -@email{dupuy AT 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:: -* 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, fix-amd-map, 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 fix-amd-map, fixmount, ctl-hlfsd, 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 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 @uref{http://www.cs.sunysb.edu/~ezk,Erez Zadok} -@item @email{ionut AT badula.org,Ion Badulescu} -@item @email{ro AT techfak.uni-bielefeld.de,Rainer Orth} -@item @email{nick.williams AT 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 AT 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 Index: contrib/amd/doc/stamp-vti =================================================================== --- contrib/amd/doc/stamp-vti +++ /dev/null @@ -1,4 +0,0 @@ -@set UPDATED 28 October 2014 -@set UPDATED-MONTH October 2014 -@set EDITION 6.2 -@set VERSION 6.2 Index: contrib/amd/doc/texinfo.tex =================================================================== --- contrib/amd/doc/texinfo.tex +++ /dev/null @@ -1,10079 +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{2013-02-01.11} -% -% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, -% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -% 2007, 2008, 2009, 2010, 2011, 2012, 2013 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 3 of the -% License, 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 program. If not, see . -% -% 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 Exception is an additional permission under section 7 -% of the GNU General Public License, version 3 ("GPLv3"). -% -% Please try the latest version of texinfo.tex before submitting bug -% reports; you can get the latest version from: -% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or -% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or -% http://www.gnu.org/software/texinfo/ (the Texinfo home page) -% 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} - -\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\ptexinsert=\insert -\let\ptexlbrace=\{ -\let\ptexless=< -\let\ptexnewwrite\newwrite -\let\ptexnoindent=\noindent -\let\ptexplus=+ -\let\ptexraggedright=\raggedright -\let\ptexrbrace=\} -\let\ptexslash=\/ -\let\ptexstar=\* -\let\ptext=\t -\let\ptextop=\top -{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode - -% 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\putworderror\undefined \gdef\putworderror{error}\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 - -% Since the category of space is not known, we have to be careful. -\chardef\spacecat = 10 -\def\spaceisspace{\catcode`\ =\spacecat} - -% sometimes characters are active, so we need control sequences. -\chardef\ampChar = `\& -\chardef\colonChar = `\: -\chardef\commaChar = `\, -\chardef\dashChar = `\- -\chardef\dotChar = `\. -\chardef\exclamChar= `\! -\chardef\hashChar = `\# -\chardef\lquoteChar= `\` -\chardef\questChar = `\? -\chardef\rquoteChar= `\' -\chardef\semiChar = `\; -\chardef\slashChar = `\/ -\chardef\underChar = `\_ - -% 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 } - -% 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\thisisundefined\else % etex gives us more logging - \tracingscantokens1 - \tracingifs1 - \tracinggroups1 - \tracingnesting2 - \tracingassigns1 - \fi - \tracingcommands3 % 3 gives us more in etex - \errorcontextlines16 -}% - -% @errormsg{MSG}. Do the index-like expansions on MSG, but if things -% aren't perfect, it's not the end of the world, being an error message, -% after all. -% -\def\errormsg{\begingroup \indexnofonts \doerrormsg} -\def\doerrormsg#1{\errmessage{#1}} - -% 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} - -% 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 - -% Output a mark which sets \thischapter, \thissection and \thiscolor. -% We dump everything together because we only have one kind of mark. -% This works because we only use \botmark / \topmark, not \firstmark. -% -% A mark contains a subexpression of the \ifcase ... \fi construct. -% \get*marks macros below extract the needed part using \ifcase. -% -% Another complication is to let the user choose whether \thischapter -% (\thissection) refers to the chapter (section) in effect at the top -% of a page, or that at the bottom of a page. The solution is -% described on page 260 of The TeXbook. It involves outputting two -% marks for the sectioning macros, one before the section break, and -% one after. I won't pretend I can describe this better than DEK... -\def\domark{% - \toks0=\expandafter{\lastchapterdefs}% - \toks2=\expandafter{\lastsectiondefs}% - \toks4=\expandafter{\prevchapterdefs}% - \toks6=\expandafter{\prevsectiondefs}% - \toks8=\expandafter{\lastcolordefs}% - \mark{% - \the\toks0 \the\toks2 - \noexpand\or \the\toks4 \the\toks6 - \noexpand\else \the\toks8 - }% -} -% \topmark doesn't work for the very first chapter (after the title -% page or the contents), so we use \firstmark there -- this gets us -% the mark with the chapter defs, unless the user sneaks in, e.g., -% @setcolor (or @url, or @link, etc.) between @contents and the very -% first @chapter. -\def\gettopheadingmarks{% - \ifcase0\topmark\fi - \ifx\thischapter\empty \ifcase0\firstmark\fi \fi -} -\def\getbottomheadingmarks{\ifcase1\botmark\fi} -\def\getcolormarks{\ifcase2\topmark\fi} - -% Avoid "undefined control sequence" errors. -\def\lastchapterdefs{} -\def\lastsectiondefs{} -\def\prevchapterdefs{} -\def\prevsectiondefs{} -\def\lastcolordefs{} - -% 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). - \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi - \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% - \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi - \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. - % - \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. - % We don't want .vr (or whatever) entries like this: - % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} - % "\acronym" won't work when it's read back in; - % it needs to be - % {\code {{\tt \backslashcurfont }acronym} - \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 \oddfootingyyy.) - % The \baselineskip=24pt in plain's \makefootline has no effect. - \vskip 24pt - \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 \indexdummies - \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\relax \unvbox#1\relax -\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\argtorun{#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 occurrence of `\^^M' or `\^^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 - % Do not use \next, perhaps the caller of \parsearg uses it; 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 \argtorun. -% (Similarly, 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\argtorun\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 environments; they don't open a group. (The -% implementation of @end takes care not to call \endgroup in this -% special case.) - - -% At run-time, 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 -} - -% Environment mismatch, #1 expected: -\def\badenverr{% - \errhelp = \EMsimple - \errmessage{This command can appear only \inenvironment\temp, - not \inenvironment\thisenv}% -} -\def\inenvironment#1{% - \ifx#1\empty - outside 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. - \expandafter\checkenv\csname#1\endcsname - \csname E#1\endcsname - \endgroup - \fi -} - -\newhelp\EMsimple{Press RETURN to continue.} - - -% 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\*{\unskip\hfil\break\hbox{}\ignorespaces} - -% @/ allows a line break. -\let\/=\allowbreak - -% @. is an end-of-sentence period. -\def\.{.\spacefactor=\endofsentencespacefactor\space} - -% @! is an end-of-sentence bang. -\def\!{!\spacefactor=\endofsentencespacefactor\space} - -% @? is an end-of-sentence query. -\def\?{?\spacefactor=\endofsentencespacefactor\space} - -% @frenchspacing on|off says whether to put extra space after punctuation. -% -\def\onword{on} -\def\offword{off} -% -\parseargdef\frenchspacing{% - \def\temp{#1}% - \ifx\temp\onword \plainfrenchspacing - \else\ifx\temp\offword \plainnonfrenchspacing - \else - \errhelp = \EMsimple - \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% - \fi\fi -} - -% @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 - -\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'. Not documented, written for gawk manual. -% -\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 -} - -% @| 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). This command -% is not documented, not supported, and doesn't work. -% -\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 - }% - }% -} - -% @include FILE -- \input text of FILE. -% -\def\include{\parseargusing\filenamecatcodes\includezzz} -\def\includezzz#1{% - \pushthisfilestack - \def\thisfile{#1}% - {% - \makevalueexpandable % we want to expand any @value in FILE. - \turnoffactive % and allow special characters in the expansion - \indexnofonts % Allow `@@' and other weird things in file names. - \wlog{texinfo.tex: doing @include of #1^^J}% - \edef\temp{\noexpand\input #1 }% - % - % This trickery is to read FILE outside of a group, in case it makes - % definitions, etc. - \expandafter - }\temp - \popthisfilestack -} -\def\filenamecatcodes{% - \catcode`\\=\other - \catcode`~=\other - \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\centersub\centerH - \else - \let\centersub\centerV - \fi - \centersub{\hfil \ignorespaces#1\unskip \hfil}% - \let\centersub\relax % don't let the definition persist, just in case -} -\def\centerH#1{{% - \hfil\break - \advance\hsize by -\leftskip - \advance\hsize by -\rightskip - \line{#1}% - \break -}} -% -\newcount\centerpenalty -\def\centerV#1{% - % The idea here is the same as in \startdefun, \cartouche, etc.: if - % @center is the first thing after a section heading, we need to wipe - % out the negative parskip inserted by \sectionheading, but still - % prevent a page break here. - \centerpenalty = \lastpenalty - \ifnum\centerpenalty>10000 \vskip\parskip \fi - \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi - \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 = {}% -} - - -% @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 being undefined. -\ifx\pdfoutput\thisisundefined -\else - \ifx\pdfoutput\relax - \else - \ifcase\pdfoutput - \else - \pdftrue - \fi - \fi -\fi - -% PDF uses PostScript string constants for the names of xref targets, -% for display in the outlines, and in other places. Thus, we have to -% double any backslashes. Otherwise, a name like "\node" will be -% interpreted as a newline (\n), followed by o, d, e. Not good. -% -% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and -% related messages. The final outcome is that it is up to the TeX user -% to double the backslashes and otherwise make the string valid, so -% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to -% do this reliably, so we use it. - -% #1 is a control sequence in which to do the replacements, -% which we \xdef. -\def\txiescapepdf#1{% - \ifx\pdfescapestring\thisisundefined - % No primitive available; should we give a warning or log? - % Many times it won't matter. - \else - % The expandable \pdfescapestring primitive escapes parentheses, - % backslashes, and other special chars. - \xdef#1{\pdfescapestring{#1}}% - \fi -} - -\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images -with PDF output, and none of those formats could be found. (.eps cannot -be supported due to the design of the PDF format; use regular TeX (DVI -output) for that.)} - -\ifpdf - % - % Color manipulation macros based on pdfcolor.tex, - % except using rgb instead of cmyk; the latter is said to render as a - % very dark gray on-screen and a very dark halftone in print, instead - % of actual black. - \def\rgbDarkRed{0.50 0.09 0.12} - \def\rgbBlack{0 0 0} - % - % k sets the color for filling (usual text, etc.); - % K sets the color for stroking (thin rules, e.g., normal _'s). - \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} - % - % Set color, and create a mark which defines \thiscolor accordingly, - % so that \makeheadline knows which color to restore. - \def\setcolor#1{% - \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% - \domark - \pdfsetcolor{#1}% - } - % - \def\maincolor{\rgbBlack} - \pdfsetcolor{\maincolor} - \edef\thiscolor{\maincolor} - \def\lastcolordefs{} - % - \def\makefootline{% - \baselineskip24pt - \line{\pdfsetcolor{\maincolor}\the\footline}% - } - % - \def\makeheadline{% - \vbox to 0pt{% - \vskip-22.5pt - \line{% - \vbox to8.5pt{}% - % Extract \thiscolor definition from the marks. - \getcolormarks - % Typeset the headline with \maincolor, then restore the color. - \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% - }% - \vss - }% - \nointerlineskip - } - % - % - \pdfcatalog{/PageMode /UseOutlines} - % - % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). - \def\dopdfimage#1#2#3{% - \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% - \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% - % - % pdftex (and the PDF format) support .pdf, .png, .jpg (among - % others). Let's try in that order, PDF first since if - % someone has a scalable image, presumably better to use that than a - % bitmap. - \let\pdfimgext=\empty - \begingroup - \openin 1 #1.pdf \ifeof 1 - \openin 1 #1.PDF \ifeof 1 - \openin 1 #1.png \ifeof 1 - \openin 1 #1.jpg \ifeof 1 - \openin 1 #1.jpeg \ifeof 1 - \openin 1 #1.JPG \ifeof 1 - \errhelp = \nopdfimagehelp - \errmessage{Could not find image file #1 for pdf}% - \else \gdef\pdfimgext{JPG}% - \fi - \else \gdef\pdfimgext{jpeg}% - \fi - \else \gdef\pdfimgext{jpg}% - \fi - \else \gdef\pdfimgext{png}% - \fi - \else \gdef\pdfimgext{PDF}% - \fi - \else \gdef\pdfimgext{pdf}% - \fi - \closein 1 - \endgroup - % - % without \immediate, ancient 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 - \ifdim \wd0 >0pt width \pdfimagewidth \fi - \ifdim \wd2 >0pt height \pdfimageheight \fi - \ifnum\pdftexversion<13 - #1.\pdfimgext - \else - {#1.\pdfimgext}% - \fi - \ifnum\pdftexversion < 14 \else - \pdfrefximage \pdflastximage - \fi} - % - \def\pdfmkdest#1{{% - % We have to set dummies so commands such as @code, and characters - % such as \, aren't expanded when present in a section title. - \indexnofonts - \turnoffactive - \makevalueexpandable - \def\pdfdestname{#1}% - \txiescapepdf\pdfdestname - \safewhatsit{\pdfdest name{\pdfdestname} xyz}% - }} - % - % used to mark target names; must be expandable. - \def\pdfmkpgn#1{#1} - % - % by default, use a color that is dark enough to print on paper as - % nearly black, but still distinguishable for online viewing. - \def\urlcolor{\rgbDarkRed} - \def\linkcolor{\rgbDarkRed} - \def\endlink{\setcolor{\maincolor}\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, which is what will be displayed in the - % outline by the pdf viewer. #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 worth the trouble, since most documents are normally structured. - \edef\pdfoutlinedest{#3}% - \ifx\pdfoutlinedest\empty - \def\pdfoutlinedest{#4}% - \else - \txiescapepdf\pdfoutlinedest - \fi - % - % Also escape PDF chars in the display string. - \edef\pdfoutlinetext{#1}% - \txiescapepdf\pdfoutlinetext - % - \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% - } - % - \def\pdfmakeoutlines{% - \begingroup - % Read toc silently, to get counts of subentries for \pdfoutline. - \def\partentry##1##2##3##4{}% ignore parts in the outlines - \def\numchapentry##1##2##3##4{% - \def\thischapnum{##2}% - \def\thissecnum{0}% - \def\thissubsecnum{0}% - }% - \def\numsecentry##1##2##3##4{% - \advancenumber{chap\thischapnum}% - \def\thissecnum{##2}% - \def\thissubsecnum{0}% - }% - \def\numsubsecentry##1##2##3##4{% - \advancenumber{sec\thissecnum}% - \def\thissubsecnum{##2}% - }% - \def\numsubsubsecentry##1##2##3##4{% - \advancenumber{subsec\thissubsecnum}% - }% - \def\thischapnum{0}% - \def\thissecnum{0}% - \def\thissubsecnum{0}% - % - % 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}% - \readdatafile{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. - % - % TODO this right, we have to translate 8-bit characters to - % their "best" equivalent, based on the @documentencoding. Too - % much work for too little return. Just use the ASCII equivalents - % we use for the index sort strings. - % - \indexnofonts - \setupdatafile - % We can have normal brace characters in the PDF outlines, unlike - % Texinfo index files. So set that up. - \def\{{\lbracecharliteral}% - \def\}{\rbracecharliteral}% - \catcode`\\=\active \otherbackslash - \input \tocreadfilename - \endgroup - } - {\catcode`[=1 \catcode`]=2 - \catcode`{=\other \catcode`}=\other - \gdef\lbracecharliteral[{]% - \gdef\rbracecharliteral[}]% - ] - % - \def\skipspaces#1{\def\PP{#1}\def\D{|}% - \ifx\PP\D\let\nextsp\relax - \else\let\nextsp\skipspaces - \addtokens{\filename}{\PP}% - \advance\filenamelength by 1 - \fi - \nextsp} - \def\getfilename#1{% - \filenamelength=0 - % If we don't expand the argument now, \skipspaces will get - % snagged on things like "@value{foo}". - \edef\temp{#1}% - \expandafter\skipspaces\temp|\relax - } - \ifnum\pdftexversion < 14 - \let \startlink \pdfannotlink - \else - \let \startlink \pdfstartlink - \fi - % make a live url in pdf output. - \def\pdfurl#1{% - \begingroup - % it seems we really need yet another set of dummies; have not - % tried to figure out what each command should do in the context - % of @url. for now, just make @/ a no-op, that's the only one - % people have actually reported a problem with. - % - \normalturnoffactive - \def\@{@}% - \let\/=\empty - \makevalueexpandable - % do we want to go so far as to use \indexnofonts instead of just - % special-casing \var here? - \def\var##1{##1}% - % - \leavevmode\setcolor{\urlcolor}% - \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}} - \setcolor{\linkcolor}#1\endlink} - \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} -\else - % non-pdf mode - \let\pdfmkdest = \gobble - \let\pdfurl = \gobble - \let\endlink = \relax - \let\setcolor = \gobble - \let\pdfsetcolor = \gobble - \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\bfstylename{bf} -\def\tt{\fam=\ttfam \setfontstyle{tt}} - -% Unfortunately, we have to override this for titles and the like, since -% in those cases "rm" is bold. Sigh. -\def\rmisbold{\rm\def\curfontstyle{bf}} - -% 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}} - - -% 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} -% -% can get a sort of poor man's double spacing by redefining this. -\def\baselinefactor{1} -% -\newdimen\textleading -\def\setleading#1{% - \dimen0 = #1\relax - \normalbaselineskip = \baselinefactor\dimen0 - \normallineskip = \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% -} - -% PDF CMaps. See also LaTeX's t1.cmap. -% -% do nothing with this by default. -\expandafter\let\csname cmapOT1\endcsname\gobble -\expandafter\let\csname cmapOT1IT\endcsname\gobble -\expandafter\let\csname cmapOT1TT\endcsname\gobble - -% if we are producing pdf, and we have \pdffontattr, then define cmaps. -% (\pdffontattr was introduced many years ago, but people still run -% older pdftex's; it's easy to conditionalize, so we do.) -\ifpdf \ifx\pdffontattr\thisisundefined \else - \begingroup - \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. - \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-OT1-0) -%%Title: (TeX-OT1-0 TeX OT1 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (OT1) -/Supplement 0 ->> def -/CMapName /TeX-OT1-0 def -/CMapType 2 def -1 begincodespacerange -<00> <7F> -endcodespacerange -8 beginbfrange -<00> <01> <0393> -<09> <0A> <03A8> -<23> <26> <0023> -<28> <3B> <0028> -<3F> <5B> <003F> -<5D> <5E> <005D> -<61> <7A> <0061> -<7B> <7C> <2013> -endbfrange -40 beginbfchar -<02> <0398> -<03> <039B> -<04> <039E> -<05> <03A0> -<06> <03A3> -<07> <03D2> -<08> <03A6> -<0B> <00660066> -<0C> <00660069> -<0D> <0066006C> -<0E> <006600660069> -<0F> <00660066006C> -<10> <0131> -<11> <0237> -<12> <0060> -<13> <00B4> -<14> <02C7> -<15> <02D8> -<16> <00AF> -<17> <02DA> -<18> <00B8> -<19> <00DF> -<1A> <00E6> -<1B> <0153> -<1C> <00F8> -<1D> <00C6> -<1E> <0152> -<1F> <00D8> -<21> <0021> -<22> <201D> -<27> <2019> -<3C> <00A1> -<3D> <003D> -<3E> <00BF> -<5C> <201C> -<5F> <02D9> -<60> <2018> -<7D> <02DD> -<7E> <007E> -<7F> <00A8> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF - }\endgroup - \expandafter\edef\csname cmapOT1\endcsname#1{% - \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% - }% -% -% \cmapOT1IT - \begingroup - \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. - \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-OT1IT-0) -%%Title: (TeX-OT1IT-0 TeX OT1IT 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (OT1IT) -/Supplement 0 ->> def -/CMapName /TeX-OT1IT-0 def -/CMapType 2 def -1 begincodespacerange -<00> <7F> -endcodespacerange -8 beginbfrange -<00> <01> <0393> -<09> <0A> <03A8> -<25> <26> <0025> -<28> <3B> <0028> -<3F> <5B> <003F> -<5D> <5E> <005D> -<61> <7A> <0061> -<7B> <7C> <2013> -endbfrange -42 beginbfchar -<02> <0398> -<03> <039B> -<04> <039E> -<05> <03A0> -<06> <03A3> -<07> <03D2> -<08> <03A6> -<0B> <00660066> -<0C> <00660069> -<0D> <0066006C> -<0E> <006600660069> -<0F> <00660066006C> -<10> <0131> -<11> <0237> -<12> <0060> -<13> <00B4> -<14> <02C7> -<15> <02D8> -<16> <00AF> -<17> <02DA> -<18> <00B8> -<19> <00DF> -<1A> <00E6> -<1B> <0153> -<1C> <00F8> -<1D> <00C6> -<1E> <0152> -<1F> <00D8> -<21> <0021> -<22> <201D> -<23> <0023> -<24> <00A3> -<27> <2019> -<3C> <00A1> -<3D> <003D> -<3E> <00BF> -<5C> <201C> -<5F> <02D9> -<60> <2018> -<7D> <02DD> -<7E> <007E> -<7F> <00A8> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF - }\endgroup - \expandafter\edef\csname cmapOT1IT\endcsname#1{% - \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% - }% -% -% \cmapOT1TT - \begingroup - \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. - \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-OT1TT-0) -%%Title: (TeX-OT1TT-0 TeX OT1TT 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (OT1TT) -/Supplement 0 ->> def -/CMapName /TeX-OT1TT-0 def -/CMapType 2 def -1 begincodespacerange -<00> <7F> -endcodespacerange -5 beginbfrange -<00> <01> <0393> -<09> <0A> <03A8> -<21> <26> <0021> -<28> <5F> <0028> -<61> <7E> <0061> -endbfrange -32 beginbfchar -<02> <0398> -<03> <039B> -<04> <039E> -<05> <03A0> -<06> <03A3> -<07> <03D2> -<08> <03A6> -<0B> <2191> -<0C> <2193> -<0D> <0027> -<0E> <00A1> -<0F> <00BF> -<10> <0131> -<11> <0237> -<12> <0060> -<13> <00B4> -<14> <02C7> -<15> <02D8> -<16> <00AF> -<17> <02DA> -<18> <00B8> -<19> <00DF> -<1A> <00E6> -<1B> <0153> -<1C> <00F8> -<1D> <00C6> -<1E> <0152> -<1F> <00D8> -<20> <2423> -<27> <2019> -<60> <2018> -<7F> <00A8> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF - }\endgroup - \expandafter\edef\csname cmapOT1TT\endcsname#1{% - \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% - }% -\fi\fi - - -% Set the font macro #1 to the font named \fontprefix#2. -% #3 is the font's design size, #4 is a scale factor, #5 is the CMap -% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). -% Example: -% #1 = \textrm -% #2 = \rmshape -% #3 = 10 -% #4 = \mainmagstep -% #5 = OT1 -% -\def\setfont#1#2#3#4#5{% - \font#1=\fontprefix#2#3 scaled #4 - \csname cmap#5\endcsname#1% -} -% This is what gets called when #5 of \setfont is empty. -\let\cmap\gobble -% -% (end of cmaps) - -% Use cm as the default font prefix. -% To specify the font prefix, you must define \fontprefix -% before you read in texinfo.tex. -\ifx\fontprefix\thisisundefined -\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} - -% Definitions for a main text size of 11pt. (The default in Texinfo.) -% -\def\definetextfontsizexi{% -% Text fonts (11.2pt, magstep1). -\def\textnominalsize{11pt} -\edef\mainmagstep{\magstephalf} -\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} -\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} -\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} -\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} -\setfont\textsl\slshape{10}{\mainmagstep}{OT1} -\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} -\setfont\textsc\scshape{10}{\mainmagstep}{OT1} -\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep -\def\textecsize{1095} - -% A few fonts for @defun names and args. -\setfont\defbf\bfshape{10}{\magstep1}{OT1} -\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} -\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} - -% Fonts for indices, footnotes, small examples (9pt). -\def\smallnominalsize{9pt} -\setfont\smallrm\rmshape{9}{1000}{OT1} -\setfont\smalltt\ttshape{9}{1000}{OT1TT} -\setfont\smallbf\bfshape{10}{900}{OT1} -\setfont\smallit\itshape{9}{1000}{OT1IT} -\setfont\smallsl\slshape{9}{1000}{OT1} -\setfont\smallsf\sfshape{9}{1000}{OT1} -\setfont\smallsc\scshape{10}{900}{OT1} -\setfont\smallttsl\ttslshape{10}{900}{OT1TT} -\font\smalli=cmmi9 -\font\smallsy=cmsy9 -\def\smallecsize{0900} - -% Fonts for small examples (8pt). -\def\smallernominalsize{8pt} -\setfont\smallerrm\rmshape{8}{1000}{OT1} -\setfont\smallertt\ttshape{8}{1000}{OT1TT} -\setfont\smallerbf\bfshape{10}{800}{OT1} -\setfont\smallerit\itshape{8}{1000}{OT1IT} -\setfont\smallersl\slshape{8}{1000}{OT1} -\setfont\smallersf\sfshape{8}{1000}{OT1} -\setfont\smallersc\scshape{10}{800}{OT1} -\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} -\font\smalleri=cmmi8 -\font\smallersy=cmsy8 -\def\smallerecsize{0800} - -% Fonts for title page (20.4pt): -\def\titlenominalsize{20pt} -\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} -\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} -\setfont\titlesl\slbshape{10}{\magstep4}{OT1} -\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} -\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} -\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} -\let\titlebf=\titlerm -\setfont\titlesc\scbshape{10}{\magstep4}{OT1} -\font\titlei=cmmi12 scaled \magstep3 -\font\titlesy=cmsy10 scaled \magstep4 -\def\titleecsize{2074} - -% Chapter (and unnumbered) fonts (17.28pt). -\def\chapnominalsize{17pt} -\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} -\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} -\setfont\chapsl\slbshape{10}{\magstep3}{OT1} -\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} -\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} -\setfont\chapsf\sfbshape{17}{1000}{OT1} -\let\chapbf=\chaprm -\setfont\chapsc\scbshape{10}{\magstep3}{OT1} -\font\chapi=cmmi12 scaled \magstep2 -\font\chapsy=cmsy10 scaled \magstep3 -\def\chapecsize{1728} - -% Section fonts (14.4pt). -\def\secnominalsize{14pt} -\setfont\secrm\rmbshape{12}{\magstep1}{OT1} -\setfont\secit\itbshape{10}{\magstep2}{OT1IT} -\setfont\secsl\slbshape{10}{\magstep2}{OT1} -\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} -\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} -\setfont\secsf\sfbshape{12}{\magstep1}{OT1} -\let\secbf\secrm -\setfont\secsc\scbshape{10}{\magstep2}{OT1} -\font\seci=cmmi12 scaled \magstep1 -\font\secsy=cmsy10 scaled \magstep2 -\def\sececsize{1440} - -% Subsection fonts (13.15pt). -\def\ssecnominalsize{13pt} -\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} -\setfont\ssecit\itbshape{10}{1315}{OT1IT} -\setfont\ssecsl\slbshape{10}{1315}{OT1} -\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} -\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} -\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} -\let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{1315}{OT1} -\font\sseci=cmmi12 scaled \magstephalf -\font\ssecsy=cmsy10 scaled 1315 -\def\ssececsize{1200} - -% Reduced fonts for @acro in text (10pt). -\def\reducednominalsize{10pt} -\setfont\reducedrm\rmshape{10}{1000}{OT1} -\setfont\reducedtt\ttshape{10}{1000}{OT1TT} -\setfont\reducedbf\bfshape{10}{1000}{OT1} -\setfont\reducedit\itshape{10}{1000}{OT1IT} -\setfont\reducedsl\slshape{10}{1000}{OT1} -\setfont\reducedsf\sfshape{10}{1000}{OT1} -\setfont\reducedsc\scshape{10}{1000}{OT1} -\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} -\font\reducedi=cmmi10 -\font\reducedsy=cmsy10 -\def\reducedecsize{1000} - -\textleading = 13.2pt % line spacing for 11pt CM -\textfonts % reset the current fonts -\rm -} % end of 11pt text font size definitions, \definetextfontsizexi - - -% Definitions to make the main text be 10pt Computer Modern, with -% section, chapter, etc., sizes following suit. This is for the GNU -% Press printing of the Emacs 22 manual. Maybe other manuals in the -% future. Used with @smallbook, which sets the leading to 12pt. -% -\def\definetextfontsizex{% -% Text fonts (10pt). -\def\textnominalsize{10pt} -\edef\mainmagstep{1000} -\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} -\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} -\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} -\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} -\setfont\textsl\slshape{10}{\mainmagstep}{OT1} -\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} -\setfont\textsc\scshape{10}{\mainmagstep}{OT1} -\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep -\def\textecsize{1000} - -% A few fonts for @defun names and args. -\setfont\defbf\bfshape{10}{\magstephalf}{OT1} -\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} -\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} - -% Fonts for indices, footnotes, small examples (9pt). -\def\smallnominalsize{9pt} -\setfont\smallrm\rmshape{9}{1000}{OT1} -\setfont\smalltt\ttshape{9}{1000}{OT1TT} -\setfont\smallbf\bfshape{10}{900}{OT1} -\setfont\smallit\itshape{9}{1000}{OT1IT} -\setfont\smallsl\slshape{9}{1000}{OT1} -\setfont\smallsf\sfshape{9}{1000}{OT1} -\setfont\smallsc\scshape{10}{900}{OT1} -\setfont\smallttsl\ttslshape{10}{900}{OT1TT} -\font\smalli=cmmi9 -\font\smallsy=cmsy9 -\def\smallecsize{0900} - -% Fonts for small examples (8pt). -\def\smallernominalsize{8pt} -\setfont\smallerrm\rmshape{8}{1000}{OT1} -\setfont\smallertt\ttshape{8}{1000}{OT1TT} -\setfont\smallerbf\bfshape{10}{800}{OT1} -\setfont\smallerit\itshape{8}{1000}{OT1IT} -\setfont\smallersl\slshape{8}{1000}{OT1} -\setfont\smallersf\sfshape{8}{1000}{OT1} -\setfont\smallersc\scshape{10}{800}{OT1} -\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} -\font\smalleri=cmmi8 -\font\smallersy=cmsy8 -\def\smallerecsize{0800} - -% Fonts for title page (20.4pt): -\def\titlenominalsize{20pt} -\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} -\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} -\setfont\titlesl\slbshape{10}{\magstep4}{OT1} -\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} -\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} -\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} -\let\titlebf=\titlerm -\setfont\titlesc\scbshape{10}{\magstep4}{OT1} -\font\titlei=cmmi12 scaled \magstep3 -\font\titlesy=cmsy10 scaled \magstep4 -\def\titleecsize{2074} - -% Chapter fonts (14.4pt). -\def\chapnominalsize{14pt} -\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} -\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} -\setfont\chapsl\slbshape{10}{\magstep2}{OT1} -\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} -\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} -\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} -\let\chapbf\chaprm -\setfont\chapsc\scbshape{10}{\magstep2}{OT1} -\font\chapi=cmmi12 scaled \magstep1 -\font\chapsy=cmsy10 scaled \magstep2 -\def\chapecsize{1440} - -% Section fonts (12pt). -\def\secnominalsize{12pt} -\setfont\secrm\rmbshape{12}{1000}{OT1} -\setfont\secit\itbshape{10}{\magstep1}{OT1IT} -\setfont\secsl\slbshape{10}{\magstep1}{OT1} -\setfont\sectt\ttbshape{12}{1000}{OT1TT} -\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} -\setfont\secsf\sfbshape{12}{1000}{OT1} -\let\secbf\secrm -\setfont\secsc\scbshape{10}{\magstep1}{OT1} -\font\seci=cmmi12 -\font\secsy=cmsy10 scaled \magstep1 -\def\sececsize{1200} - -% Subsection fonts (10pt). -\def\ssecnominalsize{10pt} -\setfont\ssecrm\rmbshape{10}{1000}{OT1} -\setfont\ssecit\itbshape{10}{1000}{OT1IT} -\setfont\ssecsl\slbshape{10}{1000}{OT1} -\setfont\ssectt\ttbshape{10}{1000}{OT1TT} -\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} -\setfont\ssecsf\sfbshape{10}{1000}{OT1} -\let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{1000}{OT1} -\font\sseci=cmmi10 -\font\ssecsy=cmsy10 -\def\ssececsize{1000} - -% Reduced fonts for @acro in text (9pt). -\def\reducednominalsize{9pt} -\setfont\reducedrm\rmshape{9}{1000}{OT1} -\setfont\reducedtt\ttshape{9}{1000}{OT1TT} -\setfont\reducedbf\bfshape{10}{900}{OT1} -\setfont\reducedit\itshape{9}{1000}{OT1IT} -\setfont\reducedsl\slshape{9}{1000}{OT1} -\setfont\reducedsf\sfshape{9}{1000}{OT1} -\setfont\reducedsc\scshape{10}{900}{OT1} -\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} -\font\reducedi=cmmi9 -\font\reducedsy=cmsy9 -\def\reducedecsize{0900} - -\divide\parskip by 2 % reduce space between paragraphs -\textleading = 12pt % line spacing for 10pt CM -\textfonts % reset the current fonts -\rm -} % end of 10pt text font size definitions, \definetextfontsizex - - -% We provide the user-level command -% @fonttextsize 10 -% (or 11) to redefine the text font size. pt is assumed. -% -\def\xiword{11} -\def\xword{10} -\def\xwordpt{10pt} -% -\parseargdef\fonttextsize{% - \def\textsizearg{#1}% - %\wlog{doing @fonttextsize \textsizearg}% - % - % Set \globaldefs so that documents can use this inside @tex, since - % makeinfo 4.8 does not support it, but we need it nonetheless. - % - \begingroup \globaldefs=1 - \ifx\textsizearg\xword \definetextfontsizex - \else \ifx\textsizearg\xiword \definetextfontsizexi - \else - \errhelp=\EMsimple - \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} - \fi\fi - \endgroup -} - - -% 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\curfontsize{text}% - \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\curfontsize{title}% - \def\lsize{chap}\def\lllsize{subsec}% - \resetmathfonts \setleading{27pt}} -\def\titlefont#1{{\titlefonts\rmisbold #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\curfontsize{chap}% - \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\curfontsize{sec}% - \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\curfontsize{ssec}% - \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\curfontsize{reduced}% - \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\curfontsize{small}% - \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\curfontsize{smaller}% - \def\lsize{smaller}\def\lllsize{smaller}% - \resetmathfonts \setleading{9.5pt}} - -% Fonts for short table of contents. -\setfont\shortcontrm\rmshape{12}{1000}{OT1} -\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 -\setfont\shortcontsl\slshape{12}{1000}{OT1} -\setfont\shortconttt\ttshape{12}{1000}{OT1TT} - -% Define these just so they can be easily changed for other fonts. -\def\angleleft{$\langle$} -\def\angleright{$\rangle$} - -% 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 -% --karl, 24jan03. - -% Set up the default fonts, so we can use them for creating boxes. -% -\definetextfontsizexi - - -\message{markup,} - -% 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 } - -% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will -% define and register \INITMACRO to be called on markup style changes. -% \INITMACRO can check \currentmarkupstyle for the innermost -% style and the set of \ifmarkupSTYLE switches for all styles -% currently in effect. -\newif\ifmarkupvar -\newif\ifmarkupsamp -\newif\ifmarkupkey -%\newif\ifmarkupfile % @file == @samp. -%\newif\ifmarkupoption % @option == @samp. -\newif\ifmarkupcode -\newif\ifmarkupkbd -%\newif\ifmarkupenv % @env == @code. -%\newif\ifmarkupcommand % @command == @code. -\newif\ifmarkuptex % @tex (and part of @math, for now). -\newif\ifmarkupexample -\newif\ifmarkupverb -\newif\ifmarkupverbatim - -\let\currentmarkupstyle\empty - -\def\setupmarkupstyle#1{% - \csname markup#1true\endcsname - \def\currentmarkupstyle{#1}% - \markupstylesetup -} - -\let\markupstylesetup\empty - -\def\defmarkupstylesetup#1{% - \expandafter\def\expandafter\markupstylesetup - \expandafter{\markupstylesetup #1}% - \def#1% -} - -% Markup style setup for left and right quotes. -\defmarkupstylesetup\markupsetuplq{% - \expandafter\let\expandafter \temp - \csname markupsetuplq\currentmarkupstyle\endcsname - \ifx\temp\relax \markupsetuplqdefault \else \temp \fi -} - -\defmarkupstylesetup\markupsetuprq{% - \expandafter\let\expandafter \temp - \csname markupsetuprq\currentmarkupstyle\endcsname - \ifx\temp\relax \markupsetuprqdefault \else \temp \fi -} - -{ -\catcode`\'=\active -\catcode`\`=\active - -\gdef\markupsetuplqdefault{\let`\lq} -\gdef\markupsetuprqdefault{\let'\rq} - -\gdef\markupsetcodequoteleft{\let`\codequoteleft} -\gdef\markupsetcodequoteright{\let'\codequoteright} -} - -\let\markupsetuplqcode \markupsetcodequoteleft -\let\markupsetuprqcode \markupsetcodequoteright -% -\let\markupsetuplqexample \markupsetcodequoteleft -\let\markupsetuprqexample \markupsetcodequoteright -% -\let\markupsetuplqkbd \markupsetcodequoteleft -\let\markupsetuprqkbd \markupsetcodequoteright -% -\let\markupsetuplqsamp \markupsetcodequoteleft -\let\markupsetuprqsamp \markupsetcodequoteright -% -\let\markupsetuplqverb \markupsetcodequoteleft -\let\markupsetuprqverb \markupsetcodequoteright -% -\let\markupsetuplqverbatim \markupsetcodequoteleft -\let\markupsetuprqverbatim \markupsetcodequoteright - -% Allow an option to not use regular directed right quote/apostrophe -% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). -% The undirected quote is ugly, so don't make it the default, but it -% works for pasting with more pdf viewers (at least evince), the -% lilypond developers report. xpdf does work with the regular 0x27. -% -\def\codequoteright{% - \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax - \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax - '% - \else \char'15 \fi - \else \char'15 \fi -} -% -% and a similar option for the left quote char vs. a grave accent. -% Modern fonts display ASCII 0x60 as a grave accent, so some people like -% the code environments to do likewise. -% -\def\codequoteleft{% - \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax - \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax - % [Knuth] pp. 380,381,391 - % \relax disables Spanish ligatures ?` and !` of \tt font. - \relax`% - \else \char'22 \fi - \else \char'22 \fi -} - -% Commands to set the quote options. -% -\parseargdef\codequoteundirected{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETtxicodequoteundirected\endcsname - = t% - \else\ifx\temp\offword - \expandafter\let\csname SETtxicodequoteundirected\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% - \fi\fi -} -% -\parseargdef\codequotebacktick{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETtxicodequotebacktick\endcsname - = t% - \else\ifx\temp\offword - \expandafter\let\csname SETtxicodequotebacktick\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% - \fi\fi -} - -% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. -\def\noligaturesquoteleft{\relax\lq} - -% Count depth in font-changes, for error checks -\newcount\fontdepth \fontdepth=0 - -% Font commands. - -% #1 is the font command (\sl or \it), #2 is the text to slant. -% If we are in a monospaced environment, however, 1) always use \ttsl, -% and 2) do not add an italic correction. -\def\dosmartslant#1#2{% - \ifusingtt - {{\ttsl #2}\let\next=\relax}% - {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% - \next -} -\def\smartslanted{\dosmartslant\sl} -\def\smartitalic{\dosmartslant\it} - -% Output an italic correction unless \next (presumed to be the following -% character) is such as not to need one. -\def\smartitaliccorrection{% - \ifx\next,% - \else\ifx\next-% - \else\ifx\next.% - \else\ptexslash - \fi\fi\fi - \aftersmartic -} - -% Unconditional use \ttsl, and no ic. @var is set to this for defuns. -\def\ttslanted#1{{\ttsl #1}} - -% @cite is like \smartslanted except unconditionally use \sl. We never want -% ttsl for book titles, do we? -\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} - -\def\aftersmartic{} -\def\var#1{% - \let\saveaftersmartic = \aftersmartic - \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% - \smartslanted{#1}% -} - -\let\i=\smartitalic -\let\slanted=\smartslanted -\let\dfn=\smartslanted -\let\emph=\smartitalic - -% 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 - -% @b, explicit bold. Also @strong. -\def\b#1{{\bf #1}} -\let\strong=\b - -% @sansserif, explicit sans. -\def\sansserif#1{{\sf #1}} - -% 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\plainfrenchspacing{% - \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m - \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m - \def\endofsentencespacefactor{1000}% for @. and friends - } - \def\plainnonfrenchspacing{% - \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 - \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 - \def\endofsentencespacefactor{3000}% for @. and friends - } -\catcode`@=\other -\def\endofsentencespacefactor{3000}% default - -% @t, explicit typewriter. -\def\t#1{% - {\tt \rawbackslash \plainfrenchspacing #1}% - \null -} - -% @samp. -\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} - -% @indicateurl is \samp, that is, with quotes. -\let\indicateurl=\samp - -% @code (and similar) prints in typewriter, but with spaces the same -% size as normal in the surrounding text, without hyphenation, etc. -% This is a subroutine for that. -\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 - \plainfrenchspacing - #1% - }% - \null % reset spacefactor to 1000 -} - -% 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 - \catcode`\'=\active \catcode`\`=\active - \global\let'=\rq \global\let`=\lq % default definitions - % - \global\def\code{\begingroup - \setupmarkupstyle{code}% - % The following should really be moved into \setupmarkupstyle handlers. - \catcode\dashChar=\active \catcode\underChar=\active - \ifallowcodebreaks - \let-\codedash - \let_\codeunder - \else - \let-\normaldash - \let_\realunder - \fi - \codex - } -} - -\def\codex #1{\tclose{#1}\endgroup} - -\def\normaldash{-} -\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{}{}{}}% - {\_}% -} - -% An additional complication: the above will allow breaks after, e.g., -% each of the four underscores in __typeof__. This is bad. -% @allowcodebreaks provides a document-level way to turn breaking at - -% and _ on and off. -% -\newif\ifallowcodebreaks \allowcodebreakstrue - -\def\keywordtrue{true} -\def\keywordfalse{false} - -\parseargdef\allowcodebreaks{% - \def\txiarg{#1}% - \ifx\txiarg\keywordtrue - \allowcodebreakstrue - \else\ifx\txiarg\keywordfalse - \allowcodebreaksfalse - \else - \errhelp = \EMsimple - \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% - \fi\fi -} - -% For @command, @env, @file, @option quotes seem unnecessary, -% so use \code rather than \samp. -\let\command=\code -\let\env=\code -\let\file=\code -\let\option=\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. -% (This \urefnobreak definition isn't used now, leaving it for a while -% for comparison.) -\def\urefnobreak#1{\dourefnobreak #1,,,\finish} -\def\dourefnobreak#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} - -% This \urefbreak definition is the active one. -\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} -\let\uref=\urefbreak -\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} -\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example - \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\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \urefcode{#1}% only url given, so show it - \fi - \fi - \endlink -\endgroup} - -% Allow line breaks around only a few characters (only). -\def\urefcatcodes{% - \catcode\ampChar=\active \catcode\dotChar=\active - \catcode\hashChar=\active \catcode\questChar=\active - \catcode\slashChar=\active -} -{ - \urefcatcodes - % - \global\def\urefcode{\begingroup - \setupmarkupstyle{code}% - \urefcatcodes - \let&\urefcodeamp - \let.\urefcodedot - \let#\urefcodehash - \let?\urefcodequest - \let/\urefcodeslash - \codex - } - % - % By default, they are just regular characters. - \global\def&{\normalamp} - \global\def.{\normaldot} - \global\def#{\normalhash} - \global\def?{\normalquest} - \global\def/{\normalslash} -} - -% we put a little stretch before and after the breakable chars, to help -% line breaking of long url's. The unequal skips make look better in -% cmtt at least, especially for dots. -\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } -\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } -% -\def\urefcodeamp{\urefprestretch \&\urefpoststretch} -\def\urefcodedot{\urefprestretch .\urefpoststretch} -\def\urefcodehash{\urefprestretch \#\urefpoststretch} -\def\urefcodequest{\urefprestretch ?\urefpoststretch} -\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} -{ - \catcode`\/=\active - \global\def\urefcodeslashfinish{% - \urefprestretch \slashChar - % Allow line break only after the final / in a sequence of - % slashes, to avoid line break between the slashes in http://. - \ifx\next/\else \urefpoststretch \fi - } -} - -% One more complication: by default we'll break after the special -% characters, but some people like to break before the special chars, so -% allow that. Also allow no breaking at all, for manual control. -% -\parseargdef\urefbreakstyle{% - \def\txiarg{#1}% - \ifx\txiarg\wordnone - \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} - \else\ifx\txiarg\wordbefore - \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} - \else\ifx\txiarg\wordafter - \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} - \else - \errhelp = \EMsimple - \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% - \fi\fi\fi -} -\def\wordafter{after} -\def\wordbefore{before} -\def\wordnone{none} - -\urefbreakstyle after - -% @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 - -% @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\txiarg{#1}% - \ifx\txiarg\worddistinct - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% - \else\ifx\txiarg\wordexample - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% - \else\ifx\txiarg\wordcode - \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% - \else - \errhelp = \EMsimple - \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% - \fi\fi\fi -} -\def\worddistinct{distinct} -\def\wordexample{example} -\def\wordcode{code} - -% Default is `distinct'. -\kbdinputstyle distinct - -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. -\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} - -\def\xkey{\key} -\def\kbdsub#1#2#3\par{% - \def\one{#1}\def\three{#3}\def\threex{??}% - \ifx\one\xkey\ifx\threex\three \key{#2}% - \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi - \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi -} - -% definition of @key that produces a lozenge. Doesn't adjust to text size. -%\setfont\keyrm\rmshape{8}{1000}{OT1} -%\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}}}} - -% definition of @key with no lozenge. If the current font is already -% monospace, don't change it; that way, we respect @kbdinputstyle. But -% if it isn't monospace, then use \tt. -% -\def\key#1{{\setupmarkupstyle{key}% - \nohyphenation - \ifmonospace\else\tt\fi - #1}\null} - -% @clicksequence{File @click{} Open ...} -\def\clicksequence#1{\begingroup #1\endgroup} - -% @clickstyle @arrow (by default) -\parseargdef\clickstyle{\def\click{#1}} -\def\click{\arrow} - -% 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} - -% @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} - -% @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 - \null % reset \spacefactor=1000 -} - -% @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{% - {\plainfrenchspacing #1}% - \def\temp{#2}% - \ifx\temp\empty \else - \space ({\unsepspaces \ignorespaces \temp \unskip})% - \fi - \null % reset \spacefactor=1000 -} - -% @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`\_ = \active - \gdef\mathunderscore{% - \catcode`\_=\active - \def_{\ifnum\fam=\slfam \_\else\sb\fi}% - } -} -% Another complication: we want \\ (and @\) to output a math (or tt) \. -% FYI, plain.tex uses \\ as a temporary control sequence (for no -% particular reason), but this is not advertised and we don't care. -% -% 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 - % make the texinfo accent commands work in math mode - \let\"=\ddot - \let\'=\acute - \let\==\bar - \let\^=\hat - \let\`=\grave - \let\u=\breve - \let\v=\check - \let\~=\tilde - \let\dotaccent=\dot - $\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 - \catcode`' = \active - \gdef\mathactive{% - \let^ = \ptexhat - \let< = \ptexless - \let> = \ptexgtr - \let+ = \ptexplus - \let' = \ptexquoteright - } -} - -% ctrl is no longer a Texinfo command, but leave this definition for fun. -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. -% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, -% except specified as a normal braced arg, so no newlines to worry about. -% -\def\outfmtnametex{tex} -% -\long\def\inlinefmt#1{\doinlinefmt #1,\finish} -\long\def\doinlinefmt#1,#2,\finish{% - \def\inlinefmtname{#1}% - \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi -} -% For raw, must switch into @tex before parsing the argument, to avoid -% setting catcodes prematurely. Doing it this way means that, for -% example, @inlineraw{html, foo{bar} gets a parse error instead of being -% ignored. But this isn't important because if people want a literal -% *right* brace they would have to use a command anyway, so they may as -% well use a command to get a left brace too. We could re-use the -% delimiter character idea from \verb, but it seems like overkill. -% -\long\def\inlineraw{\tex \doinlineraw} -\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} -\def\doinlinerawtwo#1,#2,\finish{% - \def\inlinerawname{#1}% - \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi - \endgroup % close group opened by \tex. -} - - -\message{glyphs,} -% and logos. - -% @@ prints an @, as does @atchar{}. -\def\@{\char64 } -\let\atchar=\@ - -% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. -% Unless we're in typewriter, use \ecfont because the CM text fonts do -% not have braces, and we don't want to switch into math. -\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} -\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} -\let\{=\mylbrace \let\lbracechar=\{ -\let\}=\myrbrace \let\rbracechar=\} -\begingroup - % Definitions to produce \{ and \} commands for indices, - % and @{ and @} for the aux/toc files. - \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\, = \ptexc -\let\dotaccent = \ptexdot -\def\ringaccent#1{{\accent23 #1}} -\let\tieaccent = \ptext -\let\ubaraccent = \ptexb -\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 \ifmmode\imath \else\ptexi \fi - \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi - \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{% - \ifx\textnominalsize\xwordpt - % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. - % Revert to plain's \scriptsize, which is 7pt. - \count255=\the\fam $\fam\count255 \scriptstyle A$% - \else - % For 11pt, we can use our lllsize. - \selectfonts\lllsize A% - \fi - }% - \vss - }}% - \kern-.15em - \TeX -} - -% Some math mode symbols. -\def\bullet{$\ptexbullet$} -\def\geq{\ifmmode \ge\else $\ge$\fi} -\def\leq{\ifmmode \le\else $\le$\fi} -\def\minus{\ifmmode -\else $-$\fi} - -% @dots{} outputs an ellipsis using the current font. -% We do .5em per period so that it has the same spacing in the cm -% typewriter fonts as three actual period characters; on the other hand, -% in other typewriter fonts three periods are wider than 1.5em. So do -% whichever is larger. -% -\def\dots{% - \leavevmode - \setbox0=\hbox{...}% get width of three periods - \ifdim\wd0 > 1.5em - \dimen0 = \wd0 - \else - \dimen0 = 1.5em - \fi - \hbox to \dimen0{% - \hskip 0pt plus.25fil - .\hskip 0pt plus1fil - .\hskip 0pt plus1fil - .\hskip 0pt plus.5fil - }% -} - -% @enddots{} is an end-of-sentence ellipsis. -% -\def\enddots{% - \dots - \spacefactor=\endofsentencespacefactor -} - -% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. -% -% Since these characters are used in examples, they should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% -\def\point{$\star$} -\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} -\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} -\def\equiv{\leavevmode\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 \reducedsf \putworderror\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} - -% @pounds{} is a sterling sign, which Knuth put in the CM italic font. -% -\def\pounds{{\it\$}} - -% @euro{} comes from a separate font, depending on the current style. -% We use the free feym* fonts from the eurosym package by Henrik -% Theiling, which support regular, slanted, bold and bold slanted (and -% "outlined" (blackboard board, sort of) versions, which we don't need). -% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. -% -% Although only regular is the truly official Euro symbol, we ignore -% that. The Euro is designed to be slightly taller than the regular -% font height. -% -% feymr - regular -% feymo - slanted -% feybr - bold -% feybo - bold slanted -% -% There is no good (free) typewriter version, to my knowledge. -% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. -% Hmm. -% -% Also doesn't work in math. Do we need to do math with euro symbols? -% Hope not. -% -% -\def\euro{{\eurofont e}} -\def\eurofont{% - % We set the font at each command, rather than predefining it in - % \textfonts and the other font-switching commands, so that - % installations which never need the symbol don't have to have the - % font installed. - % - % There is only one designed size (nominal 10pt), so we always scale - % that to the current nominal size. - % - % By the way, simply using "at 1em" works for cmr10 and the like, but - % does not work for cmbx10 and other extended/shrunken fonts. - % - \def\eurosize{\csname\curfontsize nominalsize\endcsname}% - % - \ifx\curfontstyle\bfstylename - % bold: - \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize - \else - % regular: - \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize - \fi - \thiseurofont -} - -% Glyphs from the EC fonts. We don't use \let for the aliases, because -% sometimes we redefine the original macro, and the alias should reflect -% the redefinition. -% -% Use LaTeX names for the Icelandic letters. -\def\DH{{\ecfont \char"D0}} % Eth -\def\dh{{\ecfont \char"F0}} % eth -\def\TH{{\ecfont \char"DE}} % Thorn -\def\th{{\ecfont \char"FE}} % thorn -% -\def\guillemetleft{{\ecfont \char"13}} -\def\guillemotleft{\guillemetleft} -\def\guillemetright{{\ecfont \char"14}} -\def\guillemotright{\guillemetright} -\def\guilsinglleft{{\ecfont \char"0E}} -\def\guilsinglright{{\ecfont \char"0F}} -\def\quotedblbase{{\ecfont \char"12}} -\def\quotesinglbase{{\ecfont \char"0D}} -% -% This positioning is not perfect (see the ogonek LaTeX package), but -% we have the precomposed glyphs for the most common cases. We put the -% tests to use those glyphs in the single \ogonek macro so we have fewer -% dummy definitions to worry about for index entries, etc. -% -% ogonek is also used with other letters in Lithuanian (IOU), but using -% the precomposed glyphs for those is not so easy since they aren't in -% the same EC font. -\def\ogonek#1{{% - \def\temp{#1}% - \ifx\temp\macrocharA\Aogonek - \else\ifx\temp\macrochara\aogonek - \else\ifx\temp\macrocharE\Eogonek - \else\ifx\temp\macrochare\eogonek - \else - \ecfont \setbox0=\hbox{#1}% - \ifdim\ht0=1ex\accent"0C #1% - \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% - \fi - \fi\fi\fi\fi - }% -} -\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} -\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} -\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} -\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} -% -% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. -\def\ecfont{% - % We can't distinguish serif/sans and italic/slanted, but this - % is used for crude hacks anyway (like adding French and German - % quotes to documents typeset with CM, where we lose kerning), so - % hopefully nobody will notice/care. - \edef\ecsize{\csname\curfontsize ecsize\endcsname}% - \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% - \ifmonospace - % typewriter: - \font\thisecfont = ectt\ecsize \space at \nominalsize - \else - \ifx\curfontstyle\bfstylename - % bold: - \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize - \else - % regular: - \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize - \fi - \fi - \thisecfont -} - -% @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}}% - }$% -} - -% @textdegree - the normal degrees sign. -% -\def\textdegree{$^\circ$} - -% 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\thisisundefined -\def\Orb{\mathhexbox20D} -\fi - -% Quotes. -\chardef\quotedblleft="5C -\chardef\quotedblright=`\" -\chardef\quoteleft=`\` -\chardef\quoteright=`\' - - -\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 -} - -% Settings used for typesetting titles: no hyphenation, no indentation, -% don't worry much about spacing, ragged right. This should be used -% inside a \vbox, and fonts need to be set appropriately first. Because -% it is always used for titles, nothing else, we call \rmisbold. \par -% should be specified before the end of the \vbox, since a vbox is a group. -% -\def\raggedtitlesettings{% - \rmisbold - \hyphenpenalty=10000 - \parindent=0pt - \tolerance=5000 - \ptexraggedright -} - -% Macros to be used within @titlepage: - -\let\subtitlerm=\tenrm -\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} - -\parseargdef\title{% - \checkenv\titlepage - \vbox{\titlefonts \raggedtitlesettings #1\par}% - % 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 - {\secfonts\rmisbold \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 -12pt - \global\advance\vsize by -12pt -} - -\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} - -% @evenheadingmarks top \thischapter <- chapter at the top of a page -% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page -% -% The same set of arguments for: -% -% @oddheadingmarks -% @evenfootingmarks -% @oddfootingmarks -% @everyheadingmarks -% @everyfootingmarks - -\def\evenheadingmarks{\headingmarks{even}{heading}} -\def\oddheadingmarks{\headingmarks{odd}{heading}} -\def\evenfootingmarks{\headingmarks{even}{footing}} -\def\oddfootingmarks{\headingmarks{odd}{footing}} -\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} - \headingmarks{odd}{heading}{#1} } -\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} - \headingmarks{odd}{footing}{#1} } -% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. -\def\headingmarks#1#2#3 {% - \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname - \global\expandafter\let\csname get#1#2marks\endcsname \temp -} - -\everyheadingmarks bottom -\everyfootingmarks bottom - -% @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{% non-global headings elimination - \evenheadline={\hfil}\evenfootline={\hfil}% - \oddheadline={\hfil}\oddfootline={\hfil}% -} - -\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting -\HEADINGSoff % it's the default - -% 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\thisisundefined -\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\relax - \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 - \tablecheck{table}% -} -\envdef\ftable{% - \def\itemindex ##1{\doind {fn}{\code{##1}}}% - \tablecheck{ftable}% -} -\envdef\vtable{% - \def\itemindex ##1{\doind {vr}{\code{##1}}}% - \tablecheck{vtable}% -} -\def\tablecheck#1{% - \ifnum \the\catcode`\^^M=\active - \endgroup - \errmessage{This command won't work in this context; perhaps the problem is - that we are \inenvironment\thisenv}% - \def\next{\doignore{#1}}% - \else - \let\next\tablex - \fi - \next -} -\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 - % - % Try typesetting the item mark that if the document erroneously says - % something like @itemize @samp (intending @table), there's an error - % right away at the @itemize. It's not the best error message in the - % world, but it's better than leaving it to the @item. This means if - % the user wants an empty mark, they have to say @w{} not just @w. - \def\itemcontents{#1}% - \setbox0 = \hbox{\itemcontents}% - % - % @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 . - % - \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. \everycr resets \everytab so we don't have to -% undo it ourselves. -\def\headitemfont{\b}% for people to use in the template row; not changeable -\def\headitem{% - \checkenv\multitable - \crcr - \global\everytab={\bf}% can't use \headitemfont since the parsing differs - \the\everytab % for the first item -}% -% -% 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 again encounter the problem the 1sp was intended to solve. -% --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{% - \def\multistrut{\strut}% just use the standard line spacing - % - % Compute \multitablelinespace (if not defined by user) for use in - % \multitableparskip calculation. We used define \multistrut based on - % this, but (ironically) that caused the spacing to be off. - % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. -\ifdim\multitablelinespace=0pt -\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip -\global\advance\multitablelinespace by-\ht0 -\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: - \obeylines - \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'. - \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. - \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. -{ \obeylines% - % Ignore anything after the last `@end #1'; this matters in verbatim - % environments, where otherwise the newline after an ignored conditional - % would result in a blank line in the output. - \gdef\enddoignore#1^^M{\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-\normaldash \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 executes 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}} - -% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written -% without the @) is in fact defined. We can only feasibly check at the -% TeX level, so something like `mathcode' is going to considered -% defined even though it is not a Texinfo command. -% -\makecond{ifcommanddefined} -\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} -% -\def\doifcmddefined#1#2{{% - \makevalueexpandable - \let\next=\empty - \expandafter\ifx\csname #2\endcsname\relax - #1% If not defined, \let\next as above. - \fi - \expandafter - }\next -} -\def\ifcmddefinedfail{\doignore{ifcommanddefined}} - -% @ifcommandnotdefined CMD ... handled similar to @ifclear above. -\makecond{ifcommandnotdefined} -\def\ifcommandnotdefined{% - \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} -\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} - -% Set the `txicommandconditionals' variable, so documents have a way to -% test if the @ifcommand...defined conditionals are available. -\set txicommandconditionals - -% @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 macros and \if's. -\edef\newwrite{\makecsname{ptexnewwrite}} - -% \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 \relax - % 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{% - \escapechar = `\\ % use backslash in output files. - \def\@{@}% change to @@ when we switch to @ as escape char in index files. - \def\ {\realbackslash\space }% - % - % Need these unexpandable (because we define \tt as a dummy) - % definitions when @{ or @} appear in index entry text. Also, more - % complicated, when \tex is in effect and \{ is a \delimiter again. - % We can't use \lbracecmd and \rbracecmd because texindex assumes - % braces and backslashes are used only as delimiters. Perhaps we - % should define @lbrace and @rbrace commands a la @comma. - \def\{{{\tt\char123}}% - \def\}{{\tt\char125}}% - % - % I don't entirely understand this, but when an index entry is - % generated from a macro call, the \endinput which \scanmacro inserts - % causes processing to be prematurely terminated. This is, - % apparently, because \indexsorttmp is fully expanded, and \endinput - % is an expandable command. The redefinition below makes \endinput - % disappear altogether for that purpose -- although logging shows that - % processing continues to some further point. On the other hand, it - % seems \endinput does not hurt in the printed index arg, since that - % is still getting written without apparent harm. - % - % Sample source (mac-idx3.tex, reported by Graham Percival to - % help-texinfo, 22may06): - % @macro funindex {WORD} - % @findex xyz - % @end macro - % ... - % @funindex commtest - % - % The above is not enough to reproduce the bug, but it gives the flavor. - % - % Sample whatsit resulting: - % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} - % - % So: - \let\endinput = \empty - % - % Do the redefinitions. - \commondummies -} - -% For the aux and toc files, @ is the escape character. So we want to -% redefine everything using @ as the escape character (instead of -% \realbackslash, still used for index files). When everything uses @, -% this will be simpler. -% -\def\atdummies{% - \def\@{@@}% - \def\ {@ }% - \let\{ = \lbraceatcmd - \let\} = \rbraceatcmd - % - % Do the redefinitions. - \commondummies - \otherbackslash -} - -% Called from \indexdummies and \atdummies. -% -\def\commondummies{% - % - % \definedummyword defines \#1 as \string\#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{\def##1{\string##1\space}}% - \def\definedummyletter##1{\def##1{\string##1}}% - \let\definedummyaccent\definedummyletter - % - \commondummiesnofonts - % - \definedummyletter\_% - \definedummyletter\-% - % - % Non-English letters. - \definedummyword\AA - \definedummyword\AE - \definedummyword\DH - \definedummyword\L - \definedummyword\O - \definedummyword\OE - \definedummyword\TH - \definedummyword\aa - \definedummyword\ae - \definedummyword\dh - \definedummyword\exclamdown - \definedummyword\l - \definedummyword\o - \definedummyword\oe - \definedummyword\ordf - \definedummyword\ordm - \definedummyword\questiondown - \definedummyword\ss - \definedummyword\th - % - % 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\arrow - \definedummyword\bullet - \definedummyword\comma - \definedummyword\copyright - \definedummyword\registeredsymbol - \definedummyword\dots - \definedummyword\enddots - \definedummyword\entrybreak - \definedummyword\equiv - \definedummyword\error - \definedummyword\euro - \definedummyword\expansion - \definedummyword\geq - \definedummyword\guillemetleft - \definedummyword\guillemetright - \definedummyword\guilsinglleft - \definedummyword\guilsinglright - \definedummyword\lbracechar - \definedummyword\leq - \definedummyword\minus - \definedummyword\ogonek - \definedummyword\pounds - \definedummyword\point - \definedummyword\print - \definedummyword\quotedblbase - \definedummyword\quotedblleft - \definedummyword\quotedblright - \definedummyword\quoteleft - \definedummyword\quoteright - \definedummyword\quotesinglbase - \definedummyword\rbracechar - \definedummyword\result - \definedummyword\textdegree - % - % We want to disable all macros so that they are not expanded by \write. - \macrolist - % - \normalturnoffactive - % - % Handle some cases of @value -- where it does not contain any - % (non-fully-expandable) commands. - \makevalueexpandable -} - -% \commondummiesnofonts: common to \commondummies and \indexnofonts. -% -\def\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\ogonek - \definedummyword\ringaccent - \definedummyword\tieaccent - \definedummyword\ubaraccent - \definedummyword\udotaccent - \definedummyword\dotless - % - % Texinfo font commands. - \definedummyword\b - \definedummyword\i - \definedummyword\r - \definedummyword\sansserif - \definedummyword\sc - \definedummyword\slanted - \definedummyword\t - % - % Commands that take arguments. - \definedummyword\abbr - \definedummyword\acronym - \definedummyword\anchor - \definedummyword\cite - \definedummyword\code - \definedummyword\command - \definedummyword\dfn - \definedummyword\dmn - \definedummyword\email - \definedummyword\emph - \definedummyword\env - \definedummyword\file - \definedummyword\image - \definedummyword\indicateurl - \definedummyword\inforef - \definedummyword\kbd - \definedummyword\key - \definedummyword\math - \definedummyword\option - \definedummyword\pxref - \definedummyword\ref - \definedummyword\samp - \definedummyword\strong - \definedummyword\tie - \definedummyword\uref - \definedummyword\url - \definedummyword\var - \definedummyword\verb - \definedummyword\w - \definedummyword\xref -} - -% \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{\let##1\asis}% - % We can just ignore other control letters. - \def\definedummyletter##1{\let##1\empty}% - % All control words become @asis by default; overrides below. - \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\@{@}% - \def\_{\normalunderscore}% - \def\-{}% @- shouldn't affect sorting - % - % Unfortunately, texindex is not prepared to handle braces in the - % content at all. So for index sorting, we map @{ and @} to strings - % starting with |, since that ASCII character is between ASCII { and }. - \def\{{|a}% - \def\lbracechar{|a}% - % - \def\}{|b}% - \def\rbracechar{|b}% - % - % Non-English letters. - \def\AA{AA}% - \def\AE{AE}% - \def\DH{DZZ}% - \def\L{L}% - \def\OE{OE}% - \def\O{O}% - \def\TH{ZZZ}% - \def\aa{aa}% - \def\ae{ae}% - \def\dh{dzz}% - \def\exclamdown{!}% - \def\l{l}% - \def\oe{oe}% - \def\ordf{a}% - \def\ordm{o}% - \def\o{o}% - \def\questiondown{?}% - \def\ss{ss}% - \def\th{zzz}% - % - \def\LaTeX{LaTeX}% - \def\TeX{TeX}% - % - % Assorted special characters. - % (The following {} will end up in the sort string, but that's ok.) - \def\arrow{->}% - \def\bullet{bullet}% - \def\comma{,}% - \def\copyright{copyright}% - \def\dots{...}% - \def\enddots{...}% - \def\equiv{==}% - \def\error{error}% - \def\euro{euro}% - \def\expansion{==>}% - \def\geq{>=}% - \def\guillemetleft{<<}% - \def\guillemetright{>>}% - \def\guilsinglleft{<}% - \def\guilsinglright{>}% - \def\leq{<=}% - \def\minus{-}% - \def\point{.}% - \def\pounds{pounds}% - \def\print{-|}% - \def\quotedblbase{"}% - \def\quotedblleft{"}% - \def\quotedblright{"}% - \def\quoteleft{`}% - \def\quoteright{'}% - \def\quotesinglbase{,}% - \def\registeredsymbol{R}% - \def\result{=>}% - \def\textdegree{o}% - % - \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax - \else \indexlquoteignore \fi - % - % 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. - % - \macrolist -} - -% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us -% ignore left quotes in the sort term. -{\catcode`\`=\active - \gdef\indexlquoteignore{\let`=\empty}} - -\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}% - % - \safewhatsit\dosubindwrite - }% - \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 - \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/skips around a whatsit: -% -% 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 or \pdfdest 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} -% -\newskip\whatsitskip -\newcount\whatsitpenalty -% -% ..., ready, GO: -% -\def\safewhatsit#1{\ifhmode - #1% - \else - % \lastskip and \lastpenalty cannot both be nonzero simultaneously. - \whatsitskip = \lastskip - \edef\lastskipmacro{\the\lastskip}% - \whatsitpenalty = \lastpenalty - % - % If \lastskip is nonzero, that means the last item was a - % skip. And since a skip is discardable, that means this - % -\whatsitskip 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-\whatsitskip - \fi - % - #1% - % - \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\whatsitpenalty>9999 \penalty\whatsitpenalty \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\whatsitskip - \fi -\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 - \plainfrenchspacing - \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 freezes 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 - % - % When reading the text of entry, convert explicit line breaks - % from @* into spaces. The user might give these in long section - % titles, for instance. - \def\*{\unskip\space\ignorespaces}% - \def\entrybreak{\hfil\break}% - % - % Swallow the left brace of the text (first parameter): - \afterassignment\doentry - \let\temp = -} -\def\entrybreak{\unskip\space\ignorespaces}% -\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. - \setbox\boxA = \hbox{#1}% - \ifdim\wd\boxA = 0pt - \ % - \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 plain.tex's \dotfill, except uses up at least 1 em. -\def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu.\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{% - % The following penalty ensures that the page builder is exercised - % _before_ we change the output routine. This is necessary in the - % following situation: - % - % The last section of the index consists only of a single entry. - % Before this section, \pagetotal is less than \pagegoal, so no - % break occurs before the last section starts. However, the last - % section, consisting of \initial and the single \entry, does not - % fit on the page and has to be broken off. Without the following - % penalty the page builder will not be exercised until \eject - % below, and by that time we'll already have changed the output - % routine to the \balancecolumns version, so the next-to-last - % double-column page will be processed with \balancecolumns, which - % is wrong: The two columns will go to the main vertical list, with - % the broken-off section in the recent contributions. As soon as - % the output routine finishes, TeX starts reconsidering the page - % break. The two columns and the broken-off section both fit on the - % page, because the two columns now take up only half of the page - % goal. When TeX sees \eject from below which follows the final - % section, it invokes the new output routine that we've set after - % \balancecolumns below; \onepageout will try to fit the two columns - % and the final section into the vbox of \pageheight (see - % \pagebody), causing an overfull box. - % - % Note that glue won't work here, because glue does not exercise the - % page builder, unlike penalties (see The TeXbook, pp. 280-281). - \penalty0 - % - \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. - -% Let's start with @part. -\outer\parseargdef\part{\partzzz{#1}} -\def\partzzz#1{% - \chapoddpage - \null - \vskip.3\vsize % move it down on the page a bit - \begingroup - \noindent \titlefonts\rmisbold #1\par % the text - \let\lastnode=\empty % no node to associate with - \writetocentry{part}{#1}{}% but put it in the toc - \headingsoff % no headline or footline on the part page - \chapoddpage - \endgroup -} - -% \unnumberedno is an oxymoron. 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 these (using marks) as the number+name, number -% and name of the chapter. Page headings and footings can use -% these. @section does likewise. -\def\thischapter{} -\def\thischapternum{} -\def\thischaptername{} -\def\thissection{} -\def\thissectionnum{} -\def\thissectionname{} - -\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 achieve this, remember the "biggest" unnum. sec. we are currently in: -\chardef\unnlevel = \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 < \unnlevel - \chardef\unnlevel = \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 > \unnlevel - \def\headtype{U}% - \else - \chardef\unnlevel = 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 - % - % \putwordChapter can contain complex things in translations. - \toks0=\expandafter{\putwordChapter}% - \message{\the\toks0 \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 calls appendixzzz -% -\def\appendixzzz#1{% - \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 - \global\advance\appendixno by 1 - \gdef\chaplevelprefix{\appendixletter.}% - \resetallfloatnos - % - % \putwordAppendix can contain complex things in translations. - \toks0=\expandafter{\putwordAppendix}% - \message{\the\toks0 \space \appendixletter}% - % - \chapmacro{#1}{Yappendix}{\appendixletter}% - % - \global\let\section = \appendixsec - \global\let\subsection = \appendixsubsec - \global\let\subsubsection = \appendixsubsubsec -} - -% normally unnmhead0 calls unnumberedzzz: -\outer\parseargdef\unnumbered{\unnmhead0{#1}} -\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 to achieve this: TeX expands \the only once, - % simply yielding the contents of . (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}% -} - -% normally calls appendixsectionzzz: -\outer\parseargdef\appendixsection{\apphead1{#1}} -\def\appendixsectionzzz#1{% - \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 - \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% -} -\let\appendixsec\appendixsection - -% normally calls unnumberedseczzz: -\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} -\def\unnumberedseczzz#1{% - \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 - \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% -} - -% Subsections. -% -% normally calls numberedsubseczzz: -\outer\parseargdef\numberedsubsec{\numhead2{#1}} -\def\numberedsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% -} - -% normally calls appendixsubseczzz: -\outer\parseargdef\appendixsubsec{\apphead2{#1}} -\def\appendixsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Yappendix}% - {\appendixletter.\the\secno.\the\subsecno}% -} - -% normally calls unnumberedsubseczzz: -\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} -\def\unnumberedsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Ynothing}% - {\the\unnumberedno.\the\secno.\the\subsecno}% -} - -% Subsubsections. -% -% normally numberedsubsubseczzz: -\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} -\def\numberedsubsubseczzz#1{% - \global\advance\subsubsecno by 1 - \sectionheading{#1}{subsubsec}{Ynumbered}% - {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% -} - -% normally appendixsubsubseczzz: -\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} -\def\appendixsubsubseczzz#1{% - \global\advance\subsubsecno by 1 - \sectionheading{#1}{subsubsec}{Yappendix}% - {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% -} - -% normally unnumberedsubsubseczzz: -\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} -\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 - -\def\majorheading{% - {\advance\chapheadingskip by 10pt \chapbreak }% - \parsearg\chapheadingzzz -} - -\def\chapheading{\chapbreak \parsearg\chapheadingzzz} -\def\chapheadingzzz#1{% - \vbox{\chapfonts \raggedtitlesettings #1\par}% - \nobreak\bigskip \nobreak - \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} - -% Parameter controlling skip before chapter headings (if needed) -\newskip\chapheadingskip - -% Define plain chapter starts, and page on/off switching for it. -\def\chapbreak{\dobreak \chapheadingskip {-4000}} -\def\chappager{\par\vfill\supereject} -% Because \domark is called before \chapoddpage, the filler page will -% get the headings for the next chapter, which is wrong. But we don't -% care -- we just disable all headings on the filler page. -\def\chapoddpage{% - \chappager - \ifodd\pageno \else - \begingroup - \headingsoff - \null - \chappager - \endgroup - \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{% - % Insert the first mark before the heading break (see notes for \domark). - \let\prevchapterdefs=\lastchapterdefs - \let\prevsectiondefs=\lastsectiondefs - \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% - \gdef\thissection{}}% - % - \def\temptype{#2}% - \ifx\temptype\Ynothingkeyword - \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% - \gdef\thischapter{\thischaptername}}% - \else\ifx\temptype\Yomitfromtockeyword - \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% - \gdef\thischapter{}}% - \else\ifx\temptype\Yappendixkeyword - \toks0={#1}% - \xdef\lastchapterdefs{% - \gdef\noexpand\thischaptername{\the\toks0}% - \gdef\noexpand\thischapternum{\appendixletter}% - % \noexpand\putwordAppendix avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} - \noexpand\thischapternum: - \noexpand\thischaptername}% - }% - \else - \toks0={#1}% - \xdef\lastchapterdefs{% - \gdef\noexpand\thischaptername{\the\toks0}% - \gdef\noexpand\thischapternum{\the\chapno}% - % \noexpand\putwordChapter avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thischapter{\noexpand\putwordChapter{} - \noexpand\thischapternum: - \noexpand\thischaptername}% - }% - \fi\fi\fi - % - % Output the mark. Pass it through \safewhatsit, to take care of - % the preceding space. - \safewhatsit\domark - % - % Insert the chapter heading break. - \pchapsepmacro - % - % Now the second mark, after the heading break. No break points - % between here and the heading. - \let\prevchapterdefs=\lastchapterdefs - \let\prevsectiondefs=\lastsectiondefs - \domark - % - {% - \chapfonts \rmisbold - % - % Have to define \lastsection 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\lastsection{#1}% - % - % Only insert the separating space if we have a chapter/appendix - % number, and don't print the unnumbered ``number''. - \ifx\temptype\Ynothingkeyword - \setbox0 = \hbox{}% - \def\toctype{unnchap}% - \else\ifx\temptype\Yomitfromtockeyword - \setbox0 = \hbox{}% contents like unnumbered, but no toc entry - \def\toctype{omit}% - \else\ifx\temptype\Yappendixkeyword - \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% - \def\toctype{app}% - \else - \setbox0 = \hbox{#3\enspace}% - \def\toctype{numchap}% - \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. - \nobreak % Avoid page breaks at the interline glue. - \vbox{\raggedtitlesettings \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 - \vbox{\chapfonts \raggedtitlesettings #1\par}% - \nobreak\bigskip\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 - \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% - \nobreak\bigskip \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\seckeyword{sec} -% -\def\sectionheading#1#2#3#4{% - {% - \checkenv{}% should not be in an environment. - % - % Switch to the right set of fonts. - \csname #2fonts\endcsname \rmisbold - % - \def\sectionlevel{#2}% - \def\temptype{#3}% - % - % Insert first mark before the heading break (see notes for \domark). - \let\prevsectiondefs=\lastsectiondefs - \ifx\temptype\Ynothingkeyword - \ifx\sectionlevel\seckeyword - \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% - \gdef\thissection{\thissectionname}}% - \fi - \else\ifx\temptype\Yomitfromtockeyword - % Don't redefine \thissection. - \else\ifx\temptype\Yappendixkeyword - \ifx\sectionlevel\seckeyword - \toks0={#1}% - \xdef\lastsectiondefs{% - \gdef\noexpand\thissectionname{\the\toks0}% - \gdef\noexpand\thissectionnum{#4}% - % \noexpand\putwordSection avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thissection{\noexpand\putwordSection{} - \noexpand\thissectionnum: - \noexpand\thissectionname}% - }% - \fi - \else - \ifx\sectionlevel\seckeyword - \toks0={#1}% - \xdef\lastsectiondefs{% - \gdef\noexpand\thissectionname{\the\toks0}% - \gdef\noexpand\thissectionnum{#4}% - % \noexpand\putwordSection avoids expanding indigestible - % commands in some of the translations. - \gdef\noexpand\thissection{\noexpand\putwordSection{} - \noexpand\thissectionnum: - \noexpand\thissectionname}% - }% - \fi - \fi\fi\fi - % - % Go into vertical mode. Usually we'll already be there, but we - % don't want the following whatsit to end up in a preceding paragraph - % if the document didn't happen to have a blank line. - \par - % - % Output the mark. Pass it through \safewhatsit, to take care of - % the preceding space. - \safewhatsit\domark - % - % Insert space above the heading. - \csname #2headingbreak\endcsname - % - % Now the second mark, after the heading break. No break points - % between here and the heading. - \let\prevsectiondefs=\lastsectiondefs - \domark - % - % Only insert the space after the number if we have a section number. - \ifx\temptype\Ynothingkeyword - \setbox0 = \hbox{}% - \def\toctype{unn}% - \gdef\lastsection{#1}% - \else\ifx\temptype\Yomitfromtockeyword - % for @headings -- no section number, don't include in toc, - % and don't redefine \lastsection. - \setbox0 = \hbox{}% - \def\toctype{omit}% - \let\sectionlevel=\empty - \else\ifx\temptype\Yappendixkeyword - \setbox0 = \hbox{#4\enspace}% - \def\toctype{app}% - \gdef\lastsection{#1}% - \else - \setbox0 = \hbox{#4\enspace}% - \def\toctype{num}% - \gdef\lastsection{#1}% - \fi\fi\fi - % - % Write the toc entry (before \donoderef). See comments in \chapmacro. - \writetocentry{\toctype\sectionlevel}{#1}{#4}% - % - % Write the node reference (= pdf destination for pdftex). - % Again, see comments in \chapmacro. - \donoderef{#3}% - % - % Interline glue will be inserted when the vbox is completed. - % That glue will be a valid breakpoint for the page, since it'll be - % preceded by a whatsit (usually from the \donoderef, or from the - % \writetocentry if there was no node). We don't want to allow that - % break, since then the whatsits could end up on page n while the - % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. - \nobreak - % - % Output the actual section heading. - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright - \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.) However, when a paragraph is not started next - % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out - % or the negative glue will cause weirdly wrong output, typically - % obscuring the section heading with something else. - \vskip-\parskip - % - % This is so the last item on the main vertical list is a known - % \penalty > 10000, so \startdefun, etc., can recognize the situation - % and do the needful. - \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 - {\atdummies - \edef\temp{% - \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\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 -} - - -% These characters do not print properly in the Computer Modern roman -% fonts, so we must take special care. This is more or less redundant -% with the Texinfo input format setup at the end of this file. -% -\def\activecatcodes{% - \catcode`\"=\active - \catcode`\$=\active - \catcode`\<=\active - \catcode`\>=\active - \catcode`\\=\active - \catcode`\^=\active - \catcode`\_=\active - \catcode`\|=\active - \catcode`\~=\active -} - - -% Read the toc file, which is essentially Texinfo input. -\def\readtocfile{% - \setupdatafile - \activecatcodes - \input \tocreadfilename -} - -\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 - \contentsalignmacro - \immediate\closeout\tocfile - % - % Don't need to put `Contents' or `Short Contents' in the headline. - % It is abundantly clear what they are. - \chapmacro{#1}{Yomitfromtoc}{}% - % - \savepageno = \pageno - \begingroup % Set up to handle contents files properly. - \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 -} - -% redefined for the two-volume lispref. We always output on -% \jobname.toc even if this is redefined. -% -\def\tocreadfilename{\jobname.toc} - -% Normal (long) toc. -% -\def\contents{% - \startcontents{\putwordTOC}% - \openin 1 \tocreadfilename\space - \ifeof 1 \else - \readtocfile - \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\partentry = \shortpartentry - \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 \tocreadfilename\space - \ifeof 1 \else - \readtocfile - \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, ... - -% Parts, in the main contents. Replace the part number, which doesn't -% exist, with an empty box. Let's hope all the numbers have the same width. -% Also ignore the page number, which is conventionally not printed. -\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} -\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} -% -% Parts, in the short toc. -\def\shortpartentry#1#2#3#4{% - \penalty-300 - \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip - \shortchapentry{{\bf #1}}{\numeralbox}{}{}% -} - -% 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. - -% @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 @ character. - -\envdef\tex{% - \setupmarkupstyle{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 - \catcode`\`=\other - \catcode`\'=\other - \escapechar=`\\ - % - % ' is active in math mode (mathcode"8000). So reset it, and all our - % other math active characters (just in case), to plain's definitions. - \mathactive - % - \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 - \expandafter \let\csname top\endcsname=\ptextop % outer - \let\frenchspacing=\plainfrenchspacing - % - \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; it will -% also clear it, so that its embedded environments do the narrowing again. -\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 = t% - % - % If this cartouche directly follows a sectioning command, we need the - % \parskip glue (backspaced over by default) or the cartouche can - % collide with the section heading. - \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi - % - \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. -\newdimen\nonfillparindent -\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 - % Turn off paragraph indentation but redefine \indent to emulate - % the normal \indent. - \nonfillparindent=\parindent - \parindent = 0pt - \let\indent\nonfillindent - % - \emergencystretch = 0pt % don't try to avoid overfull boxes - \ifx\nonarrowing\relax - \advance \leftskip by \lispnarrowing - \exdentamount=\lispnarrowing - \else - \let\nonarrowing = \relax - \fi - \let\exdent=\nofillexdent -} - -\begingroup -\obeyspaces -% We want to swallow spaces (but not other tokens) after the fake -% @indent in our nonfill-environments, where spaces are normally -% active and set to @tie, resulting in them not being ignored after -% @indent. -\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% -\gdef\nonfillindentcheck{% -\ifx\temp % -\expandafter\nonfillindentgobble% -\else% -\leavevmode\nonfillindentbox% -\fi% -}% -\endgroup -\def\nonfillindentgobble#1{\nonfillindent} -\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} - -% 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 - % end paragraph for sake of leading, in case document has no blank - % line. This is redundant with what happens in \aboveenvbreak, but - % we need to do it before changing the fonts, and it's inconvenient - % to change the fonts afterward. - \ifnum \lastpenalty=10000 \else \endgraf \fi - \smallexamplefonts \rm - \fi -} -\def\setsmalldispenv{% - \ifx\SETdispenvsize\nosmallword - \else - \ifnum \lastpenalty=10000 \else \endgraf \fi - \smallexamplefonts \rm - \fi -} - -% We often define two environments, @foo and @smallfoo. -% Let's do it in one command. #1 is the env name, #2 the definition. -\def\makedispenvdef#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 environment synonyms (#1 and #2) for an environment. -\def\maketwodispenvdef#1#2#3{% - \makedispenvdef{#1}{#3}% - \makedispenvdef{#2}{#3}% -} -% -% @lisp: indented, narrowed, typewriter font; -% @example: same as @lisp. -% -% @smallexample and @smalllisp: use smaller fonts. -% Originally contributed by Pavel@xerox. -% -\maketwodispenvdef{lisp}{example}{% - \nonfillstart - \tt\setupmarkupstyle{example}% - \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \gobble % eat return -} -% @display/@smalldisplay: same as @lisp except keep current font. -% -\makedispenvdef{display}{% - \nonfillstart - \gobble -} - -% @format/@smallformat: same as @display except don't narrow margins. -% -\makedispenvdef{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\relax - \gobble -} -\let\Eflushright = \afterenvbreak - - -% @raggedright does more-or-less normal line breaking but no right -% justification. From plain.tex. -\envdef\raggedright{% - \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax -} -\let\Eraggedright\par - -\envdef\raggedleft{% - \parindent=0pt \leftskip0pt plus2em - \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt - \hbadness=10000 % Last line will usually be underfull, so turn off - % badness reporting. -} -\let\Eraggedleft\par - -\envdef\raggedcenter{% - \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em - \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt - \hbadness=10000 % Last line will usually be underfull, so turn off - % badness reporting. -} -\let\Eraggedcenter\par - - -% @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. -% -\makedispenvdef{quotation}{\quotationstart} -% -\def\quotationstart{% - \indentedblockstart % same as \indentedblock, but increase right margin too. - \ifx\nonarrowing\relax - \advance\rightskip by \lispnarrowing - \fi - \parsearg\quotationlabel -} - -% We have retained a nonzero parskip for the environment, since we're -% doing normal filling. -% -\def\Equotation{% - \par - \ifx\quotationauthor\thisisundefined\else - % indent a bit. - \leftline{\kern 2\leftskip \sl ---\quotationauthor}% - \fi - {\parskip=0pt \afterenvbreak}% -} -\def\Esmallquotation{\Equotation} - -% 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 -} - -% @indentedblock is like @quotation, but indents only on the left and -% has no optional argument. -% -\makedispenvdef{indentedblock}{\indentedblockstart} -% -\def\indentedblockstart{% - {\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 - \exdentamount = \lispnarrowing - \else - \let\nonarrowing = \relax - \fi -} - -% Keep a nonzero parskip for the environment, since we're doing normal filling. -% -\def\Eindentedblock{% - \par - {\parskip=0pt \afterenvbreak}% -} -\def\Esmallindentedblock{\Eindentedblock} - - -% LaTeX-like @verbatim...@end verbatim and @verb{...} -% If we want to allow any 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\"% - % Don't do the quotes -- if we do, @set txicodequoteundirected and - % @set txicodequotebacktick will not have effect on @verb and - % @verbatim, and ?` and !` ligatures won't get disabled. - %\do\`\do\'% -} -% -% [Knuth] p. 380 -\def\uncatcodespecials{% - \def\do##1{\catcode`##1=\other}\dospecials} -% -% 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}% - \setupmarkupstyle{verb}% - \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 -% -% We typeset each line of the verbatim in an \hbox, so we can handle -% tabs. The \global is in case the verbatim line starts with an accent, -% or some other command that starts with a begin-group. Otherwise, the -% entire \verbbox would disappear at the corresponding end-group, before -% it is typeset. Meanwhile, we can't have nested verbatim commands -% (can we?), so the \global won't be overwriting itself. -\newbox\verbbox -\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} -% -\begingroup - \catcode`\^^I=\active - \gdef\tabexpand{% - \catcode`\^^I=\active - \def^^I{\leavevmode\egroup - \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab - \divide\dimen\verbbox by\tabw - \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw - \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw - \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox - }% - } -\endgroup - -% start the verbatim environment. -\def\setupverbatim{% - \let\nonarrowing = t% - \nonfillstart - \tt % easiest (and conventionally used) font for verbatim - % The \leavevmode here is for blank lines. Otherwise, we would - % never \starttabox and the \egroup would end verbatim mode. - \def\par{\leavevmode\egroup\box\verbbox\endgraf}% - \tabexpand - \setupmarkupstyle{verbatim}% - % 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'{'#1'}'{#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 - \indexnofonts % Allow `@@' and other weird things in file names. - \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% - \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 -\newcount\defunpenalty - -% Start the processing of @deffn: -\def\startdefun{% - \ifnum\lastpenalty<10000 - \medbreak - \defunpenalty=10003 % Will keep this @deffn together with the - % following @def command, see below. - \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 \printdefunline, 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. - % - % As a further refinement, we avoid "club" headers by signalling - % with penalty of 10003 after the very first @deffn in the - % sequence (see above), and penalty of 10002 after any following - % @def command. - \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \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 \else \defunpenalty=10002 \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\relax - \endgraf - \nobreak\vskip -\parskip - \penalty\defunpenalty % 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 remaining 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 - \doingtypefnfalse % distinguish typed functions from all else - \parseargusing\activeparens{\printdefunline#3}% - }% - \def#2{\dodefunx#1}% - \def#3% -} - -\newif\ifdoingtypefn % doing typed function? -\newif\ifrettypeownline % typeset return type on its own line? - -% @deftypefnnewline on|off says whether the return type of typed functions -% are printed on their own line. This affects @deftypefn, @deftypefun, -% @deftypeop, and @deftypemethod. -% -\parseargdef\deftypefnnewline{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETtxideftypefnnl\endcsname - = \empty - \else\ifx\temp\offword - \expandafter\let\csname SETtxideftypefnnl\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @txideftypefnnl value `\temp', - must be on|off}% - \fi\fi -} - -% 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}% - \doingtypefntrue - \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 {} } - -% Types: - -% @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{% - \par - % Get the values of \leftskip and \rightskip as they were outside the @def... - \advance\leftskip by -\defbodyindent - % - % Determine if we are typesetting the return type of a typed function - % on a line by itself. - \rettypeownlinefalse - \ifdoingtypefn % doing a typed function specifically? - % then check user option for putting return type on its own line: - \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else - \rettypeownlinetrue - \fi - \fi - % - % How we'll format the category 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. We'll always have at - % least two. - \tempnum = 2 - % - % 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 - % - % If doing a return type on its own line, we'll have another line. - \ifrettypeownline - \advance\tempnum by 1 - \def\maybeshapeline{0in \hsize}% - \else - \def\maybeshapeline{}% - \fi - % - % The continuations: - \dimen2=\hsize \advance\dimen2 by -\defargsindent - % - % The final paragraph shape: - \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 - % - % Put the category name at 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}% text of the return type - \ifx\temp\empty\else - \tclose{\temp}% typeset the return type - \ifrettypeownline - % put return type on its own line; prohibit line break following: - \hfil\vadjust{\nobreak}\break - \else - \space % type on same line, so just followed by a space - \fi - \fi % no return type - #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. We used to recommend @var for that, so - % leave the code in, but it's strange for @var to lead to typewriter. - % Nowadays we recommend @code, since the difference between a ttsl hyphen - % and a tt hyphen is pretty tiny. @code also disables ?` !`. - \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% - #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\ }} - -\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 -} -% these should not use \errmessage; the glibc manual, at least, actually -% has such constructs (when documenting function pointers). -\def\badparencount{% - \message{Warning: unbalanced parentheses in @def...}% - \global\parencount=0 -} -\def\badbrackcount{% - \message{Warning: unbalanced square brackets 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\thisisundefined - \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 for \example: - \spaceisspace - % - % The \empty here causes a following catcode 5 newline to be eaten as - % part of reading whitespace after a control sequence. It does not - % eat a catcode 13 newline. There's no good way to handle the two - % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX - % would then have different behavior). See the Macro Details node in - % the manual for the workaround we recommend for macros and - % line-oriented commands. - % - \scantokens{#1\empty}% -\endgroup} - -\def\scanexp#1{% - \edef\temp{\noexpand\scanmacro{#1}}% - \temp -} - -\newcount\paramno % Count of parameters -\newtoks\macname % Macro name -\newif\ifrecursive % Is it recursive? - -% List of all defined macros in the form -% \definedummyword\macro1\definedummyword\macro2... -% Currently is also contains all @aliases; the list can be split -% if there is a need. -\def\macrolist{} - -% Add the macro to \macrolist -\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} -\def\addtomacrolistxxx#1{% - \toks0 = \expandafter{\macrolist\definedummyword#1}% - \xdef\macrolist{\the\toks0}% -} - -% 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 \ -% to recognize macro arguments; this is the job of \mbodybackslash. -% -% Non-ASCII encodings make 8-bit characters active, so un-activate -% them to avoid their expansion. Must do this non-globally, to -% confine the change to the current group. -% -% 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{% used as subroutine - \catcode`\"=\other - \catcode`\+=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\@=\other - \catcode`\^=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\~=\other - \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi -} - -\def\scanargctxt{% used for copying and captions, not macros. - \scanctxt - \catcode`\\=\other - \catcode`\^^M=\other -} - -\def\macrobodyctxt{% used for @macro definitions - \scanctxt - \catcode`\{=\other - \catcode`\}=\other - \catcode`\^^M=\other - \usembodybackslash -} - -\def\macroargctxt{% used when scanning invocations - \scanctxt - \catcode`\\=0 -} -% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" -% for the single characters \ { }. Thus, we end up with the "commands" -% that would be written @\ @{ @} in a Texinfo document. -% -% We already have @{ and @}. For @\, we define it here, and only for -% this purpose, to produce a typewriter backslash (so, the @\ that we -% define for @math can't be used with @macro calls): -% -\def\\{\normalbackslash}% -% -% We would like to do this for \, too, since that is what makeinfo does. -% But it is not possible, because Texinfo already has a command @, for a -% cedilla accent. Documents must use @comma{} instead. -% -% \anythingelse will almost certainly be an error of some kind. - - -% \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\margbackslash#1{\char`\#1 } - -\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\relax - \else - \expandafter\parsemargdef \argl;% - \if\paramno>256\relax - \ifx\eTeXversion\thisisundefined - \errhelp = \EMsimple - \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} - \fi - \fi - \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% - \addtomacrolist{\the\macname}% - \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\definedummyword\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\definedummyword \noexpand#1% - \fi -} - -% This makes use of the obscure feature that if the last token of a -% 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}} - -% For macro processing make @ a letter so that we can make Texinfo private macro names. -\edef\texiatcatcode{\the\catcode`\@} -\catcode `@=11\relax - -% 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 some hook where the argument si to be expanded. If -% there are less than 10 arguments that hook is to be replaced by ##N where N -% is the position in that list, that is to say the macro arguments are to be -% defined `a la TeX in the macro body. -% -% 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. -% -% If there are 10 or more arguments, a different technique is used, where the -% hook remains in the body, and when macro is to be expanded the body is -% processed again to replace the arguments. -% -% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the -% argument N value and then \edef the body (nothing else will expand because of -% the catcode regime underwhich the body was input). -% -% If you compile with TeX (not eTeX), and you have macros with 10 or more -% arguments, you need that no macro has more than 256 arguments, otherwise an -% error is produced. -\def\parsemargdef#1;{% - \paramno=0\def\paramlist{}% - \let\hash\relax - \let\xeatspaces\relax - \parsemargdefxxx#1,;,% - % In case that there are 10 or more arguments we parse again the arguments - % list to set new definitions for the \macarg.BLAH macros corresponding to - % each BLAH argument. It was anyhow needed to parse already once this list - % in order to count the arguments, and as macros with at most 9 arguments - % are by far more frequent than macro with 10 or more arguments, defining - % twice the \macarg.BLAH macros does not cost too much processing power. - \ifnum\paramno<10\relax\else - \paramno0\relax - \parsemmanyargdef@@#1,;,% 10 or more arguments - \fi -} -\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} - -\def\parsemmanyargdef@@#1,{% - \if#1;\let\next=\relax - \else - \let\next=\parsemmanyargdef@@ - \edef\tempb{\eatspaces{#1}}% - \expandafter\def\expandafter\tempa - \expandafter{\csname macarg.\tempb\endcsname}% - % Note that we need some extra \noexpand\noexpand, this is because we - % don't want \the to be expanded in the \parsermacbody as it uses an - % \xdef . - \expandafter\edef\tempa - {\noexpand\noexpand\noexpand\the\toks\the\paramno}% - \advance\paramno by 1\relax - \fi\next} - -% These two commands read recursive and nonrecursive macro bodies. -% (They're different since rec and nonrec macros end differently.) -% - -\catcode `\@\texiatcatcode -\long\def\parsemacbody#1@end macro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\long\def\parsermacbody#1@end rmacro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\catcode `\@=11\relax - -\let\endargs@\relax -\let\nil@\relax -\def\nilm@{\nil@}% -\long\def\nillm@{\nil@}% - -% This macro is expanded during the Texinfo macro expansion, not during its -% definition. It gets all the arguments values and assigns them to macros -% macarg.ARGNAME -% -% #1 is the macro name -% #2 is the list of argument names -% #3 is the list of argument values -\def\getargvals@#1#2#3{% - \def\macargdeflist@{}% - \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. - \def\paramlist{#2,\nil@}% - \def\macroname{#1}% - \begingroup - \macroargctxt - \def\argvaluelist{#3,\nil@}% - \def\@tempa{#3}% - \ifx\@tempa\empty - \setemptyargvalues@ - \else - \getargvals@@ - \fi -} - -% -\def\getargvals@@{% - \ifx\paramlist\nilm@ - % Some sanity check needed here that \argvaluelist is also empty. - \ifx\argvaluelist\nillm@ - \else - \errhelp = \EMsimple - \errmessage{Too many arguments in macro `\macroname'!}% - \fi - \let\next\macargexpandinbody@ - \else - \ifx\argvaluelist\nillm@ - % No more arguments values passed to macro. Set remaining named-arg - % macros to empty. - \let\next\setemptyargvalues@ - \else - % pop current arg name into \@tempb - \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% - \expandafter\@tempa\expandafter{\paramlist}% - % pop current argument value into \@tempc - \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% - \expandafter\@tempa\expandafter{\argvaluelist}% - % Here \@tempb is the current arg name and \@tempc is the current arg value. - % First place the new argument macro definition into \@tempd - \expandafter\macname\expandafter{\@tempc}% - \expandafter\let\csname macarg.\@tempb\endcsname\relax - \expandafter\def\expandafter\@tempe\expandafter{% - \csname macarg.\@tempb\endcsname}% - \edef\@tempd{\long\def\@tempe{\the\macname}}% - \push@\@tempd\macargdeflist@ - \let\next\getargvals@@ - \fi - \fi - \next -} - -\def\push@#1#2{% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter#2% - \expandafter\expandafter\expandafter{% - \expandafter#1#2}% -} - -% Replace arguments by their values in the macro body, and place the result -% in macro \@tempa -\def\macvalstoargs@{% - % To do this we use the property that token registers that are \the'ed - % within an \edef expand only once. So we are going to place all argument - % values into respective token registers. - % - % First we save the token context, and initialize argument numbering. - \begingroup - \paramno0\relax - % Then, for each argument number #N, we place the corresponding argument - % value into a new token list register \toks#N - \expandafter\putargsintokens@\saveparamlist@,;,% - % Then, we expand the body so that argument are replaced by their - % values. The trick for values not to be expanded themselves is that they - % are within tokens and that tokens expand only once in an \edef . - \edef\@tempc{\csname mac.\macroname .body\endcsname}% - % Now we restore the token stack pointer to free the token list registers - % which we have used, but we make sure that expanded body is saved after - % group. - \expandafter - \endgroup - \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% - } - -\def\macargexpandinbody@{% - %% Define the named-macro outside of this group and then close this group. - \expandafter - \endgroup - \macargdeflist@ - % First the replace in body the macro arguments by their values, the result - % is in \@tempa . - \macvalstoargs@ - % Then we point at the \norecurse or \gobble (for recursive) macro value - % with \@tempb . - \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname - % Depending on whether it is recursive or not, we need some tailing - % \egroup . - \ifx\@tempb\gobble - \let\@tempc\relax - \else - \let\@tempc\egroup - \fi - % And now we do the real job: - \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% - \@tempd -} - -\def\putargsintokens@#1,{% - \if#1;\let\next\relax - \else - \let\next\putargsintokens@ - % First we allocate the new token list register, and give it a temporary - % alias \@tempb . - \toksdef\@tempb\the\paramno - % Then we place the argument value into that token list register. - \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname - \expandafter\@tempb\expandafter{\@tempa}% - \advance\paramno by 1\relax - \fi - \next -} - -% Save the token stack pointer into macro #1 -\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} -% Restore the token stack pointer from number in macro #1 -\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} -% newtoks that can be used non \outer . -\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} - -% Tailing missing arguments are set to empty -\def\setemptyargvalues@{% - \ifx\paramlist\nilm@ - \let\next\macargexpandinbody@ - \else - \expandafter\setemptyargvaluesparser@\paramlist\endargs@ - \let\next\setemptyargvalues@ - \fi - \next -} - -\def\setemptyargvaluesparser@#1,#2\endargs@{% - \expandafter\def\expandafter\@tempa\expandafter{% - \expandafter\def\csname macarg.#1\endcsname{}}% - \push@\@tempa\macargdeflist@ - \def\paramlist{#2}% -} - -% #1 is the element target macro -% #2 is the list macro -% #3,#4\endargs@ is the list value -\def\pop@#1#2#3,#4\endargs@{% - \def#1{#3}% - \def#2{#4}% -} -\long\def\longpop@#1#2#3,#4\endargs@{% - \long\def#1{#3}% - \long\def#2{#4}% -} - -% This defines a Texinfo @macro. There are eight cases: recursive and -% nonrecursive macros of zero, one, up to nine, 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 - \ifnum\paramno<10\relax % at most 9 - \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}}% - \else % 10 or more - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\getargvals@{\the\macname}{\argl}% - }% - \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp - \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble - \fi - \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 % at most 9 - \ifnum\paramno<10\relax - \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}% - \else % 10 or more: - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\getargvals@{\the\macname}{\argl}% - }% - \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp - \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse - \fi - \fi - \fi} - -\catcode `\@\texiatcatcode\relax - -\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\macnamexxx=#1\futurelet\nchar\braceorlinexxx} -\def\braceorlinexxx{% - \ifx\nchar\bgroup\else - \expandafter\parsearg - \fi \macnamexxx} - - -% @alias. -% We need some trickery to remove the optional spaces around the equal -% sign. 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 - \addtomacrolist{#1}% - \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 \lastsection, -% 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 - \edef\writexrdef##1##2{% - \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef - ##1}{##2}}% these are parameters of \writexrdef - }% - \toks0 = \expandafter{\lastsection}% - \immediate \writexrdef{title}{\the\toks0 }% - \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. - \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout - }% - \fi -} - -% @xrefautosectiontitle on|off says whether @section(ing) names are used -% automatically in xrefs, if the third arg is not explicitly specified. -% This was provided as a "secret" @set xref-automatic-section-title -% variable, now it's official. -% -\parseargdef\xrefautomaticsectiontitle{% - \def\temp{#1}% - \ifx\temp\onword - \expandafter\let\csname SETxref-automatic-section-title\endcsname - = \empty - \else\ifx\temp\offword - \expandafter\let\csname SETxref-automatic-section-title\endcsname - = \relax - \else - \errhelp = \EMsimple - \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', - must be on|off}% - \fi\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,,,,,,,]} -% -\newbox\toprefbox -\newbox\printedrefnamebox -\newbox\infofilenamebox -\newbox\printedmanualbox -% -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup - \unsepspaces - % - % Get args without leading/trailing spaces. - \def\printedrefname{\ignorespaces #3}% - \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% - % - \def\infofilename{\ignorespaces #4}% - \setbox\infofilenamebox = \hbox{\infofilename\unskip}% - % - \def\printedmanual{\ignorespaces #5}% - \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% - % - % If the printed reference name (arg #3) was not explicitly given in - % the @xref, figure out what we want to use. - \ifdim \wd\printedrefnamebox = 0pt - % No printed node name was explicitly given. - \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax - % Not auto section-title: use node name inside the square brackets. - \def\printedrefname{\ignorespaces #1}% - \else - % Auto section-title: use chapter/section title inside - % the square brackets if we have it. - \ifdim \wd\printedmanualbox > 0pt - % It is in another manual, so we don't have it; use node name. - \def\printedrefname{\ignorespaces #1}% - \else - \ifhavexrefs - % We (should) 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 - {\indexnofonts - \turnoffactive - \makevalueexpandable - % This expands tokens, so do it after making catcode changes, so _ - % etc. don't get their TeX definitions. This ignores all spaces in - % #4, including (wrongly) those in the middle of the filename. - \getfilename{#4}% - % - % This (wrongly) does not take account of leading or trailing - % spaces in #1, which should be ignored. - \edef\pdfxrefdest{#1}% - \ifx\pdfxrefdest\empty - \def\pdfxrefdest{Top}% no empty targets - \else - \txiescapepdf\pdfxrefdest % escape PDF special chars - \fi - % - \leavevmode - \startlink attr{/Border [0 0 0]}% - \ifnum\filenamelength>0 - goto file{\the\filename.pdf} name{\pdfxrefdest}% - \else - goto name{\pdfmkpgn{\pdfxrefdest}}% - \fi - }% - \setcolor{\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 - \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\wd\printedrefnamebox = 0pt - \refx{#1-snt}{}% - \else - \printedrefname - \fi - % - % If the user also gave the printed manual name (fifth arg), append - % "in MANUALNAME". - \ifdim \wd\printedmanualbox > 0pt - \space \putwordin{} \cite{\printedmanual}% - \fi - \else - % node/anchor (non-float) references. - % - % If we use \unhbox 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 \wd\printedmanualbox > 0pt - % Cross-manual reference with a printed manual name. - % - \crossmanualxref{\cite{\printedmanual\unskip}}% - % - \else\ifdim \wd\infofilenamebox > 0pt - % Cross-manual reference with only an info filename (arg 4), no - % printed manual name (arg 5). This is essentially the same as - % the case above; we output the filename, since we have nothing else. - % - \crossmanualxref{\code{\infofilename\unskip}}% - % - \else - % Reference within this manual. - % - % _ (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 - % 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 the macro below so it can be overridden. - \xrefprintnodename\printedrefname - % - % But we always want a comma and a space: - ,\space - % - % output the `page 3'. - \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \fi\fi - \fi - \endlink -\endgroup} - -% Output a cross-manual xref to #1. Used just above (twice). -% -% Only include the text "Section ``foo'' in" if the foo is neither -% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply -% "see The Foo Manual", the idea being to refer to the whole manual. -% -% But, this being TeX, we can't easily compare our node name against the -% string "Top" while ignoring the possible spaces before and after in -% the input. By adding the arbitrary 7sp below, we make it much less -% likely that a real node name would have the same width as "Top" (e.g., -% in a monospaced font). Hopefully it will never happen in practice. -% -% For the same basic reason, we retypeset the "Top" at every -% reference, since the current font is indeterminate. -% -\def\crossmanualxref#1{% - \setbox\toprefbox = \hbox{Top\kern7sp}% - \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% - \ifdim \wd2 > 7sp % nonempty? - \ifdim \wd2 = \wd\toprefbox \else % same as Top? - \putwordSection{} ``\printedrefname'' \putwordin{}\space - \fi - \fi - #1% -} - -% 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 - {\toks0 = {#1}% avoid expansion of possibly-complex value - \message{\linenumber Undefined cross reference `\the\toks0'.}}% - \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{% - {% The node name might contain 8-bit characters, which in our current - % implementation are changed to commands like @'e. Don't let these - % mess up the control sequence name. - \indexnofonts - \turnoffactive - \xdef\safexrefname{#1}% - }% - % - \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref - % - % Was that xref control sequence that we just defined for a float? - \expandafter\iffloat\csname XR\safexrefname\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 - {\safexrefname}}% - \fi -} - -% Read the last existing aux file, if any. No error if none exists. -% -\def\tryauxfile{% - \openin 1 \jobname.aux - \ifeof 1 \else - \readdatafile{aux}% - \global\havexrefstrue - \fi - \closein 1 -} - -\def\setupdatafile{% - \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. - {% - \count1=128 - \def\loop{% - \catcode\count1=\other - \advance\count1 by 1 - \ifnum \count1<256 \loop \fi - }% - }% - % - % @ is our escape character in .aux files, and we need braces. - \catcode`\{=1 - \catcode`\}=2 - \catcode`\@=0 -} - -\def\readdatafile#1{% -\begingroup - \setupdatafile - \input\jobname.#1 -\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 - % - % Invoke rest of plain TeX footnote routine. - \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. -% Similarly, 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\thisisundefined - \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 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 - \else \ifx\centersub\centerV - % for @center @image, we need a vbox so we can have our vertical space - \imagevmodetrue - \vbox\bgroup % vbox has better behavior than vtop herev - \fi\fi - % - \ifimagevmode - \nobreak\medskip - % 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 - \fi - % - % Leave vertical mode so that indentation from an enclosing - % environment such as @quotation is respected. - % However, if we're at the top level, we don't want the - % normal paragraph indentation. - % On the other hand, if we are in the case of @center @image, we don't - % want to start a paragraph, which will create a hsize-width box and - % eradicate the centering. - \ifx\centersub\centerV\else \noindent \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 - \medskip % space after a standalone image - \fi - \ifx\centersub\centerV \egroup \fi -\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 \lastsection 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\lastsection{\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 - % - % 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 floating, 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 -% \lastsection 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,} - -% For single-language documents, @documentlanguage is usually given very -% early, just after @documentencoding. Single argument is the language -% (de) or locale (de_DE) abbreviation. -% -{ - \catcode`\_ = \active - \globaldefs=1 -\parseargdef\documentlanguage{\begingroup - \let_=\normalunderscore % normal _ character for filenames - \tex % read txi-??.tex file in plain TeX. - % Read the file by the name they passed if it exists. - \openin 1 txi-#1.tex - \ifeof 1 - \documentlanguagetrywithoutunderscore{#1_\finish}% - \else - \globaldefs = 1 % everything in the txi-LL files needs to persist - \input txi-#1.tex - \fi - \closein 1 - \endgroup % end raw TeX -\endgroup} -% -% If they passed de_DE, and txi-de_DE.tex doesn't exist, -% try txi-de.tex. -% -\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% - \openin 1 txi-#1.tex - \ifeof 1 - \errhelp = \nolanghelp - \errmessage{Cannot read language file txi-#1.tex}% - \else - \globaldefs = 1 % everything in the txi-LL files needs to persist - \input txi-#1.tex - \fi - \closein 1 -} -}% end of special _ catcode -% -\newhelp\nolanghelp{The given language definition file cannot be found or -is empty. Maybe you need to install it? Putting it in the current -directory should work if nowhere else does.} - -% This macro is called from txi-??.tex files; the first argument is the -% \language name to set (without the "\lang@" prefix), the second and -% third args are \{left,right}hyphenmin. -% -% The language names to pass are determined when the format is built. -% See the etex.log file created at that time, e.g., -% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. -% -% With TeX Live 2008, etex now includes hyphenation patterns for all -% available languages. This means we can support hyphenation in -% Texinfo, at least to some extent. (This still doesn't solve the -% accented characters problem.) -% -\catcode`@=11 -\def\txisetlanguage#1#2#3{% - % do not set the language if the name is undefined in the current TeX. - \expandafter\ifx\csname lang@#1\endcsname \relax - \message{no patterns for #1}% - \else - \global\language = \csname lang@#1\endcsname - \fi - % but there is no harm in adjusting the hyphenmin values regardless. - \global\lefthyphenmin = #2\relax - \global\righthyphenmin = #3\relax -} - -% Helpers for encodings. -% Set the catcode of characters 128 through 255 to the specified number. -% -\def\setnonasciicharscatcode#1{% - \count255=128 - \loop\ifnum\count255<256 - \global\catcode\count255=#1\relax - \advance\count255 by 1 - \repeat -} - -\def\setnonasciicharscatcodenonglobal#1{% - \count255=128 - \loop\ifnum\count255<256 - \catcode\count255=#1\relax - \advance\count255 by 1 - \repeat -} - -% @documentencoding sets the definition of non-ASCII characters -% according to the specified encoding. -% -\parseargdef\documentencoding{% - % Encoding being declared for the document. - \def\declaredencoding{\csname #1.enc\endcsname}% - % - % Supported encodings: names converted to tokens in order to be able - % to compare them with \ifx. - \def\ascii{\csname US-ASCII.enc\endcsname}% - \def\latnine{\csname ISO-8859-15.enc\endcsname}% - \def\latone{\csname ISO-8859-1.enc\endcsname}% - \def\lattwo{\csname ISO-8859-2.enc\endcsname}% - \def\utfeight{\csname UTF-8.enc\endcsname}% - % - \ifx \declaredencoding \ascii - \asciichardefs - % - \else \ifx \declaredencoding \lattwo - \setnonasciicharscatcode\active - \lattwochardefs - % - \else \ifx \declaredencoding \latone - \setnonasciicharscatcode\active - \latonechardefs - % - \else \ifx \declaredencoding \latnine - \setnonasciicharscatcode\active - \latninechardefs - % - \else \ifx \declaredencoding \utfeight - \setnonasciicharscatcode\active - \utfeightchardefs - % - \else - \message{Unknown document encoding #1, ignoring.}% - % - \fi % utfeight - \fi % latnine - \fi % latone - \fi % lattwo - \fi % ascii -} - -% A message to be logged when using a character that isn't available -% the default font encoding (OT1). -% -\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} - -% Take account of \c (plain) vs. \, (Texinfo) difference. -\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} - -% First, make active non-ASCII characters in order for them to be -% correctly categorized when TeX reads the replacement text of -% macros containing the character definitions. -\setnonasciicharscatcode\active -% -% Latin1 (ISO-8859-1) character definitions. -\def\latonechardefs{% - \gdef^^a0{\tie} - \gdef^^a1{\exclamdown} - \gdef^^a2{\missingcharmsg{CENT SIGN}} - \gdef^^a3{{\pounds}} - \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} - \gdef^^a5{\missingcharmsg{YEN SIGN}} - \gdef^^a6{\missingcharmsg{BROKEN BAR}} - \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\copyright} - \gdef^^aa{\ordf} - \gdef^^ab{\guillemetleft} - \gdef^^ac{$\lnot$} - \gdef^^ad{\-} - \gdef^^ae{\registeredsymbol} - \gdef^^af{\={}} - % - \gdef^^b0{\textdegree} - \gdef^^b1{$\pm$} - \gdef^^b2{$^2$} - \gdef^^b3{$^3$} - \gdef^^b4{\'{}} - \gdef^^b5{$\mu$} - \gdef^^b6{\P} - % - \gdef^^b7{$^.$} - \gdef^^b8{\cedilla\ } - \gdef^^b9{$^1$} - \gdef^^ba{\ordm} - % - \gdef^^bb{\guillemetright} - \gdef^^bc{$1\over4$} - \gdef^^bd{$1\over2$} - \gdef^^be{$3\over4$} - \gdef^^bf{\questiondown} - % - \gdef^^c0{\`A} - \gdef^^c1{\'A} - \gdef^^c2{\^A} - \gdef^^c3{\~A} - \gdef^^c4{\"A} - \gdef^^c5{\ringaccent A} - \gdef^^c6{\AE} - \gdef^^c7{\cedilla C} - \gdef^^c8{\`E} - \gdef^^c9{\'E} - \gdef^^ca{\^E} - \gdef^^cb{\"E} - \gdef^^cc{\`I} - \gdef^^cd{\'I} - \gdef^^ce{\^I} - \gdef^^cf{\"I} - % - \gdef^^d0{\DH} - \gdef^^d1{\~N} - \gdef^^d2{\`O} - \gdef^^d3{\'O} - \gdef^^d4{\^O} - \gdef^^d5{\~O} - \gdef^^d6{\"O} - \gdef^^d7{$\times$} - \gdef^^d8{\O} - \gdef^^d9{\`U} - \gdef^^da{\'U} - \gdef^^db{\^U} - \gdef^^dc{\"U} - \gdef^^dd{\'Y} - \gdef^^de{\TH} - \gdef^^df{\ss} - % - \gdef^^e0{\`a} - \gdef^^e1{\'a} - \gdef^^e2{\^a} - \gdef^^e3{\~a} - \gdef^^e4{\"a} - \gdef^^e5{\ringaccent a} - \gdef^^e6{\ae} - \gdef^^e7{\cedilla c} - \gdef^^e8{\`e} - \gdef^^e9{\'e} - \gdef^^ea{\^e} - \gdef^^eb{\"e} - \gdef^^ec{\`{\dotless i}} - \gdef^^ed{\'{\dotless i}} - \gdef^^ee{\^{\dotless i}} - \gdef^^ef{\"{\dotless i}} - % - \gdef^^f0{\dh} - \gdef^^f1{\~n} - \gdef^^f2{\`o} - \gdef^^f3{\'o} - \gdef^^f4{\^o} - \gdef^^f5{\~o} - \gdef^^f6{\"o} - \gdef^^f7{$\div$} - \gdef^^f8{\o} - \gdef^^f9{\`u} - \gdef^^fa{\'u} - \gdef^^fb{\^u} - \gdef^^fc{\"u} - \gdef^^fd{\'y} - \gdef^^fe{\th} - \gdef^^ff{\"y} -} - -% Latin9 (ISO-8859-15) encoding character definitions. -\def\latninechardefs{% - % Encoding is almost identical to Latin1. - \latonechardefs - % - \gdef^^a4{\euro} - \gdef^^a6{\v S} - \gdef^^a8{\v s} - \gdef^^b4{\v Z} - \gdef^^b8{\v z} - \gdef^^bc{\OE} - \gdef^^bd{\oe} - \gdef^^be{\"Y} -} - -% Latin2 (ISO-8859-2) character definitions. -\def\lattwochardefs{% - \gdef^^a0{\tie} - \gdef^^a1{\ogonek{A}} - \gdef^^a2{\u{}} - \gdef^^a3{\L} - \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} - \gdef^^a5{\v L} - \gdef^^a6{\'S} - \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\v S} - \gdef^^aa{\cedilla S} - \gdef^^ab{\v T} - \gdef^^ac{\'Z} - \gdef^^ad{\-} - \gdef^^ae{\v Z} - \gdef^^af{\dotaccent Z} - % - \gdef^^b0{\textdegree} - \gdef^^b1{\ogonek{a}} - \gdef^^b2{\ogonek{ }} - \gdef^^b3{\l} - \gdef^^b4{\'{}} - \gdef^^b5{\v l} - \gdef^^b6{\'s} - \gdef^^b7{\v{}} - \gdef^^b8{\cedilla\ } - \gdef^^b9{\v s} - \gdef^^ba{\cedilla s} - \gdef^^bb{\v t} - \gdef^^bc{\'z} - \gdef^^bd{\H{}} - \gdef^^be{\v z} - \gdef^^bf{\dotaccent z} - % - \gdef^^c0{\'R} - \gdef^^c1{\'A} - \gdef^^c2{\^A} - \gdef^^c3{\u A} - \gdef^^c4{\"A} - \gdef^^c5{\'L} - \gdef^^c6{\'C} - \gdef^^c7{\cedilla C} - \gdef^^c8{\v C} - \gdef^^c9{\'E} - \gdef^^ca{\ogonek{E}} - \gdef^^cb{\"E} - \gdef^^cc{\v E} - \gdef^^cd{\'I} - \gdef^^ce{\^I} - \gdef^^cf{\v D} - % - \gdef^^d0{\DH} - \gdef^^d1{\'N} - \gdef^^d2{\v N} - \gdef^^d3{\'O} - \gdef^^d4{\^O} - \gdef^^d5{\H O} - \gdef^^d6{\"O} - \gdef^^d7{$\times$} - \gdef^^d8{\v R} - \gdef^^d9{\ringaccent U} - \gdef^^da{\'U} - \gdef^^db{\H U} - \gdef^^dc{\"U} - \gdef^^dd{\'Y} - \gdef^^de{\cedilla T} - \gdef^^df{\ss} - % - \gdef^^e0{\'r} - \gdef^^e1{\'a} - \gdef^^e2{\^a} - \gdef^^e3{\u a} - \gdef^^e4{\"a} - \gdef^^e5{\'l} - \gdef^^e6{\'c} - \gdef^^e7{\cedilla c} - \gdef^^e8{\v c} - \gdef^^e9{\'e} - \gdef^^ea{\ogonek{e}} - \gdef^^eb{\"e} - \gdef^^ec{\v e} - \gdef^^ed{\'{\dotless{i}}} - \gdef^^ee{\^{\dotless{i}}} - \gdef^^ef{\v d} - % - \gdef^^f0{\dh} - \gdef^^f1{\'n} - \gdef^^f2{\v n} - \gdef^^f3{\'o} - \gdef^^f4{\^o} - \gdef^^f5{\H o} - \gdef^^f6{\"o} - \gdef^^f7{$\div$} - \gdef^^f8{\v r} - \gdef^^f9{\ringaccent u} - \gdef^^fa{\'u} - \gdef^^fb{\H u} - \gdef^^fc{\"u} - \gdef^^fd{\'y} - \gdef^^fe{\cedilla t} - \gdef^^ff{\dotaccent{}} -} - -% UTF-8 character definitions. -% -% This code to support UTF-8 is based on LaTeX's utf8.def, with some -% changes for Texinfo conventions. It is included here under the GPL by -% permission from Frank Mittelbach and the LaTeX team. -% -\newcount\countUTFx -\newcount\countUTFy -\newcount\countUTFz - -\gdef\UTFviiiTwoOctets#1#2{\expandafter - \UTFviiiDefined\csname u8:#1\string #2\endcsname} -% -\gdef\UTFviiiThreeOctets#1#2#3{\expandafter - \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} -% -\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter - \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} - -\gdef\UTFviiiDefined#1{% - \ifx #1\relax - \message{\linenumber Unicode char \string #1 not defined for Texinfo}% - \else - \expandafter #1% - \fi -} - -\begingroup - \catcode`\~13 - \catcode`\"12 - - \def\UTFviiiLoop{% - \global\catcode\countUTFx\active - \uccode`\~\countUTFx - \uppercase\expandafter{\UTFviiiTmp}% - \advance\countUTFx by 1 - \ifnum\countUTFx < \countUTFy - \expandafter\UTFviiiLoop - \fi} - - \countUTFx = "C2 - \countUTFy = "E0 - \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiTwoOctets\string~}} - \UTFviiiLoop - - \countUTFx = "E0 - \countUTFy = "F0 - \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiThreeOctets\string~}} - \UTFviiiLoop - - \countUTFx = "F0 - \countUTFy = "F4 - \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiFourOctets\string~}} - \UTFviiiLoop -\endgroup - -\begingroup - \catcode`\"=12 - \catcode`\<=12 - \catcode`\.=12 - \catcode`\,=12 - \catcode`\;=12 - \catcode`\!=12 - \catcode`\~=13 - - \gdef\DeclareUnicodeCharacter#1#2{% - \countUTFz = "#1\relax - %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% - \begingroup - \parseXMLCharref - \def\UTFviiiTwoOctets##1##2{% - \csname u8:##1\string ##2\endcsname}% - \def\UTFviiiThreeOctets##1##2##3{% - \csname u8:##1\string ##2\string ##3\endcsname}% - \def\UTFviiiFourOctets##1##2##3##4{% - \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% - \expandafter\expandafter\expandafter\expandafter - \expandafter\expandafter\expandafter - \gdef\UTFviiiTmp{#2}% - \endgroup} - - \gdef\parseXMLCharref{% - \ifnum\countUTFz < "A0\relax - \errhelp = \EMsimple - \errmessage{Cannot define Unicode char value < 00A0}% - \else\ifnum\countUTFz < "800\relax - \parseUTFviiiA,% - \parseUTFviiiB C\UTFviiiTwoOctets.,% - \else\ifnum\countUTFz < "10000\relax - \parseUTFviiiA;% - \parseUTFviiiA,% - \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% - \else - \parseUTFviiiA;% - \parseUTFviiiA,% - \parseUTFviiiA!% - \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% - \fi\fi\fi - } - - \gdef\parseUTFviiiA#1{% - \countUTFx = \countUTFz - \divide\countUTFz by 64 - \countUTFy = \countUTFz - \multiply\countUTFz by 64 - \advance\countUTFx by -\countUTFz - \advance\countUTFx by 128 - \uccode `#1\countUTFx - \countUTFz = \countUTFy} - - \gdef\parseUTFviiiB#1#2#3#4{% - \advance\countUTFz by "#10\relax - \uccode `#3\countUTFz - \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} -\endgroup - -\def\utfeightchardefs{% - \DeclareUnicodeCharacter{00A0}{\tie} - \DeclareUnicodeCharacter{00A1}{\exclamdown} - \DeclareUnicodeCharacter{00A3}{\pounds} - \DeclareUnicodeCharacter{00A8}{\"{ }} - \DeclareUnicodeCharacter{00A9}{\copyright} - \DeclareUnicodeCharacter{00AA}{\ordf} - \DeclareUnicodeCharacter{00AB}{\guillemetleft} - \DeclareUnicodeCharacter{00AD}{\-} - \DeclareUnicodeCharacter{00AE}{\registeredsymbol} - \DeclareUnicodeCharacter{00AF}{\={ }} - - \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} - \DeclareUnicodeCharacter{00B4}{\'{ }} - \DeclareUnicodeCharacter{00B8}{\cedilla{ }} - \DeclareUnicodeCharacter{00BA}{\ordm} - \DeclareUnicodeCharacter{00BB}{\guillemetright} - \DeclareUnicodeCharacter{00BF}{\questiondown} - - \DeclareUnicodeCharacter{00C0}{\`A} - \DeclareUnicodeCharacter{00C1}{\'A} - \DeclareUnicodeCharacter{00C2}{\^A} - \DeclareUnicodeCharacter{00C3}{\~A} - \DeclareUnicodeCharacter{00C4}{\"A} - \DeclareUnicodeCharacter{00C5}{\AA} - \DeclareUnicodeCharacter{00C6}{\AE} - \DeclareUnicodeCharacter{00C7}{\cedilla{C}} - \DeclareUnicodeCharacter{00C8}{\`E} - \DeclareUnicodeCharacter{00C9}{\'E} - \DeclareUnicodeCharacter{00CA}{\^E} - \DeclareUnicodeCharacter{00CB}{\"E} - \DeclareUnicodeCharacter{00CC}{\`I} - \DeclareUnicodeCharacter{00CD}{\'I} - \DeclareUnicodeCharacter{00CE}{\^I} - \DeclareUnicodeCharacter{00CF}{\"I} - - \DeclareUnicodeCharacter{00D0}{\DH} - \DeclareUnicodeCharacter{00D1}{\~N} - \DeclareUnicodeCharacter{00D2}{\`O} - \DeclareUnicodeCharacter{00D3}{\'O} - \DeclareUnicodeCharacter{00D4}{\^O} - \DeclareUnicodeCharacter{00D5}{\~O} - \DeclareUnicodeCharacter{00D6}{\"O} - \DeclareUnicodeCharacter{00D8}{\O} - \DeclareUnicodeCharacter{00D9}{\`U} - \DeclareUnicodeCharacter{00DA}{\'U} - \DeclareUnicodeCharacter{00DB}{\^U} - \DeclareUnicodeCharacter{00DC}{\"U} - \DeclareUnicodeCharacter{00DD}{\'Y} - \DeclareUnicodeCharacter{00DE}{\TH} - \DeclareUnicodeCharacter{00DF}{\ss} - - \DeclareUnicodeCharacter{00E0}{\`a} - \DeclareUnicodeCharacter{00E1}{\'a} - \DeclareUnicodeCharacter{00E2}{\^a} - \DeclareUnicodeCharacter{00E3}{\~a} - \DeclareUnicodeCharacter{00E4}{\"a} - \DeclareUnicodeCharacter{00E5}{\aa} - \DeclareUnicodeCharacter{00E6}{\ae} - \DeclareUnicodeCharacter{00E7}{\cedilla{c}} - \DeclareUnicodeCharacter{00E8}{\`e} - \DeclareUnicodeCharacter{00E9}{\'e} - \DeclareUnicodeCharacter{00EA}{\^e} - \DeclareUnicodeCharacter{00EB}{\"e} - \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} - \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} - \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} - \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} - - \DeclareUnicodeCharacter{00F0}{\dh} - \DeclareUnicodeCharacter{00F1}{\~n} - \DeclareUnicodeCharacter{00F2}{\`o} - \DeclareUnicodeCharacter{00F3}{\'o} - \DeclareUnicodeCharacter{00F4}{\^o} - \DeclareUnicodeCharacter{00F5}{\~o} - \DeclareUnicodeCharacter{00F6}{\"o} - \DeclareUnicodeCharacter{00F8}{\o} - \DeclareUnicodeCharacter{00F9}{\`u} - \DeclareUnicodeCharacter{00FA}{\'u} - \DeclareUnicodeCharacter{00FB}{\^u} - \DeclareUnicodeCharacter{00FC}{\"u} - \DeclareUnicodeCharacter{00FD}{\'y} - \DeclareUnicodeCharacter{00FE}{\th} - \DeclareUnicodeCharacter{00FF}{\"y} - - \DeclareUnicodeCharacter{0100}{\=A} - \DeclareUnicodeCharacter{0101}{\=a} - \DeclareUnicodeCharacter{0102}{\u{A}} - \DeclareUnicodeCharacter{0103}{\u{a}} - \DeclareUnicodeCharacter{0104}{\ogonek{A}} - \DeclareUnicodeCharacter{0105}{\ogonek{a}} - \DeclareUnicodeCharacter{0106}{\'C} - \DeclareUnicodeCharacter{0107}{\'c} - \DeclareUnicodeCharacter{0108}{\^C} - \DeclareUnicodeCharacter{0109}{\^c} - \DeclareUnicodeCharacter{0118}{\ogonek{E}} - \DeclareUnicodeCharacter{0119}{\ogonek{e}} - \DeclareUnicodeCharacter{010A}{\dotaccent{C}} - \DeclareUnicodeCharacter{010B}{\dotaccent{c}} - \DeclareUnicodeCharacter{010C}{\v{C}} - \DeclareUnicodeCharacter{010D}{\v{c}} - \DeclareUnicodeCharacter{010E}{\v{D}} - - \DeclareUnicodeCharacter{0112}{\=E} - \DeclareUnicodeCharacter{0113}{\=e} - \DeclareUnicodeCharacter{0114}{\u{E}} - \DeclareUnicodeCharacter{0115}{\u{e}} - \DeclareUnicodeCharacter{0116}{\dotaccent{E}} - \DeclareUnicodeCharacter{0117}{\dotaccent{e}} - \DeclareUnicodeCharacter{011A}{\v{E}} - \DeclareUnicodeCharacter{011B}{\v{e}} - \DeclareUnicodeCharacter{011C}{\^G} - \DeclareUnicodeCharacter{011D}{\^g} - \DeclareUnicodeCharacter{011E}{\u{G}} - \DeclareUnicodeCharacter{011F}{\u{g}} - - \DeclareUnicodeCharacter{0120}{\dotaccent{G}} - \DeclareUnicodeCharacter{0121}{\dotaccent{g}} - \DeclareUnicodeCharacter{0124}{\^H} - \DeclareUnicodeCharacter{0125}{\^h} - \DeclareUnicodeCharacter{0128}{\~I} - \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} - \DeclareUnicodeCharacter{012A}{\=I} - \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} - \DeclareUnicodeCharacter{012C}{\u{I}} - \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} - - \DeclareUnicodeCharacter{0130}{\dotaccent{I}} - \DeclareUnicodeCharacter{0131}{\dotless{i}} - \DeclareUnicodeCharacter{0132}{IJ} - \DeclareUnicodeCharacter{0133}{ij} - \DeclareUnicodeCharacter{0134}{\^J} - \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} - \DeclareUnicodeCharacter{0139}{\'L} - \DeclareUnicodeCharacter{013A}{\'l} - - \DeclareUnicodeCharacter{0141}{\L} - \DeclareUnicodeCharacter{0142}{\l} - \DeclareUnicodeCharacter{0143}{\'N} - \DeclareUnicodeCharacter{0144}{\'n} - \DeclareUnicodeCharacter{0147}{\v{N}} - \DeclareUnicodeCharacter{0148}{\v{n}} - \DeclareUnicodeCharacter{014C}{\=O} - \DeclareUnicodeCharacter{014D}{\=o} - \DeclareUnicodeCharacter{014E}{\u{O}} - \DeclareUnicodeCharacter{014F}{\u{o}} - - \DeclareUnicodeCharacter{0150}{\H{O}} - \DeclareUnicodeCharacter{0151}{\H{o}} - \DeclareUnicodeCharacter{0152}{\OE} - \DeclareUnicodeCharacter{0153}{\oe} - \DeclareUnicodeCharacter{0154}{\'R} - \DeclareUnicodeCharacter{0155}{\'r} - \DeclareUnicodeCharacter{0158}{\v{R}} - \DeclareUnicodeCharacter{0159}{\v{r}} - \DeclareUnicodeCharacter{015A}{\'S} - \DeclareUnicodeCharacter{015B}{\'s} - \DeclareUnicodeCharacter{015C}{\^S} - \DeclareUnicodeCharacter{015D}{\^s} - \DeclareUnicodeCharacter{015E}{\cedilla{S}} - \DeclareUnicodeCharacter{015F}{\cedilla{s}} - - \DeclareUnicodeCharacter{0160}{\v{S}} - \DeclareUnicodeCharacter{0161}{\v{s}} - \DeclareUnicodeCharacter{0162}{\cedilla{t}} - \DeclareUnicodeCharacter{0163}{\cedilla{T}} - \DeclareUnicodeCharacter{0164}{\v{T}} - - \DeclareUnicodeCharacter{0168}{\~U} - \DeclareUnicodeCharacter{0169}{\~u} - \DeclareUnicodeCharacter{016A}{\=U} - \DeclareUnicodeCharacter{016B}{\=u} - \DeclareUnicodeCharacter{016C}{\u{U}} - \DeclareUnicodeCharacter{016D}{\u{u}} - \DeclareUnicodeCharacter{016E}{\ringaccent{U}} - \DeclareUnicodeCharacter{016F}{\ringaccent{u}} - - \DeclareUnicodeCharacter{0170}{\H{U}} - \DeclareUnicodeCharacter{0171}{\H{u}} - \DeclareUnicodeCharacter{0174}{\^W} - \DeclareUnicodeCharacter{0175}{\^w} - \DeclareUnicodeCharacter{0176}{\^Y} - \DeclareUnicodeCharacter{0177}{\^y} - \DeclareUnicodeCharacter{0178}{\"Y} - \DeclareUnicodeCharacter{0179}{\'Z} - \DeclareUnicodeCharacter{017A}{\'z} - \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} - \DeclareUnicodeCharacter{017C}{\dotaccent{z}} - \DeclareUnicodeCharacter{017D}{\v{Z}} - \DeclareUnicodeCharacter{017E}{\v{z}} - - \DeclareUnicodeCharacter{01C4}{D\v{Z}} - \DeclareUnicodeCharacter{01C5}{D\v{z}} - \DeclareUnicodeCharacter{01C6}{d\v{z}} - \DeclareUnicodeCharacter{01C7}{LJ} - \DeclareUnicodeCharacter{01C8}{Lj} - \DeclareUnicodeCharacter{01C9}{lj} - \DeclareUnicodeCharacter{01CA}{NJ} - \DeclareUnicodeCharacter{01CB}{Nj} - \DeclareUnicodeCharacter{01CC}{nj} - \DeclareUnicodeCharacter{01CD}{\v{A}} - \DeclareUnicodeCharacter{01CE}{\v{a}} - \DeclareUnicodeCharacter{01CF}{\v{I}} - - \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} - \DeclareUnicodeCharacter{01D1}{\v{O}} - \DeclareUnicodeCharacter{01D2}{\v{o}} - \DeclareUnicodeCharacter{01D3}{\v{U}} - \DeclareUnicodeCharacter{01D4}{\v{u}} - - \DeclareUnicodeCharacter{01E2}{\={\AE}} - \DeclareUnicodeCharacter{01E3}{\={\ae}} - \DeclareUnicodeCharacter{01E6}{\v{G}} - \DeclareUnicodeCharacter{01E7}{\v{g}} - \DeclareUnicodeCharacter{01E8}{\v{K}} - \DeclareUnicodeCharacter{01E9}{\v{k}} - - \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} - \DeclareUnicodeCharacter{01F1}{DZ} - \DeclareUnicodeCharacter{01F2}{Dz} - \DeclareUnicodeCharacter{01F3}{dz} - \DeclareUnicodeCharacter{01F4}{\'G} - \DeclareUnicodeCharacter{01F5}{\'g} - \DeclareUnicodeCharacter{01F8}{\`N} - \DeclareUnicodeCharacter{01F9}{\`n} - \DeclareUnicodeCharacter{01FC}{\'{\AE}} - \DeclareUnicodeCharacter{01FD}{\'{\ae}} - \DeclareUnicodeCharacter{01FE}{\'{\O}} - \DeclareUnicodeCharacter{01FF}{\'{\o}} - - \DeclareUnicodeCharacter{021E}{\v{H}} - \DeclareUnicodeCharacter{021F}{\v{h}} - - \DeclareUnicodeCharacter{0226}{\dotaccent{A}} - \DeclareUnicodeCharacter{0227}{\dotaccent{a}} - \DeclareUnicodeCharacter{0228}{\cedilla{E}} - \DeclareUnicodeCharacter{0229}{\cedilla{e}} - \DeclareUnicodeCharacter{022E}{\dotaccent{O}} - \DeclareUnicodeCharacter{022F}{\dotaccent{o}} - - \DeclareUnicodeCharacter{0232}{\=Y} - \DeclareUnicodeCharacter{0233}{\=y} - \DeclareUnicodeCharacter{0237}{\dotless{j}} - - \DeclareUnicodeCharacter{02DB}{\ogonek{ }} - - \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} - \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} - \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} - \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} - \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} - \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} - \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} - \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} - \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} - \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} - \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} - \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} - - \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} - \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} - - \DeclareUnicodeCharacter{1E20}{\=G} - \DeclareUnicodeCharacter{1E21}{\=g} - \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} - \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} - \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} - \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} - \DeclareUnicodeCharacter{1E26}{\"H} - \DeclareUnicodeCharacter{1E27}{\"h} - - \DeclareUnicodeCharacter{1E30}{\'K} - \DeclareUnicodeCharacter{1E31}{\'k} - \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} - \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} - \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} - \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} - \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} - \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} - \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} - \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} - \DeclareUnicodeCharacter{1E3E}{\'M} - \DeclareUnicodeCharacter{1E3F}{\'m} - - \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} - \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} - \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} - \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} - \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} - \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} - \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} - \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} - \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} - \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} - - \DeclareUnicodeCharacter{1E54}{\'P} - \DeclareUnicodeCharacter{1E55}{\'p} - \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} - \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} - \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} - \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} - \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} - \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} - \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} - \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} - - \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} - \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} - \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} - \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} - \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} - \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} - \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} - \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} - \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} - \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} - - \DeclareUnicodeCharacter{1E7C}{\~V} - \DeclareUnicodeCharacter{1E7D}{\~v} - \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} - \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} - - \DeclareUnicodeCharacter{1E80}{\`W} - \DeclareUnicodeCharacter{1E81}{\`w} - \DeclareUnicodeCharacter{1E82}{\'W} - \DeclareUnicodeCharacter{1E83}{\'w} - \DeclareUnicodeCharacter{1E84}{\"W} - \DeclareUnicodeCharacter{1E85}{\"w} - \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} - \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} - \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} - \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} - \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} - \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} - \DeclareUnicodeCharacter{1E8C}{\"X} - \DeclareUnicodeCharacter{1E8D}{\"x} - \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} - \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} - - \DeclareUnicodeCharacter{1E90}{\^Z} - \DeclareUnicodeCharacter{1E91}{\^z} - \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} - \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} - \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} - \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} - \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} - \DeclareUnicodeCharacter{1E97}{\"t} - \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} - \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} - - \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} - \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} - - \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} - \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} - \DeclareUnicodeCharacter{1EBC}{\~E} - \DeclareUnicodeCharacter{1EBD}{\~e} - - \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} - \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} - \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} - \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} - - \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} - \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} - - \DeclareUnicodeCharacter{1EF2}{\`Y} - \DeclareUnicodeCharacter{1EF3}{\`y} - \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} - - \DeclareUnicodeCharacter{1EF8}{\~Y} - \DeclareUnicodeCharacter{1EF9}{\~y} - - \DeclareUnicodeCharacter{2013}{--} - \DeclareUnicodeCharacter{2014}{---} - \DeclareUnicodeCharacter{2018}{\quoteleft} - \DeclareUnicodeCharacter{2019}{\quoteright} - \DeclareUnicodeCharacter{201A}{\quotesinglbase} - \DeclareUnicodeCharacter{201C}{\quotedblleft} - \DeclareUnicodeCharacter{201D}{\quotedblright} - \DeclareUnicodeCharacter{201E}{\quotedblbase} - \DeclareUnicodeCharacter{2022}{\bullet} - \DeclareUnicodeCharacter{2026}{\dots} - \DeclareUnicodeCharacter{2039}{\guilsinglleft} - \DeclareUnicodeCharacter{203A}{\guilsinglright} - \DeclareUnicodeCharacter{20AC}{\euro} - - \DeclareUnicodeCharacter{2192}{\expansion} - \DeclareUnicodeCharacter{21D2}{\result} - - \DeclareUnicodeCharacter{2212}{\minus} - \DeclareUnicodeCharacter{2217}{\point} - \DeclareUnicodeCharacter{2261}{\equiv} -}% end of \utfeightchardefs - - -% US-ASCII character definitions. -\def\asciichardefs{% nothing need be done - \relax -} - -% Make non-ASCII characters printable again for compatibility with -% existing Texinfo documents that may use them, even without declaring a -% document encoding. -% -\setnonasciicharscatcode \other - - -\message{formatting,} - -\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 very finicky about underfull hboxes, either. -\hbadness = 6666 - -% Following George Bush, 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 - % if we don't reset these, they will remain at "1 true in" of - % whatever layout pdftex was dumped with. - \pdfhorigin = 1 true in - \pdfvorigin = 1 true in - \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{607.2pt}{6in}% that's 46 lines - {\voffset}{.25in}% - {\bindingoffset}{36pt}% - {11in}{8.5in}% -}} - -% Use @smallbook to reset parameters for 7x9.25 trim size. -\def\smallbook{{\globaldefs = 1 - \parskip = 2pt plus 1pt - \textleading = 12pt - % - \internalpagesizes{7.5in}{5in}% - {-.2in}{0in}% - {\bindingoffset}{16pt}% - {9.25in}{7in}% - % - \lispnarrowing = 0.3in - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = .5cm -}} - -% Use @smallerbook to reset parameters for 6x9 trim size. -% (Just testing, parameters still in flux.) -\def\smallerbook{{\globaldefs = 1 - \parskip = 1.5pt plus 1pt - \textleading = 12pt - % - \internalpagesizes{7.4in}{4.8in}% - {-.2in}{-.4in}% - {0pt}{14pt}% - {9in}{6in}% - % - \lispnarrowing = 0.25in - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \defbodyindent = .4cm -}} - -% 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{673.2pt}{160mm}% that's 51 lines - {\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\relax - \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.} - -\def^^L{\par} % remove \outer, so ^L can appear in an @comment - -% DEL is a comment character, in case @c does not suffice. -\catcode`\^^? = 14 - -% Define macros to output various characters with catcode for normal text. -\catcode`\"=\other \def\normaldoublequote{"} -\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix -\catcode`\+=\other \def\normalplus{+} -\catcode`\<=\other \def\normalless{<} -\catcode`\>=\other \def\normalgreater{>} -\catcode`\^=\other \def\normalcaret{^} -\catcode`\_=\other \def\normalunderscore{_} -\catcode`\|=\other \def\normalverticalbar{|} -\catcode`\~=\other \def\normaltilde{~} - -% 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\_} -\let\realunder=_ -% 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} - -% Used sometimes to turn off (effectively) the active characters even after -% parsing them. -\def\turnoffactive{% - \normalturnoffactive - \otherbackslash -} - -\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 - -% \realbackslash is an actual character `\' with catcode other, and -% \doublebackslash is two of them (for the pdf outlines). -{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} - -% In texinfo, backslash is an active character; it prints the backslash -% in fixed width font. -\catcode`\\=\active % @ for escape char from now on. - -% The story here is that in math mode, the \char of \backslashcurfont -% ends up printing the roman \ from the math symbol font (because \char -% in math mode uses the \mathcode, and plain.tex sets -% \mathcode`\\="026E). It seems better for @backslashchar{} to always -% print a typewriter backslash, hence we use an explicit \mathchar, -% which is the decimal equivalent of "715c (class 7, e.g., use \fam; -% ignored family value; char position "5C). We can't use " for the -% usual hex value because it has already been made active. -@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} -@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. - -% On startup, @fixbackslash assigns: -% @let \ = @normalbackslash -% \rawbackslash defines an active \ to do \backslashcurfont. -% \otherbackslash defines an active \ to be a literal `\' character with -% catcode other. We switch back and forth between these. -@gdef@rawbackslash{@let\=@backslashcurfont} -@gdef@otherbackslash{@let\=@realbackslash} - -% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of -% the literal character `\'. Also revert - to its normal character, in -% case the active - from code has slipped in. -% -{@catcode`- = @active - @gdef@normalturnoffactive{% - @let-=@normaldash - @let"=@normaldoublequote - @let$=@normaldollar %$ font-lock fix - @let+=@normalplus - @let<=@normalless - @let>=@normalgreater - @let\=@normalbackslash - @let^=@normalcaret - @let_=@normalunderscore - @let|=@normalverticalbar - @let~=@normaltilde - @markupsetuplqdefault - @markupsetuprqdefault - @unsepspaces - } -} - -% 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 turn back 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 (along with & and #) are made active for url-breaking, so need -% active definitions as the normal characters. -@def@normaldot{.} -@def@normalquest{?} -@def@normalslash{/} - -% These look ok in all fonts, so just make them not special. -% @hashchar{} gets its own user-level command, because of #line. -@catcode`@& = @other @def@normalamp{&} -@catcode`@# = @other @def@normalhash{#} -@catcode`@% = @other @def@normalpercent{%} - -@let @hashchar = @normalhash - -@c Finally, make ` and ' active, so that txicodequoteundirected and -@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we -@c don't make ` and ' active, @code will not get them as active chars. -@c Do this last of all since we use ` in the previous @catcode assignments. -@catcode`@'=@active -@catcode`@`=@active -@markupsetuplqdefault -@markupsetuprqdefault - -@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 Index: contrib/amd/doc/version.texi =================================================================== --- contrib/amd/doc/version.texi +++ /dev/null @@ -1,4 +0,0 @@ -@set UPDATED 28 October 2014 -@set UPDATED-MONTH October 2014 -@set EDITION 6.2 -@set VERSION 6.2 Index: contrib/amd/fixmount/fixmount.8 =================================================================== --- contrib/amd/fixmount/fixmount.8 +++ /dev/null @@ -1,216 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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.8 -.\" $FreeBSD$ -.\" -.Dd February 26, 2016 -.Dt FIXMOUNT 8 -.Os -.Sh NAME -.Nm fixmount -.Nd fix remote mount entries -.Sh SYNOPSIS -.Nm -.Op Fl adervq -.Op Fl h Ar name -.Ar host ... -.Sh DESCRIPTION -.Bf -symbolic -This command is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility -is a variant of -.Xr showmount 8 -that can delete bogus mount entries in remote -.Xr mountd 8 -daemons. -The actions specified by the options are performed for each -.Ar host -in turn. -.Sh OPTIONS -.Bl -tag -width indent -.It Fl a , d , e -These options work as in -.Xr showmount 8 -except that only entries pertaining to the local host are printed. -.It Fl r -Removes those remote mount entries on -.Ar 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 -.Pa /etc/mtab . -.It Fl v -Verify remote mounts. -Similar to -.Fl r -except that only a notification message is printed for each bogus entry -found. -The remote mount table is not changed. -.It Fl A -Issues a command to the remote mountd declaring that -.Em all -of its file systems 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 -file systems are still mounted locally. -.It Fl q -Be quiet. -Suppresses error messages due to timeouts and -.Dq Li "Program not registered" , -i.e., due to remote hosts not supporting RPC or not running -.Xr mountd 8 . -.It Fl h Ar name -Pretend the local hostname is -.Ar 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 will not be able to successfully handle removal -of such entries, so this option is useful in combination with -.Fl v -only. -.Pp -This option also saves time as comparisons of remotely recorded and local -hostnames by address are avoided. -.El -.Sh FILES -.Bl -tag -width ".Pa /etc/rmtab" -.It Pa /etc/mtab -List of current mounts. -.It Pa /etc/rmtab -Backup file for remote mount entries on -.Tn NFS -server. -.El -.Sh SEE ALSO -.Xr mtab 5 , -.Xr rmtab 5 , -.Xr mountd 8 , -.Xr showmount 8 -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Nm -utility appeared in -.Fx 3.0 . -.Sh AUTHORS -.An Jan-Simon Pendry Aq jsp@doc.ic.ac.uk , -Department of Computing, Imperial College, London, UK. -.Pp -.An Erez Zadok Aq ezk@cs.columbia.edu , -Department of Computer Science, Columbia University, New York, USA. -.Pp -.An Other authors and contributors to -.Nm am-utils -are listed in the -.Pa AUTHORS -file distributed with -.Nm am-utils . -.Sh AUTHORS -.An Andreas Stolcke Aq stolcke@icsi.berkeley.edu -.Pp -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. -.Sh BUGS -No attempt is made to verify the information in -.Pa /etc/mtab -itself. -.Pp -Since swap file mounts are not recorded in -.Pa /etc/mtab , -a heuristic specific to SunOS is used to determine whether such a mount -is actual (replacing the string -.Dq Li swap -with -.Dq Li 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 -.Pa /etc/mtab . -To catch those cases, a file system is also deemed mounted if its -.Em local -mount point is identical to the remote entry. -I.e., on a SunOS diskless client, -.Pa server:/export/share/sunos.4.1.1 -is actually -.Pa /usr/share . -Since the local mount point is -.Pa /usr/share -as well this will be handled correctly. -.Pp -There is no way to clear a stale entry in a remote -.Xr mountd 8 -after the -local hostname (or whatever reverse name resolution returns for it) -has been changed. -To take care of these cases, -the remote -.Pa /etc/rmtab -file has to be edited and -.Xr mountd 8 -restarted. -.Pp -The RPC timeouts for -.Xr mountd 8 -calls can only be changed by recompiling. -The defaults are 2 seconds for client handle creation and 5 seconds for -RPC calls. Index: contrib/amd/fixmount/fixmount.c =================================================================== --- contrib/amd/fixmount/fixmount.c +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include - -#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, sizeof(lasthost)); - 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 *) NULL, - 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 *) NULL, - (XDRPROC_T_TYPE) xdr_void, - (char *) NULL, - 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 *) NULL, - (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 *) NULL, - (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; -} Index: contrib/amd/fsinfo/fsi_analyze.c =================================================================== --- contrib/amd/fsinfo/fsi_analyze.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -char *disk_fs_strings[] = -{ - "fstype", "opts", "dumpset", "passno", "freq", "mount", "log", NULL, -}; - -char *mount_strings[] = -{ - "volname", "exportfs", NULL, -}; - -char *fsmount_strings[] = -{ - "as", "volname", "fstype", "opts", "from", NULL, -}; - -char *host_strings[] = -{ - "host", "netif", "config", "arch", "cluster", "os", NULL, -}; - -char *ether_if_strings[] = -{ - "inaddr", "netmask", "hwaddr", NULL, -}; - - -/* - * 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 = xstrdup(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, xstrdup(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 = xstrdup(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 = NULL; - 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 = xstrdup(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 = xstrdup(mp2->m_name); - else - dk->d_mountpt = xstrdup("error"); - - /* - * Analyze the mount tree - */ - errors += analyze_dkmount_tree(q, NULL, dk); - - /* - * Analyze the export tree - */ - errors += check_exportfs(q, NULL); - - 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, xstrdup("swap")); - - /* - * "mount" - */ - if (!ISSET(dp->d_mask, DF_MOUNT)) { - qelem *q = new_que(); - fsi_mount *m = new_mount(); - - m->m_name = xstrdup("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, xstrdup("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 = NULL; - 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, xstrdup("nfs")); - fsi_log("set: fstype is %s", fp->f_fstype); - } - - if (!ISSET(fp->f_mask, FM_OPTS)) { - set_fsmount(fp, FM_OPTS, xstrdup("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, xstrdup(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 = xstrdup(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 = NULL; - 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 = NULL; - - 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 = xstrdup(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 = xstrdup(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); -} Index: contrib/amd/fsinfo/fsi_data.h =================================================================== --- contrib/amd/fsinfo/fsi_data.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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< -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -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; -} Index: contrib/amd/fsinfo/fsi_gram.y =================================================================== --- contrib/amd/fsinfo/fsi_gram.y +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -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 tSTR - -%start list_of_hosts - -%type automount -%type automount_tree -%type ether_attr -%type dir_tree_info -%type filesystem fs_info_list -%type host host_attr host_attr_list -%type list_of_hosts list_of_filesystems list_of_mounts dir_tree -%type localinfo_list -%type 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 */ - { $$ = xstrdup(""); } - - | 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 *) NULL; } - ; - -/* - * 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"); } - ; Index: contrib/amd/fsinfo/fsi_lex.l =================================================================== --- contrib/amd/fsinfo/fsi_lex.l +++ /dev/null @@ -1,273 +0,0 @@ -%{ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -/* - * Some systems include a definition for the macro ECHO in , - * 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 -#include -#include -#include -/* 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 __IGNORE(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. - */ -#if !defined(yywrap) || defined(yylex) -int yywrap(void); -#endif /* not yywrap or yylex */ - -int fsi_error(const char *, ...); - -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 }, - { NULL, 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 -%option noinput - -/* allocate more output slots so lex scanners don't run out of mem */ -%o 1024 - -%start F Q - -%% - INIT_STATE; /* witchcraft */ - -[^ \t\n"={}]+ { return find_resword(yytext); } /* dummy " */ -[ \t] ; -"\n" { ayylineno++; } -[={}] { return *yytext; } - -\" { BEGIN Q; optr = ostr; quoted = 1; } -\n { ayylineno++; fsi_error("\" expected"); BEGIN F; } -\\b { *optr++ = '\b'; /* escape */ } -\\t { *optr++ = '\t'; /* escape */ } -\\\" { *optr++ = '\"'; /* escape */ } -\\\\ { *optr++ = '\\'; /* escape */ } -\\\n { ayylineno++; /* continue */ } -\\r { *optr++ = '\r'; /* escape */ } -\\n { *optr++ = '\n'; /* escape */ } -\\f { *optr++ = '\f'; /* escape */ } -"\\ " { *optr++ = ' '; /* force space */ } -\\. { fsi_error("Unknown \\ sequence"); } -([ \t]|"\\\n"){2,} { char *p = (char *) yytext-1; while ((p = strchr(p+1, '\n'))) ayylineno++; } -\" { BEGIN F; quoted = 0; - *optr = '\0'; - yylval.s = xstrdup(ostr); - return tSTR; - } -. { *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}"; - /*FALLTHROUGH*/ - case 0: - yylval.s = xstrdup(s); - tok = tSTR; - /*FALLTHROUGH*/ - default: - return tok; - } -} - - -int -fsi_error(const 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. - */ -#if !defined(yywrap) || defined(yylex) -int yywrap(void) -{ - return 1; -} -#endif /* not yywrap or yylex */ Index: contrib/amd/fsinfo/fsi_util.c =================================================================== --- contrib/amd/fsinfo/fsi_util.c +++ /dev/null @@ -1,677 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -/* 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 *) NULL); - 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 = NULL; - - 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 = NULL; - ap->a_mount = NULL; - ap->a_opts = NULL; - 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) { - fsi_error("host field \"%s\" already set", host_strings[k]); - return; - } - hp->h_mask |= m; - - switch (k) { - - case HF_HOST:{ - char *p = xstrdup(v); - dict_ent *de = dict_locate(dict_of_hosts, v); - - if (de) - fsi_error("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) { - fsi_error("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) - fsi_error("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 - fsi_error("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) { - fsi_error("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) { - fsi_error("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) { - fsi_error("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; -} Index: contrib/amd/fsinfo/fsinfo.h =================================================================== --- contrib/amd/fsinfo/fsinfo.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 fsi_error(const 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 fsi_parse(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 fsi_lex(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)) Index: contrib/amd/fsinfo/fsinfo.8 =================================================================== --- contrib/amd/fsinfo/fsinfo.8 +++ /dev/null @@ -1,227 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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. -.\" -.\" $FreeBSD$ -.\" -.\" File: am-utils/fsinfo/fsinfo.8 -.\" -.Dd August 31, 2016 -.Sh NAME -.Nm fsinfo -.Nd co-ordinate site-wide file system information -.Sh SYNOPSIS -.Nm -.Op fl qv -.Op Fl a Ar autodir -.Op Fl b Ar bootparams -.Op Fl d Ar dumpsets -.Op Fl e Ar exports -.Op Fl f Ar fstabs -.Op Fl h Ar hostname -.Op Fl m Ar automounts -.Op Fl I Ar dir -.Oo -.Fl D -.Ar name Ns Op = Ns Ar string -.Oc -.Oo -.Fl U -.Ar name Ns Op = Ns Ar string -.Oc -.Ar config ... -.Sh DESCRIPTION -.Bf -symbolic -This command is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility takes a set of system configuration information, and generates -a coordinated set of -.Xr amd 8 , -.Xr mount 8 -and -.Xr mountd 8 -configuration files. -.Pp -The following options are available: -.Bl -tag -width Fl -.It Fl a Ar autodir -Specifies the directory name in which to place the automounter's -mount points. -This defaults to -.Pa /a . -.It Fl b Ar bootparams_prefix -Specifies the prefix for the -.Pa bootparams -file. -If it is not given, then the file will not be generated. -The file will be constructed for the destination machine and will be -placed into a file named -.Pa bootparams -and prefixed by the -.Ar bootparams_prefix -string. -The file generated contains a list of entries describing each -diskless client that can boot from the destination machine. -.It Fl d Ar dumpsets_prefix -Specifies the prefix for the -.Pa 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 file -named -.Pa dumpsets -prefixed by the -.Ar dumpsets_prefix -string. -This file is for use by -.Tn Imperial College's -local backup system. -.It Fl e Ar exports_prefix -Defines the prefix for the -.Pa 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, -and -.Pa exports -file is constructed and given a file name determined by the name of the -machine, prefixed with the -.Ar exports_prefix -string. -If a machine is defined as diskless, then no -file will be created for it. -The files contain entries -for directories on the machine that may be exported to clients. -.It Fl f Ar fstabs_prefix -This defines the prefix for the -.Pa fstab -files. -The files will only be created if this prefix is defined. -For each machine defined in the configuration files, a -.Pa fstab -file is created with the file name determined by prefixing this -.Ar fstabs_prefix -string with the name of the machine. -These files contain entries -for file systems and partitions to mount at boot time. -.It Fl h Ar hostname -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 -.Xr gethostname 3 . -.It Fl m Ar automounts_prefix -Defines the prefix for the automounter files. -The maps will -only be produced if this option is specified. -The mount maps -suitable for the network defined by the configuration files will -be placed into files with names calculated by prefixing the -.Ar automounts_prefix -string to the name of each map. -.It Fl q -Selects quite mode. -Only error messages that are generated will -be displayed. -.It Fl v -Selects verbose mode. -When this is activated, more messages -will be displayed, and all information discovered when performing the semantic -analysis phase will be displayed. -Each verbose message -is output to the standard output on a line starting with a `#' -character. -.It Fl D Xo -.Ar name Ns Op = Ns Ar string -.Xc -Defines a symbol -.Ar name -for the preprocessor when reading the configuration files. -Equivalent to the -.Em #define -directive. -.It Fl I Ar dir -This option is passed into the preprocessor for the configuration -files. -It specifies directories in which to find include files. -.It Fl U Ar name -Removes and initial definition of the symbol -.Ar name . -Inverse of the -.Fl D -option. -.It Ar config -One or more configuration files to be passed as input to -.Nm . -.El -.Pp -The -.Nm -command is fully described in the document -.%T "Amd - The 4.4BSD Automounter" . -.Sh SEE ALSO -.Xr amd 8 , -.Xr mount 8 , -.Xr mountd 8 -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Nm -command first appeared in -.Bx 4.4 . -.Sh AUTHORS -.An Jan-Simon Pendry Aq jsp@doc.ic.ac.uk , -Department of Computing, Imperial College, London, UK. -.Pp -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/fsinfo/fsinfo.c =================================================================== --- contrib/amd/fsinfo/fsinfo.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include -#include - -/* 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 xstrdup(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 (fsi_parse()) - 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 */ -} Index: contrib/amd/fsinfo/null_gram.h =================================================================== --- contrib/amd/fsinfo/null_gram.h +++ /dev/null @@ -1,56 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - - This program 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 3 of the License, or - (at your option) any later version. - - This program 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 program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -#ifndef YY_NULL_NULL_GRAM_H_INCLUDED -# define YY_NULL_NULL_GRAM_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int null_debug; -#endif - - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - - -extern YYSTYPE null_lval; - -int null_parse (void); - -#endif /* !YY_NULL_NULL_GRAM_H_INCLUDED */ Index: contrib/amd/fsinfo/null_gram.c =================================================================== --- contrib/amd/fsinfo/null_gram.c +++ /dev/null @@ -1,1414 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - - This program 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 3 of the License, or - (at your option) any later version. - - This program 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 program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "3.0.2" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - -/* Substitute the variable and function names. */ -#define yyparse null_parse -#define yylex null_lex -#define yyerror null_error -#define yydebug null_debug -#define yynerrs null_nerrs - -#define yylval null_lval -#define yychar null_char - -/* Copy the first part of user declarations. */ -#line 1 "../../fsinfo/null_gram.y" /* yacc.c:339 */ - -void yyerror(const char *fmt, ...); -extern int yylex(void); - -#line 79 "null_gram.c" /* yacc.c:339 */ - -# ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* In a future release of Bison, this section will be replaced - by #include "y.tab.h". */ -#ifndef YY_NULL_NULL_GRAM_H_INCLUDED -# define YY_NULL_NULL_GRAM_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int null_debug; -#endif - - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - - -extern YYSTYPE null_lval; - -int null_parse (void); - -#endif /* !YY_NULL_NULL_GRAM_H_INCLUDED */ - -/* Copy the second part of user declarations. */ - -#line 126 "null_gram.c" /* yacc.c:358 */ - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE -# if (defined __GNUC__ \ - && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ - || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C -# define YY_ATTRIBUTE(Spec) __attribute__(Spec) -# else -# define YY_ATTRIBUTE(Spec) /* empty */ -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) -#endif - -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 2 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 0 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 3 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 2 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 2 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 3 - -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 257 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2 -}; - -#if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_uint8 yyrline[] = -{ - 0, 8, 8 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 0 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "$accept", "token", YY_NULLPTR -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257 -}; -# endif - -#define YYPACT_NINF -1 - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-1))) - -#define YYTABLE_NINF -1 - -#define yytable_value_is_error(Yytable_value) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int8 yypact[] = -{ - -1, 0, -1 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 2, 0, 1 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = -{ - -1, -1 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 1 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_uint8 yytable[] = -{ - 2 -}; - -static const yytype_uint8 yycheck[] = -{ - 0 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 4, 0 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 3, 4 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0 -}; - - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif - - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -{ - FILE *yyo = yyoutput; - YYUSE (yyo); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - YYUSE (yytype); -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -{ - YYFPRINTF (yyoutput, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) -{ - unsigned long int yylno = yyrline[yyrule]; - int yynrhs = yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, Rule); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -yystrlen (const char *yystr) -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) -{ - YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); - YYSIZE_T yysize = yysize0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount = 0; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[*yyssp]; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - { - YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -{ - YYUSE (yyvaluep); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; -/* Number of syntax errors so far. */ -int yynerrs; - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (void) -{ - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (); - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - -#line 1188 "null_gram.c" /* yacc.c:1646 */ - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - return yyresult; -} Index: contrib/amd/fsinfo/null_gram.y =================================================================== --- contrib/amd/fsinfo/null_gram.y +++ /dev/null @@ -1,8 +0,0 @@ -%{ -void yyerror(const char *fmt, ...); -extern int yylex(void); -%} - -%% - -token: Index: contrib/amd/fsinfo/null_lex.c =================================================================== --- contrib/amd/fsinfo/null_lex.c +++ /dev/null @@ -1,1716 +0,0 @@ - -#line 3 "lex.null_.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define yy_create_buffer null__create_buffer -#define yy_delete_buffer null__delete_buffer -#define yy_flex_debug null__flex_debug -#define yy_init_buffer null__init_buffer -#define yy_flush_buffer null__flush_buffer -#define yy_load_buffer_state null__load_buffer_state -#define yy_switch_to_buffer null__switch_to_buffer -#define yyin null_in -#define yyleng null_leng -#define yylex null_lex -#define yylineno null_lineno -#define yyout null_out -#define yyrestart null_restart -#define yytext null_text -#define yywrap null_wrap -#define yyalloc null_alloc -#define yyrealloc null_realloc -#define yyfree null_free - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE null_restart(null_in ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -extern int null_leng; - -extern FILE *null_in, *null_out; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up null_text. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up null_text again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via null_restart()), so that the user can continue scanning by - * just pointing null_in at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when null_text is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int null_leng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow null_wrap()'s to do buffer switches - * instead of setting up a fresh null_in. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void null_restart (FILE *input_file ); -void null__switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE null__create_buffer (FILE *file,int size ); -void null__delete_buffer (YY_BUFFER_STATE b ); -void null__flush_buffer (YY_BUFFER_STATE b ); -void null_push_buffer_state (YY_BUFFER_STATE new_buffer ); -void null_pop_buffer_state (void ); - -static void null_ensure_buffer_stack (void ); -static void null__load_buffer_state (void ); -static void null__init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER null__flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE null__scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE null__scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE null__scan_bytes (yyconst char *bytes,int len ); - -void *null_alloc (yy_size_t ); -void *null_realloc (void *,yy_size_t ); -void null_free (void * ); - -#define yy_new_buffer null__create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - null_ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - null__create_buffer(null_in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - null_ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - null__create_buffer(null_in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -typedef unsigned char YY_CHAR; - -FILE *null_in = (FILE *) 0, *null_out = (FILE *) 0; - -typedef int yy_state_type; - -extern int null_lineno; - -int null_lineno = 1; - -extern char *null_text; -#define yytext_ptr null_text - -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up null_text. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - null_leng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 1 -#define YY_END_OF_BUFFER 2 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[6] = - { 0, - 0, 0, 2, 1, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[2] = - { 0, - 1 - } ; - -static yyconst flex_int16_t yy_base[7] = - { 0, - 0, 0, 2, 3, 3, 0 - } ; - -static yyconst flex_int16_t yy_def[7] = - { 0, - 6, 6, 5, 5, 0, 5 - } ; - -static yyconst flex_int16_t yy_nxt[5] = - { 0, - 4, 5, 3, 5 - } ; - -static yyconst flex_int16_t yy_chk[5] = - { 0, - 6, 3, 5, 5 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int null__flex_debug; -int null__flex_debug = 0; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *null_text; -#line 1 "../../fsinfo/null_lex.l" -#line 2 "../../fsinfo/null_lex.l" -#include "null_gram.h" - -void null_error(const char *fmt, ...) {} -int null_wrap(void) { return 0; } -#define YY_NO_INPUT 1 -#line 481 "lex.null_.c" - -#define INITIAL 0 - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int null_lex_destroy (void ); - -int null_get_debug (void ); - -void null_set_debug (int debug_flag ); - -YY_EXTRA_TYPE null_get_extra (void ); - -void null_set_extra (YY_EXTRA_TYPE user_defined ); - -FILE *null_get_in (void ); - -void null_set_in (FILE * in_str ); - -FILE *null_get_out (void ); - -void null_set_out (FILE * out_str ); - -int null_get_leng (void ); - -char *null_get_text (void ); - -int null_get_lineno (void ); - -void null_set_lineno (int line_number ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int null_wrap (void ); -#else -extern int null_wrap (void ); -#endif -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( null_text, null_leng, 1, null_out )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( null_in )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( null_in ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, null_in))==0 && ferror(null_in)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(null_in); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int null_lex (void); - -#define YY_DECL int null_lex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after null_text and null_leng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 9 "../../fsinfo/null_lex.l" - -#line 668 "lex.null_.c" - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! null_in ) - null_in = stdin; - - if ( ! null_out ) - null_out = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - null_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - null__create_buffer(null_in,YY_BUF_SIZE ); - } - - null__load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of null_text. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 6 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 3 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 10 "../../fsinfo/null_lex.l" -ECHO; - YY_BREAK -#line 756 "lex.null_.c" -case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed null_in at a new source and called - * null_lex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = null_in; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( null_wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * null_text, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ -} /* end of null_lex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - null_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), (size_t) num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - null_restart(null_in ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) null_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 6 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 6 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 5); - - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#endif - -{ - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - null_restart(null_in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( null_wrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve null_text */ - (yy_hold_char) = *++(yy_c_buf_p); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - void null_restart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - null_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - null__create_buffer(null_in,YY_BUF_SIZE ); - } - - null__init_buffer(YY_CURRENT_BUFFER,input_file ); - null__load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void null__switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * null_pop_buffer_state(); - * null_push_buffer_state(new_buffer); - */ - null_ensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - null__load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (null_wrap()) processing, but the only time this flag - * is looked at is after null_wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void null__load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - null_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ - YY_BUFFER_STATE null__create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) null_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in null__create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) null_alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in null__create_buffer()" ); - - b->yy_is_our_buffer = 1; - - null__init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with null__create_buffer() - * - */ - void null__delete_buffer (YY_BUFFER_STATE b ) -{ - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - null_free((void *) b->yy_ch_buf ); - - null_free((void *) b ); -} - -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a null_restart() or at EOF. - */ - static void null__init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - null__flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then null__init_buffer was _probably_ - * called from null_restart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ - void null__flush_buffer (YY_BUFFER_STATE b ) -{ - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - null__load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void null_push_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - null_ensure_buffer_stack(); - - /* This block is copied from null__switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from null__switch_to_buffer. */ - null__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void null_pop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - null__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - null__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void null_ensure_buffer_stack (void) -{ - int num_to_alloc; - - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; - (yy_buffer_stack) = (struct yy_buffer_state**)null_alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in null_ensure_buffer_stack()" ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)null_realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in null_ensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE null__scan_buffer (char * base, yy_size_t size ) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) null_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in null__scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - null__switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to null_lex() will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * null__scan_bytes() instead. - */ -YY_BUFFER_STATE null__scan_string (yyconst char * yystr ) -{ - - return null__scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to null_lex() will - * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE null__scan_bytes (yyconst char * yybytes, int _yybytes_len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) null_alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in null__scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = null__scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in null__scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up null_text. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - null_text[null_leng] = (yy_hold_char); \ - (yy_c_buf_p) = null_text + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - null_leng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int null_get_lineno (void) -{ - - return null_lineno; -} - -/** Get the input stream. - * - */ -FILE *null_get_in (void) -{ - return null_in; -} - -/** Get the output stream. - * - */ -FILE *null_get_out (void) -{ - return null_out; -} - -/** Get the length of the current token. - * - */ -int null_get_leng (void) -{ - return null_leng; -} - -/** Get the current token. - * - */ - -char *null_get_text (void) -{ - return null_text; -} - -/** Set the current line number. - * @param line_number - * - */ -void null_set_lineno (int line_number ) -{ - - null_lineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see null__switch_to_buffer - */ -void null_set_in (FILE * in_str ) -{ - null_in = in_str ; -} - -void null_set_out (FILE * out_str ) -{ - null_out = out_str ; -} - -int null_get_debug (void) -{ - return null__flex_debug; -} - -void null_set_debug (int bdebug ) -{ - null__flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from null_lex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - null_in = stdin; - null_out = stdout; -#else - null_in = (FILE *) 0; - null_out = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * null_lex_init() - */ - return 0; -} - -/* null_lex_destroy is for both reentrant and non-reentrant scanners. */ -int null_lex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - null__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - null_pop_buffer_state(); - } - - /* Destroy the stack itself. */ - null_free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * null_lex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *null_alloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *null_realloc (void * ptr, yy_size_t size ) -{ - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void null_free (void * ptr ) -{ - free( (char *) ptr ); /* see null_realloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 10 "../../fsinfo/null_lex.l" Index: contrib/amd/fsinfo/null_lex.l =================================================================== --- contrib/amd/fsinfo/null_lex.l +++ /dev/null @@ -1,9 +0,0 @@ -%{ -#include "null_gram.h" - -void null_error(const char *fmt, ...) {} -int yywrap(void) { return 0; } -%} -%option nounput -%option noinput -%% Index: contrib/amd/fsinfo/wr_atab.c =================================================================== --- contrib/amd/fsinfo/wr_atab.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* - * 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; -} Index: contrib/amd/fsinfo/wr_bparam.c =================================================================== --- contrib/amd/fsinfo/wr_bparam.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* - * Write a host/path in NFS format - */ -static int -write_nfsname(FILE *ef, fsmount *fp, char *hn) -{ - int errors = 0; - char *h = xstrdup(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; -} Index: contrib/amd/fsinfo/wr_dumpset.c =================================================================== --- contrib/amd/fsinfo/wr_dumpset.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -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; -} Index: contrib/amd/fsinfo/wr_exportfs.c =================================================================== --- contrib/amd/fsinfo/wr_exportfs.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -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; -} Index: contrib/amd/fsinfo/wr_fstab.c =================================================================== --- contrib/amd/fsinfo/wr_fstab.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - -#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 */ - { - NULL, NULL, NULL - } -}; - - -/* ---------- AIX 1 ------------------------------ */ - -/* - * AIX 1 format - */ -static void -write_aix1_dkfstab(FILE *ef, disk_fs *dp) -{ - char *hp = xstrdup(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 = xstrdup(fp->f_ref->m_dk->d_host->h_hostname); - char *hp = xstrdup(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 = xstrdup(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 = xstrdup(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 = xstrdup(fp->f_ref->m_dk->d_host->h_hostname); - } else { - h = xstrdup(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 = NULL; - char *os_name = NULL; - -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; -} Index: contrib/amd/hlfsd/hlfsd.h =================================================================== --- contrib/amd/hlfsd/hlfsd.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 and Alexander Dupuy - * 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 */ Index: contrib/amd/hlfsd/hlfsd.8 =================================================================== --- contrib/amd/hlfsd/hlfsd.8 +++ /dev/null @@ -1,380 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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. -.\" -.\" $FreeBSD$ -.\" -.\" File: am-utils/hlfsd/hlfsd.8 -.\" -.\" HLFSD was written at Columbia University Computer Science Department, by -.\" Erez Zadok and Alexander Dupuy -.\" It is distributed under the same terms and conditions as AMD. -.\" -.Dd February 26, 2016 -.Dt HLFSD 8 -.Os -.Sh NAME -.Nm hlfsd -.Nd home-link file system daemon -.Sh SYNOPSIS -.Nm -.Op Fl fhnpvC -.Op Fl a Ar alt_dir -.Op Fl c Ar cache-interval -.Op Fl g Ar group -.Op Fl i Ar reload-interval -.Op Fl l Ar logfile -.Op Fl o Ar mount-options -.Op Fl x Ar log-options -.Op Fl D Ar debug-options -.Op Fl P Ar password-file -.Op Ar linkname Op Ar subdir -.Sh DESCRIPTION -.Bf -symbolic -This daemon is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility -is a daemon which implements a file system 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. -.Pp -The -.Nm -utility -operates by mounting itself as an NFS server for the directory containing -.Ar linkname , -which defaults to -.Pa /hlfs/home . -Lookups within that directory are handled by -.Nm , -which uses the password map to determine how to resolve the lookup. -The directory will be created if it does not already exist. -The symbolic link will be to the accessing user's home directory, with -.Ar subdir -appended to it. -If not specified, -.Ar subdir -defaults to -.Pa .hlfsdir . -This directory will also be created if it does not already exist. -.Pp -A -.Dv SIGTERM -sent to -.Nm -will cause it to shutdown. -A -.Dv 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 -.Dv SIGUSR1 -will cause it to dump its internal -table of user IDs and home directories to the file -.Pa /usr/tmp/hlfsd.dump.XXXXXX . -.Sh OPTIONS -.Bl -tag -width indent -.It Fl a Ar alt_dir -Alternate directory. -The name of the directory to which -the symbolic link returned by -.Nm -will point, if it cannot access the home directory of the user. -This -defaults to -.Pa /var/hlfs . -This directory will be created if it does not exist. -It is expected -that either users will read these files, or the system administrators -will run a script to resend this -.Dq lost mail -to its owner. -.It Fl c Ar cache-interval -Caching interval. -The -.Nm -utility -will cache the validity of home directories for this interval, in -seconds. -Entries which have been verified within the last -.Ar 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, -.Nm -will re-verify the validity of the user's home directory, and -reset the cache time-counter. -The default value for -.Ar cache-interval -is 300 seconds (5 minutes). -.It Fl f -Force fast startup. -This option tells -.Nm -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. -.It Fl g Ar group -Set the special group -.Dv HLFS_GID -to -.Ar group . -Programs such as -.Xr comsat 8 , -(which access the mailboxes of other users) must be setgid -.Dv HLFS_GID -to work properly. -The default group is -.Dq Li hlfs . -If no group is provided, -and there is no group -.Dq Li hlfs , -this feature is disabled. -.It Fl h -Help. -Print a brief help message, and exit. -.It Fl i Ar reload-interval -Map-reloading interval. -Each -.Ar reload-interval -seconds, -.Nm -will reload the password map. -The -.Nm -utility -needs the password map for the UIDs and home directory pathnames. -The -.Nm -utility schedules a -.Dv SIGALRM -to reload the password maps. -A -.Dv SIGHUP -sent to -.Nm -will force it to reload the maps immediately. -The default -value for -.Ar reload-interval -is 900 seconds (15 minutes). -.It Fl l Ar logfile -Specify a log file to which -.Nm -will record events. -If -.Ar logfile -is the string -.Dq Li syslog -then the log messages will be sent to the system log daemon by -.Xr syslog 3 , -using the -.Dv LOG_DAEMON -facility. -This is also the default. -.It Fl n -No verify. -The -.Nm -utility -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 -.Nm -at the cost of possibly returning symbolic links to home -directories which are not currently accessible or are full. -By default, -.Nm -validates the symbolic-link in the background. -The -.Fl n -option overrides the meaning of the -.Fl c -option, since no caching is necessary. -.It Fl o Ar mount-options -Mount options. -Mount options which -.Nm -will use to mount itself on top of -.Ar dirname . -By default, -.Ar mount-options -is set to -.Dq Li ro . -If the system supports symbolic-link caching, default -options are set to -.Dq Li ro,nocache . -.It Fl p -Print PID. -Outputs the process ID of -.Nm -to standard output where it can be saved into a file. -.It Fl v -Version. -Displays version information to standard error. -.It Fl x Ar log-options -Specify run-time logging options. -The options are a comma separated -list chosen from: -.Li fatal , error , user , warn , info , map , stats , all . -.It Fl C -Force -.Nm -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. -.It Fl D Ar log-options -Select from a variety of debugging options. -Prefixing an -option with the string -.Dq Li no -reverses the effect of that option. -Options are cumulative. -The most useful option is -.Dq Li 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 -.Dv SIGUSR1 -sent to -.Nm -will cause it to dump its internal password map to the file -.Pa /usr/tmp/hlfsd.dump.XXXXXX . -.It Fl P Ar password-file -Read the user-name, user-id, and home directory information from the file -.Ar password-file . -Normally, -.Nm -will use -.Xr 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 -.Ar password-file -are read and checked. -All other fields are ignored. -The file -.Ar password-file -must otherwise be compliant with -.Ux -System 7 colon-delimited format -.Xr passwd 5 . -.El -.Sh FILES -.Bl -tag -width ".Pa /var/hlfs" -.It Pa /hlfs -directory under which -.Nm -mounts itself and manages the symbolic link -.Pa home . -.It Pa .hlfsdir -default sub-directory in the user's home directory, to which the -.Pa home -symbolic link returned by -.Nm -points. -.It Pa /var/hlfs -directory to which -.Pa home -symbolic link returned by -.Nm -points if it is unable to verify the that -user's home directory is accessible. -.El -.Sh "SEE ALSO" -.Xr mail 1 , -.Xr getgrent 3 , -.Xr getpwent 3 , -.Xr mnttab 4 , -.Xr passwd 4 , -.Xr mtab 5 , -.Xr amd 8 , -.Xr automount 8 , -.Xr cron 8 , -.Xr mount 8 , -.Xr sendmail 8 , -.Xr umount 8 -.Rs -.%T HLFSD: Delivering Email to Your $HOME -.%B Proc. LISA-VII, The 7th Usenix System Administration Conference -.%D November 1993 -.Re -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Sh HISTORY -The -.Nm -utility appeared in -.Fx 3.0 . -.Sh AUTHORS -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook University, Stony Brook, New York, USA. -.Pp -.An Alexander Dupuy Aq dupuy@smarts.com , -System Management ARTS, White Plains, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/hlfsd/hlfsd.c =================================================================== --- contrib/amd/hlfsd/hlfsd.c +++ /dev/null @@ -1,921 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 and Alexander Dupuy - * It is being distributed under the same terms and conditions as amd does. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 = NULL; -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); -void fatalerror(char *str); - - -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++; - } - - /* 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 */ - if (gethostname(hostname, sizeof(hostname)) == -1) { - fprintf(stderr, "%s: gethostname failed \"%s\".\n", - am_get_progname(), strerror(errno)); - exit(1); - } - 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. - */ - ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2, - NFS_VERSION); - 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 nodaemon, 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 nodaemon), 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 -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 *) NULL) < 0) - fatal("setitimer: %m"); - - clocktime(&startup); - - /* - * If -D daemon, then start serving here in the child, - * and the parent will exit. But if -D nodaemon, 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 - */ - /* 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); -} Index: contrib/amd/hlfsd/homedir.c =================================================================== --- contrib/amd/hlfsd/homedir.c +++ /dev/null @@ -1,806 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 and Alexander Dupuy - * It is being distributed under the same terms and conditions as amd does. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* - * 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 ask for -D fork (default). - * Disable forking using -D nofork. - */ - 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; - - if (found) - dlog("delaying on child %ld for %d seconds", (long) found->child, secs); - - tv.tv_usec = 0; - - do { - tv.tv_sec = secs; - if (select(0, NULL, NULL, NULL, &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 *) NULL)) > 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'; - if (fgets(buf, 256, passwd_fp) == NULL) - return NULL; - passwd_line++; - if (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 = xstrdup(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 = xstrdup(""); - - 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 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) */ Index: contrib/amd/hlfsd/nfs_prot_svc.c =================================================================== --- contrib/amd/hlfsd/nfs_prot_svc.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* 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); - } -} Index: contrib/amd/hlfsd/stubs.c =================================================================== --- contrib/amd/hlfsd/stubs.c +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 and Alexander Dupuy - * It is being distributed under the same terms and conditions as amd does. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 /* 0 */ - 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 { - (void)memcpy(&uid, argp->fh_data, sizeof(uid)); - 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 /* 0 */ - 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(&un_fhandle, 0, sizeof(un_fhandle)); - memcpy(un_fhandle.fh_data, &untab[idx].uid, sizeof(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 = 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 NULL; - } - - } else { /* check if asked for user mailbox */ - - if (getcreds(rqstp, &userid, &groupid, nfsxprt) < 0) { - return (nfsreadlinkres *) NULL; - } - - if (groupid == hlfs_gid) { - memcpy(&userid, argp->fh_data, sizeof(userid)); - 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 nofork, then must return the value, - * NOT exit, or else the main hlfsd server exits. - * If -D fork (default), then we do want to exit from the process. - * Bug: where is that status information being collected? - */ - if (amuDebug(D_FORK)) - exit(retval); - else - return &res; -} - - -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, NULL, {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 *) NULL; - 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; -} Index: contrib/amd/include/am_compat.h =================================================================== --- contrib/amd/include/am_compat.h +++ /dev/null @@ -1,472 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_NOACL) && !defined(MNTTAB_OPT_NOACL) -# define MNTTAB_OPT_NOACL "noacl" -#endif /* defined(MNT2_NFS_OPT_NOACL) && !defined(MNTTAB_OPT_NOACL) */ - -#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) */ - -#if defined(MNT2_CDFS_OPT_NOJOLIET) && !defined(MNTTAB_OPT_NOJOLIET) -# define MNTTAB_OPT_NOJOLIET "nojoliet" -#endif /* defined(MNT2_CDFS_OPT_NOJOLIET) && !defined(MNTTAB_OPT_NOJOLIET) */ - -#if defined(MNT2_CDFS_OPT_NOCASETRANS) && !defined(MNTTAB_OPT_NOCASETRANS) -# define MNTTAB_OPT_NOCASETRANS "nocasetrans" -#endif /* defined(MNT2_CDFS_OPT_NOCASETRANS) && !defined(MNTTAB_OPT_NOCASETRANS) */ - -#if defined(MNT2_CDFS_OPT_RRCASEINS) && !defined(MNTTAB_OPT_RRCASEINS) -# define MNTTAB_OPT_RRCASEINS "rrcaseins" -#endif /* defined(MNT2_CDFS_OPT_RRCASEINS) && !defined(MNTTAB_OPT_RRCASEINS) */ - -/* - * Complete MNTTAB_OPT_* options based on MNT2_UDF_OPT_* mount options. - */ -#if defined(MNT2_UDF_OPT_CLOSESESSION) && !defined(MNTTAB_OPT_CLOSESESSION) -# define MNTTAB_OPT_CLOSESESSION "closesession" -#endif /* defined(MNT2_UDF_OPT_CLOSESESSION) && !defined(MNTTAB_OPT_CLOSESESSION) */ - -/* - * 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) */ - -#if defined(MNT2_GEN_OPT_LOG) && !defined(MNTTAB_OPT_LOG) -# define MNTTAB_OPT_LOG "log" -#endif /* defined(MNT2_GEN_OPT_LOG) && !defined(MNTTAB_OPT_LOG) */ - -#if defined(MNT2_GEN_OPT_NOATIME) && !defined(MNTTAB_OPT_NOATIME) -# define MNTTAB_OPT_NOATIME "noatime" -#endif /* defined(MNT2_GEN_OPT_NOATIME) && !defined(MNTTAB_OPT_NOATIME) */ - -#if defined(MNT2_GEN_OPT_NODEVMTIME) && !defined(MNTTAB_OPT_NODEVMTIME) -# define MNTTAB_OPT_NODEVMTIME "nodevmtime" -#endif /* defined(MNT2_GEN_OPT_NODEVMTIME) && !defined(MNTTAB_OPT_NODEVMTIME) */ - -#if defined(MNT2_GEN_OPT_SOFTDEP) && !defined(MNTTAB_OPT_SOFTDEP) -# define MNTTAB_OPT_SOFTDEP "softdep" -#endif /* defined(MNT2_GEN_OPT_SOFTDEP) && !defined(MNTTAB_OPT_SOFTDEP) */ - -#if defined(MNT2_GEN_OPT_SYMPERM) && !defined(MNTTAB_OPT_SYMPERM) -# define MNTTAB_OPT_SYMPERM "symperm" -#endif /* defined(MNT2_GEN_OPT_SYMPERM) && !defined(MNTTAB_OPT_SYMPERM) */ - -#if defined(MNT2_GEN_OPT_UNION) && !defined(MNTTAB_OPT_UNION) -# define MNTTAB_OPT_UNION "union" -#endif /* defined(MNT2_GEN_OPT_UNION) && !defined(MNTTAB_OPT_UNION) */ - -/* - * 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 */ - -/* useful for udf 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_GMTOFF -# define MNTTAB_OPT_GMTOFF "gmtoff" -#endif /* not MNTTAB_OPT_GMTOFF */ -#ifndef MNTTAB_OPT_SESSIONNR -# define MNTTAB_OPT_SESSIONNR "sessionnr" -#endif /* not MNTTAB_OPT_SESSIONNR */ - -/* - * 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 udf_args, assume integer bit-field (linux) - */ -#if defined(HAVE_FS_UDF) && !defined(udf_args_t) -# define udf_args_t u_int -#endif /* defined(HAVE_FS_UDF) && !defined(udf_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 defined(HAVE_FS_TMPFS) && !defined(tmpfs_args_t) -# define tmpfs_args_t u_int -#endif /* defined(HAVE_FS_TMPFS) && !defined(tmpfs_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_EXT) && !defined(ext_args_t) -# define ext_args_t u_int -#endif /* defined(HAVE_FS_EXT) && !defined(ext_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 NFS4, then make sure that the "sec" mnttab option is available. - */ -#ifdef HAVE_FS_NFS4 -# ifndef MNTTAB_OPT_SEC -# define MNTTAB_OPT_SEC "sec" -# endif /* not MNTTAB_OPT_SEC */ -#endif /* not HAVE_FS_NFS4 */ -/* - * 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 */ Index: contrib/amd/include/am_defs.h =================================================================== --- contrib/amd/include/am_defs.h +++ /dev/null @@ -1,1614 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 - * $Id: am_defs.h,v 1.15.2.16 2004/05/12 15:54:31 ezk Exp $ - * $FreeBSD$ - * - */ - -/* - * 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 -/* 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(); -#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__ */ - -#define __IGNORE(result) \ - __ignore((unsigned long)result) - -static inline void -__ignore(unsigned long result) { - (void)&result; -} - -/* - * How to handle signals of any type - */ -#ifdef HAVE_SYS_WAIT_H -# include -#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 and . - */ -#if TIME_WITH_SYS_TIME -# include -# 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 -#else /* not TIME_WITH_SYS_TIME */ -# if HAVE_SYS_TIME_H -# include -# else /* not HAVE_SYS_TIME_H */ -# include -# endif /* not HAVE_SYS_TIME_H */ -#endif /* not TIME_WITH_SYS_TIME */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_MACHINE_ENDIAN_H -# include -#endif /* HAVE_MACHINE_ENDIAN_H */ - -/* - * Big-endian or little-endian? - */ -#ifndef BYTE_ORDER -# if defined(WORDS_BIGENDIAN) -# define ARCH_ENDIAN "big" -# else /* not WORDS_BIGENDIAN */ -# define ARCH_ENDIAN "little" -# endif /* not WORDS_BIGENDIAN */ -#else -# if BYTE_ORDER == BIG_ENDIAN -# define ARCH_ENDIAN "big" -# else -# define ARCH_ENDIAN "little" -# endif -#endif - -/* - * Actions to take if HAVE_SYS_TYPES_H is defined. - */ -#if HAVE_SYS_TYPES_H -# include -#endif /* HAVE_SYS_TYPES_H */ - -/* - * Actions to take if HAVE_LIMITS_H is defined. - */ -#if HAVE_LIMITS_H_H -# include -#endif /* HAVE_LIMITS_H */ - -/* - * Actions to take if HAVE_UNISTD_H is defined. - */ -#if HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ - -/* after , 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 -/* - * On Solaris 2.6, is included in - * 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 -# 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 -# 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 -# endif /* HAVE_SYS_NDIR_H */ -# if HAVE_SYS_DIR_H -# include -# endif /* HAVE_SYS_DIR_H */ -# if HAVE_NDIR_H -# include -# endif /* HAVE_NDIR_H */ -#endif /* not HAVE_DIRENT_H */ - -/* - * Actions to take if HAVE_FCNTL_H is defined. - */ -#if HAVE_FCNTL_H -# include -#endif /* HAVE_FCNTL_H */ - -/* - * Actions to take if HAVE_MEMORY_H is defined. - */ -#if HAVE_MEMORY_H -# include -#endif /* HAVE_MEMORY_H */ - -/* - * Actions to take if HAVE_SYS_FILE_H is defined. - */ -#if HAVE_SYS_FILE_H -# include -#endif /* HAVE_SYS_FILE_H */ - -/* - * Actions to take if HAVE_SYS_IOCTL_H is defined. - */ -#if HAVE_SYS_IOCTL_H -# include -#endif /* HAVE_SYS_IOCTL_H */ - -/* - * Actions to take if HAVE_SYSLOG_H or HAVE_SYS_SYSLOG_H is defined. - */ -#ifdef HAVE_SYSLOG_H -# include -#else /* not HAVE_SYSLOG_H */ -# if HAVE_SYS_SYSLOG_H -# include -# endif /* HAVE_SYS_SYSLOG_H */ -#endif /* HAVE_SYSLOG_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_PARAM_H -# include -#endif /* HAVE_SYS_PARAM_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_SOCKET_H -# include -#endif /* HAVE_SYS_SOCKET_H */ - -/* - * Actions to take if 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 -# 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 exists. - */ -#ifdef HAVE_RPC_TYPES_H -# include -#endif /* HAVE_RPC_TYPES_H */ - -/* - * Actions to take if exists. - */ -/* Prevent multiple inclusion on Ultrix 4 */ -#if defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__) -# include -#endif /* defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__) */ - -/* - * Actions to take if 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 -#endif /* defined(HAVE_MALLOC_H) && !defined(HAVE_STDLIB_H) */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_MNTENT_H -/* some systems need before is included */ -# ifdef HAVE_STDIO_H -# include -# endif /* HAVE_STDIO_H */ -# include -#endif /* HAVE_MNTENT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FSID_H -# include -#endif /* HAVE_SYS_FSID_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_UTSNAME_H -# include -#endif /* HAVE_SYS_UTSNAME_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_MNTENT_H -# include -#endif /* HAVE_SYS_MNTENT_H */ - -/* - * Actions to take if or exist. - * Should be included before 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 */ -# define DATUM -# endif /* not DATUM */ -#endif /* HAVE_MAP_NDBM */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NET_ERRNO_H -# include -#endif /* HAVE_NET_ERRNO_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NET_IF_H -# include -#endif /* HAVE_NET_IF_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NET_ROUTE_H -# include -#endif /* HAVE_NET_ROUTE_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_MBUF_H -# include -/* - * OSF4 (DU-4.0) defines m_next and m_data also in 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 . - */ -# ifdef m_flags -# undef m_flags -# endif /* m_flags */ -# ifdef MFREE -# undef MFREE -# endif /* MFREE */ -#endif /* HAVE_SYS_MBUF_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_MMAN_H -# include -#endif /* HAVE_SYS_MMAN_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NETDB_H -# include -#endif /* HAVE_NETDB_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NETDIR_H -# include -#endif /* HAVE_NETDIR_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NET_IF_VAR_H -# include -#endif /* HAVE_NET_IF_VAR_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NETINET_IF_ETHER_H -# include -#endif /* HAVE_NETINET_IF_ETHER_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NETINET_IN_H -# include -#endif /* HAVE_NETINET_IN_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RPCSVC_YP_PROT_H -# ifdef HAVE_BAD_HEADERS -/* avoid circular dependency in aix 4.3 with */ -struct ypall_callback; -# endif /* HAVE_BAD_HEADERS */ -# include -#endif /* HAVE_RPCSVC_YP_PROT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RPCSVC_YPCLNT_H -# include -#endif /* HAVE_RPCSVC_YPCLNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_UCRED_H -# include -#endif /* HAVE_SYS_UCRED_H */ - - -/* - * Actions to take if 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 -#endif /* HAVE_SYS_MOUNT_H */ - -#ifdef HAVE_SYS_VMOUNT_H -# include -#endif /* HAVE_SYS_VMOUNT_H */ - -/* - * Actions to take if 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 and . - */ -# ifdef HAVE_SOCKETBITS_H -/* conflicts with */ -# 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 */ -# undef WNOHANG -# undef WUNTRACED -# endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */ -/* conflicts with */ -# define _SYS_STATFS_H -# endif /* HAVE_SOCKETBITS_H */ - -# ifdef _SYS_WAIT_H -# if defined(__GLIBC__) && __GLIBC__ >= 2 -/* conflicts with (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 -# endif /* HAVE_LINUX_POSIX_TYPES_H */ -# ifndef _LINUX_BYTEORDER_GENERIC_H -# define _LINUX_BYTEORDER_GENERIC_H -# endif /* _LINUX_BYTEORDER_GENERIC_H */ -/* conflicts with 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 */ -# 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 -# undef __KERNEL__ -# endif /* HAVE_LINUX_KDEV_T_H */ -# ifdef HAVE_LINUX_LIST_H -# define __KERNEL__ -# include -# undef __KERNEL__ -# endif /* HAVE_LINUX_LIST_H */ -# include -#endif /* HAVE_LINUX_FS_H && (!__GLIBC__ || __GLIBC__ < 2) */ - -#ifdef HAVE_CDFS_CDFS_MOUNT_H -# include -#endif /* HAVE_CDFS_CDFS_MOUNT_H */ - -#ifdef HAVE_CDFS_CDFSMOUNT_H -# include -#endif /* HAVE_CDFS_CDFSMOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_LINUX_LOOP_H -# ifdef HAVE_LINUX_POSIX_TYPES_H -# include -# 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 -#endif /* HAVE_LINUX_LOOP_H */ - -/* - * AUTOFS PROTOCOL HEADER FILES: - */ - -/* - * Actions to take if exists. - * We really don't want pulled in here - */ -#ifndef _LINUX_FS_H -#define _LINUX_FS_H -#endif /* _LINUX_FS_H */ -#ifdef HAVE_LINUX_AUTO_FS4_H -# include -#else /* not HAVE_LINUX_AUTO_FS4_H */ -# ifdef HAVE_LINUX_AUTO_FS_H -# include -# endif /* HAVE_LINUX_AUTO_FS_H */ -#endif /* not HAVE_LINUX_AUTO_FS4_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_AUTOFS_H -# include -#endif /* HAVE_SYS_FS_AUTOFS_H */ - -/* - * Actions to take if or exist. - */ -#ifdef HAVE_RPCSVC_AUTOFS_PROT_H -# include -#else /* not HAVE_RPCSVC_AUTOFS_PROT_H */ -# ifdef HAVE_SYS_FS_AUTOFS_PROT_H -# include -# endif /* HAVE_SYS_FS_AUTOFS_PROT_H */ -#endif /* not HAVE_RPCSVC_AUTOFS_PROT_H */ - -/* - * Actions to take if exists. - * This header file is required before can be included. - */ -#ifdef HAVE_LBER_H -# include -#endif /* HAVE_LBER_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_LDAP_H -# include -#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 - - -/* - * NFS PROTOCOL HEADER FILES: - */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NFS_EXPORT_H -# include -#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 - -/* - * 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 -# endif /* HAVE_NFS_NFS_CLNT_H */ -# ifdef HAVE_LINUX_NFS_H -# include -# 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 -#endif /* HAVE_NFS_NFS_GFS_H */ -#ifdef HAVE_NFS_MOUNT_H -# include -#endif /* HAVE_NFS_MOUNT_H */ -#ifdef HAVE_NFS_NFS_MOUNT_H_off -/* broken on nextstep3 (includes non-existing headers) */ -# include -#endif /* HAVE_NFS_NFS_MOUNT_H */ -#ifdef HAVE_NFS_PATHCONF_H -# include -#endif /* HAVE_NFS_PATHCONF_H */ -#ifdef HAVE_SYS_FS_NFS_MOUNT_H -# include -#endif /* HAVE_SYS_FS_NFS_MOUNT_H */ -#ifdef HAVE_SYS_FS_NFS_NFS_CLNT_H -# include -#endif /* HAVE_SYS_FS_NFS_NFS_CLNT_H */ -#ifdef HAVE_SYS_FS_NFS_CLNT_H -# include -#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 -# undef __KERNEL__ -#endif /* HAVE_LINUX_NFS_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_PWD_H -# include -#endif /* HAVE_PWD_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_HESIOD_H -# include -#endif /* HAVE_HESIOD_H */ - -/* - * Actions to take if exists. - * Should be included before . - */ -#ifdef HAVE_ARPA_NAMESER_H -# ifdef NOERROR -# undef NOERROR -# endif /* NOERROR */ -/* - * Conflicts with which is included from - * on Solaris 2.6 systems. So undefine it first. - */ -# ifdef T_UNSPEC -# undef T_UNSPEC -# endif /* T_UNSPEC */ -# include -#endif /* HAVE_ARPA_NAMESER_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_ARPA_INET_H -# ifdef HAVE_BAD_HEADERS -/* aix 4.3: avoid including */ -struct sockaddr_dl; -# endif /* HAVE_BAD_HEADERS */ -# include -#endif /* HAVE_ARPA_INET_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RESOLV_H -/* - * On AIX 5.2, both and 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 -#endif /* HAVE_RESOLV_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_UIO_H -# include -#endif /* HAVE_SYS_UIO_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_CACHEFS_FS_H -# include -#endif /* HAVE_SYS_FS_CACHEFS_FS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_PC_FS_H -# include -#endif /* HAVE_SYS_FS_PC_FS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_MSDOSFS_MSDOSFSMOUNT_H -# include -#endif /* HAVE_MSDOSFS_MSDOSFSMOUNT_H */ -#ifdef HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H -# include -#endif /* HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H -# include -#endif /* HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_TMP_H -# include -#endif /* HAVE_SYS_FS_TMP_H */ -#ifdef HAVE_FS_TMPFS_TMPFS_ARGS_H -# include -#endif /* HAVE_FS_TMPFS_TMPFS_ARGS_H */ - - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_UFS_MOUNT_H -# include -#endif /* HAVE_SYS_FS_UFS_MOUNT_H */ -/* - * HAVE_UFS_UFS_UFSMOUNT_H should NOT be defined on netbsd/openbsd because it - * causes errors with other header files. Instead, add it to the specific - * conf/nfs_prot_*.h file. - */ -#ifdef HAVE_UFS_UFS_UFSMOUNT_H -# include -#endif /* HAVE_UFS_UFS_UFSMOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_EFS_CLNT_H -# include -#endif /* HAVE_SYS_FS_EFS_CLNT_H */ -#ifdef HAVE_FS_EFS_EFS_MOUNT_H -# include -#endif /* HAVE_FS_EFS_EFS_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_XFS_CLNT_H -# include -#endif /* HAVE_SYS_FS_XFS_CLNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_ASSERT_H -# include -#endif /* HAVE_ASSERT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_CFS_H -# include -#endif /* HAVE_CFS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_CLUSTER_H -# include -#endif /* HAVE_CLUSTER_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_CTYPE_H -# include -#endif /* HAVE_CTYPE_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_ERRNO_H -# include -#else -/* - * Actions to take if exists. - */ -# ifdef HAVE_SYS_ERRNO_H -# include -extern int errno; -# endif /* HAVE_SYS_ERRNO_H */ -#endif /* HAVE_ERRNO_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_GRP_H -# include -#endif /* HAVE_GRP_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_HSFS_HSFS_H -# include -#endif /* HAVE_HSFS_HSFS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_CDFS_CDFSMOUNT_H -# include -#endif /* HAVE_CDFS_CDFSMOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_ISOFS_CD9660_CD9660_MOUNT_H -# include -#endif /* HAVE_ISOFS_CD9660_CD9660_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_FS_UDF_UDF_MOUNT_H -# include -#endif /* HAVE_FS_UDF_UDF_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_MOUNT_H -# include -#endif /* HAVE_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NSSWITCH_H -# include -#endif /* HAVE_NSSWITCH_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RPC_AUTH_DES_H -# include -#endif /* HAVE_RPC_AUTH_DES_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RPC_PMAP_CLNT_H -# include -#endif /* HAVE_RPC_PMAP_CLNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RPC_PMAP_PROT_H -# include -#endif /* HAVE_RPC_PMAP_PROT_H */ - - -/* - * Actions to take if 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 -# endif /* not _RPCSVC_MOUNT_H */ -#endif /* HAVE_RPCSVC_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_RPCSVC_NIS_H -/* - * Solaris 10 (build 72) defines GROUP_OBJ in , which is included - * in many other header files. 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 -#endif /* HAVE_RPCSVC_NIS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SETJMP_H -# include -#endif /* HAVE_SETJMP_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SIGNAL_H -# include -#endif /* HAVE_SIGNAL_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_STRING_H -# include -#endif /* HAVE_STRING_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_STRINGS_H -# include -#endif /* HAVE_STRINGS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_CONFIG_H -# include -#endif /* HAVE_SYS_CONFIG_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_DG_MOUNT_H -# include -#endif /* HAVE_SYS_DG_MOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FS_TYPES_H -/* - * Define KERNEL here to avoid multiple definitions of gt_names[] on - * Ultrix 4.3. - */ -# define KERNEL -# include -# undef KERNEL -#endif /* HAVE_SYS_FS_TYPES_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_FSTYP_H -# include -#endif /* HAVE_SYS_FSTYP_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_LOCK_H -# include -#endif /* HAVE_SYS_LOCK_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_MACHINE_H -# include -#endif /* HAVE_SYS_MACHINE_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_MNTCTL_H -# include -#endif /* HAVE_SYS_MNTCTL_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_MNTTAB_H -# include -#endif /* HAVE_SYS_MNTTAB_H */ - -/* - * Actions to take if exists. - * Do not include it if MNTTAB is already defined because it probably - * came from and we do not want conflicting definitions. - */ -#if defined(HAVE_MNTTAB_H) && !defined(MNTTAB) -# include -#endif /* defined(HAVE_MNTTAB_H) && !defined(MNTTAB) */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_NETCONFIG_H -# include -/* Some systems (Solaris 2.5.1) don't declare this external */ -extern char *nc_sperror(void); -#endif /* HAVE_NETCONFIG_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_NETCONFIG_H -# include -#endif /* HAVE_SYS_NETCONFIG_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_PATHCONF_H -# include -#endif /* HAVE_SYS_PATHCONF_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_RESOURCE_H -# include -#endif /* HAVE_SYS_RESOURCE_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_SEMA_H -# include -#endif /* HAVE_SYS_SEMA_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_SIGNAL_H -# include -#endif /* HAVE_SYS_SIGNAL_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_SOCKIO_H -# include -#endif /* HAVE_SYS_SOCKIO_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_SYSCALL_H -# include -#endif /* HAVE_SYS_SYSCALL_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_SYSLIMITS_H -# include -#endif /* HAVE_SYS_SYSLIMITS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_TIUSER_H -/* - * Some systems like AIX have multiple definitions for T_NULL and others - * that are defined first in . - */ -# 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 -#endif /* HAVE_TIUSER_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_TIUSER_H -# include -#endif /* HAVE_SYS_TIUSER_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_STATFS_H -# include -#endif /* HAVE_SYS_STATFS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_STATVFS_H -# include -#endif /* HAVE_SYS_STATVFS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_VFS_H -# include -#endif /* HAVE_SYS_VFS_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_SYS_VMOUNT_H -# include -#endif /* HAVE_SYS_VMOUNT_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_UFS_UFS_MOUNT_H -# include -#endif /* HAVE_UFS_UFS_MOUNT_H */ - -/* - * Are S_ISDIR, S_ISREG, et al broken? If not, include . - * 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 (RedHat alpha linux) */ -# if defined(S_IFREG) && defined(HAVE_STATBUF_H) -# include -# 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 -# endif /* HAVE_SYS_STAT_H */ -#endif /* not STAT_MACROS_BROKEN_notused */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_STDIO_H -# include -#endif /* HAVE_STDIO_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_STDLIB_H -# include -#endif /* HAVE_STDLIB_H */ - -/* - * Actions to take if exists. - */ -#ifdef HAVE_REGEX_H -# include -#endif /* HAVE_REGEX_H */ - -/* - * Actions to take if exists. - */ -#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) -# include -#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_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 -#endif /* THIS_HEADER_FILE_IS_INCLUDED_ABOVE */ -#include -#include -#include -#include -#include - - -/****************************************************************************/ -/* - * 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 */ Index: contrib/amd/include/am_utils.h =================================================================== --- contrib/amd/include/am_utils.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -/* log option compositions */ -#define XLOG_MASK 0x00ff /* mask for all flags */ -#define XLOG_MANDATORY (XLOG_FATAL|XLOG_ERROR) /* cannot turn these off */ -#define XLOG_ALL (XLOG_FATAL|XLOG_ERROR|XLOG_USER|XLOG_WARNING|XLOG_INFO|XLOG_MAP|XLOG_STATS) -/* default: fatal + error + user + warning + info */ -#define XLOG_DEFAULT (XLOG_MASK & (XLOG_ALL & ~XLOG_MAP & ~XLOG_STATS)) - -/* default: no logging options */ - -#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 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 *strvcat(const 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 *, u_int *); -extern int compute_automounter_mount_flags(mntent_t *); -extern int compute_mount_flags(mntent_t *); -extern void discard_nfs_args(void *, u_long); -extern u_long 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 void nfs_program_3(struct svc_req *rqstp, SVCXPRT *transp); -#define get_nfs_dispatcher_version(a) \ - ((a) == nfs_program_2 ? NFS_VERSION : NFS_VERSION3) -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(u_long 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 char *xstrdup(const char *); -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, u_long def); -extern int nfs_valid_version(u_long vers); -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(void *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 void destroy_nfs_args(void *nap, u_long nfs_version); -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), u_long nfs_version); -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 old faithful generation NFS V.2 - */ -#ifndef NFS_VERSION2 -# define NFS_VERSION2 ((u_int) 2) -#endif /* not NFS_VERSION2 */ - -/* - * Network File System: the not so new anymore 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 */ - -/* - * Network File System: the new generation NFS V.4 - */ -#ifdef HAVE_FS_NFS4 -# ifndef NFS_VERSION4 -# define NFS_VERSION4 ((u_int) 4) -# endif /* not NFS_VERSION4 */ -#endif /* HAVE_FS_NFS4 */ - -/**************************************************************************/ -/*** DEBUGGING ***/ -/**************************************************************************/ - -/* - * DEBUGGING: - */ - -#ifdef DEBUG - -# define D_DAEMON 0x0001 /* 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 /* 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 /* Fork server (hlfsd only) */ -# define D_INFO 0x0100 /* info service specific debugging (hesiod, nis, etc) */ -# define D_HRTIME 0x0200 /* Print high resolution time stamps */ -# define D_XDRTRACE 0x0400 /* Trace xdr routines */ -# define D_READDIR 0x0800 /* Show browsable_dir progress */ -/* debug option compositions */ -# define D_MASK 0x0fff /* mask of known flags */ -# define D_BASIC (D_TRACE|D_FULL|D_STR|D_MEM|D_INFO|D_XDRTRACE|D_READDIR) -# define D_CONTROL (D_DAEMON|D_AMQ|D_FORK) -/* immutable flags: cannot be changed via "amq -D" */ -# define D_IMMUTABLE (D_MTAB | D_CONTROL) -# define D_ALL (D_BASIC | D_CONTROL) -# define D_DEFAULT (D_MASK & D_ALL & ~D_XDRTRACE) -/* test mode: nodaemon, noamq, nofork, (local) mtab */ -# define D_TEST (D_BASIC | D_MTAB) - -# 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 void *, u_long nfs_version); -extern int debug_option (char *opt); -extern void dplog(const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 1, 2))); - -#else /* not DEBUG */ - -/* set dummy flags to zero */ -# define D_DAEMON 0x0001 /* Enter daemon mode */ -# define D_TRACE 0x0000 /* dummy: Do protocol trace */ -# define D_FULL 0x0000 /* dummy: Do full trace */ -# define D_MTAB 0x0000 /* dummy: Use local mtab */ -# define D_AMQ 0x0010 /* Register amq program */ -# define D_STR 0x0000 /* dummy: Debug string munging */ -# define D_MEM 0x0000 /* dummy: Trace memory allocations */ -# define D_FORK 0x0080 /* Fork server (hlfsd only) */ -# define D_INFO 0x0000 /* dummy: info service debugging */ -# define D_HRTIME 0x0000 /* dummy: hi-res time stamps */ -# define D_XDRTRACE 0x0000 /* dummy: Trace xdr routines */ -# define D_READDIR 0x0000 /* dummy: browsable_dir progress */ -# define D_CONTROL (D_DAEMON|D_AMQ|D_FORK) -# define amuDebug(x) (debug_flags & (x)) -/* - * 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) - -# if defined(HAVE_GCC_VARARGS_MACROS) -# define dlog(fmt...) -# elif defined(HAVE_C99_VARARGS_MACROS) -# define dlog(...) -# else /* no c99 varargs */ -/* this define means that we CCP leaves code behind the (list,of,args) */ -# define dlog -# endif /* no c99 varargs */ - -# define print_nfs_args(nap, nfs_version) -# define debug_option(x) (1) - -#endif /* not DEBUG */ - -extern u_int debug_flags; /* Debug options */ -extern struct opt_tab dbg_opt[]; - -/**************************************************************************/ -/*** MISC (stuff left to autoconfiscate) ***/ -/**************************************************************************/ - -#endif /* not _AM_UTILS_H */ Index: contrib/amd/include/am_xdr_func.h =================================================================== --- contrib/amd/include/am_xdr_func.h +++ /dev/null @@ -1,1330 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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_MOUNTVERS3 ((unsigned long)(3)) - -#define AM_FHSIZE3 64 /* size in bytes of a file handle (v3) */ -#define AM_NFS3_WRITEVERFSIZE 8 -#define AM_NFS3_CREATEVERFSIZE 8 -#define AM_NFS3_COOKIEVERFSIZE 8 -#define AM_ACCESS3_READ 0x0001 -#define AM_ACCESS3_LOOKUP 0x0002 -#define AM_ACCESS3_MODIFY 0x0004 -#define AM_ACCESS3_EXTEND 0x0008 -#define AM_ACCESS3_DELETE 0x0010 -#define AM_ACCESS3_EXECUTE 0x0020 -#define AM_FSF3_LINK 0x0001 -#define AM_FSF3_SYMLINK 0x0002 -#define AM_FSF3_HOMOGENEOUS 0x0008 -#define AM_FSF3_CANSETTIME 0x0010 - -typedef char am_cookieverf3[AM_NFS3_COOKIEVERFSIZE]; - -typedef uint64 am_cookie3; - -/* 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; - -enum am_ftype3 { - AM_NF3REG = 1, - AM_NF3DIR = 2, - AM_NF3BLK = 3, - AM_NF3CHR = 4, - AM_NF3LNK = 5, - AM_NF3SOCK = 6, - AM_NF3FIFO = 7, -}; -typedef enum am_ftype3 am_ftype3; - -typedef u_int am_mode3; - -typedef u_int am_uid3; - -typedef u_int am_gid3; - -typedef uint64 am_size3; - -typedef uint64 am_fileid3; - -struct am_specdata3 { - u_int specdata1; - u_int specdata2; -}; -typedef struct am_specdata3 am_specdata3; - -struct am_nfstime3 { - u_int seconds; - u_int nseconds; -}; -typedef struct am_nfstime3 am_nfstime3; - -struct am_fattr3 { - am_ftype3 type; - am_mode3 mode; - u_int nlink; - am_uid3 uid; - am_gid3 gid; - am_size3 size; - am_size3 used; - am_specdata3 rdev; - uint64 fsid; - am_fileid3 fileid; - am_nfstime3 atime; - am_nfstime3 mtime; - am_nfstime3 ctime; -}; -typedef struct am_fattr3 am_fattr3; - -struct am_post_op_attr { - bool_t attributes_follow; - union { - am_fattr3 attributes; - } am_post_op_attr_u; -}; -typedef struct am_post_op_attr am_post_op_attr; - -enum am_stable_how { - AM_UNSTABLE = 0, - AM_DATA_SYNC = 1, - AM_FILE_SYNC = 2, -}; -typedef enum am_stable_how am_stable_how; - -typedef uint64 am_offset3; - -typedef u_int am_count3; - -struct am_wcc_attr { - am_size3 size; - am_nfstime3 mtime; - am_nfstime3 ctime; -}; -typedef struct am_wcc_attr am_wcc_attr; - -struct am_pre_op_attr { - bool_t attributes_follow; - union { - am_wcc_attr attributes; - } am_pre_op_attr_u; -}; -typedef struct am_pre_op_attr am_pre_op_attr; - -struct am_wcc_data { - am_pre_op_attr before; - am_post_op_attr after; -}; -typedef struct am_wcc_data am_wcc_data; - -struct am_WRITE3args { - am_nfs_fh3 file; - am_offset3 offset; - am_count3 count; - am_stable_how stable; - struct { - u_int data_len; - char *data_val; - } data; -}; -typedef struct am_WRITE3args am_WRITE3args; - -typedef char am_writeverf3[AM_NFS3_WRITEVERFSIZE]; - -struct am_WRITE3resok { - am_wcc_data file_wcc; - am_count3 count; - am_stable_how committed; - am_writeverf3 verf; -}; -typedef struct am_WRITE3resok am_WRITE3resok; - -struct am_WRITE3resfail { - am_wcc_data file_wcc; -}; -typedef struct am_WRITE3resfail am_WRITE3resfail; - -struct am_WRITE3res { - am_nfsstat3 status; - union { - am_WRITE3resok ok; - am_WRITE3resfail fail; - } res_u; -}; -typedef struct am_WRITE3res am_WRITE3res; - -struct am_LOOKUP3args { - am_diropargs3 what; -}; -typedef struct am_LOOKUP3args am_LOOKUP3args; - -struct am_LOOKUP3resok { - am_nfs_fh3 object; - am_post_op_attr obj_attributes; - am_post_op_attr dir_attributes; -}; -typedef struct am_LOOKUP3resok am_LOOKUP3resok; - -struct am_LOOKUP3resfail { - am_post_op_attr dir_attributes; -}; -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; - -struct am_COMMIT3args { - am_nfs_fh3 file; - am_offset3 offset; - am_count3 count; -}; -typedef struct am_COMMIT3args am_COMMIT3args; - -struct am_COMMIT3resok { - am_wcc_data file_wcc; - am_writeverf3 verf; -}; -typedef struct am_COMMIT3resok am_COMMIT3resok; - -struct am_COMMIT3resfail { - am_wcc_data file_wcc; -}; -typedef struct am_COMMIT3resfail am_COMMIT3resfail; - -struct am_COMMIT3res { - am_nfsstat3 status; - union { - am_COMMIT3resok ok; - am_COMMIT3resfail fail; - } res_u; -}; -typedef struct am_COMMIT3res am_COMMIT3res; - -struct am_ACCESS3args { - am_nfs_fh3 object; - u_int access; -}; -typedef struct am_ACCESS3args am_ACCESS3args; - -struct am_ACCESS3resok { - am_post_op_attr obj_attributes; - u_int access; -}; -typedef struct am_ACCESS3resok am_ACCESS3resok; - -struct am_ACCESS3resfail { - am_post_op_attr obj_attributes; -}; -typedef struct am_ACCESS3resfail am_ACCESS3resfail; - -struct am_ACCESS3res { - am_nfsstat3 status; - union { - am_ACCESS3resok ok; - am_ACCESS3resfail fail; - } res_u; -}; -typedef struct am_ACCESS3res am_ACCESS3res; - -struct am_GETATTR3args { - am_nfs_fh3 object; -}; -typedef struct am_GETATTR3args am_GETATTR3args; - -struct am_GETATTR3resok { - am_fattr3 obj_attributes; -}; -typedef struct am_GETATTR3resok am_GETATTR3resok; - -struct am_GETATTR3res { - am_nfsstat3 status; - union { - am_GETATTR3resok ok; - } res_u; -}; -typedef struct am_GETATTR3res am_GETATTR3res; - -enum am_time_how { - AM_DONT_CHANGE = 0, - AM_SET_TO_SERVER_TIME = 1, - AM_SET_TO_CLIENT_TIME = 2, -}; -typedef enum am_time_how am_time_how; - -struct am_set_mode3 { - bool_t set_it; - union { - am_mode3 mode; - } am_set_mode3_u; -}; -typedef struct am_set_mode3 am_set_mode3; - -struct am_set_uid3 { - bool_t set_it; - union { - am_uid3 uid; - } am_set_uid3_u; -}; -typedef struct am_set_uid3 am_set_uid3; - -struct am_set_gid3 { - bool_t set_it; - union { - am_gid3 gid; - } am_set_gid3_u; -}; -typedef struct am_set_gid3 am_set_gid3; - -struct am_set_size3 { - bool_t set_it; - union { - am_size3 size; - } am_set_size3_u; -}; -typedef struct am_set_size3 am_set_size3; - -struct am_set_atime { - am_time_how set_it; - union { - am_nfstime3 atime; - } am_set_atime_u; -}; -typedef struct am_set_atime am_set_atime; - -struct am_set_mtime { - am_time_how set_it; - union { - am_nfstime3 mtime; - } am_set_mtime_u; -}; -typedef struct am_set_mtime am_set_mtime; - -struct am_sattr3 { - am_set_mode3 mode; - am_set_uid3 uid; - am_set_gid3 gid; - am_set_size3 size; - am_set_atime atime; - am_set_mtime mtime; -}; -typedef struct am_sattr3 am_sattr3; - -enum am_createmode3 { - AM_UNCHECKED = 0, - AM_GUARDED = 1, - AM_EXCLUSIVE = 2, -}; -typedef enum am_createmode3 am_createmode3; - -typedef char am_createverf3[AM_NFS3_CREATEVERFSIZE]; - -struct am_createhow3 { - am_createmode3 mode; - union { - am_sattr3 obj_attributes; - am_sattr3 g_obj_attributes; - am_createverf3 verf; - } am_createhow3_u; -}; -typedef struct am_createhow3 am_createhow3; - -struct am_CREATE3args { - am_diropargs3 where; - am_createhow3 how; -}; -typedef struct am_CREATE3args am_CREATE3args; - -struct am_post_op_fh3 { - bool_t handle_follows; - union { - am_nfs_fh3 handle; - } am_post_op_fh3_u; -}; -typedef struct am_post_op_fh3 am_post_op_fh3; - -struct am_CREATE3resok { - am_post_op_fh3 obj; - am_post_op_attr obj_attributes; - am_wcc_data dir_wcc; -}; -typedef struct am_CREATE3resok am_CREATE3resok; - -struct am_CREATE3resfail { - am_wcc_data dir_wcc; -}; -typedef struct am_CREATE3resfail am_CREATE3resfail; - -struct am_CREATE3res { - am_nfsstat3 status; - union { - am_CREATE3resok ok; - am_CREATE3resfail fail; - } res_u; -}; -typedef struct am_CREATE3res am_CREATE3res; - -struct am_REMOVE3args { - am_diropargs3 object; -}; -typedef struct am_REMOVE3args am_REMOVE3args; - -struct am_REMOVE3resok { - am_wcc_data dir_wcc; -}; -typedef struct am_REMOVE3resok am_REMOVE3resok; - -struct am_REMOVE3resfail { - am_wcc_data dir_wcc; -}; -typedef struct am_REMOVE3resfail am_REMOVE3resfail; - -struct am_REMOVE3res { - am_nfsstat3 status; - union { - am_REMOVE3resok ok; - am_REMOVE3resfail fail; - } res_u; -}; -typedef struct am_REMOVE3res am_REMOVE3res; - -struct am_READ3args { - am_nfs_fh3 file; - am_offset3 offset; - am_count3 count; -}; -typedef struct am_READ3args am_READ3args; - -struct am_READ3resok { - am_post_op_attr file_attributes; - am_count3 count; - bool_t eof; - struct { - u_int data_len; - char *data_val; - } data; -}; -typedef struct am_READ3resok am_READ3resok; - -struct am_READ3resfail { - am_post_op_attr file_attributes; -}; -typedef struct am_READ3resfail am_READ3resfail; - -struct am_READ3res { - am_nfsstat3 status; - union { - am_READ3resok ok; - am_READ3resfail fail; - } res_u; -}; -typedef struct am_READ3res am_READ3res; - -struct am_FSINFO3args { - am_nfs_fh3 fsroot; -}; -typedef struct am_FSINFO3args am_FSINFO3args; - -struct am_FSINFO3resok { - am_post_op_attr obj_attributes; - u_int rtmax; - u_int rtpref; - u_int rtmult; - u_int wtmax; - u_int wtpref; - u_int wtmult; - u_int dtpref; - am_size3 maxfilesize; - am_nfstime3 time_delta; - u_int properties; -}; -typedef struct am_FSINFO3resok am_FSINFO3resok; - -struct am_FSINFO3resfail { - am_post_op_attr obj_attributes; -}; -typedef struct am_FSINFO3resfail am_FSINFO3resfail; - -struct am_FSINFO3res { - am_nfsstat3 status; - union { - am_FSINFO3resok ok; - am_FSINFO3resfail fail; - } res_u; -}; -typedef struct am_FSINFO3res am_FSINFO3res; - -struct am_FSSTAT3args { - am_nfs_fh3 fsroot; -}; -typedef struct am_FSSTAT3args am_FSSTAT3args; - -struct am_FSSTAT3resok { - am_post_op_attr obj_attributes; - am_size3 tbytes; - am_size3 fbytes; - am_size3 abytes; - am_size3 tfiles; - am_size3 ffiles; - am_size3 afiles; - u_int invarsec; -}; -typedef struct am_FSSTAT3resok am_FSSTAT3resok; - -struct am_FSSTAT3resfail { - am_post_op_attr obj_attributes; -}; -typedef struct am_FSSTAT3resfail am_FSSTAT3resfail; - -struct am_FSSTAT3res { - am_nfsstat3 status; - union { - am_FSSTAT3resok ok; - am_FSSTAT3resfail fail; - } res_u; -}; -typedef struct am_FSSTAT3res am_FSSTAT3res; - -struct am_PATHCONF3args { - am_nfs_fh3 object; -}; -typedef struct am_PATHCONF3args am_PATHCONF3args; - -struct am_PATHCONF3resok { - am_post_op_attr obj_attributes; - u_int linkmax; - u_int name_max; - bool_t no_trunc; - bool_t chown_restricted; - bool_t case_insensitive; - bool_t case_preserving; -}; -typedef struct am_PATHCONF3resok am_PATHCONF3resok; - -struct am_PATHCONF3resfail { - am_post_op_attr obj_attributes; -}; -typedef struct am_PATHCONF3resfail am_PATHCONF3resfail; - -struct am_PATHCONF3res { - am_nfsstat3 status; - union { - am_PATHCONF3resok ok; - am_PATHCONF3resfail fail; - } res_u; -}; -typedef struct am_PATHCONF3res am_PATHCONF3res; - -typedef char *am_nfspath3; - -struct am_symlinkdata3 { - am_sattr3 symlink_attributes; - am_nfspath3 symlink_data; -}; -typedef struct am_symlinkdata3 am_symlinkdata3; - -struct am_SYMLINK3args { - am_diropargs3 where; - am_symlinkdata3 symlink; -}; -typedef struct am_SYMLINK3args am_SYMLINK3args; - -struct am_SYMLINK3resok { - am_post_op_fh3 obj; - am_post_op_attr obj_attributes; - am_wcc_data dir_wcc; -}; -typedef struct am_SYMLINK3resok am_SYMLINK3resok; - -struct am_SYMLINK3resfail { - am_wcc_data dir_wcc; -}; -typedef struct am_SYMLINK3resfail am_SYMLINK3resfail; - -struct am_SYMLINK3res { - am_nfsstat3 status; - union { - am_SYMLINK3resok ok; - am_SYMLINK3resfail fail; - } res_u; -}; -typedef struct am_SYMLINK3res am_SYMLINK3res; - -struct am_READLINK3args { - am_nfs_fh3 symlink; -}; -typedef struct am_READLINK3args am_READLINK3args; - -struct am_READLINK3resok { - am_post_op_attr symlink_attributes; - am_nfspath3 data; -}; -typedef struct am_READLINK3resok am_READLINK3resok; - -struct am_READLINK3resfail { - am_post_op_attr symlink_attributes; -}; -typedef struct am_READLINK3resfail am_READLINK3resfail; - -struct am_READLINK3res { - am_nfsstat3 status; - union { - am_READLINK3resok ok; - am_READLINK3resfail fail; - } res_u; -}; -typedef struct am_READLINK3res am_READLINK3res; - -struct am_devicedata3 { - am_sattr3 dev_attributes; - am_specdata3 spec; -}; -typedef struct am_devicedata3 am_devicedata3; - -struct am_mknoddata3 { - am_ftype3 type; - union { - am_devicedata3 chr_device; - am_devicedata3 blk_device; - am_sattr3 sock_attributes; - am_sattr3 pipe_attributes; - } am_mknoddata3_u; -}; -typedef struct am_mknoddata3 am_mknoddata3; - -struct am_MKNOD3args { - am_diropargs3 where; - am_mknoddata3 what; -}; -typedef struct am_MKNOD3args am_MKNOD3args; - -struct am_MKNOD3resok { - am_post_op_fh3 obj; - am_post_op_attr obj_attributes; - am_wcc_data dir_wcc; -}; -typedef struct am_MKNOD3resok am_MKNOD3resok; - -struct am_MKNOD3resfail { - am_wcc_data dir_wcc; -}; -typedef struct am_MKNOD3resfail am_MKNOD3resfail; - -struct am_MKNOD3res { - am_nfsstat3 status; - union { - am_MKNOD3resok ok; - am_MKNOD3resfail fail; - } res_u; -}; -typedef struct am_MKNOD3res am_MKNOD3res; - -struct am_MKDIR3args { - am_diropargs3 where; - am_sattr3 attributes; -}; -typedef struct am_MKDIR3args am_MKDIR3args; - -struct am_MKDIR3resok { - am_post_op_fh3 obj; - am_post_op_attr obj_attributes; - am_wcc_data dir_wcc; -}; -typedef struct am_MKDIR3resok am_MKDIR3resok; - -struct am_MKDIR3resfail { - am_wcc_data dir_wcc; -}; -typedef struct am_MKDIR3resfail am_MKDIR3resfail; - -struct am_MKDIR3res { - am_nfsstat3 status; - union { - am_MKDIR3resok ok; - am_MKDIR3resfail fail; - } res_u; -}; -typedef struct am_MKDIR3res am_MKDIR3res; - -struct am_RMDIR3args { - am_diropargs3 object; -}; -typedef struct am_RMDIR3args am_RMDIR3args; - -struct am_RMDIR3resok { - am_wcc_data dir_wcc; -}; -typedef struct am_RMDIR3resok am_RMDIR3resok; - -struct am_RMDIR3resfail { - am_wcc_data dir_wcc; -}; -typedef struct am_RMDIR3resfail am_RMDIR3resfail; - -struct am_RMDIR3res { - am_nfsstat3 status; - union { - am_RMDIR3resok ok; - am_RMDIR3resfail fail; - } res_u; -}; -typedef struct am_RMDIR3res am_RMDIR3res; - -struct am_RENAME3args { - am_diropargs3 from; - am_diropargs3 to; -}; -typedef struct am_RENAME3args am_RENAME3args; - -struct am_RENAME3resok { - am_wcc_data fromdir_wcc; - am_wcc_data todir_wcc; -}; -typedef struct am_RENAME3resok am_RENAME3resok; - -struct am_RENAME3resfail { - am_wcc_data fromdir_wcc; - am_wcc_data todir_wcc; -}; -typedef struct am_RENAME3resfail am_RENAME3resfail; - -struct am_RENAME3res { - am_nfsstat3 status; - union { - am_RENAME3resok ok; - am_RENAME3resfail fail; - } res_u; -}; -typedef struct am_RENAME3res am_RENAME3res; - -struct am_READDIRPLUS3args { - am_nfs_fh3 dir; - am_cookie3 cookie; - am_cookieverf3 cookieverf; - am_count3 dircount; - am_count3 maxcount; -}; -typedef struct am_READDIRPLUS3args am_READDIRPLUS3args; - -struct am_entryplus3 { - am_fileid3 fileid; - am_filename3 name; - am_cookie3 cookie; - am_post_op_attr name_attributes; - am_post_op_fh3 name_handle; - struct am_entryplus3 *nextentry; -}; -typedef struct am_entryplus3 am_entryplus3; - -struct am_dirlistplus3 { - am_entryplus3 *entries; - bool_t eof; -}; -typedef struct am_dirlistplus3 am_dirlistplus3; - -struct am_READDIRPLUS3resok { - am_post_op_attr dir_attributes; - am_cookieverf3 cookieverf; - am_dirlistplus3 reply; -}; -typedef struct am_READDIRPLUS3resok am_READDIRPLUS3resok; - -struct am_READDIRPLUS3resfail { - am_post_op_attr dir_attributes; -}; -typedef struct am_READDIRPLUS3resfail am_READDIRPLUS3resfail; - -struct am_READDIRPLUS3res { - am_nfsstat3 status; - union { - am_READDIRPLUS3resok ok; - am_READDIRPLUS3resfail fail; - } res_u; -}; -typedef struct am_READDIRPLUS3res am_READDIRPLUS3res; - -struct am_READDIR3args { - am_nfs_fh3 dir; - am_cookie3 cookie; - am_cookieverf3 cookieverf; - am_count3 count; -}; -typedef struct am_READDIR3args am_READDIR3args; - -struct am_entry3 { - am_fileid3 fileid; - am_filename3 name; - am_cookie3 cookie; - struct am_entry3 *nextentry; -}; -typedef struct am_entry3 am_entry3; - -struct am_dirlist3 { - am_entry3 *entries; - bool_t eof; -}; -typedef struct am_dirlist3 am_dirlist3; - -struct am_READDIR3resok { - am_post_op_attr dir_attributes; - am_cookieverf3 cookieverf; - am_dirlist3 reply; -}; -typedef struct am_READDIR3resok am_READDIR3resok; - -struct am_READDIR3resfail { - am_post_op_attr dir_attributes; -}; -typedef struct am_READDIR3resfail am_READDIR3resfail; - -struct am_READDIR3res { - am_nfsstat3 status; - union { - am_READDIR3resok ok; - am_READDIR3resfail fail; - } res_u; -}; -typedef struct am_READDIR3res am_READDIR3res; - -struct am_LINK3args { - am_nfs_fh3 file; - am_diropargs3 link; -}; -typedef struct am_LINK3args am_LINK3args; - -struct am_LINK3resok { - am_post_op_attr file_attributes; - am_wcc_data linkdir_wcc; -}; -typedef struct am_LINK3resok am_LINK3resok; - -struct am_LINK3resfail { - am_post_op_attr file_attributes; - am_wcc_data linkdir_wcc; -}; -typedef struct am_LINK3resfail am_LINK3resfail; - -struct am_LINK3res { - am_nfsstat3 status; - union { - am_LINK3resok ok; - am_LINK3resfail fail; - } res_u; -}; -typedef struct am_LINK3res am_LINK3res; - -struct am_sattrguard3 { - bool_t check; - union { - am_nfstime3 obj_ctime; - } am_sattrguard3_u; -}; -typedef struct am_sattrguard3 am_sattrguard3; - -struct am_SETATTR3args { - am_nfs_fh3 object; - am_sattr3 new_attributes; - am_sattrguard3 guard; -}; -typedef struct am_SETATTR3args am_SETATTR3args; - -struct am_SETATTR3resok { - am_wcc_data obj_wcc; -}; -typedef struct am_SETATTR3resok am_SETATTR3resok; - -struct am_SETATTR3resfail { - am_wcc_data obj_wcc; -}; -typedef struct am_SETATTR3resfail am_SETATTR3resfail; - -struct am_SETATTR3res { - am_nfsstat3 status; - union { - am_SETATTR3resok ok; - am_SETATTR3resfail fail; - } res_u; -}; -typedef struct am_SETATTR3res am_SETATTR3res; -#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 -#define AM_NFS3_NULL 0 -void * am_nfs3_null_3(void *, CLIENT *); -void * am_nfs3_null_3_svc(void *, struct svc_req *); -#define AM_NFS3_GETATTR 1 -am_GETATTR3res * am_nfs3_getattr_3(am_GETATTR3args *, CLIENT *); -am_GETATTR3res * am_nfs3_getattr_3_svc(am_GETATTR3args *, struct svc_req *); -#define AM_NFS3_SETATTR 2 -am_SETATTR3res * am_nfs3_setattr_3(am_SETATTR3args *, CLIENT *); -am_SETATTR3res * am_nfs3_setattr_3_svc(am_SETATTR3args *, struct svc_req *); -#define AM_NFS3_LOOKUP 3 -am_LOOKUP3res * am_nfs3_lookup_3(am_LOOKUP3args *, CLIENT *); -am_LOOKUP3res * am_nfs3_lookup_3_svc(am_LOOKUP3args *, struct svc_req *); -#define AM_NFS3_ACCESS 4 -am_ACCESS3res * am_nfs3_access_3(am_ACCESS3args *, CLIENT *); -am_ACCESS3res * am_nfs3_access_3_svc(am_ACCESS3args *, struct svc_req *); -#define AM_NFS3_READLINK 5 -am_READLINK3res * am_nfs3_readlink_3(am_READLINK3args *, CLIENT *); -am_READLINK3res * am_nfs3_readlink_3_svc(am_READLINK3args *, struct svc_req *); -#define AM_NFS3_READ 6 -am_READ3res * am_nfs3_read_3(am_READ3args *, CLIENT *); -am_READ3res * am_nfs3_read_3_svc(am_READ3args *, struct svc_req *); -#define AM_NFS3_WRITE 7 -am_WRITE3res * am_nfs3_write_3(am_WRITE3args *, CLIENT *); -am_WRITE3res * am_nfs3_write_3_svc(am_WRITE3args *, struct svc_req *); -#define AM_NFS3_CREATE 8 -am_CREATE3res * am_nfs3_create_3(am_CREATE3args *, CLIENT *); -am_CREATE3res * am_nfs3_create_3_svc(am_CREATE3args *, struct svc_req *); -#define AM_NFS3_MKDIR 9 -am_MKDIR3res * am_nfs3_mkdir_3(am_MKDIR3args *, CLIENT *); -am_MKDIR3res * am_nfs3_mkdir_3_svc(am_MKDIR3args *, struct svc_req *); -#define AM_NFS3_SYMLINK 10 -am_SYMLINK3res * am_nfs3_symlink_3(am_SYMLINK3args *, CLIENT *); -am_SYMLINK3res * am_nfs3_symlink_3_svc(am_SYMLINK3args *, struct svc_req *); -#define AM_NFS3_MKNOD 11 -am_MKNOD3res * am_nfs3_mknod_3(am_MKNOD3args *, CLIENT *); -am_MKNOD3res * am_nfs3_mknod_3_svc(am_MKNOD3args *, struct svc_req *); -#define AM_NFS3_REMOVE 12 -am_REMOVE3res * am_nfs3_remove_3(am_REMOVE3args *, CLIENT *); -am_REMOVE3res * am_nfs3_remove_3_svc(am_REMOVE3args *, struct svc_req *); -#define AM_NFS3_RMDIR 13 -am_RMDIR3res * am_nfs3_rmdir_3(am_RMDIR3args *, CLIENT *); -am_RMDIR3res * am_nfs3_rmdir_3_svc(am_RMDIR3args *, struct svc_req *); -#define AM_NFS3_RENAME 14 -am_RENAME3res * am_nfs3_rename_3(am_RENAME3args *, CLIENT *); -am_RENAME3res * am_nfs3_rename_3_svc(am_RENAME3args *, struct svc_req *); -#define AM_NFS3_LINK 15 -am_LINK3res * am_nfs3_link_3(am_LINK3args *, CLIENT *); -am_LINK3res * am_nfs3_link_3_svc(am_LINK3args *, struct svc_req *); -#define AM_NFS3_READDIR 16 -am_READDIR3res * am_nfs3_readdir_3(am_READDIR3args *, CLIENT *); -am_READDIR3res * am_nfs3_readdir_3_svc(am_READDIR3args *, struct svc_req *); -#define AM_NFS3_READDIRPLUS 17 -am_READDIRPLUS3res * am_nfs3_readdirplus_3(am_READDIRPLUS3args *, CLIENT *); -am_READDIRPLUS3res * am_nfs3_readdirplus_3_svc(am_READDIRPLUS3args *, struct svc_req *); -#define AM_NFS3_FSSTAT 18 -am_FSSTAT3res * am_nfs3_fsstat_3(am_FSSTAT3args *, CLIENT *); -am_FSSTAT3res * am_nfs3_fsstat_3_svc(am_FSSTAT3args *, struct svc_req *); -#define AM_NFS3_FSINFO 19 -am_FSINFO3res * am_nfs3_fsinfo_3(am_FSINFO3args *, CLIENT *); -am_FSINFO3res * am_nfs3_fsinfo_3_svc(am_FSINFO3args *, struct svc_req *); -#define AM_NFS3_PATHCONF 20 -am_PATHCONF3res * am_nfs3_pathconf_3(am_PATHCONF3args *, CLIENT *); -am_PATHCONF3res * am_nfs3_pathconf_3_svc(am_PATHCONF3args *, struct svc_req *); -#define AM_NFS3_COMMIT 21 -am_COMMIT3res * am_nfs3_commit_3(am_COMMIT3args *, CLIENT *); -am_COMMIT3res * am_nfs3_commit_3_svc(am_COMMIT3args *, struct svc_req *); -int nfs_program_3_freeresult (SVCXPRT *, xdrproc_t, caddr_t); - -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); -bool_t xdr_am_cookieverf3 (XDR *, am_cookieverf3); -bool_t xdr_uint64 (XDR *, uint64*); -bool_t xdr_am_cookie3 (XDR *, am_cookie3*); -bool_t xdr_am_nfs_fh3 (XDR *, am_nfs_fh3*); -bool_t xdr_am_nfsstat3 (XDR *, am_nfsstat3*); -bool_t xdr_am_filename3 (XDR *, am_filename3*); -bool_t xdr_am_diropargs3 (XDR *, am_diropargs3*); -bool_t xdr_am_ftype3 (XDR *, am_ftype3*); -bool_t xdr_am_mode3 (XDR *, am_mode3*); -bool_t xdr_am_uid3 (XDR *, am_uid3*); -bool_t xdr_am_gid3 (XDR *, am_gid3*); -bool_t xdr_am_size3 (XDR *, am_size3*); -bool_t xdr_am_fileid3 (XDR *, am_fileid3*); -bool_t xdr_am_specdata3 (XDR *, am_specdata3*); -bool_t xdr_am_nfstime3 (XDR *, am_nfstime3*); -bool_t xdr_am_fattr3 (XDR *, am_fattr3*); -bool_t xdr_am_post_op_attr (XDR *, am_post_op_attr*); -bool_t xdr_am_stable_how (XDR *, am_stable_how*); -bool_t xdr_am_offset3 (XDR *, am_offset3*); -bool_t xdr_am_count3 (XDR *, am_count3*); -bool_t xdr_am_wcc_attr (XDR *, am_wcc_attr*); -bool_t xdr_am_pre_op_attr (XDR *, am_pre_op_attr*); -bool_t xdr_am_wcc_data (XDR *, am_wcc_data*); -bool_t xdr_am_WRITE3args (XDR *, am_WRITE3args*); -bool_t xdr_am_writeverf3 (XDR *, am_writeverf3); -bool_t xdr_am_WRITE3resok (XDR *, am_WRITE3resok*); -bool_t xdr_am_WRITE3resfail (XDR *, am_WRITE3resfail*); -bool_t xdr_am_WRITE3res (XDR *, am_WRITE3res*); -bool_t xdr_am_LOOKUP3args (XDR *, am_LOOKUP3args*); -bool_t xdr_am_LOOKUP3resok (XDR *, am_LOOKUP3resok*); -bool_t xdr_am_LOOKUP3resfail (XDR *, am_LOOKUP3resfail*); -bool_t xdr_am_LOOKUP3res (XDR *, am_LOOKUP3res*); -bool_t xdr_am_COMMIT3args (XDR *, am_COMMIT3args*); -bool_t xdr_am_COMMIT3resok (XDR *, am_COMMIT3resok*); -bool_t xdr_am_COMMIT3resfail (XDR *, am_COMMIT3resfail*); -bool_t xdr_am_COMMIT3res (XDR *, am_COMMIT3res*); -bool_t xdr_am_ACCESS3args (XDR *, am_ACCESS3args*); -bool_t xdr_am_ACCESS3resok (XDR *, am_ACCESS3resok*); -bool_t xdr_am_ACCESS3resfail (XDR *, am_ACCESS3resfail*); -bool_t xdr_am_ACCESS3res (XDR *, am_ACCESS3res*); -bool_t xdr_am_GETATTR3args (XDR *, am_GETATTR3args*); -bool_t xdr_am_GETATTR3resok (XDR *, am_GETATTR3resok*); -bool_t xdr_am_GETATTR3res (XDR *, am_GETATTR3res*); -bool_t xdr_am_time_how (XDR *, am_time_how*); -bool_t xdr_am_set_mode3 (XDR *, am_set_mode3*); -bool_t xdr_am_set_uid3 (XDR *, am_set_uid3*); -bool_t xdr_am_set_gid3 (XDR *, am_set_gid3*); -bool_t xdr_am_set_size3 (XDR *, am_set_size3*); -bool_t xdr_am_set_atime (XDR *, am_set_atime*); -bool_t xdr_am_set_mtime (XDR *, am_set_mtime*); -bool_t xdr_am_sattr3 (XDR *, am_sattr3*); -bool_t xdr_am_createmode3 (XDR *, am_createmode3*); -bool_t xdr_am_createverf3 (XDR *, am_createverf3); -bool_t xdr_am_createhow3 (XDR *, am_createhow3*); -bool_t xdr_am_CREATE3args (XDR *, am_CREATE3args*); -bool_t xdr_am_post_op_fh3 (XDR *, am_post_op_fh3*); -bool_t xdr_am_CREATE3resok (XDR *, am_CREATE3resok*); -bool_t xdr_am_CREATE3resfail (XDR *, am_CREATE3resfail*); -bool_t xdr_am_CREATE3res (XDR *, am_CREATE3res*); -bool_t xdr_am_REMOVE3args (XDR *, am_REMOVE3args*); -bool_t xdr_am_REMOVE3resok (XDR *, am_REMOVE3resok*); -bool_t xdr_am_REMOVE3resfail (XDR *, am_REMOVE3resfail*); -bool_t xdr_am_REMOVE3res (XDR *, am_REMOVE3res*); -bool_t xdr_am_READ3args (XDR *, am_READ3args*); -bool_t xdr_am_READ3resok (XDR *, am_READ3resok*); -bool_t xdr_am_READ3resfail (XDR *, am_READ3resfail*); -bool_t xdr_am_READ3res (XDR *, am_READ3res*); -bool_t xdr_am_FSINFO3args (XDR *, am_FSINFO3args*); -bool_t xdr_am_FSINFO3resok (XDR *, am_FSINFO3resok*); -bool_t xdr_am_FSINFO3resfail (XDR *, am_FSINFO3resfail*); -bool_t xdr_am_FSINFO3res (XDR *, am_FSINFO3res*); -bool_t xdr_am_FSSTAT3args (XDR *, am_FSSTAT3args*); -bool_t xdr_am_FSSTAT3resok (XDR *, am_FSSTAT3resok*); -bool_t xdr_am_FSSTAT3resfail (XDR *, am_FSSTAT3resfail*); -bool_t xdr_am_FSSTAT3res (XDR *, am_FSSTAT3res*); -bool_t xdr_am_PATHCONF3args (XDR *, am_PATHCONF3args*); -bool_t xdr_am_PATHCONF3resok (XDR *, am_PATHCONF3resok*); -bool_t xdr_am_PATHCONF3resfail (XDR *, am_PATHCONF3resfail*); -bool_t xdr_am_PATHCONF3res (XDR *, am_PATHCONF3res*); -bool_t xdr_am_nfspath3 (XDR *, am_nfspath3*); -bool_t xdr_am_symlinkdata3 (XDR *, am_symlinkdata3*); -bool_t xdr_am_SYMLINK3args (XDR *, am_SYMLINK3args*); -bool_t xdr_am_SYMLINK3resok (XDR *, am_SYMLINK3resok*); -bool_t xdr_am_SYMLINK3resfail (XDR *, am_SYMLINK3resfail*); -bool_t xdr_am_SYMLINK3res (XDR *, am_SYMLINK3res*); -bool_t xdr_am_READLINK3args (XDR *, am_READLINK3args*); -bool_t xdr_am_READLINK3resok (XDR *, am_READLINK3resok*); -bool_t xdr_am_READLINK3resfail (XDR *, am_READLINK3resfail*); -bool_t xdr_am_READLINK3res (XDR *, am_READLINK3res*); -bool_t xdr_am_devicedata3 (XDR *, am_devicedata3*); -bool_t xdr_am_mknoddata3 (XDR *, am_mknoddata3*); -bool_t xdr_am_MKNOD3args (XDR *, am_MKNOD3args*); -bool_t xdr_am_MKNOD3resok (XDR *, am_MKNOD3resok*); -bool_t xdr_am_MKNOD3resfail (XDR *, am_MKNOD3resfail*); -bool_t xdr_am_MKNOD3res (XDR *, am_MKNOD3res*); -bool_t xdr_am_MKDIR3args (XDR *, am_MKDIR3args*); -bool_t xdr_am_MKDIR3resok (XDR *, am_MKDIR3resok*); -bool_t xdr_am_MKDIR3resfail (XDR *, am_MKDIR3resfail*); -bool_t xdr_am_MKDIR3res (XDR *, am_MKDIR3res*); -bool_t xdr_am_RMDIR3args (XDR *, am_RMDIR3args*); -bool_t xdr_am_RMDIR3resok (XDR *, am_RMDIR3resok*); -bool_t xdr_am_RMDIR3resfail (XDR *, am_RMDIR3resfail*); -bool_t xdr_am_RMDIR3res (XDR *, am_RMDIR3res*); -bool_t xdr_am_RENAME3args (XDR *, am_RENAME3args*); -bool_t xdr_am_RENAME3resok (XDR *, am_RENAME3resok*); -bool_t xdr_am_RENAME3resfail (XDR *, am_RENAME3resfail*); -bool_t xdr_am_RENAME3res (XDR *, am_RENAME3res*); -bool_t xdr_am_READDIRPLUS3args (XDR *, am_READDIRPLUS3args*); -bool_t xdr_am_entryplus3 (XDR *, am_entryplus3*); -bool_t xdr_am_dirlistplus3 (XDR *, am_dirlistplus3*); -bool_t xdr_am_READDIRPLUS3resok (XDR *, am_READDIRPLUS3resok*); -bool_t xdr_am_READDIRPLUS3resfail (XDR *, am_READDIRPLUS3resfail*); -bool_t xdr_am_READDIRPLUS3res (XDR *, am_READDIRPLUS3res*); -bool_t xdr_am_READDIR3args (XDR *, am_READDIR3args*); -bool_t xdr_am_entry3 (XDR *, am_entry3*); -bool_t xdr_am_dirlist3 (XDR *, am_dirlist3*); -bool_t xdr_am_READDIR3resok (XDR *, am_READDIR3resok*); -bool_t xdr_am_READDIR3resfail (XDR *, am_READDIR3resfail*); -bool_t xdr_am_READDIR3res (XDR *, am_READDIR3res*); -bool_t xdr_am_LINK3args (XDR *, am_LINK3args*); -bool_t xdr_am_LINK3resok (XDR *, am_LINK3resok*); -bool_t xdr_am_LINK3resfail (XDR *, am_LINK3resfail*); -bool_t xdr_am_LINK3res (XDR *, am_LINK3res*); -bool_t xdr_am_sattrguard3 (XDR *, am_sattrguard3*); -bool_t xdr_am_SETATTR3args (XDR *, am_SETATTR3args*); -bool_t xdr_am_SETATTR3resok (XDR *, am_SETATTR3resok*); -bool_t xdr_am_SETATTR3resfail (XDR *, am_SETATTR3resfail*); -bool_t xdr_am_SETATTR3res (XDR *, am_SETATTR3res*); -#endif /* HAVE_FS_NFS3 */ - -#endif /* not _AM_XDR_FUNC_H */ Index: contrib/amd/include/amq_defs.h =================================================================== --- contrib/amd/include/amq_defs.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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) /* asynchronous unmount */ -#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) -#define AMQPROC_SYNC_UMNT ((u_long)11) /* synchronous unmount */ -#define AMQPROC_GETMAPINFO ((u_long)12) - -/* - * TYPEDEFS - */ -typedef time_t *time_type; -typedef struct amq_mount_info amq_mount_info; -typedef struct amq_map_info amq_map_info; -typedef struct amq_mount_stats amq_mount_stats; -typedef struct amq_mount_tree amq_mount_tree; -typedef struct amq_setopt amq_setopt; -typedef struct amq_sync_umnt amq_sync_umnt; -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_map_info { - amq_string mi_name; - amq_string mi_wildcard; - time_type mi_modify; - int mi_flags; - int mi_refc; - int mi_up; - int mi_reloads; - int mi_nentries; -}; - -typedef struct { - u_int amq_map_info_list_len; - amq_map_info *amq_map_info_list_val; -} amq_map_info_list; - -struct amq_mount_stats { - int as_drops; - int as_stale; - int as_mok; - int as_merr; - int as_uerr; -}; - -typedef enum { - AMQ_UMNT_OK = 0, /* must be zero! */ - AMQ_UMNT_FAILED = 1, /* unmount failed */ - AMQ_UMNT_FORK = 2, /* fork failed */ - AMQ_UMNT_READ = 3, /* pipe read failed */ - AMQ_UMNT_SERVER = 4, /* server down */ - AMQ_UMNT_SIGNAL = 5 /* received signal */ -} au_etype; - -struct amq_sync_umnt { - au_etype au_etype; /* error type */ - int au_errno; /* error number */ - int au_signal; /* signal received */ -}; - -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_map_info(XDR *xdrs, amq_map_info *objp); -extern bool_t xdr_amq_map_info_list(XDR *xdrs, amq_map_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_amq_sync_umnt(XDR *xdrs, amq_sync_umnt *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 */ Index: contrib/amd/include/mount_headers1.h =================================================================== --- contrib/amd/include/mount_headers1.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_SYS_TYPES_H */ -#ifdef HAVE_SYS_ERRNO_H -# include -#endif /* HAVE_SYS_ERRNO_H */ -#ifdef HAVE_SYS_PARAM_H -# include -#endif /* HAVE_SYS_PARAM_H */ -#ifdef HAVE_SYS_TIME_H -# include -#endif /* HAVE_SYS_TIME_H */ -#ifdef HAVE_SYS_UCRED_H -# include -#endif /* HAVE_SYS_UCRED_H */ -#ifdef HAVE_SYS_SOCKET_H -# include -#endif /* HAVE_SYS_SOCKET_H */ -#ifdef HAVE_NETINET_IN_H -# include -#endif /* HAVE_NETINET_IN_H */ -#ifdef HAVE_NET_IF_H -# include -#endif /* HAVE_NET_IF_H */ -#ifdef HAVE_STDIO_H -# include -#endif /* HAVE_STDIO_H */ - -#ifndef KERNEL -# define KERNEL_off_for_now_breaks_FreeBSD -#endif /* not KERNEL */ - -#ifdef HAVE_SYS_MNTENT_H -# include -#endif /* HAVE_SYS_MNTENT_H */ -#ifdef HAVE_MNTENT_H -# include -#endif /* HAVE_MNTENT_H */ -#ifdef HAVE_SYS_MNTTAB_H -# include -#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 and we do not want conflicting definitions. - */ -# include -#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 -#endif /* HAVE_SYS_MOUNT_H */ - -#ifdef HAVE_SYS_VMOUNT_H -# include -#endif /* HAVE_SYS_VMOUNT_H */ - -#if HAVE_LINUX_FS_H -# if !defined(__GLIBC__) || __GLIBC__ < 2 -/* - * There's a conflict of definitions on redhat alpha linux between - * and . - * Also a conflict in definitions of ntohl/htonl in RH-5.1 sparc64 - * between and (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 -# 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 -# undef __KERNEL__ -# endif /* HAVE_LINUX_KDEV_T_H */ -# ifdef HAVE_LINUX_LIST_H -# define __KERNEL__ -# include -# undef __KERNEL__ -# endif /* HAVE_LINUX_LIST_H */ -# include -# else -# include -# endif/* (!__GLIBC__ || __GLIBC__ < 2) */ -#endif /* HAVE_LINUX_FS_H */ - -#ifdef HAVE_SYS_FS_TYPES_H -# include -#endif /* HAVE_SYS_FS_TYPES_H */ - -#ifdef HAVE_UFS_UFS_MOUNT_H -# include -#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 -#endif /* HAVE_UFS_UFS_UFSMOUNT_H_off */ - -#ifdef HAVE_CDFS_CDFS_MOUNT_H -# include -#endif /* HAVE_CDFS_CDFS_MOUNT_H */ -#ifdef HAVE_CDFS_CDFSMOUNT_H -# include -#endif /* HAVE_CDFS_CDFSMOUNT_H */ -#ifdef HAVE_ISOFS_CD9660_CD9660_MOUNT_H -# include -#endif /* HAVE_ISOFS_CD9660_CD9660_MOUNT_H */ - -#ifdef HAVE_FS_UDF_UDF_MOUNT_H -# include -#endif /* HAVE_FS_UDF_UDF_MOUNT_H */ - -#ifdef HAVE_SYS_FS_PC_FS_H -# include -#endif /* HAVE_SYS_FS_PC_FS_H */ -#ifdef HAVE_MSDOSFS_MSDOSFSMOUNT_H -# include -#endif /* HAVE_MSDOSFS_MSDOSFSMOUNT_H */ -#ifdef HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H -# include -#endif /* HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H */ - -#ifdef HAVE_FS_TMPFS_TMPFS_ARGS_H -# include -#endif /* HAVE_FS_TMPFS_TMPFS_ARGS_H */ - -#ifdef HAVE_FS_EFS_EFS_MOUNT_H -# include -#endif /* HAVE_FS_EFS_EFS_MOUNT_H */ - -#ifdef HAVE_RPC_RPC_H -# include -#endif /* HAVE_RPC_RPC_H */ -#ifdef HAVE_RPC_TYPES_H -# include -#endif /* HAVE_RPC_TYPES_H */ -/* Prevent multiple inclusion on Ultrix 4 */ -#if defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__) -# include -#endif /* defined(HAVE_RPC_XDR_H) && !defined(__XDR_HEADER__) */ - -/* ALWAYS INCLUDE AM-UTILS' SPECIFIC NFS PROTOCOL HEADER NEXT! */ Index: contrib/amd/include/mount_headers2.h =================================================================== --- contrib/amd/include/mount_headers2.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_RPCSVC_MOUNT_H */ - -#ifdef HAVE_MOUNT_H -# include -#endif /* HAVE_MOUNT_H */ - -#ifdef HAVE_NFS_NFS_GFS_H -# include -#endif /* HAVE_NFS_NFS_GFS_H */ - -#ifdef HAVE_NFS_MOUNT_H -# include -#endif /* HAVE_NFS_MOUNT_H */ - -#ifdef HAVE_SYS_FS_NFS_CLNT_H -# include -#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 -# undef __KERNEL__ -#endif /* HAVE_LINUX_NFS_MOUNT_H */ Index: contrib/amd/include/nfs_common.h =================================================================== --- contrib/amd/include/nfs_common.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2011 Christos Zoulas - * 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. 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/nfs_common.c - * - */ -struct nfs_common_args { - u_long flags; - u_long acdirmin; - u_long acdirmax; - u_long acregmin; - u_long acregmax; - u_long timeo; - u_long retrans; - u_long rsize; - u_long wsize; -}; - -#ifdef HAVE_NFS_ARGS_T_ACREGMIN -#define GET_ACREGMIN(nap, a) nap->acregmin = a.acregmin; -#define PUT_ACREGMIN(nap, a) a.acregmin = nap->acregmin; -#else -#define GET_ACREGMIN(nap, a) -#define PUT_ACREGMIN(nap, a) -#endif -#ifdef HAVE_NFS_ARGS_T_ACREGMAX -#define GET_ACREGMAX(nap, a) nap->acregmax = a.acregmax; -#define PUT_ACREGMAX(nap, a) a.acregmax = nap->acregmax; -#else -#define GET_ACREGMAX(nap, a) -#define PUT_ACREGMAX(nap, a) -#endif - -#ifdef HAVE_NFS_ARGS_T_ACDIRMIN -#define GET_ACDIRMIN(nap, a) nap->acdirmin = a.acdirmin; -#define PUT_ACDIRMIN(nap, a) a.acdirmin = nap->acdirmin; -#else -#define GET_ACDIRMIN(nap, a) -#define PUT_ACDIRMIN(nap, a) -#endif -#ifdef HAVE_NFS_ARGS_T_ACDIRMAX -#define GET_ACDIRMAX(nap, a) nap->acdirmax = a.acdirmax; -#define PUT_ACDIRMAX(nap, a) a.acdirmax = nap->acdirmax; -#else -#define GET_ACDIRMAX(nap, a) -#define PUT_ACDIRMAX(nap, a) -#endif - -#define get_nfs_common_args(nap, a) \ - do { \ - nap->flags = a.flags; \ - GET_ACREGMIN(nap, a) \ - GET_ACREGMAX(nap, a) \ - GET_ACDIRMIN(nap, a) \ - GET_ACDIRMAX(nap, a) \ - nap->timeo = a.timeo; \ - nap->retrans = a.retrans; \ - nap->rsize = a.rsize; \ - nap->wsize = a.wsize; \ - } while (/*CONSTCOND*/0) - -#define put_nfs_common_args(nap, a) \ - do { \ - a.flags = nap->flags; \ - PUT_ACREGMIN(nap, a) \ - PUT_ACREGMAX(nap, a) \ - PUT_ACDIRMIN(nap, a) \ - PUT_ACDIRMAX(nap, a) \ - a.timeo = nap->timeo; \ - a.retrans = nap->retrans; \ - a.rsize = nap->rsize; \ - a.wsize = nap->wsize; \ - } while (/*CONSTCOND*/0) Index: contrib/amd/ldap-id.ms =================================================================== --- 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 AT matematik.su.se Index: contrib/amd/ldap-id.txt =================================================================== --- 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 AT matematik.su.se - - - - - - - - - - - - - - - - - - - - - -Johansson [Page 6] - - Index: contrib/amd/ldap.schema =================================================================== --- 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 -# Revised by Adam Morley - -# 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 ) ) Index: contrib/amd/libamu/amu.h =================================================================== --- contrib/amd/libamu/amu.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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. - */ -#if defined(HAVE_FS_NFS4) -# define NFS_VERS_MAX NFS_VERSION4 -#elif defined(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 */ -# define NFS_VERS_MIN NFS_VERSION - -/* some systems like ncr2 do not define this in */ -#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 */ Index: contrib/amd/libamu/hasmntopt.c =================================================================== --- contrib/amd/libamu/hasmntopt.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#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 - */ -static char * -nextmntopt(char **p) -{ - char *cp = *p; - char *rp; - - /* - * Skip past white space - */ - while (*cp && isspace((unsigned char) *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; - size_t 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; -} Index: contrib/amd/libamu/misc_rpc.c =================================================================== --- contrib/amd/libamu/misc_rpc.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 */ -} Index: contrib/amd/libamu/mount_fs.c =================================================================== --- contrib/amd/libamu/mount_fs.c +++ /dev/null @@ -1,1496 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include -#include - - -/* 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) */ - -#if defined(MNT2_GEN_OPT_LOG) && defined(MNTTAB_OPT_LOG) - {MNTTAB_OPT_LOG, MNT2_GEN_OPT_LOG}, -#endif /* defined(MNT2_GEN_OPT_LOG) && defined(MNTTAB_OPT_LOG) */ - -#if defined(MNT2_GEN_OPT_NOATIME) && defined(MNTTAB_OPT_NOATIME) - {MNTTAB_OPT_NOATIME, MNT2_GEN_OPT_NOATIME}, -#endif /* defined(MNT2_GEN_OPT_NOATIME) && defined(MNTTAB_OPT_NOATIME) */ - -#if defined(MNT2_GEN_OPT_NODEVMTIME) && defined(MNTTAB_OPT_NODEVMTIME) - {MNTTAB_OPT_NODEVMTIME, MNT2_GEN_OPT_NODEVMTIME}, -#endif /* defined(MNT2_GEN_OPT_NODEVMTIME) && defined(MNTTAB_OPT_NODEVMTIME) */ - -#if defined(MNT2_GEN_OPT_SOFTDEP) && defined(MNTTAB_OPT_SOFTDEP) - {MNTTAB_OPT_SOFTDEP, MNT2_GEN_OPT_SOFTDEP}, -#endif /* defined(MNT2_GEN_OPT_SOFTDEP) && defined(MNTTAB_OPT_SOFTDEP) */ - -#if defined(MNT2_GEN_OPT_SYMPERM) && defined(MNTTAB_OPT_SYMPERM) - {MNTTAB_OPT_SYMPERM, MNT2_GEN_OPT_SYMPERM}, -#endif /* defined(MNT2_GEN_OPT_SYMPERM) && defined(MNTTAB_OPT_SYMPERM) */ - -#if defined(MNT2_GEN_OPT_UNION) && defined(MNTTAB_OPT_UNION) - {MNTTAB_OPT_UNION, MNT2_GEN_OPT_UNION}, -#endif /* defined(MNT2_GEN_OPT_UNION) && defined(MNTTAB_OPT_UNION) */ - - /* - * 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; -} - - -#if defined(MOUNT_TABLE_ON_FILE) && defined(MNTTAB_OPT_VERS) -/* - * add the extra vers={2,3} field to the mount table, - * unless already specified by user - */ -static void -addvers(char *zopts, size_t l, mntent_t *mnt, u_long have_vers, - u_long want_vers) -{ - if (have_vers == want_vers && - hasmntval(mnt, MNTTAB_OPT_VERS) != want_vers) { - char optsbuf[48]; - xsnprintf(optsbuf, sizeof(optsbuf), - "%s=%d", MNTTAB_OPT_VERS, want_vers); - append_opts(zopts, l, optsbuf); - } -} -#endif /* MOUNT_TABLE_ON_FILE && MNTTAB_OPT_VERS */ - -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 = NULL; - -#ifdef NEED_AUTOFS_SPACE_HACK - char *old_mnt_dir = NULL; - /* 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 = xstrdup(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_NFS4) && defined(MNTTAB_OPT_VERS) - addvers(zopts, l, mnt, nfs_version, NFS_VERSION4); -# endif /* defined(HAVE_FS_NFS4) && defined(MNTTAB_OPT_VERS) */ -# if defined(HAVE_FS_NFS3) && defined(MNTTAB_OPT_VERS) - addvers(zopts, l, mnt, nfs_version, NFS_VERSION3); -# endif /* defined(HAVE_FS_NFS3) && defined(MNTTAB_OPT_VERS) */ -# ifdef MNTTAB_OPT_VERS - addvers(zopts, l, mnt, nfs_version, NFS_VERSION2); -# endif /* 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(struct nfs_common_args *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 - int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMIN, &tmp); - nap->acregmin = tmp; -# 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 - int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMAX, &tmp); - nap->acregmax = tmp; -# 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 - int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMIN, &tmp); - nap->acdirmin = tmp; -# 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 - int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMAX, &tmp); - nap->acdirmax = tmp; -# 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) */ -} - - - -static void -compute_nfs_common_args(struct nfs_common_args *nap, mntent_t *mntp, - const char *nfs_proto, u_long nfs_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 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 */ - - 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_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 (*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 MNT2_NFS_OPT_NOACL - if (amu_hasmntopt(mntp, MNTTAB_OPT_NOACL) != NULL) - nap->flags |= MNT2_NFS_OPT_NOACL; -#endif /* MNT2_NFS_OPT_NOACL */ - -#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 */ - - -#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_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_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) */ -} - -static void -print_nfs_common_args(const struct nfs_common_args *a) -{ - plog(XLOG_DEBUG, "NA->flags = 0x%lx", a->flags); - - plog(XLOG_DEBUG, "NA->rsize = %lu", a->rsize); - plog(XLOG_DEBUG, "NA->wsize = %lu", a->wsize); - plog(XLOG_DEBUG, "NA->timeo = %lu", a->timeo); - plog(XLOG_DEBUG, "NA->retrans = %lu", a->retrans); - -#ifdef HAVE_NFS_ARGS_T_ACREGMIN - plog(XLOG_DEBUG, "NA->acregmin = %lu", a->acregmin); - plog(XLOG_DEBUG, "NA->acregmax = %lu", a->acregmax); - plog(XLOG_DEBUG, "NA->acdirmin = %lu", a->acdirmin); - plog(XLOG_DEBUG, "NA->acdirmax = %lu", a->acdirmax); -#endif /* HAVE_NFS_ARGS_T_ACREGMIN */ -} - -static void -discard_nfs23_args(nfs_args_t *nap) -{ -#ifdef HAVE_TRANSPORT_TYPE_TLI - free_knetconfig(nap->knconf); - if (nap->addr) - XFREE(nap->addr); /* allocated in compute_nfs_args() */ -#endif /* HAVE_TRANSPORT_TYPE_TLI */ -} - -#ifdef DEBUG -/* get string version (in hex) of identifier */ -static char * -get_hex_string(u_int len, const char *fhdata) -{ - u_int i; - static u_int xlen; - static char *buf; - static u_short *arr; - char str[16]; - - if (!fhdata || len == 0 || len > 10240) - return NULL; - i = len * 4 + 1; - if (xlen < i) { - buf = xrealloc(buf, i); - arr = xrealloc(arr, len * sizeof(*arr)); - xlen = i; - } - - buf[0] = '\0'; - memset(arr, 0, len * sizeof(*arr)); - memcpy(arr, fhdata, len); - len /= sizeof(*arr); - for (i = 0; i < len; i++) { - xsnprintf(str, sizeof(str), "%04x", ntohs(arr[i])); - xstrlcat(buf, str, xlen); - } - return buf; -} - -static void -print_nfs_sockaddr_in(const char *tag, const struct sockaddr_in *sap) -{ - char name[64]; - plog(XLOG_DEBUG, "NA->%s.sin_family = %d", tag, sap->sin_family); - plog(XLOG_DEBUG, "NA->%s.sin_port = %d", tag, ntohs(sap->sin_port)); - if (inet_ntop(AF_INET, &sap->sin_addr, name, sizeof(name)) == NULL) - return; - plog(XLOG_DEBUG, "NA->%s.sin_addr = \"%s\"", tag, name); -} - -/* - * print a subset of fields from "struct nfs_args" that are otherwise - * not being provided anywhere else. - */ -static void -print_nfs23_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 */ - struct nfs_common_args a; - - 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 */ -#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 */ - print_nfs_sockaddr_in("addr", sap); -#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 */ - - put_nfs_common_args(nap, a); - print_nfs_common_args(&a); - -#ifdef HAVE_NFS_ARGS_T_BSIZE - plog(XLOG_DEBUG, "NA->bsize = %d", nap->bsize); -#endif /* HAVE_NFS_ARGS_T_BSIZE */ - -#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 */ - -/* - * 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, 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 - */ -static void -compute_nfs23_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) -{ - struct nfs_common_args a; - /* initialize just in case */ - memset((voidp) nap, 0, sizeof(nfs_args_t)); - - /* compute all of the NFS attribute-cache flags */ - memset(&a, 0, sizeof(a)); - compute_nfs_attrcache_flags(&a, mntp); - compute_nfs_common_args(&a, mntp, nfs_proto, nfs_version); - get_nfs_common_args(nap, a); - - /************************************************************************/ - /*** FILEHANDLE DATA AND LENGTH ***/ - /************************************************************************/ -#ifdef HAVE_FS_NFS3 - if (nfs_version == NFS_VERSION3) { - if (fhp == NULL) { - plog(XLOG_FATAL, "cannot pass NULL fh for NFSv%lu", nfs_version); - going_down(1); - return; - } - -# 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 */ - { - if (fhp == NULL) { - plog(XLOG_FATAL, "cannot pass NULL fh for NFSv%lu", nfs_version); - going_down(1); - return; - } - 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 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 ***/ - /************************************************************************/ - - /************************************************************************/ - /*** OTHER FLAGS AND OPTIONS ***/ - /************************************************************************/ - -#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 MNTTAB_OPT_SYMTTL /* symlink cache time-to-live */ - if ((nap->symttl = hasmntval(mntp, MNTTAB_OPT_SYMTTL))) - nap->args.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->args.flags |= MNT2_NFS_OPT_PGTHRESH; -#endif /* MNT2_NFS_OPT_PGTHRESH */ - -#if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX) - if (amu_hasmntopt(mntp, MNTTAB_OPT_POSIX) != NULL) { - nap->flags |= MNT2_NFS_OPT_POSIX; -# ifdef HAVE_NFS_ARGS_T_PATHCONF - nap->pathconf = NULL; -# endif /* HAVE_NFS_ARGS_T_PATHCONF */ - } -#endif /* MNT2_NFS_OPT_POSIX && MNTTAB_OPT_POSIX */ - -#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); - return; - } - /* update the flags field for knconf */ - nap->args.flags |= MNT2_NFS_OPT_KNCONF; -#endif /* HAVE_TRANSPORT_TYPE_TLI */ - -#ifdef MNT2_NFS_OPT_FSNAME - nap->fsname = fs_name; - nap->args.flags |= MNT2_NFS_OPT_FSNAME; -#endif /* MNT2_NFS_OPT_FSNAME */ - - -#ifdef HAVE_NFS_ARGS_T_OPTSTR - nap->optstr = mntp->mnt_opts; -#endif /* HAVE_NFS_ARGS_T_OPTSTR */ - -#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) */ - - /************************************************************************/ - /*** 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 */ -} - -#ifdef HAVE_FS_NFS4 - -#define RPC_AUTH_GSS_KRB5 390003 -#define RPC_AUTH_GSS_KRB5I 390004 -#define RPC_AUTH_GSS_KRB5P 390005 -#define RPC_AUTH_GSS_LKEY 390006 -#define RPC_AUTH_GSS_LKEYI 390007 -#define RPC_AUTH_GSS_LKEYP 390008 -#define RPC_AUTH_GSS_SPKM 390009 -#define RPC_AUTH_GSS_SPKMI 390010 -#define RPC_AUTH_GSS_SPKMP 390011 - -struct { - const char *name; - int num; -} flavours[] = { - { "unix", AUTH_UNIX }, - { "krb5", RPC_AUTH_GSS_KRB5 }, - { "krb5i", RPC_AUTH_GSS_KRB5I }, - { "krb5p", RPC_AUTH_GSS_KRB5P }, - { "lkey", RPC_AUTH_GSS_LKEY }, - { "lkeyi", RPC_AUTH_GSS_LKEYI }, - { "lkeyp", RPC_AUTH_GSS_LKEYP }, - { "spkm", RPC_AUTH_GSS_SPKM }, - { "spkmi", RPC_AUTH_GSS_SPKMI }, - { "spkmp", RPC_AUTH_GSS_SPKMP }, -}; - -static char * -set_nfs4_security(nfs4_args_t *nap, mntent_t *mntp) -{ - const char *o = hasmnteq(mntp, MNTTAB_OPT_SEC); - char *q, *s, *ss; - size_t l, i; - - if (o == NULL) - o = "unix"; - - for (l = 1, q = strchr(o, ','); q; q = strchr(q + 1, ',')) - l++; - - nap->auth_flavours = xmalloc(l * sizeof(*nap->auth_flavours)); - - s = ss = xstrdup(o); - for (;;) { - q = strchr(s, ','); - if (q) - *q = '\0'; - - for (l = 0, i = 0; i < sizeof(flavours) / sizeof(flavours[0]); i++) - if (strcmp(flavours[i].name, s) == 0) { - nap->auth_flavours[l++] = flavours[i].num; - break; - } - - if (i == sizeof(flavours) / sizeof(flavours[0])) - plog(XLOG_ERROR, "Unknown NFSv4 security mechanism %s\n", s); - - if (q == NULL) - break; - - *q = ':'; - s = ++q; - } - - nap->auth_flavourlen = l; - return ss; -} - -static int -get_my_ipv4addr(struct nfs_string *ns) -{ - struct hostent *hp; - char myname[MAXHOSTNAMELEN]; - - if (gethostname(myname, sizeof(myname)) == -1) - return -1; - if ((hp = gethostbyname(myname)) == NULL) - return -1; - if (inet_ntop(AF_INET, hp->h_addr, myname, sizeof(myname)) == NULL) - return -1; - ns->len = strlen(myname); - ns->data = xmalloc(ns->len + 1); - memcpy(ns->data, myname, ns->len + 1); - return 0; -} - -static void -add_nfs4_mntopts(const nfs4_args_t *nap, mntent_t *mntp, char *sec) -{ - char *opts = mntp->mnt_opts; - char buf[1024], addr[128]; - size_t len = strlen(mntp->mnt_opts); - - if (inet_ntop(AF_INET, - &((const struct sockaddr_in *)nap->host_addr)->sin_addr, - addr, sizeof(addr)) == NULL) - return; - - xsnprintf(buf, sizeof(buf), ",clientaddr=%s,addr=%s", nap->client_addr.data, - addr); - - len += strlen(buf) + 1; - - if (sec && strcmp(sec, "unix") != 0) { - len += strlen(sec) + strlen(MNTTAB_OPT_SEC) + 2; /* 2 = ",=" */ - } else - sec = NULL; - - opts = xrealloc(mntp->mnt_opts, len); - xstrlcat(opts, buf, len); - - if (sec) { - xstrlcat(opts, ",", len); - xstrlcat(opts, MNTTAB_OPT_SEC, len); - xstrlcat(opts, "=", len); - xstrlcat(opts, sec, len); - } - - mntp->mnt_opts = opts; -} - -static void -print_nfs4_security(const nfs4_args_t *nap) -{ - char buf[1024]; - char num[64]; - size_t i, j; - - buf[0] = '\0'; - - for (i = 0; i < nap->auth_flavourlen; i++) { - - for (j = 0; j < sizeof(flavours) / sizeof(flavours[0]); j++) - if (flavours[j].num == nap->auth_flavours[i]) { - xstrlcpy(num, flavours[j].name, sizeof(num)); - break; - } - - if (j == sizeof(flavours) / sizeof(flavours[0])) { - plog(XLOG_ERROR, "Unknown NFSv4 security mechanism %d\n", - nap->auth_flavours[i]); - xsnprintf(num, sizeof(num), "*%d*", nap->auth_flavours[i]); - } - - if (buf[0]) - xstrlcat(buf, ":", sizeof(buf)); - - xstrlcat(buf, num, sizeof(buf)); - } - - plog(XLOG_DEBUG, "NA->auth_flavours \"%s\"\n", buf); -} - -static void -discard_nfs4_args(nfs4_args_t *nap) -{ - if (nap->client_addr.data) - free(nap->client_addr.data); - if (nap->hostname.data) - free(nap->hostname.data); - if (nap->mnt_path.data) - free(nap->mnt_path.data); - if (nap->host_addr) - free(nap->host_addr); - if (nap->auth_flavours) - free(nap->auth_flavours); -} - -/* - * Fill in the many possible fields and flags of struct nfs4_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: 4, 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 - */ -static void -compute_nfs4_args(nfs4_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) -{ - char *s; - struct nfs_common_args a; - uint16_t nfs_port; - - /* initialize just in case */ - memset((voidp) nap, 0, sizeof(nfs4_args_t)); - - /* compute all of the NFS attribute-cache flags */ - memset(&a, 0, sizeof(a)); - compute_nfs_attrcache_flags(&a, mntp); - compute_nfs_common_args(&a, mntp, nfs_proto, nfs_version); - get_nfs_common_args(nap, a); - - get_my_ipv4addr(&nap->client_addr); - - /************************************************************************/ - /*** HOST NAME ***/ - /************************************************************************/ - nap->hostname.len = strlen(host_name); - nap->hostname.data = xmalloc(nap->hostname.len + 1); - memcpy(nap->hostname.data, host_name, nap->hostname.len + 1); - - if ((s = strchr(fs_name, ':')) != NULL) - s++; - else - s = fs_name; - - nap->mnt_path.len = strlen(s); - nap->mnt_path.data = xmalloc(nap->mnt_path.len + 1); - memcpy(nap->mnt_path.data, s, nap->mnt_path.len + 1); - plog(XLOG_DEBUG, "dir name %s\n", nap->mnt_path.data); - - /************************************************************************/ - /*** IP ADDRESS OF REMOTE HOST ***/ - /************************************************************************/ - nap->host_addrlen = sizeof(*ip_addr); - nap->host_addr = xmalloc(nap->host_addrlen); - memcpy(nap->host_addr, ip_addr, nap->host_addrlen); - - nfs_port = hasmntval(mntp, MNTTAB_OPT_PORT); - if (nfs_port == 0) - nfs_port = htons(NFS_PORT); - else - nfs_port = htons(nfs_port); - - ((struct sockaddr_in *)nap->host_addr)->sin_port = nfs_port; - - nap->proto = 0; /* bsdi3 sets this field to zero */ - 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; - } - - nap->version = NFS4_MOUNT_VERSION; /* BSDI 3.0 and OpenBSD 2.2 */ - - /************************************************************************/ - /*** OTHER NFS SOCKET RELATED OPTIONS AND FLAGS ***/ - /************************************************************************/ - - - /************************************************************************/ - /*** OTHER FLAGS AND OPTIONS ***/ - /************************************************************************/ - -#if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX) - if (amu_hasmntopt(mntp, MNTTAB_OPT_POSIX) != NULL) { - nap->args.flags |= MNT2_NFS_OPT_POSIX; -# ifdef HAVE_NFS_ARGS_T_PATHCONF - nap->pathconf = NULL; -# endif /* HAVE_NFS_ARGS_T_PATHCONF */ - } -#endif /* MNT2_NFS_OPT_POSIX && MNTTAB_OPT_POSIX */ - -#if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) - nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS); - if (nap->maxgrouplist != 0) - nap->args.flags |= MNT2_NFS_OPT_MAXGRPS; -#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */ - -#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 */ - - s = set_nfs4_security(nap, mntp); - - /* Add addresses to the mount options */ - add_nfs4_mntopts(nap, mntp, s); - - return; /* end of compute_nfs4_args() function */ -} - -#ifdef DEBUG -static void -print_nfs4_args(const nfs4_args_t *nap, u_long nfs_version) -{ - struct sockaddr_in *sap; - struct nfs_common_args a; - - if (!nap) { - plog(XLOG_DEBUG, "NULL nfs_args!"); - return; - } - - plog(XLOG_DEBUG, "NA->client_addr \"%s\"\n", nap->client_addr.data); - plog(XLOG_DEBUG, "NA->mnt_path = \"%s\"", nap->mnt_path.data); - plog(XLOG_DEBUG, "NA->hostname = \"%s\"", nap->hostname.data); - sap = (struct sockaddr_in *) nap->host_addr; - print_nfs_sockaddr_in("host_addr", sap); - plog(XLOG_DEBUG, "NA->proto = %d", (int) nap->proto); -#ifdef HAVE_NFS_ARGS_T_VERSION - plog(XLOG_DEBUG, "NA->version = %d", nap->version); -#endif /* HAVE_NFS_ARGS_T_VERSION */ - print_nfs4_security(nap); - - put_nfs_common_args(nap, a); - print_nfs_common_args(&a); -} -#endif -#endif /* HAVE_FS_NFS4 */ - -void -compute_nfs_args(void *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) -{ -#ifdef HAVE_FS_NFS4 - if (nfs_version == NFS_VERSION4) - compute_nfs4_args(nap, mntp, genflags, nfsncp, ip_addr, nfs_version, - nfs_proto, fhp, host_name, fs_name); - else -#endif /* HAVE_FS_NFS4 */ - compute_nfs23_args(nap, mntp, genflags, nfsncp, ip_addr, nfs_version, - nfs_proto, fhp, host_name, fs_name); -} - -void -discard_nfs_args(void *nap, u_long nfs_version) -{ -#ifdef HAVE_FS_NFS4 - if (nfs_version == NFS_VERSION4) - discard_nfs4_args(nap); - else -#endif /* HAVE_FS_NFS4 */ - discard_nfs23_args(nap); -} - -#ifdef DEBUG -void -print_nfs_args(const void *nap, u_long nfs_version) -{ -#ifdef HAVE_FS_NFS4 - if (nfs_version == NFS_VERSION4) - print_nfs4_args(nap, nfs_version); - else -#endif /* HAVE_FS_NFS4 */ - print_nfs23_args(nap, nfs_version); -} -#endif - - -/* - * 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) -{ - struct nfs_common_args a; - -#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 */ - memset(&a, 0, sizeof(a)); - a.flags = nap->flags; - compute_nfs_attrcache_flags(&a, mntp); - get_nfs_common_args(nap, a); - - /* - * 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 */ -} - -int -nfs_valid_version(u_long v) -{ - return v >= NFS_VERS_MIN && v <= NFS_VERS_MAX; -} Index: contrib/amd/libamu/mtab.c =================================================================== --- contrib/amd/libamu/mtab.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* - * 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 xstrdup'd string */ - if (!endptr) - return xstrdup(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; -} Index: contrib/amd/libamu/nfs_prot_xdr.c =================================================================== --- contrib/amd/libamu/nfs_prot_xdr.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -bool_t -xdr_amq_string(XDR *xdrs, amq_string *objp) -{ - if (!xdr_string(xdrs, objp, AMQ_STRLEN)) { - return (FALSE); - } - return (TRUE); -} - - -bool_t -xdr_amq_sync_umnt(XDR *xdrs, amq_sync_umnt *objp) -{ - - if (!xdr_opaque(xdrs, (char *) objp, sizeof(*objp))) { - return (FALSE); - } - return (TRUE); -} Index: contrib/amd/libamu/strerror.c =================================================================== --- contrib/amd/libamu/strerror.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2002-2014 Ion Badulescu - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -/* - * 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 */ -} Index: contrib/amd/libamu/strutil.c =================================================================== --- contrib/amd/libamu/strutil.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -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; -} - -static size_t -vstrlen(const char *src, va_list ap) -{ - size_t len = strlen(src); - while ((src = va_arg(ap, const char *)) != NULL) - len += strlen(src); - return len; -} - -static void -vstrcpy(char *dst, const char *src, va_list ap) -{ - strcpy(dst, src); - while ((src = va_arg(ap, const char *)) != NULL) - strcat(dst, src); -} - -char * -strvcat(const char *src, ...) -{ - size_t len; - char *dst; - va_list ap; - - va_start(ap, src); - len = vstrlen(src, ap); - va_end(ap); - dst = xmalloc(len + 1); - va_start(ap, src); - vstrcpy(dst, src, ap); - va_end(ap); - return dst; -} Index: contrib/amd/libamu/wire.c =================================================================== --- contrib/amd/libamu/wire.c +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - - -#ifdef HAVE_IFADDRS_H -#include -#endif /* HAVE_IFADDRS_H */ - -#ifdef HAVE_IRS_H -# include -#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 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 = xstrdup(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 = xstrdup(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 = xstrdup(net), *maskstr; - u_long netnum, masknum = 0; - maskstr = strchr(netstr, '/'); - if (maskstr == NULL) { - plog(XLOG_ERROR, "%s: netstr %s does not have a `/'", __func__, netstr); - XFREE(netstr); - return FALSE; - } - 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 */ Index: contrib/amd/libamu/xdr_func.c =================================================================== --- contrib/amd/libamu/xdr_func.c +++ /dev/null @@ -1,3076 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -#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_cookieverf3(XDR *xdrs, am_cookieverf3 objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_cookieverf3:"); - - if (!xdr_opaque(xdrs, objp, AM_NFS3_COOKIEVERFSIZE)) - return FALSE; - return TRUE; -} - -#if 0 -/* In FreeBSD xdr_uint64() is defined in ../../../include/rpcsvc/nfs_prot.x */ -/* - * Not ideal, xdr_u_int64_t() is not defined in Linux glibc RPC - * but xdr_u_quad_t() is. But in libtirpc xdr_u_quad_t() is not - * defined and xdr_u_int64_t() is. So xdr_u_int64_t() is probably - * an expected standard xdr function so, if it isn't defined use - * an internal xdr_u_int64_t() that uses xdr_u_quad_t(). - */ -#ifndef HAVE_XDR_U_INT64_T -#define xdr_u_int64_t(xdrs, objp) xdr_u_quad_t(xdrs, objp) -#endif /* HAVE_XDR_U_INT64_T */ - -bool_t -xdr_uint64(XDR *xdrs, uint64 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_uint64:"); - - if (!xdr_u_int64_t(xdrs, objp)) - return FALSE; - return TRUE; -} -#endif - -bool_t -xdr_am_cookie3(XDR *xdrs, am_cookie3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_cookie3:"); - - if (!xdr_uint64(xdrs, objp)) - return FALSE; - 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); -} - -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_ftype3(XDR *xdrs, am_ftype3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_ftype3:"); - - if (!xdr_enum(xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_mode3(XDR *xdrs, am_mode3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_mode3:"); - - if (!xdr_u_int(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_uid3(XDR *xdrs, am_uid3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_uid3:"); - - if (!xdr_u_int(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_gid3(XDR *xdrs, am_gid3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_gid3:"); - - if (!xdr_u_int(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_size3(XDR *xdrs, am_size3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_size3:"); - - if (!xdr_uint64(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_fileid3(XDR *xdrs, am_fileid3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_fileid3:"); - - if (!xdr_uint64(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_specdata3(XDR *xdrs, am_specdata3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_specdata3:"); - - if (!xdr_u_int(xdrs, &objp->specdata1)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->specdata2)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_nfstime3(XDR *xdrs, am_nfstime3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_nfstime3:"); - - if (!xdr_u_int(xdrs, &objp->seconds)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->nseconds)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_fattr3(XDR *xdrs, am_fattr3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_fattr3:"); - - if (!xdr_am_ftype3(xdrs, &objp->type)) - return FALSE; - if (!xdr_am_mode3(xdrs, &objp->mode)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->nlink)) - return FALSE; - if (!xdr_am_uid3(xdrs, &objp->uid)) - return FALSE; - if (!xdr_am_gid3(xdrs, &objp->gid)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->size)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->used)) - return FALSE; - if (!xdr_am_specdata3(xdrs, &objp->rdev)) - return FALSE; - if (!xdr_uint64(xdrs, &objp->fsid)) - return FALSE; - if (!xdr_am_fileid3(xdrs, &objp->fileid)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->atime)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->mtime)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->ctime)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_post_op_attr(XDR *xdrs, am_post_op_attr *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_post_op_attr:"); - - if (!xdr_bool(xdrs, &objp->attributes_follow)) - return FALSE; - switch (objp->attributes_follow) { - case TRUE: - if (!xdr_am_fattr3(xdrs, &objp->am_post_op_attr_u.attributes)) - return FALSE; - break; - case FALSE: - break; - default: - return FALSE; - } - return TRUE; -} - -bool_t -xdr_am_stable_how(XDR *xdrs, am_stable_how *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_stable_how:"); - - if (!xdr_enum(xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_offset3(XDR *xdrs, am_offset3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_offset3:"); - - if (!xdr_uint64(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_count3(XDR *xdrs, am_count3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_count3:"); - - if (!xdr_u_int(xdrs, objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_wcc_attr(XDR *xdrs, am_wcc_attr *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_wcc_attr:"); - - if (!xdr_am_size3(xdrs, &objp->size)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->mtime)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->ctime)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_pre_op_attr(XDR *xdrs, am_pre_op_attr *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, ":xdr_am_pre_op_attr"); - - if (!xdr_bool(xdrs, &objp->attributes_follow)) - return FALSE; - switch (objp->attributes_follow) { - case TRUE: - if (!xdr_am_wcc_attr(xdrs, &objp->am_pre_op_attr_u.attributes)) - return FALSE; - break; - case FALSE: - break; - default: - return FALSE; - } - return TRUE; -} - -bool_t -xdr_am_wcc_data(XDR *xdrs, am_wcc_data *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_wcc_data:"); - - if (!xdr_am_pre_op_attr(xdrs, &objp->before)) - return FALSE; - if (!xdr_am_post_op_attr(xdrs, &objp->after)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_WRITE3args(XDR *xdrs, am_WRITE3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_WRITE3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->file)) - return FALSE; - if (!xdr_am_offset3(xdrs, &objp->offset)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->count)) - return FALSE; - if (!xdr_am_stable_how(xdrs, &objp->stable)) - return FALSE; - if (!xdr_bytes(xdrs, (char **)&objp->data.data_val, - (u_int *) &objp->data.data_len, ~0)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_writeverf3(XDR *xdrs, am_writeverf3 objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_writeverf3:"); - - if (!xdr_opaque(xdrs, objp, AM_NFS3_WRITEVERFSIZE)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_WRITE3resok(XDR *xdrs, am_WRITE3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_WRITE3resok:"); - - if (!xdr_am_wcc_data(xdrs, &objp->file_wcc)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->count)) - return FALSE; - if (!xdr_am_stable_how(xdrs, &objp->committed)) - return FALSE; - if (!xdr_am_writeverf3(xdrs, objp->verf)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_WRITE3resfail(XDR *xdrs, am_WRITE3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_WRITE3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->file_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_WRITE3res(XDR *xdrs, am_WRITE3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_WRITE3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_WRITE3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_WRITE3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - 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:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->dir_attributes)) - return (FALSE); - 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); - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return (FALSE); - if (!xdr_am_post_op_attr(xdrs, &objp->dir_attributes)) - return (FALSE); - return (TRUE); -} - -bool_t -xdr_am_COMMIT3args(XDR *xdrs, am_COMMIT3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_COMMIT3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->file)) - return FALSE; - if (!xdr_am_offset3(xdrs, &objp->offset)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->count)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_COMMIT3resok(XDR *xdrs, am_COMMIT3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_COMMIT3resok:"); - - if (!xdr_am_wcc_data(xdrs, &objp->file_wcc)) - return FALSE; - if (!xdr_am_writeverf3(xdrs, objp->verf)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_COMMIT3resfail(XDR *xdrs, am_COMMIT3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_COMMIT3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->file_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_COMMIT3res(XDR *xdrs, am_COMMIT3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_COMMIT3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_COMMIT3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_COMMIT3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_ACCESS3args(XDR *xdrs, am_ACCESS3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_ACCESS3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->object)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->access)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_ACCESS3resok(XDR *xdrs, am_ACCESS3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_ACCESS3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->access)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_ACCESS3resfail(XDR *xdrs, am_ACCESS3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_ACCESS3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_ACCESS3res(XDR *xdrs, am_ACCESS3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_ACCESS3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_ACCESS3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_ACCESS3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_GETATTR3args(XDR *xdrs, am_GETATTR3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_GETATTR3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->object)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_GETATTR3resok(XDR *xdrs, am_GETATTR3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_GETATTR3resok:"); - - if (!xdr_am_fattr3(xdrs, &objp->obj_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_GETATTR3res(XDR *xdrs, am_GETATTR3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_GETATTR3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_GETATTR3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_time_how(XDR *xdrs, am_time_how *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_time_how:"); - - if (!xdr_enum(xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_set_mode3(XDR *xdrs, am_set_mode3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_set_mode3:"); - - if (!xdr_bool(xdrs, &objp->set_it)) - return FALSE; - switch (objp->set_it) { - case TRUE: - if (!xdr_am_mode3(xdrs, &objp->am_set_mode3_u.mode)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_set_uid3(XDR *xdrs, am_set_uid3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_set_uid3:"); - - if (!xdr_bool(xdrs, &objp->set_it)) - return FALSE; - switch (objp->set_it) { - case TRUE: - if (!xdr_am_uid3(xdrs, &objp->am_set_uid3_u.uid)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_set_gid3(XDR *xdrs, am_set_gid3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_set_gid3:"); - - if (!xdr_bool(xdrs, &objp->set_it)) - return FALSE; - switch (objp->set_it) { - case TRUE: - if (!xdr_am_gid3(xdrs, &objp->am_set_gid3_u.gid)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_set_size3(XDR *xdrs, am_set_size3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_set_size3:"); - - if (!xdr_bool(xdrs, &objp->set_it)) - return FALSE; - switch (objp->set_it) { - case TRUE: - if (!xdr_am_size3(xdrs, &objp->am_set_size3_u.size)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_set_atime(XDR *xdrs, am_set_atime *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_set_atime:"); - - if (!xdr_am_time_how(xdrs, &objp->set_it)) - return FALSE; - switch (objp->set_it) { - case AM_SET_TO_CLIENT_TIME: - if (!xdr_am_nfstime3(xdrs, &objp->am_set_atime_u.atime)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_set_mtime(XDR *xdrs, am_set_mtime *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_set_mtime:"); - - if (!xdr_am_time_how(xdrs, &objp->set_it)) - return FALSE; - switch (objp->set_it) { - case AM_SET_TO_CLIENT_TIME: - if (!xdr_am_nfstime3(xdrs, &objp->am_set_mtime_u.mtime)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_sattr3(XDR *xdrs, am_sattr3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_sattr3:"); - - if (!xdr_am_set_mode3(xdrs, &objp->mode)) - return FALSE; - if (!xdr_am_set_uid3(xdrs, &objp->uid)) - return FALSE; - if (!xdr_am_set_gid3(xdrs, &objp->gid)) - return FALSE; - if (!xdr_am_set_size3(xdrs, &objp->size)) - return FALSE; - if (!xdr_am_set_atime(xdrs, &objp->atime)) - return FALSE; - if (!xdr_am_set_mtime(xdrs, &objp->mtime)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_createmode3(XDR *xdrs, am_createmode3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_createmode3:"); - - if (!xdr_enum(xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_createverf3(XDR *xdrs, am_createverf3 objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_createverf3:"); - - if (!xdr_opaque(xdrs, objp, AM_NFS3_CREATEVERFSIZE)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_createhow3(XDR *xdrs, am_createhow3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_createhow3:"); - - if (!xdr_am_createmode3(xdrs, &objp->mode)) - return FALSE; - switch (objp->mode) { - case AM_UNCHECKED: - if (!xdr_am_sattr3(xdrs, &objp->am_createhow3_u.obj_attributes)) - return FALSE; - break; - case AM_GUARDED: - if (!xdr_am_sattr3(xdrs, &objp->am_createhow3_u.g_obj_attributes)) - return FALSE; - break; - case AM_EXCLUSIVE: - if (!xdr_am_createverf3(xdrs, objp->am_createhow3_u.verf)) - return FALSE; - break; - default: - return FALSE; - } - return TRUE; -} - -bool_t -xdr_am_CREATE3args(XDR *xdrs, am_CREATE3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_CREATE3args:"); - - if (!xdr_am_diropargs3(xdrs, &objp->where)) - return FALSE; - if (!xdr_am_createhow3(xdrs, &objp->how)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_post_op_fh3(XDR *xdrs, am_post_op_fh3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_post_op_fh3:"); - - if (!xdr_bool(xdrs, &objp->handle_follows)) - return FALSE; - switch (objp->handle_follows) { - case TRUE: - if (!xdr_am_nfs_fh3(xdrs, &objp->am_post_op_fh3_u.handle)) - return FALSE; - break; - case FALSE: - break; - default: - return FALSE; - } - return TRUE; -} - -bool_t -xdr_am_CREATE3resok(XDR *xdrs, am_CREATE3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_CREATE3resok:"); - - if (!xdr_am_post_op_fh3(xdrs, &objp->obj)) - return FALSE; - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_CREATE3resfail(XDR *xdrs, am_CREATE3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_CREATE3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_CREATE3res(XDR *xdrs, am_CREATE3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_CREATE3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_CREATE3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_CREATE3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_REMOVE3args(XDR *xdrs, am_REMOVE3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_REMOVE3args:"); - - if (!xdr_am_diropargs3(xdrs, &objp->object)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_REMOVE3resok(XDR *xdrs, am_REMOVE3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_REMOVE3resok:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_REMOVE3resfail(XDR *xdrs, am_REMOVE3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_REMOVE3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_REMOVE3res(XDR *xdrs, am_REMOVE3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_REMOVE3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_REMOVE3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_REMOVE3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_READ3args(XDR *xdrs, am_READ3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READ3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->file)) - return FALSE; - if (!xdr_am_offset3(xdrs, &objp->offset)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->count)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READ3resok(XDR *xdrs, am_READ3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READ3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->file_attributes)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->count)) - return FALSE; - if (!xdr_bool(xdrs, &objp->eof)) - return FALSE; - if (!xdr_bytes(xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, ~0)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READ3resfail(XDR *xdrs, am_READ3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READ3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->file_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READ3res(XDR *xdrs, am_READ3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READ3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_READ3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_READ3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_FSINFO3args(XDR *xdrs, am_FSINFO3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSINFO3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->fsroot)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_FSINFO3resok(XDR *xdrs, am_FSINFO3resok *objp) -{ - register int32_t *buf; - - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSINFO3resok:"); - - if (xdrs->x_op == XDR_ENCODE) { - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - buf = XDR_INLINE(xdrs, 7 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_int(xdrs, &objp->rtmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->rtpref)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->rtmult)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtpref)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtmult)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->dtpref)) - return FALSE; - } else { - IXDR_PUT_U_LONG(buf, objp->rtmax); - IXDR_PUT_U_LONG(buf, objp->rtpref); - IXDR_PUT_U_LONG(buf, objp->rtmult); - IXDR_PUT_U_LONG(buf, objp->wtmax); - IXDR_PUT_U_LONG(buf, objp->wtpref); - IXDR_PUT_U_LONG(buf, objp->wtmult); - IXDR_PUT_U_LONG(buf, objp->dtpref); - } - if (!xdr_am_size3(xdrs, &objp->maxfilesize)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->time_delta)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->properties)) - return FALSE; - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - buf = XDR_INLINE(xdrs, 7 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_int (xdrs, &objp->rtmax)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->rtpref)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->rtmult)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->wtmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtpref)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtmult)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->dtpref)) - return FALSE; - } else { - objp->rtmax = IXDR_GET_U_LONG(buf); - objp->rtpref = IXDR_GET_U_LONG(buf); - objp->rtmult = IXDR_GET_U_LONG(buf); - objp->wtmax = IXDR_GET_U_LONG(buf); - objp->wtpref = IXDR_GET_U_LONG(buf); - objp->wtmult = IXDR_GET_U_LONG(buf); - objp->dtpref = IXDR_GET_U_LONG(buf); - } - if (!xdr_am_size3(xdrs, &objp->maxfilesize)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->time_delta)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->properties)) - return FALSE; - return TRUE; - } - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->rtmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->rtpref)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->rtmult)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtpref)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->wtmult)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->dtpref)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->maxfilesize)) - return FALSE; - if (!xdr_am_nfstime3(xdrs, &objp->time_delta)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->properties)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_FSINFO3resfail(XDR *xdrs, am_FSINFO3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSINFO3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_FSINFO3res(XDR *xdrs, am_FSINFO3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSINFO3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_FSINFO3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_FSINFO3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_FSSTAT3args(XDR *xdrs, am_FSSTAT3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSSTAT3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->fsroot)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_FSSTAT3resok(XDR *xdrs, am_FSSTAT3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSSTAT3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->tbytes)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->fbytes)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->abytes)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->tfiles)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->ffiles)) - return FALSE; - if (!xdr_am_size3(xdrs, &objp->afiles)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->invarsec)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_FSSTAT3resfail(XDR *xdrs, am_FSSTAT3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSSTAT3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_FSSTAT3res(XDR *xdrs, am_FSSTAT3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_FSSTAT3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_FSSTAT3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_FSSTAT3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_PATHCONF3args(XDR *xdrs, am_PATHCONF3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_PATHCONF3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->object)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_PATHCONF3resok(XDR *xdrs, am_PATHCONF3resok *objp) -{ - register int32_t *buf; - - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_PATHCONF3resok:"); - - if (xdrs->x_op == XDR_ENCODE) { - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - buf = XDR_INLINE(xdrs, 6 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_int(xdrs, &objp->linkmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->name_max)) - return FALSE; - if (!xdr_bool(xdrs, &objp->no_trunc)) - return FALSE; - if (!xdr_bool(xdrs, &objp->chown_restricted)) - return FALSE; - if (!xdr_bool(xdrs, &objp->case_insensitive)) - return FALSE; - if (!xdr_bool(xdrs, &objp->case_preserving)) - return FALSE; - } else { - IXDR_PUT_U_LONG(buf, objp->linkmax); - IXDR_PUT_U_LONG(buf, objp->name_max); - IXDR_PUT_BOOL(buf, objp->no_trunc); - IXDR_PUT_BOOL(buf, objp->chown_restricted); - IXDR_PUT_BOOL(buf, objp->case_insensitive); - IXDR_PUT_BOOL(buf, objp->case_preserving); - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - buf = XDR_INLINE(xdrs, 6 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_int(xdrs, &objp->linkmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->name_max)) - return FALSE; - if (!xdr_bool(xdrs, &objp->no_trunc)) - return FALSE; - if (!xdr_bool(xdrs, &objp->chown_restricted)) - return FALSE; - if (!xdr_bool(xdrs, &objp->case_insensitive)) - return FALSE; - if (!xdr_bool(xdrs, &objp->case_preserving)) - return FALSE; - } else { - objp->linkmax = IXDR_GET_U_LONG(buf); - objp->name_max = IXDR_GET_U_LONG(buf); - objp->no_trunc = IXDR_GET_BOOL(buf); - objp->chown_restricted = IXDR_GET_BOOL(buf); - objp->case_insensitive = IXDR_GET_BOOL(buf); - objp->case_preserving = IXDR_GET_BOOL(buf); - } - return TRUE; - } - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->linkmax)) - return FALSE; - if (!xdr_u_int(xdrs, &objp->name_max)) - return FALSE; - if (!xdr_bool(xdrs, &objp->no_trunc)) - return FALSE; - if (!xdr_bool(xdrs, &objp->chown_restricted)) - return FALSE; - if (!xdr_bool(xdrs, &objp->case_insensitive)) - return FALSE; - if (!xdr_bool(xdrs, &objp->case_preserving)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_PATHCONF3resfail(XDR *xdrs, am_PATHCONF3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_PATHCONF3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_PATHCONF3res(XDR *xdrs, am_PATHCONF3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_PATHCONF3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_PATHCONF3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_PATHCONF3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_nfspath3(XDR *xdrs, am_nfspath3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_nfspath3:"); - - if (!xdr_string(xdrs, objp, ~0)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_symlinkdata3(XDR *xdrs, am_symlinkdata3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_symlinkdata3:"); - - if (!xdr_am_sattr3(xdrs, &objp->symlink_attributes)) - return FALSE; - if (!xdr_am_nfspath3(xdrs, &objp->symlink_data)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SYMLINK3args(XDR *xdrs, am_SYMLINK3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SYMLINK3args:"); - - if (!xdr_am_diropargs3(xdrs, &objp->where)) - return FALSE; - if (!xdr_am_symlinkdata3(xdrs, &objp->symlink)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SYMLINK3resok(XDR *xdrs, am_SYMLINK3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SYMLINK3resok:"); - - if (!xdr_am_post_op_fh3(xdrs, &objp->obj)) - return FALSE; - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SYMLINK3resfail(XDR *xdrs, am_SYMLINK3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SYMLINK3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SYMLINK3res(XDR *xdrs, am_SYMLINK3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SYMLINK3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_SYMLINK3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_SYMLINK3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_READLINK3args(XDR *xdrs, am_READLINK3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READLINK3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->symlink)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READLINK3resok(XDR *xdrs, am_READLINK3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READLINK3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->symlink_attributes)) - return FALSE; - if (!xdr_am_nfspath3(xdrs, &objp->data)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READLINK3resfail(XDR *xdrs, am_READLINK3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READLINK3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->symlink_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READLINK3res(XDR *xdrs, am_READLINK3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READLINK3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_READLINK3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_READLINK3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_devicedata3(XDR *xdrs, am_devicedata3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_devicedata3:"); - - if (!xdr_am_sattr3(xdrs, &objp->dev_attributes)) - return FALSE; - if (!xdr_am_specdata3(xdrs, &objp->spec)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_mknoddata3(XDR *xdrs, am_mknoddata3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_mknoddata3:"); - - if (!xdr_am_ftype3(xdrs, &objp->type)) - return FALSE; - switch (objp->type) { - case AM_NF3CHR: - if (!xdr_am_devicedata3(xdrs, &objp->am_mknoddata3_u.chr_device)) - return FALSE; - break; - case AM_NF3BLK: - if (!xdr_am_devicedata3(xdrs, &objp->am_mknoddata3_u.blk_device)) - return FALSE; - break; - case AM_NF3SOCK: - if (!xdr_am_sattr3(xdrs, &objp->am_mknoddata3_u.sock_attributes)) - return FALSE; - break; - case AM_NF3FIFO: - if (!xdr_am_sattr3(xdrs, &objp->am_mknoddata3_u.pipe_attributes)) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -bool_t -xdr_am_MKNOD3args(XDR *xdrs, am_MKNOD3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_MKNOD3args:"); - - if (!xdr_am_diropargs3(xdrs, &objp->where)) - return FALSE; - if (!xdr_am_mknoddata3(xdrs, &objp->what)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_MKNOD3resok(XDR *xdrs, am_MKNOD3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_MKNOD3resok:"); - - if (!xdr_am_post_op_fh3(xdrs, &objp->obj)) - return FALSE; - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_MKNOD3resfail(XDR *xdrs, am_MKNOD3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_MKNOD3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_MKNOD3res(XDR *xdrs, am_MKNOD3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, ":"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_MKNOD3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_MKNOD3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_MKDIR3args(XDR *xdrs, am_MKDIR3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, ":"); - - if (!xdr_am_diropargs3(xdrs, &objp->where)) - return FALSE; - if (!xdr_am_sattr3(xdrs, &objp->attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_MKDIR3resok(XDR *xdrs, am_MKDIR3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_MKDIR3resok:"); - - if (!xdr_am_post_op_fh3(xdrs, &objp->obj)) - return FALSE; - if (!xdr_am_post_op_attr(xdrs, &objp->obj_attributes)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_MKDIR3resfail(XDR *xdrs, am_MKDIR3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_MKDIR3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_MKDIR3res(XDR *xdrs, am_MKDIR3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_MKDIR3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_MKDIR3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_MKDIR3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_RMDIR3args(XDR *xdrs, am_RMDIR3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RMDIR3args:"); - - if (!xdr_am_diropargs3(xdrs, &objp->object)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_RMDIR3resok(XDR *xdrs, am_RMDIR3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RMDIR3resok:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_RMDIR3resfail(XDR *xdrs, am_RMDIR3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RMDIR3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->dir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_RMDIR3res(XDR *xdrs, am_RMDIR3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RMDIR3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_RMDIR3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_RMDIR3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_RENAME3args(XDR *xdrs, am_RENAME3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RENAME3args:"); - - if (!xdr_am_diropargs3(xdrs, &objp->from)) - return FALSE; - if (!xdr_am_diropargs3(xdrs, &objp->to)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_RENAME3resok(XDR *xdrs, am_RENAME3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RENAME3resok:"); - - if (!xdr_am_wcc_data(xdrs, &objp->fromdir_wcc)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->todir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_RENAME3resfail(XDR *xdrs, am_RENAME3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RENAME3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->fromdir_wcc)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->todir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_RENAME3res(XDR *xdrs, am_RENAME3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_RENAME3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_RENAME3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_RENAME3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_READDIRPLUS3args(XDR *xdrs, am_READDIRPLUS3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIRPLUS3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->dir)) - return FALSE; - if (!xdr_am_cookie3(xdrs, &objp->cookie)) - return FALSE; - if (!xdr_am_cookieverf3(xdrs, objp->cookieverf)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->dircount)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->maxcount)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_entryplus3(XDR *xdrs, am_entryplus3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_entryplus3:"); - - if (!xdr_am_fileid3(xdrs, &objp->fileid)) - return FALSE; - if (!xdr_am_filename3(xdrs, &objp->name)) - return FALSE; - if (!xdr_am_cookie3(xdrs, &objp->cookie)) - return FALSE; - if (!xdr_am_post_op_attr(xdrs, &objp->name_attributes)) - return FALSE; - if (!xdr_am_post_op_fh3(xdrs, &objp->name_handle)) - return FALSE; - if (!xdr_pointer(xdrs, (char **)&objp->nextentry, - sizeof(am_entryplus3), (xdrproc_t) xdr_am_entryplus3)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_dirlistplus3(XDR *xdrs, am_dirlistplus3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_dirlistplus3:"); - - if (!xdr_pointer(xdrs, (char **)&objp->entries, - sizeof(am_entryplus3), (xdrproc_t) xdr_am_entryplus3)) - return FALSE; - if (!xdr_bool(xdrs, &objp->eof)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READDIRPLUS3resok(XDR *xdrs, am_READDIRPLUS3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIRPLUS3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->dir_attributes)) - return FALSE; - if (!xdr_am_cookieverf3(xdrs, objp->cookieverf)) - return FALSE; - if (!xdr_am_dirlistplus3(xdrs, &objp->reply)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READDIRPLUS3resfail(XDR *xdrs, am_READDIRPLUS3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIRPLUS3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->dir_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READDIRPLUS3res(XDR *xdrs, am_READDIRPLUS3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIRPLUS3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_READDIRPLUS3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_READDIRPLUS3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_READDIR3args(XDR *xdrs, am_READDIR3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIR3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->dir)) - return FALSE; - if (!xdr_am_cookie3(xdrs, &objp->cookie)) - return FALSE; - if (!xdr_am_cookieverf3(xdrs, objp->cookieverf)) - return FALSE; - if (!xdr_am_count3(xdrs, &objp->count)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_entry3(XDR *xdrs, am_entry3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_entry3:"); - - if (!xdr_am_fileid3(xdrs, &objp->fileid)) - return FALSE; - if (!xdr_am_filename3(xdrs, &objp->name)) - return FALSE; - if (!xdr_am_cookie3(xdrs, &objp->cookie)) - return FALSE; - if (!xdr_pointer(xdrs, (char **)&objp->nextentry, - sizeof(am_entry3), (xdrproc_t) xdr_am_entry3)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_dirlist3(XDR *xdrs, am_dirlist3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_dirlist3:"); - - if (!xdr_pointer(xdrs, (char **)&objp->entries, - sizeof(am_entry3), (xdrproc_t) xdr_am_entry3)) - return FALSE; - if (!xdr_bool (xdrs, &objp->eof)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READDIR3resok(XDR *xdrs, am_READDIR3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIR3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->dir_attributes)) - return FALSE; - if (!xdr_am_cookieverf3(xdrs, objp->cookieverf)) - return FALSE; - if (!xdr_am_dirlist3(xdrs, &objp->reply)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READDIR3resfail(XDR *xdrs, am_READDIR3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIR3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->dir_attributes)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_READDIR3res(XDR *xdrs, am_READDIR3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_READDIR3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_READDIR3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_READDIR3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_LINK3args(XDR *xdrs, am_LINK3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_LINK3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->file)) - return FALSE; - if (!xdr_am_diropargs3(xdrs, &objp->link)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_LINK3resok(XDR *xdrs, am_LINK3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_LINK3resok:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->file_attributes)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->linkdir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_LINK3resfail(XDR *xdrs, am_LINK3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_LINK3resfail:"); - - if (!xdr_am_post_op_attr(xdrs, &objp->file_attributes)) - return FALSE; - if (!xdr_am_wcc_data(xdrs, &objp->linkdir_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_LINK3res(XDR *xdrs, am_LINK3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_LINK3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_LINK3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_LINK3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_am_sattrguard3(XDR *xdrs, am_sattrguard3 *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_sattrguard3:"); - - if (!xdr_bool(xdrs, &objp->check)) - return FALSE; - switch (objp->check) { - case TRUE: - if (!xdr_am_nfstime3(xdrs, &objp->am_sattrguard3_u.obj_ctime)) - return FALSE; - break; - case FALSE: - break; - default: - return FALSE; - } - return TRUE; -} - -bool_t -xdr_am_SETATTR3args(XDR *xdrs, am_SETATTR3args *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SETATTR3args:"); - - if (!xdr_am_nfs_fh3(xdrs, &objp->object)) - return FALSE; - if (!xdr_am_sattr3(xdrs, &objp->new_attributes)) - return FALSE; - if (!xdr_am_sattrguard3(xdrs, &objp->guard)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SETATTR3resok(XDR *xdrs, am_SETATTR3resok *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SETATTR3resok:"); - - if (!xdr_am_wcc_data(xdrs, &objp->obj_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SETATTR3resfail(XDR *xdrs, am_SETATTR3resfail *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SETATTR3resfail:"); - - if (!xdr_am_wcc_data(xdrs, &objp->obj_wcc)) - return FALSE; - return TRUE; -} - -bool_t -xdr_am_SETATTR3res(XDR *xdrs, am_SETATTR3res *objp) -{ - if (amuDebug(D_XDRTRACE)) - plog(XLOG_DEBUG, "xdr_am_SETATTR3res:"); - - if (!xdr_am_nfsstat3(xdrs, &objp->status)) - return FALSE; - switch (objp->status) { - case AM_NFS3_OK: - if (!xdr_am_SETATTR3resok(xdrs, &objp->res_u.ok)) - return FALSE; - break; - default: - if (!xdr_am_SETATTR3resfail(xdrs, &objp->res_u.fail)) - return FALSE; - break; - } - return TRUE; -} -#endif /* HAVE_FS_NFS3 */ Index: contrib/amd/libamu/xutil.c =================================================================== --- contrib/amd/libamu/xutil.c +++ /dev/null @@ -1,1167 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include -#include - -/* - * 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 */ -u_int debug_flags = D_CONTROL; /* set regardless if compiled with debugging */ - -#ifdef HAVE_SYSLOG -int syslogging; -#endif /* HAVE_SYSLOG */ -static u_int xlog_level = XLOG_DEFAULT; -static u_long 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 */ - {"defaults", D_DEFAULT}, /* Default options */ - {"test", D_TEST}, /* Full debug - no daemon, no fork, no amq, local mtab */ - {"amq", D_AMQ}, /* Register for AMQ program */ - {"daemon", D_DAEMON}, /* Enter daemon mode */ - {"fork", D_FORK}, /* Fork server (hlfsd only) */ - {"full", D_FULL}, /* Program trace */ -#ifdef HAVE_CLOCK_GETTIME - {"hrtime", D_HRTIME}, /* Print high resolution time stamps */ -#endif /* HAVE_CLOCK_GETTIME */ - {"info", D_INFO}, /* info service specific debugging (hesiod, nis, etc) */ - {"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 */ - {"trace", D_TRACE}, /* Protocol trace */ - {"xdrtrace", D_XDRTRACE}, /* Trace xdr routines */ - {NULL, 0} -}; -#endif /* DEBUG */ - -/* - * List of log options - */ -struct opt_tab xlog_opt[] = -{ - {"all", XLOG_ALL}, /* All messages */ - {"defaults", XLOG_DEFAULT}, /* Default 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 */ - {NULL, 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, sizeof(am_hostname)); -} - - -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; - size_t len = 0, l; - - *e = '\0'; - for (p = f, q = e; len < maxlen && (*q = *p); len++, q++, p++) { - if (p[0] == '%' && p[1] == 'm') { - if (len >= maxlen) - break; - xstrlcpy(q, strerror(error), maxlen - len); - l = strlen(q); - if (l != 0) - l--; - len += l; - q += l; - 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 = NULL; - 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) -{ - u_int dl = debug_flags; - static int initialized_debug_flags = 0; - int rc = cmdoption(opt, dbg_opt, &dl); - - if (rc) /* if got any error, don't update debug flags */ - return EINVAL; - - /* - * If we already initialized the debugging flags once (via amd.conf), then - * don't allow "immutable" flags to be changed again (via amq -D), because - * they could mess Amd's state and only make sense to be set once when Amd - * starts. - */ - if (initialized_debug_flags && - debug_flags != 0 && - (dl & D_IMMUTABLE) != (debug_flags & D_IMMUTABLE)) { - plog(XLOG_ERROR, "cannot change immutable debug flags"); - /* undo any attempted change to an immutable flag */ - dl = (dl & ~D_IMMUTABLE) | (debug_flags & D_IMMUTABLE); - } - initialized_debug_flags = 1; - debug_flags = dl; - - return rc; -} - - -void -dplog(const char *fmt, ...) -{ -#ifdef HAVE_SIGACTION - sigset_t old, chld; -#else /* not HAVE_SIGACTION */ - int mask; -#endif /* not HAVE_SIGACTION */ - va_list ap; - -#ifdef HAVE_SIGACTION - sigemptyset(&chld); - sigaddset(&chld, SIGCHLD); -#else /* not HAVE_SIGACTION */ - mask = sigblock(sigmask(SIGCHLD)); -#endif /* not HAVE_SIGACTION */ - - sigprocmask(SIG_BLOCK, &chld, &old); - if (!logfp) - logfp = stderr; /* initialize before possible first use */ - - va_start(ap, fmt); - real_plog(XLOG_DEBUG, fmt, ap); - va_end(ap); - -#ifdef HAVE_SIGACTION - sigprocmask(SIG_SETMASK, &old, NULL); -#else /* not HAVE_SIGACTION */ - mask = sigblock(sigmask(SIGCHLD)); -#endif /* not HAVE_SIGACTION */ -} -#endif /* DEBUG */ - - -void -plog(int lvl, const char *fmt, ...) -{ -#ifdef HAVE_SIGACTION - sigset_t old, chld; -#else /* not HAVE_SIGACTION */ - int mask; -#endif /* not HAVE_SIGACTION */ - va_list ap; - -#ifdef HAVE_SIGACTION - sigemptyset(&chld); - sigaddset(&chld, SIGCHLD); - sigprocmask(SIG_BLOCK, &chld, &old); -#else /* not HAVE_SIGACTION */ - mask = sigblock(sigmask(SIGCHLD)); -#endif /* not HAVE_SIGACTION */ - - if (!logfp) - logfp = stderr; /* initialize before possible first use */ - - va_start(ap, fmt); - real_plog(lvl, fmt, ap); - va_end(ap); - -#ifdef HAVE_SIGACTION - sigprocmask(SIG_SETMASK, &old, NULL); -#else /* not HAVE_SIGACTION */ - sigsetmask(mask); -#endif /* not HAVE_SIGACTION */ -} - - -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 */ - 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, sizeof(last_msg)) >= sizeof(last_msg)) /* 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 */ - __IGNORE(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, sizeof(last_msg)) >= sizeof(last_msg)) /* 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 */ - __IGNORE(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); - __IGNORE(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); - __IGNORE(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 */ - __IGNORE(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, u_int *flags) -{ - char *p = s; - int errs = 0; - - while (p && *p) { - int neg; - char *opt; - struct opt_tab *dp, *dpn = NULL; - - 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_ERROR, "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) -{ - u_int xl = xlog_level; - int rc = cmdoption(opt, xlog_opt, &xl); - - if (rc) /* if got any error, don't update flags */ - return EINVAL; - - /* - * Don't allow "mandatory" flags to be turned off, because - * we must always be able to report on flag re/setting errors. - */ - if ((xl & XLOG_MANDATORY) != XLOG_MANDATORY) { - plog(XLOG_ERROR, "cannot turn off mandatory logging options"); - xl |= XLOG_MANDATORY; - } - if (xlog_level != xl) - xlog_level = xl; /* set new flags */ - 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) - __IGNORE(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 */ -u_long -get_amd_program_number(void) -{ - return amd_program_number; -} - - -/* set the rpc program number used for amd */ -void -set_amd_program_number(u_long 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; -#else - plog(XLOG_ERROR, "unable to release controlling tty"); -#endif /* not TIOCNOTTY */ -} - - -/* 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 = xstrdup(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 = xstrdup(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); -} - -/* - * Dup a string - */ -char * -xstrdup(const char *s) -{ - size_t len = strlen(s); - char *sp = xmalloc(len + 1); - memcpy(sp, s, len + 1); - return sp; -} Index: contrib/amd/mk-amd-map/mk-amd-map.8 =================================================================== --- contrib/amd/mk-amd-map/mk-amd-map.8 +++ /dev/null @@ -1,90 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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. -.\" -.\" $FreeBSD$ -.\" -.\" File: am-utils/mk-amd-map/mk-amd-map.8 -.\" -.Dd January 2, 2006 -.Dt MK-AMD-MAP 8 -.Os -.Sh NAME -.Nm mk-amd-map -.Nd create database maps for -.Xr amd 8 -.Sh SYNOPSIS -.Nm -.Op Fl p -.Ar mapname -.Sh DESCRIPTION -The -.Nm -utility -creates the database maps used by the keyed map lookups in -.Xr amd 8 . -It reads input from the named file -and outputs them to a correspondingly named -hashed database. -.Pp -The -.Fl p -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 -.Xr amd.conf 5 , -.Xr amd 8 -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh AUTHORS -.An Jan-Simon Pendry Aq jsp@doc.ic.ac.uk , -Department of Computing, Imperial College, London, UK. -.Pp -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook University, New York, USA -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/mk-amd-map/mk-amd-map.c =================================================================== --- contrib/amd/mk-amd-map/mk-amd-map.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include - -/* (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((unsigned char)ch) && isspace((unsigned char)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((unsigned char)*kp) && isspace((unsigned char)*kp); kp++) ; - - /* - * Ignore blank lines - */ - if (!*kp) - goto again; - - /* - * Find end of key - */ - for (cp = kp; *cp && (!isascii((unsigned char)*cp) || !isspace((unsigned char)*cp)); cp++) ; - - /* - * Check whether key matches, or whether - * the entry is a wildcard entry. - */ - if (*cp) - *cp++ = '\0'; - while (*cp && isascii((unsigned char)*cp) && isspace((unsigned char)*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 */ Index: contrib/amd/scripts/Makefile.am =================================================================== --- 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) Index: contrib/amd/scripts/Makefile.in =================================================================== --- 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: Index: contrib/amd/scripts/am-eject.in =================================================================== --- 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 - -# 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 Index: contrib/amd/scripts/amd.conf-sample =================================================================== --- contrib/amd/scripts/amd.conf-sample +++ /dev/null @@ -1,166 +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,defaults,test,amq,daemon,fork,\ - full,hrtime,info,mem,mtab,str,readdir,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 9 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 -# does this map use Sun Automounter map syntax? -sun_map_syntax = 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 - -############################################################################## Index: contrib/amd/scripts/amd.conf.5 =================================================================== --- contrib/amd/scripts/amd.conf.5 +++ /dev/null @@ -1,1118 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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/scripts/amd.conf.5 -.\" $FreeBSD$ -.\" -.Dd February 26, 2016 -.Dt AMD.CONF 5 -.Os -.Sh NAME -.Nm amd.conf -.Nd -.Xr amd 8 -configuration file -.Sh SYNOPSIS -.Nm -.Sh DESCRIPTION -.Bf -symbolic -This configuration file is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -file is the configuration file for -.Xr amd 8 , -as part of the am-utils suite. -.Pp -The -.Nm -file -contains runtime configuration information for the -.Xr amd 8 -automounter program. -.Sh FILE FORMAT -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 of the file is reached. -Sections contain parameters of the -form -.Dq Ar name No = Ar value . -.Pp -The file is line-based \[em] that is, each newline-terminated line represents -either a comment, a section name or a parameter. -No line-continuation -syntax is available. -.Pp -Section, parameter names and their values are case sensitive. -.Pp -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 -.Dq Ar name No = Qq Li "some\ value" . -.Pp -Any line beginning with a pound sign (#) is ignored, as are lines containing -only whitespace. -.Pp -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 -.Dq Li 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 -.Nm 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. -.Pp -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 -.Bq Pa /homes -is defined, then all parameters following it will be applied to the -.Pa /homes -.Nm amd Ns --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. -.Bl -tag -width 4n -.It Va browsable_dirs Pq string, default=no -If -.Dq Li yes , -then -.Nm amd Ns 's -top-level mount points will be browsable to -.Xr readdir 3 -calls. -This means you could run for example -.Xr ls 1 -and see what keys are available to mount in that directory. -Not all entries -are made visible to -.Xr readdir 3 : -the -.Dq Li /default -entry, wildcard entries, and those with a -.Ql / -in them are not included. -If you specify -.Dq Li full -to this option, all but -.Dq Li /default -will be visible. -Note that if you run a command which will attempt to -.Xr stat 2 -the entries, such as often done by -.Dq Li "ls -l" -or -.Dq Li "ls -F" , -.Xr amd 8 -will attempt to mount -.Em every -entry in that map. -This is often called a -.Dq "mount storm" . -.It Va map_defaults Pq string, default no 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. -.It Va map_options Pq string, default no options -This option is the same as specifying map options on the command line to -.Xr amd 8 , -such as -.Dq Li "cache:=all" . -.It Va map_type Pq string, default search all map types -If specified, -.Xr amd 8 -will initialize the map only for the type given. -This is -useful to avoid the default map search type used by -.Xr amd 8 -which takes longer -and can have undesired side-effects such as initializing -.Tn NIS -even if not -used. -Possible values are: -.Pp -.Bl -tag -width ".Cm nisplus" -compact -.It Cm exec -executable maps -.It Cm file -plain files -.It Cm hesiod -Hesiod name service from MIT -.It Cm ldap -Lightweight Directory Access Protocol -.It Cm ndbm -(New) dbm style hash files -.It Cm nis -Network Information Services (version 2) -.It Cm nisplus -Network Information Services Plus (version 3) -.It Cm passwd -local password files -.It Cm union -union maps -.El -.It Va mount_type Pq string, default=nfs -All -.Xr amd 8 -mount types default to -.Tn NFS . -That is, -.Xr amd 8 -is an -.Tn NFS -server on the -map mount points, for the local host it is running on. -If -.Dq Li autofs -is specified, -.Xr amd 8 -will be an autofs server for those mount points. -.It Va autofs_use_lofs Pq string, default=yes -When set to -.Dq Li yes -and using Autofs, -.Xr amd 8 -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 -.Dq Li no , -then -.Xr amd 8 -will use symlinks instead: that code is more -tested, but negates autofs's big advantage of in-place mounts. -.It Va search_path Pq 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 -query -distributed maps in several locations as needed. -.It Va selectors_in_defaults Pq boolean, default=no -If -.Dq Li 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: -.Bd -literal -/defaults \\ - wire==slip-net;opts:=intr,rsize=1024,wsize=1024 \\ - wire!=slip-net;opts:=intr,rsize=8192,wsize=8192 -.Ed -Deprecated form: selectors_on_default -.TP -.BR sun_map_syntax " (boolean, default=no)" -If "yes," then Amd will parse the map according to the Sun Automount syntax. - -.\" ************************************************************************** -.El -.Ss "Parameters applicable to the global section only" - -.Bl -tag -width 4n -.It Va arch Pq string, default to compiled in value -Same as the -.Fl A -option to -.Xr amd 8 . -Allows you to override the value of the -.Va arch -.Xr amd 8 -variable. -.It Va auto_attrcache Pq 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 -.Nm amd Ns 's -own automount -points. -A value of 0 is supposed to turn off attribute caching, meaning -that -.Xr amd 8 -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, -.Nm amd -may not work reliably under heavy load. -See -the -.Pa README.attrcache -document in the Am-utils distribution for more details. -.It Va auto_dir Pq string, default= Ns Pa /a -Same as the -.Fl a -option to -.Xr amd 8 . -This sets the private directory where -.Nm amd -will create -sub-directories for its real mount points. -.It Va cache_duration Pq numeric, default=300 -Same as the -.Fl c -option to -.Xr amd 8 . -Sets the duration in seconds that looked-up or mounted map -entries remain in the cache. -.It Va cluster Pq string, default no cluster -Same as the -.Fl C -option to -.Xr amd 8 . -Specifies the alternate -.Tn HP-UX -cluster to use. -.It Va debug_mtab_file Pq string, default= Ns Pa /tmp/mnttab -Path to mtab file that is used by -.Xr amd 8 -to store a list of mounted -file systems during debug-mtab mode. -This option only applies -to systems that store mtab information on disk. -.It Va debug_options Pq string, default no debug options -Same as the -.Fl D -option to -.Xr amd 8 . -Specify any debugging options for -.Xr amd 8 . -Works only if -Works only if -am-utils was configured for debugging using the -.Fl Fl enable-debug -option. -The -.Cm mem -option, as well as all other options, can be turned on via -.Fl Fl enable-debug Ns = Ns Cm mem . -Otherwise debugging options are ignored. -Options are -comma delimited, and can be preceded by the string -.Dq Li no -to negate their -meaning. -You can get the list of supported debugging options by running -.Nm amd Fl v . -Possible values are: -.Pp -.Bl -tag -width ".Cm xdrtrace" -compact -.It Cm all -all options (excludes hrtime and mtab) -.It Cm defaults -"sensible" default options (all--excluding hrtime, mtab, and xdrtrace) -.It Cm amq -register for -.Xr amq 8 -.It Cm daemon -enter daemon mode -.It Cm fork -fork server -.It Cm full -program trace -.It Cm hrtime -print high resolution time stamps (only if syslog(3) is not used) -.It Cm info -info service specific debugging -(hesiod, nis, etc.) -.It Cm mem -trace memory allocations -.It Cm mtab -use local -.Pa ./mtab -file -\fBreaddir\fR show browsable_dirs progress -.It Cm str -debug string munging -.It Cm test -full debug options plus mtab,nodaemon,nofork,noamq -.It Cm trace -trace protocol and NFS mount arguments -.It Cm xdrtrace -trace XDR routines -.BR dismount_interval " (numeric, default=120)" -.El -.It Va dismount_interval Pq numeric, default=120 -Same as the -.Fl w -option to -.Xr amd 8 . -Specify, in seconds, the time between attempts to dismount -file systems that have exceeded their cached times. -.It Va domain_strip Pq boolean, default=yes -If -.Dq Li yes , -then the domain -name part referred to by ${rhost} is stripped off. -This is -useful to keep logs and smaller. -If -.Dq Li 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). -.It Va exec_map_timeout Pq numeric, default=10 -The timeout in seconds that -.Xr amd 8 -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, -.Xr amd 8 -is essentially waiting and is thus not responding to any other queries. -.It Va forced_unmounts Pq boolean, default=no -If set to -.Dq Li yes , -and the client OS supports forced or lazy unmounts, then -.Xr amd 8 -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: -.Er EIO , ESTALE , -or -.Er EBUSY . -.Pp -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 -.Dq Li type:=toplvl -mounts hung with -.Er EBUSY -are forcibly unmounted using this option, which is useful to recover -from a hung -.Xr amd 8 ) . -.It Va full_os Pq 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 -.Dq Li linux , -but you can override it to -.Dq Li linux-2.2.5 . -.It Va fully_qualified_hosts Pq string, default=no -If -.Dq Li yes , -.Xr amd 8 -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 -.Xr amd 8 -variable ${hostd} is used, requiring that ${domain} not be null. -.It Va hesiod_base Pq string, default=automount -Specify the base name for hesiod maps. -.It Va karch Pq string, default to karch of the system -Same as the -.Fl k -option to -.Xr amd 8 . -Allows you to override the kernel-architecture of your -system. -Useful for example on Sun (Sparc) machines, where you can build one -.Nm amd -binary and run it on multiple machines, yet you want each one to get -the correct -.Va karch -variable set (for example, sun4c, sun4m, sun4u, etc.) -Note that if not -specified, -.Xr amd 8 -will use -.Xr uname 3 -to figure out the kernel architecture of -the machine. -.It Va ldap_base Pq string, default not set -Specify the base name for LDAP. -This often includes LDAP-specific -values such as country and organization. -.It Va ldap_cache_maxmem Pq numeric, default=131072 -Specify the maximum memory -.Xr amd 8 -should use to cache LDAP entries. -.It Va ldap_cache_seconds Pq numeric, default=0 -Specify the number of seconds to keep entries in the cache. -.It Va ldap_hostports Pq string, default not set -Specify the LDAP host and port values. -.It Va ldap_proto_version Pq numeric, default=2 -Specify the version of the LDAP protocol to use. -.It Va local_domain Pq string, default no sub-domain -Same as the -.Fl d -option to -.Xr amd 8 . -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. -.It Va localhost_address Pq string, default to localhost or 127.0.0.1 -Specify the name or IP address for -.Xr amd 8 -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 -.Xr amd 8 -to connect to a -specific address. -.It Va log_file Pq string, default= Ns Pa /dev/stderr -Same as the -.Fl l -option to -.Xr amd 8 . -Specify a file name to log -.Xr amd 8 -events to. -If the string -.Pa /dev/stderr -is specified, -.Xr amd 8 -will send its events to the standard error file descriptor. -If the string -.Pa syslog -is given, -.Xr amd 8 -will record its events with the system logger -.Xr syslogd 8 . -The default syslog facility used is -.Dv LOG_DAEMON . -If you -wish to change it, append its name to the log file name, delimited by a -single colon. -For example, if -.Pa logfile -is the string -.Dq Li syslog:local7 -then -.Xr amd 8 -will log messages via -.Xr syslog 3 -using the -.Dv LOG_LOCAL7 -facility (if it exists on the system). -.It Va log_options Pq string, default no logging options -Same as the -.Fl x -option to -.Xr amd 8 . -Specify any logging options for -.Xr amd 8 . -Options are comma -delimited, and can be preceded by the string -.Dq Li no -to negate their meaning. -The -.Dq Li debug -logging option is only available if am-utils was configured with -.Fl Fl enable-debug . -You can get the list of supported debugging and logging -options by running -.Nm amd Fl H . -Possible values are: -.Pp -.Bl -tag -width ".Cm warning" -compact -.It Cm all -all messages -.It Cm defaults -default messages (fatal,error,user,warning,info) -.It Cm debug -debug messages -.It Cm error -non-fatal system errors (cannot be turned off) -.It Cm fatal -fatal errors (cannot be turned off) -.It Cm info -information -.It Cm map -map errors -.It Cm stats -additional statistical information -.It Cm user -non-fatal user errors -.It Cm warn -warnings -\fBwarning\fR warnings -.It Cm warning -warnings -.El -.It Va map_reload_interval Pq numeric, default=3600 -The number of seconds that -.Xr amd 8 -will wait before it checks to see if any maps -have changed at their source (NIS servers, LDAP servers, files, etc.). -.Xr amd 8 -will reload only those maps that have changed. -.It Va nfs_allow_any_interface Pq string, default=no -Normally -.Xr amd 8 -accepts local NFS packets only from 127.0.0.1. -If this -parameter is set to -.Dq Li yes -then -.Xr amd 8 -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. -.It Va nfs_allow_insecure_port Pq string, default=no -Normally -.Xr amd 8 -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 -.Xr amd 8 -to stop dead in its tracks. -This parameter allows -.Xr amd 8 -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 -.Dq Li "ignoring request from foo:1234, port not reserved" -in your -.Xr amd 8 -log, try enabling this parameter and give it another go. -.It Va nfs_proto Pq string, default to trying version tcp then udp -By default, -.Xr amd 8 -tries TCP and then UDP. -This option forces the overall -.Tn NFS -protocol used to TCP or UDP. -It overrides what is in the -.Xr amd 8 -maps, and is -useful when -.Nm 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 -.Nm amd ) -until such time as NFSv3 support is -desired again. -.It Va nfs_retransmit_counter Pq numeric, default=11 -Same as the -.Ar retransmit -counter -part of the -.Fl t Ar timeout.retransmit -option to -.Xr amd 8 . -Specifies the number of NFS retransmissions that the kernel will use to -communicate with -.Xr amd 8 . -.It Va nfs_retransmit_counter_udp Pq numeric, default=11 -Same as the -.Va nfs_retransmit_counter -option, but for all UDP mounts only. -.It Va nfs_retransmit_counter_tcp Pq numeric, default=11 -Same as the -.Va nfs_retransmit_counter -option, but for all TCP mounts only. -.It Va nfs_retransmit_counter_toplvl Pq numeric, default=11 -Same as the -.Va nfs_retransmit_counter -option, but only for -.Nm amd Ns 's -top-level UDP mounts. -.It Va nfs_retry_interval Pq numeric, default=8 -Same as the -.Ar timeout -interval -part of the -.Fl t Ar timeout.retransmit -option to -.Xr amd 8 . -Specifies the -.Tn NFS -timeout interval, in -.Em tenths -of seconds, between NFS/RPC retries (for UDP and TCP). -This is the value that the kernel will use to -communicate with -.Xr amd 8 . -.Pp -.Xr amd 8 -relies on the kernel RPC retransmit mechanism to trigger mount retries. -The values of the -.Va nfs_retransmit_counter -and the -.Va nfs_retry_interval -parameters change the overall retry interval. -Too long an interval gives -poor interactive response; too short an interval causes excessive retries. -.It Va nfs_retry_interval_udp Pq numeric, default=8 -Same as the -.Va nfs_retry_interval -option, but for all UDP mounts only. -.It Va nfs_retry_interval_tcp Pq numeric, default=8 -Same as the -.It nfs_retry_interval -option, but for all TCP mounts only. -.It Va nfs_retry_interval_toplvl Pq numeric, default=8 -Same as the -.It nfs_retry_interval -option, but only for -.Nm amd Ns 's -top-level UDP mounts. -.It Va nfs_vers Pq numeric, default to trying version 3 then 2 -By default, -.Xr amd 8 -tries version 3 and then version 2. -This option forces the -overall -.Tn NFS -protocol used to version 3 or 2. -It overrides what is in the -.Xr amd 8 -maps, and is useful when -.Nm 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 -.Nm amd ) -until such time as NFSv3 -support is desired again. -.It Va nis_domain Pq string, default to local Tn NIS domain name -Same as the -.Fl y -option to -.Xr amd 8 . -Specify an alternative -.Tn NIS -domain from which to fetch the -.Tn NIS -maps. -The default is the system domain name. -This option is ignored if -.Tn NIS -support is not available. -.It Va normalize_hostnames Pq boolean, default=no -Same as the -.Fl n -option to -.Xr amd 8 . -If -.Dq Li yes , -then the name referred to by -.Va ${rhost} -is normalized relative to the host database before being used. -The effect is -to translate aliases into -.Dq official -names. -.It Va normalize_slashes Pq boolean, default=yes -If -.Dq Li yes , -then -.Xr amd 8 -will condense all multiple -.Ql / -(slash) characters into -one and remove all trailing slashes. -If -.Dq Li no , -then -.Xr amd 8 -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. -.It Va os Pq string, default to compiled in value -Same as the -.Fl O -option to -.Xr amd 8 . -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 -.Dq Li sunos5 , -you can override it to -.Dq Li sos5 , -and use older maps which were written with the -latter in mind. -.It Va osver Pq string, default to compiled in value -Same as the -.Fl o -option to -.Xr amd 8 . -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 -.Dq Li 2.5.1 , -you can override it to -.Dq Li 5.5.1 , -and use older maps that were written with -the latter in mind. -.It Va pid_file Pq string, default= Ns Pa /dev/stdout -Specify a file to store the process ID of the running daemon into. -If not -specified, -.Xr amd 8 -will print its process ID onto the standard output. -Useful -for killing -.Xr amd 8 -after it had run. -Note that the PID of a running -.Nm amd -can -also be retrieved via -.Nm amq Fl p . -This file is used only if the -.Va print_pid -option is on. -.It Va plock Pq boolean, default=yes -Same as the -.Fl S -option to -.Xr amd 8 . -If -.Dq Li yes , -lock the running executable pages of -.Nm amd -into memory. -To improve -.Nm amd Ns 's -performance, systems that support the -.Xr plock 3 -or -.Xr mlockall 2 -call can lock the -.Nm amd -process into memory. -This way there is less chance that -the operating system will schedule, page out, and swap the -.Nm amd -process as needed. -This improves -.Nm amd Ns 's -performance, at the cost of reserving the -memory used by the -.Nm amd -process (making it unavailable for other processes). -.It Va portmap_program Pq numeric, default=300019 -Specify an alternate Port-mapper RPC program number, other than the official -number. -This is useful when running multiple -.Nm amd -processes. -For example, -you can run another -.Xr amd 8 -in -.Dq test -mode, without affecting the primary -.Nm amd -process in any way. -For safety reasons, the alternate program numbers that -can be specified must be in the range 300019-300029, inclusive. -The -.Xr amq 8 -utility -has an option -.Fl P -which can be used to specify an alternate program number of an -.Nm amd -to contact. -In this way, -.Nm amq -can fully control any number of -.Nm amd -processes running on the same host. -.It Va preferred_amq_port Pq numeric, default=0 -Specify an alternate Port-mapper RPC port number for -.Nm amd Ns 's -.Xr amq 8 -service. -This is used for both UDP and TCP. -Setting this value to 0 (or -not defining it) will cause -.Xr amd 8 -to select an arbitrary port number. -Setting the -.Xr amq 8 -RPC service port to a specific number is useful in firewalled or NAT'ed -environments, where you need to know which port -.Xr amd 8 -will listen on. -.It Va print_pid Pq boolean, default=no -Same as the -.Fl p -option to -.Xr amd 8 . -If -.Dq Li yes , -.Nm amd -will print its process ID upon starting. -.It Va print_version Pq boolean, default=no -Same as the -.Fl v -option to -.Xr amd 8 , -but the version prints and -.Nm amd -continues to run. -If -.Dq Li yes , -.Nm amd -will print its version information string, which includes some -configuration and compilation values. -.It Va restart_mounts Pq boolean, default=no -Same as the -.Fl r -option to -.Xr amd 8 . -If -.Dq Li yes , -.Nm amd -will scan the mount table to determine which file systems are currently -mounted. -Whenever one of these would have been auto-mounted, -.Nm amd -inherits it. -.It Va show_statfs_entries Pq boolean, default=no -If -.Dq Li yes , -then all maps which are browsable will also show the number of -entries (keys) they have when -.Xr df 1 -runs. -(This is accomplished by returning -non-zero values to the -.Xr statfs 2 -system call.) -.It Va truncate_log Pq boolean, default=no -If -.Dq Li yes , -then the log file (if it is a regular file), will be truncated -upon startup. -.It Va unmount_on_exit Pq boolean, default=no -If -.Dq Li yes , -then -.Xr amd 8 -will attempt to unmount all file systems which it knows -about. -Normally -.Nm amd -leaves all -(esp.\& -.Tn NFS ) -mounted file systems intact. -Note that -.Nm amd -does not know about file systems mounted before it starts up, -unless the -.Va restart_mounts -option or -.Fl r -flag are used. -.It Va use_tcpwrappers Pq boolean, default=yes -If -.Dq Li yes , -then -.Xr amd 8 -will use the tcpd/libwrap tcpwrappers library -(if available) to control -access to -.Nm amd -via the -.Pa /etc/hosts.allow -and -.Pa /etc/hosts.deny -files. -.It Va vendor Pq 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 -.Dq Li unknown , -but you can set it to -.Dq Li redhat . -.El -.Ss "Parameters applicable to regular map sections" -.Bl -tag -width 4n -.It Va map_name Pq string, must be specified -Name of the map where the keys are located. -.It Va tag Pq 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 -.Xr amd 8 . -If it is -specified, then -.Nm amd -will process the map if the -.Fl T -option was given to -.Xr amd 8 , -and the value given to that command-line option -matches that in the map section. -.El -.Sh EXAMPLES -Here is a real -.Xr amd 8 -configuration I use daily. -.Bd -literal -# 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 -.Ed -.Sh SEE ALSO -.Xr hosts_access 5 , -.Xr amd 8 , -.Xr amq 8 , -.xr automount 8 , -.Xr ctl-amd 8 . -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Xr amd 8 -utility first appeared in -.Bx 4.4 . -.Sh AUTHORS -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/scripts/amd2ldif.in =================================================================== --- contrib/amd/scripts/amd2ldif.in +++ /dev/null @@ -1,60 +0,0 @@ -#!@PERL@ - -$usage=<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 () { - 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; - } -} Index: contrib/amd/scripts/amd2sun.in =================================================================== --- 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" - -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"; -} Index: contrib/amd/scripts/automount2amd.8 =================================================================== --- contrib/amd/scripts/automount2amd.8 +++ /dev/null @@ -1,116 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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/scripts/automount2amd.8 -.\" -.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 . -Script modified by Erez Zadok , 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. Index: contrib/amd/scripts/automount2amd.in =================================================================== --- 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 -# Erez Zadok -# -# 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; - } - } -} Index: contrib/amd/scripts/ctl-amd.in =================================================================== --- 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 -# -# 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 Index: contrib/amd/scripts/ctl-hlfsd.in =================================================================== --- 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 -# -# 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 Index: contrib/amd/scripts/expn.1 =================================================================== --- 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() { - 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() { - 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() { - 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 = ; - 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] - # [NAME] <[(NAME)] ADDR - # ADDR [(NAME)] - # (NAME) ADDR - # [(NAME)] - # - if ($newaddr =~ /^\<(.*)\>$/) { - print "\n" if $debug; - ($newaddr) = &trim($1); - print "na = $newaddr\n" if $debug; - } - if ($newaddr =~ /^([^\<\>]*)\<([^\<\>]*)\>([^\<\>]*)$/) { - # address has a < > pair in it. - print "N:$1 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() { - 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(); - 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 =~ /^\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\ \ \ \ Index: contrib/amd/scripts/expn.in =================================================================== --- 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() { - 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() { - 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() { - 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 = ; - 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] - # [NAME] <[(NAME)] ADDR - # ADDR [(NAME)] - # (NAME) ADDR - # [(NAME)] - # - if ($newaddr =~ /^\<(.*)\>$/) { - print "\n" if $debug; - ($newaddr) = &trim($1); - print "na = $newaddr\n" if $debug; - } - if ($newaddr =~ /^([^\<\>]*)\<([^\<\>]*)\>([^\<\>]*)$/) { - # address has a < > pair in it. - print "N:$1 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() { - 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(); - 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 =~ /^\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\ \ \ \ Index: contrib/amd/scripts/fix-amd-map.in =================================================================== --- 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 -# - -############################################################################## -### 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; -} Index: contrib/amd/scripts/fixrmtab.in =================================================================== --- contrib/amd/scripts/fixrmtab.in +++ /dev/null @@ -1,32 +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 - -#set -x - -# allow user to pass RMTAB file name from environment -if test -z "${RMTAB}" ; then - RMTAB=/etc/rmtab -fi - -if [ ! -f "$RMTAB" ]; then - exit 0 -fi - -TMP="$(mktemp ${RMTAB}.XXXXXX)" -if [ -z "$TMP" ]; then - exit 1 -fi - -trap "rm -f $TMP" 0 1 2 3 15 - -for host -do - sed -e "/^$host:/s/^./#/" "$RMTAB" > "$TMP" && cp "$TMP" "$RMTAB" -done Index: contrib/amd/scripts/redhat-ctl-amd.in =================================================================== --- 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 Index: contrib/amd/scripts/test-attrcache.in =================================================================== --- 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 <$mapfile < [ [args ...]] -# If only hostname is supplied, command defaults to rsh $hostname -# -# Package: am-utils-6.x -# Author: Erez Zadok - -#set -x - -if [ "X$1" = "X" ]; then - echo "Usage: wait4amd [ [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 Index: contrib/amd/scripts/wait4amd2die.in =================================================================== --- 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 - -#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 Index: contrib/amd/tasks =================================================================== --- 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?? Index: contrib/amd/vers.m4 =================================================================== --- contrib/amd/vers.m4 +++ /dev/null @@ -1 +0,0 @@ -[6.2]dnl Index: contrib/amd/wire-test/wire-test.8 =================================================================== --- contrib/amd/wire-test/wire-test.8 +++ /dev/null @@ -1,110 +0,0 @@ -.\" -.\" Copyright (c) 1997-2014 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. 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.8 -.\" $FreeBSD$ -.\" -.Dd February 26, 2016 -.Dt WIRE-TEST 8 -.Os -.Sh NAME -.Nm wire-test -.Nd test your network interfaces and local IP address -.Sh SYNOPSIS -.Nm -.Op Ar host -.Sh DESCRIPTION -.Bf -symbolic -This command is obsolete. -Users are advised to use -.Xr autofs 5 -instead. -.Ef -.Pp -The -.Nm -utility -is used to find out what -.Xr amd 8 -thinks are the first two network -interfaces and network names/numbers used, as well as the IP address -used for -.Xr amd 8 -to NFS-mount itself. -.Pp -If -.Ar host -is specified, then -.Nm -will test for the working combinations of -.Tn NFS -protocol and version from the current client to the -.Tn NFS -server -.Ar host . -If not specified, -.Ar host -defaults to -.Dq Li localhost . -.Sh SEE ALSO -.Xr amd 8 -.Pp -.Dq am-utils -.Xr info 1 -entry. -.Rs -.%A Erez Zadok -.%B "Linux NFS and Automounter Administration" -.%O ISBN 0-7821-2739-8 -.%I Sybex -.%D 2001 -.Re -.Pp -.Pa http://www.am-utils.org/ -.Rs -.%T Amd \- The 4.4 BSD Automounter -.Re -.Sh HISTORY -The -.Nm -utility appeared in -.Fx 3.0 . -.Sh AUTHORS -.An Erez Zadok Aq ezk@cs.sunysb.edu , -Computer Science Department, Stony Brook University, Stony Brook, New York, USA. -.Pp -Other authors and contributors to am-utils are listed in the -.Pa AUTHORS -file distributed with am-utils. Index: contrib/amd/wire-test/wire-test.c =================================================================== --- contrib/amd/wire-test/wire-test.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 1997-2014 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. 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 -#endif /* HAVE_CONFIG_H */ -#include - -#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 = NULL; - - 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); - - 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, 0); - 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, 0); - if (ret == 0) - fprintf(stderr, "failed!\n"); - else - fprintf(stderr, "found version %d.\n", ret); - } - - exit(0); - return 0; /* should never reach here */ -} Index: libexec/rc/rc.d/amd =================================================================== --- libexec/rc/rc.d/amd +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# - -# PROVIDE: amd -# REQUIRE: rpcbind ypset nfsclient FILESYSTEMS ldconfig -# BEFORE: DAEMON -# KEYWORD: nojail shutdown - -. /etc/rc.subr - -name="amd" -desc="Automatically mount filesystems" -rcvar="amd_enable" -command="/usr/sbin/${name}" -start_precmd="amd_precmd" -command_args="&" -extra_commands="reload" - -amd_precmd() -{ - force_depend nfsclient nfs_client || return 1 - force_depend rpcbind || return 1 - - case ${amd_map_program} in - [Nn][Oo] | '') - ;; - *) - rc_flags="${rc_flags} `echo $(eval ${amd_map_program})`" - ;; - esac - - case "${amd_flags}" in - '') - if [ ! -r /etc/amd.conf ]; then - warn 'amd will not load without arguments' - return 1 - fi - ;; - *) - rc_flags="-p ${rc_flags}" - command_args="> /var/run/amd.pid 2> /dev/null" - ;; - esac -} - -load_rc_config $name -run_rc_command "$1" Index: usr.sbin/amd/Makefile =================================================================== --- usr.sbin/amd/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -SUBDIR= include libamu .WAIT \ - amd amq fixmount fsinfo hlfsd mk-amd-map pawd \ - scripts wire-test -SUBDIR_PARALLEL= - -.include Index: usr.sbin/amd/Makefile.inc =================================================================== --- usr.sbin/amd/Makefile.inc +++ /dev/null @@ -1,42 +0,0 @@ -# ex:ts=8 -# -# $FreeBSD$ -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998. -# Portions derived from -# $NetBSD: Makefile.inc,v 1.10 1998/08/08 22:33:27 christos Exp $ -# Portions derived from amd/libamu/Makefile -# $NetBSD: Makefile,v 1.8 1998/08/08 22:33:37 christos Exp $ - -.include - -PACKAGE= amd - -CFLAGS+= -I. -I${.CURDIR} -CFLAGS+= -I${.CURDIR:H}/include -.if exists(${.OBJDIR:H}/include) -CFLAGS+= -I${.OBJDIR:H}/include -.endif -CFLAGS+= -I${SRCTOP}/contrib/amd/include -CFLAGS+= -I${SRCTOP}/contrib/amd -CFLAGS+= -DHAVE_CONFIG_H -.if ${MK_NIS} == "no" -CFLAGS+= -DHAVE_LOCALCONFIG_H -.endif - -.if ${MK_HESIOD} != "no" -CFLAGS+= -DYES_HESIOD -.endif - -CFLAGS+= -DHOST_CPU=\"${MACHINE_CPUARCH}\" -DHOST_ARCH=\"${MACHINE_ARCH}\" - -RPCCOM= RPCGEN_CPP=${CPP:Q} rpcgen -MOUNT_X= ${SRCTOP}/include/rpcsvc/mount.x -NFS_PROT_X= ${SRCTOP}/include/rpcsvc/nfs_prot.x - -WARNS?= 1 - -.if exists(${.CURDIR:H:H}/Makefile.inc) -.include "${.CURDIR:H:H}/Makefile.inc" -.endif Index: usr.sbin/amd/NOTES =================================================================== --- usr.sbin/amd/NOTES +++ /dev/null @@ -1,3 +0,0 @@ -amd/amd supports HESIOD, LDAP, and NIS+ which we don't presently. -If they are added to FreeBSD, add info_hesiod.c, info_ldap.c, info_nisplus.c -to amd/amd's Makefile. Index: usr.sbin/amd/amd/Makefile =================================================================== --- usr.sbin/amd/amd/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ -# - -.include - -.PATH: ${SRCTOP}/contrib/amd/amd - -CONFS= amd.map -PROG= amd -MAN= amd.8 -SRCS= am_ops.c amd.c amfs_auto.c amfs_direct.c amfs_error.c amfs_generic.c -SRCS+= amfs_host.c amfs_link.c amfs_linkx.c amfs_nfsl.c -SRCS+= amfs_nfsx.c amfs_program.c amfs_root.c amfs_toplvl.c -SRCS+= amfs_union.c amq_subr.c amq_svc.c autil.c clock.c conf.c -SRCS+= get_args.c info_exec.c info_file.c info_ndbm.c info_passwd.c -SRCS+= info_sun.c -SRCS+= info_union.c map.c mapc.c mntfs.c nfs_prot_svc.c nfs_start.c -SRCS+= nfs_subr.c ops_cdfs.c ops_lustre.c ops_mfs.c ops_nfs.c -SRCS+= ops_nfs3.c ops_nfs4.c -SRCS+= ops_nullfs.c ops_pcfs.c ops_tfs.c ops_tmpfs.c ops_udf.c ops_ufs.c -SRCS+= ops_umapfs.c -SRCS+= ops_unionfs.c opts.c readdir.c restart.c rpc_fwd.c sched.c -SRCS+= srvr_amfs_auto.c srvr_nfs.c sun_map.c - -CFLAGS+= -I${SRCTOP}/contrib/amd/amd \ - -I${SRCTOP}/contrib/amd/include \ - -I${OBJTOP}/include/rpcsvc - -LIBADD= amu - -SRCS+= conf_parse.c conf_parse.h conf_tok.c -SRCS+= sun_map_parse.c sun_map_parse.h sun_map_tok.c -CLEANFILES+= conf_parse.c conf_parse.h conf_tok.c -CLEANFILES+= sun_map_parse.c sun_map_parse.h sun_map_tok.c - -conf_tok.c: conf_tok.l - ${LEX} ${LFLAGS} -Pconf_ -o${.TARGET} ${.ALLSRC} - -.ORDER: conf_parse.c conf_parse.h -conf_parse.h: .NOMETA -conf_parse.c conf_parse.h: conf_parse.y - ${YACC} ${YFLAGS} -pconf_ -oconf_parse.c ${.ALLSRC} - -sun_map_tok.c: sun_map_tok.l - ${LEX} ${LFLAGS} -Psun_map_ -o${.TARGET} ${.ALLSRC} - -.ORDER: sun_map_parse.c sun_map_parse.h -sun_map_parse.h: .NOMETA -sun_map_parse.c sun_map_parse.h: sun_map_parse.y - ${YACC} ${YFLAGS} -psun_map_ -osun_map_parse.c ${.ALLSRC} - -conf_tok.o: conf_parse.h - -sun_map_tok.o: sun_map_parse.h - -# These are generated at compile time -SRCS+= mount_xdr.c -CLEANFILES+= mount_xdr.c - -mount_xdr.c: ${MOUNT_X} - ${RPCCOM} -c -DWANT_NFS3 ${.ALLSRC} -o ${.TARGET} - -.if ${MK_HESIOD} != "no" -SRCS+= info_hesiod.c -CFLAGS+= -DHAVE_MAP_HESIOD -.endif - -.if ${MK_NIS} != "no" -SRCS+= info_nis.c -.endif - -.if ${MK_TCP_WRAPPERS} != "no" -CFLAGS+= -DHAVE_LIBWRAP -DHAVE_TCPD_H -LIBADD+= wrap -.endif - -.include Index: usr.sbin/amd/amd/Makefile.depend =================================================================== --- usr.sbin/amd/amd/Makefile.depend +++ /dev/null @@ -1,24 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - lib/libwrap \ - usr.bin/yacc.host \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/amd/amd.map =================================================================== --- usr.sbin/amd/amd/amd.map +++ /dev/null @@ -1,4 +0,0 @@ -# $FreeBSD$ -# -/defaults type:=host;fs:=${autodir}/${rhost}/host;rhost:=${key} -* opts:=rw,grpid,resvport,vers=3,proto=tcp,nosuid,nodev Index: usr.sbin/amd/amq/Makefile =================================================================== --- usr.sbin/amd/amq/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ -# - -.PATH: ${SRCTOP}/contrib/amd/amq - -PROG= amq -MAN= amq.8 -SRCS= amq.c amq_clnt.c amq_xdr.c - -CFLAGS+= -I${SRCTOP}/contrib/amd/amq - -LIBADD= amu - -.include Index: usr.sbin/amd/amq/Makefile.depend =================================================================== --- usr.sbin/amd/amq/Makefile.depend +++ /dev/null @@ -1,22 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/fixmount/Makefile =================================================================== --- usr.sbin/amd/fixmount/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/fixmount \ - ${SRCTOP}/contrib/amd/conf/checkmount - -PROG= fixmount -MAN= fixmount.8 -SRCS= fixmount.c - -# These would be links created by the GNU-style configure -SRCS+= checkmount_bsd44.c - -LIBADD+= amu rpcsvc - -.include Index: usr.sbin/amd/fixmount/Makefile.depend =================================================================== --- usr.sbin/amd/fixmount/Makefile.depend +++ /dev/null @@ -1,23 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - lib/librpcsvc \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/fsinfo/Makefile =================================================================== --- usr.sbin/amd/fsinfo/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/fsinfo - -PROG= fsinfo -MAN= fsinfo.8 -SRCS= fsi_analyze.c fsi_dict.c fsi_util.c fsinfo.c -SRCS+= wr_atab.c wr_bparam.c wr_dumpset.c wr_exportfs.c wr_fstab.c - -CFLAGS+= -I${SRCTOP}/contrib/amd/fsinfo \ - -I${SRCTOP}/contrib/amd/inculde - -LIBADD= amu - -SRCS+= fsi_gram.c fsi_gram.h fsi_lex.c -SRCS+= null_gram.c null_gram.h null_lex.c -CLEANFILES+= fsi_gram.c fsi_gram.h fsi_lex.c -CLEANFILES+= null_gram.c null_gram.h null_lex.c - -fsi_lex.c: fsi_lex.l - ${LEX} ${LFLAGS} -Pfsi_ -o${.TARGET} ${.ALLSRC} - -.ORDER: fsi_gram.c fsi_gram.h -fsi_gram.h: .NOMETA -fsi_gram.c fsi_gram.h: fsi_gram.y - ${YACC} ${YFLAGS} -pfsi_ -ofsi_gram.c ${.ALLSRC} - -null_lex.c: null_lex.l - ${LEX} ${LFLAGS} -Pnull_ -o${.TARGET} ${.ALLSRC} - -.ORDER: null_gram.c null_gram.h -null_gram.h: .NOMETA -null_gram.c null_gram.h: null_gram.y - ${YACC} ${YFLAGS} -pnull_ -onull_gram.c ${.ALLSRC} - -fsi_lex.o: fsi_gram.h - -null_gram.o: null_gram.h - -.include Index: usr.sbin/amd/fsinfo/Makefile.depend =================================================================== --- usr.sbin/amd/fsinfo/Makefile.depend +++ /dev/null @@ -1,23 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - usr.bin/yacc.host \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/hlfsd/Makefile =================================================================== --- usr.sbin/amd/hlfsd/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/hlfsd - -PROG= hlfsd -MAN= hlfsd.8 -SRCS= hlfsd.c homedir.c nfs_prot_svc.c stubs.c - -CFLAGS+= -I${SRCTOP}/contrib/amd/hlfsd - -LIBADD= amu - -.include Index: usr.sbin/amd/hlfsd/Makefile.depend =================================================================== --- usr.sbin/amd/hlfsd/Makefile.depend +++ /dev/null @@ -1,22 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/include/Makefile =================================================================== --- usr.sbin/amd/include/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# ex:ts=8 -# -# $FreeBSD$ -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998. -# Portions derived from amd/libamu/Makefile -# $NetBSD: Makefile,v 1.8 1998/08/08 22:33:37 christos Exp $ - -.include - -SRCS= config_local.h -.if ${MK_NIS} == "no" -SRCS+= localconfig.h -.endif -CLEANFILES= ${SRCS} - -all depend: ${SRCS} - -config_local.h: newvers.sh ${SRCTOP}/sys/conf/newvers.sh - @rm -f ${.TARGET} - sh ${.ALLSRC} > ${.TARGET} - -localconfig.h: - @rm -f ${.TARGET} - @echo "/* NIS disabled by WITHOUT_NIS src.conf option */" >> ${.TARGET} - @echo "#undef HAVE_MAP_NIS" >> ${.TARGET} - -.include Index: usr.sbin/amd/include/Makefile.depend =================================================================== --- usr.sbin/amd/include/Makefile.depend +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/include/amu_autofs_prot.h =================================================================== --- usr.sbin/amd/include/amu_autofs_prot.h +++ /dev/null @@ -1,8 +0,0 @@ -// $FreeBSD$ - -/* Adjust once we have some form of Autofs support. */ - -#if 0 -#include "conf/autofs/autofs_default.h" -#endif - Index: usr.sbin/amd/include/amu_nfs_prot.h =================================================================== --- usr.sbin/amd/include/amu_nfs_prot.h +++ /dev/null @@ -1 +0,0 @@ -#include "conf/nfs_prot/nfs_prot_freebsd3.h" Index: usr.sbin/amd/include/aux_conf.h =================================================================== --- usr.sbin/amd/include/aux_conf.h +++ /dev/null @@ -1,72 +0,0 @@ -/* $FreeBSD$ */ - -/* - * aux_conf.h: - * This file gets "filled in" for each architecture. - * aux_conf.h. Generated from aux_conf.h.in by configure. - */ - -#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. - */ - -/* $srcdir/conf/trap/trap_default.h */ -#define MOUNT_TRAP(type, mnt, flags, mnt_data) mount(type, mnt->mnt_dir, flags, mnt_data) -/* 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) unmount(mnt->mnt_dir) -/* End of replaced UNMOUNT_TRAP macro definition */ -/* umount(8) executable path, for type:=program */ -#define UNMOUNT_PROGRAM "/sbin/umount" - -/* - * 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. - */ - -/* $srcdir/conf/fh_dref/fh_dref_freebsd22.h */ -#define NFS_FH_DREF(dst, src) (dst) = (u_char *) (src) -/* 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. - */ - -/* $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 -/* 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. - */ - -/* $srcdir/conf/hn_dref/hn_dref_default.h */ -#define NFS_HN_DREF(dst, src) (dst) = (src) -/* End of included NFS_HN_DREF macro definition file */ - -#endif /* not _AUX_CONF_H */ Index: usr.sbin/amd/include/build_version.h =================================================================== --- usr.sbin/amd/include/build_version.h +++ /dev/null @@ -1,8 +0,0 @@ -/* $FreeBSD$ */ - -#include -/*#define AMU_BUILD_VERSION 1 */ -#define AMU_BUILD_VERSION __FreeBSD_version -#define USER_NAME "David O'Brien " -#define CONFIG_DATE "4-December-2007 PST" Index: usr.sbin/amd/include/config.h =================================================================== --- usr.sbin/amd/include/config.h +++ /dev/null @@ -1,2443 +0,0 @@ -/* - * $FreeBSD$ - * - * portions derived from - * $NetBSD: config.h,v 1.11 1998/08/08 22:33:37 christos Exp $ - * - * Additional portions derived from ports/sysutils/am-utils r416941 - * make configure config.h output. - */ - -#ifndef _CONFIG_H -#define _CONFIG_H - -/* We [FREEBSD-NATIVE] pick some parameters from our local config file */ -#include "config_local.h" - -/* Define if building universal (internal helper macro) */ -/* #undef AC_APPLE_UNIVERSAL_BUILD */ - -/* define name of am-utils' NFS protocol header */ -#define AMU_NFS_PROTOCOL_HEADER "./conf/nfs_prot/nfs_prot_freebsd3.h" - -/* Type of the 5rd argument to authunix_create() */ -#define AUTH_CREATE_GIDLIST_TYPE gid_t - -/* Define configuration date */ -/* #define CONFIG_DATE "Mon Oct 3 21:58:39 PDT 2016" */ - -/* Turn off general debugging by default */ -/* #undef DEBUG */ - -/* Turn off memory debugging by default */ -/* #undef DEBUG_MEM */ - -/* Define name of host OS's distribution name (eg. debian, redhat, suse, etc.) - */ -#define DISTRO_NAME "The FreeBSD Project" - -/* Define to the type of elements in the array set by `getgroups'. Usually - this is either `int' or `gid_t'. */ -#define GETGROUPS_T gid_t - -/* Define to 1 if the `getpgrp' function requires zero arguments. */ -#define GETPGRP_VOID 1 - -/* Define if have automount filesystem */ -#define HAVE_AMU_FS_AUTO 1 - -/* Define if have direct automount filesystem */ -#define HAVE_AMU_FS_DIRECT 1 - -/* Define if have error filesystem */ -#define HAVE_AMU_FS_ERROR 1 - -/* Define if have NFS host-tree filesystem */ -#define HAVE_AMU_FS_HOST 1 - -/* Define if have symbolic-link filesystem */ -#define HAVE_AMU_FS_LINK 1 - -/* Define if have symlink with existence check filesystem */ -#define HAVE_AMU_FS_LINKX 1 - -/* Define if have nfsl (NFS with local link check) filesystem */ -#define HAVE_AMU_FS_NFSL 1 - -/* Define if have multi-NFS filesystem */ -#define HAVE_AMU_FS_NFSX 1 - -/* Define if have program filesystem */ -#define HAVE_AMU_FS_PROGRAM 1 - -/* Define if have "top-level" filesystem */ -#define HAVE_AMU_FS_TOPLVL 1 - -/* Define if have union filesystem */ -#define HAVE_AMU_FS_UNION 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_ARPA_INET_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_ARPA_NAMESER_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_ASSERT_H 1 - -/* Define to 1 if `addr' is member of `autofs_args_t'. */ -/* #undef HAVE_AUTOFS_ARGS_T_ADDR */ - -/* define if have a bad version of hasmntopt() */ -/* #undef HAVE_BAD_HASMNTOPT */ - -/* define if have a bad version of memcmp() */ -/* #undef HAVE_BAD_MEMCMP */ - -/* define if have a bad version of yp_all() */ -/* #undef HAVE_BAD_YP_ALL */ - -/* Define to 1 if you have the `bcmp' function. */ -#define HAVE_BCMP 1 - -/* Define to 1 if you have the `bcopy' function. */ -#define HAVE_BCOPY 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_BSD_RPC_RPC_H */ - -/* Define to 1 if you have the `bzero' function. */ -#define HAVE_BZERO 1 - -/* System supports C99-style variable-length argument macros */ -#define HAVE_C99_VARARGS_MACROS 1 - -/* Define to 1 if `flags' is member of `cdfs_args_t'. */ -#define HAVE_CDFS_ARGS_T_FLAGS 1 - -/* Define to 1 if `fspec' is member of `cdfs_args_t'. */ -#define HAVE_CDFS_ARGS_T_FSPEC 1 - -/* Define to 1 if `iso_flags' is member of `cdfs_args_t'. */ -/* #undef HAVE_CDFS_ARGS_T_ISO_FLAGS */ - -/* Define to 1 if `iso_pgthresh' is member of `cdfs_args_t'. */ -/* #undef HAVE_CDFS_ARGS_T_ISO_PGTHRESH */ - -/* Define to 1 if `norrip' is member of `cdfs_args_t'. */ -/* #undef HAVE_CDFS_ARGS_T_NORRIP */ - -/* Define to 1 if `ssector' is member of `cdfs_args_t'. */ -#define HAVE_CDFS_ARGS_T_SSECTOR 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_CDFS_CDFSMOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_CDFS_CDFS_MOUNT_H */ - -/* Define to 1 if you have the `clnt_create' function. */ -#define HAVE_CLNT_CREATE 1 - -/* Define to 1 if you have the `clnt_create_vers' function. */ -#define HAVE_CLNT_CREATE_VERS 1 - -/* Define to 1 if you have the `clnt_create_vers_timed' function. */ -#define HAVE_CLNT_CREATE_VERS_TIMED 1 - -/* Define to 1 if you have the `clnt_spcreateerror' function. */ -#define HAVE_CLNT_SPCREATEERROR 1 - -/* Define to 1 if you have the `clnt_sperrno' function. */ -#define HAVE_CLNT_SPERRNO 1 - -/* Define to 1 if you have the `clock_gettime' function. */ -#define HAVE_CLOCK_GETTIME 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_CLUSTER_H */ - -/* Define to 1 if you have the `cnodeid' function. */ -/* #undef HAVE_CNODEID */ - -/* Define to 1 if you have the header file. */ -#define HAVE_CTYPE_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_DB1_NDBM_H */ - -/* Define to 1 if you have the `dbm_open' function. */ -#define HAVE_DBM_OPEN 1 - -/* Define to 1 if you have the `dg_mount' function. */ -/* #undef HAVE_DG_MOUNT */ - -/* Define to 1 if you have the header file, and it defines `DIR'. - */ -#define HAVE_DIRENT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if `flags' is member of `efs_args_t'. */ -/* #undef HAVE_EFS_ARGS_T_FLAGS */ - -/* Define to 1 if `version' is member of `efs_args_t'. */ -/* #undef HAVE_EFS_ARGS_T_VERSION */ - -/* Define to 1 if `fspec' is member of `efs_args_t'. */ -/* #undef HAVE_EFS_ARGS_T_FSPEC */ - -/* Define to 1 if `version' is member of `efs_args_t'. */ -/* #undef HAVE_EFS_ARGS_T_VERSION */ - -/* Define to 1 if you have the header file. */ -#define HAVE_ERRNO_H 1 - -/* does extern definition for clnt_spcreateerror() exist? */ -#define HAVE_EXTERN_CLNT_SPCREATEERROR 1 - -/* does extern definition for clnt_sperrno() exist? */ -#define HAVE_EXTERN_CLNT_SPERRNO 1 - -/* does extern definition for free() exist? */ -#define HAVE_EXTERN_FREE 1 - -/* does extern definition for getccent() (hpux) exist? */ -/* #undef HAVE_EXTERN_GETCCENT */ - -/* does extern definition for getdomainname() exist? */ -#define HAVE_EXTERN_GETDOMAINNAME 1 - -/* does extern definition for getdtablesize() exist? */ -#define HAVE_EXTERN_GETDTABLESIZE 1 - -/* does extern definition for gethostname() exist? */ -#define HAVE_EXTERN_GETHOSTNAME 1 - -/* does extern definition for getlogin() exist? */ -#define HAVE_EXTERN_GETLOGIN 1 - -/* does extern definition for getpagesize() exist? */ -#define HAVE_EXTERN_GETPAGESIZE 1 - -/* does extern definition for gettablesize() exist? */ -/* #undef HAVE_EXTERN_GETTABLESIZE */ - -/* does extern definition for getwd() exist? */ -#define HAVE_EXTERN_GETWD 1 - -/* does extern definition for get_myaddress() exist? */ -#define HAVE_EXTERN_GET_MYADDRESS 1 - -/* does extern definition for hosts_ctl() exist? */ -/* #undef HAVE_EXTERN_HOSTS_CTL */ - -/* does extern definition for innetgr() exist? */ -#define HAVE_EXTERN_INNETGR 1 - -/* does extern definition for ldap_enable_cache() exist? */ -/* #undef HAVE_EXTERN_LDAP_ENABLE_CACHE */ - -/* does extern definition for mkstemp() exist? */ -#define HAVE_EXTERN_MKSTEMP 1 - -/* does extern definition for mntctl() exist? */ -/* #undef HAVE_EXTERN_MNTCTL */ - -/* does extern definition for optarg exist? */ -#define HAVE_EXTERN_OPTARG 1 - -/* does extern definition for sbrk() exist? */ -#define HAVE_EXTERN_SBRK 1 - -/* does extern definition for seteuid() exist? */ -#define HAVE_EXTERN_SETEUID 1 - -/* does extern definition for setitimer() exist? */ -#define HAVE_EXTERN_SETITIMER 1 - -/* does extern definition for sleep() exist? */ -#define HAVE_EXTERN_SLEEP 1 - -/* does extern definition for strcasecmp() exist? */ -#define HAVE_EXTERN_STRCASECMP 1 - -/* does extern definition for strdup() exist? */ -#define HAVE_EXTERN_STRDUP 1 - -/* does extern definition for strlcat() exist? */ -#define HAVE_EXTERN_STRLCAT 1 - -/* does extern definition for strlcpy() exist? */ -#define HAVE_EXTERN_STRLCPY 1 - -/* does extern definition for strstr() exist? */ -#define HAVE_EXTERN_STRSTR 1 - -/* does extern definition for sys_errlist[] exist? */ -#define HAVE_EXTERN_SYS_ERRLIST 1 - -/* does extern definition for ualarm() exist? */ -#define HAVE_EXTERN_UALARM 1 - -/* does extern definition for usleep() exist? */ -#define HAVE_EXTERN_USLEEP 1 - -/* does extern definition for vsnprintf() exist? */ -#define HAVE_EXTERN_VSNPRINTF 1 - -/* does extern definition for wait3() exist? */ -#define HAVE_EXTERN_WAIT3 1 - -/* does extern definition for xdr_callmsg() exist? */ -#define HAVE_EXTERN_XDR_CALLMSG 1 - -/* does extern definition for xdr_opaque_auth() exist? */ -#define HAVE_EXTERN_XDR_OPAQUE_AUTH 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if `fds_bits' is member of `fd_set'. */ -#define HAVE_FD_SET_FDS_BITS 1 - -/* Define to 1 if you have the `fgets' function. */ -#define HAVE_FGETS 1 - -/* Define if plain fhandle type exists */ -#define HAVE_FHANDLE 1 - -/* Define to 1 if you have the `flock' function. */ -#define HAVE_FLOCK 1 - -/* Define to 1 if you have the `fork' function. */ -#define HAVE_FORK 1 - -/* Define to 1 if you have the `fsmount' function. */ -/* #undef HAVE_FSMOUNT */ - -/* Define if have AUTOFS filesystem */ -/* #undef HAVE_FS_AUTOFS */ - -/* Define if have CACHEFS filesystem */ -/* #undef HAVE_FS_CACHEFS */ - -/* Define if have CDFS filesystem */ -#define HAVE_FS_CDFS 1 - -/* Define if have CFS (crypto) filesystem */ -/* #undef HAVE_FS_CFS */ - -/* Define if have EFS filesystem (irix) */ -/* #undef HAVE_FS_EFS */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_FS_EFS_EFS_MOUNT_H */ - -/* Define if have EXT{2,3,4} filesystem (linux) */ -/* #undef HAVE_FS_EXT */ - -/* Define if have FFS filesystem */ -/* #undef HAVE_FS_FFS */ - -/* Define if have HSFS filesystem */ -/* #undef HAVE_FS_HSFS */ - -/* Define if have LOFS filesystem */ -/* #undef HAVE_FS_LOFS */ - -/* Define if have LUSTRE filesystem */ -/* #undef HAVE_FS_LUSTRE */ - -/* Define if have MFS filesystem */ -#define HAVE_FS_MFS 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H */ - -/* Define if have NFS filesystem */ -#define HAVE_FS_NFS 1 - -/* Define if have NFS3 filesystem */ -#define HAVE_FS_NFS3 1 - -/* Define if have NFS4 filesystem */ -/* #undef HAVE_FS_NFS4 */ - -/* Define if have NULLFS (loopback on bsd44) filesystem */ -#define HAVE_FS_NULLFS 1 - -/* Define if have PCFS filesystem */ -#define HAVE_FS_PCFS 1 - -/* Define if have TFS filesystem */ -/* #undef HAVE_FS_TFS */ - -/* Define if have TMPFS filesystem */ -#define HAVE_FS_TMPFS 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_FS_TMPFS_TMPFS_ARGS_H */ - -/* Define if have UDF filesystem */ -#define HAVE_FS_UDF 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_FS_UDF_UDF_MOUNT_H 1 - -/* Define if have UFS filesystem */ -#define HAVE_FS_UFS 1 - -/* Define if have UMAPFS (uid/gid mapping) filesystem */ -/* #undef HAVE_FS_UMAPFS */ - -/* Define if have UNIONFS filesystem */ -#define HAVE_FS_UNIONFS 1 - -/* Define if have XFS filesystem (irix) */ -/* #undef HAVE_FS_XFS */ - -/* System supports GCC-style variable-length argument macros */ -/* #undef HAVE_GCC_VARARGS_MACROS */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_GDBM_NDBM_H */ - -/* Define to 1 if you have the `getccent' function. */ -/* #undef HAVE_GETCCENT */ - -/* Define to 1 if you have the `getcwd' function. */ -#define HAVE_GETCWD 1 - -/* Define to 1 if you have the `getdomainname' function. */ -#define HAVE_GETDOMAINNAME 1 - -/* Define to 1 if you have the `getdtablesize' function. */ -#define HAVE_GETDTABLESIZE 1 - -/* Define to 1 if you have the `gethostname' function. */ -#define HAVE_GETHOSTNAME 1 - -/* Define to 1 if you have the `getifaddrs' function. */ -#define HAVE_GETIFADDRS 1 - -/* Define to 1 if you have the `getmntinfo' function. */ -#define HAVE_GETMNTINFO 1 - -/* Define to 1 if you have the `getmountent' function. */ -/* #undef HAVE_GETMOUNTENT */ - -/* Define to 1 if you have the `getpagesize' function. */ -#define HAVE_GETPAGESIZE 1 - -/* Define to 1 if you have the `getpwnam' function. */ -#define HAVE_GETPWNAM 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the `get_myaddress' function. */ -#define HAVE_GET_MYADDRESS 1 - -/* define if your system's getopt() is GNU getopt() (are you using glibc) */ -/* #undef HAVE_GNU_GETOPT */ - -/* Define to 1 if you have the header file. */ -#define HAVE_GRP_H 1 - -/* Define to 1 if you have the `hasmntopt' function. */ -/* #undef HAVE_HASMNTOPT */ - -#ifdef YES_HESIOD -/* Define to 1 if you have the header file. */ -#define HAVE_HESIOD_H 1 - -/* Define to 1 if you have the `hesiod_init' function. */ -#define HAVE_HESIOD_INIT 1 - -/* Define to 1 if you have the `hesiod_reload' function. */ -/* #undef HAVE_HESIOD_RELOAD */ - -/* Define to 1 if you have the `hesiod_to_bind' function. */ -#define HAVE_HESIOD_TO_BIND 1 - -/* Define to 1 if you have the `hes_init' function. */ -#define HAVE_HES_INIT 1 -#else -#undef HAVE_HESIOD_H -#undef HAVE_HESIOD_INIT -#undef HAVE_HESIOD_RELOAD -#undef HAVE_HESIOD_TO_BIND -#undef HAVE_HES_INIT -#endif - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_HSFS_HSFS_H */ - -/* Define to 1 if you have the `hstrerror' function. */ -#define HAVE_HSTRERROR 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_IFADDRS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_IRS_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_ISOFS_CD9660_CD9660_MOUNT_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LBER_H */ - -/* Define to 1 if you have the `ldap_enable_cache' function. */ -/* #undef HAVE_LDAP_ENABLE_CACHE */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LDAP_H */ - -/* Define to 1 if you have the `ldap_open' function. */ -/* #undef HAVE_LDAP_OPEN */ - -/* Define to 1 if you have the header file. */ -#define HAVE_LIBGEN_H 1 - -/* Define to 1 if you have the `malloc' library (-lmalloc). */ -/* #undef HAVE_LIBMALLOC */ - -/* Define to 1 if you have the `mapmalloc' library (-lmapmalloc). */ -/* #undef HAVE_LIBMAPMALLOC */ - -/* Define to 1 if you have the `nsl' library (-lnsl). */ -/* #undef HAVE_LIBNSL */ - -/* Define to 1 if you have the `posix4' library (-lposix4). */ -/* #undef HAVE_LIBPOSIX4 */ - -/* Define to 1 if you have the `resolv' library (-lresolv). */ -/* #undef HAVE_LIBRESOLV */ - -/* Define to 1 if you have the `rpc' library (-lrpc). */ -/* #undef HAVE_LIBRPC */ - -/* Define to 1 if you have the `rpcsvc' library (-lrpcsvc). */ -#define HAVE_LIBRPCSVC 1 - -/* Define to 1 if you have the `rt' library (-lrt). */ -/* #undef HAVE_LIBRT */ - -/* does libwrap exist? */ -/* #undef HAVE_LIBWRAP */ - -/* Define to 1 if you have the header file. */ -#define HAVE_LIMITS_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_AUTO_FS4_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_AUTO_FS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_FS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_KDEV_T_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_LIST_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_LOOP_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_NFS2_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_NFS4_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_NFS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_NFS_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_POSIX_TYPES_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_SOCKET_H */ - -/* Define to 1 if you support file names longer than 14 characters. */ -#define HAVE_LONG_FILE_NAMES 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MACHINE_ENDIAN_H 1 - -/* Define to 1 if you have the `madvise' function. */ -#define HAVE_MADVISE 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_H */ - -/* Define if have DBM maps */ -/* #undef HAVE_MAP_DBM */ - -/* Define if have executable maps */ -#define HAVE_MAP_EXEC 1 - -/* Define if have file maps (everyone should have it!) */ -#define HAVE_MAP_FILE 1 - -#ifdef YES_HESIOD -/* Define if have HESIOD maps */ -#define HAVE_MAP_HESIOD 1 -#else -#undef HAVE_MAP_HESIOD -#endif - -/* Define if have LDAP maps */ -/* #undef HAVE_MAP_LDAP */ - -/* Define if have NDBM maps */ -#define HAVE_MAP_NDBM 1 - -/* Define if have NIS maps */ -#define HAVE_MAP_NIS 1 - -/* Define if have NIS+ maps */ -/* #undef HAVE_MAP_NISPLUS */ - -/* Define if have PASSWD maps */ -#define HAVE_MAP_PASSWD 1 - -/* Define if have Sun-syntax maps */ -#define HAVE_MAP_SUN 1 - -/* Define if have UNION maps */ -#define HAVE_MAP_UNION 1 - -/* Define to 1 if you have the `memcmp' function. */ -#define HAVE_MEMCMP 1 - -/* Define to 1 if you have the `memcpy' function. */ -#define HAVE_MEMCPY 1 - -/* Define to 1 if you have the `memmove' function. */ -#define HAVE_MEMMOVE 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `memset' function. */ -#define HAVE_MEMSET 1 - -/* Define to 1 if you have the `mkdir' function. */ -#define HAVE_MKDIR 1 - -/* Define to 1 if you have the `mkstemp' function. */ -#define HAVE_MKSTEMP 1 - -/* Define to 1 if you have the `mlockall' function. */ -#define HAVE_MLOCKALL 1 - -/* Define to 1 if you have the `mntctl' function. */ -/* #undef HAVE_MNTCTL */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MNTENT_H */ - -/* Define to 1 if `mnt_cnode' is member of `mntent_t'. */ -/* #undef HAVE_MNTENT_T_MNT_CNODE */ - -/* Define to 1 if `mnt_ro' is member of `mntent_t'. */ -/* #undef HAVE_MNTENT_T_MNT_RO */ - -/* Define to 1 if `mnt_time' is member of `mntent_t'. */ -/* #undef HAVE_MNTENT_T_MNT_TIME */ - -/* does mntent_t have mnt_time field and is of type "char *" ? */ -/* #undef HAVE_MNTENT_T_MNT_TIME_STRING */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MNTTAB_H */ - -/* Define to 1 if you have the `mount' function. */ -#define HAVE_MOUNT 1 - -/* Define to 1 if `optptr' is member of `mounta'. */ -/* #undef HAVE_MOUNTA_OPTPTR */ - -/* Define to 1 if you have the `mountsyscall' function. */ -/* #undef HAVE_MOUNTSYSCALL */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MSDOSFS_MSDOSFSMOUNT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_FS_MSDOSFS_MSDOSFSMOUNT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NDBM_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NDIR_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_NETCONFIG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NETDB_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NETDIR_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_NETINET_IF_ETHER_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NETINET_IN_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NET_ERRNO_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_NET_IF_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NET_IF_VAR_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_NET_ROUTE_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NFSCLIENT_NFSARGS_H 1 - -/* Define to 1 if `acdirmax' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_ACDIRMAX 1 - -/* Define to 1 if `acdirmin' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_ACDIRMIN 1 - -/* Define to 1 if `acregmax' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_ACREGMAX 1 - -/* Define to 1 if `acregmin' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_ACREGMIN 1 - -/* Define to 1 if `addrlen' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_ADDRLEN 1 - -/* Define to 1 if `bsize' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_BSIZE */ - -/* Define to 1 if `context' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_CONTEXT */ - -/* Define to 1 if `fhsize' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_FHSIZE 1 - -/* Define to 1 if `fh_len' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_FH_LEN */ - -/* Define to 1 if `gfs_flags' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_GFS_FLAGS */ - -/* Define to 1 if `namlen' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_NAMLEN */ - -/* Define to 1 if `optstr' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_OPTSTR */ - -/* Define to 1 if `pathconf' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_PATHCONF */ - -/* Define to 1 if `proto' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_PROTO 1 - -/* Define to 1 if `pseudoflavor' is member of `nfs_args_t'. */ -/* #undef HAVE_NFS_ARGS_T_PSEUDOFLAVOR */ - -/* Define to 1 if `sotype' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_SOTYPE 1 - -/* Define to 1 if `version' is member of `nfs_args_t'. */ -#define HAVE_NFS_ARGS_T_VERSION 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_EXPORT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_NFSMOUNT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_NFS_NFSPROTO_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_NFSV2_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_NFS_CLNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_NFS_GFS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_NFS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_NFS_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NFS_PATHCONF_H */ - -/* define if the host has NFS protocol headers in system headers */ -/* #undef HAVE_NFS_PROT_HEADERS */ - -/* Define to 1 if you have the header file. */ -/* #define HAVE_NFS_RPCV2_H 1 */ - -/* Define to 1 if you have the `nis_domain_of' function. */ -/* #undef HAVE_NIS_DOMAIN_OF */ - -/* Define to 1 if you have the header file. */ -#define HAVE_NSSWITCH_H 1 - -/* Define to 1 if you have the `opendir' function. */ -#define HAVE_OPENDIR 1 - -/* Define to 1 if `dsttime' is member of `pcfs_args_t'. */ -/* #undef HAVE_PCFS_ARGS_T_DSTTIME */ - -/* Define to 1 if `fspec' is member of `pcfs_args_t'. */ -#define HAVE_PCFS_ARGS_T_FSPEC 1 - -/* Define to 1 if `gid' is member of `pcfs_args_t'. */ -#define HAVE_PCFS_ARGS_T_GID 1 - -/* Define to 1 if `mask' is member of `pcfs_args_t'. */ -#define HAVE_PCFS_ARGS_T_MASK 1 - -/* Define to 1 if `dirmask' is member of `pcfs_args_t'. */ -#define HAVE_PCFS_ARGS_T_DIRMASK 1 - -/* Define to 1 if `secondswest' is member of `pcfs_args_t'. */ -/* #undef HAVE_PCFS_ARGS_T_SECONDSWEST */ - -/* Define to 1 if `uid' is member of `pcfs_args_t'. */ -#define HAVE_PCFS_ARGS_T_UID 1 - -/* Define to 1 if you have the `plock' function. */ -/* #undef HAVE_PLOCK */ - -/* Define to 1 if you have the header file. */ -#define HAVE_PWD_H 1 - -/* Define to 1 if you have the `regcomp' function. */ -#define HAVE_REGCOMP 1 - -/* Define to 1 if you have the `regexec' function. */ -#define HAVE_REGEXEC 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_REGEX_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RESOLV_H 1 - -/* Define to 1 if system calls automatically restart after interruption by a - signal. */ -#define HAVE_RESTARTABLE_SYSCALLS 1 - -/* Define to 1 if you have the `rmdir' function. */ -#define HAVE_RMDIR 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_RPCSVC_AUTOFS_PROT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_RPCSVC_MOUNTV3_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_RPCSVC_MOUNT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPCSVC_NFS_PROT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPCSVC_NIS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPCSVC_YPCLNT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPCSVC_YP_PROT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_AUTH_DES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_AUTH_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_PMAP_CLNT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_PMAP_PROT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_RPC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_RPC_XDR_H 1 - -/* Define to 1 if you have the `select' function. */ -#define HAVE_SELECT 1 - -/* Define to 1 if you have the `seteuid' function. */ -#define HAVE_SETEUID 1 - -/* Define to 1 if you have the `setitimer' function. */ -#define HAVE_SETITIMER 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SETJMP_H 1 - -/* Define to 1 if you have the `setresuid' function. */ -#define HAVE_SETRESUID 1 - -/* Define to 1 if you have the `setsid' function. */ -#define HAVE_SETSID 1 - -/* Define to 1 if you have the `sigaction' function. */ -#define HAVE_SIGACTION 1 - -/* Define to 1 if you have the `signal' function. */ -#define HAVE_SIGNAL 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SIGNAL_H 1 - -/* Define to 1 if you have the `sigsuspend' function. */ -#define HAVE_SIGSUSPEND 1 - -/* Define to 1 if you have the `socket' function. */ -#define HAVE_SOCKET 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SOCKETBITS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_STATBUF_H */ - -/* Define to 1 if you have the `statfs' function. */ -#define HAVE_STATFS 1 - -/* Define to 1 if you have the `statvfs' function. */ -#define HAVE_STATVFS 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDARG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strcasecmp' function. */ -#define HAVE_STRCASECMP 1 - -/* Define to 1 if you have the `strchr' function. */ -#define HAVE_STRCHR 1 - -/* Define to 1 if you have the `strcspn' function. */ -#define HAVE_STRCSPN 1 - -/* Define to 1 if you have the `strdup' function. */ -#define HAVE_STRDUP 1 - -/* Define to 1 if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlcat' function. */ -#define HAVE_STRLCAT 1 - -/* Define to 1 if you have the `strlcpy' function. */ -#define HAVE_STRLCPY 1 - -/* Define to 1 if you have the `strspn' function. */ -#define HAVE_STRSPN 1 - -/* Define to 1 if you have the `strstr' function. */ -#define HAVE_STRSTR 1 - -/* Define to 1 if `fhs_fh' is member of `struct fhstatus'. */ -/* #undef HAVE_STRUCT_FHSTATUS_FHS_FH */ - -/* Define to 1 if `ifa_next' is member of `struct ifaddrs'. */ -#define HAVE_STRUCT_IFADDRS_IFA_NEXT 1 - -/* Define to 1 if `ifr_addr' is member of `struct ifreq'. */ -#define HAVE_STRUCT_IFREQ_IFR_ADDR 1 - -/* Define if have struct mntent in one of the standard headers */ -/* #undef HAVE_STRUCT_MNTENT */ - -/* Define if have struct mnttab in one of the standard headers */ -/* #undef HAVE_STRUCT_MNTTAB */ - -/* Define if have struct nfs_args in one of the standard nfs headers */ -#define HAVE_STRUCT_NFS_ARGS 1 - -/* Define if have struct nfs_gfs_mount in one of the standard nfs headers */ -/* #undef HAVE_STRUCT_NFS_GFS_MOUNT */ - -/* Define to 1 if `sa_len' is member of `struct sockaddr'. */ -#define HAVE_STRUCT_SOCKADDR_SA_LEN 1 - -/* Define to 1 if `f_fstypename' is member of `struct statfs'. */ -#define HAVE_STRUCT_STATFS_F_FSTYPENAME 1 - -/* Define to 1 if `devid' is member of `struct umntrequest'. */ -/* #undef HAVE_STRUCT_UMNTREQUEST_DEVID */ - -/* Define to 1 if you have the `svc_getreq' function. */ -#define HAVE_SVC_GETREQ 1 - -/* Define to 1 if you have the `svc_getreqset' function. */ -#define HAVE_SVC_GETREQSET 1 - -/* Define to 1 if you have the `sysfs' function. */ -/* #undef HAVE_SYSFS */ - -/* Define to 1 if you have the `syslog' function. */ -#define HAVE_SYSLOG 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYSLOG_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_CONFIG_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_DG_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_DIR_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_ERRNO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_FILE_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FSID_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FSTYP_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_AUTOFS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_AUTOFS_PROT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_CACHEFS_FS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_EFS_CLNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_NFS_CLNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_NFS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_NFS_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_NFS_NFS_CLNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_PC_FS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_TMP_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_TYPES_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_UFS_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_FS_XFS_CLNT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_IMMU_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_LOCK_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_MACHINE_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_MBUF_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_MMAN_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_MNTCTL_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_MNTENT_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_MNTTAB_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_MOUNT_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_NDIR_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_NETCONFIG_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_PARAM_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_PATHCONF_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_PROC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_RESOURCE_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SEMA_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SIGNAL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKIO_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_STATFS_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STATVFS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SYSCALL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SYSLIMITS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SYSLOG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_TIUSER_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_UCRED_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_UIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_UTSNAME_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_VFS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_VMOUNT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_VNODE_H 1 - -/* Define to 1 if you have that is POSIX.1 compatible. */ -#define HAVE_SYS_WAIT_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_TCPD_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_TIME_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_TIUSER_H */ - -/* Define to 1 if `ta_nodes_max' is member of `tmpfs_args_t'. */ -/* #undef HAVE_TMPFS_ARGS_T_TA_NODES_MAX */ - -/* Define to 1 if `ta_root_gid' is member of `tmpfs_args_t'. */ -/* #undef HAVE_TMPFS_ARGS_T_TA_ROOT_GID */ - -/* Define to 1 if `ta_root_mode' is member of `tmpfs_args_t'. */ -/* #undef HAVE_TMPFS_ARGS_T_TA_ROOT_MODE */ - -/* Define to 1 if `ta_root_uid' is member of `tmpfs_args_t'. */ -/* #undef HAVE_TMPFS_ARGS_T_TA_ROOT_UID */ - -/* Define to 1 if `ta_size_max' is member of `tmpfs_args_t'. */ -/* #undef HAVE_TMPFS_ARGS_T_TA_SIZE_MAX */ - -/* Define to 1 if `ta_version' is member of `tmpfs_args_t'. */ -/* #undef HAVE_TMPFS_ARGS_T_TA_VERSION */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_TMPFS_TMP_H */ - -/* what type of network transport type is in use? TLI or sockets? */ -/* #undef HAVE_TRANSPORT_TYPE_TLI */ - -/* Define to 1 if you have the `ualarm' function. */ -#define HAVE_UALARM 1 - -/* Define to 1 if `anon_gid' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_ANON_GID */ - -/* Define to 1 if `anon_uid' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_ANON_UID */ - -/* Define to 1 if `fspec' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_FSPEC */ - -/* Define to 1 if `gmtoff' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_GMTOFF */ - -/* Define to 1 if `nobody_gid' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_NOBODY_GID */ - -/* Define to 1 if `nobody_uid' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_NOBODY_UID */ - -/* Define to 1 if `sector_size' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_SECTOR_SIZE */ - -/* Define to 1 if `sessionnr' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_SESSIONNR */ - -/* Define to 1 if `udfmflags' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_UDFMFLAGS */ - -/* Define to 1 if `version' is member of `udf_args_t'. */ -/* #undef HAVE_UDF_ARGS_T_VERSION */ - -/* Define to 1 if `flags' is member of `ufs_args_t'. */ -/* #undef HAVE_UFS_ARGS_T_FLAGS */ - -/* Define to 1 if `fspec' is member of `ufs_args_t'. */ -#define HAVE_UFS_ARGS_T_FSPEC 1 - -/* Define to 1 if `ufs_flags' is member of `ufs_args_t'. */ -/* #undef HAVE_UFS_ARGS_T_UFS_FLAGS */ - -/* Define to 1 if `ufs_pgthresh' is member of `ufs_args_t'. */ -/* #undef HAVE_UFS_ARGS_T_UFS_PGTHRESH */ - -/* Define to 1 if you have the header file. */ -#define HAVE_UFS_UFS_EXTATTR_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_UFS_UFS_MOUNT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_UFS_UFS_UFSMOUNT_H 1 - -/* Define to 1 if you have the `umount' function. */ -/* #undef HAVE_UMOUNT */ - -/* Define to 1 if you have the `umount2' function. */ -/* #undef HAVE_UMOUNT2 */ - -/* Define to 1 if you have the `uname' function. */ -#define HAVE_UNAME 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `unmount' function. */ -#define HAVE_UNMOUNT 1 - -/* Define to 1 if you have the `uvmount' function. */ -/* #undef HAVE_UVMOUNT */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_VARARGS_H */ - -/* Define to 1 if you have the `vfork' function. */ -#define HAVE_VFORK 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_VFORK_H */ - -/* Define to 1 if you have the `vfsmount' function. */ -/* #undef HAVE_VFSMOUNT */ - -/* Define to 1 if you have the `vmount' function. */ -/* #undef HAVE_VMOUNT */ - -/* Define to 1 if you have the `vsnprintf' function. */ -#define HAVE_VSNPRINTF 1 - -/* Define to 1 if you have the `wait3' function. */ -#define HAVE_WAIT3 1 - -/* Define to 1 if you have the `waitpid' function. */ -#define HAVE_WAITPID 1 - -/* Define to 1 if `fork' works. */ -#define HAVE_WORKING_FORK 1 - -/* Define to 1 if `vfork' works. */ -#define HAVE_WORKING_VFORK 1 - -/* Define to 1 if you have the `xdr_attrstat' function. */ -#define HAVE_XDR_ATTRSTAT 1 - -/* Define to 1 if you have the `xdr_createargs' function. */ -#define HAVE_XDR_CREATEARGS 1 - -/* Define to 1 if you have the `xdr_dirlist' function. */ -#define HAVE_XDR_DIRLIST 1 - -/* Define to 1 if you have the `xdr_diropargs' function. */ -#define HAVE_XDR_DIROPARGS 1 - -/* Define to 1 if you have the `xdr_diropokres' function. */ -#define HAVE_XDR_DIROPOKRES 1 - -/* Define to 1 if you have the `xdr_diropres' function. */ -#define HAVE_XDR_DIROPRES 1 - -/* Define to 1 if you have the `xdr_dirpath' function. */ -#define HAVE_XDR_DIRPATH 1 - -/* Define to 1 if you have the `xdr_entry' function. */ -#define HAVE_XDR_ENTRY 1 - -/* Define to 1 if you have the `xdr_exportnode' function. */ -#define HAVE_XDR_EXPORTNODE 1 - -/* Define to 1 if you have the `xdr_exports' function. */ -#define HAVE_XDR_EXPORTS 1 - -/* Define to 1 if you have the `xdr_fattr' function. */ -#define HAVE_XDR_FATTR 1 - -/* Define to 1 if you have the `xdr_fhandle' function. */ -#define HAVE_XDR_FHANDLE 1 - -/* Define to 1 if you have the `xdr_fhstatus' function. */ -#define HAVE_XDR_FHSTATUS 1 - -/* Define to 1 if you have the `xdr_filename' function. */ -#define HAVE_XDR_FILENAME 1 - -/* Define to 1 if you have the `xdr_ftype' function. */ -#define HAVE_XDR_FTYPE 1 - -/* Define to 1 if you have the `xdr_groupnode' function. */ -#define HAVE_XDR_GROUPNODE 1 - -/* Define to 1 if you have the `xdr_groups' function. */ -#define HAVE_XDR_GROUPS 1 - -/* Define to 1 if you have the `xdr_linkargs' function. */ -#define HAVE_XDR_LINKARGS 1 - -/* Define to 1 if you have the `xdr_mountbody' function. */ -#define HAVE_XDR_MOUNTBODY 1 - -/* Define to 1 if you have the `xdr_mountlist' function. */ -#define HAVE_XDR_MOUNTLIST 1 - -/* Define to 1 if you have the `xdr_name' function. */ -#define HAVE_XDR_NAME 1 - -/* Define to 1 if you have the `xdr_nfscookie' function. */ -#define HAVE_XDR_NFSCOOKIE 1 - -/* Define to 1 if you have the `xdr_nfspath' function. */ -#define HAVE_XDR_NFSPATH 1 - -/* Define to 1 if you have the `xdr_nfsstat' function. */ -#define HAVE_XDR_NFSSTAT 1 - -/* Define to 1 if you have the `xdr_nfstime' function. */ -#define HAVE_XDR_NFSTIME 1 - -/* Define to 1 if you have the `xdr_nfs_fh' function. */ -#define HAVE_XDR_NFS_FH 1 - -/* Define to 1 if you have the `xdr_pointer' function. */ -#define HAVE_XDR_POINTER 1 - -/* Define to 1 if you have the `xdr_readargs' function. */ -#define HAVE_XDR_READARGS 1 - -/* Define to 1 if you have the `xdr_readdirargs' function. */ -#define HAVE_XDR_READDIRARGS 1 - -/* Define to 1 if you have the `xdr_readdirres' function. */ -#define HAVE_XDR_READDIRRES 1 - -/* Define to 1 if you have the `xdr_readlinkres' function. */ -#define HAVE_XDR_READLINKRES 1 - -/* Define to 1 if you have the `xdr_readokres' function. */ -#define HAVE_XDR_READOKRES 1 - -/* Define to 1 if you have the `xdr_readres' function. */ -#define HAVE_XDR_READRES 1 - -/* Define to 1 if you have the `xdr_renameargs' function. */ -#define HAVE_XDR_RENAMEARGS 1 - -/* Define to 1 if you have the `xdr_sattr' function. */ -#define HAVE_XDR_SATTR 1 - -/* Define to 1 if you have the `xdr_sattrargs' function. */ -#define HAVE_XDR_SATTRARGS 1 - -/* Define to 1 if you have the `xdr_statfsokres' function. */ -#define HAVE_XDR_STATFSOKRES 1 - -/* Define to 1 if you have the `xdr_statfsres' function. */ -#define HAVE_XDR_STATFSRES 1 - -/* Define to 1 if you have the `xdr_symlinkargs' function. */ -#define HAVE_XDR_SYMLINKARGS 1 - -/* Define to 1 if you have the `xdr_u_int64_t' function. */ -#define HAVE_XDR_U_INT64_T 1 - -/* Define to 1 if you have the `xdr_writeargs' function. */ -#define HAVE_XDR_WRITEARGS 1 - -/* Define to 1 if `flags' is member of `xfs_args_t'. */ -/* #undef HAVE_XFS_ARGS_T_FLAGS */ - -/* Define to 1 if `fspec' is member of `xfs_args_t'. */ -/* #undef HAVE_XFS_ARGS_T_FSPEC */ - -/* Define to 1 if you have the `yp_all' function. */ -/* #undef HAVE_YP_ALL */ - -/* Define to 1 if you have the `yp_get_default_domain' function. */ -#define HAVE_YP_GET_DEFAULT_DOMAIN 1 - -/* Define to 1 if you have the `_seterr_reply' function. */ -#define HAVE__SETERR_REPLY 1 - -/* Define to 1 if you have the `__rpc_get_local_uid' function. */ -#define HAVE___RPC_GET_LOCAL_UID 1 - -/* Define to 1 if you have the `__seterr_reply' function. */ -/* #undef HAVE___SETERR_REPLY */ - -/* Name of mount type to hide amd mount from df(1) */ -#define HIDE_MOUNT_TYPE "nfs" - -/* Define name of host machine's architecture (eg. sun4) */ -/* #define HOST_ARCH "i386" */ - -/* Define name of host machine's cpu (eg. sparc) */ -/* #define HOST_CPU "i386" */ - -/* Define the header version of (linux) hosts (eg. 2.2.10) */ -// #undef define HOST_HEADER_VERSION */ - -/* Define name of host */ -/* #define HOST_NAME "trang.nuxi.org" */ - -/* Define name and version of host machine (eg. solaris2.5.1) */ -/* #define HOST_OS "freebsd12.0" */ - -/* Define only name of host machine OS (eg. solaris2) */ -/* #define HOST_OS_NAME "freebsd12" */ - -/* Define only version of host machine (eg. 2.5.1) */ -/* #define HOST_OS_VERSION "12.0" */ - -/* Define name of host machine's vendor (eg. sun) */ -#define HOST_VENDOR "undermydesk" - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define LT_OBJDIR ".libs/" - -/* Ignore permission bits */ -/* #undef MNT2_CDFS_OPT_DEFPERM */ - -/* Enable external attributes */ -#define MNT2_CDFS_OPT_EXTATT 0x4 - -/* Show file generations */ -#define MNT2_CDFS_OPT_GENS 0x2 - -/* Disable filename case translation */ -/* #undef MNT2_CDFS_OPT_NOCASETRANS */ - -/* Use on-disk permission bits */ -/* #undef MNT2_CDFS_OPT_NODEFPERM */ - -/* Disable Joliet extensions */ -#define MNT2_CDFS_OPT_NOJOLIET 0x8 - -/* Disable Rock Ridge Interchange Protocol (RRIP) extensions */ -#define MNT2_CDFS_OPT_NORRIP 0x1 - -/* Strip off extension from version string */ -/* #undef MNT2_CDFS_OPT_NOVERSION */ - -/* Enable Rock Ridge Interchange Protocol (RRIP) case insensitive filename - extensions */ -/* #undef MNT2_CDFS_OPT_RRCASEINS */ - -/* Use Rock Ridge Interchange Protocol (RRIP) extensions */ -/* #undef MNT2_CDFS_OPT_RRIP */ - -/* asynchronous filesystem access */ -#define MNT2_GEN_OPT_ASYNC 0x40 - -/* automounter filesystem (ignore) flag, used in bsdi-4.1 */ -/* #undef MNT2_GEN_OPT_AUTOMNTFS */ - -/* automounter filesystem flag, used in Mac OS X / Darwin */ -/* #undef MNT2_GEN_OPT_AUTOMOUNTED */ - -/* directory hardlink */ -/* #undef MNT2_GEN_OPT_BIND */ - -/* cache (what?) */ -/* #undef MNT2_GEN_OPT_CACHE */ - -/* 6-argument mount */ -/* #undef MNT2_GEN_OPT_DATA */ - -/* Use a lazy unmount (detach) */ -/* #undef MNT2_GEN_OPT_DETACH */ - -/* Use a forced unmount */ -#define MNT2_GEN_OPT_FORCE 0x80000 - -/* old (4-argument) mount (compatibility) */ -/* #undef MNT2_GEN_OPT_FSS */ - -/* old BSD group-id on create */ -/* #undef MNT2_GEN_OPT_GRPID */ - -/* ignore mount entry in df output */ -#define MNT2_GEN_OPT_IGNORE 0x800000 - -/* journaling filesystem (AIX's UFS/FFS) */ -/* #undef MNT2_GEN_OPT_JFS */ - -/* honor mandatory locking requests */ -/* #undef MNT2_GEN_OPT_MANDLOCK */ - -/* do multi-component lookup on files */ -/* #undef MNT2_GEN_OPT_MULTI */ - -/* use type string instead of int */ -/* #undef MNT2_GEN_OPT_NEWTYPE */ - -/* NFS mount */ -/* #undef MNT2_GEN_OPT_NFS */ - -/* don't update access times */ -#define MNT2_GEN_OPT_NOATIME 0x10000000 - -/* nocache (what?) */ -/* #undef MNT2_GEN_OPT_NOCACHE */ - -/* do not interpret special device files */ -#define MNT2_GEN_OPT_NODEV 0x0 - -/* don't update directory access times */ -/* #undef MNT2_GEN_OPT_NODIRATIME */ - -/* no exec calls allowed */ -#define MNT2_GEN_OPT_NOEXEC 0x4 - -/* do not interpret special device files */ -/* #undef MNT2_GEN_OPT_NONDEV */ - -/* Disallow mounts beneath this mount */ -/* #undef MNT2_GEN_OPT_NOSUB */ - -/* Setuid programs disallowed */ -#define MNT2_GEN_OPT_NOSUID 0x8 - -/* Return ENAMETOOLONG for long filenames */ -/* #undef MNT2_GEN_OPT_NOTRUNC */ - -/* Pass mount option string to kernel */ -/* #undef MNT2_GEN_OPT_OPTIONSTR */ - -/* allow overlay mounts */ -/* #undef MNT2_GEN_OPT_OVERLAY */ - -/* check quotas */ -#define MNT2_GEN_OPT_QUOTA 0x2000 - -/* Read-only */ -#define MNT2_GEN_OPT_RDONLY 0x1 - -/* change options on an existing mount */ -/* #undef MNT2_GEN_OPT_REMOUNT */ - -/* read only */ -/* #undef MNT2_GEN_OPT_RONLY */ - -/* synchronize data immediately to filesystem */ -/* #undef MNT2_GEN_OPT_SYNC */ - -/* synchronous filesystem access (same as SYNC) */ -#define MNT2_GEN_OPT_SYNCHRONOUS 0x2 - -/* Mount with Sys 5-specific semantics */ -/* #undef MNT2_GEN_OPT_SYS5 */ - -/* Union mount */ -#define MNT2_GEN_OPT_UNION 0x20 - -/* set max secs for dir attr cache */ -#define MNT2_NFS_OPT_ACDIRMAX 0x200000 - -/* set min secs for dir attr cache */ -#define MNT2_NFS_OPT_ACDIRMIN 0x100000 - -/* set max secs for file attr cache */ -#define MNT2_NFS_OPT_ACREGMAX 0x80000 - -/* set min secs for file attr cache */ -#define MNT2_NFS_OPT_ACREGMIN 0x40000 - -/* Authentication error */ -/* #undef MNT2_NFS_OPT_AUTHERR */ - -/* hide mount type from df(1) */ -/* #undef MNT2_NFS_OPT_AUTO */ - -/* Linux broken setuid */ -/* #undef MNT2_NFS_OPT_BROKEN_SUID */ - -/* set dead server retry thresh */ -#define MNT2_NFS_OPT_DEADTHRESH 0x4000 - -/* Dismount in progress */ -/* #undef MNT2_NFS_OPT_DISMINPROG */ - -/* Dismounted */ -/* #undef MNT2_NFS_OPT_DISMNT */ - -/* Don't estimate rtt dynamically */ -#define MNT2_NFS_OPT_DUMBTIMR 0x800 - -/* provide name of server's fs to system */ -/* #undef MNT2_NFS_OPT_FSNAME */ - -/* System V-style gid inheritance */ -/* #undef MNT2_NFS_OPT_GRPID */ - -/* Has authenticator */ -/* #undef MNT2_NFS_OPT_HASAUTH */ - -/* set hostname for error printf */ -/* #undef MNT2_NFS_OPT_HOSTNAME */ - -/* ignore mount point */ -/* #undef MNT2_NFS_OPT_IGNORE */ - -/* allow interrupts on hard mount */ -#define MNT2_NFS_OPT_INT 0x40 - -/* Bits set internally */ -/* #undef MNT2_NFS_OPT_INTERNAL */ - -/* allow interrupts on hard mount */ -/* #undef MNT2_NFS_OPT_INTR */ - -/* Use Kerberos authentication */ -/* #undef MNT2_NFS_OPT_KERB */ - -/* use kerberos credentials */ -/* #undef MNT2_NFS_OPT_KERBEROS */ - -/* transport's knetconfig structure */ -/* #undef MNT2_NFS_OPT_KNCONF */ - -/* set lease term (nqnfs) */ -/* #undef MNT2_NFS_OPT_LEASETERM */ - -/* Local locking (no lock manager) */ -/* #undef MNT2_NFS_OPT_LLOCK */ - -/* set maximum grouplist size */ -#define MNT2_NFS_OPT_MAXGRPS 0x20 - -/* Mnt server for mnt point */ -/* #undef MNT2_NFS_OPT_MNTD */ - -/* Assume writes were mine */ -/* #undef MNT2_NFS_OPT_MYWRITE */ - -/* mount NFS Version 3 */ -#define MNT2_NFS_OPT_NFSV3 0x200 - -/* don't cache attributes */ -/* #undef MNT2_NFS_OPT_NOAC */ - -/* does not support Access Control Lists */ -/* #undef MNT2_NFS_OPT_NOACL */ - -/* Don't Connect the socket */ -#define MNT2_NFS_OPT_NOCONN 0x80 - -/* no close-to-open consistency */ -#define MNT2_NFS_OPT_NOCTO 0x20000000 - -/* disallow interrupts on hard mounts */ -/* #undef MNT2_NFS_OPT_NOINT */ - -/* Don't use locking */ -/* #undef MNT2_NFS_OPT_NONLM */ - -/* does not support readdir+ */ -/* #undef MNT2_NFS_OPT_NORDIRPLUS */ - -/* Get lease for lookup */ -/* #undef MNT2_NFS_OPT_NQLOOKLEASE */ - -/* Use Nqnfs protocol */ -/* #undef MNT2_NFS_OPT_NQNFS */ - -/* paging threshold */ -/* #undef MNT2_NFS_OPT_PGTHRESH */ - -/* static pathconf kludge info */ -/* #undef MNT2_NFS_OPT_POSIX */ - -/* Use local locking */ -/* #undef MNT2_NFS_OPT_PRIVATE */ - -/* allow property list operations (ACLs over NFS) */ -/* #undef MNT2_NFS_OPT_PROPLIST */ - -/* Rcv socket lock */ -/* #undef MNT2_NFS_OPT_RCVLOCK */ - -/* Do lookup with readdir (nqnfs) */ -/* #undef MNT2_NFS_OPT_RDIRALOOK */ - -/* Use Readdirplus for NFSv3 */ -#define MNT2_NFS_OPT_RDIRPLUS 0x10000 - -/* set read ahead */ -#define MNT2_NFS_OPT_READAHEAD 0x2000 - -/* Set readdir size */ -#define MNT2_NFS_OPT_READDIRSIZE 0x20000 - -/* Allocate a reserved port */ -#define MNT2_NFS_OPT_RESVPORT 0x8000 - -/* set number of request retries */ -#define MNT2_NFS_OPT_RETRANS 0x10 - -/* read only */ -/* #undef MNT2_NFS_OPT_RONLY */ - -/* use RPC to do secure NFS time sync */ -/* #undef MNT2_NFS_OPT_RPCTIMESYNC */ - -/* set read size */ -#define MNT2_NFS_OPT_RSIZE 0x4 - -/* secure mount */ -/* #undef MNT2_NFS_OPT_SECURE */ - -/* Send socket lock */ -/* #undef MNT2_NFS_OPT_SNDLOCK */ - -/* soft mount (hard is default) */ -#define MNT2_NFS_OPT_SOFT 0x1 - -/* spongy mount */ -/* #undef MNT2_NFS_OPT_SPONGY */ - -/* Reserved for nfsv4 */ -/* #undef MNT2_NFS_OPT_STRICTLOCK */ - -/* set symlink cache time-to-live */ -/* #undef MNT2_NFS_OPT_SYMTTL */ - -/* use TCP for mounts */ -/* #undef MNT2_NFS_OPT_TCP */ - -/* set initial timeout */ -#define MNT2_NFS_OPT_TIMEO 0x8 - -/* do not use shared cache for all mountpoints */ -/* #undef MNT2_NFS_OPT_UNSHARED */ - -/* linux NFSv3 */ -/* #undef MNT2_NFS_OPT_VER3 */ - -/* Wait for authentication */ -/* #undef MNT2_NFS_OPT_WAITAUTH */ - -/* Wants an authenticator */ -/* #undef MNT2_NFS_OPT_WANTAUTH */ - -/* Want receive socket lock */ -/* #undef MNT2_NFS_OPT_WANTRCV */ - -/* Want send socket lock */ -/* #undef MNT2_NFS_OPT_WANTSND */ - -/* set write size */ -#define MNT2_NFS_OPT_WSIZE 0x2 - -/* 32<->64 dir cookie translation */ -/* #undef MNT2_NFS_OPT_XLATECOOKIE */ - -/* Force Win95 long names */ -#define MNT2_PCFS_OPT_LONGNAME 0x2 - -/* Completely ignore Win95 entries */ -#define MNT2_PCFS_OPT_NOWIN95 0x4 - -/* Force old DOS short names only */ -#define MNT2_PCFS_OPT_SHORTNAME 0x1 - -/* Name of mount table file name */ -/* #undef MNTTAB_FILE_NAME */ - -/* Mount Table option string: Max attr cache timeout (dirs) */ -/* #undef MNTTAB_OPT_ACDIRMAX */ - -/* Mount Table option string: Min attr cache timeout (dirs) */ -/* #undef MNTTAB_OPT_ACDIRMIN */ - -/* Mount Table option string: Max attr cache timeout (files) */ -/* #undef MNTTAB_OPT_ACREGMAX */ - -/* Mount Table option string: Min attr cache timeout (files) */ -/* #undef MNTTAB_OPT_ACREGMIN */ - -/* Mount Table option string: Attr cache timeout (sec) */ -/* #undef MNTTAB_OPT_ACTIMEO */ - -/* Mount Table option string: Do mount retries in background */ -/* #undef MNTTAB_OPT_BG */ - -/* Mount Table option string: compress */ -/* #undef MNTTAB_OPT_COMPRESS */ - -/* Mount Table option string: Device id of mounted fs */ -/* #undef MNTTAB_OPT_DEV */ - -/* Mount Table option string: Automount direct map mount */ -/* #undef MNTTAB_OPT_DIRECT */ - -/* Mount Table option string: Do mount retries in foreground */ -/* #undef MNTTAB_OPT_FG */ - -/* Mount Table option string: Filesystem id of mounted fs */ -/* #undef MNTTAB_OPT_FSID */ - -/* Mount Table option string: SysV-compatible gid on create */ -/* #undef MNTTAB_OPT_GRPID */ - -/* Mount Table option string: Hard mount */ -/* #undef MNTTAB_OPT_HARD */ - -/* Mount Table option string: Ignore this entry */ -/* #undef MNTTAB_OPT_IGNORE */ - -/* Mount Table option string: Automount indirect map mount */ -/* #undef MNTTAB_OPT_INDIRECT */ - -/* Mount Table option string: Allow NFS ops to be interrupted */ -/* #undef MNTTAB_OPT_INTR */ - -/* Mount Table option string: Secure (AUTH_Kerb) mounting */ -/* #undef MNTTAB_OPT_KERB */ - -/* Mount Table option string: Local locking (no lock manager) */ -/* #undef MNTTAB_OPT_LLOCK */ - -/* Force Win95 long names */ -/* #undef MNTTAB_OPT_LONGNAME */ - -/* Mount Table option string: Automount map */ -/* #undef MNTTAB_OPT_MAP */ - -/* Mount Table option string: max groups */ -/* #undef MNTTAB_OPT_MAXGROUPS */ - -/* Mount Table option string: Do multi-component lookup */ -/* #undef MNTTAB_OPT_MULTI */ - -/* Mount Table option string: Don't cache attributes at all */ -/* #undef MNTTAB_OPT_NOAC */ - -/* Access Control Lists are not supported */ -/* #undef MNTTAB_OPT_NOACL */ - -/* Mount Table option string: No auto (what?) */ -/* #undef MNTTAB_OPT_NOAUTO */ - -/* Mount Table option string: No connection */ -/* #undef MNTTAB_OPT_NOCONN */ - -/* Mount Table option string: No close-to-open consistency */ -/* #undef MNTTAB_OPT_NOCTO */ - -/* Mount Table option string: Don't allow interrupted ops */ -/* #undef MNTTAB_OPT_NOINTR */ - -/* Mount Table option string: Don't check quotas */ -/* #undef MNTTAB_OPT_NOQUOTA */ - -/* Mount Table option string: Do no allow setting sec attrs */ -/* #undef MNTTAB_OPT_NOSETSEC */ - -/* Mount Table option string: Disallow mounts on subdirs */ -/* #undef MNTTAB_OPT_NOSUB */ - -/* Mount Table option string: Set uid not allowed */ -/* #undef MNTTAB_OPT_NOSUID */ - -/* Completely ignore Win95 entries */ -/* #undef MNTTAB_OPT_NOWIN95 */ - -/* Mount Table option string: action to taken on error */ -/* #undef MNTTAB_OPT_ONERROR */ - -/* Mount Table option string: paging threshold */ -/* #undef MNTTAB_OPT_PGTHRESH */ - -/* Mount Table option string: NFS server IP port number */ -/* #undef MNTTAB_OPT_PORT */ - -/* Mount Table option string: Get static pathconf for mount */ -/* #undef MNTTAB_OPT_POSIX */ - -/* Mount Table option string: Use local locking */ -/* #undef MNTTAB_OPT_PRIVATE */ - -/* Mount Table option string: support property lists (ACLs) */ -/* #undef MNTTAB_OPT_PROPLIST */ - -/* Mount Table option string: protocol network_id indicator */ -/* #undef MNTTAB_OPT_PROTO */ - -/* Mount Table option string: Check quotas */ -/* #undef MNTTAB_OPT_QUOTA */ - -/* Mount Table option string: Change mount options */ -/* #undef MNTTAB_OPT_REMOUNT */ - -/* Mount Table option string: Max retransmissions (soft mnts) */ -/* #undef MNTTAB_OPT_RETRANS */ - -/* Mount Table option string: Number of mount retries */ -/* #undef MNTTAB_OPT_RETRY */ - -/* Mount Table option string: Read only */ -/* #undef MNTTAB_OPT_RO */ - -/* Mount Table option string: Read/write with quotas */ -/* #undef MNTTAB_OPT_RQ */ - -/* Mount Table option string: Max NFS read size (bytes) */ -/* #undef MNTTAB_OPT_RSIZE */ - -/* Mount Table option string: Read/write */ -/* #undef MNTTAB_OPT_RW */ - -/* Mount Table option string: Secure (AUTH_DES) mounting */ -/* #undef MNTTAB_OPT_SECURE */ - -/* Force old DOS short names only */ -/* #undef MNTTAB_OPT_SHORTNAME */ - -/* Mount Table option string: Soft mount */ -/* #undef MNTTAB_OPT_SOFT */ - -/* Mount Table option string: spongy mount */ -/* #undef MNTTAB_OPT_SPONGY */ - -/* Mount Table option string: Set uid allowed */ -/* #undef MNTTAB_OPT_SUID */ - -/* Mount Table option string: set symlink cache time-to-live */ -/* #undef MNTTAB_OPT_SYMTTL */ - -/* Mount Table option string: Synchronous local directory ops */ -/* #undef MNTTAB_OPT_SYNCDIR */ - -/* Mount Table option string: NFS timeout (1/10 sec) */ -/* #undef MNTTAB_OPT_TIMEO */ - -/* Mount Table option string: min. time between inconsistencies */ -/* #undef MNTTAB_OPT_TOOSOON */ - -/* Mount Table option string: protocol version number indicator */ -/* #undef MNTTAB_OPT_VERS */ - -/* Mount Table option string: Max NFS write size (bytes) */ -/* #undef MNTTAB_OPT_WSIZE */ - -/* Mount-table entry name for AUTOFS filesystem */ -/* #undef MNTTAB_TYPE_AUTOFS */ - -/* Mount-table entry name for CACHEFS filesystem */ -/* #undef MNTTAB_TYPE_CACHEFS */ - -/* Mount-table entry name for CDFS filesystem */ -#define MNTTAB_TYPE_CDFS "cd9660" - -/* Mount-table entry name for CFS (crypto) filesystem */ -/* #undef MNTTAB_TYPE_CFS */ - -/* Mount-table entry name for EFS filesystem (irix) */ -/* #undef MNTTAB_TYPE_EFS */ - -/* Mount-table entry name for EXT2 filesystem (linux) */ -/* #undef MNTTAB_TYPE_EXT2 */ - -/* Mount-table entry name for EXT3 filesystem (linux) */ -/* #undef MNTTAB_TYPE_EXT3 */ - -/* Mount-table entry name for EXT4 filesystem (linux) */ -/* #undef MNTTAB_TYPE_EXT4 */ - -/* Mount-table entry name for FFS filesystem */ -/* #undef MNTTAB_TYPE_FFS */ - -/* Mount-table entry name for LOFS filesystem */ -/* #undef MNTTAB_TYPE_LOFS */ - -/* Mount-table entry name for LUSTRE filesystem */ -/* #undef MNTTAB_TYPE_LUSTRE */ - -/* Mount-table entry name for MFS filesystem */ -#define MNTTAB_TYPE_MFS "mfs" - -/* Mount-table entry name for NFS filesystem */ -#define MNTTAB_TYPE_NFS "nfs" - -/* Mount-table entry name for NFS3 filesystem */ -#define MNTTAB_TYPE_NFS3 "nfs" - -/* Mount-table entry name for NFS4 filesystem */ -#define MNTTAB_TYPE_NFS4 "nfs" - -/* Mount-table entry name for NULLFS (loopback on bsd44) filesystem */ -#define MNTTAB_TYPE_NULLFS "nullfs" - -/* Mount-table entry name for PCFS filesystem */ -#define MNTTAB_TYPE_PCFS "msdosfs" - -/* Mount-table entry name for TFS filesystem */ -/* #undef MNTTAB_TYPE_TFS */ - -/* Mount(2) type/name for TMPFS filesystem */ -#define MNTTAB_TYPE_TMPFS "tmpfs" - -/* Mount(2) type/name for UDF filesystem */ -#define MNTTAB_TYPE_UDF "udf" - -/* Mount-table entry name for UFS filesystem */ -#define MNTTAB_TYPE_UFS "ufs" - -/* Mount-table entry name for UMAPFS (uid/gid mapping) filesystem */ -/* #undef MNTTAB_TYPE_UMAPFS */ - -/* Mount-table entry name for UNIONFS filesystem */ -#define MNTTAB_TYPE_UNIONFS "unionfs" - -/* Mount-table entry name for XFS filesystem (irix) */ -/* #undef MNTTAB_TYPE_XFS */ - -/* Define if mount table is on file, undefine if in kernel */ -/* #undef MOUNT_TABLE_ON_FILE */ - -/* Mount(2) type/name for AUTOFS filesystem */ -/* #undef MOUNT_TYPE_AUTOFS */ - -/* Mount(2) type/name for CACHEFS filesystem */ -/* #undef MOUNT_TYPE_CACHEFS */ - -/* Mount(2) type/name for CDFS filesystem */ -#define MOUNT_TYPE_CDFS "cd9660" - -/* Mount(2) type/name for CFS (crypto) filesystem */ -/* #undef MOUNT_TYPE_CFS */ - -/* Mount(2) type/name for EFS filesystem (irix) */ -/* #undef MOUNT_TYPE_EFS */ - -/* Mount(2) type/name for EXT2 filesystem (linux) */ -/* #undef MOUNT_TYPE_EXT2 */ - -/* Mount(2) type/name for EXT3 filesystem (linux) */ -/* #undef MOUNT_TYPE_EXT3 */ - -/* Mount(2) type/name for EXT4 filesystem (linux) */ -/* #undef MOUNT_TYPE_EXT4 */ - -/* Mount(2) type/name for FFS filesystem */ -/* #undef MOUNT_TYPE_FFS */ - -/* Mount(2) type/name for IGNORE filesystem (not real just ignore for df) */ -#define MOUNT_TYPE_IGNORE MNT_IGNORE - -/* Mount(2) type/name for LOFS filesystem */ -/* #undef MOUNT_TYPE_LOFS */ - -/* Mount(2) type/name for MFS filesystem */ -#define MOUNT_TYPE_MFS "mfs" - -/* Mount(2) type/name for NFS filesystem */ -#define MOUNT_TYPE_NFS "nfs" - -/* Mount(2) type/name for NFS3 filesystem */ -#define MOUNT_TYPE_NFS3 MOUNT_NFS3 - -/* Mount(2) type/name for NFS4 filesystem */ -/* #undef MOUNT_TYPE_NFS4 */ - -/* Mount(2) type/name for NULLFS (loopback on bsd44) filesystem */ -#define MOUNT_TYPE_NULLFS "nullfs" - -/* Mount(2) type/name for PCFS filesystem. XXX: conf/trap/trap_hpux.h may - override this definition for HPUX 9.0 */ -#define MOUNT_TYPE_PCFS "msdosfs" - -/* Mount(2) type/name for TFS filesystem */ -#define MOUNT_TYPE_TMPFS "tmpfs" - -/* Mount(2) type/name for UDF filesystem */ -#define MOUNT_TYPE_UDF "udf" - -/* Mount(2) type/name for TMPFS filesystem */ -/* #undef MOUNT_TYPE_TMPFS */ - -/* Mount(2) type/name for UFS filesystem */ -#define MOUNT_TYPE_UFS "ufs" - -/* Mount(2) type/name for UMAPFS (uid/gid mapping) filesystem */ -/* #undef MOUNT_TYPE_UMAPFS */ - -/* Mount(2) type/name for UNIONFS filesystem */ -#define MOUNT_TYPE_UNIONFS MNT_UNION - -/* Mount(2) type/name for XFS filesystem (irix) */ -/* #undef MOUNT_TYPE_XFS */ - -/* The string used in printf to print the mount-type field of mount(2) */ -#define MTYPE_PRINTF_TYPE "%s" - -/* Type of the mount-type field in the mount() system call */ -#define MTYPE_TYPE char * - -/* does libwrap expect caller to define the variables allow_severity and - deny_severity */ -/* #undef NEED_LIBWRAP_SEVERITY_VARIABLES */ - -/* Defined to the header file containing ndbm-compatible definitions */ -#define NEW_DBM_H - -/* Define the field name for the filehandle within nfs_args_t */ -#define NFS_FH_FIELD fh - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -/* #undef NO_MINUS_C_MINUS_O */ - -/* Name of package */ -#define PACKAGE "am-utils" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "https://bugzilla.am-utils.org/ or am-utils@am-utils.org" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "am-utils" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "am-utils 6.2" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "am-utils" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "6.2" - -/* Type of the 6th argument to recvfrom() */ -#define RECVFROM_FROMLEN_TYPE socklen_t - -/* should signal handlers be reinstalled? */ -/* #undef REINSTALL_SIGNAL_HANDLER */ - -/* Define as the return type of signal handlers (`int' or `void'). */ -#define RETSIGTYPE void - -/* Define to 1 if the `setpgrp' function takes no argument. */ -/* #undef SETPGRP_VOID */ - -/* Define to 1 if the `S_IS*' macros in do not work properly. */ -/* #undef STAT_MACROS_BROKEN */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define the type of the 3rd argument ('in') to svc_getargs() */ -#define SVC_IN_ARG_TYPE caddr_t - -/* Define to 1 if you can safely include both and . */ -#define TIME_WITH_SYS_TIME 1 - -/* Define to 1 if your declares `struct tm'. */ -/* #undef TM_IN_SYS_TIME */ - -/* Define user name */ -/* #define USER_NAME "cy" */ - -/* define if must NOT use NFS "noconn" option */ -#define USE_CONNECTED_NFS_SOCKETS 1 - -/* Enable extensions on AIX 3, Interix. */ -#ifndef _ALL_SOURCE -# define _ALL_SOURCE 1 -#endif -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -#endif -/* Enable threading extensions on Solaris. */ -#ifndef _POSIX_PTHREAD_SEMANTICS -# define _POSIX_PTHREAD_SEMANTICS 1 -#endif -/* Enable extensions on HP NonStop. */ -#ifndef _TANDEM_SOURCE -# define _TANDEM_SOURCE 1 -#endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# define __EXTENSIONS__ 1 -#endif - -/* define if must use NFS "noconn" option */ -/* #undef USE_UNCONNECTED_NFS_SOCKETS */ - -/* Version number of package */ -#define VERSION "6.2" - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -/* # undef WORDS_BIGENDIAN */ -# endif -#endif - -/* Define to the type of xdr procedure type */ -#define XDRPROC_T_TYPE xdrproc_t - -/* Type of the 3rd argument to yp_order() */ -#define YP_ORDER_OUTORDER_TYPE int - -/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a - `char[]'. */ -#define YYTEXT_POINTER 1 - -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -/* #undef _FILE_OFFSET_BITS */ - -/* Define for large files, on AIX-style hosts. */ -/* #undef _LARGE_FILES */ - -/* Define to 1 if on MINIX. */ -/* #undef _MINIX */ - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -/* #undef _POSIX_1_SOURCE */ - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -/* #undef _POSIX_SOURCE */ - -/* Define a type/structure for an NFS V2 filehandle */ -#define am_nfs_fh nfs_fh - -/* Define a type/structure for an NFS V3 filehandle */ -#define am_nfs_fh3 nfs_fh3_freebsd3 - -/* Define a type for the autofs_args structure */ -/* #undef autofs_args_t */ - -/* Define a type for the cachefs_args structure */ -/* #undef cachefs_args_t */ - -/* Define a type for the cdfs_args structure */ -#define cdfs_args_t struct iso_args - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Define a type for the efs_args structure */ -/* #undef efs_args_t */ - -/* Define to `int' if doesn't define. */ -/* #undef gid_t */ - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -/* #undef inline */ -#endif - -/* Define a type for the lofs_args structure */ -/* #undef lofs_args_t */ - -/* Define a type for the mfs_args structure */ -/* #undef mfs_args_t */ - -/* Define to `int' if does not define. */ -/* #undef mode_t */ - -/* Define a type for the nfs_args structure */ -#define nfs_args_t struct nfs_args - -/* Define a type for the pcfs_args structure */ -#define pcfs_args_t struct msdosfs_args - -/* Define to `int' if does not define. */ -/* #undef pid_t */ - -/* Check if pte_t is defined in */ -/* #undef pte_t */ - -/* Define a type for the rfs_args structure */ -/* #undef rfs_args_t */ - -/* Check if rpcvers_t is defined in */ -/* #undef rpcvers_t */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to `long' if does not define. */ -/* #undef time_t */ - -/* Define a type for the tmpfs_args structure */ -/* #undef tmpfs_args_t */ - -/* Define a type for the udf_args structure */ -/* #undef udf_args_t */ - -/* Define a type for the ufs_args structure */ -#define ufs_args_t struct ufs_args - -/* Define to `int' if doesn't define. */ -/* #undef uid_t */ - -/* Define as `fork' if `vfork' does not work. */ -/* #undef vfork */ - -/* Define to "void *" if compiler can handle, otherwise "char *" */ -#define voidp void * - -/* Define to empty if the keyword `volatile' does not work. Warning: valid - code using `volatile' can become incorrect without. Disable with care. */ -/* #undef volatile */ - -/* Define a type for the xfs_args structure */ -/* #undef xfs_args_t */ - - -/****************************************************************************/ -/*** INCLUDE localconfig.h if it exists, to allow users to make some ***/ -/*** compile time configuration changes. ***/ -/****************************************************************************/ -/* does a local configuration file exist? */ -/* #undef HAVE_LOCALCONFIG_H */ -#ifdef HAVE_LOCALCONFIG_H -# include -#endif /* HAVE_LOCALCONFIG_H */ - -#endif /* not _CONFIG_H */ - -/* - * Local Variables: - * mode: c - * End: - */ - -/* End of am-utils-6.x config.h file */ Index: usr.sbin/amd/include/newvers.sh =================================================================== --- usr.sbin/amd/include/newvers.sh +++ /dev/null @@ -1,34 +0,0 @@ -# $NetBSD: mkconf,v 1.1.1.1 1997/07/24 21:20:12 christos Exp $ -# $FreeBSD$ -# mkconf -# Generate local configuration parameters for amd -# - -if [ -e $1 ]; then - eval `LC_ALL=C egrep '^[A-Z]+=' $1 | grep -v COPYRIGHT` - OS=`echo ${TYPE} | LC_ALL=C tr 'A-Z' 'a-z'` - echo '/* Define name and version of host machine (eg. solaris2.5.1) */' - echo "#define HOST_OS \"${OS}${REVISION}\"" - echo '/* Define only name of host machine OS (eg. solaris2) */' - echo "#define HOST_OS_NAME \"${OS}${REVISION}\"" \ - | sed -e 's/\.[-._0-9]*//' - echo '/* Define only version of host machine (eg. 2.5.1) */' - echo "#define HOST_OS_VERSION \"${REVISION}\"" -else -cat << __NO_newvers_sh - -/* Define name and version of host machine (eg. solaris2.5.1) */ -#define HOST_OS "`uname -s | LC_ALL=C tr 'A-Z' 'a-z'``uname -r`" - -/* Define only name of host machine OS (eg. solaris2) */ -#define HOST_OS_NAME "`uname -s | LC_ALL=C tr 'A-Z' 'a-z'``uname -r | sed -e 's/\..*$//'`" - -/* Define only version of host machine (eg. 2.5.1) */ -#define HOST_OS_VERSION "`uname -r | sed -e 's/[-([:alpha:]].*//'`" - -__NO_newvers_sh -fi - -cat << __EOF - -__EOF Index: usr.sbin/amd/libamu/Makefile =================================================================== --- usr.sbin/amd/libamu/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.include - -.PATH: ${SRCTOP}/contrib/amd/libamu \ - ${SRCTOP}/contrib/amd/conf/transp \ - ${SRCTOP}/contrib/amd/conf/mtab \ - ${SRCTOP}/contrib/amd/conf/umount - -LIB= amu -INTERNALLIB= -SRCS= hasmntopt.c misc_rpc.c mount_fs.c mtab.c nfs_prot_xdr.c \ - strutil.c wire.c xutil.c - -# These would be links created by the GNU-style configure -SRCS+= transp_sockets.c mtab_bsd.c umount_bsd44.c - -# Generated at compile time (replaces supplied xdr_func.c) -SRCS+= nfs_prot_x.c xdr_func_%undef.c -CLEANFILES+= nfs_prot_x.c xdr_func_%undef.c - -CFLAGS+= -I${SRCTOP}/contrib/amd/libamu \ - -I${OBJTOP}/include/rpcsvc - -nfs_prot_x.c: ${NFS_PROT_X} - ${RPCCOM} -c -C -DWANT_NFS3 ${.ALLSRC} -o ${.TARGET} - -XDRDEFS!= grep 'ifndef.*HAVE_XDR' ${SRCTOP}/contrib/amd/libamu/xdr_func.c | awk '{print "-D"$$2}' - -xdr_func_%undef.c: xdr_func.c - unifdef -x1 ${XDRDEFS} -o ${.TARGET} ${.ALLSRC} - -.include Index: usr.sbin/amd/libamu/Makefile.depend =================================================================== --- usr.sbin/amd/libamu/Makefile.depend +++ /dev/null @@ -1,17 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - usr.sbin/amd/include \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/mk-amd-map/Makefile =================================================================== --- usr.sbin/amd/mk-amd-map/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/mk-amd-map - -PROG= mk-amd-map -MAN= mk-amd-map.8 - -LIBADD= amu - -.include Index: usr.sbin/amd/mk-amd-map/Makefile.depend =================================================================== --- usr.sbin/amd/mk-amd-map/Makefile.depend +++ /dev/null @@ -1,22 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/pawd/Makefile =================================================================== --- usr.sbin/amd/pawd/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/amq - -BINDIR= /usr/bin - -PROG= pawd -SRCS= pawd.c amq_clnt.c amq_xdr.c - -CFLAGS+= -I${SRCTOP}/contrib/amd/amq - -LIBADD= amu - -.include Index: usr.sbin/amd/pawd/Makefile.depend =================================================================== --- usr.sbin/amd/pawd/Makefile.depend +++ /dev/null @@ -1,22 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/scripts/Makefile =================================================================== --- usr.sbin/amd/scripts/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/scripts - -MAN= amd.conf.5 - -.include Index: usr.sbin/amd/scripts/Makefile.depend =================================================================== --- usr.sbin/amd/scripts/Makefile.depend +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif Index: usr.sbin/amd/wire-test/Makefile =================================================================== --- usr.sbin/amd/wire-test/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# ex:ts=8 -# -# Makefile for amd -# This file is under a "BSD" copyright (c) by David O'Brien 1998 -# -# $FreeBSD$ - -.PATH: ${SRCTOP}/contrib/amd/wire-test - -PROG= wire-test -MAN= wire-test.8 - -LIBADD= amu - -.include Index: usr.sbin/amd/wire-test/Makefile.depend =================================================================== --- usr.sbin/amd/wire-test/Makefile.depend +++ /dev/null @@ -1,22 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/rpc \ - include/rpcsvc \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - usr.sbin/amd/include \ - usr.sbin/amd/libamu \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif