|
|
researchv10 Norman
#include <stdio.h>
#include <signal.h>
#include "mail.h"
#include "string.h"
#include "message.h"
/* imported */
char *getenv();
/*
* auxiliary routines used by commands
*/
/* drop the newline off a string */
static char *
dropleadingwhite(cmd)
char *cmd;
{
while(*cmd==' ' || *cmd=='\t')
cmd++;
return cmd;
}
/* drop the newline off a string */
static void
dropnewline(cmd)
char *cmd;
{
cmd = cmd+strlen(cmd)-1;
if (*cmd=='\n')
*cmd = '\0';
}
/* make sure an argument exists */
static int
needargument(cmd)
char *cmd;
{
if (*cmd=='\0') {
fprintf(stderr, "?argument missing\n");
return -1;
}
return 0;
}
/* make the header line for a message */
char *
header(mp)
message *mp;
{
static char hd[256];
sprintf(hd, "%3d %c %4d %s %.30s", mp->pos, mp->status&DELETED?'d':' ',
mp->size, s_to_c(mp->sender), s_to_c(mp->date));
return hd;
}
/*
* command routines
*/
/* current message */
whereis(mp)
message *mp;
{
printf("%d\n", mp->pos);
return 0;
}
/* print header */
prheader(mp)
message *mp;
{
printf("%s\n", header(mp));
return 0;
}
/* change message status */
delete(mp)
message *mp;
{
mp->status |= DELETED;
return 0;
}
undelete(mp)
message *mp;
{
mp->status &= ~DELETED;
return 0;
}
/* store a message into a file */
store(mp, cmd, header)
message *mp;
char *cmd;
{
static string *mbox=NULL;
FILE *fp;
char *home;
dropnewline(cmd);
cmd = dropleadingwhite(cmd);
if (*cmd=='\0') {
if (mbox==NULL){
mbox=s_new();
if ((home=getenv("HOME"))!=NULL) {
s_append(mbox, home);
s_append(mbox, "/");
}
s_append(mbox, "mbox");
}
cmd = s_to_c(mbox);
}
fp = fopen(cmd, "a");
if (fp == NULL) {
fprintf(stderr, "?can't open %s\n", cmd);
return -1;
}
m_print(mp, fp, header, header);
fclose(fp);
return 0;
}
static interrupt = 0;
SIGRETURN
remember_int(s)
int s;
{
signal(SIGINT, remember_int);
interrupt = 1;
}
/* pipe a message (and possible tty input) to a command */
static int
pipecmd(mp, cmd, fromtty, mailinput)
message *mp;
char *cmd;
int fromtty;
int mailinput;
{
FILE *fp;
char buf[128];
int status, rv=0;
SIG_TYP istat, qstat;
int onatty;
onatty = isatty(fileno(stdin));
if (fromtty){
printf("!%s\n", cmd);
fflush(stdout);
}
fp = popen(cmd, "w");
if (fp==NULL) {
fprintf(stderr, "?can't exec %s\n", cmd);
return -1;
}
interrupt = 0;
istat = signal(SIGINT, remember_int);
qstat = signal(SIGQUIT, remember_int);
if (fromtty) {
while (fgets(buf, sizeof(buf), stdin)!=NULL) {
if (interrupt!=0)
break;
if (onatty && strcmp(buf, ".\n")==0)
break;
fputs(buf, fp);
fflush(fp);
}
clearerr(stdin);
}
if (!interrupt && mailinput)
m_print(mp, fp, 0, 1);
if (status=pclose(fp))
rv = -1;
signal(SIGINT, istat);
signal(SIGQUIT, qstat);
if (fromtty)
printf("!\n");
return rv;
}
/* pass a message to someone else */
remail(mp, cmd, ttyinput)
message *mp;
char *cmd;
int ttyinput;
{
static string *cmdstring=NULL;
dropnewline(cmd);
if(cmdstring==NULL)
cmdstring = s_new();
s_append(s_restart(cmdstring), "/bin/mail ");
s_append(cmdstring, cmd);
if (pipecmd(mp, s_to_c(cmdstring), ttyinput, 1)<0)
return -1;
return 0;
}
/* output a message */
print(mp)
message *mp;
{
m_print(mp, stdout, 0, 1);
return 0;
}
/* pipe mail into a command */
pipemail(mp, cmd, ttyinput)
message *mp;
char *cmd;
{
dropnewline(cmd);
if (pipecmd(mp, cmd, ttyinput, 1)<0)
return -1;
return 0;
}
/* escape to the shell */
escape(cmd)
char *cmd;
{
char *cp;
cp = cmd+strlen(cmd)-1;
if (*cp=='\n')
*cp = '\0';
system(cmd);
printf("!\n");
return 0;
}
/* reply to a message */
reply(mp, mailinput)
message *mp;
int mailinput;
{
static string *cmdstring=NULL;
if (cmdstring==NULL)
cmdstring = s_new();
s_append(s_restart(cmdstring), "/bin/mail ");
s_append(cmdstring, s_to_c(mp->sender));
if (pipecmd(mp, s_to_c(cmdstring), 1, mailinput)<0)
return -1;
return 0;
}
/* print out the command list */
help()
{
printf("Commands are of the form [range] command [argument].\n");
printf("The commmands are:\n");
printf("b\tprint the next ten headers\n");
printf("d\tmark for deletion\n");
printf("h\tprint message header (,h to print all headers)\n");
printf("m addr\tremail message to addr\n");
printf("M addr\tremail message to addr preceded by user input\n");
printf("p\tprint the message\n");
printf("q\texit from mail, and save messages not marked for deletion\n");
printf("r\treply to sender\n");
printf("R\treply to sender with original message appended\n");
printf("s file\tappend message to file\n");
printf("u\tunmark message for deletion\n");
printf("x\texit without changing mail box\n");
printf("| cmd\tpipe mail to command\n");
printf("! cmd\tescape to commmand\n");
printf("?\tprint this message\n");
return 0;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.