/* ----------------------------------------------------------------------- *
*
* Copyright 2004-2008 H. Peter Anvin - All Rights Reserved
*
* 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, Inc., 53 Temple Place Ste 330,
* Boston MA 02111-1307, USA; either version 2 of the License, or
* (at your option) any later version; incorporated herein by reference.
*
* ----------------------------------------------------------------------- */
/*
* libfat.h
*
* Headers for the libfat library
*/
#ifndef LIBFAT_H
#define LIBFAT_H
#include <stddef.h>
#include <inttypes.h>
#define LIBFAT_SECTOR_SHIFT 9
#define LIBFAT_SECTOR_SIZE 512
#define LIBFAT_SECTOR_MASK 511
typedef uint64_t libfat_sector_t;
struct libfat_filesystem;
struct libfat_direntry {
libfat_sector_t sector;
int offset;
unsigned char entry[32];
};
/*
* Open the filesystem. The readfunc is the function to read
* sectors, in the format:
* int readfunc(intptr_t readptr, void *buf, size_t secsize,
* libfat_sector_t secno)
*
* ... where readptr is a private argument.
*
* A return value of != secsize is treated as error.
*/
struct libfat_filesystem
*libfat_open(int (*readfunc) (intptr_t, void *, size_t, libfat_sector_t),
intptr_t readptr);
void libfat_close(struct libfat_filesystem *);
/*
* Convert a cluster number (or 0 for the root directory) to a
* sector number. Return -1 on failure.
*/
libfat_sector_t libfat_clustertosector(const struct libfat_filesystem *fs,
int32_t cluster);
/*
* Get the next sector of either the root directory or a FAT chain.
* Returns 0 on end of file and -1 on error.
*/
libfat_sector_t libfat_nextsector(struct libfat_filesystem *fs,
libfat_sector_t s);
/*
* Flush all cached sectors for this filesystem.
*/
void libfat_flush(struct libfat_filesystem *fs);
/*
* Get a pointer to a specific sector.
*/
void *libfat_get_sector(struct libfat_filesystem *fs, libfat_sector_t n);
/*
* Search a FAT directory for a particular pre-mangled filename.
* Copies the directory entry into direntry and returns 0 if found.
*/
int32_t libfat_searchdir(struct libfat_filesystem *fs, int32_t dirclust,
const void *name, struct libfat_direntry *direntry);
#endif /* LIBFAT_H */