|
|
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: ! 60: #define MACH_INCLUDE ! 61: #include <linux/types.h> ! 62: #include <linux/config.h> ! 63: #include <linux/errno.h> ! 64: #include <linux/mm.h> ! 65: #include <linux/fs.h> ! 66: #include <linux/blk.h> ! 67: #include <linux/proc_fs.h> ! 68: #include <linux/kernel_stat.h> ! 69: ! 70: extern boolean_t vm_map_lookup_entry (register vm_map_t, register vm_offset_t, ! 71: vm_map_entry_t *); ! 72: extern int printf (const char *, ...); ! 73: ! 74: int (*dispatch_scsi_info_ptr) (int ino, char *buffer, char **start, ! 75: off_t offset, int length, int inout) = 0; ! 76: ! 77: struct kernel_stat kstat; ! 78: ! 79: int ! 80: linux_to_mach_error (int err) ! 81: { ! 82: switch (err) ! 83: { ! 84: case 0: ! 85: return D_SUCCESS; ! 86: ! 87: case -LINUX_EPERM: ! 88: return D_INVALID_OPERATION; ! 89: ! 90: case -LINUX_EIO: ! 91: return D_IO_ERROR; ! 92: ! 93: case -LINUX_ENXIO: ! 94: return D_NO_SUCH_DEVICE; ! 95: ! 96: case -LINUX_EACCES: ! 97: return D_INVALID_OPERATION; ! 98: ! 99: case -LINUX_EFAULT: ! 100: return D_INVALID_SIZE; ! 101: ! 102: case -LINUX_EBUSY: ! 103: return D_ALREADY_OPEN; ! 104: ! 105: case -LINUX_EINVAL: ! 106: return D_INVALID_SIZE; ! 107: ! 108: case -LINUX_EROFS: ! 109: return D_READ_ONLY; ! 110: ! 111: case -LINUX_EWOULDBLOCK: ! 112: return D_WOULD_BLOCK; ! 113: ! 114: case -LINUX_ENOMEM: ! 115: return D_NO_MEMORY; ! 116: ! 117: default: ! 118: printf ("linux_to_mach_error: unknown code %d\n", err); ! 119: return D_IO_ERROR; ! 120: } ! 121: } ! 122: ! 123: int ! 124: issig () ! 125: { ! 126: return current_thread ()->wait_result != THREAD_AWAKENED; ! 127: } ! 128: ! 129: int ! 130: block_fsync (struct inode *inode, struct file *filp) ! 131: { ! 132: return 0; ! 133: } ! 134: ! 135: int ! 136: verify_area (int rw, const void *p, unsigned long size) ! 137: { ! 138: vm_prot_t prot = (rw == VERIFY_WRITE) ? VM_PROT_WRITE : VM_PROT_READ; ! 139: vm_offset_t addr = trunc_page ((vm_offset_t) p); ! 140: vm_size_t len = round_page ((vm_size_t) size); ! 141: vm_map_entry_t entry; ! 142: ! 143: vm_map_lock_read (current_map ()); ! 144: ! 145: while (1) ! 146: { ! 147: if (!vm_map_lookup_entry (current_map (), addr, &entry) ! 148: || (entry->protection & prot) != prot) ! 149: { ! 150: vm_map_unlock_read (current_map ()); ! 151: return -LINUX_EFAULT; ! 152: } ! 153: if (entry->vme_end - entry->vme_start >= len) ! 154: break; ! 155: len -= entry->vme_end - entry->vme_start; ! 156: addr += entry->vme_end - entry->vme_start; ! 157: } ! 158: ! 159: vm_map_unlock_read (current_map ()); ! 160: return 0; ! 161: } ! 162: ! 163: /* ! 164: * Print device name (in decimal, hexadecimal or symbolic) - ! 165: * at present hexadecimal only. ! 166: * Note: returns pointer to static data! ! 167: */ ! 168: char * ! 169: kdevname (kdev_t dev) ! 170: { ! 171: static char buffer[32]; ! 172: linux_sprintf (buffer, "%02x:%02x", MAJOR (dev), MINOR (dev)); ! 173: return buffer; ! 174: } ! 175: ! 176: /* RO fail safe mechanism */ ! 177: ! 178: static long ro_bits[MAX_BLKDEV][8]; ! 179: ! 180: int ! 181: is_read_only (kdev_t dev) ! 182: { ! 183: int minor, major; ! 184: ! 185: major = MAJOR (dev); ! 186: minor = MINOR (dev); ! 187: if (major < 0 || major >= MAX_BLKDEV) ! 188: return 0; ! 189: return ro_bits[major][minor >> 5] & (1 << (minor & 31)); ! 190: } ! 191: ! 192: void ! 193: set_device_ro (kdev_t dev, int flag) ! 194: { ! 195: int minor, major; ! 196: ! 197: major = MAJOR (dev); ! 198: minor = MINOR (dev); ! 199: if (major < 0 || major >= MAX_BLKDEV) ! 200: return; ! 201: if (flag) ! 202: ro_bits[major][minor >> 5] |= 1 << (minor & 31); ! 203: else ! 204: ro_bits[major][minor >> 5] &= ~(1 << (minor & 31)); ! 205: } ! 206: ! 207: /* ! 208: * linux/lib/string.c ! 209: * ! 210: * Copyright (C) 1991, 1992 Linus Torvalds ! 211: */ ! 212: ! 213: /* ! 214: * stupid library routines.. The optimized versions should generally be found ! 215: * as inline code in <asm-xx/string.h> ! 216: * ! 217: * These are buggy as well.. ! 218: */ ! 219: ! 220: #include <linux/types.h> ! 221: #include <linux/string.h> ! 222: ! 223: char *___strtok = NULL; ! 224: ! 225: #ifndef __HAVE_ARCH_STRSPN ! 226: size_t ! 227: strspn (const char *s, const char *accept) ! 228: { ! 229: const char *p; ! 230: const char *a; ! 231: size_t count = 0; ! 232: ! 233: for (p = s; *p != '\0'; ++p) ! 234: { ! 235: for (a = accept; *a != '\0'; ++a) ! 236: { ! 237: if (*p == *a) ! 238: break; ! 239: } ! 240: if (*a == '\0') ! 241: return count; ! 242: ++count; ! 243: } ! 244: ! 245: return count; ! 246: } ! 247: #endif ! 248: ! 249: #ifndef __HAVE_ARCH_STRPBRK ! 250: char * ! 251: strpbrk (const char *cs, const char *ct) ! 252: { ! 253: const char *sc1, *sc2; ! 254: ! 255: for (sc1 = cs; *sc1 != '\0'; ++sc1) ! 256: { ! 257: for (sc2 = ct; *sc2 != '\0'; ++sc2) ! 258: { ! 259: if (*sc1 == *sc2) ! 260: return (char *) sc1; ! 261: } ! 262: } ! 263: return NULL; ! 264: } ! 265: #endif ! 266: ! 267: #ifndef __HAVE_ARCH_STRTOK ! 268: char * ! 269: strtok (char *s, const char *ct) ! 270: { ! 271: char *sbegin, *send; ! 272: ! 273: sbegin = s ? s : ___strtok; ! 274: if (!sbegin) ! 275: { ! 276: return NULL; ! 277: } ! 278: sbegin += strspn (sbegin, ct); ! 279: if (*sbegin == '\0') ! 280: { ! 281: ___strtok = NULL; ! 282: return (NULL); ! 283: } ! 284: send = strpbrk (sbegin, ct); ! 285: if (send && *send != '\0') ! 286: *send++ = '\0'; ! 287: ___strtok = send; ! 288: return (sbegin); ! 289: } ! 290: #endif ! 291: ! 292: ! 293: #ifndef __HAVE_ARCH_STRSTR ! 294: char * ! 295: strstr (const char *s1, const char *s2) ! 296: { ! 297: int l1, l2; ! 298: ! 299: l2 = strlen (s2); ! 300: if (! l2) ! 301: return (char *) s1; ! 302: l1 = strlen (s1); ! 303: while (l1 >= l2) ! 304: { ! 305: l1--; ! 306: if (! memcmp (s1,s2,l2)) ! 307: return (char *) s1; ! 308: s1++; ! 309: } ! 310: return NULL; ! 311: } ! 312: #endif ! 313: ! 314: struct proc_dir_entry proc_scsi; ! 315: struct inode_operations proc_scsi_inode_operations; ! 316: struct proc_dir_entry proc_net; ! 317: struct inode_operations proc_net_inode_operations; ! 318: ! 319: int ! 320: proc_register (struct proc_dir_entry *xxx1, struct proc_dir_entry *xxx2) ! 321: { ! 322: return 0; ! 323: } ! 324: ! 325: int ! 326: proc_unregister (struct proc_dir_entry *xxx1, int xxx2) ! 327: { ! 328: return 0; ! 329: } ! 330: ! 331: void ! 332: add_blkdev_randomness (int major) ! 333: { ! 334: } ! 335: ! 336: void ! 337: do_gettimeofday (struct timeval *tv) ! 338: { ! 339: host_get_time (1, tv); ! 340: } ! 341: ! 342: int ! 343: dev_get_info (char *buffer, char **start, off_t offset, int length, int dummy) ! 344: { ! 345: return 0; ! 346: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.