|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 3526 (0xdc6)
Types: TextFile
Names: »msgs.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦e84e043a4⟧ »EurOpenD3/mail/pop/trout-popd.tar.Z«
└─⟦632bfcc3f⟧
└─⟦this⟧ »msgs.c«
/*
* This code shamelessly stolen from msgs.c and hacked up for use with popd.
* Credit to Berkeley or whoever originally wrote this thing.
*/
#include <stdio.h>
#include <sys/param.h>
#include <pwd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#define USRMSGS "/usr/msgs" /* was in msgs.h */
#define NO 0
#define YES 1
#define MSGSRC ".msgsrc" /* user's rc file */
#define BOUNDS "bounds" /* message bounds file */
typedef char bool;
FILE *newmsg;
char inbuf[BUFSIZ];
char fname[128];
int msg;
/*
* Copy msgs messages to the specified file. If the file is NULL, just
* return how many messages are waiting.
*/
int
msgs(dest)
char *dest; /* destination: file where the messages
* should go */
{
FILE *f;
bool newrc;
int rcfirst = 0; /* first message to print (from .rc) */
int firstmsg, nextmsg, lastmsg = 0;
long t;
FILE *bounds, *msgsrc;
char msgsrcpath[MAXPATHLEN];
struct passwd *pw;
struct stat sbuf;
int firstline;
/*
* determine current message bounds
*/
sprintf(fname, "%s/%s", USRMSGS, BOUNDS);
if ((bounds = fopen(fname, "r")) == NULL)
return 0;
fscanf(bounds, "%d %d\n", &firstmsg, &lastmsg);
fclose(bounds);
/*
* Get the user's .msgsrc file
*/
if ((pw = getpwuid(getuid())) == NULL)
return 0;
strcpy(msgsrcpath, pw->pw_dir);
strcat(msgsrcpath, "/");
strcat(msgsrcpath, MSGSRC);
if ((msgsrc = fopen(msgsrcpath, "r")) != NULL) {
newrc = NO;
fscanf(msgsrc, "%d\n", &nextmsg);
fclose(msgsrc);
if (nextmsg > lastmsg + 1) {
/* bounds were reset */
ftruncate(fileno(msgsrc), 0);
newrc = YES;
} else
rcfirst = nextmsg;
fclose(msgsrc);
} else
newrc = YES;
msgsrc = fopen(msgsrcpath, "a");
if (msgsrc == NULL)
return 0;
if (rcfirst) {
if (rcfirst > lastmsg + 1)
rcfirst = nextmsg;
if (rcfirst > firstmsg)
firstmsg = rcfirst; /* don't set below first msg */
}
if (newrc) {
nextmsg = firstmsg;
fseek(msgsrc, 0L, 0);
fprintf(msgsrc, "%d\n", nextmsg);
fflush(msgsrc);
}
if (dest == NULL || strlen(dest) == 0) {
/* just checking. no copy required */
fclose(msgsrc);
return (firstmsg <= lastmsg);
}
if ((f = fopen(dest, "a")) == NULL) {
fclose(msgsrc);
return 0;
}
flock(fileno(f), LOCK_EX);
for (msg = firstmsg; msg <= lastmsg; msg++) {
sprintf(fname, "%s/%d", USRMSGS, msg);
newmsg = fopen(fname, "r");
if (newmsg == NULL)
continue;
/*
* Sanity check.
* If we get a small or zero length message,
* just ignore it. 64 bytes is barely enough
* to hold a From:, Date:, and Subject: line.
*/
fstat(fileno(newmsg), &sbuf);
if (sbuf.st_size < 64) {
fclose(newmsg);
continue;
}
firstline = 1;
while (fgets(inbuf, sizeof inbuf, newmsg) != NULL) {
if (firstline) {
if (strncmp(inbuf, "From ", 5) == 0) {
fputs(inbuf, f);
} else {
time(&t);
fprintf(f, "From msgs %s", ctime(&t));
}
firstline = 0;
} else {
if (strncmp(inbuf, "From ", 5) == 0)
fputs(">", f);
fputs(inbuf, f);
}
}
/* make sure there is a blank line separator. */
fprintf(f, "\n");
fclose(newmsg);
}
flock(fileno(f), LOCK_UN);
fclose(f);
/*
* Make sure .rc file gets updated
*/
if (--msg >= nextmsg) {
nextmsg = msg + 1;
fseek(msgsrc, 0L, 0);
fprintf(msgsrc, "%d\n", nextmsg);
fflush(msgsrc);
fclose(msgsrc);
}
return ((lastmsg + 1) - firstmsg);
}