Category : Files from Magazines
Archive   : DDJ9407B.ZIP
Filename : POSTMAN.ASC

 
Output of file : POSTMAN.ASC contained in archive : DDJ9407B.ZIP
_POSTMAN: A BRIDGE TO THE UNIX MAIL SYSTEM_
by Zongnan H. Lu

Listing One

//////////////////////////////////////////
// ml.h - header file for postman //
//////////////////////////////////////////

#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include

const int WAITTIME = 60;
const int MAXDAT = 24;
const int MAXNAM = 128;
const int MAXFNM = 32;
const int MAXID = 12;

const int FRSTUSRID = 200; // PIS users' ID start from 200

const char* A_FILE = "a";
const char* M_FILE = "m";
const char* D_FILE = "d";

#define MAILDIR "/usr/spool/mail"
#define ERRLOG "/tmp/postman.err"
#define HOSTADDR "@my_pis.my_corp.com"

class Errors {
enum {bsize = 256};
char fname[bsize]; // error log file
public:
Errors(char *fn) {strcpy(fname, fn);};
void seterr(const char *,...);
};

class letter {
public:
char title[MAXNAM];
char date[MAXDAT];
char sender[MAXNAM];
char recipient[MAXNAM];
char textf[MAXFNM];
public:
virtual int send() = 0;
virtual int read(char *) = 0;
};

class myletter : public letter {
char *hostaddr;
char usrdir[MAXFNM];
int usrid;
int grpid;
public:
int letterId;
public:
myletter(char *hst) : letterId(-1), hostaddr(hst) {
usrdir[0]=0;
}
int isinPIS(char *);
int send();
int read(char *);
};

class dirf {
DIR *dirp;
char *dirname;
struct direct *ds;
public:
dirf (char *drnm=".") { dirname=drnm; dirp=NULL;}
~dirf() {dirp=NULL;}
void resetdir(char *drnm=".") {
if (dirp)
closedir(dirp);
dirp=NULL;
dirname=drnm;
}
int rddir(char *);
};

extern Errors _syserr;

extern "C" {
int _getusrname(char *, char *, char *);
void check_inmail();
void check_outmail();
int _read_outmail(myletter *);
void _readmail(char *);
void wakeup();
void _mail2note(myletter *);
}


Listing Two

//////////////////////////////////////////
// postman.c //
//////////////////////////////////////////

#include "ml.h"

//---------------------------------------//
// dirf::rddir() - class member function //
//---------------------------------------//
int dirf::rddir(char *fname)
{
if (dirp == NULL) {
if ((dirp = opendir(dirname)) == NULL)
_syserr.seterr("open %s failed, errno = %d\n", dirname, errno);
}
errno = 0;
if ((ds = readdir(dirp)) == NULL) {
if (errno) {
_syserr.seterr("readdir failed, errno = %d\n", errno);
}
return 0;
}
strcpy(fname, ds->d_name);
return 1;
}

//------------------------------------------//
// Errors::seterr() - class member function //
//------------------------------------------//
void Errors::seterr(const char *format_str,...)
{
FILE *fp;
va_list arg_ptr;

va_start(arg_ptr, format_str);
if ((fp=fopen(fname,"w"))!=NULL) {
vfprintf(fp, format_str, arg_ptr);
fclose(fp);
}
va_end(arg_ptr);
exit (-1);
}

//--------------------------------------------------------------------//
// _find_usrid() - find a user's login I.D. in the /etc/passwd file. //
// -------------------------------------------------------------------//
int myletter::isinPIS(char *usrnam)
{
struct passwd *p;

setpwent();
while (p=getpwent()) {
if (!strcmp(usrnam,p->pw_name)) {
if (p->pw_uid < FRSTUSRID)
return 0;
strcpy (usrdir, p->pw_dir);
usrid = p->pw_uid;
grpid = p->pw_gid;
return 1;
}
}
endpwent();
return 0;
}

//------------------------------------------//
// myletter::send() - class member function //
//------------------------------------------//
int myletter::send()
{
char mfile[256], buf[256];
FILE *fp;
int ret, forward=0;

if (!isinPIS(sender)) {
_syserr.seterr("send:isinPIS:[%s]",sender);
}
sprintf(mfile,"%s/%s", usrdir, M_FILE);
if ((fp=fopen(mfile,"w"))== NULL) {
return -1;
}
fprintf(fp,
"Mail -s \"%s\" %s <%s\n", title, recipient, textf),
fclose(fp);

if (chmod(mfile, 0777))
_syserr.seterr("send:chmod:%s",mfile);
if (chmod(textf, 0777))
_syserr.seterr("send:chmod:%s",textf);
if (chown(mfile, usrid, grpid))
_syserr.seterr("send:chown:%s",mfile);
if (chown(textf, usrid, grpid))
_syserr.seterr("send:chown:%s",textf);

sprintf(buf,"su - %s -c %s", sender, mfile);
ret=system(buf);
if (ret)
_syserr.seterr("send:system:%s(%d)\n",buf,ret);

return 1;
}

//------------------------------------------//
// myletter::read() - class member function //
//------------------------------------------//
int myletter::read(char *usr)
{
short frnm=0, tonm=0, subj=0, datm=0, ret;
char buf[256];
ifstream inf;

sprintf(buf, "%s/%s", usrdir, A_FILE);
unlink(buf);
sprintf(buf,"Mail -N >%s/%s -u %s <%s/%s",
usrdir, A_FILE, usr, usrdir, D_FILE);
ret = system(buf);
if (ret) {
_syserr.seterr("read:system:%s:ret=%d\n",buf, ret);
}
sprintf(textf, "%s/%s", usrdir, A_FILE);
inf.open(textf);
while (inf.getline(buf,256)) {
if (!datm && !strncmp(buf,"Date:",5)){
strcpy(date,(char *)&(buf[5]));
datm++;
} else if (!frnm && !strncmp(buf,"From",4)) {
strcpy(sender,strtok((char *)&(buf[5])," "));
frnm=1;
} else if (!tonm && !strncmp(buf,"To: ",4)) {
if (strstr(buf,usr)) {
// mail is in the user's mailbox //
strcpy(recipient, usr);
} else {
// mail is in the pis_user mailbox //
if (!_getusrname((char *)&(buf[4]),
recipient, hostaddr))
_syserr.seterr("_getusrname:[%s]\n",buf);
}
tonm++;
} else if (!subj && !strncmp(buf,"Subject: ",9)) {
strcpy(title, (char *)&(buf[9]));
subj++;
} else if (datm && frnm && tonm && datm &&
!strncmp(buf,"Status:",7)) {
break;
}
}
inf.close();
return 1;
}

//-------------------------------------//
// wakeup() - signal handling function //
//-------------------------------------//
void wakeup()
{
alarm(0);
signal(SIGALRM, (SIG_PF)wakeup);
}
Errors _syserr(ERRLOG);
void main()
{
signal(SIGALRM, (SIG_PF)wakeup);
alarm(1);

do {
pause();

check_inmail();

check_outmail();

alarm(WAITTIME);
} while (1);
}

//-------------------------------------------------------//
// check_outmail() - check outgoing mail and send it out //
//-------------------------------------------------------//
void check_outmail()
{
myletter ml(HOSTADDR);

do {
if (!_read_outmail(&ml)) {

break;
}
ml.send();
} while (1);
}

//---------------------------------------------------------//
// check_inmail() - check incoming mail and pass it to PIS //
//---------------------------------------------------------//
void check_inmail()
{
char fname[256];
dirf df(MAILDIR);

while (df.rddir(fname)) {
if (strcmp(fname, ".") && strcmp(fname, "..") &&
strcmp(fname,"root")) {
_readmail(fname);
}
}
}

//------------------------------------------------------------------//
// _readmail() - read title, sender, recipient, and date from mail. //
//------------------------------------------------------------------//
void _readmail(char *usr)
{
char tmp[256];
myletter ml(HOSTADDR);
int ret;

if (!ml.isinPIS(usr))
return;

do {
ml.read(usr);

_mail2note(&ml);

sprintf(tmp,"%s/%s", MAILDIR, usr);
ret= access(tmp, F_OK);
} while (!ret);
}

//-------------------------------------------------------------//
// _getusrname() - find a user's name from a recipient string. //
//-------------------------------------------------------------//
int _getusrname(char *s, char *usr, char *hst)
{
char tmp[256], *p;

usr[0]=0;
strcpy(tmp, s);
if (strchr(s,'@')==NULL) {
p = strtok(tmp," \"<>");
p = strtok(NULL," \"<>");
if (p == NULL)
return 0;
strcpy(usr,p);
return (strlen(usr));
}
p = strstr(tmp,hst);
int i = strlen(s)-strlen(p);
tmp[i]=0;

for (i=strlen(tmp)-1;i>=0;i--) {
if (strchr(" <,[\"",tmp[i]))
break;
}
strcpy(usr,(char *)&(tmp[i+1]));
return (strlen(usr));
}

//---------------------------------------//
// _read_outmail() - read mail from PIS. //
//---------------------------------------//
int _read_outmail(myletter *ml)
{
strcpy(ml->textf,"");
//
// user application function getone_inpis()
// assigns mail title, date, sender, recipient,
// and text file name to ml.
//
// if(getone_inpis(ml->title, ml->date, ml->sender,
// ml->recipient, ml->textf)) {
// return 1;
// else
// return 0;
//
return 0;
}

//---------------------------------//
// _mail2note() - pass mail to PIS //
//---------------------------------//
int _getletterId(void)
{
static i=0;

return (++i);
}

void _mail2note(myletter *ml)
{
ml->letterId = _getletterId();
//
// pass2pis(ml->title, ml->date,
// ml->sender, ml->recipient, ml->textf);
//
}



  3 Responses to “Category : Files from Magazines
Archive   : DDJ9407B.ZIP
Filename : POSTMAN.ASC

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/