|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #if defined(LIBC_SCCS) && !defined(lint)
8: static char sccsid[] = "@(#)fdopen.c 5.2 (Berkeley) 3/9/86";
9: #endif LIBC_SCCS and not lint
10:
11: /*
12: * Unix routine to do an "fopen" on file descriptor
13: * The mode has to be repeated because you can't query its
14: * status
15: */
16:
17: #include <sys/types.h>
18: #include <sys/file.h>
19: #include <stdio.h>
20:
21: FILE *
22: fdopen(fd, mode)
23: register char *mode;
24: {
25: extern FILE *_findiop();
26: static int nofile = -1;
27: register FILE *iop;
28:
29: if (nofile < 0)
30: nofile = getdtablesize();
31:
32: if (fd < 0 || fd >= nofile)
33: return (NULL);
34:
35: iop = _findiop();
36: if (iop == NULL)
37: return (NULL);
38:
39: iop->_cnt = 0;
40: iop->_file = fd;
41: iop->_bufsiz = 0;
42: iop->_base = iop->_ptr = NULL;
43:
44: switch (*mode) {
45: case 'r':
46: iop->_flag = _IOREAD;
47: break;
48: case 'a':
49: lseek(fd, (off_t)0, L_XTND);
50: /* fall into ... */
51: case 'w':
52: iop->_flag = _IOWRT;
53: break;
54: default:
55: return (NULL);
56: }
57:
58: if (mode[1] == '+')
59: iop->_flag = _IORW;
60:
61: return (iop);
62: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.