logininit, estat, edf: Version 2.1 -- lots of info on login

Lenny Tropiano lenny at icus.islp.ny.us
Sun Jan 7 03:56:30 AEST 1990


See README2.1 for the most up-to-date information.  Since there were
a considerable amount of changes done, patches were not feasible.

-- cut here for shar -- -- cut here for shar -- -- cut here for shar --
#! /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 shell archive."
# Contents:  README2.1 README2.0 README1.0 Makefile Makefile.386
#   logininit.c chtime.c fsinfo.sample fsinfo2.sample
# Wrapped by lenny at icus on Sat Jan  6 11:53:30 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f README2.1 -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"README2.1\"
else
echo shar: Extracting \"README2.1\" \(3185 characters\)
sed "s/^X//" >README2.1 <<'END_OF_README2.1'
X
XIn version 2.1, logininit has changed a bit.  The program is more "configurable"
Xby #defines located at the top of the logininit.c source.  All the functionality
Xof version 2.0 is there, plus some extra features.   Originally my /etc/profile
Xhad a call to run a previously posted program of mine called "lastlogin" which
Xrecorded the login time and tty in a Bezerkley type format file.  I've combined
Xthe functionality of logininit and lastlogin in this version.   Also the
Xmailbox reading function has been enhanced slightly.  If you are running a 
Xmail reader (eg. elm) that will update your mailbox when you Quit out and
Xadd lines like:
X
XStatus: O
X
XThe mail reading routine can now detect if you have "new" mail as well as
Xhow many new mail messages. If your mail reader doesn't support the "Status:"
Xfield, compile the program with "NEWMAIL" undefined, and it will work as
Xit did before.
X
XThe new improved format is:
X
XLast login: Sat Jan  6 10:45:44 on w1
X
XIt's Saturday, January 6, 1990 at 11:44am ... 
XNode: icus, up for 3 weeks, 0 hours, 51 minutes, and 15 seconds.
X/          HD1: System Partition    :  6.2MB,  12724 blocks,  6999 i-nodes, 15%
X/tmp       HD1: Sys Temp Partition  :  2.3MB,   4678 blocks,   259 i-nodes, 78%
X/usr/spool HD1: Spool Partition     :  4.4MB,   8976 blocks,  7063 i-nodes, 30%
X/usr/tmp   HD2: User Temp Partition :  2.2MB,   4450 blocks,   982 i-nodes, 56%
X/netnews   HD2: News Partition      :  9.2MB,  18852 blocks,  7021 i-nodes, 24%
X           Total Storage Available  : 24.3MB,  49680 blocks
X                            out of  :103.1MB, 211056 blocks, 24% free
X2.04MB of main memory currently available. (56%)
X
X        *****************************************************************
X        * Display the /etc/motd (Message-of-the-day) here, if it exists *
X        *****************************************************************
X
XYou have new mail! (30 mail messages, 3 unread in your mailbox)
X
XConfiguration ...
X
XLASTLOGIN
X	If this is defined the last login code will be done only if the
X	program name is called "logininit".  If not defined, it's not executed.
X
XSHOWTIME
X	Show the current date and time.
X
XUPTIME
X	Show machine name and uptime.
X
XFILESTATUS
X	Show the file system status, if not defined "edf" will be
X	empty and unnecessary.
X
XMEMORY
X	Show the available memory (MB) this is somewhat slow because
X	of nlist(). 
X
XSHOWMOTD
X	Display the /etc/motd if it exists
X
XMAILCHECK
X	Check the mail on the way ...
X
XNEWMAIL
X	Look for new mail "Status:" lines, if MAILCHECK is not defined
X	this option is useless.
X
XNOBEEP
X	Don't beep for anything (be quiet).
X
XREVERSE
X	Because of the way "df" works and the /etc/mnttab file is setup
X	on the 3B1 you probably want this defined.  Other machines can
X	be left undefined.
X
X
XThe program should be linked to "edf" and "estat".  estat will be just
Xlike logininit without any updating or printing of the last login and
Xtty.  edf is just the filesystem status.
X
X---
X| Lenny Tropiano            ICUS Software Systems      lenny at icus.islp.ny.us |
X| {ames,pacbell,decuac,hombre,sbcs,attctc}!icus!lenny     attmail!icus!lenny |
X+------- ICUS Software Systems -- PO Box 1;  Islip Terrace, NY  11752 -------+
END_OF_README2.1
if test 3185 -ne `wc -c <README2.1`; then
    echo shar: \"README2.1\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f README2.0 -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"README2.0\"
else
echo shar: Extracting \"README2.0\" \(2570 characters\)
sed "s/^X//" >README2.0 <<'END_OF_README2.0'
X
XIn version 2.0 of logininit, I modified it to handle multiple filesystems
Xthat are mounted on the hard disk.   This is done by looking up in /etc/mnttab
Xfor the currently mounted partitions and displaying the information.  Also
Xyou can describe the partition (up to 25 characters by putting it in a file
Xcalled /etc/fsinfo [which can be changed]).
X
X/etc/fsinfo:
Xfp002	/		HD1 : System Partition
Xfp003	/mnta		HD1 : Partition 2
Xfp003	/mntb		HD1 : Partition 2
Xfp011	/tmp		HD2 : Temporary Partition
Xfp011	/mnta		HD2 : Partition 1
Xfp011	/mntb		HD2 : Partition 1
Xfp012	/usr/spool	HD2 : Spool Partition
Xfp012	/mnta		HD2 : Partition 2
Xfp012	/mntb		HD2 : Partition 2
Xfp021	/mnt		FD  : Floppy Partition
Xfp021	/floppy		FD  : Floppy Partition
X
XI have two hard disks installed, so that is why fp01[12] is being accessed.
XThis is what ultimately pushed me to modify my older logininit.c.
X
XI also changed the output slightly, it looks nicer now. 
X
XNOTES:  The program looks at /etc/mnttab, and reads it backwards, much like
Xwhat "df(1)" does.  To get the partitions in the correct order, you basically
Xhave to set up the /etc/mnttab in reverse order.
X
X# devnm /usr/spool /tmp / | setmnt 
X# df 
X/         (/dev/fp002):    44596 blocks   11558 i-nodes
X/tmp      (/dev/fp011):     9788 blocks    1481 i-nodes
X/usr/spool(/dev/fp012):    25786 blocks   11672 i-nodes
X
X# devnm / /tmp /usr/spool | setmnt 
X# df 
X/usr/spool(/dev/fp012):    25786 blocks   11672 i-nodes
X/tmp      (/dev/fp011):     9788 blocks    1481 i-nodes
X/         (/dev/fp002):    44596 blocks   11558 i-nodes
X
XNew output format:
X------------------
XIt's Sunday, January 22, 1989 at 11:48pm ... 
XNode: icus, up for 3 hours, 41 minutes, and 4 seconds.
X/          HD1 : System Partition   : 21.8MB,  44618 blocks, 11562 i-nodes, 37%
X/tmp       HD2 : Temporary Partition:  4.8MB,   9794 blocks,  1482 i-nodes, 98%
X/usr/spool HD2 : News Partition     : 12.6MB,  25786 blocks, 11672 i-nodes, 36%
X/floppy    FD  : Floppy Partition   :  0.0MB,     64 blocks,     7 i-nodes,  9%
X           WARNING: Filesystem disk space is low.
X           WARNING: Filesystem i-nodes are low.
X           Total Storage Available  : 39.2MB,  80262 blocks
X                            out of  : 99.4MB, 203514 blocks, 39% free
X1.71MB of main memory currently available. (54%)
X
X        *****************************************************************
X        * Display the /etc/motd (Message-of-the-day) here, if it exists *
X        *****************************************************************
X
XYou have mail! (32 mail messages in your mailbox)
X
END_OF_README2.0
if test 2570 -ne `wc -c <README2.0`; then
    echo shar: \"README2.0\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f README1.0 -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"README1.0\"
else
echo shar: Extracting \"README1.0\" \(1989 characters\)
sed "s/^X//" >README1.0 <<'END_OF_README1.0'
X
XThis is a little ditty I whipped up one day... Basically it tells you all
Xkinds of neat stuff when you login.  It can be called from inside 
X/etc/profile and will print this kind of information...
X---
XIt's Tuesday, May 31, 1988 at 8:00pm ... 
XNode: icus, up for 22 hours, 38 minutes, and 27 seconds.
X21% available disk storage in the root filesystem. (26968 blocks, 8692 i-nodes)
X1.29MB of main memory currently available. (48%)
X
XNo mail.
X---
XIt's Tuesday, May 31, 1988 at 11:02pm ... 
XNode: icus, up for 1 day, 2 hours, 36 minutes, and 1 second.
X21% available disk storage in the root filesystem. (24968 blocks, 8777 i-nodes)
X1.45MB of main memory currently available. (54%)
X
X       **************************************************************
X       * This is my message of the day.  It can say whatever I like *
X       **************************************************************
X
XYou have mail! (13 mail messages in your mailbox)
X
X---
XIt will tell you when you have mail (and how many mail messages you have). It
Xprints the /etc/motd out so the call to "cat /etc/motd" can be removed from
X/etc/profile.
X
XAnother nice feature is that it monitors the space left on the hard disk
Xwhen you login.  It checks the percentage (%) left to MAXPERCENT (compile
Xtime option [defaults to 10%]) and the inodes left with MAXINODES [defaults
Xto 500].
X
XSnipped from /etc/profile
X
X...
X# Print login initialization information
X/usr/lbin/logininit
X
X#The following line (if uncommented) will set TERM and TERMCAP (see ttytype)
X#eval `tset -s -Q`
X#For now, just set TERM to s4
XNAME=`tty`
Xif [ \( "`expr $NAME : '/dev/w' `"      != "0" -o \
X	"`expr $NAME : '/dev/sys' `"    != "0" \) ]
Xthen
X...
X
Xlogininit is called before the question to ask what terminal you are
Xrunning on...  It can be put almost anywhere... Even in your /etc/localprofile
Xor wherever.   Remember to take out redundant processing from /etc/profile
Xlike the "if..fi" statement to check the mailbox status, and the 
X"cat /etc/motd"
X
END_OF_README1.0
if test 1989 -ne `wc -c <README1.0`; then
    echo shar: \"README1.0\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f Makefile -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(824 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X# Makefile to compile logininit.c  (Login Information)
X# By Lenny Tropiano
X# (c)1988,1989,1990 ICUS Software Systems     EMAIL: lenny at icus.islp.ny.us
X# All rights reserved
X# For 3B1 running System V Release 3.5*
X#
XCFLAGS=-v -O -DMAXPERCENT=10 -DMAXINODES=100
XLDFLAGS=-s
XLIBS=/lib/crt0s.o /lib/shlib.ifile
XDEST=/usr/lbin/
X#
Xlogininit:  logininit.o chtime.o
X	@echo "Loading ..."
X	$(LD) $(LDFLAGS) -o logininit logininit.o chtime.o $(LIBS) 
X#
Xlogininit.o:
X	$(CC) $(CFLAGS) -c logininit.c
X#
X# You need to be super-user to do this.
X#
X$(DEST):
X	mkdir $(DEST)
X	chmod 755 $(DEST)
X#
Xinstall: logininit $(DEST)
X	rm -f $(DEST)/edf $(DEST)/estat
X	cp logininit $(DEST)
X	chown root $(DEST)/logininit
X	chgrp bin  $(DEST)/logininit
X	chmod 4755 $(DEST)/logininit
X	ln -f $(DEST)/logininit $(DEST)/edf
X	ln -f $(DEST)/logininit $(DEST)/estat
END_OF_Makefile
if test 824 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f Makefile.386 -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Makefile.386\"
else
echo shar: Extracting \"Makefile.386\" \(732 characters\)
sed "s/^X//" >Makefile.386 <<'END_OF_Makefile.386'
X#
X# Makefile to compile logininit.c  (Login Information)
X# By Lenny Tropiano
X# (c)1988,1989,1990 ICUS Software Systems     EMAIL: lenny at icus.islp.ny.us
X# All rights reserved
X# For 6386WGS running System V Release 3.2
X#
XCFLAGS=-v -O
XLDFLAGS=-s
XLIBS=-lc_s
XDEST=/usr/lbin/
X#
Xlogininit:  logininit.o chtime.o
X	@echo "Loading ..."
X	$(CC) $(LDFLAGS) -o logininit logininit.o chtime.o $(LIBS) 
X#
Xlogininit.o:
X	$(CC) $(CFLAGS) -c logininit.c
X#
X# You need to be super-user to do this.
X#
X$(DEST):
X	mkdir $(DEST)
X	chmod 755 $(DEST)
X#
Xinstall: logininit $(DEST)
X	cp logininit $(DEST)
X	chown root $(DEST)/logininit
X	chgrp bin  $(DEST)/logininit
X	chmod 4755 $(DEST)/logininit
X	ln $(DEST)/logininit $(DEST)/edf
X	ln $(DEST)/logininit $(DEST)/estat
END_OF_Makefile.386
if test 732 -ne `wc -c <Makefile.386`; then
    echo shar: \"Makefile.386\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f logininit.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"logininit.c\"
else
echo shar: Extracting \"logininit.c\" \(15043 characters\)
sed "s/^X//" >logininit.c <<'END_OF_logininit.c'
X/************************************************************************\
X**                                                                      **
X** Program name: logininit.c (Login Initialization)                     **
X**                                                                      **
X**               edf, estat  (Same as logininit, they are links that    **
X**               should provide options like status info (estat) which  **
X**               will be like logininit without lastlogin (if enabled)  **
X**               and an option that prints only the filesystem info and **
X**               not the rest (edf).                                    **
X**                                                                      **
X** Programmer:   Lenny Tropiano        EMAIL: ...icus!lenny             **
X** Organization: ICUS Software Systems (c)1989/1990 All rights reserved **
X** Date:         April 3, 1988                                          **
X** Revision 2.0: January 19, 1989  - ability to handle more partitions  **
X**                                   as well as the description of each **
X** Revision 2.1: January  5, 1990  - cleaned up configuration, added    **
X**                                   the ability to detect new mail     **
X**                                   messages if your mail reader adds  **
X**                                   a "Status:" tag, added the last-   **
X**                                   login code in this program to      **
X**                                   obsolete the "lastlogin" program.  **
X**************************************************************************
X**                                                                      **
X** Program use:  Program is run as information apon login called from   **
X**               the /etc/profile. This program the filesystem          **
X**               information, available main memory and mail messages.  **
X**                                                                      **
X**   This programs must be setuid root (ie. 4755) and can be placed     **
X**   in any directory you choose.                                       **
X**                                                                      **
X**************************************************************************
X**                                                                      **
X**   Credits:  Thanks to Gil Kloepfer, Jr. (gil at limbic) for his insight **
X**   and suggestions about adding the capability of /etc/fsinfo, plus   **
X**   his many other suggestions in general.                             **
X**                                                                      **
X**************************************************************************
X** Permission granted to redistribute without profit in the public      **
X** domain only.  This header must remain in-tact as is.  This program   **
X** carries no warranties, express or implied, and all consequences      **
X** resulting from the use of this program are the sole responsibility   **
X** of the user.  Any modifications of this program must be mailed to    **
X** the author.                                                          **
X\************************************************************************/
X
X#include <stdio.h>
X#include <fcntl.h>
X#include <errno.h>
X#include <signal.h>
X#include <sys/types.h>
X#include <sys/param.h>
X#include <sys/filsys.h>
X#include <mnttab.h>
X#include <sys/utsname.h>
X#include <utmp.h>
X#include <time.h>
X#include <nlist.h>
X
X#ifndef ctob			
X#include <sys/sysmacros.h>
X#endif
X
X/************************************************************************/
X
X/*
X** Configuration options: change only stuff below here and before next
X**                        solid line of "*''s
X*/
X
X#define	LASTLOGIN		/* show the users last login time/tty  	*/
X#define	SHOWTIME		/* show the current time apon login	*/
X#define	UPTIME			/* show the uptime of the system	*/
X#define	FILESTATUS		/* examine the filesystem status	*/
X#define	MEMORY			/* display the available memory		*/
X#define	SHOWMOTD		/* print out the /etc/motd if available	*/
X#define	MAILCHECK		/* show the number of mail messages    	*/
X#define	NEWMAIL			/* calculate how many are new          	*/
X#undef	NOBEEP			/* if defined it will not beep at you	*/
X
X#define UNIX	"/unix"
X#define KMEM	"/dev/kmem"
X#define FSINFO	"/etc/fsinfo"
X#define MNTTAB	"/etc/mnttab"
X#define	LASTLOG	"/usr/adm/lastlogin.log"
X
X#ifndef MAXPERCENT
X# define MAXPERCENT	10		/* warn when less than 10% free	*/
X#endif
X
X#ifndef MAXINODES
X# define MAXINODES	500		/* warn when < 500 i-nodes free	*/
X#endif
X
X#define	REVERSE				/* display MNTTAB in reverse	*/
X
X/************************************************************************/
X
Xchar	*progname;			/* program name			*/
Xstruct  filsys fs;			/* Filesystem superblock struct */
Xstruct	tm	*today, *localtime();
Xstruct	nlist unixsym[] = {
X#define X_MAXMEM	0
X	{ "maxmem" },
X#define X_FREEMEM	1
X	{ "freemem" },
X	{ NULL }
X};
X
X#define MEGABYTE 1048576.0
X#define	DEVFMT	"/dev/r%s"	/* 3B1 device format		*/
X/* #define	DEVFMT	"%s"	/* 386 device format		*/
X
X/* declare all functions as nothing returned */
X
Xvoid	filestatus(),
X	describe(),
X	mailcheck(),
X	memory(),
X	uptime(),
X	showtime(),
X	show_motd(),
X	lastlogin(),
X	terminate();
X
X/************************************************************************/
X
Xmain(argc,argv)
Xint	argc;
Xchar	*argv[];
X{
X	char	*getenv(), *strrchr();
X	int	strcmp(), edfmode;
X
X	/* 
X	** Strip off any pathnames if they exist and only get the 
X	** program name.
X	*/
X    	if ((progname = (char *)(strrchr(*argv, '/'))) == (char *)NULL)
X		progname = *argv;
X	else    progname++;	/* skip of the "/"		*/
X
X#ifdef LASTLOGIN
X	if (strcmp(progname,"logininit") == 0)
X		lastlogin();	/* display last login time	*/
X#endif
X	if (strcmp(progname, "edf") == 0)
X		edfmode = 1;
X	else	edfmode = 0;
X
X	printf("\n");
X
X#ifdef SHOWTIME
X	if (!edfmode)
X		showtime();	/* what time is it?		*/
X#endif
X
X#ifdef UPTIME
X	if (!edfmode)
X		uptime();	/* get system uptime		*/
X#endif
X
X#ifdef FILESTATUS
X	filestatus();		/* get filesystem info		*/
X	if (edfmode)
X		terminate();
X#endif
X
X/*
X** will only get this far if the program isn't called "edf"
X*/
X
X#ifdef MEMORY
X	memory();		/* get current memory		*/
X#endif
X
X#ifdef SHOWMOTD
X	show_motd();		/* print the /etc/motd		*/
X#endif
X
X#ifdef MAILCHECK
X	mailcheck();		/* get mailbox status		*/
X#endif
X
X}
X
X#ifdef FILESTATUS
X/*
X** Show the filesystem status based on all the filesystems currently mounted
X** which is gotten from the /etc/mnttab file.
X*/
X
Xvoid filestatus()
X{
X	int	mntfd, fsfd, 
X		nmount, percleft;
X	float	megs, totmegs, maxmegs;
X	long	totblocks, maxblocks;
X	struct	mnttab	mtable;
X	char	rawdevice[12];
X
X	/* initialize */
X	nmount = totblocks = maxblocks = 0;
X	totmegs = maxmegs = 0.0;
X
X	if ((mntfd = open(MNTTAB, O_RDONLY)) == -1) {
X		fprintf(stderr,"%s: cannot open %s for read\n",
X			progname, MNTTAB);
X		return;
X	}
X
X#ifdef REVERSE
X	/* move to EOF */
X	if (lseek(mntfd, sizeof(struct mnttab) * -1, 2) == -1) {
X		fprintf(stderr,"%s: cannot lseek to end of file: %s\n",
X			progname, MNTTAB);
X		return;
X	}
X#endif
X
X	do  {
X
X	    read(mntfd, &mtable, sizeof(struct mnttab));
X
X	    sprintf(rawdevice, DEVFMT, mtable.mt_dev);
X	    if ((fsfd = open(rawdevice, O_RDONLY)) != -1) {
X	 	if (lseek(fsfd, 512, 0) == -1) {
X		    fprintf(stderr,"%s: cannot lseek to superblock\n", 
X			progname);
X		    return;
X	        }
X
X	        if (read(fsfd, &fs, sizeof(struct filsys)) == -1) {
X		    fprintf(stderr,"%s: cannot read the superblock\n", 
X			progname);
X		    return;
X	        }
X
X	    	close(fsfd);
X
X	    	percleft = (int)((((float)fs.s_tfree / (float)fs.s_fsize) 
X			+ 0.005) * 100.0);
X	    	megs = (fs.s_tfree * 1024) / MEGABYTE;
X	    	totmegs += megs;
X	    	totblocks += (fs.s_tfree * 2);
X	    	maxblocks += (fs.s_fsize * 2);
X
X	    	nmount++;
X
X	    	describe(mtable.mt_dev, mtable.mt_filsys);
X	    	printf(":%5.1fMB, %6d blocks, %5d i-nodes, %2d%%\n",
X			megs, fs.s_tfree * 2, fs.s_tinode, percleft);
X
X	    	if (percleft < MAXPERCENT) {
X			printf("           WARNING: Filesystem disk space is low.\n");
X#ifndef NOBEEP
X			putchar('\007');
X#endif
X		}
X	    	if (fs.s_tinode < MAXINODES) {
X			printf("           WARNING: Filesystem i-nodes are low.\n");
X#ifndef NOBEEP
X			putchar('\007');
X#endif
X		}
X	    } /* cannot open device */
X
X#ifdef REVERSE
X	} while (lseek(mntfd, sizeof(struct mnttab) * -2, 1) != -1);
X#else
X	} while (!errno);
X#endif
X
X	close(mntfd);
X
X	if (nmount > 1) {	/* more than on filesystem mounted */
X	    maxmegs = (maxblocks * 512) / MEGABYTE;
X	    percleft = (int)((((float)totblocks / maxblocks) + 0.005) 
X			* 100.0);
X	    printf("           Total Storage Available  :%5.1fMB, %6d blocks\n",
X		totmegs, totblocks);
X	    printf("                            out of  :%5.1fMB, %6d blocks, %2d%% free\n",
X		maxmegs, maxblocks, percleft);
X	}
X
X}
X
X/* 
X** Describe the filesystem by opening the /etc/fsinfo (#define FSINFO) file
X** and reading the appropriate description.  If there is no description just
X** print a blank area.
X*/
X
Xvoid describe(device, filesys)
Xchar *device, *filesys;
X{
X	FILE	*infofp;
X	int	devlen, fslen;
X	char	devbuf[12], fsbuf[12], infobuf[26];
X
X	devlen = strlen(device);
X	fslen  = strlen(filesys);
X
X	if ((infofp = fopen(FSINFO, "r")) != NULL) {
X	    while (fscanf(infofp, "%s %s %[\ -~]\n", 
X		devbuf, fsbuf, infobuf) > 0) {
X		if (strncmp(devbuf, device, devlen) == 0 &&
X		    strncmp(fsbuf, filesys, fslen) == 0) {
X			fclose(infofp);
X			printf("%-10.10s %-25.25s", filesys, infobuf);
X			return;
X		}
X	    }
X	    fclose(infofp);
X	}
X	printf("%-10.10s %-25.25s", filesys, " "); /* just blank info */
X}
X#endif
X
X#ifdef MAILCHECK
X
X/*
X** Read the users mail file (denoted by environment MAIL) and check for
X** the number of mail messages, if #define'd NEWMAIL then count the number
X** of "Status:" fields, and that will denote _old_ mail.
X*/
X
Xvoid mailcheck()
X{
X	FILE	*fp;
X	char	mailfile[30],		/* mailbox file name            */
X		buffer[BUFSIZ], 
X		*strrchr(), 
X		*getenv();
X	int	msgs = 0, forward = 0, line = 0, old = 0, newmail;
X
X	sprintf(mailfile,"%s",getenv("MAIL"));
X
X	if (access(mailfile,4) == 0) {
X		msgs = 0;
X		if ((fp = fopen(mailfile,"r")) != NULL) {
X			while (fgets(buffer, BUFSIZ, fp) != NULL) {
X				line++;
X				if (line == 1 &&
X				    strncmp(buffer,"Forward",7) == 0) {
X					forward = 1;
X					break;
X				}
X				if (strncmp(buffer,"From ",5) == 0)
X					msgs++;
X#ifdef NEWMAIL
X				else if (strncmp(buffer,"Status: ",8) == 0)
X					old++;
X#endif
X			}
X		}
X		fclose(fp);
X	} else  msgs = 0;
X
X	if (forward)
X		printf("Your mail is being forwarded to%s\n",
X			strrchr(buffer,' '));
X	else if (msgs != 0) {
X#ifdef NEWMAIL
X		buffer[0] = '\0';
X		if ((msgs - old) > 0) {
X			sprintf(buffer,", %d unread", msgs - old);
X			newmail = 1;
X		} else	newmail = 0;
X
X		printf("You have %smail! (%d mail message%s%s in your mailbox)\n",
X			(newmail) ? "new " : "", msgs,
X			(msgs == 1) ? "" : "s",
X			buffer);
X# ifndef NOBEEP
X			putchar('\007');
X# endif
X#else
X		printf("You have mail! (%d mail message%s in your mailbox)\n",
X			msgs, (msgs == 1) ? "" : "s");
X# ifndef NOBEEP
X			putchar('\007');
X# endif
X#endif
X	} else
X		printf("No mail.\n");
X}
X#endif
X
X#ifdef MEMORY
X
X/*
X** Open up /dev/kmem and read the free memory location, display the free
X** memory in megabytes
X*/
X
Xvoid memory()
X{
X	int	kmem;
X	int	maxmem, freemem;
X	float	megs, max, free, perc;
X
X	if (nlist(UNIX, unixsym) < 0) {
X		fprintf(stderr, "%s: no namelist.\n", UNIX);
X		return;
X	}
X
X	if ((kmem = open(KMEM, 0)) < 0) {
X		perror(KMEM);
X		return;
X	}
X
X	lseek(kmem, (long) unixsym[X_MAXMEM].n_value, 0);
X	read(kmem, (char *) &maxmem, sizeof(int));
X	lseek(kmem, (long) unixsym[X_FREEMEM].n_value, 0);
X	read(kmem, (char *) &freemem, sizeof(int));
X
X	close(kmem);
X
X	free = ctob(freemem);
X	max  = ctob(maxmem);
X	perc = free / max;
X	perc *= 100.0;
X
X	printf("%4.2fMB of main memory currently available. (%-2.0f%%)\n",
X		(ctob(freemem) / MEGABYTE), perc);
X		
X}
X#endif
X
X#ifdef UPTIME
X/*
X** Display the uptime found from the /etc/utmp file and the BOOT_TIME flag.
X*/
X
Xvoid uptime()
X{
X	int	now, boottime;
X	char	*up, *ch_time();
X	struct	utmp	*utent, *getutent();
X	struct	utsname	utsname;
X
X	time(&now);
X	today = localtime(&now);
X
X	setutent();
X	while ((utent = getutent()) != (struct utmp *)NULL) {
X		if (utent->ut_type == BOOT_TIME) {
X			boottime = utent->ut_time;
X			break;
X		}
X	}
X	endutent();
X
X	up = ch_time(now - boottime);
X	uname(&utsname);
X	printf("Node: %s, up for %s\n", utsname.nodename, up);
X
X}
X#endif
X
X#ifdef SHOWTIME
X/* 
X** Display the current time in a human-readable format
X*/
X
Xvoid showtime()
X{
X	int	now, ampm;
X	extern	char	*day[], *mon[];
X
X	time(&now);
X	today = localtime(&now);
X
X	if (today->tm_hour == 0) {
X		ampm = 0;
X		today->tm_hour += 12;
X	} else if (today->tm_hour > 12) {
X		ampm = 1;
X		today->tm_hour -= 12;
X	} else  if (today->tm_hour == 12)
X		ampm = 1;
X	else	ampm = 0;
X
X	printf("It's %s, %s %d, %d at %2d:%.2d%s ... \n",
X		day[today->tm_wday], mon[today->tm_mon], today->tm_mday,
X		today->tm_year + 1900, today->tm_hour, today->tm_min,
X		(ampm == 0) ? "am" : "pm");
X
X}
X#endif
X
X#ifdef SHOWMOTD
X/*
X** Display the /etc/motd file if it's there...
X*/
X
Xvoid show_motd()
X{
X	FILE	*fp;
X	char	buffer[BUFSIZ];
X
X	printf("\n");
X	if ((fp = fopen("/etc/motd","r")) != NULL) {
X		while (fgets(buffer, BUFSIZ, fp) != NULL) 
X			printf("%s", buffer);
X	
X		fclose(fp);
X	}
X	printf("\n");
X}
X#endif
X
X#ifdef LASTLOGIN
X
X/*
X** Open up the last login log file, and display the current users last
X** login time (this is much like Berkeley format which should work for
X** programs like "finger")
X*/
X
Xvoid lastlogin()
X{
X	struct utmp *utent, *getutent();
X	int    fd;
X	long   hrs, min, sec;
X	struct lastlog {
X		char	ll_line[8];
X		time_t	ll_time;
X	} ll;
X
X	if (access(LASTLOG, 0) == -1) {
X		if ((fd = creat(LASTLOG,0644)) == -1) {
X			fprintf(stderr,"%s: cannot create file %s: ", 
X				progname, LASTLOG);
X			perror("creat()");
X			return;
X	   	}
X	} else {
X		if ((fd = open(LASTLOG,O_RDWR)) == -1) {
X			fprintf(stderr,"%s: cannot open file %s: ", 
X				progname, LASTLOG);
X			perror("open()");
X			return;
X		}
X	}
X
X	if (lseek(fd, (long)(getuid()*sizeof(struct lastlog)), 0) == -1) {
X		fprintf(stderr,"%s: cannot position file %s: ", 
X			progname, LASTLOG);
X		perror("lseek()");
X		return;
X	}
X
X	if (read(fd, (char *) &ll, sizeof ll) == sizeof ll &&
X	    ll.ll_time != 0L) {
X		printf("Last login: %-19.19s on %.*s\n",
X			(char *)ctime(&ll.ll_time),
X			sizeof(ll.ll_line),
X			ll.ll_line);
X	} else  printf("Last login: no previous login information on record\n");
X
X	sprintf(ll.ll_line, "%.8s", strrchr(ttyname(0), '/') + 1);
X	setutent();
X	while ((utent = (struct utmp *)getutent()) != NULL) 
X		if (strcmp(utent->ut_line, ll.ll_line) == 0)
X			break;
X
X	if (utent == (struct utmp *)NULL) {
X		fprintf(stderr,"%s: cannot locate utmp entry for tty\n",
X			progname);
X		return;
X	}
X	ll.ll_time = utent->ut_time;
X	endutent();
X
X	lseek(fd, (long)(getuid()*sizeof(struct lastlog)), 0);
X	write(fd, (char *) &ll, sizeof ll);
X	close(fd);
X}
X#endif
X
X/*
X** exit out smoothly ...
X*/
X
Xvoid terminate()
X{
X	printf("\n");
X	exit(0);
X}
END_OF_logininit.c
if test 15043 -ne `wc -c <logininit.c`; then
    echo shar: \"logininit.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f chtime.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"chtime.c\"
else
echo shar: Extracting \"chtime.c\" \(1648 characters\)
sed "s/^X//" >chtime.c <<'END_OF_chtime.c'
X/*
X * ch_time - format elapsed time into a character string.
X *
X * Mikel Manitius - 85-01-08 - (mikel at codas.att.com.uucp)
X * Lenny Tropiano - 88-04-14 - (lenny at icus.UUCP) - modified slightly
X *
X */
X
X#define			NULL		(0)
X#define			SECOND		1L
X#define			MINUTE		60L
X#define			HOUR		(60L * 60L)
X#define			DAY		(24L * 60L * 60L)
X#define			WEEK		(7L  * 24L * 60L * 60L)
X#define			BUFSIZE		1024
X
Xchar	*malloc();
X
Xchar	*day[] =
X{
X	"Sunday", "Monday", "Tuesday",
X	"Wednesday", "Thursday", "Friday",
X	"Saturday", 0
X};
X
Xchar	*mon[] =
X{
X	"January", "February", "March", "April", "May",
X	"June", "July", "August", "September", "October",
X	"November", "December", 0
X};
X
X
Xchar *ch_time(sec)
Xint	sec;
X{
X	unsigned long	hrs = 0L;
X	unsigned long	days = 0L;
X	unsigned long	mins = 0L;
X	unsigned long	weeks = 0L;
X	char	*buff;
X
X	buff = malloc(BUFSIZE);
X	if(buff == NULL)
X		return(NULL);
X	weeks = sec / WEEK;
X	sec -= WEEK * weeks;
X	days = sec / DAY;
X	sec -= DAY * days;
X	hrs = sec / HOUR;
X	sec -= HOUR * hrs;
X	mins = sec / MINUTE;
X	sec -= MINUTE * mins;
X
X	if(weeks)
X		sprintf(buff, "%d week%s, ", weeks, (weeks == 1) ? "" : "s");
X	if(days)
X		sprintf(buff, "%s%d day%s, ", (weeks) ? buff : "",
X			days, (days == 1L) ? "" : "s");
X	if(hrs || days || weeks)
X		sprintf(buff, "%s%d hour%s, ", (days || weeks) ? buff : "",
X			hrs, (hrs == 1L) ? "" : "s");
X	if(mins || hrs || days || weeks)
X		sprintf(buff, "%s%d minute%s, ",
X			(hrs || days || weeks) ? buff : "",
X			mins, (mins == 1L) ? "" : "s");
X	sprintf(buff, "%s%s%d second%s.",
X			(mins || hrs || days || weeks) ? buff : "",
X			(mins || hrs || days || weeks) ? "and " : "",
X			sec, (sec == 1L) ? "" : "s");
X	return(buff);
X}
END_OF_chtime.c
if test 1648 -ne `wc -c <chtime.c`; then
    echo shar: \"chtime.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fsinfo.sample -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"fsinfo.sample\"
else
echo shar: Extracting \"fsinfo.sample\" \(368 characters\)
sed "s/^X//" >fsinfo.sample <<'END_OF_fsinfo.sample'
Xfp002	/		HD1 : System Partition
Xfp003	/mnta		HD1 : Partition 2
Xfp003	/mntb		HD1 : Partition 2
Xfp011	/tmp		HD2 : Temporary Partition
Xfp011	/mnta		HD2 : Partition 1
Xfp011	/mntb		HD2 : Partition 1
Xfp012	/usr/spool	HD2 : Spool Partition
Xfp012	/mnta		HD2 : Partition 2
Xfp012	/mntb		HD2 : Partition 2
Xfp021	/mnt		FD  : Floppy Partition
Xfp021	/floppy		FD  : Floppy Partition
END_OF_fsinfo.sample
if test 368 -ne `wc -c <fsinfo.sample`; then
    echo shar: \"fsinfo.sample\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fsinfo2.sample -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"fsinfo2.sample\"
else
echo shar: Extracting \"fsinfo2.sample\" \(530 characters\)
sed "s/^X//" >fsinfo2.sample <<'END_OF_fsinfo2.sample'
Xfp002	/		HD1: System Partition
Xfp003	/mnta		HD1: Partition 2
Xfp003	/mntb		HD1: Partition 2
Xfp003	/tmp		HD1: Sys Temp Partition
Xfp004	/usr/spool	HD1: Spool Partition
Xfp011	/mnta		HD2: Partition 1
Xfp011	/mntb		HD2: Partition 1
Xfp011	/usr/tmp	HD2: User Temp Partition
Xfp012	/netnews	HD2: News Partition
Xfp012	/mnta		HD2: Partition 2
Xfp012	/mntb		HD2: Partition 2
Xfp013	/archives	HD2: Archive Partition
Xfp013	/mnta		HD2: Partition 3
Xfp013	/mntb		HD2: Partition 3
Xfp021	/mnt		FD : Floppy Partition
Xfp021	/floppy		FD : Floppy Partition
END_OF_fsinfo2.sample
if test 530 -ne `wc -c <fsinfo2.sample`; then
    echo shar: \"fsinfo2.sample\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
-- 
| Lenny Tropiano            ICUS Software Systems      lenny at icus.islp.ny.us |
| {ames,pacbell,decuac,hombre,sbcs,attctc}!icus!lenny     attmail!icus!lenny |
+------- ICUS Software Systems -- PO Box 1;  Islip Terrace, NY  11752 -------+



More information about the Unix-pc.sources mailing list