[comp.sys.att] UNIX PC: email program to call favorite mailer when <MSG> is pressed.

lenny@icus.islp.ny.us (Lenny Tropiano) (10/24/89)

I know this was posted a while back, but for the benefit of those who
don't know about it, here it is again.  I also made a *FEW* changes to
the program so that it will only call (exec) your mailer ONCE, if it
is already running.  If it is already running, as suggested by Todd Day,
I should just select that window.  Well that's what I did.  It prevents
those obnoxious messages from elm, saying that a temporary lock file is
out there (when you have <MSG> key bouncing )... blah, blah, blah ... 

-- cut here -- -- cut here -- -- cut here -- -- cut here -- -- cut here --
#! /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 email.c
# Wrapped by lenny@icus on Tue Oct 24 00:54:23 1989
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\" \(760 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X# Makefile to compile email.c  (Security fix, and exec your favorite mailer)
X# By Lenny Tropiano
X# (c)1989 ICUS Software Systems UUCP:  ...icus!lenny -or- lenny@icus.islp.ny.us
X#
XLDFLAGS=-s
XLIBS=/lib/crt0s.o /lib/shlib.ifile
X#
X# Define the name of your favorite mailer
X#
XPROGNAME=elm
X#
X# Define the full path to your favorite mailer
X#
XPROGPATH=/usr/lbin/elm
X#
X# Define the label of your mail window
X#
XWIND_LABEL="Mail Window"
X#
XCFLAGS=-v -O -DPROGNAME=\"$(PROGNAME)\" -DPROGPATH=\"$(PROGPATH)\" -DWIND_LABEL=\"$(WIND_LABEL)\"
X
Xemail:  email.o
X	@echo "Loading ..."
X	$(LD) $(LDFLAGS) -o email email.o $(LIBS) 
X#
Xinstall: email
X	mv email /usr/bin/email
X	chown bin /usr/bin/email
X	chgrp mail /usr/bin/email
X	chmod 511 /usr/bin/email
Xclean:
X	rm -f email *.o core
END_OF_Makefile
if test 760 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f email.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"email.c\"
else
echo shar: Extracting \"email.c\" \(4597 characters\)
sed "s/^X//" >email.c <<'END_OF_email.c'
X/************************************************************************\
X**                                                                      **
X** Program name:    email.c (Security fix and exec favorate mailer)     **
X** Programmer:      Lenny Tropiano                                      **
X** E-Mail address:  ...!icus!lenny -or- lenny@icus.islp.ny.us           **
X** Organization:    ICUS Software Systems     (c)1987,1989              **
X** Date:            December 4, 1987                                    **
X** Revision:        October 24, 1989                                    **
X**                                                                      **
X**************************************************************************
X**                                                                      **
X** Program use:  If the program is placed in the /usr/bin directory     **
X**               /etc/smgr (Status Manager) will find this first, and   **
X**               will try to exec it when the <MSG> button is pressed   **
X**               and the <Mail ICON> is visible.                        **
X**                                                                      **
X**               This program will allow you to run your favorite       **
X**               mailer (mine is elm, but substitute yours in the       **
X**               appropriate spots in the Makefile).  If for some       **
X**               your mailer cannot be exec'd, it will default to       **
X**               /bin/mail.                                             **
X**                                                                      **
X**               As per a suggestion on the net, by Todd Day            **
X**               (todd@ivucsb.sba.ca.us <Todd Day>), Message-ID:        **
X**               <1989Oct22.000322.1187@ivucsb.sba.ca.us>, he requested **
X**               that subsequent pressing of the <MSG> key doesn't      **
X**               re-exec another copy of your mailer, but if it is      **
X**               already running, find that window and select it.       **
X**               I thought this was a good idea, implemented it, and    **
X**               here you go!                                           **
X**                                                                      **
X** Disclaimer:   If you are running the AT&T Electronic Mail package    **
X**               do not install this program, it will overwrite the     **
X**               package (which is called /usr/bin/email).              **
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 <pwd.h>
X#include <fcntl.h>
X#include <sys/types.h>
X#include <sys/window.h>
X
X#ifndef PROGNAME
X# define PROGNAME "elm"
X#endif
X#ifndef PROGPATH
X# define PROGPATH "/usr/lbin/elm"
X#endif
X#ifndef WIND_LABEL
X# define WIND_LABEL "Mail Window"	/* window label			*/
X#endif
X
X#define NUM_WIN 12			/* max number of windows	*/
X
Xextern char **environ;
Xstruct utdata ut;
X
Xmain(argc,argv)
Xint   argc;
Xchar *argv[];
X{
X	/* email is exec'd from smgr with /usr/bin/email -i -u <user> */
X
X	struct	passwd	*pswd, *getpwnam();
X	char	arg[30], home[30], shell[30], mail[30];
X
X	if (argv[1] == NULL)
X		exit(1);
X
X	check_window();
X
X	setpwent();
X	if ((pswd = getpwnam(argv[3])) == NULL)
X		exit(1);
X
X	setgid(pswd->pw_gid);
X	setuid(pswd->pw_uid);
X
X	putenv("PATH=:/bin:/usr/bin:/usr/lbin:");
X	sprintf(home,"HOME=%s",pswd->pw_dir);
X	chdir(pswd->pw_dir);
X	putenv(home);
X	sprintf(shell,"SHELL=%s",pswd->pw_shell);
X	putenv(shell);
X	putenv("TERM=s4");
X	sprintf(mail,"MAIL=/usr/mail/%s",pswd->pw_name);
X	putenv(mail);
X	endpwent();
X
X	ut.ut_num = WTXTUSER;
X	sprintf(ut.ut_text,WIND_LABEL);
X	(void)ioctl(0, WIOCSETTEXT, &ut);
X
X	execle(PROGPATH,PROGNAME,0,environ);
X	execle("/bin/mail",0,environ);
X	perror("exec() failed");
X	exit(1);
X}
X
X
Xcheck_window()
X{
X	int  wfd, win;
X	char windev[9];
X
X	for (win=1;win<=NUM_WIN;win++) {
X		sprintf(windev,"/dev/w%d",win);
X		if ((wfd = open(windev, O_RDONLY)) != -1) {
X			ut.ut_num = WTXTUSER;
X			if (ioctl(wfd, WIOCGETTEXT, &ut) != -1) 
X				if (strcmp(ut.ut_text,WIND_LABEL) == 0) {
X					(void)ioctl(wfd, WIOCSELECT);
X					close(wfd);
X					exit(0);
X				}
X		}
X		close(wfd);
X	}
X}
X
END_OF_email.c
if test 4597 -ne `wc -c <email.c`; then
    echo shar: \"email.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
-- 
| Lenny Tropiano            ICUS Software Systems      [w] +1 (516) 589-7930 |
| lenny@icus.islp.ny.us     Telex; 154232428 ICUS      [h] +1 (516) 968-8576 |
| {ames,pacbell,decuac,hombre,sbcs,attctc}!icus!lenny     attmail!icus!lenny |
+------- ICUS Software Systems -- PO Box 1;  Islip Terrace, NY  11752 -------+