00001 #ifndef _FS_INDEX_H_
00002 #define _FS_INDEX_H_
00003
00004 #include <stdlib.h>
00005
00006
00007 typedef unsigned int UINT32;
00008 typedef unsigned short UINT16;
00009 typedef unsigned char UINT8;
00010
00011 struct fs_inode {
00012 fs_inode *parent;
00013 fs_inode *next;
00014 fs_inode *prev;
00015 fs_inode *fchild;
00016 fs_inode *lchild;
00017 long long int offset;
00018 int sz;
00019 int overhead;
00020 char *name;
00021
00022 UINT32 swap;
00023 };
00024
00025 struct fs_dirent {
00026 char full_name[256];
00027 char d_name[256];
00028 int sz;
00029 long long int offset;
00030 int has_child;
00031 int swap;
00032 };
00033
00034 struct fs_dir {
00035 fs_inode *inode;
00036 fs_inode *currchild;
00037 char full_name[256];
00038 };
00039
00040 struct fs_iovec {
00041 char *filename;
00042 void *buff;
00043 int len;
00044 };
00045
00046
00047 #define WRAP_CLOSED 0
00048 #define WRAP_MEM 1
00049 #define WRAP_DISK 2
00050 #define WRAP_SOCKET 3
00051
00052 class wrapfile {
00053 public:
00054 int type;
00055
00056
00057 int fd;
00058
00059
00060 char *wbuff;
00061 long long int wfpos;
00062 long long int wsize;
00063
00064
00065
00066 wrapfile() { type = 0; wbuff = 0; wfpos = 0; wsize = 0; };
00067 int openmem(char *wrapbuff, int wrapmsize);
00068 int opendisk(char *fn, int flags, int perms=0666);
00069 int openfd(int fd);
00070 int read(void *buff, int sz);
00071 int write(void *buff, int sz);
00072
00073
00074 #if defined(__USE_LARGEFILE64) || defined(__LARGEFILE64_SOURCE_)
00075 long long int lseek(long long int offset, int whence);
00076 int fstat(struct stat64 *stat);
00077 #else
00078 int lseek(int offset, int whence);
00079 int fstat(struct stat *stat);
00080 #endif
00081
00082 int close();
00083 };
00084
00085
00086 class fs_filelist {
00087 public:
00088 char filename[50][256];
00089 int n;
00090 int max;
00091
00092 fs_filelist() {
00093 n = 0;
00094 max = 50;
00095 }
00096 };
00097
00098 class fs_index {
00099 public:
00100
00101 char cwd[256];
00102
00103 fs_index();
00104
00105 virtual ~fs_index();
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 int mountmem(char *buffer, int sz, int flags);
00116 int mount(char *filename, int flags, int perms=0666);
00117 int mount(int fd);
00118 int mount(int ip, int port) ;
00119
00120 void umount();
00121
00122 #if defined(__USE_LARGEFILE64) || defined(__LARGEFILE64_SOURCE_)
00123 long long int mountsz();
00124 #else
00125 int mountsz();
00126 #endif
00127
00128 static void hexdump(char *buff, int sz);
00129
00130 int cd(char *fn);
00131 char *pwd() { return cwd; };
00132
00133
00134 fs_dir *opendir(char *dir);
00135 void closedir(fs_dir *dir);
00136 fs_dirent *readdir(fs_dir *dir);
00137 fs_dirent *readdirent(char *name);
00138
00139
00140
00141
00142
00143 inline fs_dirent *opendirent(char *name) { return readdirent(name); };
00144
00145 int mem_ls(fs_filelist *filelist, int recurse, fs_dir *dir);
00146
00147
00148 int read(char *fn, char *buff, int sz);
00149 virtual int write(char *fn, char *buff, int sz) { return -1; };
00150 virtual int getwritevsz(fs_iovec *fsiovec, int n) { return 0; };
00151 virtual int writev(fs_iovec *iovec, int n) { return -1; };
00152 virtual int writev_sticky(fs_iovec *iovec, int n, int *sticky) { return -1; };
00153
00154 int fileSize(char *fn);
00155
00156 int n_inodes;
00157 void getFullPath(char *fullname, char *name);
00158 virtual void dump(int fd)=0;
00159
00160 wrapfile wfile;
00161 protected:
00162 int cdchanged;
00163 int oflags;
00164
00165 fs_inode *find_child(fs_inode *parent, char *name);
00166 void free_inode(fs_inode *inode);
00167 #if defined(__USE_LARGEFILE64) || defined(__LARGEFILE64_SOURCE_)
00168 fs_inode *alloc_inode(char *name, long long int off, int sz, int overhead);
00169 #else
00170 fs_inode *alloc_inode(char *name, int off, int sz, int overhead);
00171 #endif
00172
00173 virtual int _create()=0;
00174 int index_created;
00175
00176 fs_inode *root;
00177 fs_inode *cw_inode;
00178
00179 virtual int writeFsHeader() { return -1; };
00180
00181 int initmount();
00182
00183 char *writevbuff;
00184 int writevbuffsz;
00185
00186 private:
00187 fs_dirent _readdirent_static_;
00188 };
00189
00190
00191
00192 #endif