a1246c73e0
http://cantaforda.com/cfcl/eryk/linux/pdisk/index.html this is the utility provided by mklinux and osX to manipulate the Apple Partition map.
229 lines
3.4 KiB
C
229 lines
3.4 KiB
C
/*
|
|
* media.c -
|
|
*
|
|
* Written by Eryk Vershen
|
|
*/
|
|
|
|
/*
|
|
* Copyright 1997,1998 by Apple Computer, Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software and
|
|
* its documentation for any purpose and without fee is hereby granted,
|
|
* provided that the above copyright notice appears in all copies and
|
|
* that both the copyright notice and this permission notice appear in
|
|
* supporting documentation.
|
|
*
|
|
* APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
* LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
|
|
* NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
|
|
// for printf()
|
|
#include <stdio.h>
|
|
// for malloc() & free()
|
|
#include <stdlib.h>
|
|
|
|
#include "media.h"
|
|
|
|
|
|
/*
|
|
* Defines
|
|
*/
|
|
|
|
|
|
/*
|
|
* Types
|
|
*/
|
|
|
|
|
|
/*
|
|
* Global Constants
|
|
*/
|
|
|
|
|
|
/*
|
|
* Global Variables
|
|
*/
|
|
static long media_kind = 0;
|
|
|
|
/*
|
|
* Forward declarations
|
|
*/
|
|
|
|
|
|
/*
|
|
* Routines
|
|
*/
|
|
long
|
|
allocate_media_kind(void)
|
|
{
|
|
media_kind++;
|
|
return media_kind;
|
|
}
|
|
|
|
|
|
MEDIA
|
|
new_media(long size)
|
|
{
|
|
return (MEDIA) malloc(size);
|
|
}
|
|
|
|
|
|
void
|
|
delete_media(MEDIA m)
|
|
{
|
|
if (m == 0) {
|
|
return;
|
|
}
|
|
free(m);
|
|
}
|
|
|
|
|
|
unsigned long
|
|
media_granularity(MEDIA m)
|
|
{
|
|
if (m == 0) {
|
|
return 0;
|
|
} else {
|
|
return m->grain;
|
|
}
|
|
}
|
|
|
|
|
|
long long
|
|
media_total_size(MEDIA m)
|
|
{
|
|
if (m == 0) {
|
|
return 0;
|
|
} else {
|
|
return m->size_in_bytes;
|
|
}
|
|
}
|
|
|
|
|
|
long
|
|
read_media(MEDIA m, long long offset, unsigned long count, void *address)
|
|
{
|
|
long result;
|
|
|
|
if (m != 0 && m->do_read != 0) {
|
|
//printf("media: read type %d, offset %Ld, count %d\n\t", m->kind, offset, count);
|
|
result = (*m->do_read)(m, offset, count, address);
|
|
//printf(" - returns %d\n", result);
|
|
return result;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
long
|
|
write_media(MEDIA m, long long offset, unsigned long count, void *address)
|
|
{
|
|
long result;
|
|
|
|
if (m != 0 && m->do_write != 0) {
|
|
//printf("media: write type %d, offset %Ld, count %d\n\t", m->kind, offset, count);
|
|
result = (*m->do_write)(m, offset, count, address);
|
|
//printf(" - returns %d\n", result);
|
|
return result;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
close_media(MEDIA m)
|
|
{
|
|
if (m == 0) {
|
|
return;
|
|
}
|
|
if (m->kind != 0) {
|
|
if (m->do_close != 0) {
|
|
(*m->do_close)(m);
|
|
}
|
|
m->kind = 0;
|
|
delete_media(m);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
os_reload_media(MEDIA m)
|
|
{
|
|
if (m != 0 && m->do_os_reload != 0) {
|
|
(*m->do_os_reload)(m);
|
|
}
|
|
}
|
|
|
|
|
|
#if !defined(__linux__) && !defined(__unix__)
|
|
#pragma mark -
|
|
#endif
|
|
|
|
|
|
|
|
MEDIA_ITERATOR
|
|
new_media_iterator(long size)
|
|
{
|
|
return (MEDIA_ITERATOR) malloc(size);
|
|
}
|
|
|
|
|
|
void
|
|
private_delete_media_iterator(MEDIA_ITERATOR m)
|
|
{
|
|
if (m == 0) {
|
|
return;
|
|
}
|
|
free(m);
|
|
}
|
|
|
|
|
|
void
|
|
reset_media_iterator(MEDIA_ITERATOR m)
|
|
{
|
|
if (m != 0 && m->do_reset != 0) {
|
|
(*m->do_reset)(m);
|
|
}
|
|
}
|
|
|
|
|
|
char *
|
|
step_media_iterator(MEDIA_ITERATOR m)
|
|
{
|
|
char *result;
|
|
|
|
if (m != 0 && m->do_step != 0) {
|
|
result = (*m->do_step)(m);
|
|
} else {
|
|
result = 0;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
void
|
|
delete_media_iterator(MEDIA_ITERATOR m)
|
|
{
|
|
if (m == 0) {
|
|
return;
|
|
}
|
|
if (m->kind != 0) {
|
|
if (m->do_delete != 0) {
|
|
(*m->do_delete)(m);
|
|
}
|
|
m->kind = 0;
|
|
private_delete_media_iterator(m);
|
|
}
|
|
}
|