cee4218582ab3f25f115a7b5f3e696843cd74f05
* Copyright (c) 1993 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* The Mach Operating System project at Carnegie-Mellon University.
* %sccs.include.redist.c%
* @(#)open.c 7.1 (Berkeley) %G%
* Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
* Author: Alessandro Forin
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
* Carnegie Mellon requests users of this software to return to
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
struct fs_ops file_system
[] = {
{ ufs_open
, ufs_close
, ufs_read
, ufs_write
, ufs_seek
, ufs_stat
}
#define NFSYS (sizeof(file_system) / sizeof(struct fs_ops))
struct open_file files
[SOPEN_MAX
];
register struct open_file
*f
;
register int fd
, i
, error
;
/* find a free file descriptor */
for (fd
= 0, f
= files
; fd
< SOPEN_MAX
; fd
++, f
++)
* Try to open the device.
* Convert open mode (0,1,2) to F_READ, F_WRITE.
f
->f_dev
= (struct devsw
*)0;
error
= devopen(f
, fname
, &file
);
if (error
|| f
->f_dev
== (struct devsw
*)0)
/* see if we opened a raw device; otherwise, 'file' is the file name. */
/* pass file name to the different filesystem open routines */
for (i
= 0; i
< NFSYS
; i
++) {
/* convert mode (0,1,2) to FREAD, FWRITE. */
error
= (file_system
[i
].open
)(file
, f
);
f
->f_ops
= &file_system
[i
];