00001
00002
00003
00004
00005
00006 #include "structFileDriver.h"
00007 #include "structFileDriverTable.h"
00008 #include "rsGlobalExtern.h"
00009 #include "apiHeaderAll.h"
00010
00011 int
00012 subStructFileCreate (rsComm_t *rsComm, subFile_t *subFile)
00013 {
00014 structFileType_t myType;
00015 int subStructFileInx;
00016 int fd;
00017
00018 myType = subFile->specColl->type;
00019
00020 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00021 return (subStructFileInx);
00022 }
00023
00024 fd = StructFileDriverTable[subStructFileInx].subStructFileCreate (rsComm, subFile);
00025 return (fd);
00026 }
00027
00028
00029 int
00030 subStructFileOpen (rsComm_t *rsComm, subFile_t *subFile)
00031 {
00032 structFileType_t myType;
00033 int subStructFileInx;
00034 int fd;
00035
00036 myType = subFile->specColl->type;
00037
00038 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00039 return (subStructFileInx);
00040 }
00041
00042 fd = StructFileDriverTable[subStructFileInx].subStructFileOpen (rsComm, subFile);
00043 return (fd);
00044 }
00045
00046 int
00047 subStructFileRead (structFileType_t myType, rsComm_t *rsComm, int fd, void *buf,
00048 int len)
00049 {
00050 int subStructFileInx;
00051 int status;
00052
00053 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00054 return (subStructFileInx);
00055 }
00056
00057 status = StructFileDriverTable[subStructFileInx].subStructFileRead (rsComm, fd, buf, len);
00058 return (status);
00059 }
00060
00061 int
00062 subStructFileWrite (structFileType_t myType, rsComm_t *rsComm, int fd, void *buf, int len)
00063 {
00064 int subStructFileInx;
00065 int status;
00066
00067 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00068 return (subStructFileInx);
00069 }
00070
00071 status = StructFileDriverTable[subStructFileInx].subStructFileWrite (rsComm, fd, buf, len);
00072 return (status);
00073 }
00074
00075 int
00076 subStructFileClose (structFileType_t myType, rsComm_t *rsComm, int fd)
00077 {
00078 int subStructFileInx;
00079 int status;
00080
00081 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00082 return (subStructFileInx);
00083 }
00084
00085 status = StructFileDriverTable[subStructFileInx].subStructFileClose (rsComm, fd);
00086 return (status);
00087 }
00088
00089 int
00090 subStructFileUnlink (rsComm_t *rsComm, subFile_t *subFile)
00091 {
00092 structFileType_t myType;
00093 int subStructFileInx;
00094 int status;
00095
00096 myType = subFile->specColl->type;
00097
00098 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00099 return (subStructFileInx);
00100 }
00101
00102 status = StructFileDriverTable[subStructFileInx].subStructFileUnlink (rsComm, subFile);
00103 return (status);
00104 }
00105
00106 int
00107 subStructFileStat (rsComm_t *rsComm, subFile_t *subFile,
00108 rodsStat_t **subStructFileStatOut)
00109 {
00110 structFileType_t myType;
00111 int subStructFileInx;
00112 int status;
00113
00114 myType = subFile->specColl->type;
00115
00116 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00117 return (subStructFileInx);
00118 }
00119
00120 status = StructFileDriverTable[subStructFileInx].subStructFileStat (rsComm, subFile,
00121 subStructFileStatOut);
00122 return (status);
00123 }
00124
00125 int
00126 subStructFileFstat (structFileType_t myType, rsComm_t *rsComm, int fd,
00127 rodsStat_t **subStructFileStatOut)
00128 {
00129 int subStructFileInx;
00130 int status;
00131
00132 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00133 return (subStructFileInx);
00134 }
00135
00136 status = StructFileDriverTable[subStructFileInx].subStructFileFstat (rsComm, fd,
00137 subStructFileStatOut);
00138 return (status);
00139 }
00140
00141 rodsLong_t
00142 subStructFileLseek (structFileType_t myType, rsComm_t *rsComm, int fd,
00143 rodsLong_t offset, int whence)
00144 {
00145 int subStructFileInx;
00146 rodsLong_t status;
00147
00148 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00149 return ((rodsLong_t) subStructFileInx);
00150 }
00151
00152 status = StructFileDriverTable[subStructFileInx].subStructFileLseek (rsComm, fd, offset,
00153 whence);
00154 return (status);
00155 }
00156
00157 int
00158 subStructFileRename (rsComm_t *rsComm, subFile_t *subFile, char *newFileName)
00159 {
00160 structFileType_t myType;
00161 int subStructFileInx;
00162 int status;
00163
00164 myType = subFile->specColl->type;
00165
00166 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00167 return (subStructFileInx);
00168 }
00169
00170 status = StructFileDriverTable[subStructFileInx].subStructFileRename (rsComm, subFile,
00171 newFileName);
00172 return (status);
00173 }
00174
00175 int
00176 subStructFileMkdir (rsComm_t *rsComm, subFile_t *subFile)
00177 {
00178 structFileType_t myType;
00179 int subStructFileInx;
00180 int status;
00181
00182 myType = subFile->specColl->type;
00183
00184 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00185 return (subStructFileInx);
00186 }
00187
00188 status = StructFileDriverTable[subStructFileInx].subStructFileMkdir (rsComm, subFile);
00189 return (status);
00190 }
00191
00192 int
00193 subStructFileRmdir (rsComm_t *rsComm, subFile_t *subFile)
00194 {
00195 structFileType_t myType;
00196 int subStructFileInx;
00197 int status;
00198
00199 myType = subFile->specColl->type;
00200
00201 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00202 return (subStructFileInx);
00203 }
00204
00205 status = StructFileDriverTable[subStructFileInx].subStructFileRmdir (rsComm, subFile);
00206 return (status);
00207 }
00208
00209 int
00210 subStructFileOpendir (rsComm_t *rsComm, subFile_t *subFile)
00211 {
00212 structFileType_t myType;
00213 int subStructFileInx;
00214 int status;
00215
00216 myType = subFile->specColl->type;
00217
00218 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00219 return (subStructFileInx);
00220 }
00221
00222 status = StructFileDriverTable[subStructFileInx].subStructFileOpendir (rsComm, subFile);
00223 return (status);
00224 }
00225
00226 int
00227 subStructFileReaddir (structFileType_t myType, rsComm_t *rsComm, int fd,
00228 rodsDirent_t **rodsDirent)
00229 {
00230 int subStructFileInx;
00231 rodsLong_t status;
00232
00233 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00234 return ((rodsLong_t) subStructFileInx);
00235 }
00236
00237 status = StructFileDriverTable[subStructFileInx].subStructFileReaddir (
00238 rsComm, fd, rodsDirent);
00239 return (status);
00240 }
00241
00242 int
00243 subStructFileClosedir (structFileType_t myType, rsComm_t *rsComm, int fd)
00244 {
00245 int subStructFileInx;
00246 rodsLong_t status;
00247
00248 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00249 return ((rodsLong_t) subStructFileInx);
00250 }
00251
00252 status = StructFileDriverTable[subStructFileInx].subStructFileClosedir (rsComm, fd);
00253 return (status);
00254 }
00255
00256 int
00257 subStructFileTruncate (rsComm_t *rsComm, subFile_t *subFile)
00258 {
00259 structFileType_t myType;
00260 int subStructFileInx;
00261 int status;
00262
00263 myType = subFile->specColl->type;
00264
00265 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00266 return (subStructFileInx);
00267 }
00268
00269 status = StructFileDriverTable[subStructFileInx].subStructFileTruncate (rsComm, subFile);
00270 return (status);
00271 }
00272
00273 int
00274 subStructFileIndexLookup (structFileType_t myType)
00275 {
00276 int i;
00277
00278 for (i = 0; i < NumStructFileDriver; i++) {
00279 if (myType == StructFileDriverTable[i].type)
00280 return (i);
00281 }
00282
00283 rodsLog (LOG_ERROR, "structFileIndexLookup error for type %d", myType);
00284
00285 return (FILE_INDEX_LOOKUP_ERR);
00286 }
00287
00288 int
00289 structFileSync (rsComm_t *rsComm, structFileOprInp_t *structFileOprInp)
00290 {
00291 structFileType_t myType;
00292 int subStructFileInx;
00293 int status;
00294
00295 myType = structFileOprInp->specColl->type;
00296
00297 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00298 return (subStructFileInx);
00299 }
00300
00301 status = StructFileDriverTable[subStructFileInx].structFileSync (rsComm,
00302 structFileOprInp);
00303 return (status);
00304
00305 }
00306
00307 int
00308 structFileExtract (rsComm_t *rsComm, structFileOprInp_t *structFileOprInp)
00309 {
00310 structFileType_t myType;
00311 int subStructFileInx;
00312 int status;
00313
00314 myType = structFileOprInp->specColl->type;
00315
00316 if ((subStructFileInx = subStructFileIndexLookup (myType)) < 0) {
00317 return (subStructFileInx);
00318 }
00319
00320 status = StructFileDriverTable[subStructFileInx].structFileExtract (rsComm,
00321 structFileOprInp);
00322 return (status);
00323
00324 }
00325
00326 int
00327 initStructFileDesc ()
00328 {
00329 memset (StructFileDesc, 0,
00330 sizeof (structFileDesc_t) * NUM_STRUCT_FILE_DESC);
00331 return (0);
00332 }
00333
00334 int
00335 allocStructFileDesc ()
00336 {
00337 int i;
00338
00339 for (i = 1; i < NUM_STRUCT_FILE_DESC; i++) {
00340 if (StructFileDesc[i].inuseFlag == FD_FREE) {
00341 StructFileDesc[i].inuseFlag = FD_INUSE;
00342 return (i);
00343 };
00344 }
00345
00346 rodsLog (LOG_NOTICE,
00347 "allocStructFileDesc: out of StructFileDesc");
00348
00349 return (SYS_OUT_OF_FILE_DESC);
00350 }
00351
00352 int
00353 freeStructFileDesc (int structFileInx)
00354 {
00355 if (structFileInx < 0 || structFileInx >= NUM_STRUCT_FILE_DESC) {
00356 rodsLog (LOG_NOTICE,
00357 "freeStructFileDesc: structFileInx %d out of range", structFileInx);
00358 return (SYS_FILE_DESC_OUT_OF_RANGE);
00359 }
00360
00361 memset (&StructFileDesc[structFileInx], 0, sizeof (structFileDesc_t));
00362
00363 return (0);
00364 }
00365