Home | History | Annotate | Download | only in libfat
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2004-2008 H. Peter Anvin - All Rights Reserved
      4  *
      5  *   This program is free software; you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
      8  *   Boston MA 02111-1307, USA; either version 2 of the License, or
      9  *   (at your option) any later version; incorporated herein by reference.
     10  *
     11  * ----------------------------------------------------------------------- */
     12 
     13 /*
     14  * libfat.h
     15  *
     16  * Headers for the libfat library
     17  */
     18 
     19 #ifndef LIBFAT_H
     20 #define LIBFAT_H
     21 
     22 #include <stddef.h>
     23 #include <inttypes.h>
     24 
     25 #define LIBFAT_SECTOR_SHIFT	9
     26 #define LIBFAT_SECTOR_SIZE	512
     27 #define LIBFAT_SECTOR_MASK	511
     28 
     29 typedef uint64_t libfat_sector_t;
     30 struct libfat_filesystem;
     31 
     32 struct libfat_direntry {
     33     libfat_sector_t sector;
     34     int offset;
     35     unsigned char entry[32];
     36 };
     37 
     38 /*
     39  * Open the filesystem.  The readfunc is the function to read
     40  * sectors, in the format:
     41  * int readfunc(intptr_t readptr, void *buf, size_t secsize,
     42  *              libfat_sector_t secno)
     43  *
     44  * ... where readptr is a private argument.
     45  *
     46  * A return value of != secsize is treated as error.
     47  */
     48 struct libfat_filesystem
     49     *libfat_open(int (*readfunc) (intptr_t, void *, size_t, libfat_sector_t),
     50 		 intptr_t readptr);
     51 
     52 void libfat_close(struct libfat_filesystem *);
     53 
     54 /*
     55  * Convert a cluster number (or 0 for the root directory) to a
     56  * sector number.  Return -1 on failure.
     57  */
     58 libfat_sector_t libfat_clustertosector(const struct libfat_filesystem *fs,
     59 				       int32_t cluster);
     60 
     61 /*
     62  * Get the next sector of either the root directory or a FAT chain.
     63  * Returns 0 on end of file and -1 on error.
     64  */
     65 libfat_sector_t libfat_nextsector(struct libfat_filesystem *fs,
     66 				  libfat_sector_t s);
     67 
     68 /*
     69  * Flush all cached sectors for this filesystem.
     70  */
     71 void libfat_flush(struct libfat_filesystem *fs);
     72 
     73 /*
     74  * Get a pointer to a specific sector.
     75  */
     76 void *libfat_get_sector(struct libfat_filesystem *fs, libfat_sector_t n);
     77 
     78 /*
     79  * Search a FAT directory for a particular pre-mangled filename.
     80  * Copies the directory entry into direntry and returns 0 if found.
     81  */
     82 int32_t libfat_searchdir(struct libfat_filesystem *fs, int32_t dirclust,
     83 			 const void *name, struct libfat_direntry *direntry);
     84 
     85 #endif /* LIBFAT_H */
     86