lenny@icus.UUCP (Lenny Tropiano) (06/01/88)
Here's a small utility program that I use here for login information... Enjoy, Lenny #! /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: Makefile README chtime.c logininit.c # Wrapped by lenny@icus on Tue May 31 23:13:14 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(633 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' X# X# Makefile to compile logininit.c (Login Information) X# By Lenny Tropiano X# (c)1988 ICUS Computer Group UUCP: ...icus!lenny X# XCFLAGS=-v -O -DMAXPERCENT=10 -DMAXINODES=500 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 cp logininit $(DEST) X chown root $(DEST)/logininit X chgrp bin $(DEST)/logininit X chmod 4755 $(DEST)/logininit END_OF_Makefile if test 633 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" unpacked with wrong size! fi # end of overwriting check fi if test -f README -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"README\" else echo shar: Extracting \"README\" \(2491 characters\) sed "s/^X//" >README <<'END_OF_README' 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 XEnjoy, XLenny X--- XUS MAIL : Lenny Tropiano, ICUS Computer Group IIIII CCC U U SSS X PO Box 1 I C U U S X Islip Terrace, New York 11752 I C U U SS XPHONE : (516) 968-8576 [H] (516) 582-5525 [W] I C U U S XTELEX : 154232428 [ICUS] IIIII CCC UUU SSS XAT&T MAIL: ...attmail!icus!lenny XUUCP : ...{mtune, ihnp4, boulder, talcott, sbcs, bc-cis}!icus!lenny END_OF_README if test 2491 -ne `wc -c <README`; then echo shar: \"README\" 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@codas.att.com.uucp) X * Lenny Tropiano - 88-04-14 - (lenny@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 logininit.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"logininit.c\" else echo shar: Extracting \"logininit.c\" \(6088 characters\) sed "s/^X//" >logininit.c <<'END_OF_logininit.c' X/************************************************************************\ X** ** X** Program name: logininit.c (Login Initialization) ** X** Programmer: Lenny Tropiano UUCP: ...icus!lenny ** X** Organization: ICUS Computer Group (c)1988 ** X** Date: April 3, 1988 ** X** ** 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** Permission is granted to distribute this program by any means as ** X** long as credit is given for my work. I would also like to see ** X** any modifications or enhancements to this program. ** 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/filsys.h> X#include <sys/param.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#define UNIX "/unix" X#define KMEM "/dev/kmem" X Xstruct nlist unixsym[] = { X#define X_MAXMEM 0 X { "maxmem" }, X#define X_FREEMEM 1 X { "freemem" }, X { NULL } X}; X X#define FILESYS "/dev/rfp002" X#define MEGABYTE 1048576.0 X X#ifndef MAXPERCENT X# define MAXPERCENT 10 X#endif X X#ifndef MAXINODES X# define MAXINODES 500 X#endif X Xchar *progname; /* program name */ Xchar mailfile[30]; /* mailbox file name */ Xstruct filsys fs; /* Filesystem superblock struct */ Xstruct tm *today, *localtime(); X X/************************************************************************/ X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X char *getenv(); X X progname = *argv; X sprintf(mailfile,"%s",getenv("MAIL")); X X printf("\n"); X X showtime(); /* what time is it? */ X uptime(); /* get system uptime */ X filestatus(); /* get filesystem info */ X memory(); /* get current memory */ X show_motd(); /* print the /etc/motd */ X mailcheck(); /* get mailbox status */ X X printf("\n"); X exit(0); X} X Xfilestatus() X{ X int fd, percleft; X X if ((fd = open(FILESYS, O_RDONLY)) == -1) { X fprintf(stderr,"%s: cannot open %s for read\n", X progname, FILESYS); X exit(1); X } X X if (lseek(fd, 512, 0) == -1) { X fprintf(stderr,"%s: cannot lseek to superblock\n", progname); X exit(1); X } X X if (read(fd, &fs, sizeof(struct filsys)) == -1) { X fprintf(stderr,"%s: cannot read the superblock\n", progname); X exit(1); X } X X close(fd); X X percleft = (int)((((float)fs.s_tfree / (float)fs.s_fsize) + 0.005) X * 100.0); X printf("%2d%% available disk storage in the root filesystem. (%d blocks, %d i-nodes)\n", X percleft, fs.s_tfree * 2, fs.s_tinode); X X if (percleft < MAXPERCENT) X printf(" WARNING: Disk space is low. Please clean up unnecessary storage.\007\n"); X X if (fs.s_tinode < MAXINODES) X printf(" WARNING: I-nodes are low. Please archive your files.\007\n"); X X} X Xmailcheck() X{ X FILE *fp; X char buffer[BUFSIZ], *strrchr(); X int msgs = 0, forward = 0; 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 if (strncmp(buffer,"Forward",7) == 0) { X forward = 1; X break; X } X if (strncmp(buffer,"From ",5) == 0) X msgs++; X } X } X fclose(fp); X } else msgs = 0; X X if (forward) X printf("\nYour mail is being forwarded to%s\n", X strrchr(buffer,' ')); X else if (msgs != 0) X printf("You have mail! (%d mail message%s in your mailbox)\007\n", X msgs, (msgs == 1) ? "" : "s"); X else X printf("No mail.\n"); X} X X Xmemory() 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 exit(1); X } X X if ((kmem = open(KMEM, 0)) < 0) { X perror(KMEM); X exit(1); 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 Xuptime() 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 Xshowtime() 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 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 Xshow_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} END_OF_logininit.c if test 6088 -ne `wc -c <logininit.c`; then echo shar: \"logininit.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of shell archive. exit 0 -- US MAIL : Lenny Tropiano, ICUS Computer Group IIIII CCC U U SSS PO Box 1 I C U U S Islip Terrace, New York 11752 I C U U SS PHONE : (516) 968-8576 [H] (516) 582-5525 [W] I C U U S TELEX : 154232428 [ICUS] IIIII CCC UUU SSS AT&T MAIL: ...attmail!icus!lenny UUCP : ...{mtune, ihnp4, boulder, talcott, sbcs, bc-cis}!icus!lenny