X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/38ed700700dc8c4fb4aef36088e9be73c523be88..ee9b0a0a8b22a0093f2be1a2d21620e27628666a:/usr/src/usr.bin/mail/fio.c diff --git a/usr/src/usr.bin/mail/fio.c b/usr/src/usr.bin/mail/fio.c index bcfc75b4c2..7f0ca8a31a 100644 --- a/usr/src/usr.bin/mail/fio.c +++ b/usr/src/usr.bin/mail/fio.c @@ -2,27 +2,18 @@ * Copyright (c) 1980 Regents of the University of California. * All rights reserved. * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * %sccs.include.redist.c% */ #ifndef lint -static char sccsid[] = "@(#)fio.c 5.19 (Berkeley) %G%"; +static char sccsid[] = "@(#)fio.c 5.24 (Berkeley) %G%"; #endif /* not lint */ #include "rcv.h" #include #include #include +#include #include /* @@ -32,26 +23,28 @@ static char sccsid[] = "@(#)fio.c 5.19 (Berkeley) %G%"; */ /* - * Set up the input pointers while copying the mail file into - * /tmp. + * Set up the input pointers while copying the mail file into /tmp. */ setptr(ibuf) register FILE *ibuf; { - register c; + register int c, count; register char *cp, *cp2; - register count; - char linebuf[LINESIZE]; - int maybe, inhead; + struct message this; FILE *mestmp; off_t offset; - struct message this; - extern char tempSet[]; + int maybe, inhead; + char linebuf[LINESIZE]; - if ((c = opentemp(tempSet)) < 0) + /* Get temporary file. */ + (void)sprintf(linebuf, "%s/mail.XXXXXX", _PATH_TMP); + if ((c = mkstemp(linebuf)) == -1 || + (mestmp = Fdopen(c, "r+")) == NULL) { + (void)fprintf(stderr, "mail: can't open %s\n", linebuf); exit(1); - if ((mestmp = fdopen(c, "r+")) == NULL) - panic("Can't open temporary"); + } + (void)unlink(linebuf); + msgCount = 0; maybe = 1; inhead = 0; @@ -64,15 +57,14 @@ setptr(ibuf) for (;;) { if (fgets(linebuf, LINESIZE, ibuf) == NULL) { if (append(&this, mestmp)) { - perror(tempSet); + perror("temporary file"); exit(1); } - fclose(ibuf); makemessage(mestmp); return; } count = strlen(linebuf); - fwrite(linebuf, sizeof *linebuf, count, otf); + (void) fwrite(linebuf, sizeof *linebuf, count, otf); if (ferror(otf)) { perror("/tmp"); exit(1); @@ -81,7 +73,7 @@ setptr(ibuf) if (maybe && linebuf[0] == 'F' && ishead(linebuf)) { msgCount++; if (append(&this, mestmp)) { - perror(tempSet); + perror("temporary file"); exit(1); } this.m_flag = MUSED|MNEW; @@ -130,8 +122,8 @@ putline(obuf, linebuf) register int c; c = strlen(linebuf); - fwrite(linebuf, sizeof *linebuf, c, obuf); - putc('\n', obuf); + (void) fwrite(linebuf, sizeof *linebuf, c, obuf); + (void) putc('\n', obuf); if (ferror(obuf)) return (-1); return (c + 1); @@ -191,12 +183,12 @@ makemessage(f) dot = message; size -= sizeof (struct message); fflush(f); - lseek(fileno(f), (long) sizeof *message, 0); + (void) lseek(fileno(f), (long) sizeof *message, 0); if (read(fileno(f), (char *) message, size) != size) panic("Message temporary file corrupted"); message[msgCount].m_size = 0; message[msgCount].m_lines = 0; - fclose(f); + Fclose(f); } /* @@ -213,129 +205,18 @@ append(mp, f) /* * Delete a file, but only if the file is a plain file. */ -remove(name) - char name[]; +rm(name) + char *name; { - struct stat statb; - extern int errno; + struct stat sb; - if (stat(name, &statb) < 0) + if (stat(name, &sb) < 0) return(-1); - if ((statb.st_mode & S_IFMT) != S_IFREG) { + if (!S_ISREG(sb.st_mode)) { errno = EISDIR; return(-1); } - return unlink(name); -} - -/* - * Terminate an editing session by attempting to write out the user's - * file from the temporary. Save any new stuff appended to the file. - */ -edstop() -{ - register int gotcha, c; - register struct message *mp; - FILE *obuf, *ibuf, *readstat; - struct stat statb; - char tempname[30]; - char *mktemp(); - - if (readonly) - return; - holdsigs(); - if (Tflag != NOSTR) { - if ((readstat = fopen(Tflag, "w")) == NULL) - Tflag = NOSTR; - } - for (mp = &message[0], gotcha = 0; mp < &message[msgCount]; mp++) { - if (mp->m_flag & MNEW) { - mp->m_flag &= ~MNEW; - mp->m_flag |= MSTATUS; - } - if (mp->m_flag & (MODIFY|MDELETED|MSTATUS)) - gotcha++; - if (Tflag != NOSTR && (mp->m_flag & (MREAD|MDELETED)) != 0) { - char *id; - - if ((id = hfield("article-id", mp)) != NOSTR) - fprintf(readstat, "%s\n", id); - } - } - if (Tflag != NOSTR) - fclose(readstat); - if (!gotcha || Tflag != NOSTR) - goto done; - ibuf = NULL; - if (stat(mailname, &statb) >= 0 && statb.st_size > mailsize) { - strcpy(tempname, "/tmp/mboxXXXXXX"); - mktemp(tempname); - if ((obuf = fopen(tempname, "w")) == NULL) { - perror(tempname); - relsesigs(); - reset(0); - } - if ((ibuf = fopen(mailname, "r")) == NULL) { - perror(mailname); - fclose(obuf); - remove(tempname); - relsesigs(); - reset(0); - } - fseek(ibuf, mailsize, 0); - while ((c = getc(ibuf)) != EOF) - putc(c, obuf); - fclose(ibuf); - fclose(obuf); - if ((ibuf = fopen(tempname, "r")) == NULL) { - perror(tempname); - remove(tempname); - relsesigs(); - reset(0); - } - remove(tempname); - } - printf("\"%s\" ", mailname); - fflush(stdout); - if ((obuf = fopen(mailname, "r+")) == NULL) { - perror(mailname); - relsesigs(); - reset(0); - } - trunc(obuf); - c = 0; - for (mp = &message[0]; mp < &message[msgCount]; mp++) { - if ((mp->m_flag & MDELETED) != 0) - continue; - c++; - if (send(mp, obuf, (struct ignoretab *) NULL, NOSTR) < 0) { - perror(mailname); - relsesigs(); - reset(0); - } - } - gotcha = (c == 0 && ibuf == NULL); - if (ibuf != NULL) { - while ((c = getc(ibuf)) != EOF) - putc(c, obuf); - fclose(ibuf); - } - fflush(obuf); - if (ferror(obuf)) { - perror(mailname); - relsesigs(); - reset(0); - } - fclose(obuf); - if (gotcha) { - remove(mailname); - printf("removed\n"); - } else - printf("complete\n"); - fflush(stdout); - -done: - relsesigs(); + return(unlink(name)); } static int sigdepth; /* depth of holdsigs() */ @@ -360,21 +241,6 @@ relsesigs() sigsetmask(omask); } -/* - * Open a temp file by creating and unlinking. - * Return the open file descriptor. - */ -opentemp(file) - char file[]; -{ - int f; - - if ((f = open(file, O_CREAT|O_EXCL|O_RDWR, 0600)) < 0) - perror(file); - remove(file); - return (f); -} - /* * Determine the size of the file possessed by * the passed buffer. @@ -453,7 +319,7 @@ expand(name) } sprintf(cmdbuf, "echo %s", name); if ((shell = value("SHELL")) == NOSTR) - shell = SHELL; + shell = _PATH_CSHELL; pid = start_command(shell, 0, -1, pivec[1], "-c", cmdbuf, NOSTR); if (pid < 0) { close(pivec[0]); @@ -525,20 +391,3 @@ getdeadletter() } return cp; } - -/* - * A nicer version of Fdopen, which allows us to fclose - * without losing the open file. - */ -FILE * -Fdopen(fildes, mode) - char *mode; -{ - int f; - - if ((f = dup(fildes)) < 0) { - perror("dup"); - return (NULL); - } - return fdopen(f, mode); -}