static char sccsid
[] = "@(#)mail.local.c 4.27 (Berkeley) %G%";
#define SENDMAIL "/usr/lib/sendmail"
#define REMOTE 1 /* remote mail, add rmtmsg */
#define ZAP 3 /* zap header and trailing empty line */
#define MAXLET 300 /* maximum number of letters */
#define MAILMODE 0600 /* mode of created mail */
char lettmp
[] = "/tmp/maXXXXX";
char maildir
[] = "/usr/spool/mail/";
char mailfile
[] = "/usr/spool/mail/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char dead
[] = "dead.letter";
char forwmsg
[] = " forwarded\n";
if (name
== NULL
|| *name
== '\0') {
pwent
= getpwuid(getuid());
pwent
= getpwnam(my_name
);
if ( getuid() != pwent
->pw_uid
) {
pwent
= getpwuid(getuid());
strncpy(my_name
, name
, sizeof(my_name
)-1);
for (i
=SIGHUP
; i
<=SIGTERM
; i
++)
if (i
< 0 || tmpf
== NULL
)
panic("mail: %s: cannot open for writing", lettmp
);
* This protects against others reading mail from temp file and
* if we exit, the file will be deleted already.
if (argv
[0][0] != 'r' && /* no favors for rmail*/
(argc
== 1 || argv
[1][0] == '-' && !any(argv
[1][1], "rhd")))
if (signal(i
, SIG_IGN
) != SIG_IGN
)
cat(mailfile
, maildir
, my_name
);
if (stat(mailfile
, &statb
) >= 0
&& (statb
.st_mode
& S_IFMT
) == S_IFDIR
) {
strcat(mailfile
, my_name
);
for (; argc
> 1; argv
++, argc
--) {
strcpy(mailfile
, argv
[2]);
panic("unknown option %c", argv
[1][1]);
malf
= fopen(mailfile
, "r");
flock(fileno(malf
), LOCK_SH
);
fclose(malf
); /* implicit unlock */
for (i
= 0; i
< nlet
; ) {
j
= forward
? i
: nlet
- i
- 1;
copylet(j
, stdout
, ORDINARY
);
if (fgets(resp
, LSIZE
, stdin
) == NULL
)
printf("x\texit without changing mail\n");
printf("s[file]\tsave (default mbox)\n");
printf("w[file]\tsame without header\n");
printf("-\tprint previous\n");
printf("+\tnext (no delete)\n");
printf("m user\tmail to user\n");
printf("! cmd\texecute cmd\n");
if (resp
[1] != '\n' && resp
[1] != ' ') {
if (resp
[1] == '\n' || resp
[1] == '\0') {
for (p
= resp
+1; (p
= getarg(lfil
, p
)) != NULL
; ) {
printf("mail: %s: cannot append\n",
copylet(j
, malf
, resp
[0]=='w'? ZAP
: ORDINARY
);
if (resp
[1] == '\n' || resp
[1] == '\0') {
printf("invalid command\n");
for (p
= resp
+1; (p
= getarg(lfil
, p
)) != NULL
; )
if (!sendmail(j
, lfil
, my_name
))
/* copy temp or whatever back to /usr/spool/mail */
int fd
, new = 0, oldmask
;
#define mask(s) (1 << ((s) - 1))
oldmask
= sigblock(mask(SIGINT
)|mask(SIGHUP
)|mask(SIGQUIT
));
fd
= open(mailfile
, O_RDWR
| O_CREAT
, MAILMODE
);
malf
= fdopen(fd
, "r+w");
if (fd
< 0 || malf
== NULL
)
panic("can't rewrite %s", lfil
);
if (stbuf
.st_size
!= let
[nlet
].adr
) { /* new mail has arrived */
fseek(malf
, let
[nlet
].adr
, L_SET
);
fseek(tmpf
, let
[nlet
].adr
, L_SET
);
while ((c
= getc(malf
)) != EOF
)
let
[++nlet
].adr
= stbuf
.st_size
;
for (i
= 0; i
< nlet
; i
++)
if (let
[i
].change
!= 'd')
copylet(i
, malf
, ORDINARY
);
fclose(malf
); /* implict unlock */
printf("New mail has arrived.\n");
/* copy mail (f1) to temp (f2) */
while (fgets(line
, LSIZE
, f1
) != NULL
) {
let
[nlet
++].adr
= nextadr
;
let
[nlet
].adr
= nextadr
; /* last plus 1 */
char hostname
[MAXHOSTNAMELEN
];
fseek(tmpf
, let
[n
].adr
, L_SET
);
k
= let
[n
+1].adr
- let
[n
].adr
;
while (k
-- > 1 && (ch
= getc(tmpf
)) != '\n')
gethostname(hostname
, sizeof (hostname
));
fprintf(f
, " remote from %s\n", hostname
);
panic("Bad letter type %d to copylet.", type
);
if (type
!= ZAP
|| ch
!= '\n')
fprintf(stderr
, "puke\n");
for (vp
= argv
, ap
= newargv
+ 1; (*ap
= *vp
++) != 0; ap
++)
if (ap
[0][0] == '-' && ap
[0][1] == 'd')
/* give it to sendmail, rah rah! */
* When we fall out of this, argv[1] should be first name,
* argc should be number of names + 1.
while (argc
> 1 && *argv
[1] == '-') {
if (strcmp(my_name
, "root") == 0 ||
strcmp(my_name
, "daemon") == 0 ||
strcmp(my_name
, "network") == 0 ||
strcmp(my_name
, "uucp")) {
strcpy(truename
, argv
[1]);
fgets(line
, LSIZE
, stdin
);
if (strncmp("From", line
, 4) == 0)
fprintf(tmpf
, "%s%s %s", from
, truename
, ctime(&iop
));
if (*line
== '\0' && fgets(line
, LSIZE
, stdin
) == NULL
)
if (fgets(line
, LSIZE
, stdin
) == NULL
)
if (*line
== '.' && line
[1] == '\n' && isatty(fileno(stdin
)))
let
[1].adr
= ftell(tmpf
);
if (!sendmail(0, *++argv
, truename
))
if (error
&& safefile(dead
)) {
printf("mail: cannot open %s\n", dead
);
printf("Mail saved in %s\n", dead
);
while (p
= index(name
, '^'))
if (strncmp(name
, "researc", 7)) {
strcpy(rsys
, "research");
for (p
=rsys
; *name
!='!'; *p
++ = *name
++)
return(0); /* local address, no '!' */
if ((pid
= fork()) == -1) {
fprintf(stderr
, "mail: can't create proc for remote\n");
while (wait(&sts
) != pid
) {
sprintf(cmd
, "uux - %s!rmail \\(%s\\)", rsys
, name
+1);
sprintf(cmd
, "uux - %s!rmail %s", rsys
, name
+1);
if ((rmf
=popen(cmd
, "w")) == NULL
)
fprintf(stderr
, "Usage: mail [ -f ] people . . .\n");
static struct sockaddr_in addr
;
if (addr
.sin_family
== 0) {
struct hostent
*hp
= gethostbyname("localhost");
struct servent
*sp
= getservbyname("biff", "udp");
addr
.sin_family
= hp
->h_addrtype
;
bcopy(hp
->h_addr
, &addr
.sin_addr
, hp
->h_length
);
addr
.sin_port
= sp
->s_port
;
f
= socket(AF_INET
, SOCK_DGRAM
, 0);
sendto(f
, msg
, strlen(msg
)+1, 0, &addr
, sizeof (addr
));
sendmail(n
, name
, fromaddr
)
return (sendrmt(n
, name
));
if ((pw
= getpwnam(name
)) == NULL
) {
printf("mail: can't send to %s\n", name
);
cat(file
, maildir
, name
);
if (stat(file
, &statb
) >= 0 && (statb
.st_mode
& S_IFMT
) == S_IFDIR
) {
fd
= open(file
, O_WRONLY
| O_CREAT
, MAILMODE
);
if (fd
< 0 || malf
== NULL
) {
printf("mail: %s: cannot append\n", file
);
fchown(fd
, pw
->pw_uid
, pw
->pw_gid
);
sprintf(buf
, "%s@%d\n", name
, ftell(malf
));
copylet(n
, malf
, ORDINARY
);
sigsetmask(sigblock(0) &~ sigmask(i
));
char *to
, *from1
, *from2
;
for (dp
= from1
; *cp
= *dp
++; cp
++)
for (dp
= from2
; *cp
++ = *dp
++; )
/* copy p... into s, update p */
while (*p
== ' ' || *p
== '\t')
if (*p
== '\n' || *p
== '\0')
while (*p
!= ' ' && *p
!= '\t' && *p
!= '\n' && *p
!= '\0')
if (lstat(f
, &statb
) < 0)
if (statb
.st_nlink
!= 1 || (statb
.st_mode
& S_IFMT
) == S_IFLNK
) {
"mail: %s has more than one link or is a symbolic link\n",
fprintf(stderr
, "mail: ");
fprintf(stderr
, msg
, a1
, a2
, a3
);