/*
    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 */
