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