|
|
1.1 ! root 1: #ident "@(#)myfopen.c 1.3 'attmail mail(1) command'" ! 2: #ident "@(#)mailx:myfopen.c 1.1" ! 3: /* Copyright (c) 1988 AT&T */ ! 4: /* All Rights Reserved */ ! 5: ! 6: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ ! 7: /* The copyright notice above does not evidence any */ ! 8: /* actual or intended publication of such source code. */ ! 9: ! 10: #ident "@(#)mailx:myfopen.c 1.0" ! 11: ! 12: #include "rcv.h" ! 13: ! 14: #undef fopen ! 15: #undef fclose ! 16: ! 17: /* ! 18: * mailx -- a modified version of a University of California at Berkeley ! 19: * mail program ! 20: * ! 21: * Local version of fopen() and fclose(). These maintain a list of ! 22: * file pointers which can be run down when we need to close ! 23: * all files, such as before executing external commands. ! 24: */ ! 25: ! 26: static NODE *append(); ! 27: static NODE *del1(); ! 28: static NODE *getnode(); ! 29: static NODE *search(); ! 30: ! 31: static NODE * ! 32: getnode(fp) ! 33: FILE *fp; ! 34: { ! 35: NODE *new; ! 36: ! 37: if ((new = (NODE *)malloc(sizeof(NODE))) == (NODE *)NULL) { ! 38: (void) fputs("Cannot allocate node space\n", stderr); ! 39: exit(3); ! 40: } ! 41: new->fp = fp; ! 42: new->next = (NODE *)NULL; ! 43: return(new); ! 44: } ! 45: ! 46: static NODE * ! 47: search(fp) ! 48: FILE *fp; ! 49: { ! 50: register NODE *tmp; ! 51: ! 52: for (tmp = fplist; tmp != (NODE *)NULL; tmp = tmp->next) ! 53: if (tmp->fp == fp) ! 54: break; ! 55: return( tmp != (NODE *)NULL ? tmp : NOFP); ! 56: } ! 57: ! 58: static NODE * ! 59: append(fp) ! 60: FILE *fp; ! 61: { ! 62: register NODE *new; ! 63: ! 64: if ((new = getnode(fp)) == (NODE *)NULL) ! 65: return(NOFP); ! 66: if (fplist == NOFP) { ! 67: fplist = new; ! 68: } else { ! 69: new->next = curptr->next; ! 70: curptr->next = new; ! 71: } ! 72: return(new); ! 73: } ! 74: ! 75: static NODE * ! 76: del1(oldcur) ! 77: NODE *oldcur; ! 78: { ! 79: register NODE *cur, *prev; ! 80: ! 81: for (prev = cur = fplist; cur != (NODE *)NULL; cur = cur->next) { ! 82: if (cur == oldcur) { ! 83: if (cur == fplist) { ! 84: cur = fplist = cur->next; ! 85: } else { ! 86: prev->next = cur->next; ! 87: cur = prev->next ? prev->next : prev; ! 88: } ! 89: free(oldcur); ! 90: break; ! 91: } ! 92: prev = cur; ! 93: } ! 94: return(cur); ! 95: } ! 96: ! 97: FILE * ! 98: my_fopen(file, mode) ! 99: char *file, *mode; ! 100: { ! 101: FILE *fp; ! 102: ! 103: if ((fp = fopen(file, mode)) == (FILE *)NULL) { ! 104: fplist = NOFP; ! 105: return(fp); ! 106: } else { ! 107: curptr = append(fp); ! 108: } ! 109: return(fp); ! 110: } ! 111: ! 112: int ! 113: my_fclose(iop) ! 114: register FILE *iop; ! 115: { ! 116: register NODE *cur; ! 117: ! 118: int ret = fclose(iop); ! 119: if (fplist != NOFP) { ! 120: cur = search(iop); ! 121: cur = del1(cur); ! 122: } ! 123: return ret; ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.