add ftw
[unix-history] / usr / src / lib / libc / stdio / fdopen.c
index 0332daa..0782f3b 100644 (file)
@@ -1,31 +1,62 @@
-/* @(#)fdopen.c        4.1 (Berkeley) %G% */
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)fdopen.c   5.2 (Berkeley) %G%";
+#endif LIBC_SCCS and not lint
+
 /*
  * Unix routine to do an "fopen" on file descriptor
  * The mode has to be repeated because you can't query its
  * status
  */
 
 /*
  * Unix routine to do an "fopen" on file descriptor
  * The mode has to be repeated because you can't query its
  * status
  */
 
-#include       <stdio.h>
-#include       <errno.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <stdio.h>
 
 FILE *
 fdopen(fd, mode)
 
 FILE *
 fdopen(fd, mode)
-register char *mode;
+       register char *mode;
 {
 {
-       extern int errno;
+       extern FILE *_findiop();
+       static int nofile = -1;
        register FILE *iop;
        register FILE *iop;
-       extern FILE *_lastbuf;
 
 
-       for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
-               if (iop >= _lastbuf)
-                       return(NULL);
+       if (nofile < 0)
+               nofile = getdtablesize();
+
+       if (fd < 0 || fd >= nofile)
+               return (NULL);
+
+       iop = _findiop();
+       if (iop == NULL)
+               return (NULL);
+
        iop->_cnt = 0;
        iop->_file = fd;
        iop->_cnt = 0;
        iop->_file = fd;
-       if (*mode != 'r') {
-               iop->_flag |= _IOWRT;
-               if (*mode == 'a')
-                       lseek(fd, 0L, 2);
-       } else
-               iop->_flag |= _IOREAD;
-       return(iop);
+       iop->_bufsiz = 0;
+       iop->_base = iop->_ptr = NULL;
+
+       switch (*mode) {
+       case 'r':
+               iop->_flag = _IOREAD;
+               break;
+       case 'a':
+               lseek(fd, (off_t)0, L_XTND);
+               /* fall into ... */
+       case 'w':
+               iop->_flag = _IOWRT;
+               break;
+       default:
+               return (NULL);
+       }
+
+       if (mode[1] == '+')
+               iop->_flag = _IORW;
+
+       return (iop);
 }
 }