|
|
1.1 root 1: /*
2: * Functions for dealing with filesystem open object handles.
3: */
4: /*
5: *-IMPORTS:
6: * <common/ccompat.h>
7: * __USE_PROTO__
8: * __ARGS ()
9: * <sys/debug.h>
10: * ASSERT ()
11: * <sys/errno.h>
12: * EMFILE
13: * <string.h>
14: * NULL
15: * memcpy ()
16: */
17:
18: #include <common/ccompat.h>
19: #include <sys/debug.h>
20: #include <sys/errno.h>
21: #include <string.h>
22:
23: #include <kernel/fhsys.h>
24:
25:
26: /*
27: * About open file handles; pointers to objects of type "fhandle_t" are used
28: * in the kernel to represent information about abstract open file objects.
29: * The handles contain pointers to tables of entry points to dispatch abstract
30: * operations such as read and write to routines specific to the type of
31: * object that is referred to.
32: *
33: * Unlike the "vnode" VFS system used in System V and BSD Unix, this system
34: * follows the lead of the Sprite operating system in separating the functions
35: * of naming objects and providing the services specific to the different
36: * types of objects that may be named.
37: *
38: * Neither the internal structure of a handle nor the function dispatch table
39: * is available to implementations of file systems, so that file systems can
40: * be written with maximum binary portability.
41: */
42:
43:
44: /*
45: * "fdprocs" structures should be constructed by automated tools like the
46: * device configuration mechanism. As such, users do not get to deal with the
47: * definition of the structure that "fprocs_t" actually refers to.
48: */
49:
50: struct fprocs {
51: fh_open_t fh_open;
52: fh_close_t fh_close;
53: fh_read_t fh_read;
54: fh_write_t fh_write;
55: fh_ioctl_t fh_ioctl;
56: fh_poll_t fh_poll;
57: fh_lseek_t fh_lseek;
58: fh_sync_t fh_sync;
59: fh_getpmsg_t fh_getpmsg;
60: fh_putpmsg_t fh_putpmsg;
61: fh_fstat_t fh_fstat;
62: fh_statvfs_t fh_statvfs;
63: fh_mmap_t fh_mmap;
64: fh_attach_t fh_attach;
65: fh_detach_t fh_detach;
66: };
67:
68:
69: /*
70: * The definition of the body of the "fhandle_t" structure is also kept
71: * totally opaque for maximum binary compatibility between installable
72: * filesystems.
73: */
74:
75:
76: #define FHOPAQUESZ 32
77:
78: struct fhandle {
79: fprocs_t * fh_procs;
80: char fh_opaque [FHOPAQUESZ];
81: };
82:
83:
84: /*
85: * This function looks up a system file table entry based on the file
86: * descriptor number.
87: */
88:
89: #if __USE_PROTO__
90: sftab_t * (fd_get_sftab) (int fd)
91: #else
92: sftab_t *
93: fd_get_sftab __ARGS ((fd))
94: int fd;
95: #endif
96: {
97: return NULL;
98: }
99:
100:
101: /*
102: * This function looks up a file handle based on the file descriptor number.
103: */
104:
105: #if __USE_PROTO__
106: fhandle_t * (fd_get_handle) (int fd)
107: #else
108: fhandle_t *
109: fd_get_handle __ARGS ((fd))
110: int fd;
111: #endif
112: {
113: return NULL;
114: }
115:
116:
117: /*
118: * This function tries to add a file descriptor to the currently running
119: * process as a clone of some existing system file table entry. The file
120: * descriptor number assigned to the file is returned in the value pointed to
121: * by the "fdp" parameter.
122: *
123: * The file descriptor will be default be set to remain open across exec ()
124: * system calls.
125: *
126: * Returns 0 on success, or an error number on failure.
127: */
128:
129: #if __USE_PROTO__
130: int (fd_add_sftab) (sftab_t * sftabp, int * fdp)
131: #else
132: int
133: fd_add_sftab __ARGS ((sftabp, fdp))
134: sftab_t * sftabp;
135: int * fdp;
136: #endif
137: {
138: return EMFILE;
139: }
140:
141:
142: /*
143: * This function tests to see whether it is possible to add a new file entry
144: * to the current process (ie, it attempts to tell whether fd_add_sftab ()
145: * would fail with EMFILE).
146: *
147: * Reutrn 0 on success, or an error number on failure.
148: */
149:
150: #if __USE_PROTO__
151: int (fd_can_add) (void)
152: #else
153: int
154: fd_can_add __ARGS (())
155: #endif
156: {
157: return EMFILE;
158: }
159:
160:
161: /*
162: * This function returns a pointer to the "fprocs" structure member of a file
163: * handle.
164: */
165:
166: #if __USE_PROTO__
167: fprocs_t * (fh_procs) (fhandle_t * handle)
168: #else
169: fprocs_t *
170: fh_procs __ARGS ((handle))
171: fhandle_t * handle;
172: #endif
173: {
174: ASSERT (handle != NULL);
175: ASSERT (handle->fh_procs != NULL);
176:
177: return handle->fh_procs;
178: }
179:
180:
181: /*
182: * This function returns a pointer to the opaque part of the file handle.
183: */
184:
185: #if __USE_PROTO__
186: __VOID__ * (fh_get_cookie) (fhandle_t * handle)
187: #else
188: __VOID__ *
189: fh_get_cookie __ARGS ((handle))
190: fhandle_t * handle;
191: #endif
192: {
193: ASSERT (handle != NULL);
194:
195: return handle->fh_opaque;
196: }
197:
198:
199: /*
200: * This function accepts a pointer to a data area that will be copied into
201: * the file handle somehow. The only guarantee that is made by this function
202: * is that fh_get_cookie () will return a pointer to data that is identical
203: * in value to that passed to this function.
204: *
205: * This function returns 0 on success or non-zero on failure (such as being
206: * unable to allocate space for the cookie).
207: *
208: * May sleep.
209: */
210:
211: #if __USE_PROTO__
212: int (fh_set_cookie) (fhandle_t * handle, __VOID__ * cookie, size_t len)
213: #else
214: int
215: fh_set_cookie __ARGS ((handle, cookie, len))
216: fhandle_t * handle;
217: __VOID__ * cookie;
218: size_t len;
219: #endif
220: {
221: if (len > FHOPAQUESZ || cookie == NULL)
222: return -1;
223:
224: (void) memcpy (handle->fh_opaque, cookie, len);
225: return 0;
226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.