00001
00002
00003 #include "subStructFileReaddir.h"
00004 #include "miscServerFunct.h"
00005 #include "dataObjOpr.h"
00006
00007
00008
00009 #include "eirods_structured_object.h"
00010
00011 int
00012 rsSubStructFileReaddir (rsComm_t *rsComm, subStructFileFdOprInp_t *subStructFileReaddirInp,
00013 rodsDirent_t **rodsDirent)
00014 {
00015 rodsServerHost_t *rodsServerHost;
00016 int remoteFlag;
00017 int status;
00018
00019 remoteFlag = resolveHost (&subStructFileReaddirInp->addr, &rodsServerHost);
00020
00021 if (remoteFlag == LOCAL_HOST) {
00022 status = _rsSubStructFileReaddir (rsComm, subStructFileReaddirInp, rodsDirent);
00023 } else if (remoteFlag == REMOTE_HOST) {
00024 status = remoteSubStructFileReaddir (rsComm, subStructFileReaddirInp, rodsDirent,
00025 rodsServerHost);
00026 } else {
00027 if (remoteFlag < 0) {
00028 return (remoteFlag);
00029 } else {
00030 rodsLog (LOG_NOTICE,
00031 "rsSubStructFileReaddir: resolveHost returned unrecognized value %d",
00032 remoteFlag);
00033 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00034 }
00035 }
00036
00037 return (status);
00038 }
00039
00040 int
00041 remoteSubStructFileReaddir (rsComm_t *rsComm, subStructFileFdOprInp_t *subStructFileReaddirInp,
00042 rodsDirent_t **rodsDirent, rodsServerHost_t *rodsServerHost)
00043 {
00044 int status;
00045
00046 if (rodsServerHost == NULL) {
00047 rodsLog (LOG_NOTICE,
00048 "remoteSubStructFileReaddir: Invalid rodsServerHost");
00049 return SYS_INVALID_SERVER_HOST;
00050 }
00051
00052 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00053 return status;
00054 }
00055
00056 status = rcSubStructFileReaddir (rodsServerHost->conn, subStructFileReaddirInp,
00057 rodsDirent);
00058
00059 if (status < 0 && status != -1) {
00060 rodsLog (LOG_NOTICE,
00061 "remoteSubStructFileReaddir: rcFileReaddir failed for fd %d",
00062 subStructFileReaddirInp->fd);
00063 }
00064
00065 return status;
00066
00067 }
00068
00069 int _rsSubStructFileReaddir( rsComm_t* _comm,
00070 subStructFileFdOprInp_t* _read_inp,
00071 rodsDirent_t ** _dirent ) {
00072 if( !_read_inp ) {
00073 eirods::log( LOG_NOTICE, "XXXX _rsSubStructFileReaddir - null _read_inp" );
00074 return -1;
00075 }
00076
00077
00078
00079 eirods::structured_object struct_obj;
00080 struct_obj.comm( _comm );
00081 struct_obj.file_descriptor( _read_inp->fd );
00082
00083 struct_obj.resc_hier( eirods::EIRODS_LOCAL_USE_ONLY_RESOURCE );
00084
00085
00086
00087 eirods::error readdir_err = fileReaddir( _comm, struct_obj, _dirent );
00088 if( !readdir_err.ok() ) {
00089 std::stringstream msg;
00090 msg << "_rsSubStructFileReaddir - failed on call to fileReaddir for [";
00091 msg << struct_obj.physical_path();
00092 msg << "]";
00093 eirods::log( PASS( false, -1, msg.str(), readdir_err ) );
00094 return readdir_err.code();
00095
00096 } else {
00097 return readdir_err.code();
00098
00099 }
00100
00101 }
00102