diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /sys/fio/fgetfd.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'sys/fio/fgetfd.x')
-rw-r--r-- | sys/fio/fgetfd.x | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/sys/fio/fgetfd.x b/sys/fio/fgetfd.x new file mode 100644 index 00000000..7669421f --- /dev/null +++ b/sys/fio/fgetfd.x @@ -0,0 +1,135 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <syserr.h> +include <config.h> +include <fio.h> + +# FGETFD -- Allocate a file descriptor. Called by all OPEN routines. +# Search static part of file descriptor storage for an open file descriptor. +# Allocate memory for rest of file descriptor, initialize all fields. + +int procedure fgetfd (filename, mode, type) + +char filename[ARB] # name of file to be assigned a descriptor +int mode # access mode +int type # file type + +int fd +int fsetfd() +include <fio.com> + +begin + for (fd=FIRST_FD; fd <= LAST_FD && fiodes[fd] != NULL; fd=fd+1) + ; + if (fd > LAST_FD) # out of descriptors + call syserr (SYS_FTOOMANYFILES) + + return (fsetfd (fd, filename, mode, type)) +end + + +# FSETFD -- Initialize the file descriptor FD. + +int procedure fsetfd (fd, filename, mode, type) + +int fd # fd to be initialized +char filename[ARB] # name of file to be assigned to FD +int mode # access mode +int type # file type + +int or() +errchk calloc, filerr, syserr +include <fio.com> +include "mmap.inc" + +begin + # Allocate descriptor. + call calloc (fp, LEN_FIODES, TY_STRUCT) + + iop[fd] = NULL + itop[fd] = NULL + otop[fd] = NULL + bufptr[fd] = NULL + buftop[fd] = NULL + boffset[fd] = 1 + redir_fd[fd] = NULL + fflags[fd] = 0 + fiodes[fd] = fp # set ptr to fildes + FCD(fp) = FLCD(fp) # set ptr to chandes + + # Set the file permission bits for the given mode. Note that read + # permission is required in append mode on a binary file since the + # partial block at the end of the file has to be read in before we + # can append to it. + + switch (mode) { + case STRING_FILE, SPOOL_FILE: + # (neither read or write perm, disable flushnl) + case READ_ONLY: + fflags[fd] = FF_READ + FILSIZE(fp) = -1 # file size unknown + case WRITE_ONLY: + fflags[fd] = FF_WRITE + FILSIZE(fp) = -1 # file size unknown + case READ_WRITE, APPEND: + fflags[fd] = FF_READ + FF_WRITE + FILSIZE(fp) = -1 + case NEW_FILE, TEMP_FILE: + if (type == STATIC_FILE) { + fiodes[fd] = NULL + call mfree (fp, TY_STRUCT) + call filerr (filename, SYS_FSFOPNF) + } + fflags[fd] = FF_READ + FF_WRITE + FILSIZE(fp) = 0 # zero length file + default: + fiodes[fd] = NULL + call mfree (fp, TY_STRUCT) + call filerr (filename, SYS_FILLEGMODE) + } + + switch (type) { + case STRING_FILE, SPOOL_FILE: + # Allocate an (improper) device for string "files". Since there + # is no channel for a string file, any improper i/o on a string + # file will result in an error return. + + FDEV(fp) = TX_DRIVER + + # Spool files have all read and write permissions turned off + # so that they never try to write to a device driver - the file + # consists of only the buffered data. Spool files are considered + # to be streaming binary files, so also set the blk size to 0. + + if (type == SPOOL_FILE) { + fflags[fd] = 0 + FBLKSIZE(fp) = 0 + } + + case TEXT_FILE: + fflags[fd] = or (FF_FLUSH, fflags[fd]) + FDEV(fp) = TX_DRIVER + case BINARY_FILE: + FDEV(fp) = BF_DRIVER + case STATIC_FILE: + FDEV(fp) = SF_DRIVER + default: + fiodes[fd] = NULL + call mfree (fp, TY_STRUCT) + call filerr (filename, SYS_FILLEGTYPE) + } + + # A static file is equivalent to a binary file at the VOS level. + FMODE(fp) = mmap[mode] + if (type == STATIC_FILE) + FTYPE(fp) = BINARY_FILE + else + FTYPE(fp) = type + + FCHAN(fp) = -1 + FNBUFS(fp) = 1 + FREFCNT(fp) = 1 # no. fd active on chan + call strcpy (filename, FNAME(fp), SZ_FFNAME) + + return (fd) +end |