1/* 2 * pathname.c - 3 * 4 * Written by Eryk Vershen 5 */ 6 7/* 8 * Copyright 1997,1998 by Apple Computer, Inc. 9 * All Rights Reserved 10 * 11 * Permission to use, copy, modify, and distribute this software and 12 * its documentation for any purpose and without fee is hereby granted, 13 * provided that the above copyright notice appears in all copies and 14 * that both the copyright notice and this permission notice appear in 15 * supporting documentation. 16 * 17 * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19 * FOR A PARTICULAR PURPOSE. 20 * 21 * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 22 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 23 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 24 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 25 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 26 */ 27 28 29// for strncmp() 30#include <string.h> 31#include <stdint.h> 32 33#include "pathname.h" 34#include "file_media.h" 35 36#if !defined(__linux__) && !defined(__unix__) 37#include "SCSI_media.h" 38#include "ATA_media.h" 39#endif 40 41 42/* 43 * Defines 44 */ 45 46 47/* 48 * Types 49 */ 50 51 52/* 53 * Global Constants 54 */ 55 56 57/* 58 * Global Variables 59 */ 60 61 62/* 63 * Forward declarations 64 */ 65 66 67/* 68 * Routines 69 */ 70 71/* 72 * Note that open_pathname_as_media() and get_linux_name() have almost 73 * identical structures. If one changes the other must also! 74 */ 75MEDIA 76open_pathname_as_media(char *path, int oflag) 77{ 78 MEDIA m = 0; 79#if !defined(__linux__) && !defined(__unix__) 80 long id; 81 long bus; 82 83 if (strncmp("/dev/", path, 5) == 0) { 84 if (strncmp("/dev/scsi", path, 9) == 0) { 85 if (path[9] >= '0' && path[9] <= '7' && path[10] == 0) { 86 // scsi[0-7] 87 id = path[9] - '0'; 88 m = open_old_scsi_as_media(id); 89 } else if (path[9] >= '0' && path[9] <= '7' && path[10] == '.' 90 && path[11] >= '0' && path[11] <= '7' && path[12] == 0) { 91 // scsi[0-7].[0-7] 92 id = path[11] - '0'; 93 bus = path[9] - '0'; 94 m = open_scsi_as_media(bus, id); 95 } 96 } else if (strncmp("/dev/ata", path, 8) == 0 97 || strncmp("/dev/ide", path, 8) == 0) { 98 if (path[8] >= '0' && path[8] <= '7' && path[9] == 0) { 99 // ata[0-7], ide[0-7] 100 bus = path[8] - '0'; 101 m = open_ata_as_media(bus, 0); 102 } else if (path[8] >= '0' && path[8] <= '7' && path[9] == '.' 103 && path[10] >= '0' && path[10] <= '1' && path[11] == 0) { 104 // ata[0-7].[0-1], ide[0-7].[0-1] 105 id = path[10] - '0'; 106 bus = path[8] - '0'; 107 m = open_ata_as_media(bus, id); 108 } 109 } else if (strncmp("/dev/sd", path, 7) == 0) { 110 if (path[7] >= 'a' && path[7] <= 'z' && path[8] == 0) { 111 // sd[a-z] 112 id = path[7] - 'a'; 113 m = open_linux_scsi_as_media(id, 0); 114 } else if (path[7] >= 'a' && path[7] <= 'z' && path[8] == '.' 115 && path[9] >= 'a' && path[9] <= 'z' && path[10] == 0) { 116 // sd[a-z][a-z] 117 bus = path[7] - 'a'; 118 id = path[9] - 'a'; 119 id += bus * 26; 120 m = open_linux_scsi_as_media(id, 0); 121 } 122 } else if (strncmp("/dev/scd", path, 8) == 0) { 123 if (path[8] >= '0' && path[8] <= '9' && path[9] == 0) { 124 // scd[0-9] 125 id = path[8] - '0'; 126 m = open_linux_scsi_as_media(id, 1); 127 } 128 } else if (strncmp("/dev/hd", path, 7) == 0) { 129 if (path[7] >= 'a' && path[7] <= 'z' && path[8] == 0) { 130 // hd[a-z] 131 id = path[7] - 'a'; 132 m = open_linux_ata_as_media(id); 133 } 134 } 135 } else 136#endif 137 138 { 139 m = open_file_as_media(path, oflag); 140 } 141 return m; 142} 143 144 145char * 146get_linux_name(char *path) 147{ 148 char *result = 0; 149#if !defined(__linux__) && !defined(__unix__) 150 long id; 151 long bus; 152 153 if (strncmp("/dev/", path, 5) == 0) { 154 if (strncmp("/dev/scsi", path, 9) == 0) { 155 if (path[9] >= '0' && path[9] <= '7' && path[10] == 0) { 156 /* old scsi */ 157 // scsi[0-7] 158 id = path[9] - '0'; 159 result = linux_old_scsi_name(id); 160 } else if (path[9] >= '0' && path[9] <= '7' && path[10] == '.' 161 && path[11] >= '0' && path[11] <= '7' && path[12] == 0) { 162 /* new scsi */ 163 // scsi[0-7].[0-7] 164 id = path[11] - '0'; 165 bus = path[9] - '0'; 166 result = linux_scsi_name(bus, id); 167 } 168 } else if (strncmp("/dev/ata", path, 8) == 0 169 || strncmp("/dev/ide", path, 8) == 0) { 170 if (path[8] >= '0' && path[8] <= '7' && path[9] == 0) { 171 /* ata/ide - master device */ 172 // ata[0-7], ide[0-7] 173 bus = path[8] - '0'; 174 result = linux_ata_name(bus, 0); 175 } else if (path[8] >= '0' && path[8] <= '7' && path[9] == '.' 176 && path[10] >= '0' && path[10] <= '1' && path[11] == 0) { 177 /* ata/ide */ 178 // ata[0-7].[0-1], ide[0-7].[0-1] 179 id = path[10] - '0'; 180 bus = path[8] - '0'; 181 result = linux_ata_name(bus, id); 182 } 183 } 184 } 185#endif 186 187 return result; 188} 189 190 191MEDIA_ITERATOR 192first_media_kind(long *state) 193{ 194 *state = 0; 195 return next_media_kind(state); 196} 197 198 199MEDIA_ITERATOR 200next_media_kind(long *state) 201{ 202 MEDIA_ITERATOR result; 203 long ix; 204 205 result = 0; 206 ix = *state; 207 208 switch (ix) { 209 case 0: 210#if defined(__linux__) || defined(__unix__) 211 result = create_file_iterator(); 212#endif 213 ix = 1; 214 if (result != 0) { 215 break; 216 } 217 /* fall through to next interface */ 218 219 case 1: 220#if !defined(__linux__) && !defined(__unix__) 221 result = create_ata_iterator(); 222#endif 223 ix = 2; 224 if (result != 0) { 225 break; 226 } 227 /* fall through to next interface */ 228 229 case 2: 230#if !defined(__linux__) && !defined(__unix__) 231 result = create_scsi_iterator(); 232#endif 233 ix = 3; 234 if (result != 0) { 235 break; 236 } 237 /* fall through to next interface */ 238 239 case 3: 240 default: 241 break; 242 } 243 244 *state = ix; 245 return result; 246} 247 248 249