|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 3857 (0xf11) Types: TextFile Names: »mailbox.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦6429e39db⟧ »EurOpenD3/news/tmnn.7.8.tar.Z« └─⟦b5a65d78b⟧ └─⟦this⟧ »src/D.news/mailbox.c«
/***************************************************************************** NAME mailbox.c -- mailbox and save file manipulation SYNOPSIS #include "mailbox.h" char *mailbox(mname) -- generate mailbox name corresponding to mname char *mname; int saveto(fname, flags) -- file saving function char *fname; int flags; DESCRIPTION This function writes the headers and text of the current message to a save file. Control options may be selected via the flags argument. S_SAVEHDR write out article header S_OVWRITE overwrite the file if it already exists S_MAILFMT save in mail format S_NOSIGNAL block interrupts while saving The seek offset in the header's file pointer is preserved. This routine returns FAIL if the copy fails, otherwise TRUE or FALSE according to whether the file existed before the call. Presently, this code only knows about V7 and MMDF save formats. It depends on newsattr() to tell it which to use. The two symbols it checks are MAILFORMAT and MAILROUTING. BUGS Should use MAILCHAR to try and *deduce* the format of nonempty mailbox and save files. AUTHOR Eric S. Raymond This software is Copyright (C) 1989 by Eric S. Raymond for the sole purpose of protecting free redistribution; see the LICENSE file for details. *****************************************************************************/ /* LINTLIBRARY */ #include "news.h" #include "mailbox.h" #include "header.h" char *mailbox(mname) char *mname; { #ifdef USG (void) sprintf(bfr, "/usr/mail/%s", mname); #else /* !USG */ (void) sprintf(bfr, "/usr/spool/mail/%s", mname); #endif /* !USG */ return(bfr); } int saveto(fname, flags) register char *fname; /* file to save to */ int flags; /* append/overwrite, save header vs. article-only */ { FILE *ufp; long saveoffs; bool existed; static char *marktype = (char *)NULL; static bool domainist = FALSE; static bool v7mail = FALSE; existed = (access(fname, F_OK) == SUCCEED); if ((ufp = fopen(fname, (flags & S_OVWRITE) ? "w" : "a")) == (FILE *)NULL) return(FAIL); else if (header.h_fp == (FILE *)NULL) return(FAIL); else if (!(flags & S_OVWRITE)) /* Unisoft 5.1 won't seek to EOF on "a" */ (void) fseek(ufp, (off_t)0, SEEK_END); /* if first time through, compute our save format */ if ((flags & S_MAILFMT) && marktype == (char *)NULL) { marktype = newsattr("mailformat", MAILFMT); v7mail = strcmp(marktype, "MMDF"); domainist = strcmp(site.smarthost, ""); } /* generate the proper save header to go with the format */ if (flags & S_MAILFMT) { if (strcmp(marktype, "MMDF") && ftell(ufp) != (off_t)0) (void) fprintf(ufp, "\001\001\001\001\n"); else (void) fprintf(ufp, "From %s %s", domainist ? header.h_from : header.h_path, ctime(&header.h_posttime)); } /* maybe the header should be saved */ if (flags & S_SAVEHDR) hwrite(&header, ufp, TRUE); /* OK, tack on the body (uninterruptibly, if requested) */ saveoffs = ftell(header.h_fp); (void) fseek(header.h_fp, (off_t)header.h_textoff, SEEK_SET); while (fgets(bfr, sizeof(bfr), header.h_fp) != (char *)NULL) { if (sigcaught && !(flags & S_NOSIGNAL)) break; #ifdef MSEGMENT if (header.h_endoff != (off_t)0 && (header.h_endoff<ftell(header.h_fp)) break; #endif /* MSEGMENT */ if (flags & S_MAILFMT && v7mail) if (strncmp(bfr, "From ", 5) == 0) (void) putc('>', ufp); (void) fputs(bfr, ufp); } if (flags & S_MAILFMT && v7mail) (void) putc('\n', ufp); /* force blank line at end (ugh) */ (void) fflush(ufp); (void) fprintf(ufp, ((sigcaught && !(flags & S_NOSIGNAL)) ? "\n\n":"\n")); sigcaught = FALSE; (void) fclose(ufp); (void) fseek(header.h_fp, (off_t)saveoffs, SEEK_SET); return(existed); } /* mailbox.c ends here */