xref: /netbsd-src/external/bsd/pdisk/dist/pathname.c (revision 48a628ae0434c4247b560ad8f2eb1dc06d0dd070)
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
open_pathname_as_media(char * path,int oflag)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 *
get_linux_name(char * path)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
first_media_kind(long * state)192 first_media_kind(long *state)
193 {
194     *state = 0;
195     return next_media_kind(state);
196 }
197 
198 
199 MEDIA_ITERATOR
next_media_kind(long * state)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