A different (more informative) checkmail
Jeffery A Buhrt
buhrt at pur-ee.UUCP
Sun Aug 10 08:41:23 AEST 1986
Checkmail is a program we wrote a few years ago to
print out mail headers in a cute way.
----
checkmail
Mail checking program
Checkmail (and linked names) will look for and print mail
or just newmail found in /usr/spool/mail/loginname.
The messages will be printed as:
Name set in From: line............Message from Subject: line
Written by Jeff Buhrt && Curtis Smith
-Jeff Buhrt
buhrt at ee.purdue.edu
pur-ee!buhrt
# This is a shell archive. Save this into a file, edit it
# and delete all lines above this comment. Then give this
# file to sh by executing the command "sh file". The files
# will be extracted into the current directory owned by
# you with default permissions.
#
# The files contained herein are:
# checkmail.c Makefile
#
echo 'x - checkmail.c'
sed 's/^X//' <<'________This_Is_The_END________' >>checkmail.c
X/* checkmail
X * Mail checking program
X *
X * Checkmail (and linked names) will look for and print mail
X * or just newmail found in /usr/spool/mail/loginname.
X *
X * The messages will be printed as:
X * Name set in From: line............Message from Subject: line
X *
X * Written by Jeff Buhrt (buhrt at ee.purdue.edu) && Curtis Smith
X */
X
X#include <stdio.h>
X#include <pwd.h>
X#include <strings.h>
X#include <errno.h>
X
Xtypedef enum { false = 0, true = 1 } boolean;
X
Xstruct mstr {
X boolean hasread;
X char from[64];
X char subject[64];
X};
X
Xstatic char idstring[]="Checkmail/checkmail.c Jeff Buhrt/Curtis Smith 8/9/86";
X
Xchar hostname[16];
Xchar mailname[] = "/usr/spool/mail/\000xxxxxxxx";
Xchar * username;
Xint uid;
Xint mailcount = 0;
Xint mailunread = 0;
Xboolean newmailonly = false;
Xstruct mstr maillist[256];
Xstruct mstr * m = maillist;
Xextern char * sys_errlist[];
Xextern int errno;
X
Xgetmailname()
X{
X struct passwd * passent;
X
X passent = getpwuid(uid);
X if (passent == (struct passwd *) 0) {
X fprintf(stderr, "User-id %d is not defined on machine %s\n",
X uid, hostname);
X exit(1);
X }
X strcat(mailname, passent->pw_name);
X username = passent->pw_name;
X}
X
Xinit()
X{
X uid = getuid();
X gethostname(hostname, sizeof(hostname));
X hostname[sizeof(hostname)-1] = '\0';
X}
X
Xcutepr(head, tail, dot)
Xchar * head, * tail, dot;
X{
X int dots, headlen, spaceleft, taillen;
X
X headlen = strlen(head);
X taillen = strlen(tail);
X if (headlen > 38)
X headlen = 38;
X spaceleft = 79 - headlen - 2;
X if (taillen > spaceleft)
X taillen = spaceleft;
X dots = 2 + spaceleft - taillen;
X printf("%*.*s", headlen, headlen, head);
X while (dots-- > 0)
X fputc(dot, stdout);
X printf("%*.*s\n", taillen, taillen, tail);
X}
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X register char *name;
X
X if ((name = rindex(*argv, '/')) != NULL)
X name++;
X else
X name = *argv;
X
X if (((strcmp(name, "newmail") == 0) || strcmp(name, "NM") == 0))
X newmailonly = true;
X
X init();
X getmailname();
X readmail();
X header();
X}
X
Xreadmail()
X{
X FILE * ms;
X boolean control, hasread;
X char * ep, * sp, inputline[512];
X
X ms = fopen(mailname, "r");
X if (ms == (FILE *) 0) {
X if (errno == ENOENT) {
X printf("No mail for %s on %s\n", username, hostname);
X exit(0);
X }
X fprintf(stderr, "%s on %s\n", sys_errlist[errno], mailname);
X exit(1);
X }
X control = false;
X while (fgets(inputline, sizeof(inputline), ms) != (char *) 0) {
X sp = index(inputline, '\n');
X if (sp != (char *) 0)
X *sp = '\0';
X if (strncmp(inputline, "From ", 5) == 0) {
X control = true;
X hasread = false;
X m->hasread = false;
X mailcount++;
X continue;
X }
X if ((control) && (*inputline == '\0')) {
X control = false;
X m++;
X if (hasread == false)
X mailunread++;
X continue;
X }
X if ((control) && (strncmp(inputline, "Subject: ", 9) == 0)) {
X strncpy(m->subject, inputline+9, sizeof(m->subject));
X continue;
X }
X if ((control) && (strncmp(inputline, "From: ", 6) == 0)) {
X sp = index(inputline, '(');
X ep = rindex(inputline, ')');
X if ((sp == (char *) 0) || (ep == (char *) 0)) {
X strncpy(m->from, inputline+6, sizeof(m->from));
X continue;
X }
X *ep = '\0';
X strncpy(m->from, sp+1, sizeof(m->from));
X }
X if ((control) && (strncmp(inputline, "Status: ", 8) == 0)) {
X hasread = true;
X m->hasread = true;
X continue;
X }
X }
X fclose(ms);
X}
X
Xheader()
X{
X char head[128], tail[128];
X int count;
X struct mstr * mp;
X
X if (mailcount == 0) {
X printf("No messages for %s on %s\n", username, hostname);
X exit(0);
X }
X
X sprintf(head, "Mail (%s on %s)", username, hostname);
X if (mailunread != mailcount)
X sprintf(tail, "%d Letter%s (%d unread)",
X mailcount, mailcount == 1 ? "" : "s", mailunread);
X else
X sprintf(tail, "%d Letter%s", mailcount, mailcount == 1 ?
X "" : "s");
X cutepr(head, tail, ' ');
X fputc('\n', stdout);
X count = 1;
X for (mp = maillist; mp < m; mp++)
X {
X sprintf(head, "%c %2d. %s",
X mp->hasread == false ? '*' : ' ', count++, mp->from);
X
X if ((newmailonly == false) || (mp->hasread == false))
X cutepr(head, mp->subject, '.');
X }
X}
________This_Is_The_END________
echo 'x - Makefile'
sed 's/^X//' <<'________This_Is_The_END________' >>Makefile
XCC= cc
XCFLAGS=-s -O
XFILE= checkmail.c
XOBJ= checkmail.o
XLIBS=
XBINDIR=.
X
Xtabkill:
X cc ${FILE} ${CFLAGS} ${LIBS} -o ${BINDIR}/checkmail
X -rm ${BINDIR}/newmail ${BINDIR}/M ${BINDIR}/NM
X ln ${BINDIR}/checkmail ${BINDIR}/newmail
X ln ${BINDIR}/checkmail ${BINDIR}/M
X ln ${BINDIR}/checkmail ${BINDIR}/NM
________This_Is_The_END________
exit
More information about the Comp.sources.unix
mailing list