00001 #ifndef __SFS_NATIVE_H__
00002 #define __SFS_NATIVE_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <sys/types.h>
00033 #include <string.h>
00034 #include <dirent.h>
00035
00036 #include "XrdSfs/XrdSfsInterface.hh"
00037
00038 class XrdSysError;
00039 class XrdSysLogger;
00040
00041
00042
00043
00044
00045 class XrdSfsNativeDirectory : public XrdSfsDirectory
00046 {
00047 public:
00048
00049 int open(const char *dirName,
00050 const XrdSecClientName *client = 0,
00051 const char *opaque = 0);
00052
00053 const char *nextEntry();
00054
00055 int close();
00056
00057 const char *FName() {return (const char *)fname;}
00058
00059 XrdSfsNativeDirectory(char *user=0, int monid=0)
00060 : XrdSfsDirectory(user, monid)
00061 {ateof = 0; fname = 0;
00062 dh = (DIR *)0;
00063 d_pnt = &dirent_full.d_entry;
00064 }
00065
00066 ~XrdSfsNativeDirectory() {if (dh) close();}
00067 private:
00068
00069 DIR *dh;
00070 char ateof;
00071 char *fname;
00072
00073 struct {struct dirent d_entry;
00074 char pad[MAXNAMLEN];
00075 } dirent_full;
00076
00077 struct dirent *d_pnt;
00078
00079 };
00080
00081
00082
00083
00084
00085 class XrdSfsAio;
00086
00087 class XrdSfsNativeFile : public XrdSfsFile
00088 {
00089 public:
00090
00091 int open(const char *fileName,
00092 XrdSfsFileOpenMode openMode,
00093 mode_t createMode,
00094 const XrdSecClientName *client = 0,
00095 const char *opaque = 0);
00096
00097 int close();
00098
00099 using XrdSfsFile::fctl;
00100 int fctl(const int cmd,
00101 const char *args,
00102 XrdOucErrInfo &out_error);
00103
00104 const char *FName() {return fname;}
00105
00106 int getMmap(void **Addr, off_t &Size)
00107 {if (Addr) Addr = 0; Size = 0; return SFS_OK;}
00108
00109 int read(XrdSfsFileOffset fileOffset,
00110 XrdSfsXferSize preread_sz) {return SFS_OK;}
00111
00112 XrdSfsXferSize read(XrdSfsFileOffset fileOffset,
00113 char *buffer,
00114 XrdSfsXferSize buffer_size);
00115
00116 int read(XrdSfsAio *aioparm);
00117
00118 XrdSfsXferSize readv(XrdOucIOVec *readV,
00119 int readCount);
00120
00121 XrdSfsXferSize write(XrdSfsFileOffset fileOffset,
00122 const char *buffer,
00123 XrdSfsXferSize buffer_size);
00124
00125 int write(XrdSfsAio *aioparm);
00126
00127 int sync();
00128
00129 int sync(XrdSfsAio *aiop);
00130
00131 int stat(struct stat *buf);
00132
00133 int truncate(XrdSfsFileOffset fileOffset);
00134
00135 int getCXinfo(char cxtype[4], int &cxrsz) {return cxrsz = 0;}
00136
00137 XrdSfsNativeFile(char *user=0, int monid=0)
00138 : XrdSfsFile(user, monid)
00139 {oh = -1; fname = 0;}
00140 ~XrdSfsNativeFile() {if (oh) close();}
00141 private:
00142
00143 int oh;
00144 char *fname;
00145
00146 };
00147
00148
00149
00150
00151
00152 class XrdSfsNative : public XrdSfsFileSystem
00153 {
00154 public:
00155
00156
00157
00158 XrdSfsDirectory *newDir(char *user=0, int monid=0)
00159 {return (XrdSfsDirectory *)new XrdSfsNativeDirectory(user,monid);}
00160
00161 XrdSfsFile *newFile(char *user=0,int monid=0)
00162 {return (XrdSfsFile *)new XrdSfsNativeFile(user,monid);}
00163
00164
00165
00166 int chmod(const char *Name,
00167 XrdSfsMode Mode,
00168 XrdOucErrInfo &out_error,
00169 const XrdSecClientName *client = 0,
00170 const char *opaque = 0);
00171
00172 int exists(const char *fileName,
00173 XrdSfsFileExistence &exists_flag,
00174 XrdOucErrInfo &out_error,
00175 const XrdSecClientName *client = 0,
00176 const char *opaque = 0);
00177
00178 int fsctl(const int cmd,
00179 const char *args,
00180 XrdOucErrInfo &out_error,
00181 const XrdSecClientName *client = 0);
00182
00183 int getStats(char *buff, int blen) {return 0;}
00184
00185 const char *getVersion();
00186
00187 int mkdir(const char *dirName,
00188 XrdSfsMode Mode,
00189 XrdOucErrInfo &out_error,
00190 const XrdSecClientName *client = 0,
00191 const char *opaque = 0);
00192
00193 int prepare( XrdSfsPrep &pargs,
00194 XrdOucErrInfo &out_error,
00195 const XrdSecClientName *client = 0) {return 0;}
00196
00197 int rem(const char *path,
00198 XrdOucErrInfo &out_error,
00199 const XrdSecClientName *client = 0,
00200 const char *opaque = 0);
00201
00202 int remdir(const char *dirName,
00203 XrdOucErrInfo &out_error,
00204 const XrdSecClientName *client = 0,
00205 const char *opaque = 0);
00206
00207 int rename(const char *oldFileName,
00208 const char *newFileName,
00209 XrdOucErrInfo &out_error,
00210 const XrdSecClientName *client = 0,
00211 const char *opaqueO = 0,
00212 const char *opaqueN = 0);
00213
00214 int stat(const char *Name,
00215 struct stat *buf,
00216 XrdOucErrInfo &out_error,
00217 const XrdSecClientName *client = 0,
00218 const char *opaque = 0);
00219
00220 int stat(const char *Name,
00221 mode_t &mode,
00222 XrdOucErrInfo &out_error,
00223 const XrdSecClientName *client = 0,
00224 const char *opaque = 0)
00225 {struct stat bfr;
00226 int rc = stat(Name, &bfr, out_error, client);
00227 if (!rc) mode = bfr.st_mode;
00228 return rc;
00229 }
00230
00231 int truncate(const char *Name,
00232 XrdSfsFileOffset fileOffset,
00233 XrdOucErrInfo &out_error,
00234 const XrdSecEntity *client = 0,
00235 const char *opaque = 0);
00236
00237
00238
00239 static int Mkpath(const char *path, mode_t mode,
00240 const char *info=0);
00241
00242 static int Emsg(const char *, XrdOucErrInfo&, int, const char *x,
00243 const char *y="");
00244
00245 XrdSfsNative(XrdSysError *lp);
00246 virtual ~XrdSfsNative() {}
00247
00248 private:
00249
00250 static XrdSysError *eDest;
00251 };
00252 #endif