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