|
|
1.1 root 1: /*
2: * Miscellaneous routines and data for Linux emulation.
3: *
4: * Copyright (C) 1996 The University of Utah and the Computer Systems
5: * Laboratory at the University of Utah (CSL)
6: *
7: * This program is free software; you can redistribute it and/or modify
8: * it under the terms of the GNU General Public License as published by
9: * the Free Software Foundation; either version 2, or (at your option)
10: * any later version.
11: *
12: * This program is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: * GNU General Public License for more details.
16: *
17: * You should have received a copy of the GNU General Public License
18: * along with this program; if not, write to the Free Software
19: * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20: *
21: * Author: Shantanu Goel, University of Utah CSL
22: */
23:
24: /*
25: * linux/fs/proc/scsi.c
26: * (c) 1995 Michael Neuffer [email protected]
27: *
28: * The original version was derived from linux/fs/proc/net.c,
29: * which is Copyright (C) 1991, 1992 Linus Torvalds.
30: * Much has been rewritten, but some of the code still remains.
31: *
32: * /proc/scsi directory handling functions
33: *
34: * last change: 95/07/04
35: *
36: * Initial version: March '95
37: * 95/05/15 Added subdirectories for each driver and show every
38: * registered HBA as a single file.
39: * 95/05/30 Added rudimentary write support for parameter passing
40: * 95/07/04 Fixed bugs in directory handling
41: * 95/09/13 Update to support the new proc-dir tree
42: *
43: * TODO: Improve support to write to the driver files
44: * Add some more comments
45: */
46:
47: /*
48: * linux/fs/buffer.c
49: *
50: * Copyright (C) 1991, 1992 Linus Torvalds
51: */
52:
53: #include <sys/types.h>
54: #include <mach/vm_param.h>
55: #include <kern/thread.h>
56: #include <vm/vm_map.h>
57: #include <vm/vm_page.h>
58: #include <device/device_types.h>
59: #include <i386at/gpl/linux/linux_emul.h>
60:
61: #define MACH_INCLUDE
62: #include <linux/errno.h>
63: #include <linux/mm.h>
64: #include <linux/fs.h>
65: #include <linux/blk.h>
66: #include <linux/proc_fs.h>
67: #include <linux/kernel_stat.h>
68:
69: int (*dispatch_scsi_info_ptr) (int ino, char *buffer, char **start,
70: off_t offset, int length, int inout) = 0;
71:
72: struct kernel_stat kstat;
73:
74: int
75: linux_to_mach_error (int err)
76: {
77: switch (err)
78: {
79: case 0:
80: return D_SUCCESS;
81:
82: case -LINUX_EPERM:
83: return D_INVALID_OPERATION;
84:
85: case -LINUX_EIO:
86: return D_IO_ERROR;
87:
88: case -LINUX_ENXIO:
89: return D_NO_SUCH_DEVICE;
90:
91: case -LINUX_EACCES:
92: return D_INVALID_OPERATION;
93:
94: case -LINUX_EFAULT:
95: return D_INVALID_SIZE;
96:
97: case -LINUX_EBUSY:
98: return D_ALREADY_OPEN;
99:
100: case -LINUX_EINVAL:
101: return D_INVALID_SIZE;
102:
103: case -LINUX_EROFS:
104: return D_READ_ONLY;
105:
106: case -LINUX_EWOULDBLOCK:
107: return D_WOULD_BLOCK;
108:
109: default:
110: printf ("linux_to_mach_error: unknown code %d\n", err);
111: return D_IO_ERROR;
112: }
113: }
114:
115: int
116: issig ()
117: {
118: return current_thread ()->wait_result != THREAD_AWAKENED;
119: }
120:
121: int
122: block_fsync (struct inode *inode, struct file *filp)
123: {
124: return 0;
125: }
126:
127: int
128: verify_area (int rw, const void *p, unsigned long size)
129: {
130: vm_prot_t prot = (rw == VERIFY_WRITE) ? VM_PROT_WRITE : VM_PROT_READ;
131: vm_offset_t addr = trunc_page ((vm_offset_t) p);
132: vm_size_t len = round_page ((vm_size_t) size);
133: vm_map_entry_t entry;
134:
135: vm_map_lock_read (current_map ());
136:
137: while (1)
138: {
139: if (! vm_map_lookup_entry (current_map (), addr, &entry)
140: || (entry->protection & prot) != prot)
141: {
142: vm_map_unlock_read (current_map ());
143: return -LINUX_EFAULT;
144: }
145: if (entry->vme_end - entry->vme_start >= len)
146: break;
147: len -= entry->vme_end - entry->vme_start;
148: addr += entry->vme_end - entry->vme_start;
149: }
150:
151: vm_map_unlock_read (current_map ());
152: return 0;
153: }
154:
155: /*
156: * Print device name (in decimal, hexadecimal or symbolic) -
157: * at present hexadecimal only.
158: * Note: returns pointer to static data!
159: */
160: char *
161: kdevname(kdev_t dev)
162: {
163: static char buffer[32];
164: sprintf(buffer, "%02x:%02x", MAJOR(dev), MINOR(dev));
165: return buffer;
166: }
167:
168: /* RO fail safe mechanism */
169:
170: static long ro_bits[MAX_BLKDEV][8];
171:
172: int
173: is_read_only(kdev_t dev)
174: {
175: int minor,major;
176:
177: major = MAJOR(dev);
178: minor = MINOR(dev);
179: if (major < 0 || major >= MAX_BLKDEV) return 0;
180: return ro_bits[major][minor >> 5] & (1 << (minor & 31));
181: }
182:
183: void
184: set_device_ro(kdev_t dev,int flag)
185: {
186: int minor,major;
187:
188: major = MAJOR(dev);
189: minor = MINOR(dev);
190: if (major < 0 || major >= MAX_BLKDEV) return;
191: if (flag) ro_bits[major][minor >> 5] |= 1 << (minor & 31);
192: else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));
193: }
194:
195: /*
196: * linux/lib/string.c
197: *
198: * Copyright (C) 1991, 1992 Linus Torvalds
199: */
200:
201: /*
202: * stupid library routines.. The optimized versions should generally be found
203: * as inline code in <asm-xx/string.h>
204: *
205: * These are buggy as well..
206: */
207:
208: #include <linux/types.h>
209: #include <linux/string.h>
210:
211: char * ___strtok = NULL;
212:
213: #ifndef __HAVE_ARCH_STRSPN
214: size_t strspn(const char *s, const char *accept)
215: {
216: const char *p;
217: const char *a;
218: size_t count = 0;
219:
220: for (p = s; *p != '\0'; ++p) {
221: for (a = accept; *a != '\0'; ++a) {
222: if (*p == *a)
223: break;
224: }
225: if (*a == '\0')
226: return count;
227: ++count;
228: }
229:
230: return count;
231: }
232: #endif
233:
234: #ifndef __HAVE_ARCH_STRPBRK
235: char * strpbrk(const char * cs,const char * ct)
236: {
237: const char *sc1,*sc2;
238:
239: for( sc1 = cs; *sc1 != '\0'; ++sc1) {
240: for( sc2 = ct; *sc2 != '\0'; ++sc2) {
241: if (*sc1 == *sc2)
242: return (char *) sc1;
243: }
244: }
245: return NULL;
246: }
247: #endif
248:
249: #ifndef __HAVE_ARCH_STRTOK
250: char * strtok(char * s,const char * ct)
251: {
252: char *sbegin, *send;
253:
254: sbegin = s ? s : ___strtok;
255: if (!sbegin) {
256: return NULL;
257: }
258: sbegin += strspn(sbegin,ct);
259: if (*sbegin == '\0') {
260: ___strtok = NULL;
261: return( NULL );
262: }
263: send = strpbrk( sbegin, ct);
264: if (send && *send != '\0')
265: *send++ = '\0';
266: ___strtok = send;
267: return (sbegin);
268: }
269: #endif
270:
271: struct proc_dir_entry proc_scsi;
272: struct inode_operations proc_scsi_inode_operations;
273: struct proc_dir_entry proc_net;
274: struct inode_operations proc_net_inode_operations;
275:
276: int
277: proc_register (struct proc_dir_entry *xxx1, struct proc_dir_entry *xxx2)
278: {
279: return 0;
280: }
281:
282: int
283: proc_unregister (struct proc_dir_entry *xxx1, int xxx2)
284: {
285: return 0;
286: }
287:
288: void
289: add_blkdev_randomness (int major)
290: {
291: }
292:
293: void
294: do_gettimeofday (struct timeval *tv)
295: {
296: host_get_time (1, tv);
297: }
298:
299: int
300: dev_get_info (char *buffer, char **start, off_t offset, int length, int dummy)
301: {
302: return 0;
303: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.