Home | History | Annotate | Line # | Download | only in dist
      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  */
     75 MEDIA
     76 open_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 
    145 char *
    146 get_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 
    191 MEDIA_ITERATOR
    192 first_media_kind(long *state)
    193 {
    194     *state = 0;
    195     return next_media_kind(state);
    196 }
    197 
    198 
    199 MEDIA_ITERATOR
    200 next_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