00001
00002
00003
00004
00005
00006 #include "fileReaddir.h"
00007 #include "miscServerFunct.h"
00008 #include "rsGlobalExtern.h"
00009
00010 int
00011 rsFileReaddir (rsComm_t *rsComm, fileReaddirInp_t *fileReaddirInp,
00012 rodsDirent_t **fileReaddirOut)
00013 {
00014 rodsServerHost_t *rodsServerHost;
00015 int remoteFlag;
00016 int status;
00017
00018 *fileReaddirOut = NULL;
00019
00020 remoteFlag = getServerHostByFileInx (fileReaddirInp->fileInx,
00021 &rodsServerHost);
00022
00023 if (remoteFlag == LOCAL_HOST) {
00024 status = _rsFileReaddir (rsComm, fileReaddirInp, fileReaddirOut);
00025 } else if (remoteFlag == REMOTE_HOST) {
00026 status = remoteFileReaddir (rsComm, fileReaddirInp, fileReaddirOut,
00027 rodsServerHost);
00028 } else {
00029 if (remoteFlag < 0) {
00030 return (remoteFlag);
00031 } else {
00032 rodsLog (LOG_NOTICE,
00033 "rsFileReaddir: resolveHost returned unrecognized value %d",
00034 remoteFlag);
00035 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00036 }
00037 }
00038
00039
00040
00041 return (status);
00042 }
00043
00044 int
00045 remoteFileReaddir (rsComm_t *rsComm, fileReaddirInp_t *fileReaddirInp,
00046 rodsDirent_t **fileReaddirOut, rodsServerHost_t *rodsServerHost)
00047 {
00048 int status;
00049
00050 if (rodsServerHost == NULL) {
00051 rodsLog (LOG_NOTICE,
00052 "remoteFileReaddir: Invalid rodsServerHost");
00053 return SYS_INVALID_SERVER_HOST;
00054 }
00055
00056 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00057 return status;
00058 }
00059
00060 fileReaddirInp->fileInx = convL3descInx (fileReaddirInp->fileInx);
00061 status = rcFileReaddir (rodsServerHost->conn, fileReaddirInp, fileReaddirOut);
00062
00063 if (status < 0) {
00064 if (status != -1) {
00065 rodsLog (LOG_NOTICE,
00066 "remoteFileReaddir: rcFileReaddir failed for %s",
00067 FileDesc[fileReaddirInp->fileInx].fileName);
00068 }
00069 }
00070
00071 return status;
00072 }
00073
00074 int
00075 _rsFileReaddir (rsComm_t *rsComm, fileReaddirInp_t *fileReaddirInp,
00076 rodsDirent_t **fileReaddirOut)
00077 {
00078 int status;
00079
00080 #if defined(solaris_platform)
00081 char fileDirent[sizeof (struct dirent) + MAX_NAME_LEN];
00082 struct dirent *myFileDirent = (struct dirent *) fileDirent;
00083 #else
00084 struct dirent fileDirent;
00085 struct dirent *myFileDirent = &fileDirent;
00086 #endif
00087
00088 status = fileReaddir (FileDesc[fileReaddirInp->fileInx].fileType, rsComm,
00089 FileDesc[fileReaddirInp->fileInx].driverDep, myFileDirent);
00090
00091 if (status < 0) {
00092 if (status != -1) {
00093 rodsLog (LOG_NOTICE,
00094 "_rsFileReaddir: fileReaddir for %s, status = %d",
00095 FileDesc[fileReaddirInp->fileInx].fileName, status);
00096 }
00097 return (status);
00098 }
00099
00100 *fileReaddirOut = (rodsDirent_t*)malloc (sizeof (rodsDirent_t));
00101
00102 status = direntToRodsDirent (*fileReaddirOut, myFileDirent);
00103
00104 if (status < 0) {
00105 free (*fileReaddirOut);
00106 *fileReaddirOut = NULL;
00107 }
00108
00109 return (status);
00110 }