00001 #ifndef _SFS_INDEX_H_
00002 #define _SFS_INDEX_H_
00003
00004 #include <string.h>
00005 #include "fs_index.h"
00006 #include <sys/uio.h>
00007
00008 typedef unsigned int UINT32;
00009 typedef unsigned short UINT16;
00010 typedef unsigned char UINT8;
00011
00012 #include "sfs_base.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 class SFS_ittr {
00044 public:
00045 union {
00046 SFS_File entry;
00047 char entryBuff[256];
00048 };
00049 char stickypath[256];
00050 char ppath[256];
00051 char fullpath[256];
00052
00053 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
00054 long long int fileoffset;
00055 #else
00056 int fileoffset ;
00057 #endif
00058
00059 int filepos;
00060 int skipped_bytes;
00061
00062 int legacy;
00063 SFS_ittr() {
00064 fileoffset = 0;
00065 skipped_bytes = 0;
00066 };
00067
00068 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
00069 SFS_ittr(long long int offset)
00070 #else
00071 SFS_ittr(int offset)
00072 #endif
00073 {
00074 fileoffset = offset;
00075 };
00076
00077 int get(wrapfile *wrap);
00078
00079
00080
00081 int next();
00082
00083
00084
00085 int nextLRHD();
00086 int nextDatap();
00087 int findEventNumber();
00088 int findFullLength();
00089
00090
00091 wrapfile *wfile;
00092 void swapEntry();
00093 };
00094
00095
00096 inline int seeksize(int filesize)
00097 {
00098 return (filesize + 3) & 0xfffffffc;
00099 }
00100
00101 inline int get_sfsFileSize(SFS_File *file)
00102 {
00103 return seeksize(strlen(file->name)+1) + sizeof(SFS_File) - 4;
00104 }
00105
00106
00107 void write_env(char *var, char *value);
00108 char *read_env(char *var);
00109 void getFullPath(char *out, char *in);
00110 int seeksize(int filesize);
00111 void striptofirst(char *str);
00112 char *striptofile(char *str);
00113 void stripfile(char *str);
00114 char *striptodir(char *str);
00115
00116 char *SFS_getpayload(char *buff);
00117
00118
00119 struct SfsDirsize {
00120 long long int size;
00121 long long int dataSize;
00122 };
00123
00124 class sfs_index : public fs_index {
00125 public:
00126
00127 int singleDirMount;
00128 SFS_ittr *singleDirIttr;
00129
00130 int getInodeSize(fs_inode *inode, SfsDirsize *sz);
00131 int getDirSize(char *dir, SfsDirsize *sz);
00132
00133 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
00134 int mountSingleDir(char *fn, long long int offset=0);
00135 int getSingleDirSize(char *fn, long long int offset);
00136 long long int singleDirOffset;
00137 long long int nextSingleDirOffset;
00138 int mountSingleDirMem(char *buff, int size, long long int offset=0);
00139 int singleDirSize;
00140 #else
00141 int mountSingleDir(char *fn, int offset=0);
00142 int getSingleDirSize(char *fn, int offset);
00143 int singleDirOffset;
00144 int singleDirSize;
00145 int nextSingleDirOffset;
00146 int mountSingleDirMem(char *buff, int size, int offset=0);
00147 #endif
00148
00149
00150 int mountSingleDir();
00151 int mountNextDir();
00152
00153
00154 sfs_index();
00155 ~sfs_index() { wfile.close(); }
00156
00157 int _create();
00158 void dump(int) { dump("/",root); };
00159
00160 int getwritevsz(fs_iovec *fsiovec, int n);
00161 int writev_call_retry(int fd, iovec *iovec, int vec);
00162 int writev(fs_iovec *fsiovec, int n);
00163 int writev_sticky(fs_iovec *iovec, int n, int *sticky);
00164 int write(char *fn, char *buff, int sz);
00165
00166 static int getfileheadersz(char *fn);
00167 int putfileheader(char *ptr, char *fn, int filesz, int flags=SFS_ATTR_NOCD);
00168
00169 private:
00170
00171 void addnode(SFS_ittr *ittr);
00172 int _mountNextDir();
00173 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
00174 fs_inode *add_inode(fs_inode *parent, char *name, long long int offset, int sz, int overhead);
00175 fs_inode *add_inode_from(fs_inode *neighbor, char *name, long long int offset, int sz, int overhead=0);
00176 #else
00177 fs_inode *add_inode(fs_inode *parent, char *name, int offset, int sz, int overhead);
00178 fs_inode *add_inode_from(fs_inode *neighbor, char *name, int offset, int sz, int overhead=0);
00179 #endif
00180
00181 fs_inode *find_last_lesser_child(fs_inode *parent, char *name, int &first, int &eq);
00182 fs_inode *find_last_lesser_neighbor(fs_inode *neighbor, char *name, int &eq);
00183 void dump(const char *path, fs_inode *inode);
00184
00185 int writeFsHeader();
00186 };
00187
00188
00189 #endif