|
|
1.1 ! root 1: /* $Header: /kernel/kersrc/coh.286/RCS/fd.c,v 1.1 92/07/17 15:18:02 bin Exp Locker: bin $ */ ! 2: /* (lgl- ! 3: * The information contained herein is a trade secret of Mark Williams ! 4: * Company, and is confidential information. It is provided under a ! 5: * license agreement, and may be copied or disclosed only under the ! 6: * terms of that agreement. Any reproduction or disclosure of this ! 7: * material without the express written authorization of Mark Williams ! 8: * Company or persuant to the license agreement is unlawful. ! 9: * ! 10: * COHERENT Version 2.3.37 ! 11: * Copyright (c) 1982, 1983, 1984. ! 12: * An unpublished work by Mark Williams Company, Chicago. ! 13: * All rights reserved. ! 14: -lgl) */ ! 15: /* ! 16: * Coherent. ! 17: * File descriptor routines. ! 18: * ! 19: * $Log: fd.c,v $ ! 20: * Revision 1.1 92/07/17 15:18:02 bin ! 21: * Initial revision ! 22: * ! 23: * Revision 1.1 88/03/24 16:13:43 src ! 24: * Initial revision ! 25: * ! 26: */ ! 27: #include <sys/coherent.h> ! 28: #include <errno.h> ! 29: #include <sys/fd.h> ! 30: #include <sys/inode.h> ! 31: ! 32: /* ! 33: * Given a file number, return the file descriptor. ! 34: */ ! 35: FD * ! 36: fdget(fd) ! 37: register unsigned fd; ! 38: { ! 39: register FD *fdp; ! 40: ! 41: if (fd>=NUFILE || (fdp=u.u_filep[fd])==NULL) { ! 42: u.u_error = EBADF; ! 43: return (NULL); ! 44: } ! 45: return (fdp); ! 46: } ! 47: ! 48: /* ! 49: * Duplicate a file descriptor number. This has the same calling ! 50: * sequence as the dup2 system call and even uses the silly DUP2 bit. ! 51: */ ! 52: fddup(ofd, nfd) ! 53: register unsigned ofd; ! 54: register unsigned nfd; ! 55: { ! 56: register FD *fdp; ! 57: ! 58: if ((fdp=fdget(ofd&~DUP2)) == NULL) ! 59: return (-1); ! 60: if ((ofd&DUP2) != 0) { ! 61: if (nfd >= NUFILE) { ! 62: u.u_error = EBADF; ! 63: return (-1); ! 64: } ! 65: ofd &= ~DUP2; ! 66: if (ofd == nfd) ! 67: return (nfd); ! 68: if (u.u_filep[nfd] != NULL) { ! 69: fdclose(nfd); ! 70: if (u.u_error) ! 71: return (-1); ! 72: } ! 73: } else { ! 74: for (nfd=0; nfd<NUFILE; nfd++) ! 75: if (u.u_filep[nfd] == NULL) ! 76: break; ! 77: if (nfd == NUFILE) { ! 78: u.u_error = EMFILE; ! 79: return (-1); ! 80: } ! 81: } ! 82: u.u_filep[nfd] = fdp; ! 83: fdp->f_refc++; ! 84: return (nfd); ! 85: } ! 86: ! 87: /* ! 88: * Given an inode, and a mode containing permission flags, open the ! 89: * inode with the appropriate permissions and return a file descriptor ! 90: * containing it. ! 91: */ ! 92: fdopen(ip, mode) ! 93: register INODE *ip; ! 94: { ! 95: register FD **fdpp; ! 96: register FD *fdp; ! 97: ! 98: for (fdpp=u.u_filep; fdpp<&u.u_filep[NUFILE]; fdpp++) { ! 99: if (*fdpp != NULL) ! 100: continue; ! 101: if ((fdp=kalloc(sizeof(FD))) == NULL) ! 102: return (-1); ! 103: iopen(ip, mode); ! 104: if (u.u_error) { ! 105: kfree(fdp); ! 106: return (-1); ! 107: } ! 108: fdp->f_flag = mode; ! 109: fdp->f_refc = 1; ! 110: fdp->f_seek = 0; ! 111: fdp->f_ip = ip; ! 112: *fdpp = fdp; ! 113: return (fdpp-u.u_filep); ! 114: } ! 115: u.u_error = EMFILE; ! 116: return (-1); ! 117: } ! 118: ! 119: /* ! 120: * Close the given file number. ! 121: */ ! 122: fdclose(fd) ! 123: register unsigned fd; ! 124: { ! 125: register FD *fdp; ! 126: ! 127: if (fd>=NUFILE || (fdp=u.u_filep[fd])==NULL) { ! 128: u.u_error = EBADF; ! 129: return; ! 130: } ! 131: u.u_filep[fd] = NULL; ! 132: if (fdp->f_refc == 0) ! 133: panic("fdclose()"); ! 134: if (--fdp->f_refc == 0) { ! 135: iclose(fdp->f_ip); ! 136: kfree(fdp); ! 137: } ! 138: } ! 139: ! 140: /* ! 141: * Assuming we have made a copy of the user area, increment the reference ! 142: * of all open files. (used in fork). ! 143: */ ! 144: fdadupl() ! 145: { ! 146: register FD **fdpp; ! 147: register FD *fdp; ! 148: ! 149: for (fdpp=u.u_filep; fdpp<&u.u_filep[NUFILE]; fdpp++) { ! 150: if ((fdp=*fdpp) == NULL) ! 151: continue; ! 152: fdp->f_refc++; ! 153: } ! 154: } ! 155: ! 156: /* ! 157: * Close all open files in the current process. ! 158: */ ! 159: fdaclose() ! 160: { ! 161: register int fd; ! 162: ! 163: for (fd=0; fd<NUFILE; fd++) { ! 164: if (u.u_filep[fd] == NULL) ! 165: continue; ! 166: fdclose(fd); ! 167: } ! 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.