- * 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;
- struct stat statb;
- char tempname[30];
- int (*sigs[3])();
-
- if (readonly)
- return;
- sigsave(sigs, SIG_IGN);
- 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++;
- break;
- }
- }
- if (!gotcha)
- goto done;
- ibuf = NULL;
- if (stat(editfile, &statb) >= 0 && statb.st_size > mailsize) {
- strcpy(tempname, "/tmp/mboxXXXXXX");
- mktemp(tempname);
- if ((obuf = fopen(tempname, "w")) == NULL) {
- perror(tempname);
- sigret(sigs);
- reset(0);
- }
- if ((ibuf = fopen(editfile, "r")) == NULL) {
- perror(editfile);
- fclose(obuf);
- remove(tempname);
- sigret(sigs);
- reset(0);
- }
- while ((c = getc(ibuf)) != EOF)
- putc(c, obuf);
- fclose(ibuf);
- fclose(obuf);
- if ((ibuf = fopen(tempname, "r")) == NULL) {
- perror(tempname);
- remove(tempname);
- sigret(sigs);
- reset(0);
- }
- remove(tempname);
- }
- printf("\"%s\" ", editfile);
- flush();
- if ((obuf = fopen(editfile, "w")) == NULL) {
- perror(editfile);
- sigret(sigs);
- reset(0);
- }
- c = 0;
- for (mp = &message[0]; mp < &message[msgCount]; mp++) {
- if ((mp->m_flag & MDELETED) != 0)
- continue;
- c++;
- if (send(mp, obuf) < 0) {
- perror(editfile);
- sigret(sigs);
- 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(editfile);
- sigret(sigs);
- reset(0);
- }
- fclose(obuf);
- if (gotcha) {
- remove(editfile);
- printf("removed\n");
- }
- else
- printf("complete\n");
- flush();
-
-done:
- sigret(sigs);
-}
-
-/*
- * Save signals SIGHUP - SIGQUIT in sigs, set them all to action.