1 1.26 isaki /* $NetBSD: open.c,v 1.26 2007/11/24 13:20:56 isaki Exp $ */ 2 1.5 cgd 3 1.1 brezak /*- 4 1.1 brezak * Copyright (c) 1993 5 1.1 brezak * The Regents of the University of California. All rights reserved. 6 1.1 brezak * 7 1.1 brezak * This code is derived from software contributed to Berkeley by 8 1.1 brezak * The Mach Operating System project at Carnegie-Mellon University. 9 1.1 brezak * 10 1.1 brezak * Redistribution and use in source and binary forms, with or without 11 1.1 brezak * modification, are permitted provided that the following conditions 12 1.1 brezak * are met: 13 1.1 brezak * 1. Redistributions of source code must retain the above copyright 14 1.1 brezak * notice, this list of conditions and the following disclaimer. 15 1.1 brezak * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 brezak * notice, this list of conditions and the following disclaimer in the 17 1.1 brezak * documentation and/or other materials provided with the distribution. 18 1.23 agc * 3. Neither the name of the University nor the names of its contributors 19 1.1 brezak * may be used to endorse or promote products derived from this software 20 1.1 brezak * without specific prior written permission. 21 1.1 brezak * 22 1.1 brezak * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 1.1 brezak * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 1.1 brezak * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 1.1 brezak * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 1.1 brezak * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 1.1 brezak * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 1.1 brezak * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 1.1 brezak * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 1.1 brezak * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 1.1 brezak * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 1.1 brezak * SUCH DAMAGE. 33 1.1 brezak * 34 1.5 cgd * @(#)open.c 8.1 (Berkeley) 6/11/93 35 1.24 perry * 36 1.1 brezak * 37 1.1 brezak * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University 38 1.1 brezak * All Rights Reserved. 39 1.1 brezak * 40 1.1 brezak * Author: Alessandro Forin 41 1.24 perry * 42 1.1 brezak * Permission to use, copy, modify and distribute this software and its 43 1.1 brezak * documentation is hereby granted, provided that both the copyright 44 1.1 brezak * notice and this permission notice appear in all copies of the 45 1.1 brezak * software, derivative works or modified versions, and any portions 46 1.1 brezak * thereof, and that both notices appear in supporting documentation. 47 1.24 perry * 48 1.1 brezak * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 49 1.1 brezak * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 50 1.1 brezak * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 51 1.24 perry * 52 1.1 brezak * Carnegie Mellon requests users of this software to return to 53 1.24 perry * 54 1.1 brezak * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU 55 1.1 brezak * School of Computer Science 56 1.1 brezak * Carnegie Mellon University 57 1.1 brezak * Pittsburgh PA 15213-3890 58 1.24 perry * 59 1.1 brezak * any improvements or extensions that they make and grant Carnegie the 60 1.1 brezak * rights to redistribute these changes. 61 1.1 brezak */ 62 1.1 brezak 63 1.1 brezak #include "stand.h" 64 1.1 brezak 65 1.1 brezak /* 66 1.1 brezak * File primitives proper 67 1.1 brezak */ 68 1.17 ross 69 1.17 ross #ifdef HELLO_CTAGS 70 1.17 ross oopen(){} 71 1.17 ross #endif 72 1.1 brezak 73 1.3 brezak int 74 1.14 cgd #ifndef __INTERNAL_LIBSA_CREAD 75 1.26 isaki open(const char *fname, int mode) 76 1.14 cgd #else 77 1.26 isaki oopen(const char *fname, int mode) 78 1.14 cgd #endif 79 1.1 brezak { 80 1.20 augustss struct open_file *f; 81 1.20 augustss int fd, error; 82 1.19 cgd #if !defined(LIBSA_SINGLE_FILESYSTEM) 83 1.20 augustss int i, besterror; 84 1.19 cgd #endif 85 1.1 brezak char *file; 86 1.1 brezak 87 1.1 brezak /* find a free file descriptor */ 88 1.1 brezak for (fd = 0, f = files; fd < SOPEN_MAX; fd++, f++) 89 1.1 brezak if (f->f_flags == 0) 90 1.1 brezak goto fnd; 91 1.2 pk errno = EMFILE; 92 1.26 isaki return -1; 93 1.1 brezak fnd: 94 1.1 brezak /* 95 1.1 brezak * Try to open the device. 96 1.1 brezak * Convert open mode (0,1,2) to F_READ, F_WRITE. 97 1.1 brezak */ 98 1.1 brezak f->f_flags = mode + 1; 99 1.19 cgd #if !defined(LIBSA_SINGLE_DEVICE) 100 1.1 brezak f->f_dev = (struct devsw *)0; 101 1.19 cgd #endif 102 1.19 cgd #if !defined(LIBSA_SINGLE_FILESYSTEM) 103 1.7 pk f->f_ops = (struct fs_ops *)0; 104 1.19 cgd #endif 105 1.19 cgd #if !defined(LIBSA_NO_RAW_ACCESS) 106 1.16 pk f->f_offset = 0; 107 1.19 cgd #endif 108 1.1 brezak file = (char *)0; 109 1.1 brezak error = devopen(f, fname, &file); 110 1.19 cgd if (error 111 1.19 cgd #if !defined(LIBSA_SINGLE_DEVICE) 112 1.19 cgd || (((f->f_flags & F_NODEV) == 0) && 113 1.19 cgd f->f_dev == (struct devsw *)0) 114 1.19 cgd #endif 115 1.19 cgd ) 116 1.1 brezak goto err; 117 1.1 brezak 118 1.19 cgd #if !defined(LIBSA_NO_RAW_ACCESS) 119 1.1 brezak /* see if we opened a raw device; otherwise, 'file' is the file name. */ 120 1.9 thorpej if (file == (char *)0 || *file == '\0') { 121 1.1 brezak f->f_flags |= F_RAW; 122 1.26 isaki return fd; 123 1.1 brezak } 124 1.19 cgd #endif 125 1.1 brezak 126 1.1 brezak /* pass file name to the different filesystem open routines */ 127 1.19 cgd #if !defined(LIBSA_SINGLE_FILESYSTEM) 128 1.15 cgd besterror = ENOENT; 129 1.3 brezak for (i = 0; i < nfsys; i++) { 130 1.19 cgd error = FS_OPEN(&file_system[i])(file, f); 131 1.1 brezak if (error == 0) { 132 1.1 brezak f->f_ops = &file_system[i]; 133 1.26 isaki return fd; 134 1.1 brezak } 135 1.15 cgd if (error != EINVAL) 136 1.15 cgd besterror = error; 137 1.1 brezak } 138 1.15 cgd error = besterror; 139 1.19 cgd #else 140 1.19 cgd error = FS_OPEN(&file_system[i])(file, f); 141 1.19 cgd if (error == 0) 142 1.26 isaki return fd; 143 1.22 dsl if (error == EINVAL) 144 1.19 cgd error = ENOENT; 145 1.19 cgd #endif 146 1.1 brezak 147 1.22 dsl if ((f->f_flags & F_NODEV) == 0) { 148 1.19 cgd #if !defined(LIBSA_SINGLE_DEVICE) 149 1.19 cgd if (DEV_CLOSE(f->f_dev) != NULL) 150 1.19 cgd #endif 151 1.19 cgd (void)DEV_CLOSE(f->f_dev)(f); 152 1.22 dsl } 153 1.1 brezak err: 154 1.4 pk f->f_flags = 0; 155 1.1 brezak errno = error; 156 1.26 isaki return -1; 157 1.1 brezak } 158