00001
00002
00003
00004
00005
00006 #include "fileReaddir.h"
00007 #include "miscServerFunct.h"
00008 #include "rsGlobalExtern.h"
00009
00010
00011
00012 #include "eirods_log.h"
00013 #include "eirods_collection_object.h"
00014
00015 int
00016 rsFileReaddir (rsComm_t *rsComm, fileReaddirInp_t *fileReaddirInp,
00017 rodsDirent_t **fileReaddirOut)
00018 {
00019 rodsServerHost_t *rodsServerHost;
00020 int remoteFlag;
00021 int status;
00022
00023 *fileReaddirOut = NULL;
00024
00025 remoteFlag = getServerHostByFileInx (fileReaddirInp->fileInx,
00026 &rodsServerHost);
00027
00028 if (remoteFlag == LOCAL_HOST) {
00029 status = _rsFileReaddir (rsComm, fileReaddirInp, fileReaddirOut);
00030 } else if (remoteFlag == REMOTE_HOST) {
00031 status = remoteFileReaddir (rsComm, fileReaddirInp, fileReaddirOut,
00032 rodsServerHost);
00033 } else {
00034 if (remoteFlag < 0) {
00035 return (remoteFlag);
00036 } else {
00037 rodsLog (LOG_NOTICE,
00038 "rsFileReaddir: resolveHost returned unrecognized value %d",
00039 remoteFlag);
00040 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00041 }
00042 }
00043
00044
00045
00046 return (status);
00047 }
00048
00049 int
00050 remoteFileReaddir (rsComm_t *rsComm, fileReaddirInp_t *fileReaddirInp,
00051 rodsDirent_t **fileReaddirOut, rodsServerHost_t *rodsServerHost)
00052 {
00053 int status;
00054
00055 if (rodsServerHost == NULL) {
00056 rodsLog (LOG_NOTICE,
00057 "remoteFileReaddir: Invalid rodsServerHost");
00058 return SYS_INVALID_SERVER_HOST;
00059 }
00060
00061 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00062 return status;
00063 }
00064
00065 fileReaddirInp->fileInx = convL3descInx (fileReaddirInp->fileInx);
00066 status = rcFileReaddir (rodsServerHost->conn, fileReaddirInp, fileReaddirOut);
00067
00068 if (status < 0) {
00069 if (status != -1) {
00070 rodsLog (LOG_NOTICE,
00071 "remoteFileReaddir: rcFileReaddir failed for %s",
00072 FileDesc[fileReaddirInp->fileInx].fileName);
00073 }
00074 }
00075
00076 return status;
00077 }
00078
00079
00080
00081 int _rsFileReaddir( rsComm_t* _comm,
00082 fileReaddirInp_t* _file_readdir_inp,
00083 rodsDirent_t** _rods_dirent ) {
00084
00085
00086 eirods::collection_object coll_obj( FileDesc[ _file_readdir_inp->fileInx].fileName, 0, 0 );
00087 coll_obj.directory_pointer( reinterpret_cast< DIR* >( FileDesc[ _file_readdir_inp->fileInx].driverDep ) );
00088
00089
00090
00091 eirods::error readdir_err = fileReaddir( _comm,
00092 coll_obj,
00093 _rods_dirent );
00094 if( !readdir_err.ok() ) {
00095 std::stringstream msg;
00096 msg << "_rsFileReaddir: fileReaddir for ";
00097 msg << FileDesc[ _file_readdir_inp->fileInx].fileName;
00098 msg << ", status = ";
00099 msg << readdir_err.code();
00100 eirods::error err = PASS( false, readdir_err.code(), msg.str(), readdir_err );
00101 eirods::log ( err );
00102
00103 return readdir_err.code();
00104 } else {
00105
00106
00107 if( -1 == readdir_err.code() ) {
00108 return readdir_err.code();
00109 }
00110 }
00111
00112
00113
00114 return readdir_err.code();
00115
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130