ncpascal@ndsuvax.UUCP (Freeman Pascal) (11/01/87)
Hello, I have added support to mount.c, umount.c, and df.c to support use of a mount table in /etc/mtab. This allowed mount and df to display information about mounted file systems when no command line options were given. I also fixed a bug in bit_count() in df.c, it would work correctly for one pass on a filesystem, although, it would overwrite info in other areas of memory when reading in data. I fixed this by increasing the amount of buffer space it had to work in. - Freeman P. Pascal IV ncpascal@ndsuvax #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: df.c.diff mount.c.diff mtab.h umount.c.diff # Wrapped by ncpascal@ndsuvax on Sat Oct 31 20:27:29 1987 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f df.c.diff -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"df.c.diff\" else echo shar: Extracting \"df.c.diff\" \(4480 characters\) sed "s/^X//" >df.c.diff <<'END_OF_df.c.diff' X2a3,17 X> /* X> * History: X> * X> * 20 Oct 87 fpp Added support for /etc/mnttab X> * 27 Oct 87 fpp fixed bug in bit_count(), increased size X> * of buf[] to X> * X> * BLOCKSIZE X> * X> * instead of X> * X> * BLOCKSIZE / sizeof( int ) X> */ X> X> #include <stdio.h> X8,9c23,28 X< #include "stat.h" X< X--- X> #include <sys/stat.h> X> #include <mtab.h> X> X> struct mtab *getmntent(); X> char *spcs(); X> FILE *fopen(); X16,24c35,62 X< register int i; X< X< if (argc <= 1) { X< std_err("Usage: df special ...\n"); X< exit(1); X< } X< X< sync(); /* have to make sure disk is up-to-date */ X< for (i = 1; i < argc; i++) df(argv[i]); X--- X> register int i; X> FILE *fd; X> struct mtab *mp, mt; X> X> sync(); X> prints( "%s%s%s%smode i-nodes blocks\n", X> "device", spcs( MNTDEVLEN-6 ), X> "file system", spcs( MNTFSYSLEN-11 ) ); X> prints( "%sused free used free\n", X> spcs( MNTDEVLEN+MNTFSYSLEN+8 ) ); X> if (argc == 1) { X> if (( fd = fopen( MNTTAB, "r" )) == -1 ) { X> perror( MNTTAB ); X> exit( 1 ); X> } X> while(( fread( &mt, sizeof( struct mtab ), 1, fd)) != 0 ) { X> df( &mt ); X> } X> fclose( fd ); X> } else X> for (i = 1; i < argc; i++) X> if (( mp = getmntent( argv[i] )) != NULL ) X> df( mp ); X> else { X> std_err( argv[i] ); X> std_err( " not a valid file system.\n" ); X> exit( 1 ); X> } X29,30c67,68 X< df(name) X< char *name; X--- X> df( mp ) X> struct mtab *mp; X38,39c76,77 X< if ( (fd = open(name,0)) < 0) { X< perror(name); X--- X> if ( (fd = open( mp->mt_dev,0)) < 0) { X> perror(mp->mt_dev); X45c83 X< stderr2(name, ": Cannot stat\n"); X--- X> stderr2( mp->mt_dev, ": Cannot stat\n"); X49c87 X< stderr2(name, ": not a block special file\n"); X--- X> stderr2( mp->mt_dev, ": not a block special file\n"); X55c93 X< stderr2(name, ": Can't read super block\n"); X--- X> stderr2( mp->mt_dev, ": Can't read super block\n"); X64c102 X< stderr2(name, ": Not a valid file system\n"); X--- X> stderr2( mp->mt_dev, ": Not a valid file system\n"); X71c109 X< stderr2(name, ": can't find bit maps\n"); X--- X> stderr2( mp->mt_dev, ": can't find bit maps\n"); X75,78c113,116 X< X< z_count = bit_count(sp->s_zmap_blocks, sp->s_nzones, fd); X< if (z_count < 0) { X< stderr2(name, ": can't find bit maps\n"); X--- X> X> z_count = bit_count(sp->s_zmap_blocks, sp->s_nzones, fd); X> if (z_count < 0) { X> stderr2( mp->mt_dev, ": can't find bit maps\n"); X85,99c123,130 X< /* Print results. */ X< prints("%s ",name); X< s0 = name; X< while (*s0) s0++; X< i = 12 - (s0 - name); X< while (i--) prints(" "); X< prints("i-nodes: "); X< num3(i_count - 1); X< prints(" used "); X< num3(sp->s_ninodes + 1 - i_count); X< prints(" free blocks: "); X< num3(busyblocks); X< prints(" used "); X< num3(totblocks - busyblocks); X< prints(" free\n"); X--- X> fprintf( stdout, "%s%s%s%s %s %5d %5d %5d %5d\n", X> mp->mt_dev, spcs( MNTDEVLEN-strlen( mp->mt_dev )), X> mp->mt_filsys, spcs( MNTFSYSLEN-strlen( mp->mt_filsys )), X> mp->mt_ro_flg ? "RO" : "RW", X> i_count, sp->s_ninodes+1-i_count, X> busyblocks, totblocks-busyblocks X> ); X> X108,111c139,142 X< register int i, b; X< int busy, count, w; X< int *wptr, *wlim; X< int buf[BLOCK_SIZE/sizeof(int)]; X--- X> register int i, b; X> int busy, count, w; X> int *wptr, *wlim; X> int buf[ BLOCK_SIZE ]; X117,118c148,149 X< if (read(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) return(-1); X< X--- X> if (read(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) X> return(-1); X136,152c167,203 X< X< stderr2(s1, s2) X< char *s1, *s2; X< { X< std_err(s1); X< std_err(s2); X< } X< X< num3(n) X< int n; X< { X< extern char *itoa(); X< if (n < 10) prints(" %s", itoa(n)); X< else if (n < 100) prints(" %s", itoa(n)); X< else if (n < 1000) prints(" %s", itoa(n)); X< else prints("%s", itoa(n)); X< } X--- X> struct mtab * X> getmntent( dev_path ) X> char *dev_path; X> { X> FILE *fd; X> static struct mtab mbuf; X> X> if (( fd = fopen( MNTTAB, "r" )) < 0 ) { X> perror( MNTTAB ); X> exit( 1 ); X> } X> while ( fread( &mbuf, sizeof( struct mtab ), 1, fd) != 0 ) X> if (strcmp( mbuf.mt_dev, dev_path ) == 0 ) X> return( &mbuf ); X> fclose( fd ); X> return( NULL ); X> } X> X> stderr2(s1, s2) X> char *s1, *s2; X> { X> std_err(s1); X> std_err(s2); X> } X> X> char * X> spcs( n ) X> int n; X> { X> static char *sstr = " "; X> char *sp; X> X> sp = sstr; X> while(*sp) sp++; X> while(n--) sp--; X> return( sp ); X> } END_OF_df.c.diff if test 4480 -ne `wc -c <df.c.diff`; then echo shar: \"df.c.diff\" unpacked with wrong size! fi # end of overwriting check fi if test -f mount.c.diff -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"mount.c.diff\" else echo shar: Extracting \"mount.c.diff\" \(3358 characters\) sed "s/^X//" >mount.c.diff <<'END_OF_mount.c.diff' X3c3,21 X< #include "errno.h" X--- X> /* X> * History: X> * X> * 19 Oct 87 FPP added support for /etc/mnttab, mount table X> * 28 Oct 87 FPP added support to make root file system the X> * first entry in /etc/mnttab when created. X> */ X> X> #include <stdio.h> X> #include <sys/types.h> X> #include <sys/stat.h> X> #include <sys/dir.h> X> #include <mtab.h> X> #include <errno.h> X> X> struct mtab *getrootdev(); X> FILE *fopen(); X> char *spaces(); X> X11,12c29,48 X< int ro; X< X--- X> int ro, n, mnttab_flg = 0; X> struct mtab mt; X> FILE *fd; X> X> if (argc == 1) { X> if (( fd = fopen( MNTTAB, "r" )) == -1 ) { X> perror( MNTTAB ); X> exit( 1 ); X> } X> prints( "\nmode %s%s%s\n\n", X> "file system", spaces( MNTDEVLEN-11 ), X> "mounted on" ); X> while(( fread( &mt, sizeof( struct mtab ), 1, fd)) != 0 ) X> prints( " %s %s%s%s\n", X> mt.mt_ro_flg ? "RO" : "RW", X> mt.mt_dev, spaces( MNTDEVLEN-strlen( mt.mt_dev )), X> mt.mt_filsys ); X> fclose( fd ); X> exit( 1 ); X> } X26,36c62,160 X< std_err(argv[1]); X< std_err(" mounted\n"); X< exit(0); X< } X< X< X< usage() X< { X< std_err("Usage: mount special name [-r]\n"); X< exit(1); X< } X--- X> /* X> * add entry to /etc/mnttab X> */ X> strcpy( mt.mt_dev, argv[1] ); X> strcpy( mt.mt_filsys, argv[2] ); X> mt.mt_ro_flg = ro; X> if (( mnttab_flg = access( MNTTAB, 0 )) == -1) /* does /etc/mnt exist? */ X> if (creat( MNTTAB, 0644 ) == -1) { X> perror( MNTTAB ); X> exit( 1 ); X> } X> if ((fd = fopen( MNTTAB, "a" )) == -1 ) { X> std_err( "\nmount: cannot open " ); X> std_err( MNTTAB ); X> std_err( "\n" ); X> exit( 1 ); X> } X> X> /* X> * if /etc/mtab is newly created we must add root file system entry X> */ X> if (mnttab_flg) X> fwrite( getrootdev( NULL ), sizeof( struct mtab ), 1, fd ); X> fwrite( &mt, sizeof( struct mtab ), 1, fd ); /* append new entry */ X> fclose( fd ); X> X> std_err(argv[1]); X> std_err(" mounted\n"); X> exit(0); X> } X> X> #define ROOT "/" X> #define DEV_PATH "/dev/" X> X> struct mtab * X> getrootdev( mntp ) X> struct mtab *mntp; X> { X> static struct mtab *mp, mbuf; X> struct stat rstat, sbuf; X> struct direct dir; X> char buf[64]; X> int fd; X> X> X> if ( stat( ROOT, &rstat ) < 0 ) X> return( NULL ); /* cannot get status of root */ X> X> if (( fd = open( DEV_PATH, 0 )) < 0 ) { X> perror( DEV_PATH ); X> return( NULL ); X> } X> while( read( fd, &dir, sizeof( dir ))) { X> if (dir.d_ino == NO_ENTRY) X> continue; /* nothing here */ X> strcpy( buf, DEV_PATH ); X> strcat( buf, dir.d_name ); X> if ( stat( buf, &sbuf ) < 0 ){ X> perror( buf ); X> continue; X> } X> if (( sbuf.st_mode & S_IFMT ) != S_IFBLK ) X> continue; /* if block special file */ X> if ( sbuf.st_rdev == rstat.st_dev ) X> break; X> } X> close( fd ); X> if ( sbuf.st_rdev == rstat.st_dev ) { X> mp = ( mntp == NULL ) ? &mbuf : mntp; X> strcpy( mp->mt_dev, buf ); X> strcpy( mp->mt_filsys, ROOT ); X> /* check if we have write permission */ X> mp->mt_ro_flg = access( ROOT, 02 ); X> return( mp ); X> } else X> return( NULL ); X> } X> X> X> char * X> spaces( n ) X> int n; X> { X> char *rs, *sp; X> X> if (( rs = (char *) malloc( n )) == NULL ) X> return( NULL ); X> sp = rs; X> while( n-- ) X> *sp++ = ' '; X> *sp = NULL; X> return( rs ); X> } X> X> usage() X> { X> std_err("Usage: mount special name [-r]\n"); X> exit(1); X> } END_OF_mount.c.diff if test 3358 -ne `wc -c <mount.c.diff`; then echo shar: \"mount.c.diff\" unpacked with wrong size! fi # end of overwriting check fi if test -f mtab.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"mtab.h\" else echo shar: Extracting \"mtab.h\" \(215 characters\) sed "s/^X//" >mtab.h <<'END_OF_mtab.h' X/* X * mtab.h X * X * mount table structures X * X */ X X#define MNTTAB "/etc/mtab" X#define MNTDEVLEN 16 X#define MNTFSYSLEN 16 X Xstruct mtab { X char mt_dev[ MNTDEVLEN ]; X char mt_filsys[ MNTFSYSLEN ]; X short mt_ro_flg; X}; END_OF_mtab.h if test 215 -ne `wc -c <mtab.h`; then echo shar: \"mtab.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f umount.c.diff -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"umount.c.diff\" else echo shar: Extracting \"umount.c.diff\" \(2124 characters\) sed "s/^X//" >umount.c.diff <<'END_OF_umount.c.diff' X3c3,10 X< #include "errno.h" X--- X> /* X> * History: X> * 27 Oct 87 FPP added support for /etc/mtab X> */ X> X> #include <stdio.h> X> #include <errno.h> X> #include <mtab.h> X6a14,16 X> struct mtab *getmntent(); X> FILE *fopen(); X> X11,21c21,36 X< X< if (argc != 2) usage(); X< if (umount(argv[1]) < 0) { X< if (errno == EINVAL) X< std_err("Device not mounted\n"); X< else X< perror("umount"); X< exit(1); X< } X< std_err(argv[1]); X< std_err(" unmounted\n"); X--- X> struct mtab *mt; X> X> if (argc != 2) usage(); X> X> for( i = 1; i++ < argc; ) { X> if (umount(argv[1]) < 0) { X> if ((errno == EINVAL) || (mt == NULL)) X> std_err("Device not mounted, but listed in /etc/mtab.\n"); X> else X> perror("umount"); X> exit(1); X> } X> update_mtab( argv[1] ); X> std_err(argv[1]); X> std_err(" unmounted\n"); X> } X25,29c40,93 X< usage() X< { X< std_err("Usage: umount special\n"); X< exit(1); X< } X--- X> update_mtab( dev ) X> char *dev; X> { X> struct mtab mt; X> FILE *fin, *fout; X> char *ftmp = "/tmp/mtab\0 "; X> X> if (( fin = fopen( MNTTAB, "r" )) < 0 ) { X> perror( MNTTAB ); X> exit( 1 ); X> } X> if (( fout = fopen( strcat( ftmp, itoa( getpid())), "w" )) < 0 ) { X> perror( ftmp ); X> exit( 1 ); X> } X> while(( fread( &mt, sizeof( struct mtab ), 1, fin)) != 0 ) { X> if (strcmp( mt.mt_dev, dev ) != 0 ) X> fwrite( &mt, sizeof( struct mtab ), 1, fout ); X> } X> fclose( fin ); X> fclose( fout ); X> unlink( MNTTAB ); /* delete /etc/mtab */ X> if ( link( ftmp, MNTTAB ) == -1 ) { /* link tmp file to /etc/mtab */ X> perror( ftmp ); X> exit( 1 ); X> } X> unlink( ftmp ); /* delete tmp file link */ X> } X> X> struct mtab * X> getmntent( dev_path ) X> char *dev_path; X> { X> FILE *fd; X> static struct mtab mbuf; X> X> if (( fd = fopen( MNTTAB, "r" )) < 0 ) { X> perror( MNTTAB ); X> exit( 1 ); X> } X> while ( fread( &mbuf, sizeof( struct mtab ), 1, fd) != 0 ) X> if (strcmp( mbuf.mt_dev, dev_path ) == 0 ) { X> fclose( fd ); X> return( &mbuf ); X> } X> fclose( fd ); X> return( NULL ); X> } X> X> usage() X> { X> std_err("Usage: umount special\n"); X> exit(1); X> } END_OF_umount.c.diff if test 2124 -ne `wc -c <umount.c.diff`; then echo shar: \"umount.c.diff\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 1 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0