fix fcntl
[unix-history] / usr / src / sys / sys / file.h
index 3a3d494..9a04140 100644 (file)
-/*     file.h  4.1     %G%     */
+/*     file.h  6.2     83/09/23        */
 
 
+#ifdef KERNEL
 /*
 /*
- * One file structure is allocated
- * for each open/creat/pipe call.
- * Main use is to hold the read/write
- * pointer associated with each open
- * file.
+ * Descriptor table entry.
+ * One for each kernel object.
  */
  */
-struct file
-{
-       short   f_flag;
-       short   f_count;                /* reference count */
-       struct inode *f_inode;          /* pointer to inode structure */
-       union {
-               off_t   f_offset;       /* read/write character pointer */
-               struct chan *f_chan;    /* mpx channel pointer */
-       } f_un;
+struct file {
+       int     f_flag;         /* see below */
+       short   f_type;         /* descriptor type */
+       short   f_count;        /* reference count */
+       short   f_msgcount;     /* references from message queue */
+       struct  fileops {
+               int     (*fo_rw)();
+               int     (*fo_ioctl)();
+               int     (*fo_select)();
+               int     (*fo_close)();
+       } *f_ops;
+       caddr_t f_data;         /* inode */
+       off_t   f_offset;
 };
 
 };
 
-#ifdef KERNEL
-extern struct file file[];             /* the file table itself */
-
+struct file *file, *fileNFILE;
+int    nfile;
 struct file *getf();
 struct file *falloc();
 #endif
 
 struct file *getf();
 struct file *falloc();
 #endif
 
-/* flags */
-#define        FREAD   01
-#define        FWRITE  02
-#define        FPIPE   04
-#define        FMPX    010
-#define        FMPY    020
-#define        FMP     030
+/*
+ * flags- also for fcntl call.
+ */
+#define        FOPEN           (-1)
+#define        FREAD           00001           /* descriptor read/receive'able */
+#define        FWRITE          00002           /* descriptor write/send'able */
+#ifndef        F_DUPFD
+#define        FNDELAY         00004           /* no delay */
+#define        FAPPEND         00010           /* append on each write */
+#endif
+#define        FMARK           00020           /* mark during gc() */
+#define        FDEFER          00040           /* defer for next gc pass */
+#ifndef        F_DUPFD
+#define        FASYNC          00100           /* signal pgrp when data ready */
+#endif
+#define        FSHLOCK         00200           /* shared lock present */
+#define        FEXLOCK         00400           /* exclusive lock present */
+
+/* bits to save after open */
+#define        FMASK           00113
+#define        FCNTLCANT       (FREAD|FWRITE|FMARK|FDEFER|FSHLOCK|FEXLOCK)
+
+/* open only modes */
+#define        FCREAT          01000           /* create if nonexistant */
+#define        FTRUNC          02000           /* truncate to zero length */
+#define        FEXCL           04000           /* error if already created */
+
+#ifndef        F_DUPFD
+/* fcntl(2) requests--from <fcntl.h> */
+#define        F_DUPFD 0       /* Duplicate fildes */
+#define        F_GETFD 1       /* Get fildes flags */
+#define        F_SETFD 2       /* Set fildes flags */
+#define        F_GETFL 3       /* Get file flags */
+#define        F_SETFL 4       /* Set file flags */
+#define        F_GETOWN 5      /* Get owner */
+#define F_SETOWN 6     /* Set owner */
+#endif
+
+/*
+ * User definitions.
+ */
+
+/*
+ * Open call.
+ */
+#define        O_RDONLY        000             /* open for reading */
+#define        O_WRONLY        001             /* open for writing */
+#define        O_RDWR          002             /* open for read & write */
+#define        O_NDELAY        FNDELAY         /* non-blocking open */
+#define        O_APPEND        FAPPEND         /* append on each write */
+#define        O_CREAT         FCREAT          /* open with file create */
+#define        O_TRUNC         FTRUNC          /* open with truncation */
+#define        O_EXCL          FEXCL           /* error on create if file exists */
+
+/*
+ * Flock call.
+ */
+#define        LOCK_SH         1       /* shared lock */
+#define        LOCK_EX         2       /* exclusive lock */
+#define        LOCK_NB         4       /* don't block when locking */
+#define        LOCK_UN         8       /* unlock */
+
+/*
+ * Access call.
+ */
+#define        F_OK            0       /* does file exist */
+#define        X_OK            1       /* is it executable by caller */
+#define        W_OK            2       /* writable by caller */
+#define        R_OK            4       /* readable by caller */
+
+/*
+ * Lseek call.
+ */
+#define        L_SET           0       /* absolute offset */
+#define        L_INCR          1       /* relative to current offset */
+#define        L_XTND          2       /* relative to end of file */
+
+#ifdef KERNEL
+#define        GETF(fp, fd) { \
+       if ((unsigned)(fd) >= NOFILE || ((fp) = u.u_ofile[fd]) == NULL) { \
+               u.u_error = EBADF; \
+               return; \
+       } \
+}
+#define        DTYPE_INODE     1       /* file */
+#define        DTYPE_SOCKET    2       /* communications endpoint */
+#endif