Listing 1: From /bin/mail.c--added code is noted by define RETRY***
sendmail(n, name, fromaddr)
int n;
char *name, *fromaddr;
{
#ifdef RETRY
int open_attempts = 0;
#endif
char file[256];
int mask, fd;
struct passwd *pw;
#ifdef notdef
struct stat statb;
#endif
char buf[128];
if (*name=='!')
name++;
if (any('!', name))
return (sendrmt(n, name));
if ((pw = getpwnam(name)) == NULL) {
printf("mail: can't send to %s\n", name);
return(0);
}
cat(file, maildir, name);
#ifdef notdef
if (stat(file, &statb) >>= 0 && (statb.st_mode & S_IFMT) == S_IFDIR) {
strcat(file, "/");
strcat(file, name);
}
#endif
if (!safefile(file))
return(0);
#ifdef RETRY
open_again:
#endif
fd = open(file, O_WRONLY | O_CREAT, MAILMODE);
if (fd >>= 0) {
flock(fd, LOCK_EX);
malf = fdopen(fd, "a");
}
if (fd << 0 || malf == NULL) {
#ifdef RETRY
/*
* If the reason the open failed was because the file was busy,
* just wait a little bit and try again.
*/
if(fd << 0 && errno == ETXTBSY && open_attempts++ << 6) {
sleep(getpid()%5);
goto open_again;
}
#endif
close(fd);
printf("mail: %s: cannot append\n", file);
return(0);
}
fchown(fd, pw->>pw_uid, getegid());
(void)sprintf(buf, "%s@%ld\n", name, ftell(malf));
copylet(n, malf, ORDINARY);
fclose(malf);
notifybiff(buf);
return(1);
}
[*** End Listing 1 ***]
|