1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * YAFFS: Yet another Flash File System . A NAND-flash specific file system. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2002-2011 Aleph One Ltd. 5*4882a593Smuzhiyun * for Toby Churchill Ltd and Brightstar Engineering 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Created by Charles Manning <charles@aleph1.co.uk> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of the GNU Lesser General Public License version 2.1 as 11*4882a593Smuzhiyun * published by the Free Software Foundation. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* 17*4882a593Smuzhiyun * Header file for using yaffs in an application via 18*4882a593Smuzhiyun * a direct interface. 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #ifndef __YAFFSFS_H__ 23*4882a593Smuzhiyun #define __YAFFSFS_H__ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #include "yaffscfg.h" 26*4882a593Smuzhiyun #include "yportenv.h" 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #ifndef NAME_MAX 30*4882a593Smuzhiyun #define NAME_MAX 256 31*4882a593Smuzhiyun #endif 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define YAFFS_MAX_FILE_SIZE (0x800000000LL - 1) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct yaffs_dirent { 37*4882a593Smuzhiyun long d_ino; /* inode number */ 38*4882a593Smuzhiyun off_t d_off; /* offset to this dirent */ 39*4882a593Smuzhiyun unsigned short d_reclen; /* length of this dirent */ 40*4882a593Smuzhiyun YUCHAR d_type; /* type of this record */ 41*4882a593Smuzhiyun YCHAR d_name[NAME_MAX+1]; /* file name (null-terminated) */ 42*4882a593Smuzhiyun unsigned d_dont_use; /* debug: not for public consumption */ 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun typedef struct opaque_structure yaffs_DIR; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct yaffs_stat { 50*4882a593Smuzhiyun int st_dev; /* device */ 51*4882a593Smuzhiyun int st_ino; /* inode */ 52*4882a593Smuzhiyun unsigned st_mode; /* protection */ 53*4882a593Smuzhiyun int st_nlink; /* number of hard links */ 54*4882a593Smuzhiyun int st_uid; /* user ID of owner */ 55*4882a593Smuzhiyun int st_gid; /* group ID of owner */ 56*4882a593Smuzhiyun unsigned st_rdev; /* device type (if inode device) */ 57*4882a593Smuzhiyun loff_t st_size; /* total size, in bytes */ 58*4882a593Smuzhiyun unsigned long st_blksize; /* blocksize for filesystem I/O */ 59*4882a593Smuzhiyun unsigned long st_blocks; /* number of blocks allocated */ 60*4882a593Smuzhiyun #ifdef CONFIG_YAFFS_WINCE 61*4882a593Smuzhiyun /* Special 64-bit times for WinCE */ 62*4882a593Smuzhiyun unsigned long yst_wince_atime[2]; 63*4882a593Smuzhiyun unsigned long yst_wince_mtime[2]; 64*4882a593Smuzhiyun unsigned long yst_wince_ctime[2]; 65*4882a593Smuzhiyun #else 66*4882a593Smuzhiyun unsigned long yst_atime; /* time of last access */ 67*4882a593Smuzhiyun unsigned long yst_mtime; /* time of last modification */ 68*4882a593Smuzhiyun unsigned long yst_ctime; /* time of last change */ 69*4882a593Smuzhiyun #endif 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct yaffs_utimbuf { 74*4882a593Smuzhiyun unsigned long actime; 75*4882a593Smuzhiyun unsigned long modtime; 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun int yaffs_open(const YCHAR *path, int oflag, int mode) ; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun int yaffs_close(int fd) ; 82*4882a593Smuzhiyun int yaffs_fsync(int fd) ; 83*4882a593Smuzhiyun int yaffs_fdatasync(int fd) ; 84*4882a593Smuzhiyun int yaffs_flush(int fd) ; /* same as yaffs_fsync() */ 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun int yaffs_access(const YCHAR *path, int amode); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun int yaffs_dup(int fd); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun int yaffs_read(int fd, void *buf, unsigned int nbyte) ; 91*4882a593Smuzhiyun int yaffs_write(int fd, const void *buf, unsigned int nbyte) ; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun int yaffs_pread(int fd, void *buf, unsigned int nbyte, loff_t offset); 94*4882a593Smuzhiyun int yaffs_pwrite(int fd, const void *buf, unsigned int nbyte, loff_t offset); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun loff_t yaffs_lseek(int fd, loff_t offset, int whence) ; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun int yaffs_truncate(const YCHAR *path, loff_t new_size); 99*4882a593Smuzhiyun int yaffs_ftruncate(int fd, loff_t new_size); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun int yaffs_unlink(const YCHAR *path) ; 102*4882a593Smuzhiyun int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath) ; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun int yaffs_stat(const YCHAR *path, struct yaffs_stat *buf) ; 105*4882a593Smuzhiyun int yaffs_lstat(const YCHAR *path, struct yaffs_stat *buf) ; 106*4882a593Smuzhiyun int yaffs_fstat(int fd, struct yaffs_stat *buf) ; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun int yaffs_utime(const YCHAR *path, const struct yaffs_utimbuf *buf); 109*4882a593Smuzhiyun int yaffs_futime(int fd, const struct yaffs_utimbuf *buf); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun int yaffs_setxattr(const char *path, const char *name, 113*4882a593Smuzhiyun const void *data, int size, int flags); 114*4882a593Smuzhiyun int yaffs_lsetxattr(const char *path, const char *name, 115*4882a593Smuzhiyun const void *data, int size, int flags); 116*4882a593Smuzhiyun int yaffs_fsetxattr(int fd, const char *name, 117*4882a593Smuzhiyun const void *data, int size, int flags); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun int yaffs_getxattr(const char *path, const char *name, 120*4882a593Smuzhiyun void *data, int size); 121*4882a593Smuzhiyun int yaffs_lgetxattr(const char *path, const char *name, 122*4882a593Smuzhiyun void *data, int size); 123*4882a593Smuzhiyun int yaffs_fgetxattr(int fd, const char *name, 124*4882a593Smuzhiyun void *data, int size); 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun int yaffs_removexattr(const char *path, const char *name); 127*4882a593Smuzhiyun int yaffs_lremovexattr(const char *path, const char *name); 128*4882a593Smuzhiyun int yaffs_fremovexattr(int fd, const char *name); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun int yaffs_listxattr(const char *path, char *list, int size); 131*4882a593Smuzhiyun int yaffs_llistxattr(const char *path, char *list, int size); 132*4882a593Smuzhiyun int yaffs_flistxattr(int fd, char *list, int size); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #ifdef CONFIG_YAFFS_WINCE 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun int yaffs_set_wince_times(int fd, 138*4882a593Smuzhiyun const unsigned *wctime, 139*4882a593Smuzhiyun const unsigned *watime, 140*4882a593Smuzhiyun const unsigned *wmtime); 141*4882a593Smuzhiyun int yaffs_get_wince_times(int fd, 142*4882a593Smuzhiyun unsigned *wctime, 143*4882a593Smuzhiyun unsigned *watime, 144*4882a593Smuzhiyun unsigned *wmtime); 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #endif 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun int yaffs_chmod(const YCHAR *path, mode_t mode); 149*4882a593Smuzhiyun int yaffs_fchmod(int fd, mode_t mode); 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun int yaffs_mkdir(const YCHAR *path, mode_t mode) ; 152*4882a593Smuzhiyun int yaffs_rmdir(const YCHAR *path) ; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun yaffs_DIR *yaffs_opendir(const YCHAR *dirname) ; 155*4882a593Smuzhiyun struct yaffs_dirent *yaffs_readdir(yaffs_DIR *dirp) ; 156*4882a593Smuzhiyun void yaffs_rewinddir(yaffs_DIR *dirp) ; 157*4882a593Smuzhiyun int yaffs_closedir(yaffs_DIR *dirp) ; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun int yaffs_mount(const YCHAR *path) ; 160*4882a593Smuzhiyun int yaffs_mount2(const YCHAR *path, int read_only); 161*4882a593Smuzhiyun int yaffs_mount_common(const YCHAR *path, int read_only, int skip_checkpt); 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun int yaffs_unmount(const YCHAR *path) ; 164*4882a593Smuzhiyun int yaffs_unmount2(const YCHAR *path, int force); 165*4882a593Smuzhiyun int yaffs_remount(const YCHAR *path, int force, int read_only); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun int yaffs_sync(const YCHAR *path) ; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath); 171*4882a593Smuzhiyun int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun int yaffs_link(const YCHAR *oldpath, const YCHAR *newpath); 174*4882a593Smuzhiyun int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun loff_t yaffs_freespace(const YCHAR *path); 177*4882a593Smuzhiyun loff_t yaffs_totalspace(const YCHAR *path); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun int yaffs_inodecount(const YCHAR *path); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun int yaffs_n_handles(const YCHAR *path); 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun #define YAFFS_SHARE_READ 1 184*4882a593Smuzhiyun #define YAFFS_SHARE_WRITE 2 185*4882a593Smuzhiyun int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int shareMode); 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun struct yaffs_dev; 188*4882a593Smuzhiyun void yaffs_add_device(struct yaffs_dev *dev); 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun int yaffs_start_up(void); 191*4882a593Smuzhiyun int yaffsfs_GetLastError(void); 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* Functions to iterate through devices. NB Use with extreme care! */ 194*4882a593Smuzhiyun void yaffs_dev_rewind(void); 195*4882a593Smuzhiyun struct yaffs_dev *yaffs_next_dev(void); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* Function to get the last error */ 198*4882a593Smuzhiyun int yaffs_get_error(void); 199*4882a593Smuzhiyun const char *yaffs_error_to_str(int err); 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* Function only for debugging */ 202*4882a593Smuzhiyun void *yaffs_getdev(const YCHAR *path); 203*4882a593Smuzhiyun int yaffs_dump_dev(const YCHAR *path); 204*4882a593Smuzhiyun int yaffs_set_error(int error); 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* Trace control functions */ 207*4882a593Smuzhiyun unsigned yaffs_set_trace(unsigned tm); 208*4882a593Smuzhiyun unsigned yaffs_get_trace(void); 209*4882a593Smuzhiyun #endif 210