blob: 1603b22e8c84b776f2663442f73e39c12afe52eb [file] [log] [blame]
/*
parted_io.c -- parted I/O code interface for libext2resize
Copyright (C) 1998-2000 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <config.h>
#ifndef DISCOVER_ONLY
#include <parted/parted.h>
#include <stdio.h>
#include <stdlib.h>
#include "ext2.h"
/* pseudo-header.... */
loff_t llseek(unsigned int fd, loff_t offset, unsigned int whence);
struct my_cookie
{
int logsize;
PedGeometry* geom;
};
/* ...then this must be pseudo-code :-) */
static int do_close (void *cookie);
static int do_sync (void *cookie);
static blk_t do_get_size (void *cookie);
static int do_read (void *cookie, void *ptr, blk_t block, blk_t numblocks);
static int do_set_blocksize(void *cookie, int logsize);
static int do_write (void *cookie, void *ptr, blk_t block, blk_t numblocks);
struct ext2_dev_ops ops =
{
close: do_close,
get_size: do_get_size,
read: do_read,
set_blocksize: do_set_blocksize,
sync: do_sync,
write: do_write
};
static int do_close(void *cookie)
{
struct my_cookie *monster = cookie;
return ped_geometry_sync(monster->geom);
}
static int do_sync(void *cookie)
{
struct my_cookie *monster = cookie;
return ped_geometry_sync(monster->geom);
}
static blk_t do_get_size(void *cookie)
{
struct my_cookie *monster = cookie;
return monster->geom->length >> (monster->logsize - 9);
}
static int do_read(void *cookie, void *ptr, blk_t block, blk_t num)
{
struct my_cookie *monster = cookie;
return ped_geometry_read(monster->geom, ptr, block << (monster->logsize - 9), num << (monster->logsize - 9));
}
static int do_set_blocksize(void *cookie, int logsize)
{
struct my_cookie *monster = cookie;
monster->logsize = logsize;
return 1;
}
static int do_write(void *cookie, void *ptr, blk_t block, blk_t num)
{
struct my_cookie *monster = cookie;
return ped_geometry_write(monster->geom, ptr,
block << (monster->logsize - 9),
num << (monster->logsize - 9));
}
struct ext2_dev_handle *ext2_make_dev_handle_from_parted_geometry(PedGeometry* geom)
{
struct ext2_dev_handle *dh;
struct my_cookie *monster;
if ((dh = ped_malloc(sizeof(struct ext2_dev_handle))) == NULL)
goto error;
if ((monster = ped_malloc(sizeof(struct my_cookie))) == NULL)
goto error_free_dh;
dh->ops = &ops;
dh->cookie = monster;
monster->logsize = 9;
monster->geom = geom;
return dh;
error_free_dh:
ped_free(dh);
error:
return NULL;
}
void ext2_destroy_dev_handle(struct ext2_dev_handle *handle)
{
ped_geometry_destroy(((struct my_cookie *)handle->cookie)->geom);
ped_free(handle->cookie);
ped_free(handle);
}
#endif /* !DISCOVER_ONLY */