/*
    libparted
    Copyright (C) 1998, 1999, 2000, 2007 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>
#include "fat.h"
#include "fatio.h"

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>

#ifndef DISCOVER_ONLY

int
fat_read_fragments (PedFileSystem* fs, char* buf, FatFragment frag,
		    FatFragment count)
{
	FatSpecific*	fs_info = FAT_SPECIFIC (fs);
	PedSector	sector = fat_frag_to_sector (fs, frag);
	PedSector	sector_count = count * fs_info->frag_sectors;

	PED_ASSERT (frag >= 0 && frag < fs_info->frag_count, return 0);

	return ped_geometry_read (fs->geom, buf, sector, sector_count);
}

int
fat_read_fragment (PedFileSystem* fs, char* buf, FatFragment frag)
{
	return fat_read_fragments (fs, buf, frag, 1);
}

int
fat_write_fragments (PedFileSystem* fs, char* buf, FatFragment frag,
		     FatFragment count)
{
	FatSpecific*	fs_info = FAT_SPECIFIC (fs);
	PedSector	sector = fat_frag_to_sector (fs, frag);
	PedSector	sector_count = count * fs_info->frag_sectors;

	PED_ASSERT (frag >= 0 && frag < fs_info->frag_count, return 0);

	return ped_geometry_write (fs->geom, buf, sector, sector_count);
}

int
fat_write_fragment (PedFileSystem* fs, char* buf, FatFragment frag)
{
	return fat_write_fragments (fs, buf, frag, 1);
}

int
fat_write_sync_fragments (PedFileSystem* fs, char* buf, FatFragment frag,
			  FatFragment count)
{
	if (!fat_write_fragments (fs, buf, frag, count))
		return 0;
	if (!ped_geometry_sync (fs->geom))
		return 0;
	return 1;
}

int
fat_write_sync_fragment (PedFileSystem* fs, char* buf, FatFragment frag)
{
	return fat_write_sync_fragments (fs, buf, frag, 1);
}

int
fat_read_clusters (PedFileSystem* fs, char *buf, FatCluster cluster,
		   FatCluster count)
{
	FatSpecific*	fs_info = FAT_SPECIFIC (fs);
	PedSector	sector = fat_cluster_to_sector (fs, cluster);
	PedSector	sector_count = count * fs_info->cluster_sectors;

	PED_ASSERT (cluster >= 2
	    	    && cluster + count - 1 < fs_info->cluster_count + 2,
		    return 0);

	return ped_geometry_read (fs->geom, buf, sector, sector_count);
}

int
fat_read_cluster (PedFileSystem* fs, char *buf, FatCluster cluster)
{
	return fat_read_clusters (fs, buf, cluster, 1);
}

int
fat_write_clusters (PedFileSystem* fs, char *buf, FatCluster cluster,
		    FatCluster count)
{
	FatSpecific*	fs_info = FAT_SPECIFIC (fs);
	PedSector	sector = fat_cluster_to_sector (fs, cluster);
	PedSector	sector_count = count * fs_info->cluster_sectors;

	PED_ASSERT (cluster >= 2
	    	    && cluster + count - 1 < fs_info->cluster_count + 2,
		    return 0);

	return ped_geometry_write (fs->geom, buf, sector, sector_count);
}

int
fat_write_cluster (PedFileSystem* fs, char *buf, FatCluster cluster)
{
	return fat_write_clusters (fs, buf, cluster, 1);
}

int
fat_write_sync_clusters (PedFileSystem* fs, char *buf, FatCluster cluster,
			 FatCluster count)
{
	if (!fat_write_clusters (fs, buf, cluster, count))
		return 0;
	if (!ped_geometry_sync (fs->geom))
		return 0;
	return 1;
}

int
fat_write_sync_cluster (PedFileSystem* fs, char *buf, FatCluster cluster)
{
	if (!fat_write_cluster (fs, buf, cluster))
		return 0;
	if (!ped_geometry_sync (fs->geom))
		return 0;
	return 1;
}

#endif /* !DISCOVER_ONLY */
