V5/usr/source/s2/mail.c
/* mail command usage
mail
prints your mail
mail file people
sends file to people by login name
mail person
sends following tty input to him
*/
char iobuf[518];
char ubuf[16];
main(argc, argv)
char *argv[];
{
char *buf;
static char myname[20], junk[40], number[20];
static char hisname[40], hisdir[40];
auto j, j0, k, n, mail, file, mynumber;
if(argc==1 || (argc==2 && argv[1][0]=='-'))
goto printm;
if(fopen("/etc/passwd", iobuf) < 0) {
printf("Can't open password file\n");
exit();
}
if(mynumber = ttyn(0)) {
if((file = open("/tmp/utmp",0)) < 0)
goto otherway;
while(read(file,ubuf,16)) {
if(mynumber == ubuf[8]) {
close(file);
file = 0;
while(file < 8 && ubuf[file] != ' ') {
myname[file] = ubuf[file];
file++;
}
myname[file] = 0;
goto namefound;
}
}
}
otherway:
mynumber = getuid();
for(;;) {
if(!(getfield(myname) &&
getfield(junk) &&
getfield(number) &&
getfield(junk) &&
getfield(junk) &&
getfield(junk) &&
getfield(junk))) {
printf("Who are you?\n");
exit();
}
if(atoi(number) == mynumber)
break;
}
namefound:
close(iobuf[0]);
if(argc > 2)
file = argv[1];
else
file = 0;
j0 = argc>2? 1: 0;
fopen("/etc/passwd", iobuf);
k = 2;
for(;;) {
if(!(getfield(hisname) &&
getfield(junk) &&
getfield(junk) &&
getfield(junk) &&
getfield(junk) &&
getfield(hisdir) &&
getfield(junk)))
break;
j = j0;
while(++j < argc)
if(comp(argv[j], hisname)) {
send(file, myname, hisname, hisdir);
argv[j][0] = 0;
if(++k >= argc)
exit();
}
}
j = j0;
while(++j < argc)
if(argv[j][0] != 0) {
junk[0] = 0;
append(argv[j], junk);
send(file, myname, argv[j], junk);
}
exit();
printm:
if((mail=open("mailbox", 0)) < 0) {
printf("No mail\n");
exit();
}
while(n = read(mail, iobuf, 512))
write(1, iobuf, n);
if(argc != 2) {
printf("Save? ");
read(0, buf=iobuf, 512);
} else
buf = &argv[1][1];
if(buf[0] == 'y') {
if(concat("mailbox","mbox",0))
printf("Old mail in `mbox'\n");
}
unlink("mailbox");
exit();
}
getfield(buf)
char buf[];
{
int j;
char c;
j = 0;
while((c = buf[j] = getc(iobuf)) >= 0)
if(c==':' || c=='\n') {
buf[j] =0;
return(1);
} else
j++;
return(0);
}
/* send overwrites hisdir */
send(file, myname, hisname, hisdir)
char hisname[], myname[], hisdir[];
{
static char buf[512];
int n;
for(n = 0 ; hisdir[n++];);
append("/mailbox", hisdir);
buf[0] = 0;
append("\nFrom ",buf);
append(myname,buf);
append(" ",buf);
time(buf+256);
append(ctime(buf+256),buf);
if(!concat(file,hisdir,1,buf))
printf("Can't send to `%s'\n",hisname);
hisdir[n] = 0;
}
comp(n1, n2)
char n1[], n2[];
{
int i;
char c;
i = 0;
while((c=n1[i]) == n2[i])
if(c == 0)
return(1); else
i++;
return(0);
}
atoi(a)
char a[];
{
int i, j;
i = 0;
j = 0;
while(a[j])
i = i*10 + a[j++] - '0';
return(i);
}
append(tail, head)
char head[], tail[];
{
int i, j;
i = 0;
while(head[i])
i++;
j = 0;
while(head[i++] = tail[j++]);
}
concat(fn1,fn2,flg,header)
char *fn1,*fn2;
int flg;
char *header;
{
char *flname;
int fn;
int tmp,n;
static buf[512];
flname = "/tmp/mtm\0\0";
for(flname[8] = 'a' ; flname[8] <= 'z' ; flname[8]++)
if(stat(flname,buf) < 0)
goto found;
notmp:
printf("can't creat tmp file\n");
exit();
found:
if((tmp = creat(flname,0400)) < 0)
goto notmp;
if(!fn1)
/*standard input file*/
fn = 0;
else
if((fn = open(fn1,0)) < 0) {
close(tmp);
unlink(flname);
printf("can't open `%s'\n", fn1);
exit();
}
if(flg) {
for(n = 0 ; header[n++] ;);
write(tmp,header,n-1);
}
while(n = read(fn,buf,512))
write(tmp,buf,n);
if(flg)
write(tmp,"\n",1);
if(fn)
close(fn);
if(stat(fn2,buf) >= 0) {
if((fn = open(fn2,0)) < 0) {
close(tmp);
unlink(flname);
return(0);
}
while(n = read(fn,buf,512))
write(tmp,buf,n);
close(fn);
}
close(tmp);
if((tmp = open(flname,0)) < 0) {
unlink(flname);
goto notmp;
}
if((fn = creat(fn2,0666)) < 0) {
close(tmp);
unlink(flname);
return(0);
}
while(n = read(tmp,buf,512))
write(fn,buf,n);
close(fn);
close(tmp);
unlink(flname);
return(1);
}