xref: /netbsd-src/external/bsd/pdisk/dist/media.c (revision 48a628ae0434c4247b560ad8f2eb1dc06d0dd070)
1 /*
2  * media.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 printf()
30 #include <stdio.h>
31 // for malloc() & free()
32 #include <stdlib.h>
33 
34 #include "media.h"
35 
36 
37 /*
38  * Defines
39  */
40 
41 
42 /*
43  * Types
44  */
45 
46 
47 /*
48  * Global Constants
49  */
50 
51 
52 /*
53  * Global Variables
54  */
55 static long media_kind = 0;
56 
57 /*
58  * Forward declarations
59  */
60 
61 
62 /*
63  * Routines
64  */
65 long
allocate_media_kind(void)66 allocate_media_kind(void)
67 {
68     media_kind++;
69     return media_kind;
70 }
71 
72 
73 MEDIA
new_media(long size)74 new_media(long size)
75 {
76     return (MEDIA) malloc(size);
77 }
78 
79 
80 void
delete_media(MEDIA m)81 delete_media(MEDIA m)
82 {
83     if (m == 0) {
84 	return;
85     }
86     free(m);
87 }
88 
89 
90 uint32_t
media_granularity(MEDIA m)91 media_granularity(MEDIA m)
92 {
93     if (m == 0) {
94 	return 0;
95     } else {
96 	return m->grain;
97     }
98 }
99 
100 
101 long long
media_total_size(MEDIA m)102 media_total_size(MEDIA m)
103 {
104     if (m == 0) {
105 	return 0;
106     } else {
107 	return m->size_in_bytes;
108     }
109 }
110 
111 
112 long
read_media(MEDIA m,long long offset,uint32_t count,void * address)113 read_media(MEDIA m, long long offset, uint32_t count, void *address)
114 {
115     long result;
116 
117     if (m != 0 && m->do_read != 0) {
118 	//printf("media: read type %d, offset %Ld, count %d\n\t", m->kind, offset, count);
119 	result = (*m->do_read)(m, offset, count, address);
120 	//printf(" - returns %d\n", result);
121 	return result;
122     } else {
123 	return 0;
124     }
125 }
126 
127 
128 long
write_media(MEDIA m,long long offset,uint32_t count,void * address)129 write_media(MEDIA m, long long offset, uint32_t count, void *address)
130 {
131     long result;
132 
133     if (m != 0 && m->do_write != 0) {
134 	//printf("media: write type %d, offset %Ld, count %d\n\t", m->kind, offset, count);
135 	result = (*m->do_write)(m, offset, count, address);
136 	//printf(" - returns %d\n", result);
137 	return result;
138     } else {
139 	return 0;
140     }
141 }
142 
143 
144 void
close_media(MEDIA m)145 close_media(MEDIA m)
146 {
147     if (m == 0) {
148 	return;
149     }
150     if (m->kind != 0) {
151 	if (m->do_close != 0) {
152 	    (*m->do_close)(m);
153 	}
154 	m->kind = 0;
155 	delete_media(m);
156     }
157 }
158 
159 
160 void
os_reload_media(MEDIA m)161 os_reload_media(MEDIA m)
162 {
163     if (m != 0 && m->do_os_reload != 0) {
164 	(*m->do_os_reload)(m);
165     }
166 }
167 
168 
169 #if !defined(__linux__) && !defined(__unix__)
170 #pragma mark -
171 #endif
172 
173 
174 
175 MEDIA_ITERATOR
new_media_iterator(long size)176 new_media_iterator(long size)
177 {
178     return (MEDIA_ITERATOR) malloc(size);
179 }
180 
181 
182 void
private_delete_media_iterator(MEDIA_ITERATOR m)183 private_delete_media_iterator(MEDIA_ITERATOR m)
184 {
185     if (m == 0) {
186 	return;
187     }
188     free(m);
189 }
190 
191 
192 void
reset_media_iterator(MEDIA_ITERATOR m)193 reset_media_iterator(MEDIA_ITERATOR m)
194 {
195     if (m != 0 && m->do_reset != 0) {
196 	(*m->do_reset)(m);
197     }
198 }
199 
200 
201 char *
step_media_iterator(MEDIA_ITERATOR m)202 step_media_iterator(MEDIA_ITERATOR m)
203 {
204     char *result;
205 
206     if (m != 0 && m->do_step != 0) {
207 	result = (*m->do_step)(m);
208     } else {
209 	result = 0;
210     }
211     return result;
212 }
213 
214 
215 void
delete_media_iterator(MEDIA_ITERATOR m)216 delete_media_iterator(MEDIA_ITERATOR m)
217 {
218     if (m == 0) {
219 	return;
220     }
221     if (m->kind != 0) {
222 	if (m->do_delete != 0) {
223 	    (*m->do_delete)(m);
224 	}
225 	m->kind = 0;
226 	private_delete_media_iterator(m);
227     }
228 }
229