diff options
author | rgrimes <rgrimes@FreeBSD.org> | 1994-05-26 05:23:31 +0000 |
---|---|---|
committer | rgrimes <rgrimes@FreeBSD.org> | 1994-05-26 05:23:31 +0000 |
commit | 862fdf11a2ede45dec0da01ed575525d79468981 (patch) | |
tree | 7a1c88ccb8006476bd4b4a548a6ad48fbfc33a01 /usr.sbin/amd/fsinfo | |
parent | 8e1a19ddde0df113b0b26b0ea621afd61dbaf91f (diff) | |
download | FreeBSD-src-862fdf11a2ede45dec0da01ed575525d79468981.zip FreeBSD-src-862fdf11a2ede45dec0da01ed575525d79468981.tar.gz |
BSD 4.4 Lite usr.sbin Sources
Diffstat (limited to 'usr.sbin/amd/fsinfo')
61 files changed, 5814 insertions, 0 deletions
diff --git a/usr.sbin/amd/fsinfo/Makefile b/usr.sbin/amd/fsinfo/Makefile new file mode 100644 index 0000000..50f4642 --- /dev/null +++ b/usr.sbin/amd/fsinfo/Makefile @@ -0,0 +1,30 @@ +# @(#)Makefile 8.1 (Berkeley) 6/28/93 + +PROG= fsinfo +MAN8= fsinfo.0 +SRCS= fsinfo.c fsi_gram.c fsi_lex.c \ + fsi_util.c fsi_analyze.c fsi_dict.c \ + wr_atab.c wr_bparam.c wr_dumpset.c \ + wr_exportfs.c wr_fstab.c +CLEANFILES= \ + fsi_gram.c y.tab.c fsi_gram.h y.tab.h \ + fsi_lex.c lex.yy.c y.output +CFLAGS+=-I. +CFLAGS+=-I${.CURDIR}/../include +CFLAGS+=-I${.CURDIR}/../config +CFLAGS+=-DOS_HDR=\"os-bsd44.h\" + +fsi_lex.o fsinfo.o: fsi_gram.h +fsi_gram.c fsi_gram.h: ../fsinfo/fsi_gram.y + @echo "# expect 2 shift/reduce conflicts" + ${YACC} -d ${.CURDIR}/fsi_gram.y + mv y.tab.c fsi_gram.c + mv y.tab.h fsi_gram.h + +fsi_lex.c: ../fsinfo/fsi_lex.l + ${LEX} ${.CURDIR}/fsi_lex.l + mv lex.yy.c fsi_lex.c + +.PATH: ${.CURDIR}/../config +.include "../../Makefile.inc" +.include <bsd.prog.mk> diff --git a/usr.sbin/amd/fsinfo/conf/automounts b/usr.sbin/amd/fsinfo/conf/automounts new file mode 100644 index 0000000..ee4b4ee --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/automounts @@ -0,0 +1,48 @@ +host localhost.doc.ic.ac.uk + +fs localhost:/localhost { + fstype = export + mount default { + exportfs "" + volname /home/localhost + } +} + +automount opts "opts:=rw,nosuid,grpid" /vol { + rwho {} + r+d {} + public {} + src { gnu{} athena{} gould{} utx{} sos4{} xinu43{} } + export { + exec { + sun3 {} + sun4 {} + } + roots {} + swaps { + tsun1 {} tsun2 {} tsun3 {} tsun4 {} tsun5 {} tsun6 {} + tsun7 {} tsun8 {} tsun9 {} tsun10 {} tsun11 {} tsun12 {} + tsun13 {} tsun14 {} tsun15 {} tsun16 {} tsun17 {} tsun18 {} + tsun19 {} + tcsun1 {} tcsun2 {} tcsun3 {} tcsun4 {} tcsun5 {} + } + misc {} + } +} + +automount opts "opts:=rw,nosuid,grpid" /home { + achilles {} + toytown {} + gummo {} + dylan { dk2{} dk5 {} } + ganymede {} + gould { staff{} teach{} } + "localhost" -> localhost +} + +automount opts "opts:=rw,nosuid,grpid" /homes { + opr -> /home/localhost/opr +#include "users" +} + +automount /usr/achilles = /home/achilles diff --git a/usr.sbin/amd/fsinfo/conf/csg_sun3 b/usr.sbin/amd/fsinfo/conf/csg_sun3 new file mode 100644 index 0000000..7d75db2 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/csg_sun3 @@ -0,0 +1,18 @@ +// $Id$ +// standard setups for DoC tsuns. +// note that no /var/spool/rwho is mounted as we now expect amd to do this as /vol/rwho + +// a sun3 +#ifndef SOS4_SYS_OPTS +#define SOS4_SYS_OPTS grpid,hard,intr +#endif +#define CSG_SUN3(HOST,DOMAIN,BOOT,EXEC) \ +host HOST.DOMAIN \ +\ +mount /vol/export/roots/HOST as / from BOOT opts rw,SOS4_SYS_OPTS \ +mount /vol/export/swaps/HOST fstype swap as swap from BOOT opts swap \ +mount /vol/export/exec/sun3 as /usr from EXEC opts ro,SOS4_SYS_OPTS \ +mount /vol/export/misc/crash/HOST as /var/crash/HOST from EXEC opts rw,nosuid,SOS4_SYS_OPTS \ +mount /vol/export/misc/tmp/HOST as /tmp from EXEC opts rw,nosuid,SOS4_SYS_OPTS \ +mount /vol/export/misc/usr.tmp/HOST as /var/tmp from EXEC opts rw,nosuid,SOS4_SYS_OPTS \ +mount /var/mmdf from BOOT opts rw,nosuid,SOS4_SYS_OPTS diff --git a/usr.sbin/amd/fsinfo/conf/csg_vax b/usr.sbin/amd/fsinfo/conf/csg_vax new file mode 100644 index 0000000..0ef23a5 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/csg_vax @@ -0,0 +1,67 @@ +// $Id$ +// csg vax config - really just for {s,r}vax + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw + +#define CSG_VAX(HOST,DOMAIN) \ +host HOST.DOMAIN\ +\ +/*\ +arch vax\ +os xinu43\ +cluster csg\ +dumphost flamingo.doc.ic.ac.uk\ +*/\ +\ +// root\ +fs /dev/hp0a {\ + fstype = FSTYPE_UFS\ + opts = DEFAULT_OPTS\ + freq = 1\ + passno = 1\ + mount / {}\ +}\ +\ +// swap\ +fs /dev/hp0b {\ + fstype = swap\ +}\ +\ +// usr\ +fs /dev/hp0e {\ + fstype = FSTYPE_UFS\ + opts = DEFAULT_OPTS\ + freq = 1\ + passno = 2\ + mount /usr {\ + exportfs "\\\ + sky.doc.ic.ac.uk\\\ + svax.doc.ic.ac.uk\\\ + rvax.doc.ic.ac.uk\\\ + ivax.doc.ic.ac.uk\\\ + "\ + }\ +}\ +\ +// var\ +fs /dev/hp0d {\ + fstype = FSTYPE_UFS\ + opts = DEFAULT_OPTS\ + freq = 1\ + passno = 3\ + mount /var {}\ +}\ +\ +// home directories\ +fs /dev/hp0f {\ + fstype = FSTYPE_UFS\ + opts = DEFAULT_OPTS\ + freq = 1\ + passno = 3\ + mount /a/HOST/home/HOST {\ + exportfs "\\\ + teach_hosts\\\ + "\ + }\ +}
\ No newline at end of file diff --git a/usr.sbin/amd/fsinfo/conf/diskless_sun3_sos4 b/usr.sbin/amd/fsinfo/conf/diskless_sun3_sos4 new file mode 100644 index 0000000..0cacb20 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/diskless_sun3_sos4 @@ -0,0 +1,9 @@ +#define DISKLESS_SUN3_SOS4(HOST,DOMAIN,BOOTSERVER) \ +host HOST.DOMAIN \ +\ +mount /export/root/HOST as / from BOOTSERVER opts rw,grpid,intr \ +mount /export/swap/HOST as swap fstype swap from BOOTSERVER opts swap \ +mount /export/exec/sun3 as /usr from BOOTSERVER opts rw,grpid,intr \ +mount /var/clients/HOST as /var from BOOTSERVER opts rw,grpid,intr,nosuid \ +mount /var/clients/HOST.tmp as /tmp from BOOTSERVER opts rw,grpid,intr,nosuid \ +mount /var/spool/mail from BOOTSERVER opts rw,grpid,intr,nosuid diff --git a/usr.sbin/amd/fsinfo/conf/hosts/achilles.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/achilles.doc.ic.ac.uk new file mode 100644 index 0000000..6a46ce8 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/achilles.doc.ic.ac.uk @@ -0,0 +1,116 @@ +// mkfsinfo + +host achilles.doc.ic.ac.uk + +/* +arch sun4 +os sos4 +cluster theory +dumphost achilles.doc.ic.ac.uk +*/ + +// SWAP Partitions +fs /dev/xd0b { + fstype = swap +} + +fs /dev/xd1b { + fstype = swap +} + +// ROOT +fs /dev/xd0a { + fstype = 4.2 + opts = rw,noquota,grpid + passno = 1; + freq = 1; + mount / { } +} + +// ROOT Backup +fs /dev/xd1a { + fstype = ignore + opts = rw,noquota,grpid + passno = 1; + freq = 1; + mount /backup { } +} + +fs /dev/xd1d { + fstype = 4.2 + opts = rw,noquota,grpid + passno = 1; + freq = 1; + mount /export { + root { + truth { exportfs "-root=truth,access=truth" } + } + swap { + truth { exportfs "-root=truth,access=truth" } + } + exec { + sun4 { exportfs "-access=toytown_clients:hangers_on:gummo:harpo:opus,rw=dylan:truth:florence:toytown" } + } + } +} + +fs /dev/xd1f { + fstype = 4.2 + opts = rw,noquota,grpid + passno = 1; + freq = 1; + mount /var { + clients { + truth { exportfs "-root=truth,access=truth" } + truth.tmp { exportfs "-root=truth,access=truth" } + } + spool { + mail { exportfs "-root=truth,access=truth" } + rwho { exportfs "ro" volname /vol/rwho sel "byte==big" } + } + } +} + +fs /dev/xd0d { + fstype = 4.2 + opts = rw,noquota,grpid + passno = 1; + freq = 1; + mount /tmp { + X11NeWS { exportfs "-ro" } + } +} + +fs /dev/xd0g { + fstype = 4.2 + opts = rw,noquota,grpid + passno = 1 + freq = 1 + mount default { + exportfs "-access=toytown_clients:hangers_on" + volname /home/achilles + } +} + +fs /dev/xd1g { + fstype = 4.2 + opts = rw,noquota + passno = 1 + freq = 1 + mount /usr { + exportfs "-access=toytown_clients:hangers_on:gummo:harpo:opus,rw=dylan:truth:florence:toytown" + share { + volname "/usr/share" + //exportfs "blah" + } + src { + local { + //exportfs "-access=toytown:zebedee:dougal:dylan:florence:opus,rw=dylan:florence,root=dylan:florence" + bits { gnu { volname "/vol/src/gnu" } } + athena { volname "/vol/src/athena" } + } + } + } +} + +/*mount /export/exec/sun3 fstype nfs from gould.doc.ic.ac.uk as /usr opts "rw"*/ diff --git a/usr.sbin/amd/fsinfo/conf/hosts/bigears.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/bigears.doc.ic.ac.uk new file mode 100644 index 0000000..bda2fd8 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/bigears.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../diskless_sun3_sos4" + +DISKLESS_SUN3_SOS4(bigears,doc.ic.ac.uk,toytown.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/dylan.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/dylan.doc.ic.ac.uk new file mode 100644 index 0000000..5284147 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/dylan.doc.ic.ac.uk @@ -0,0 +1,68 @@ +// mkfsinfo + +host dylan.doc.ic.ac.uk + +// SWAP +fs /dev/dsk/0s0 { + fstype = swap +} + +// SWAP +fs /dev/dsk/1s0 { + fstype = swap +} + +// ROOT +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 + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/flamingo.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/flamingo.doc.ic.ac.uk new file mode 100644 index 0000000..31f1be0 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/flamingo.doc.ic.ac.uk @@ -0,0 +1,104 @@ +// mkfsinfo for flamingo +// $Id$ + +host flamingo.doc.ic.ac.uk + +/* +arch sun3 +os sos4 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw,noquota,nosuid,grpid + +// swap +fs /dev/xy0b { + fstype = swap +} + +// root +fs /dev/xy0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + passno = 1 + freq = 1 + dumpset = csg_sun3_vax + mount / {} +} + +// usr +fs /dev/xy0f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + dumpset = csg_sun3_vax + mount /usr { + volname /vol/export/exec/sun3 + exportfs "-ro,access=teach_hosts:ssun2.doc.ic.ac.uk:pelican:gould,\ + root=gould:pelican:ssun2.doc.ic.ac.uk" + } +} + +// tmp +fs /dev/xy0d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS,nosuid + freq = 1 + passno = 3 + mount /tmp { + exportfs "-access=ssun1:tsunfs,root=tsunfs" + } +} + +// var +fs /dev/xy0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 4 + dumpset = csg_sun3_vax + mount /var { + tmp { + exportfs "-access=ssun1:sky.doc.ic.ac.uk" + } + crash { + exportfs "-access=ssun1" + } + misc { + exportfs "-access=teach_hosts" + } + spool { + rwho { + volname /vol/rwho + exportfs "-ro,access=teach_hosts" + sel "byte==big" + } + } + } +} + +// source - sos4 +fs /dev/xy0h { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 6 + mount /usr/src { + volname /vol/src/sos4 + exportfs "-access=svax:pelican:gould,root=pelican:svax" + } +} + +// home directories +fs /dev/xy0g { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 5 + mount /a/flamingo/home/flamingo { + exportfs "-access=teach_hosts:thp_hosts:ssun2:obsidian:truth,root=gould" + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/ganymede.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/ganymede.doc.ic.ac.uk new file mode 100644 index 0000000..e847c85 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/ganymede.doc.ic.ac.uk @@ -0,0 +1,33 @@ +host ganymede.doc.ic.ac.uk + +fs /dev/xy0a { + fstype = 4.2 + opts = rw + freq = 1 + passno = 1 + mount / { + } +} + +fs /dev/xy0g { + fstype = 4.2 + opts = rw + freq = 1 + passno = 2 + mount /usr { + exportfs "-access=toytown:toytown_clients" + } +} + +fs /dev/xy0h { + fstype = 4.2 + opts = rw + freq = 1 + passno = 3 + mount /home/ganymede { + exportfs "-access=toytown_clients:samson:hangers_on" + } +} + +mount /home/toytown opts rw,bg,nosuid +mount /usr/local from toytown.doc.ic.ac.uk opts ro,bg diff --git a/usr.sbin/amd/fsinfo/conf/hosts/gould.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/gould.doc.ic.ac.uk new file mode 100644 index 0000000..8804c8e --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/gould.doc.ic.ac.uk @@ -0,0 +1,477 @@ +// mkfsinfo for gould +// $Id$ + +host gould.doc.ic.ac.uk + +/* +arch powernode +os utx21 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +#define FSTYPE_UFS 4.3 +#define DEFAULT_OPTS rw,noquota + +// swap +fs /dev/dk0b { + fstype = swap +} + +fs /dev/dk1b { + fstype = swap +} + +fs /dev/dk4b { + fstype = swap +} + +// root +fs /dev/dk0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + passno = 1 + freq = 1 + dumpset = csg_nightly + mount / {} +} + +// root backup +fs /dev/dk4a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 4 + mount /backup {} +} + +// usr +fs /dev/dk4d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + dumpset = csg_nightly + mount /usr {} +} + +// tmp +fs /dev/dk1a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS,nosuid + freq = 0 + passno = 2 + mount /tmp {} +} + +// var +fs /dev/dk4g { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + dumpset = csg_nightly + mount /var {} +} + +// shared stuff - usually for Suns +fs /dev/dk5f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 6 + mount /usr/share { + exportfs "-rdonly=1 \ + ivax.doc.ic.ac.uk \ + rvax.doc.ic.ac.uk \ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + svax.doc.ic.ac.uk \ + tsun1.doc.ic.ac.uk \ + tsun10.doc.ic.ac.uk \ + tsun11.doc.ic.ac.uk \ + tsun12.doc.ic.ac.uk \ + tsun13.doc.ic.ac.uk \ + tsun14.doc.ic.ac.uk \ + tsun15.doc.ic.ac.uk \ + tsun16.doc.ic.ac.uk \ + tsun17.doc.ic.ac.uk \ + tsun18.doc.ic.ac.uk \ + tsun19.doc.ic.ac.uk \ + tsun2.doc.ic.ac.uk \ + tsun3.doc.ic.ac.uk \ + tsun4.doc.ic.ac.uk \ + tsun5.doc.ic.ac.uk \ + tsun6.doc.ic.ac.uk \ + tsun7.doc.ic.ac.uk \ + tsun8.doc.ic.ac.uk \ + tsun9.doc.ic.ac.uk \ + tsunfs.doc.ic.ac.uk \ + flamingo.doc.ic.ac.uk \ + pelican.doc.ic.ac.uk \ + oriona \ + sky.doc.ic.ac.uk \ + whoops.doc.ic.ac.uk \ + whoops \ + " + } +} + +// spool stuff, including the news +fs /dev/dk4f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 5 + mount /var/spool { + exportfs "\ + oriona \ + rpcsfg \ + " + } +} + +fs /dev/dk3h { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /var/spool/News {} +} + +// this is the public ftp area +fs /dev/dk3f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 4 + mount /usr/reserve { + PUBLIC { + volname /vol/public + exportfs "\ + oriona \ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + obsidian \ + gummo \ + tsunfs.doc.ic.ac.uk \ + flamingo.doc.ic.ac.uk \ + " + } + } +} + +// sources - local and public +fs /dev/dk7c { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + dumpset = csg_nightly + mount /usr/src { + volname /vol/src/gould + exportfs "\ + flamingo.doc.ic.ac.uk \ + pelican.doc.ic.ac.uk \ + oriona \ + ssun1.doc.ic.ac.uk \ + svax.doc.ic.ac.uk \ + rvax.doc.ic.ac.uk \ + obsidian \ + tsunfs \ + " + } +} + +// sources - utx +fs /dev/dk4e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 6 + dumpset = csg_nightly + mount /usr/src/utx { + volname /vol/src/utx + exportfs "-rdonly=1 \ + flamingo.doc.ic.ac.uk \ + " + } +} + +// home directories +fs /dev/dk1h { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + dumpset = csg_nightly + mount /home/gould/teach { + exportfs "\ + thp1 \ + thp2 \ + thp3 \ + thp4 \ + thp5 \ + thp6 \ + thp7 \ + thp8 \ + thp9 \ + thp10 \ + thpfs \ + ivax.doc.ic.ac.uk \ + rvax.doc.ic.ac.uk \ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + svax.doc.ic.ac.uk \ + tsun1.doc.ic.ac.uk \ + tsun10.doc.ic.ac.uk \ + tsun11.doc.ic.ac.uk \ + tsun12.doc.ic.ac.uk \ + tsun13.doc.ic.ac.uk \ + tsun14.doc.ic.ac.uk \ + tsun15.doc.ic.ac.uk \ + tsun16.doc.ic.ac.uk \ + tsun17.doc.ic.ac.uk \ + tsun18.doc.ic.ac.uk \ + tsun19.doc.ic.ac.uk \ + tsun2.doc.ic.ac.uk \ + tsun3.doc.ic.ac.uk \ + tsun4.doc.ic.ac.uk \ + tsun5.doc.ic.ac.uk \ + tsun6.doc.ic.ac.uk \ + tsun7.doc.ic.ac.uk \ + tsun8.doc.ic.ac.uk \ + tsun9.doc.ic.ac.uk \ + tsunfs.doc.ic.ac.uk \ + flamingo.doc.ic.ac.uk \ + pelican.doc.ic.ac.uk \ + oriona \ + sky.doc.ic.ac.uk \ + whoops.doc.ic.ac.uk \ + whoops \ + vlsi.doc.ic.ac.uk \ + vlsi \ + " + } +} + +fs /dev/dk0h { + fstype = FSTYPE_UFS + opts = rw,quota + freq = 1 + passno = 2 + dumpset = csg_nightly + mount /home/gould/staff { + exportfs "\ + achilles \ + thp1 \ + thp2 \ + thp3 \ + thp4 \ + thp5 \ + thp6 \ + thp7 \ + thp8 \ + thp9 \ + thp10 \ + thpfs \ + ivax.doc.ic.ac.uk \ + rvax.doc.ic.ac.uk \ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + svax.doc.ic.ac.uk \ + tsun1.doc.ic.ac.uk \ + tsun10.doc.ic.ac.uk \ + tsun11.doc.ic.ac.uk \ + tsun12.doc.ic.ac.uk \ + tsun13.doc.ic.ac.uk \ + tsun14.doc.ic.ac.uk \ + tsun15.doc.ic.ac.uk \ + tsun16.doc.ic.ac.uk \ + tsun17.doc.ic.ac.uk \ + tsun18.doc.ic.ac.uk \ + tsun19.doc.ic.ac.uk \ + tsun2.doc.ic.ac.uk \ + tsun3.doc.ic.ac.uk \ + tsun4.doc.ic.ac.uk \ + tsun5.doc.ic.ac.uk \ + tsun6.doc.ic.ac.uk \ + tsun7.doc.ic.ac.uk \ + tsun8.doc.ic.ac.uk \ + tsun9.doc.ic.ac.uk \ + tsunfs.doc.ic.ac.uk \ + flamingo.doc.ic.ac.uk \ + pelican.doc.ic.ac.uk \ + oriona \ + sky.doc.ic.ac.uk \ + whoops.doc.ic.ac.uk \ + whoops \ + vlsi.doc.ic.ac.uk \ + vlsi \ + vlsi02 \ + " + } +} + +// booting diskless suns +fs /dev/dk5e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + dumpset = csg_nightly + mount /export { +#ifndef ok + volname /vol/export +#endif + exportfs "\ + -rootid=0 \ + whoops \ + whoops.doc.ic.ac.uk \ + " + misc { + volname /vol/export/misc + } + } +} + +fs /dev/dk5a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 4 + dumpset = csg_nightly + mount /export/roots { + volname /vol/export/roots + exportfs "\ + -rootid=0 \ + whoops \ + whoops.doc.ic.ac.uk \ + " + } +} + +fs /dev/dk5d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 5 + dumpset = csg_nightly + mount /export/exec/sun3 { + volname /vol/export/exec/sun3 + exportfs "\ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + tsun1.doc.ic.ac.uk \ + tsun10.doc.ic.ac.uk \ + tsun11.doc.ic.ac.uk \ + tsun12.doc.ic.ac.uk \ + tsun13.doc.ic.ac.uk \ + tsun14.doc.ic.ac.uk \ + tsun15.doc.ic.ac.uk \ + tsun16.doc.ic.ac.uk \ + tsun17.doc.ic.ac.uk \ + tsun18.doc.ic.ac.uk \ + tsun19.doc.ic.ac.uk \ + tsun2.doc.ic.ac.uk \ + tsun3.doc.ic.ac.uk \ + tsun4.doc.ic.ac.uk \ + tsun5.doc.ic.ac.uk \ + tsun6.doc.ic.ac.uk \ + tsun7.doc.ic.ac.uk \ + tsun8.doc.ic.ac.uk \ + tsun9.doc.ic.ac.uk \ + tsunfs.doc.ic.ac.uk \ + flamingo.doc.ic.ac.uk \ + pelican.doc.ic.ac.uk \ + whoops.doc.ic.ac.uk \ + whoops \ + " + } +} + +// various r+d things - used for athena, etc +fs /dev/dk5g { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /usr/r+d { + volname /vol/r+d + exportfs "\ + ivax.doc.ic.ac.uk \ + rvax.doc.ic.ac.uk \ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + svax.doc.ic.ac.uk \ + tsun1.doc.ic.ac.uk \ + tsun10.doc.ic.ac.uk \ + tsun11.doc.ic.ac.uk \ + tsun12.doc.ic.ac.uk \ + tsun13.doc.ic.ac.uk \ + tsun14.doc.ic.ac.uk \ + tsun15.doc.ic.ac.uk \ + tsun16.doc.ic.ac.uk \ + tsun17.doc.ic.ac.uk \ + tsun18.doc.ic.ac.uk \ + tsun19.doc.ic.ac.uk \ + tsun2.doc.ic.ac.uk \ + tsun3.doc.ic.ac.uk \ + tsun4.doc.ic.ac.uk \ + tsun5.doc.ic.ac.uk \ + tsun6.doc.ic.ac.uk \ + tsun7.doc.ic.ac.uk \ + tsun8.doc.ic.ac.uk \ + tsun9.doc.ic.ac.uk \ + tsunfs.doc.ic.ac.uk \ + flamingo.doc.ic.ac.uk \ + pelican.doc.ic.ac.uk \ + oriona \ + sky.doc.ic.ac.uk \ + whoops.doc.ic.ac.uk \ + whoops \ + " + } +} + +fs /dev/dk3d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /usr/r+d/r1 { + exportfs "\ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + " + } +} + +fs /dev/dk4h { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 7 + mount /usr/r+d/r2 { + exportfs "\ + achilles \ + gummo \ + harpo \ + oriona \ + ssun1.doc.ic.ac.uk \ + ssun2.doc.ic.ac.uk \ + thpfs \ + toytown \ + obsidian \ + " + } +} + +// this bit of disc needs a name ! +fs /dev/dk5h { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 7 + mount /mnt2 {} +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/gummo.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/gummo.doc.ic.ac.uk new file mode 100644 index 0000000..aae6a5d --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/gummo.doc.ic.ac.uk @@ -0,0 +1,12 @@ +// mkfsinfo + +host gummo.doc.ic.ac.uk + +// ROOT +fs /dev/xxx1 { + fstype = export + mount default { + exportfs "" + volname /home/gummo + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/ivax.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/ivax.doc.ic.ac.uk new file mode 100644 index 0000000..c8fcb5d --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/ivax.doc.ic.ac.uk @@ -0,0 +1,84 @@ +// $Id$ +// ivax + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw + +host { + config "NFS_SERVER=true" + config "NFS_CLIENT=true" + config "YP_SERVER=false" + config "YP_CLIENT=false" + + arch = vax + os = xinu43 + cluster = teach.doc.ic.ac.uk + netif il0 { hwaddr = "08:08:08:08:08:08" netmask = 0xfffffe00 inaddr = 129.31.80.36 } + +} ivax.doc.ic.ac.uk + +// root +fs /dev/hp0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 1 + mount / {} +} + +// swap +fs /dev/hp0b { + fstype = swap +} + +// usr +fs /dev/hp0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /usr { + exportfs "\ + sky.doc.ic.ac.uk\ + svax.doc.ic.ac.uk\ + rvax.doc.ic.ac.uk\ + ivax.doc.ic.ac.uk\ + " + } +} + +// var +fs /dev/hp0d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /var {} +} + +// home directories +fs /dev/hp0f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount default { + volname /home/ivax + exportfs "\ + sky.doc.ic.ac.uk\ + " + } +} + +// sources which are used by the gould for the infoserver +fs /dev/hp2c { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /public { + exportfs "\ + gould\ + " + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/obsidian.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/obsidian.doc.ic.ac.uk new file mode 100644 index 0000000..dd9f0f7 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/obsidian.doc.ic.ac.uk @@ -0,0 +1,28 @@ +// $Id$ +// conf for obsidian + +#define FSTYPE_UFS hfs +#define DEFAULT_OPTS rw + +host obsidian.doc.ic.ac.uk + +fs /dev/dsk/0s0 { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 1 + mount / {} +} + +fs /dev/dsk/1s0 { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 1 + mount default { + volname /home/obsidian + exportfs "\ + gould\ + " + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/pelican.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/pelican.doc.ic.ac.uk new file mode 100644 index 0000000..1ffd8d7 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/pelican.doc.ic.ac.uk @@ -0,0 +1,208 @@ +// mkfsinfo for pelican +// $Id$ + +host pelican.doc.ic.ac.uk + +/* +arch sun3 +os sos4 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw,noquota,nosuid,grpid + +// swap +fs /dev/xd0b { + fstype = swap +} + +// root +fs /dev/xd0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + passno = 1 + freq = 1 + dumpset = csg_sun3_vax + mount / { + exportfs "-ro,access=tsunfs,root=tsunfs" + } +} + +// usr +fs /dev/xd0f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + dumpset = csg_sun3_vax + mount /usr { + volname /vol/export/exec/sun3 + exportfs "-ro,access=teach_hosts,root=gould:flamingo:tsunfs" + } +} + +// tmp +fs /dev/xd0d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS,nosuid + freq = 1 + passno = 3 + mount /tmp { + exportfs "\ + -access=\ + flamingo:\ + tsun16.doc.ic.ac.uk:\ + tsun17.doc.ic.ac.uk:\ + tsun18.doc.ic.ac.uk:\ + tsun19.doc.ic.ac.uk" + } +} + +// var +fs /dev/xd0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 4 + dumpset = csg_sun3_vax + mount /var { + misc { + // this is due to differences between tsunfs and pelican + volname /vol/export/misc + exportfs "\ + -access=teach_hosts,\ + root=\ + tcsun1.doc.ic.ac.uk:\ + tcsun2.doc.ic.ac.uk:\ + tcsun3.doc.ic.ac.uk:\ + tcsun4.doc.ic.ac.uk:\ + tcsun5.doc.ic.ac.uk:\ + tsun16.doc.ic.ac.uk:\ + tsun17.doc.ic.ac.uk:\ + tsun18.doc.ic.ac.uk:\ + tsun19.doc.ic.ac.uk" + } + mmdf { + exportfs "\ + -access=teach_hosts,\ + root=\ + tcsun1.doc.ic.ac.uk:\ + tcsun2.doc.ic.ac.uk:\ + tcsun3.doc.ic.ac.uk:\ + tcsun4.doc.ic.ac.uk:\ + tcsun5.doc.ic.ac.uk:\ + tsun16.doc.ic.ac.uk:\ + tsun17.doc.ic.ac.uk:\ + tsun18.doc.ic.ac.uk:\ + tsun19.doc.ic.ac.uk" + } + spool { + rwho { + volname /vol/rwho + exportfs "-ro,access=teach_hosts" + sel "byte==big" + } + } + } +} + +// export for diskless clients +fs /dev/xd0h { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 6 + mount /export { + roots { + tcsun1 { + volname /vol/export/roots/tcsun1 + exportfs "-root=tcsun1.doc.ic.ac.uk,access=tcsun1.doc.ic.ac.uk" + } + tcsun2 { + volname /vol/export/roots/tcsun2 + exportfs "-root=tcsun2.doc.ic.ac.uk,access=tcsun2.doc.ic.ac.uk" + } + tcsun3 { + volname /vol/export/roots/tcsun3 + exportfs "-root=tcsun3.doc.ic.ac.uk,access=tcsun3.doc.ic.ac.uk" + } + tcsun4 { + volname /vol/export/roots/tcsun4 + exportfs "-root=tcsun4.doc.ic.ac.uk,access=tcsun4.doc.ic.ac.uk" + } + tcsun5 { + volname /vol/export/roots/tcsun5 + exportfs "-root=tcsun5.doc.ic.ac.uk,access=tcsun5.doc.ic.ac.uk" + } + + tsun16 { + volname /vol/export/roots/tsun16 + exportfs "-root=tsun16.doc.ic.ac.uk,access=tsun16.doc.ic.ac.uk" + } + tsun17 { + volname /vol/export/roots/tsun17 + exportfs "-root=tsun17.doc.ic.ac.uk,access=tsun17.doc.ic.ac.uk" + } + tsun18 { + volname /vol/export/roots/tsun18 + exportfs "-root=tsun18.doc.ic.ac.uk,access=tsun18.doc.ic.ac.uk" + } + tsun19 { + volname /vol/export/roots/tsun19 + exportfs "-root=tsun19.doc.ic.ac.uk,access=tsun19.doc.ic.ac.uk" + } + } + swaps { + tcsun1 { + volname /vol/export/swaps/tcsun1 + exportfs "-root=tcsun1.doc.ic.ac.uk,access=tcsun1.doc.ic.ac.uk" + } + tcsun2 { + volname /vol/export/swaps/tcsun2 + exportfs "-root=tcsun2.doc.ic.ac.uk,access=tcsun2.doc.ic.ac.uk" + } + tcsun3 { + volname /vol/export/swaps/tcsun3 + exportfs "-root=tcsun3.doc.ic.ac.uk,access=tcsun3.doc.ic.ac.uk" + } + tcsun4 { + volname /vol/export/swaps/tcsun4 + exportfs "-root=tcsun4.doc.ic.ac.uk,access=tcsun4.doc.ic.ac.uk" + } + tcsun5 { + volname /vol/export/swaps/tcsun5 + exportfs "-root=tcsun5.doc.ic.ac.uk,access=tcsun5.doc.ic.ac.uk" + } + tsun16 { + volname /vol/export/swaps/tsun16 + exportfs "-root=tsun16.doc.ic.ac.uk,access=tsun16.doc.ic.ac.uk" + } + tsun17 { + volname /vol/export/swaps/tsun17 + exportfs "-root=tsun17.doc.ic.ac.uk,access=tsun17.doc.ic.ac.uk" + } + tsun18 { + volname /vol/export/swaps/tsun18 + exportfs "-root=tsun18.doc.ic.ac.uk,access=tsun18.doc.ic.ac.uk" + } + tsun19 { + volname /vol/export/swaps/tsun19 + exportfs "-root=tsun19.doc.ic.ac.uk,access=tsun19.doc.ic.ac.uk" + } + } + } +} + +// home directories +fs /dev/xd0g { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 5 + mount default { + volname /home/pelican + exportfs "-access=teach_hosts:thp_hosts:ssun2:obsidian:truth,root=gould" + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/rvax.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/rvax.doc.ic.ac.uk new file mode 100644 index 0000000..303d552 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/rvax.doc.ic.ac.uk @@ -0,0 +1,66 @@ +// $Id$ +// rvax + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw + +host rvax.doc.ic.ac.uk + +/* +arch vax +os xinu43 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +// root +fs /dev/hp0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 1 + mount / {} +} + +// swap +fs /dev/hp0b { + fstype = swap +} + +// usr +fs /dev/hp0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /usr { + exportfs "\ + sky.doc.ic.ac.uk\ + svax.doc.ic.ac.uk\ + rvax.doc.ic.ac.uk\ + ivax.doc.ic.ac.uk\ + " + } +} + +// var +fs /dev/hp0d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /var {} +} + +// home directories +fs /dev/hp0f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /a/rvax/home/rvax { + exportfs "\ + teach_hosts\ + " + } +}
\ No newline at end of file diff --git a/usr.sbin/amd/fsinfo/conf/hosts/sky.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/sky.doc.ic.ac.uk new file mode 100644 index 0000000..7877659 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/sky.doc.ic.ac.uk @@ -0,0 +1,79 @@ +// $Id$ +// sky + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw + +host sky.doc.ic.ac.uk + +/* +arch vax +os xinu43 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +// root +fs /dev/hp0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 1 + mount / {} +} + +// swap +fs /dev/hp0b { + fstype = swap +} + +// usr +fs /dev/hp0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /usr { + exportfs "\ + sky.doc.ic.ac.uk\ + svax.doc.ic.ac.uk\ + rvax.doc.ic.ac.uk\ + ivax.doc.ic.ac.uk\ + " + } +} + +// var +fs /dev/hp0d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /var {} +} + +// home directories +fs /dev/hp0f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /a/sky/home/sky {} +} + +// 4.3 sources +fs /dev/hp1g { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /usr/src { + volname /vol/src/xinu43 + exportfs "\ + svax.doc.ic.ac.uk\ + rvax.doc.ic.ac.uk\ + sky.doc.ic.ac.uk\ + ivax.doc.ic.ac.uk\ + " + } +}
\ No newline at end of file diff --git a/usr.sbin/amd/fsinfo/conf/hosts/svax.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/svax.doc.ic.ac.uk new file mode 100644 index 0000000..aa99fbf --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/svax.doc.ic.ac.uk @@ -0,0 +1,66 @@ +// $Id$ +// svax + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw + +host svax.doc.ic.ac.uk + +/* +arch vax +os xinu43 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +// root +fs /dev/hp0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 1 + mount / {} +} + +// swap +fs /dev/hp0b { + fstype = swap +} + +// usr +fs /dev/hp0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 2 + mount /usr { + exportfs "\ + sky.doc.ic.ac.uk\ + svax.doc.ic.ac.uk\ + rvax.doc.ic.ac.uk\ + ivax.doc.ic.ac.uk\ + " + } +} + +// var +fs /dev/hp0d { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /var {} +} + +// home directories +fs /dev/hp0f { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 3 + mount /a/svax/home/svax { + exportfs "\ + teach_hosts\ + " + } +}
\ No newline at end of file diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tcsun1.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tcsun1.doc.ic.ac.uk new file mode 100644 index 0000000..1b10d84 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tcsun1.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tcsun1,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tcsun2.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tcsun2.doc.ic.ac.uk new file mode 100644 index 0000000..933d2f4 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tcsun2.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tcsun2,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tcsun3.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tcsun3.doc.ic.ac.uk new file mode 100644 index 0000000..ccef4d4 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tcsun3.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tcsun3,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tcsun4.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tcsun4.doc.ic.ac.uk new file mode 100644 index 0000000..9de9a9a --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tcsun4.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tcsun4,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tcsun5.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tcsun5.doc.ic.ac.uk new file mode 100644 index 0000000..7f268a0 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tcsun5.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tcsun5,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/toytown.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/toytown.doc.ic.ac.uk new file mode 100644 index 0000000..7b27f16 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/toytown.doc.ic.ac.uk @@ -0,0 +1,116 @@ +host toytown.doc.ic.ac.uk + +fs /dev/xy0a { + fstype = 4.2 + opts = rw,noquota,grpid + freq = 25 + passno = 1 + mount / { + } +} + +fs /dev/xy0g { + fstype = 4.2 + opts = rw,noquota,grpid + freq = 25 + passno = 2 + mount /usr { + exportfs "-access=toytown_clients:hangers_on:pythagoras,ro" + sun3 { } + local { } + } +} + +fs /dev/xy1g { + fstype = 4.2 + opts = rw,grpid,nosuid + freq = 6 + passno = 2 + mount /home/toytown { + exportfs "-access=toytown_clients:hangers_on,root=achilles" + } +} + +fs /dev/xy0f { + fstype = 4.2 + opts = rw,noquota,grpid,nosuid + freq = 25 + passno = 4 + mount /var { + spool { + exportfs "-access=toytown_clients:hangers_on" + mail { } + rwho { volname /vol/rwho sel "byte==big" } +/* + mail { exportfs "-access=toytown_clients:hangers_on" } + rwho { exportfs "ro" volname /vol/rwho sel "byte==big" } +*/ + } + clients { + archimedes { exportfs "-access=archimedes,root=archimedes" } + archimedes.tmp { exportfs "-access=archimedes,root=archimedes" } + aver { exportfs "-access=aver,root=aver" } + aver.tmp { exportfs "-access=aver,root=aver" } + bigears { exportfs "-access=bigears,root=bigears" } + bigears.tmp { exportfs "-access=bigears,root=bigears" } + diadem { exportfs "-access=diadem,root=diadem" } + diadem.tmp { exportfs "-access=diadem,root=diadem" } + montague { exportfs "-access=montague,root=montague" } + montague.tmp { exportfs "-access=montague,root=montague" } + noddy { exportfs "-access=noddy,root=noddy" } + noddy.tmp { exportfs "-access=noddy,root=noddy" } + pcplod { exportfs "-access=pcplod,root=pcplod" } + pcplod.tmp { exportfs "-access=pcplod,root=pcplod" } + samson { exportfs "-access=samson,root=samson" } + samson.tmp { exportfs "-access=samson,root=samson" } + turing { exportfs "-access=turing,root=turing" } + turing.tmp { exportfs "-access=turing,root=turing" } + } + } +} + +fs /dev/xy0d { + fstype = 4.2 + opts = rw,noquota,grpid,nosuid + freq = 25 + passno = 3 + mount /export { + exec { + sun3 { exportfs "-access=toytown_clients:hangers_on:pythagoras" } + } + root { + archimedes { exportfs "-access=archimedes,root=archimedes" } + aver { exportfs "-access=aver,root=aver" } + bigears { exportfs "-access=bigears,root=bigears" } + diadem { exportfs "-access=diadem,root=diadem" } + montague { exportfs "-access=montague,root=montague" } + noddy { exportfs "-access=noddy,root=noddy" } + pcplod { exportfs "-access=pcplod,root=pcplod" } + samson { exportfs "-access=samson,root=samson" } + turing { exportfs "-access=turing,root=turing" } + } + swap { + archimedes { exportfs "-access=archimedes,root=archimedes" } + aver { exportfs "-access=aver,root=aver" } + bigears { exportfs "-access=bigears,root=bigears" } + diadem { exportfs "-access=diadem,root=diadem" } + montague { exportfs "-access=montague,root=montague" } + noddy { exportfs "-access=noddy,root=noddy" } + pcplod { exportfs "-access=pcplod,root=pcplod" } + samson { exportfs "-access=samson,root=samson" } + turing { exportfs "-access=turing,root=turing" } + } + } +} + +fs /dev/xy0b { + fstype = swap +} + +fs /dev/xy1b { + fstype = swap +} + +mount /home/ganymede opts rw,grpid,nosuid,bg,intr +mount /home/achilles opts rw,grpid,nosuid,bg,intr +mount /usr/src from achilles.doc.ic.ac.uk opts rw,grpid,nosuid,bg,intr diff --git a/usr.sbin/amd/fsinfo/conf/hosts/truth.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/truth.doc.ic.ac.uk new file mode 100644 index 0000000..0139279 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/truth.doc.ic.ac.uk @@ -0,0 +1,9 @@ +host truth.doc.ic.ac.uk + +mount /export/exec/sun4 from achilles.doc.ic.ac.uk as /usr opts "rw,grpid,intr" +mount /export/root/truth from achilles.doc.ic.ac.uk as / opts "rw,grpid,intr" +mount /export/swap/truth from achilles.doc.ic.ac.uk fstype swap as swap opts swap +mount /var/clients/truth.tmp from achilles.doc.ic.ac.uk as /tmp opts "rw,nosuid,grpid,intr" +mount /var/clients/truth from achilles.doc.ic.ac.uk as /var opts "rw,nosuid,grpid,intr" +mount /var/spool/mail from achilles.doc.ic.ac.uk as /var/spool/mail opts "rw,nosuid,grpid,intr" +mount /usr/src from achilles.doc.ic.ac.uk as /usr/src opts "rw,nosuid,grpid,intr,bg" diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun1.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun1.doc.ic.ac.uk new file mode 100644 index 0000000..ff5016c --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun1.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun1,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun10.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun10.doc.ic.ac.uk new file mode 100644 index 0000000..2496cdb --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun10.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun10,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun11.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun11.doc.ic.ac.uk new file mode 100644 index 0000000..d6e7b9d --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun11.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun11,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun12.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun12.doc.ic.ac.uk new file mode 100644 index 0000000..a8439bb --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun12.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun12,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun13.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun13.doc.ic.ac.uk new file mode 100644 index 0000000..44e4956 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun13.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun13,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun14.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun14.doc.ic.ac.uk new file mode 100644 index 0000000..66a5051 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun14.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun14,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun15.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun15.doc.ic.ac.uk new file mode 100644 index 0000000..3246df3 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun15.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun15,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun16.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun16.doc.ic.ac.uk new file mode 100644 index 0000000..4ab7bd0 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun16.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun16,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun17.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun17.doc.ic.ac.uk new file mode 100644 index 0000000..11ef757 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun17.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun17,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun18.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun18.doc.ic.ac.uk new file mode 100644 index 0000000..fbdf879 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun18.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun18,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun19.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun19.doc.ic.ac.uk new file mode 100644 index 0000000..da9aba8 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun19.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun19,doc.ic.ac.uk,pelican.doc.ic.ac.uk,pelican.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun2.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun2.doc.ic.ac.uk new file mode 100644 index 0000000..b6fca77 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun2.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun2,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun3.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun3.doc.ic.ac.uk new file mode 100644 index 0000000..e40bd16 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun3.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun3,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun4.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun4.doc.ic.ac.uk new file mode 100644 index 0000000..cd97358 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun4.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun4,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun5.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun5.doc.ic.ac.uk new file mode 100644 index 0000000..3a8c7e2 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun5.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun5,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun6.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun6.doc.ic.ac.uk new file mode 100644 index 0000000..4c6ea76 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun6.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun6,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun7.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun7.doc.ic.ac.uk new file mode 100644 index 0000000..9df32a9 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun7.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun7,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun8.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun8.doc.ic.ac.uk new file mode 100644 index 0000000..e2b5e1f --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun8.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun8,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsun9.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsun9.doc.ic.ac.uk new file mode 100644 index 0000000..e82e815 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsun9.doc.ic.ac.uk @@ -0,0 +1,3 @@ +#include "../csg_sun3" + +CSG_SUN3(tsun9,doc.ic.ac.uk,tsunfs.doc.ic.ac.uk,gould.doc.ic.ac.uk) diff --git a/usr.sbin/amd/fsinfo/conf/hosts/tsunfs.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/tsunfs.doc.ic.ac.uk new file mode 100644 index 0000000..b09db9d --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/tsunfs.doc.ic.ac.uk @@ -0,0 +1,211 @@ +// mkfsinfo for tsunfs +// $Id$ + +host tsunfs.doc.ic.ac.uk + +/* +arch sun3 +os sos4 +cluster csg +dumphost flamingo.doc.ic.ac.uk +*/ + +#define FSTYPE_UFS 4.2 +#define DEFAULT_OPTS rw,noquota,nosuid,grpid + +// swap +fs /dev/xy0b { + fstype = swap +} + +// root +fs /dev/xy0a { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + passno = 1 + freq = 1 + dumpset = csg_sun3_vax + mount / {} +} + +// usr +fs /dev/xy0f { + fstype = FSTYPE_UFS + opts = rw,grpid + freq = 1 + passno = 2 + dumpset = csg_sun3_vax + mount /usr {} +} + +// var +fs /dev/xy0e { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 4 + dumpset = csg_sun3_vax + mount /var { + mmdf { + exportfs "-access=teach_hosts,root=\ + tsun1.doc.ic.ac.uk:\ + tsun2.doc.ic.ac.uk:\ + tsun3.doc.ic.ac.uk:\ + tsun4.doc.ic.ac.uk:\ + tsun5.doc.ic.ac.uk:\ + tsun6.doc.ic.ac.uk:\ + tsun7.doc.ic.ac.uk:\ + tsun8.doc.ic.ac.uk:\ + tsun9.doc.ic.ac.uk:\ + tsun10.doc.ic.ac.uk:\ + tsun11.doc.ic.ac.uk:\ + tsun12.doc.ic.ac.uk:\ + tsun13.doc.ic.ac.uk:\ + tsun14.doc.ic.ac.uk:\ + tsun15.doc.ic.ac.uk:\ + ssun1.doc.ic.ac.uk:\ + whoops.doc.ic.ac.uk:\ + " + } + } +} + +// root filesystems for diskless clients +fs /dev/xy0d { + fstype = FSTYPE_UFS + opts = rw,grpid + freq = 1 + passno = 3 + mount /export/roots { + tsun1 { + volname /vol/export/roots/tsun1 + exportfs "-root=tsun1.doc.ic.ac.uk,-access=tsun1.doc.ic.ac.uk" + } + tsun2 { + volname /vol/export/roots/tsun2 + exportfs "-root=tsun2.doc.ic.ac.uk,-access=tsun2.doc.ic.ac.uk" + } + tsun3 { + volname /vol/export/roots/tsun3 + exportfs "-root=tsun3.doc.ic.ac.uk,-access=tsun3.doc.ic.ac.uk" + } + tsun4 { + volname /vol/export/roots/tsun4 + exportfs "-root=tsun4.doc.ic.ac.uk,-access=tsun4.doc.ic.ac.uk" + } + tsun5 { + volname /vol/export/roots/tsun5 + exportfs "-root=tsun5.doc.ic.ac.uk,-access=tsun5.doc.ic.ac.uk" + } + tsun6 { + volname /vol/export/roots/tsun6 + exportfs "-root=tsun6.doc.ic.ac.uk,-access=tsun6.doc.ic.ac.uk" + } + tsun7 { + volname /vol/export/roots/tsun7 + exportfs "-root=tsun7.doc.ic.ac.uk,-access=tsun7.doc.ic.ac.uk" + } + tsun8 { + volname /vol/export/roots/tsun8 + exportfs "-root=tsun8.doc.ic.ac.uk,-access=tsun8.doc.ic.ac.uk" + } + tsun9 { + volname /vol/export/roots/tsun9 + exportfs "-root=tsun9.doc.ic.ac.uk,-access=tsun9.doc.ic.ac.uk" + } + tsun10 { + volname /vol/export/roots/tsun10 + exportfs "-root=tsun10.doc.ic.ac.uk,-access=tsun10.doc.ic.ac.uk" + } + tsun11 { + volname /vol/export/roots/tsun11 + exportfs "-root=tsun11.doc.ic.ac.uk,-access=tsun11.doc.ic.ac.uk" + } + tsun12 { + volname /vol/export/roots/tsun12 + exportfs "-root=tsun12.doc.ic.ac.uk,-access=tsun12.doc.ic.ac.uk" + } + tsun13 { + volname /vol/export/roots/tsun13 + exportfs "-root=tsun13.doc.ic.ac.uk,-access=tsun13.doc.ic.ac.uk" + } + tsun14 { + volname /vol/export/roots/tsun14 + exportfs "-root=tsun14.doc.ic.ac.uk,-access=tsun14.doc.ic.ac.uk" + } + tsun15 { + volname /vol/export/roots/tsun15 + exportfs "-root=tsun15.doc.ic.ac.uk,-access=tsun15.doc.ic.ac.uk" + } + } +} + +// swap for diskless clients +fs /dev/xy1c { + fstype = FSTYPE_UFS + opts = DEFAULT_OPTS + freq = 1 + passno = 5 + mount /export/swaps { + tsun1 { + volname /vol/export/swaps/tsun1 + exportfs "-root=tsun1.doc.ic.ac.uk,-access=tsun1.doc.ic.ac.uk" + } + tsun2 { + volname /vol/export/swaps/tsun2 + exportfs "-root=tsun2.doc.ic.ac.uk,-access=tsun2.doc.ic.ac.uk" + } + tsun3 { + volname /vol/export/swaps/tsun3 + exportfs "-root=tsun3.doc.ic.ac.uk,-access=tsun3.doc.ic.ac.uk" + } + tsun4 { + volname /vol/export/swaps/tsun4 + exportfs "-root=tsun4.doc.ic.ac.uk,-access=tsun4.doc.ic.ac.uk" + } + tsun5 { + volname /vol/export/swaps/tsun5 + exportfs "-root=tsun5.doc.ic.ac.uk,-access=tsun5.doc.ic.ac.uk" + } + tsun6 { + volname /vol/export/swaps/tsun6 + exportfs "-root=tsun6.doc.ic.ac.uk,-access=tsun6.doc.ic.ac.uk" + } + tsun7 { + volname /vol/export/swaps/tsun7 + exportfs "-root=tsun7.doc.ic.ac.uk,-access=tsun7.doc.ic.ac.uk" + } + tsun8 { + volname /vol/export/swaps/tsun8 + exportfs "-root=tsun8.doc.ic.ac.uk,-access=tsun8.doc.ic.ac.uk" + } + tsun9 { + volname /vol/export/swaps/tsun9 + exportfs "-root=tsun9.doc.ic.ac.uk,-access=tsun9.doc.ic.ac.uk" + } + tsun10 { + volname /vol/export/swaps/tsun10 + exportfs "-root=tsun10.doc.ic.ac.uk,-access=tsun10.doc.ic.ac.uk" + } + tsun11 { + volname /vol/export/swaps/tsun11 + exportfs "-root=tsun11.doc.ic.ac.uk,-access=tsun11.doc.ic.ac.uk" + } + tsun12 { + volname /vol/export/swaps/tsun12 + exportfs "-root=tsun12.doc.ic.ac.uk,-access=tsun12.doc.ic.ac.uk" + } + tsun13 { + volname /vol/export/swaps/tsun13 + exportfs "-root=tsun13.doc.ic.ac.uk,-access=tsun13.doc.ic.ac.uk" + } + tsun14 { + volname /vol/export/swaps/tsun14 + exportfs "-root=tsun14.doc.ic.ac.uk,-access=tsun14.doc.ic.ac.uk" + } + tsun15 { + volname /vol/export/swaps/tsun15 + exportfs "-root=tsun15.doc.ic.ac.uk,-access=tsun15.doc.ic.ac.uk" + } + } +} diff --git a/usr.sbin/amd/fsinfo/conf/hosts/whoops.doc.ic.ac.uk b/usr.sbin/amd/fsinfo/conf/hosts/whoops.doc.ic.ac.uk new file mode 100644 index 0000000..831053b --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/hosts/whoops.doc.ic.ac.uk @@ -0,0 +1,21 @@ +// $Id$ +// sm's bastardised csg_sun3 +// note that no /var/spool/rwho is mounted as we now expect amd to do this as /vol/rwho + +#define HOST whoops +#define DOMAIN doc.ic.ac.uk +#define BOOT gould.doc.ic.ac.uk +#define EXEC gould.doc.ic.ac.uk +#define MAIL tsunfs.doc.ic.ac.uk + +// a sun3 +host HOST.DOMAIN + +mount /vol/export/roots/HOST as / from BOOT opts rw,grpid,hard,intr +mount /vol/export/swaps/HOST fstype swap as swap from BOOT opts swap +mount /vol/export/exec/sun3 as /usr from EXEC opts ro,grpid,hard,intr +mount /vol/export/misc/crash/HOST as /var/crash/HOST from EXEC opts rw,nosuid,grpid,hard,intr +mount /vol/export/misc/tmp/HOST as /tmp from EXEC opts rw,nosuid,grpid,hard,intr +mount /vol/export/misc/usr.tmp/HOST as /var/tmp from EXEC opts rw,nosuid,grpid,hard,intr +mount /var/mmdf from MAIL opts rw,nosuid,grpid,hard,intr + diff --git a/usr.sbin/amd/fsinfo/conf/users b/usr.sbin/amd/fsinfo/conf/users new file mode 100644 index 0000000..9dc83d9 --- /dev/null +++ b/usr.sbin/amd/fsinfo/conf/users @@ -0,0 +1,106 @@ +audit -> /etc/security/audit +bin -> /bin +daemon -> / +games -> /usr/games +ingres -> /usr/ingres +news -> /var/spool/news +nobody -> /nonexistent +root -> / +sync -> / +sys -> / +sysdiag -> /usr/diag/sysdiag +uucp -> /var/spool/uucppublic +acwf = /home/toytown/others/acwf +adh = /home/dylan/dk2/adh +ae = /home/toytown/samson/ae +aj = /home/toytown/samson/aj +athena = /vol/src/athena +bh = /home/toytown/jim/bh +bp = /home/toytown/others/bp +brg = /home/gummo/users/brg +bt = /home/toytown/samson/bt +ca = /home/toytown/diadem/ca +ccm = /home/toytown/ai/ccm +chlo = /home/toytown/samson/chlo +clh = /home/toytown/ai/clh +cr = /home/toytown/samson/cr +cw = /home/toytown/genesis/cw +dds = /home/toytown/genesis/dds +dg = /home/toytown/dov/dg +dgb = /home/dylan/dk2/dgb +dme = /home/achilles/dme +dp = /home/gummo/usersdiana +ds = /home/toytown/ai/ds +dwj = /home/achilles/dwj +eaa = /home/toytown/dov/eaa +esh = /home/toytown/ai/esh +fcs = /home/ganymede/fcs +fst = /home/dylan/dk2/fst +glb = /home/toytown/ai/glb +grace = /home/toytown/others/grace +guest = /home/toytown/others/guest +hd = /home/toytown/others/hd +hf = /home/toytown/genesis/hf +iccp = /home/toytown/samson/iccp +ids = /home/toytown/samson/ids +ih = /home/toytown/others/ih +ja = /home/toytown/ai/ja +jfc = /home/toytown/jim/jfc +jg = /home/toytown/genesis/jg +jjc = /home/toytown/genesis/jjc +js = /home/toytown/samson/js +jsp = /home/achilles/jsp +jvp = /home/toytown/jim/jvp +kdr = /home/dylan/dk2/kdr +kevin = /home/toytown/others/kpt +kpt = /home/toytown/others/kpt +ksa = /home/toytown/ai/ksa +lkcl = /home/dylan/dk2/lkcl +ll = /home/toytown/dov/ll +ll1 = /home/toytown/others/ll1 +lmjm = /home/toytown/others/lmjm +lsh = /home/toytown/ai/lsh +mb = /home/toytown/jim/mb +md = /home/achilles/md +mdr = /home/achilles/mdr +mg = /home/ganymede/mg +mjh = /home/toytown/others/mjh +mrs = /home/achilles/mrs +mwg = /home/achilles/mwg +mwt = /home/achilles/mwt +nd = /home/gummo/users/nd +njw = /home/dylan/dk2/njw +ok = /home/ganymede/ok +pah = /home/toytown/jim/pah +pdg = /home/toytown/samson/pdg +phjk = /home/toytown/ai/phjk +pm = /home/achilles/pm +pm2 = /home/dylan/dk2/pm2 +ps = /home/toytown/genesis/ps +pt = /home/toytown/dov/pt +pvr = /home/toytown/jim/pvr +rgc = /home/toytown/jim/rgc +rjc = /home/toytown/jim/rjc +rjq = /home/achilles/rjq +sa = /home/toytown/samson/sa +shb = /home/toytown/others/shb +shc = /home/dylan/dk2/shc +sjk = /home/toytown/jim/sjk +sjl2 = /home/achilles/sjl2 +sjv = /home/ganymede/sjv +sm = /home/toytown/others/sm +sme = /home/ganymede/sme +sph = /home/toytown/ai/sph +ssp = /home/toytown/others/ssp +sw = /home/toytown/others/sw +sza = /home/ganymede/sza +teb = /home/dylan/dk2/teb +thp = /home/achilles/thp +tm = /home/toytown/ai/tm +tsem = /home/toytown/genesis/tsem +umacd20 = /home/ganymede/umacd20 +wmvh = /home/dylan/dk2/wmvh +wrdo = /home/ganymede/wrdo +ygal = /home/toytown/samson/ygal +zmact03 = /home/toytown/jim/zmact03 +zmacy26 = /home/toytown/jim/zmacy26 diff --git a/usr.sbin/amd/fsinfo/fsi_analyze.c b/usr.sbin/amd/fsinfo/fsi_analyze.c new file mode 100644 index 0000000..d436a49 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsi_analyze.c @@ -0,0 +1,645 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsi_analyze.c 8.1 (Berkeley) 6/6/93 + * + * $Id: fsi_analyze.c,v 5.2.2.1 1992/02/09 15:09:41 jsp beta $ + * + */ + +/* + * Analyze filesystem declarations + * + * Note: most of this is magic! + */ + +#include "../fsinfo/fsinfo.h" + +char *disk_fs_strings[] = { + "fstype", "opts", "dumpset", "passno", "freq", "mount", "log", 0, +}; + +char *mount_strings[] = { + "volname", "exportfs", 0, +}; + +char *fsmount_strings[] = { + "as", "volname", "fstype", "opts", "from", 0, +}; + +char *host_strings[] = { + "host", "netif", "config", "arch", "cluster", "os", 0, +}; + +char *ether_if_strings[] = { + "inaddr", "netmask", "hwaddr", 0, +}; + +/* + * Strip off the trailing part of a domain + * to produce a short-form domain relative + * to the local host domain. + * Note that this has no effect if the domain + * names do not have the same number of + * components. If that restriction proves + * to be a problem then the loop needs recoding + * to skip from right to left and do partial + * matches along the way -- ie more expensive. + */ +void domain_strip(otherdom, localdom) +char *otherdom, *localdom; +{ +#ifdef PARTIAL_DOMAINS + char *p1 = otherdom-1; + char *p2 = localdom-1; + + do { + if (p1 = strchr(p1+1, '.')) + if (p2 = strchr(p2+1, '.')) + if (STREQ(p1+1, p2+1)) { + *p1 = '\0'; + break; + } + } while (p1 && p2); +#else + char *p1, *p2; + + if ((p1 = strchr(otherdom, '.')) && + (p2 = strchr(localdom, '.')) && + (strcmp(p1+1, p2+1) == 0)) + *p1 = '\0'; +#endif /* PARTIAL_DOMAINS */ +} + +/* + * 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(hn) +char *hn; +{ + char *p = strdup(hn); + char *d; + char path[MAXPATHLEN]; + + domain_strip(p, hostname); + path[0] = '\0'; + + do { + d = strrchr(p, '.'); + if (d) { + *d = 0; + strcat(path, d+1); + strcat(path, "/"); + } else { + strcat(path, p); + } + } while (d); + + log("hostpath of '%s' is '%s'", hn, path); + + strcpy(p, path); + return p; +} + +static dict_ent *find_volname(nn) +char *nn; +{ + dict_ent *de; + char *p = strdup(nn); + char *q; + + do { + log("Searching for volname %s", p); + de = dict_locate(dict_of_volnames, p); + q = strrchr(p, '/'); + if (q) *q = '\0'; + } while (!de && q); + + free(p); + return de; +} + +static show_required(l, mask, info, hostname, strings) +ioloc *l; +int mask; +char *info; +char *hostname; +char *strings[]; +{ + int i; + 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(q, e) +qelem *q; +mount *e; +{ + mount *mp; + int errors = 0; + + ITER(mp, mount, q) { + if (ISSET(mp->m_mask, DM_EXPORTFS)) { + if (e) + lwarning(mp->m_ioloc, "%s has duplicate exportfs data", mp->m_name); + mp->m_exported = mp; + if (!ISSET(mp->m_mask, DM_VOLNAME)) + set_mount(mp, DM_VOLNAME, strdup(mp->m_name)); + } else { + mp->m_exported = e; + } + + /* + * Recursively descend the mount tree + */ + if (mp->m_mount) + errors += check_exportfs(mp->m_mount, mp->m_exported); + + /* + * If a volume name has been specified, but this node and none + * of its parents has been exported, report an error. + */ + if (ISSET(mp->m_mask, DM_VOLNAME) && !mp->m_exported) { + lerror(mp->m_ioloc, "%s has a volname but no exportfs data", mp->m_name); + errors++; + } + } + + return errors; +} + +static int analyze_dkmount_tree(q, parent, dk) +qelem *q; +mount *parent; +disk_fs *dk; +{ + mount *mp; + int errors = 0; + + ITER(mp, mount, q) { + log("Mount %s:", mp->m_name); + if (parent) { + char n[MAXPATHLEN]; + sprintf(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); + log("Changing name %s to %s", mp->m_name, n); + free(mp->m_name); + mp->m_name = strdup(n); + } + mp->m_name_len = strlen(mp->m_name); + mp->m_parent = parent; + mp->m_dk = dk; + if (mp->m_mount) + analyze_dkmount_tree(mp->m_mount, mp, dk); + } + + return errors; +} + +/* + * The mount tree is a singleton list + * containing the top-level mount + * point for a disk. + */ +static int analyze_dkmounts(dk, q) +disk_fs *dk; +qelem *q; +{ + int errors = 0; + mount *mp, *mp2 = 0; + int i = 0; + + /* + * First scan the list of subdirs to make + * sure there is only one - and remember it + */ + if (q) { + ITER(mp, 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 (STREQ(mp2->m_name, "default")) { + if (ISSET(mp2->m_mask, DM_VOLNAME)) { + char nbuf[1024]; + compute_automount_point(nbuf, dk->d_host, mp2->m_volname); + free(mp2->m_name); + mp2->m_name = strdup(nbuf); + log("%s:%s has default mount on %s", dk->d_host->h_hostname, dk->d_dev, mp2->m_name); + } else { + lerror(dk->d_ioloc, "no volname given for %s:%s", dk->d_host->h_hostname, dk->d_dev); + errors++; + } + } + /* + * Fill in the disk mount point + */ + if (!errors && mp2 && mp2->m_name) + dk->d_mountpt = strdup(mp2->m_name); + else + dk->d_mountpt = strdup("error"); + + /* + * Analyze the mount tree + */ + errors += analyze_dkmount_tree(q, 0, dk); + + /* + * Analyze the export tree + */ + errors += check_exportfs(q, 0); + + return errors; +} + +static void fixup_required_disk_info(dp) +disk_fs *dp; +{ + /* + * "fstype" + */ + if (ISSET(dp->d_mask, DF_FSTYPE)) { + if (STREQ(dp->d_fstype, "swap")) { + /* + * Fixup for a swap device + */ + if (!ISSET(dp->d_mask, DF_PASSNO)) { + dp->d_passno = 0; + BITSET(dp->d_mask, DF_PASSNO); + } else if (dp->d_freq != 0) { + lwarning(dp->d_ioloc, + "Pass number for %s:%s is non-zero", + dp->d_host->h_hostname, dp->d_dev); + } + + /* + * "freq" + */ + if (!ISSET(dp->d_mask, DF_FREQ)) { + dp->d_freq = 0; + BITSET(dp->d_mask, DF_FREQ); + } else if (dp->d_freq != 0) { + lwarning(dp->d_ioloc, + "dump frequency for %s:%s is non-zero", + dp->d_host->h_hostname, dp->d_dev); + } + + /* + * "opts" + */ + if (!ISSET(dp->d_mask, DF_OPTS)) + set_disk_fs(dp, DF_OPTS, strdup("swap")); + + /* + * "mount" + */ + if (!ISSET(dp->d_mask, DF_MOUNT)) { + qelem *q = new_que(); + mount *m = new_mount(); + m->m_name = strdup("swap"); + m->m_mount = new_que(); + ins_que(&m->m_q, q->q_back); + dp->d_mount = q; + BITSET(dp->d_mask, DF_MOUNT); + } else { + lerror(dp->d_ioloc, "%s: mount field specified for swap partition", dp->d_host->h_hostname); + } + } else if (STREQ(dp->d_fstype, "export")) { + /* + * "passno" + */ + if (!ISSET(dp->d_mask, DF_PASSNO)) { + dp->d_passno = 0; + BITSET(dp->d_mask, DF_PASSNO); + } else if (dp->d_passno != 0) { + lwarning(dp->d_ioloc, + "pass number for %s:%s is non-zero", + dp->d_host->h_hostname, dp->d_dev); + } + + /* + * "freq" + */ + if (!ISSET(dp->d_mask, DF_FREQ)) { + dp->d_freq = 0; + BITSET(dp->d_mask, DF_FREQ); + } else if (dp->d_freq != 0) { + lwarning(dp->d_ioloc, + "dump frequency for %s:%s is non-zero", + dp->d_host->h_hostname, dp->d_dev); + } + + /* + * "opts" + */ + if (!ISSET(dp->d_mask, DF_OPTS)) + set_disk_fs(dp, DF_OPTS, strdup("rw,defaults")); + + } + } +} + +static void fixup_required_mount_info(fp, de) +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; + mount *mp = 0; + ITER(dd, dict_data, &de->de_q) { + mp = (mount *) dd->dd_data; + break; + } + if (!mp) + abort(); + fp->f_ref = mp; + set_fsmount(fp, FM_FROM, mp->m_dk->d_host->h_hostname); + log("set: %s comes from %s", fp->f_volname, fp->f_from); + } + } + + if (!ISSET(fp->f_mask, FM_FSTYPE)) { + set_fsmount(fp, FM_FSTYPE, strdup("nfs")); + log("set: fstype is %s", fp->f_fstype); + } + + if (!ISSET(fp->f_mask, FM_OPTS)) { + set_fsmount(fp, FM_OPTS, strdup("rw,nosuid,grpid,defaults")); + log("set: opts are %s", fp->f_opts); + } + + if (!ISSET(fp->f_mask, FM_LOCALNAME)) { + if (fp->f_ref) { + set_fsmount(fp, FM_LOCALNAME, strdup(fp->f_volname)); + 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(hp) +host *hp; +{ + qelem *q = hp->h_disk_fs; + disk_fs *dp; + + ITER(dp, disk_fs, q) { + int req; + 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(hp) +host *hp; +{ + qelem *q = hp->h_mount; + fsmount *fp; + int netbootp = 0; + + ITER(fp, fsmount, q) { + char *p; + char *nn = strdup(fp->f_volname); + int req; + dict_ent *de; + int found = 0; + int matched = 0; + do { + p = 0; + de = find_volname(nn); + log("Mount: %s (trying %s)", fp->f_volname, nn); + + if (de) { + found = 1; + /* + * Check that the from field is really exporting + * the filesystem requested. + */ + if (ISSET(fp->f_mask, FM_FROM)) { + dict_data *dd; + mount *mp2 = 0; + ITER(dd, dict_data, &de->de_q) { + mount *mp = (mount *) dd->dd_data; + if (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); + free(nn); + + if (!found) { + lerror(fp->f_ioloc, "volname %s unknown", fp->f_volname); + } else if (matched) { + 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 (strcmp(fp->f_localname, "/") == 0) { + hp->h_netroot = fp; + netbootp |= FM_NETROOT; + } else if (strcmp(fp->f_localname, "swap") == 0) { + 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(q) +qelem *q; +{ + host *hp; + + show_area_being_processed("analyze hosts", 5); + + /* + * Check all drives + */ + ITER(hp, host, q) { + 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) { + 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(ap) +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(q, pref, lvl) +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"); + sprintf(nname, "%s/%s", pref, ap->a_name); + free(ap->a_name); + ap->a_name = strdup(nname[1] == '/' ? nname+1 : nname); + 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_volname) { + log("\tautomount from %s", ap->a_volname); + analyze_automount(ap); + } else if (ap->a_symlink) { + log("\tsymlink to %s", ap->a_symlink); + } else { + ap->a_volname = strdup(ap->a_name); + log("\timplicit automount from %s", ap->a_volname); + analyze_automount(ap); + } + } +} + +void analyze_automounts(q) +qelem *q; +{ + auto_tree *tp; + + show_area_being_processed("analyze automount", 5); + /* + * q is a list of automounts + */ + ITER(tp, auto_tree, q) + analyze_automount_tree(tp->t_mount, "", 0); +} diff --git a/usr.sbin/amd/fsinfo/fsi_data.h b/usr.sbin/amd/fsinfo/fsi_data.h new file mode 100644 index 0000000..3fc10c4 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsi_data.h @@ -0,0 +1,236 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsi_data.h 8.1 (Berkeley) 6/6/93 + * + * $Id: fsi_data.h,v 5.2.2.1 1992/02/09 15:09:53 jsp beta $ + * + */ + +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 mount mount; +typedef struct qelem qelem; + +/* + * Linked lists... + */ +struct qelem { + qelem *q_forw; + qelem *q_back; +}; + +/* + * 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 */ + qelem *a_mount; /* Tree representation */ + dict_ent *a_mounted; +}; + +/* + * List of automount trees + */ +struct auto_tree { + qelem t_q; + ioloc *t_ioloc; + char *t_defaults; + qelem *t_mount; +}; + +/* + * A host + */ +struct host { + qelem q; + int h_mask; + ioloc *h_ioloc; + fsmount *h_netroot, *h_netswap; +#define HF_HOST 0 + char *h_hostname; /* The full name of the host */ + char *h_lochost; /* The name of the host with local domains stripped */ + char *h_hostpath; /* The filesystem path to the host (cf compute_hostpath) */ +#define HF_ETHER 1 + qelem *h_ether; +#define HF_CONFIG 2 + qelem *h_config; +#define HF_ARCH 3 + char *h_arch; +#define HF_CLUSTER 4 + char *h_cluster; +#define HF_OS 5 + char *h_os; + qelem *h_disk_fs; + qelem *h_mount; +}; + +/* + * An ethernet interface + */ +struct ether_if { + qelem e_q; + int e_mask; + ioloc *e_ioloc; + char *e_if; +#define EF_INADDR 0 + struct in_addr e_inaddr; +#define EF_NETMASK 1 + u_long e_netmask; +#define EF_HWADDR 2 + char *e_hwaddr; +}; + +/* + * Disk filesystem structure. + * + * If the DF_* numbers are changed + * disk_fs_strings in analyze.c will + * need updating. + */ +struct disk_fs { + qelem d_q; + int d_mask; + ioloc *d_ioloc; + host *d_host; + char *d_mountpt; + char *d_dev; +#define DF_FSTYPE 0 + char *d_fstype; +#define DF_OPTS 1 + char *d_opts; +#define DF_DUMPSET 2 + char *d_dumpset; +#define DF_PASSNO 3 + int d_passno; +#define DF_FREQ 4 + int d_freq; +#define DF_MOUNT 5 + qelem *d_mount; +#define DF_LOG 6 + char *d_log; +}; +#define DF_REQUIRED ((1<<DF_FSTYPE)|(1<<DF_OPTS)|(1<<DF_PASSNO)|(1<<DF_MOUNT)) + +/* + * A mount tree + */ +struct mount { + qelem m_q; + ioloc *m_ioloc; + int m_mask; +#define DM_VOLNAME 0 + char *m_volname; +#define DM_EXPORTFS 1 + char *m_exportfs; +#define DM_SEL 2 + char *m_sel; + char *m_name; + int m_name_len; + mount *m_parent; + disk_fs *m_dk; + mount *m_exported; + qelem *m_mount; +}; + +/* + * Additional filesystem mounts + * + * If the FM_* numbers are changed + * disk_fs_strings in analyze.c will + * need updating. + */ +struct fsmount { + qelem f_q; + mount *f_ref; + ioloc *f_ioloc; + int f_mask; +#define FM_LOCALNAME 0 + char *f_localname; +#define FM_VOLNAME 1 + char *f_volname; +#define FM_FSTYPE 2 + char *f_fstype; +#define FM_OPTS 3 + char *f_opts; +#define FM_FROM 4 + char *f_from; +}; +#define FM_REQUIRED ((1<<FM_VOLNAME)|(1<<FM_FSTYPE)|(1<<FM_OPTS)|(1<<FM_FROM)|(1<<FM_LOCALNAME)) +#define FM_NETROOT 0x01 +#define FM_NETSWAP 0x02 +#define FM_NETBOOT (FM_NETROOT|FM_NETSWAP) + +#define DICTHASH 5 +struct dict_ent { + dict_ent *de_next; + char *de_key; + int de_count; + qelem de_q; +}; + +/* + * Dictionaries ... + */ +struct dict_data { + qelem dd_q; + char *dd_data; +}; + +struct dict { + dict_ent *de[DICTHASH]; +}; + +/* + * Source text location for error reports + */ +struct ioloc { + int i_line; + char *i_file; +}; diff --git a/usr.sbin/amd/fsinfo/fsi_dict.c b/usr.sbin/amd/fsinfo/fsi_dict.c new file mode 100644 index 0000000..5067e79 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsi_dict.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsi_dict.c 8.1 (Berkeley) 6/6/93 + * + * $Id: fsi_dict.c,v 5.2.2.1 1992/02/09 15:09:43 jsp beta $ + * + */ + +/* + * Dictionary support + */ + +#include "../fsinfo/fsinfo.h" + +static int dict_hash(k) +char *k; +{ + unsigned int h; + + for (h = 0; *k; h += *k++) + ; + return h % DICTHASH; +} + +dict *new_dict() +{ + dict *dp = ALLOC(dict); + return dp; +} + +static void dict_add_data(de, v) +dict_ent *de; +char *v; +{ + dict_data *dd = ALLOC(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(k) +char *k; +{ + dict_ent *de = ALLOC(dict_ent); + de->de_key = k; + init_que(&de->de_q); + return de; +} + +dict_ent *dict_locate(dp, k) +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(dp, k, v) +dict *dp; +char *k, *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(dp, fn) +dict *dp; +int (*fn)(); +{ + int i; + int errors = 0; + + for (i = 0; i < DICTHASH; i++) { + dict_ent *de = dp->de[i]; + while (de) { + errors += (*fn)(&de->de_q); + de = de->de_next; + } + } + return errors; +} diff --git a/usr.sbin/amd/fsinfo/fsi_gram.y b/usr.sbin/amd/fsinfo/fsi_gram.y new file mode 100644 index 0000000..b4aa245 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsi_gram.y @@ -0,0 +1,394 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsi_gram.y 8.1 (Berkeley) 6/6/93 + * + * $Id: fsi_gram.y,v 5.2.2.1 1992/02/09 15:09:35 jsp beta $ + * + */ + +%{ +#include "../fsinfo/fsinfo.h" +#include <stdio.h> + +extern qelem *list_of_hosts, *list_of_automounts; +%} + +%union { + auto_tree *a; + disk_fs *d; + ether_if *e; + host *h; + qelem *q; + char *s; + mount *m; + fsmount *f; +} + +%token tARCH +%token tAS +%token tAUTOMOUNT +%token tCLUSTER +%token tCONFIG +%token tDUMPSET +%token tEQ +%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 tSEL +%token <s> tSTR + +%start list_of_hosts + +%type <a> automount +%type <q> automount_tree +%type <e> ether_attr +%type <m> dir_tree_info +%type <d> filesystem fs_info_list +%type <h> host host_attr host_attr_list +%type <q> list_of_hosts list_of_filesystems list_of_mounts dir_tree +%type <f> localinfo_list +%type <s> opt_auto_opts + +%% + +list_of_hosts : + /* empty */ + { $$ = new_que(); } + + | list_of_hosts host + { if ($2) ins_que((qelem *) $2, list_of_hosts->q_back); + $$ = $1; } + + | list_of_hosts automount + { if ($2) ins_que((qelem *) $2, list_of_automounts->q_back); + $$ = $1; } + ; + +/* + * A new host: + * + * host foo.domain + */ +host : + tHOST host_attr list_of_filesystems list_of_mounts + { $$ = $2; $$->h_disk_fs = $3; $$->h_mount = $4; } + + | error tHOST host_attr list_of_filesystems list_of_mounts + { $$ = $3; $$->h_disk_fs = $4; $$->h_mount = $5; } + + ; + +host_attr : + tSTR + { $$ = new_host(); set_host($$, HF_HOST, $1); } + + | '{' host_attr_list '}' tSTR + { $$ = $2; set_host($$, HF_HOST, $4); } + + ; + +host_attr_list : + /* empty */ + { $$ = new_host(); } + + | host_attr_list tNETIF tSTR '{' ether_attr '}' + { if ($5) { + $5->e_if = $3; + $$ = $1; set_host($$, HF_ETHER, $5); } + } + + | host_attr_list tCONFIG tSTR + { $$ = $1; set_host($$, HF_CONFIG, $3); } + + | host_attr_list tARCH '=' tSTR + { $$ = $1; set_host($$, HF_ARCH, $4); } + + | host_attr_list tOS '=' tSTR + { $$ = $1; set_host($$, HF_OS, $4); } + + | host_attr_list tCLUSTER '=' tSTR + { $$ = $1; set_host($$, HF_CLUSTER, $4); } + + | host_attr_list error '=' tSTR + { yyerror("unknown host attribute"); } + ; + +ether_attr : + /* empty */ + { $$ = new_ether_if(); } + + | ether_attr tINADDR '=' tSTR + { $$ = $1; set_ether_if($$, EF_INADDR, $4); } + | ether_attr tNETMASK '=' tSTR + { $$ = $1; set_ether_if($$, EF_NETMASK, $4); } + | ether_attr tHWADDR '=' tSTR + { $$ = $1; set_ether_if($$, EF_HWADDR, $4); } + ; + +/* + * A new automount tree: + * + * automount /mountpoint { ... } + */ +automount : + tAUTOMOUNT opt_auto_opts automount_tree + { if ($3) { + $$ = new_auto_tree($2, $3); + } else { + $$ = 0; + } + } + + | tAUTOMOUNT error + { $$ = 0; } + ; + +opt_auto_opts : + /* empty */ + { $$ = strdup(""); } + + | tOPTS tSTR + { $$ = $2; } + ; + +list_of_filesystems : + /* empty */ + { $$ = 0; } + + | list_of_filesystems filesystem + { if ($2) { + if ($1) + $$ = $1; + else + $$ = new_que(); + ins_que(&$2->d_q, $$->q_back); + } else { + $$ = $1; + } + } + ; + +/* + * A new filesystem: + * + * fs /dev/whatever { ... } + */ +filesystem : + tFS tSTR '{' fs_info_list '}' + { $4->d_dev = $2; $$ = $4; } + + | tFS error '}' + { $$ = (disk_fs *) 0; } + ; + +/* + * Per-filesystem information: + * + * fstype - the type of the filesystem (4.2, nfs, swap, export) + * opts - the mount options ("rw,grpid") + * passno - fsck pass number + * freq - dump frequency + * dumpset - tape set for filesystem dumps + * mount - where to mount this filesystem + * log - log device + */ +fs_info_list : + /* empty */ + { $$ = new_disk_fs(); } + + | fs_info_list tFSTYPE '=' tSTR + { $$ = $1; set_disk_fs($$, DF_FSTYPE, $4); } + + | fs_info_list tOPTS '=' tSTR + { $$ = $1; set_disk_fs($$, DF_OPTS, $4); } + + | fs_info_list tPASSNO '=' tSTR + { $$ = $1; set_disk_fs($$, DF_PASSNO, $4); } + + | fs_info_list tFREQ '=' tSTR + { $$ = $1; set_disk_fs($$, DF_FREQ, $4); } + + | fs_info_list tMOUNT dir_tree + { $$ = $1; set_disk_fs($$, DF_MOUNT, (char *) $3); } + + | fs_info_list tDUMPSET '=' tSTR + { $$ = $1; set_disk_fs($$, DF_DUMPSET, $4); } + + | fs_info_list tLOG '=' tSTR + { $$ = $1; set_disk_fs($$, DF_LOG, $4); } + + | fs_info_list error '=' tSTR + { yyerror("unknown filesystem attribute"); } + ; + +/* + * An automount tree: + * + * name = "volname" name is a reference to volname + * name -> "string" name is a link to "string" + * name { ... } name is an automount tree + */ +automount_tree : + /* empty */ + { $$ = 0; } + + | automount_tree tSTR '=' tSTR + { automount *a = new_automount($2); + a->a_volname = $4; + 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 '{' automount_tree '}' + { automount *a = new_automount($2); + a->a_mount = $4; + 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 + */ +localinfo_list : + /* empty */ + { $$ = new_fsmount(); } + + | localinfo_list tAS tSTR + { $$ = $1; set_fsmount($$, FM_LOCALNAME, $3); } + + | localinfo_list tFROM tSTR + { $$ = $1; set_fsmount($$, FM_FROM, $3); } + + | localinfo_list tFSTYPE tSTR + { $$ = $1; set_fsmount($$, FM_FSTYPE, $3); } + + | localinfo_list tOPTS tSTR + { $$ = $1; set_fsmount($$, FM_OPTS, $3); } + + | localinfo_list error '=' tSTR + { yyerror("unknown mount attribute"); } + ; diff --git a/usr.sbin/amd/fsinfo/fsi_lex.l b/usr.sbin/amd/fsinfo/fsi_lex.l new file mode 100644 index 0000000..46ec532 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsi_lex.l @@ -0,0 +1,403 @@ +%{ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsi_lex.l 8.2 (Berkeley) 2/17/94 + * + * $Id: fsi_lex.l,v 5.2.2.1 1992/02/09 15:09:36 jsp beta $ + * + */ + +/* + * Lexical analyzer for fsinfo. + * TODO: Needs rewriting. + */ + +static int xinput(); +static void xunput(); + +#ifdef FLEX_SCANNER +static int yylineno; +/* Flex support with help from Vern Paxson <vern@helios.ee.lbl.gov> */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ +{ \ + int i; \ + for (i = 0; i < max_size; i++) { \ + int ch = xinput(i == 0); \ + if (ch == 0) \ + break; \ + buf[i] = ch; \ + } \ + result = i; \ +} + +#define INIT_STATE { \ + switch ((yy_start - 1) / 2) { \ + case 0: \ + BEGIN F; \ + break; \ + } \ +} + + +#else +/* + * Using old lex... + */ +#undef unput +#define unput(ch) xunput(ch) +#undef input +#define input() xinput(1) + +#define INIT_STATE { \ + switch (yybgin - yysvec - 1) { \ + case 0: \ + BEGIN F; \ + break; \ + } \ +} + +#endif /* FLEX_SCANNER */ + +#include "../fsinfo/fsinfo.h" +#include "fsi_gram.h" +#include <ctype.h> + +static char *filename; +static char *optr; +static char ostr[1024]; +static find_resword(); +static unsigned char ibuf[64]; +static unsigned char *iptr = ibuf; +static int quoted; +static int lastch, nextch = '\n'; +YYSTYPE yylval; + +struct r { + char *rw; + int tok; +} rr[] = { + { "->", tEQ }, + { "arch", tARCH }, + { "as", tAS }, + { "automount", tAUTOMOUNT }, + { "cluster", tCLUSTER }, + { "config", tCONFIG }, + { "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 }, + { "opts", tOPTS }, + { "os", tOS }, + { "passno", tPASSNO }, + { "sel", tSEL }, + { "volname", tVOLNAME }, + { 0, 0 }, +}; +#define NRES_WORDS (sizeof(rr)/sizeof(rr[0])-1) + +%} + +%start F Q + +%% + INIT_STATE; /* witchcraft */ + +<F>[^ \t\n"={}]+ { return find_resword(yytext); } +<F>[ \t] ; +<F>"\n" { yylineno++; } +<F>[={}] { return *yytext; } + +<F>\" { BEGIN Q; optr = ostr; quoted = 1; } +<Q>\n { yylineno++; yyerror("\" expected"); BEGIN F; } +<Q>\\b { *optr++ = '\b'; /* escape */ } +<Q>\\t { *optr++ = '\t'; /* escape */ } +<Q>\\\" { *optr++ = '\"'; /* escape */ } +<Q>\\\\ { *optr++ = '\\'; /* escape */ } +<Q>\\\n { yylineno++; /* continue */ } +<Q>\\r { *optr++ = '\r'; /* escape */ } +<Q>\\n { *optr++ = '\n'; /* escape */ } +<Q>\\f { *optr++ = '\f'; /* escape */ } +<Q>"\\ " { *optr++ = ' '; /* force space */ } +<Q>\\. { yyerror("Unknown \\ sequence"); } +<Q>([ \t]|"\\\n"){2,} { char *p = yytext-1; while (p = strchr(p+1, '\n')) yylineno++; } +<Q>\" { BEGIN F; quoted = 0; + *optr = '\0'; + yylval.s = strdup(ostr); + return tSTR; + } +<Q>. { *optr++ = *yytext; } + +%% + +static int find_resword(s) +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))) { + /*fprintf(stderr, "failed to cmp(%s, %s), %d, %d, %d\n", s, rr[m].rw, l, m, h);*/ + if (rc < 0) + h = m - 1; + else + l = m + 1; + m = (h + l) / 2; + } + + if (rc == 0) + tok = rr[m].tok; + + switch (tok) { + case tLOCALHOST: + s = "${host}"; + /* fall through... */ + case 0: + yylval.s = strdup(s); + tok = tSTR; + /* fall through... */ + default: + return tok; + } + +} + +int yyerror(s, s1, s2, s3, s4) +char *s; +char *s1, *s2, *s3, *s4; +{ + col_cleanup(0); + fprintf(stderr, "%s:%d: ", filename ? filename : "/dev/stdin", yylineno); + fprintf(stderr, s, s1, s2, s3, s4); + fputc('\n', stderr); + parse_errors++; +} + +ioloc *current_location() +{ + ioloc *ip = ALLOC(ioloc); + ip->i_line = yylineno; + ip->i_file = filename; + return ip; +} + +#ifdef FLEX_SCANNER +#undef yywrap +#endif + +int yywrap() +{ +static int first = 1; + if (first) { + char prog[16*1024]; + strcpy(prog, "for file in "); + while (*++g_argv) { + if (access(*g_argv, 4) < 0) { + error("\"%s\": Cannot open for reading", *g_argv); + file_io_errors++; + } else { + strcat(prog, *g_argv); + strcat(prog, " "); + } + } + strcat(prog, "; do /lib/cpp "); + strcat(prog, idvbuf); + strcat(prog, " -DHOSTNAME=\'"); + strcat(prog, hostname); + strcat(prog, "\' \"$file\"; done"); + yyin = popen(prog, "r"); + if (yyin) { + /*if (filename) free(filename);*/ + filename = strdup("unknown"); + yylineno = 1; + first = 0; + return 0; + } else { + perror(prog); + } + } + + if (!first && yyin && pclose(yyin) != 0) + parse_errors++; + + return 1; +} + +#define xgetc(fp) ((iptr > ibuf) ? (*--iptr) : (lastch = nextch, nextch = getc(fp), (nextch == EOF ? nextch = lastch, EOF : nextch))) + +static int xinput(need) +int need; +{ +static int c_comment = 0; + int ch, ch2; + + do { + ch = xgetc(yyin); + /* fprintf(stderr, "ch = %c, %#x, %d\n", ch, ibuf,iptr-ibuf); */ + if (ch == EOF) return 0; + if (quoted) + return ch; + if (c_comment) { + ch2 = ch; + do { + if (ch2 == '\n') { + nextch = '\n'; + return ch2; + } + /* C style comment */ + do { + ch2 = getc(yyin); + if (ch2 == '\n') { + nextch = '\n'; + return ch2; + } + } while (ch2 != '*' && ch2 != EOF); + + while (ch2 == '*') + ch2 = getc(yyin); + } while (ch2 != '/' && ch2 != EOF); + c_comment = 0; + if (ch2 == EOF) + break; + continue; + } + + if (ch == '#') { + /*log("lastch = '%c' (%#x)", lastch, lastch);*/ + if (lastch == '\n') { + char fname[MAXPATHLEN]; + char *fptr; + if (!need) { + xunput('#'); + nextch = '\n'; + return 0; + } + fname[0] = '\0'; + /* Skip past space */ + do { + ch2 = getc(yyin); + } while (ch2 != EOF && ch2 != '\n' && !isdigit(ch2)); + if (isdigit(ch2)) { + /* Read in line number */ + fptr = fname; + do { + *fptr++ = ch2; + ch2 = getc(yyin); + } while (isdigit(ch2)); + *fptr = '\0'; + if (fptr != fname) + yylineno = atoi(fname) - 1; + } + /* Skip past space */ + while (ch2 != EOF && ch2 != '\"' && ch2 != '\n') + ch2 = getc(yyin); + if (ch2 == '\"') { + /* Read file name */ + fptr = fname; + ch2 = getc(yyin); + while (ch2 != '\"' && ch2 != EOF && ch2 != EOF) { + *fptr++ = ch2; + ch2 = getc(yyin); + } + *fptr = '\0'; + if (fname[0]) { + log("Setting filename to \"%s\"", fname); + /*if (filename) free(filename);*/ + filename = strdup(fname); + } + } + while (ch2 != '\n' && ch2 != EOF) + ch2 = getc(yyin); + } else do { + ch2 = getc(yyin); + } while (ch2 != '\n' && ch2 != EOF); + if (ch2 == '\n') { + nextch = '\n'; + return ch2; + } + } else if (ch == '/') { + ch2 = getc(yyin); + if (ch2 == '/') { + /* C++ style comment */ + do { + ch2 = getc(yyin); + } while (ch2 != '\n' && ch2 != EOF); + if (ch2 == '\n') { + nextch = '\n'; + return ch2; + } + } else if (ch2 == '*') { + c_comment = 1; + continue; + } else { + xunput(ch2); + return ch; + } + } else { + return ch; + } + } while (ch2 != EOF); + error("End of file within comment"); + return 0; +} + +static void xunput(c) +int c; +{ + if (c && c != EOF) { + if (iptr == ibuf + sizeof(ibuf) - 1) + fatal("Out of space in lexical pushback"); + *iptr++ = c; + } +} diff --git a/usr.sbin/amd/fsinfo/fsi_util.c b/usr.sbin/amd/fsinfo/fsi_util.c new file mode 100644 index 0000000..c0d8088 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsi_util.c @@ -0,0 +1,573 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsi_util.c 8.1 (Berkeley) 6/6/93 + * + * $Id: fsi_util.c,v 5.2.2.1 1992/02/09 15:09:39 jsp beta $ + * + */ + +#include "../fsinfo/fsinfo.h" + +/* + * Lots of ways of reporting errors... + */ +void error(s, s1, s2, s3, s4) +char *s, *s1, *s2, *s3, *s4; +{ + col_cleanup(0); + fprintf(stderr, "%s: Error, ", progname); + fprintf(stderr, s, s1, s2, s3, s4); + fputc('\n', stderr); + errors++; +} + +void lerror(l, s, s1, s2, s3, s4) +ioloc *l; +char *s, *s1, *s2, *s3, *s4; +{ + col_cleanup(0); + fprintf(stderr, "%s:%d: ", l->i_file, l->i_line); + fprintf(stderr, s, s1, s2, s3, s4); + fputc('\n', stderr); + errors++; +} + +void lwarning(l, s, s1, s2, s3, s4) +ioloc *l; +char *s, *s1, *s2, *s3, *s4; +{ + col_cleanup(0); + fprintf(stderr, "%s:%d: ", l->i_file, l->i_line); + fprintf(stderr, s, s1, s2, s3, s4); + fputc('\n', stderr); + +} + +void fatal(s, s1, s2, s3, s4) +char *s, *s1, *s2, *s3, *s4; +{ + col_cleanup(1); + fprintf(stderr, "%s: Fatal, ", progname); + fprintf(stderr, s, s1, s2, s3, s4); + fputc('\n', stderr); + exit(1); +} + +/* + * Dup a string + */ +char *strdup(s) +char *s; +{ + int len = strlen(s); + char *sp = (char *) xmalloc(len+1); + + bcopy(s, sp, len); + sp[len] = 0; + + return sp; +} + +/* + * Debug log + */ +void log(s, s1, s2, s3, s4) +char *s, *s1, *s2, *s3, *s4; +{ + if (verbose > 0) { + fputc('#', stdout); + fprintf(stdout, "%s: ", progname); + fprintf(stdout, s, s1, s2, s3, s4); + putc('\n', stdout); + } +} + +void info_hdr(ef, info) +FILE *ef; +char *info; +{ + fprintf(ef, "# *** NOTE: This file contains %s info\n", info); +} + +void gen_hdr(ef, hn) +FILE *ef; +char *hn; +{ + fprintf(ef, "# *** NOTE: Only for use on %s\n", hn); +} + +static void make_banner(fp) +FILE *fp; +{ + time_t t = time((time_t*) 0); + char *ctime(), *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); +} + +static int show_range = 10; +static int col = 0; +static int total_shown = 0; +static int total_mmm = 8; + +static int col_output(len) +int len; +{ + int wrapped = 0; + col += len; + if (col > 77) { + fputc('\n', stdout); + col = len; + wrapped = 1; + } + return wrapped; +} + +static void show_total() +{ + if (total_mmm != -show_range+1) { + char n[8]; + int len; + if (total_mmm < 0) + fputc('*', stdout); + sprintf(n, "%d", total_shown); + len = strlen(n); + if (col_output(len)) + fputc(' ', stdout); + fputs(n, stdout); fflush(stdout); + total_mmm = -show_range; + } +} + +col_cleanup(eoj) +int eoj; +{ + if (verbose < 0) return; + if (eoj) { + show_total(); + fputs(")]", stdout); + } + if (col) { + fputc('\n', stdout); + col = 0; + } +} + +void show_new(msg) +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(area, n) +char *area; +int n; +{ +static char *last_area = 0; + if (verbose < 0) return; + if (last_area) { + if (total_shown) + show_total(); + fputs(")", stdout); + col += 1; + } + if (!last_area || strcmp(area, last_area) != 0) { + 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(pref, hn, hdr, arg) +char *pref; +char *hn; +void (*hdr)(); +char *arg; +{ + char p[MAXPATHLEN]; + FILE *ef; + sprintf(p, "%s%s", pref, hn); + log("Writing %s info for %s to %s", pref, hn, p); + ef = fopen(p, "w"); + if (ef) { + (*hdr)(ef, arg); + make_banner(ef, hn); + } else { + error("can't open %s for writing", p); + } + + return ef; +} + +int pref_close(fp) +FILE *fp; +{ + return fclose(fp) == 0; +} + +/* + * Determine where Amd would automount the host/volname pair + */ +void compute_automount_point(buf, hp, vn) +char *buf; +host *hp; +char *vn; +{ +#ifdef AMD_USES_HOSTPATH + sprintf(buf, "%s/%s%s", autodir, hp->h_hostpath, vn); +#else + sprintf(buf, "%s/%s%s", autodir, hp->h_lochost, vn); +#endif +} + +char *xcalloc(i, s) +int i; +int s; +{ + char *p = (char *) calloc(i, (unsigned) s); + if (!p) + fatal("Out of memory"); + return p; +} + +char *xmalloc(i) +int i; +{ + char *p = (char *) malloc(i); + if (!p) + fatal("Out of memory"); + return p; +} + +/* + * Data constructors.. + */ + +automount *new_automount(name) +char *name; +{ + automount *ap = ALLOC(automount); + ap->a_ioloc = current_location(); + ap->a_name = name; + ap->a_volname = 0; + ap->a_mount = 0; + show_new("automount"); + return ap; +} + +auto_tree *new_auto_tree(def, ap) +char *def; +qelem *ap; +{ + auto_tree *tp = ALLOC(auto_tree); + tp->t_ioloc = current_location(); + tp->t_defaults = def; + tp->t_mount = ap; + show_new("auto_tree"); + return tp; +} + +host *new_host() +{ + host *hp = ALLOC(host); + hp->h_ioloc = current_location(); + hp->h_mask = 0; + show_new("host"); + return hp; +} + +void set_host(hp, k, v) +host *hp; +int k; +char *v; +{ + int m = 1 << k; + if (hp->h_mask & m) { + yyerror("host field \"%s\" already set", host_strings[k]); + return; + } + + hp->h_mask |= m; + + switch (k) { + case HF_HOST: { + char *p = strdup(v); + dict_ent *de = dict_locate(dict_of_hosts, v); + if (de) + yyerror("duplicate host %s!", v); + else + dict_add(dict_of_hosts, v, (char *) hp); + hp->h_hostname = v; + domain_strip(p, hostname); + if (strchr(p, '.') != 0) + free(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() +{ + ether_if *ep = ALLOC(ether_if); + ep->e_mask = 0; + ep->e_ioloc = current_location(); + show_new("ether_if"); + return ep; +} + +void set_ether_if(ep,k, v) +ether_if *ep; +int k; +char *v; +{ + int m = 1 << k; + if (ep->e_mask & m) { + yyerror("netif field \"%s\" already set", ether_if_strings[k]); + return; + } + + ep->e_mask |= m; + + switch (k) { + case EF_INADDR: { + extern u_long inet_addr(); + ep->e_inaddr.s_addr = inet_addr(v); + if (ep->e_inaddr.s_addr == (u_long) -1) + yyerror("malformed IP dotted quad: %s", v); + free(v); + } break; + case EF_NETMASK: { + u_long nm = 0; + if ((sscanf(v, "0x%lx", &nm) == 1 || sscanf(v, "%lx", &nm) == 1) && nm != 0) + ep->e_netmask = htonl(nm); + else + yyerror("malformed netmask: %s", v); + free(v); + } break; + case EF_HWADDR: + ep->e_hwaddr = v; + break; + default: abort(); break; + } +} + +void set_disk_fs(dp, k, v) +disk_fs *dp; +int k; +char *v; +{ + int m = 1 << k; + if (dp->d_mask & m) { + yyerror("fs field \"%s\" already set", disk_fs_strings[k]); + return; + } + + dp->d_mask |= m; + + switch (k) { + case DF_FSTYPE: dp->d_fstype = v; break; + case DF_OPTS: dp->d_opts = v; break; + case DF_DUMPSET: dp->d_dumpset = v; break; + case DF_LOG: dp->d_log = v; break; + case DF_PASSNO: dp->d_passno = atoi(v); free(v); break; + case DF_FREQ: dp->d_freq = atoi(v); free(v); break; + case DF_MOUNT: dp->d_mount = &((mount *) v)->m_q; break; + default: abort(); break; + } +} + +disk_fs *new_disk_fs() +{ + disk_fs *dp = ALLOC(disk_fs); + dp->d_ioloc = current_location(); + show_new("disk_fs"); + return dp; +} + +void set_mount(mp, k, v) +mount *mp; +int k; +char *v; +{ + int m = 1 << k; + if (mp->m_mask & m) { + yyerror("mount tree field \"%s\" already set", mount_strings[k]); + return; + } + + mp->m_mask |= m; + + switch (k) { + case DM_VOLNAME: + dict_add(dict_of_volnames, v, (char *) mp); + mp->m_volname = v; + break; + case DM_EXPORTFS: + mp->m_exportfs = v; + break; + case DM_SEL: + mp->m_sel = v; + break; + default: abort(); break; + } +} + +mount *new_mount() +{ + mount *fp = ALLOC(mount); + fp->m_ioloc = current_location(); + show_new("mount"); + return fp; +} + +void set_fsmount(fp, k, v) +fsmount *fp; +int k; +char *v; +{ + int m = 1 << k; + if (fp->f_mask & m) { + yyerror("mount field \"%s\" already set", fsmount_strings[k]); + return; + } + + fp->f_mask |= m; + + switch (k) { + case FM_LOCALNAME: fp->f_localname = v; break; + case FM_VOLNAME: fp->f_volname = v; break; + case FM_FSTYPE: fp->f_fstype = v; break; + case FM_OPTS: fp->f_opts = v; break; + case FM_FROM: fp->f_from = v; break; + default: abort(); break; + } +} + +fsmount *new_fsmount() +{ + fsmount *fp = ALLOC(fsmount); + fp->f_ioloc = current_location(); + show_new("fsmount"); + return fp; +} + +void init_que(q) +qelem *q; +{ + q->q_forw = q->q_back = q; +} + +qelem *new_que() +{ + qelem *q = ALLOC(qelem); + init_que(q); + return q; +} + +void ins_que(elem, pred) +qelem *elem, *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(elem) +qelem *elem; +{ + qelem *p, *p2; + p = elem->q_forw; + p2 = elem->q_back; + + p2->q_forw = p; + p->q_back = p2; +} diff --git a/usr.sbin/amd/fsinfo/fsinfo.8 b/usr.sbin/amd/fsinfo/fsinfo.8 new file mode 100644 index 0000000..34db7c2 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsinfo.8 @@ -0,0 +1,77 @@ +.\" Copyright (c) 1993 Jan-Simon Pendry. +.\" Copyright (c) 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)fsinfo.8 8.1 (Berkeley) 6/28/93 +.\" +.Dd June 28, 1993 +.Dt FSINFO 8 +.Os +.Sh NAME +.Nm fsinfo +.Nd co-ordinate site-wide filesystem information +.Sh SYNOPSIS +.Nm \&fsinfo +.Op Fl v +.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 +.Op Fl D Ar string[=string]] +.Op Fl U Ar string[=string]] +.Ar config ... +.Sh DESCRIPTION +The +.Nm fsinfo +utility takes a set of system configuration information, and generates +a co-ordinated set of +.Xr amd , +.Xr mount +and +.Xr mountd +configuration files. +.Pp +The +.Nm fsinfo +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 . +.Sh HISTORY +The +.Nm fsinfo +command first appeared in 4.4BSD. diff --git a/usr.sbin/amd/fsinfo/fsinfo.c b/usr.sbin/amd/fsinfo/fsinfo.c new file mode 100644 index 0000000..a4b867b --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsinfo.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsinfo.c 8.1 (Berkeley) 6/6/93 + * + * $Id: fsinfo.c,v 5.2.2.1 1992/02/09 15:09:33 jsp beta $ + * + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +/* + * fsinfo + */ + +#include "../fsinfo/fsinfo.h" +#include "fsi_gram.h" +#include <pwd.h> + +qelem *list_of_hosts; +qelem *list_of_automounts; +dict *dict_of_volnames; +dict *dict_of_hosts; +char *autodir = "/a"; +char hostname[MAXHOSTNAMELEN+1]; +char *username; +int file_io_errors; +int parse_errors; +int errors; +int verbose; +char idvbuf[1024]; + +char **g_argv; +char *progname; + +/* + * Output file prefixes + */ +char *exportfs_pref; +char *fstab_pref; +char *dumpset_pref; +char *mount_pref; +char *bootparams_pref; + +/* + * Argument cracking... + */ +static void get_args(c, v) +int c; +char *v[]; +{ + extern char *optarg; + extern int optind; + 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")) != EOF) + 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': + strncpy(hostname, optarg, sizeof(hostname)-1); + 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': + sprintf(iptr, "-%c%s ", ch, optarg); + iptr += strlen(iptr); + break; + default: + usage++; + break; + } + + if (c != optind) { + g_argv = v + optind - 1; + if (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]) + log("g_argv[0] = %s", g_argv[0]); + else + log("g_argv[0] = (nil)"); +} + +/* + * Determine username of caller + */ +static char *find_username() +{ + extern char *getlogin(); + extern char *getenv(); + char *u = getlogin(); + if (!u) { + struct passwd *pw = getpwuid(getuid()); + if (pw) + u = pw->pw_name; + } + if (!u) + u = getenv("USER"); + if (!u) + u = getenv("LOGNAME"); + if (!u) + u = "root"; + + return strdup(u); +} + +/* + * MAIN + */ +main(argc, argv) +int argc; +char *argv[]; +{ + /* + * Process arguments + */ + get_args(argc, argv); + + /* + * If no hostname given then use the local name + */ + if (!*hostname && gethostname(hostname, sizeof(hostname)) < 0) { + perror("gethostname"); + exit(1); + } + + /* + * Get the username + */ + username = find_username(); + + /* + * New hosts and automounts + */ + list_of_hosts = new_que(); + list_of_automounts = new_que(); + + /* + * New dictionaries + */ + dict_of_volnames = new_dict(); + dict_of_hosts = new_dict(); + + /* + * Parse input + */ + show_area_being_processed("read config", 11); + if (yyparse()) + errors = 1; + errors += file_io_errors + parse_errors; + + if (errors == 0) { + /* + * Do semantic analysis of input + */ + analyze_hosts(list_of_hosts); + analyze_automounts(list_of_automounts); + } + + /* + * Give up if errors + */ + if (errors == 0) { + /* + * Output data files + */ + + write_atab(list_of_automounts); + write_bootparams(list_of_hosts); + write_dumpset(list_of_hosts); + write_exportfs(list_of_hosts); + write_fstab(list_of_hosts); + } + + col_cleanup(1); + + exit(errors); +} diff --git a/usr.sbin/amd/fsinfo/fsinfo.h b/usr.sbin/amd/fsinfo/fsinfo.h new file mode 100644 index 0000000..0d07e21 --- /dev/null +++ b/usr.sbin/amd/fsinfo/fsinfo.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fsinfo.h 8.1 (Berkeley) 6/6/93 + * + * $Id: fsinfo.h,v 5.2.2.1 1992/02/09 15:09:51 jsp beta $ + * + */ + +/* + * Get this in now so that OS_HDR can use it + */ +#ifdef __STDC__ +#define P(x) x +#define P_void void +#define Const const +#else +#define P(x) () +#define P_void /* as nothing */ +#define Const /* as nothing */ +#endif /* __STDC__ */ + +#ifdef __GNUC__ +#define INLINE /* __inline */ +#else +#define INLINE +#endif /* __GNUC__ */ + +/* + * Pick up target dependent definitions + */ +#include "os-defaults.h" +#include OS_HDR + +#ifdef VOIDP +typedef void *voidp; +#else +typedef char *voidp; +#endif /* VOIDP */ + +#include <stdio.h> +#include <sys/types.h> +#include <sys/param.h> + +/* + * Bogosity to deal with ether { ... } + */ +#include <sys/socket.h> +#include <netinet/in.h> +#include <net/if.h> +#include <netinet/if_ether.h> + +#include "fsi_data.h" + +extern char* strchr P((Const char*, int)); /* C */ +extern char* strrchr P((Const char*, int)); /* C */ +extern char *strdup P((char*)); /* C */ +extern void fatal(); +extern void warning(); +extern void error(); +extern void analyze_automounts P((qelem*)); +extern void analyze_hosts P((qelem*)); +extern void compute_automount_point P((char*, host*, char*)); +extern automount *new_automount P((char*)); +extern auto_tree *new_auto_tree P((char*, qelem*)); +extern host *new_host P((void)); +extern disk_fs *new_disk_fs P((void)); +extern void set_disk_fs P((disk_fs*, int, char*)); +extern ether_if *new_ether_if P((void)); +extern mount *new_mount P((void)); +extern void set_mount P((mount*, int, char*)); +extern fsmount *new_fsmount P((void)); +extern void set_fsmount P((fsmount*, int, char*)); +extern qelem *new_que P((void)); +extern void init_que P((qelem*)); +extern void ins_que P((qelem*, qelem*)); +extern void rem_que P((qelem*)); +extern dict *new_dict P((void)); +extern dict_ent *dict_locate P((dict*, char*)); +extern void dict_add P((dict*, char*, char*)); +extern int dict_iter P((dict*, int (*)())); +extern void info_hdr(); +extern void gen_hdr(); +extern FILE *pref_open(); +extern int pref_close(); +extern ioloc *current_location(); + +extern char *disk_fs_strings[]; +extern char *mount_strings[]; +extern char *fsmount_strings[]; +extern char *host_strings[]; +extern char *ether_if_strings[]; +extern char *autodir; +extern char *progname; +extern char hostname[]; +extern char *username; +extern char **g_argv; +extern char *fstab_pref; +extern char *exportfs_pref; +extern char *mount_pref; +extern char *dumpset_pref; +extern char *bootparams_pref; +extern char idvbuf[]; + +extern int file_io_errors; +extern int parse_errors; +extern int errors; +extern int verbose; + +extern dict *dict_of_hosts; +extern dict *dict_of_volnames; + +extern char *xcalloc(); +extern char *xmalloc(); +#define ALLOC(x) ((struct x *) xcalloc(1, sizeof(struct x))) +#define STREQ(s,t) (*(s) == *(t) && strcmp((s)+1,(t)+1) == 0) +#define ISSET(m,b) ((m) & (1<<(b))) +#define BITSET(m,b) ((m) |= (1<<(b))) + +#define FIRST(ty, q) ((ty *) ((q)->q_forw)) +#define LAST(ty, q) ((ty *) ((q)->q_back)) +#define NEXT(ty, q) ((ty *) (((qelem *) q)->q_forw)) +#define HEAD(ty, q) ((ty *) q) +#define ITER(v, ty, q) \ + for ((v) = FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v))) diff --git a/usr.sbin/amd/fsinfo/wr_atab.c b/usr.sbin/amd/fsinfo/wr_atab.c new file mode 100644 index 0000000..3e07965 --- /dev/null +++ b/usr.sbin/amd/fsinfo/wr_atab.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)wr_atab.c 8.1 (Berkeley) 6/6/93 + * + * $Id: wr_atab.c,v 5.2.2.1 1992/02/09 15:09:44 jsp beta $ + * + */ + +#include "../fsinfo/fsinfo.h" + +/* + * Write a sequence of automount mount map entries + */ +static int write_amount_info(af, ap, sk) +FILE *af; +automount *ap; +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_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) { + mount *mp = (mount *) dd->dd_data; + /* + * If the mount point and the exported volname are the + * same then this filesystem will be recognised 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, mp->m_dk->d_host, mp->m_exported->m_volname); + if (strcmp(mp->m_dk->d_mountpt, amountpt) != 0) { + /* + * 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) { + mount *mp = (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); +#ifdef notdef + fprintf(af, "\\\n /* avolname = %s, mname = %s,\n * mvolname = %s, mexp_name = %s,\n * mexp_volname = %s\n */\\\n", + ap->a_volname, mp->m_name, mp->m_volname, mp->m_exported->m_name, mp->m_exported->m_volname); +#endif + /* + * 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); + /* + * Now determine whether a sublink is required. + */ + if (exp_namelen < namelen || mvolnlen < volnlen) { + char sublink[1024]; + sublink[0] = '\0'; + if (exp_namelen < namelen) { + strcat(sublink, mp->m_name + exp_namelen + 1); + if (mvolnlen < volnlen) + strcat(sublink, "/"); + } + if (mvolnlen < volnlen) + strcat(sublink, ap->a_volname + mvolnlen + 1); + + 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(q, def) +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 + */ +write_atab(q) +qelem *q; +{ + int errors = 0; + + if (mount_pref) { + auto_tree *tp; + show_area_being_processed("write automount", ""); + ITER(tp, auto_tree, q) + errors += write_amount(tp->t_mount, tp->t_defaults); + } + + return errors; +} diff --git a/usr.sbin/amd/fsinfo/wr_bparam.c b/usr.sbin/amd/fsinfo/wr_bparam.c new file mode 100644 index 0000000..9ef0fcd --- /dev/null +++ b/usr.sbin/amd/fsinfo/wr_bparam.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)wr_bparam.c 8.1 (Berkeley) 6/6/93 + * + * $Id: wr_bparam.c,v 5.2.2.1 1992/02/09 15:09:46 jsp beta $ + * + */ + +#include "../fsinfo/fsinfo.h" + +/* + * Write a host/path in NFS format + */ +static int write_nfsname(ef, fp, hn) +FILE *ef; +fsmount *fp; +char *hn; +{ + int errors = 0; + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + fprintf(ef, "%s:%s", h, fp->f_volname); + free(h); + return errors; +} + +/* + * Write a bootparams entry for a host + */ +static int write_boot_info(ef, hp) +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(q) +qelem *q; +{ + int errors = 0; + + if (bootparams_pref) { + FILE *ef = pref_open(bootparams_pref, "bootparams", info_hdr, "bootparams"); + if (ef) { + host *hp; + ITER(hp, host, q) + if (hp->h_netroot && hp->h_netswap) + errors += write_boot_info(ef, hp); + errors += pref_close(ef); + } else { + errors++; + } + } + + return errors; +} diff --git a/usr.sbin/amd/fsinfo/wr_dumpset.c b/usr.sbin/amd/fsinfo/wr_dumpset.c new file mode 100644 index 0000000..d118feb --- /dev/null +++ b/usr.sbin/amd/fsinfo/wr_dumpset.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)wr_dumpset.c 8.1 (Berkeley) 6/6/93 + * + * $Id: wr_dumpset.c,v 5.2.2.1 1992/02/09 15:09:47 jsp beta $ + * + */ + +#include "../fsinfo/fsinfo.h" + +static int write_dumpset_info(ef, q) +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(q) +qelem *q; +{ + int errors = 0; + + if (dumpset_pref) { + FILE *ef = pref_open(dumpset_pref, "dumpsets", info_hdr, "exabyte dumpset"); + if (ef) { + host *hp; + ITER(hp, host, q) { + if (hp->h_disk_fs) { + errors += write_dumpset_info(ef, hp->h_disk_fs); + } + } + errors += pref_close(ef); + } else { + errors++; + } + } + + return errors; +} diff --git a/usr.sbin/amd/fsinfo/wr_exportfs.c b/usr.sbin/amd/fsinfo/wr_exportfs.c new file mode 100644 index 0000000..982b538f --- /dev/null +++ b/usr.sbin/amd/fsinfo/wr_exportfs.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)wr_exportfs.c 8.1 (Berkeley) 6/6/93 + * + * $Id: wr_exportfs.c,v 5.2.2.1 1992/02/09 15:09:48 jsp beta $ + * + */ + +#include "../fsinfo/fsinfo.h" + +static int write_export_info(ef, q, errors) +FILE *ef; +qelem *q; +int errors; +{ + mount *mp; + + ITER(mp, 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(ef, q) +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(q) +qelem *q; +{ + int errors = 0; + + if (exportfs_pref) { + host *hp; + show_area_being_processed("write exportfs", ""); + ITER(hp, host, q) { + if (hp->h_disk_fs) { + FILE *ef = pref_open(exportfs_pref, hp->h_hostname, gen_hdr, hp->h_hostname); + if (ef) { + show_new(hp->h_hostname); + errors += write_dkexports(ef, hp->h_disk_fs); + errors += pref_close(ef); + } else { + errors++; + } + } + } + } + + return errors; +} diff --git a/usr.sbin/amd/fsinfo/wr_fstab.c b/usr.sbin/amd/fsinfo/wr_fstab.c new file mode 100644 index 0000000..85d3687 --- /dev/null +++ b/usr.sbin/amd/fsinfo/wr_fstab.c @@ -0,0 +1,303 @@ +/* + * Copyright (c) 1989 Jan-Simon Pendry + * Copyright (c) 1989 Imperial College of Science, Technology & Medicine + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Jan-Simon Pendry at Imperial College, London. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)wr_fstab.c 8.1 (Berkeley) 6/6/93 + * + * $Id: wr_fstab.c,v 5.2.2.1 1992/02/09 15:09:49 jsp beta $ + * + */ + +#include "../fsinfo/fsinfo.h" + +/* ---------- AIX 1 ------------------------------ */ + +/* + * AIX 1 format + */ +static void write_aix1_dkfstab(ef, dp) +FILE *ef; +disk_fs *dp; +{ + char *hp = strdup(dp->d_host->h_hostname); + char *p = strchr(hp, '.'); + if (p) + *p = '\0'; + + fprintf(ef, "\n%s:\n\tdev = %s\n\tvfs = %s\n\ttype = %s\n\tlog = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n", + dp->d_mountpt, + dp->d_dev, + dp->d_fstype, + dp->d_fstype, + dp->d_log, + dp->d_mountpt, + dp->d_opts); + free(hp); +} + +static void write_aix1_dkrmount(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + char *hp = strdup(h); + char *p = strchr(hp, '.'); + if (p) + *p = '\0'; + domain_strip(h, hn); + fprintf(ef, "\n%s:\n\tsite = %s\n\tdev = %s:%s\n\tvfs = %s\n\ttype = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n", + fp->f_localname, + hp, + h, + fp->f_volname, + fp->f_fstype, + fp->f_fstype, + fp->f_localname, + fp->f_opts); + + free(hp); + free(h); +} + +/* ---------- AIX 3 ------------------------------ */ + +/* + * AIX 3 format + */ +static void write_aix3_dkfstab(ef, dp) +FILE *ef; +disk_fs *dp; +{ + if (strcmp(dp->d_fstype, "jfs") == 0 && strncmp(dp->d_dev, "/dev/", 5) == 0 && !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(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + fprintf(ef, "\n%s:\n\tdev = %s:%s\n\tvfs = %s\n\ttype = %s\n\tvol = %s\n\topts = %s\n\tmount = true\n\tcheck = true\n\tfree = false\n", + fp->f_localname, + h, + fp->f_volname, + fp->f_fstype, + fp->f_fstype, + fp->f_localname, + fp->f_opts); + + free(h); +} + +/* ---------- Ultrix ----------------------------- */ + +static void write_ultrix_dkfstab(ef, dp) +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(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + fprintf(ef, "%s@%s:%s:%s:%s:0:0\n", + fp->f_volname, + h, + fp->f_localname, + fp->f_fstype, + fp->f_opts); + free(h); +} + +/* ---------- Generic ---------------------------- */ + +/* + * Generic (BSD, SunOS, HPUX) format + */ +static void write_generic_dkfstab(ef, dp) +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(ef, hn, fp) +FILE *ef; +char *hn; +fsmount *fp; +{ + char *h = strdup(fp->f_ref->m_dk->d_host->h_hostname); + domain_strip(h, hn); + fprintf(ef, "%s:%s %s %s %s 0 0\n", + h, + fp->f_volname, + fp->f_localname, + fp->f_fstype, + fp->f_opts); + free(h); +} + +/* ----------------------------------------------- */ + +static struct os_fstab_type { + char *os_name; + void (*op_fstab)(); + void (*op_mount)(); +} os_tabs[] = { + { "aix1", write_aix1_dkfstab, write_aix1_dkrmount }, /* AIX 1 */ + { "aix3", write_aix3_dkfstab, write_aix3_dkrmount }, /* AIX 3 */ + { "generic", write_generic_dkfstab, write_generic_dkrmount }, /* Generic */ + { "u2_0", write_ultrix_dkfstab, write_ultrix_dkrmount }, /* Ultrix */ + { "u3_0", write_ultrix_dkfstab, write_ultrix_dkrmount }, /* Ultrix */ + { "u4_0", write_ultrix_dkfstab, write_ultrix_dkrmount }, /* Ultrix */ + { 0, 0, 0 } +}; + +#define GENERIC_OS_NAME "generic" + +static struct os_fstab_type *find_fstab_type(hp) +host *hp; +{ + struct os_fstab_type *op = 0; + char *os_name = 0; + +again:; + if (os_name == 0) { + if (ISSET(hp->h_mask, HF_OS)) + os_name = hp->h_os; + else + os_name = GENERIC_OS_NAME; + } + + for (op = os_tabs; op->os_name; op++) + if (strcmp(os_name, op->os_name) == 0) + return op; + + os_name = GENERIC_OS_NAME; + goto again; +} + +static int write_dkfstab(ef, q, output) +FILE *ef; +qelem *q; +void (*output)(); +{ + int errors = 0; + disk_fs *dp; + + ITER(dp, disk_fs, q) + if (strcmp(dp->d_fstype, "export") != 0) + (*output)(ef, dp); + + return errors; +} + +static int write_dkrmount(ef, q, hn, output) +FILE *ef; +qelem *q; +char *hn; +void (*output)(); +{ + int errors = 0; + fsmount *fp; + + ITER(fp, fsmount, q) + (*output)(ef, hn, fp); + + return errors; +} + +int write_fstab(q) +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 + 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; +} |