hakanson@ogicse.ogi.edu (Marion Hakanson) (03/30/90)
Well, I needed it, and Larry wasn't forthcoming. It works quite nicely, but isn't real fast (but how often does one do this?). It successfully mimics the real getfsent(3) on a few systems I've tested here. Note it lacks getfsspec, getfsfile, & getfstype functions, but I had no need for them yet. Please bash on it, and feedback is welcome. First, an example of its use: ==========testfsent.pl=========== #!/usr/bin/perl do ($_='fstab.pl') || die "Can't load $_: " . ($@?$@:$!) . " aborted"; $, = ':'; while ( @flds = &getfsent ) { print '|'; print @flds; print "|\n"; } ==========end of testfsent.pl=========== Now the subroutine: ==========fstab.pl============= ;# ;# $Id: fstab.pl,v 1.2 90/03/29 17:42:40 hakanson Exp $ ;# ;# Perl subroutines to read fstab for you. ;# Marion Hakanson (hakanson@cse.ogi.edu) ;# Oregon Graduate Institute of Science and Technology ;# ;# Understands the old v7-style fstab lines ("spec:dir:xx:0:0"), ;# as well as the new NFS-style ("spec dir type opts 0 0"), the ;# latter of which it maps to the former, as is done by getfsent(3) ;# on NFS systems. See below for details. package fsent; $fstab = '/etc/fstab'; $is_open = 0; $nfspat = '^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\d+)\s*$'; $v7pat = '^(.*):(.*):(.*):(\d*):(\d*).*$'; sub main'setfsent { &main'endfsent; $is_open = open(FSTAB, "<$fstab"); } sub main'endfsent { close(FSTAB); $is_open = 0; $fstab_type = ''; $error = 0; 1; } sub main'getfsent { local (@fields); local ($[); $[ = 1; $is_open || &main'setfsent || ($error = 1); return () if ( $error ); dline: while ( <FSTAB> ) { #print STDERR " $_"; chop; # strip newline next dline if /^#/; # skip comment line unless ( $fstab_type ) { # nfs or normal? if ( /$nfspat/o ) { $fstab_type = 'nfs'; } else { $fstab_type = 'v7'; } } #print STDERR "fstab_type: $fstab_type\n"; if ( $fstab_type eq 'nfs' ) { @fields = /$nfspat/o; #print STDERR "#fields: $#fields\n"; if ( $#fields != 6 ) { $error = 1; } else { # map mntent types & opts to fsent types $fstype = splice(@fields, 3, 1); # old-style fstab doesn't grok NFS entries if ( $fstype eq 'nfs' ) { @fields = (); # in case it's the last next dline; } typ: { if ( $fstype eq 'ignore' ) { $fstype = 'xx'; last typ; } if ( $fstype eq 'swap' ) { $fstype = 'sw'; last typ; } if ( $fields[3] =~ /(^|,)ro\b/ ) { $fstype = 'ro'; last typ; } if ( $fields[3] =~ /(^|,)quota\b/ ) { $fstype = 'rq'; last typ; } $fstype = 'rw'; } $fields[3] = $fstype; } } else { @fields = /$v7pat/o; #print STDERR "#fields: $#fields\n"; if ( $#fields == 5 ) { $fields[4] = 0 unless ( $fields[4] > 0 ); $fields[5] = 0 unless ( $fields[5] > 0 ); } else { $error = 1; } } last dline; } $error ? () : @fields; } 1; ==========end of fstab.pl============= -- Marion Hakanson Domain: hakanson@cse.ogi.edu UUCP : {hp-pcd,tektronix}!ogicse!hakanson