|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 3091 (0xc13) Types: TextFile Notes: UNIX file Names: »fd.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦2d53db1df⟧ UNIX Filesystem └─ ⟦this⟧ »sys/coh/fd.c«
/* (-lgl * The information contained herein is a trade secret of Mark Williams * Company, and is confidential information. It is provided under a * license agreement, and may be copied or disclosed only under the * terms of that agreement. Any reproduction or disclosure of this * material without the express written authorization of Mark Williams * Company or persuant to the license agreement is unlawful. * * COHERENT Version 0.7.3 * Copyright (c) 1982, 1983, 1984. * An unpublished work by Mark Williams Company, Chicago. * All rights reserved. -lgl) */ /* * Coherent. * File descriptor routines. */ #include <coherent.h> #include <errno.h> #include <fd.h> #include <inode.h> #include <uproc.h> /* * Given a file number, return the file descriptor. */ FD * fdget(fd) register unsigned fd; { register FD *fdp; if (fd>=NUFILE || (fdp=u.u_filep[fd])==NULL) { u.u_error = EBADF; return (NULL); } return (fdp); } /* * Duplicate a file descriptor number. This has the same calling * sequence as the dup2 system call and even uses the silly DUP2 bit. */ fddup(ofd, nfd) register unsigned ofd; register unsigned nfd; { register FD *fdp; if ((fdp=fdget(ofd&~DUP2)) == NULL) return (-1); if ((ofd&DUP2) != 0) { if (nfd >= NUFILE) { u.u_error = EBADF; return (-1); } ofd &= ~DUP2; if (ofd == nfd) return (nfd); if (u.u_filep[nfd] != NULL) { fdclose(nfd); if (u.u_error) return (-1); } } else { for (nfd=0; nfd<NUFILE; nfd++) if (u.u_filep[nfd] == NULL) break; if (nfd == NUFILE) { u.u_error = EMFILE; return (-1); } } u.u_filep[nfd] = fdp; fdp->f_refc++; return (nfd); } /* * Given an inode, and a mode containing permission flags, open the * inode with the appropriate permissions and return a file descriptor * containing it. */ fdopen(ip, mode) register INODE *ip; { register FD **fdpp; register FD *fdp; for (fdpp=u.u_filep; fdpp<&u.u_filep[NUFILE]; fdpp++) { if (*fdpp != NULL) continue; if ((fdp=kalloc(sizeof(FD))) == NULL) return (-1); iopen(ip, mode); if (u.u_error) { kfree(fdp); return (-1); } fdp->f_flag = mode; fdp->f_refc = 1; fdp->f_seek = 0; fdp->f_ip = ip; *fdpp = fdp; return (fdpp-u.u_filep); } u.u_error = EMFILE; return (-1); } /* * Close the given file number. */ fdclose(fd) register unsigned fd; { register FD *fdp; if (fd>=NUFILE || (fdp=u.u_filep[fd])==NULL) { u.u_error = EBADF; return; } u.u_filep[fd] = NULL; if (fdp->f_refc == 0) panic("fdclose()"); if (--fdp->f_refc == 0) { iclose(fdp->f_ip); kfree(fdp); } } /* * Assuming we have made a copy of the user area, increment the reference * of all open files. (used in fork). */ fdadupl() { register FD **fdpp; register FD *fdp; for (fdpp=u.u_filep; fdpp<&u.u_filep[NUFILE]; fdpp++) { if ((fdp=*fdpp) == NULL) continue; fdp->f_refc++; } } /* * Close all open files in the current process. */ fdaclose() { register int fd; for (fd=0; fd<NUFILE; fd++) { if (u.u_filep[fd] == NULL) continue; fdclose(fd); } }