00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "fileSyncToArch.h"
00011 #include "fileOpr.h"
00012 #include "miscServerFunct.h"
00013 #include "dataObjOpr.h"
00014 #include "physPath.h"
00015
00016
00017
00018 #include "eirods_log.h"
00019 #include "eirods_file_object.h"
00020 #include "eirods_collection_object.h"
00021 #include "eirods_stacktrace.h"
00022
00023 int
00024 rsFileSyncToArch (rsComm_t *rsComm, fileStageSyncInp_t *fileSyncToArchInp,
00025 char **outFileName)
00026 {
00027 rodsServerHost_t *rodsServerHost;
00028 int remoteFlag;
00029 int status;
00030
00031 remoteFlag = resolveHost (&fileSyncToArchInp->addr, &rodsServerHost);
00032
00033 if (remoteFlag < 0) {
00034 return (remoteFlag);
00035 } else {
00036 status = rsFileSyncToArchByHost (rsComm, fileSyncToArchInp,
00037 outFileName, rodsServerHost);
00038 return (status);
00039 }
00040 }
00041
00042 int
00043 rsFileSyncToArchByHost (rsComm_t *rsComm,
00044 fileStageSyncInp_t *fileSyncToArchInp, char **outFileName,
00045 rodsServerHost_t *rodsServerHost)
00046 {
00047 int status;
00048 int remoteFlag;
00049
00050 if (rodsServerHost == NULL) {
00051 rodsLog (LOG_NOTICE,
00052 "rsFileSyncToArchByHost: Input NULL rodsServerHost");
00053 return (SYS_INTERNAL_NULL_INPUT_ERR);
00054 }
00055
00056 remoteFlag = rodsServerHost->localFlag;
00057
00058 if (remoteFlag == LOCAL_HOST) {
00059 status = _rsFileSyncToArch (rsComm, fileSyncToArchInp, outFileName);
00060 } else if (remoteFlag == REMOTE_HOST) {
00061 status = remoteFileSyncToArch (rsComm, fileSyncToArchInp,
00062 outFileName, rodsServerHost);
00063 } else {
00064 if (remoteFlag < 0) {
00065 return (remoteFlag);
00066 } else {
00067 rodsLog (LOG_NOTICE,
00068 "rsFileSyncToArchByHost: resolveHost returned value %d",
00069 remoteFlag);
00070 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00071 }
00072 }
00073
00074 return (status);
00075 }
00076
00077 int
00078 remoteFileSyncToArch (rsComm_t *rsComm,
00079 fileStageSyncInp_t *fileSyncToArchInp, char **outFileName,
00080 rodsServerHost_t *rodsServerHost)
00081 {
00082 int status;
00083
00084 if (rodsServerHost == NULL) {
00085 rodsLog (LOG_NOTICE,
00086 "remoteFileSyncToArch: Invalid rodsServerHost");
00087 return SYS_INVALID_SERVER_HOST;
00088 }
00089
00090 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00091 return status;
00092 }
00093
00094 status = rcFileSyncToArch (rodsServerHost->conn, fileSyncToArchInp,
00095 outFileName);
00096
00097 if (status < 0) {
00098 rodsLog (LOG_NOTICE,
00099 "remoteFileSyncToArch: rcFileSyncToArch failed for %s",
00100 fileSyncToArchInp->filename);
00101 }
00102
00103 return status;
00104 }
00105
00106
00107
00108 int _rsFileSyncToArch( rsComm_t *rsComm, fileStageSyncInp_t *fileSyncToArchInp, char **outFileName ) {
00109
00110
00111
00112 char myFileName[MAX_NAME_LEN];
00113
00114
00115
00116 *outFileName = NULL;
00117 rstrcpy( myFileName, fileSyncToArchInp->filename, MAX_NAME_LEN );
00118
00119 if(fileSyncToArchInp->objPath[0] == '\0') {
00120 std::stringstream msg;
00121 msg << __FUNCTION__;
00122 msg << " - Empty logical path.";
00123 eirods::log(LOG_ERROR, msg.str());
00124 return -1;
00125 }
00126
00127
00128
00129 eirods::file_object file_obj( rsComm,
00130 fileSyncToArchInp->objPath,
00131 fileSyncToArchInp->filename, "", 0,
00132 fileSyncToArchInp->mode,
00133 fileSyncToArchInp->flags );
00134 eirods::error sync_err = fileSyncToArch( rsComm, file_obj, fileSyncToArchInp->cacheFilename );
00135
00136 if( !sync_err.ok() ) {
00137
00138 if (getErrno (sync_err.code()) == ENOENT) {
00139
00140
00141 mkDirForFilePath( rsComm,"/", fileSyncToArchInp->filename, getDefDirMode() );
00142 } else if (getErrno (sync_err.code()) == EEXIST) {
00143
00144
00145 eirods::collection_object coll_obj( fileSyncToArchInp->filename, 0, 0 );
00146 eirods::error rmdir_err = fileRmdir( rsComm, coll_obj );
00147 if( !rmdir_err.ok() ) {
00148 std::stringstream msg;
00149 msg << "_rsFileSyncToArch: fileRmdir for ";
00150 msg << fileSyncToArchInp->filename;
00151 msg << ", status = ";
00152 msg << rmdir_err.code();
00153 eirods::error err = PASS( false, rmdir_err.code(), msg.str(), sync_err );
00154 eirods::log ( err );
00155 }
00156 } else {
00157 std::stringstream msg;
00158 msg << "_rsFileSyncToArch: fileSyncToArch for ";
00159 msg << myFileName;
00160 msg << ", status = ";
00161 msg << sync_err.code();
00162 eirods::error err = PASS( false, sync_err.code(), msg.str(), sync_err );
00163 eirods::log ( err );
00164 return sync_err.code();
00165 }
00166
00167
00168
00169 sync_err = fileSyncToArch( rsComm, file_obj, fileSyncToArchInp->cacheFilename );
00170 if( !sync_err.ok() ) {
00171 std::stringstream msg;
00172 msg << "_rsFileSyncToArch: fileSyncToArch for ";
00173 msg << myFileName;
00174 msg << ", status = ";
00175 msg << sync_err.code();
00176 eirods::error err = PASS( false, sync_err.code(), msg.str(), sync_err );
00177 eirods::log ( err );
00178 }
00179
00180 }
00181
00182
00183
00184 if( strcmp( myFileName, fileSyncToArchInp->filename ) != 0 ) {
00185 *outFileName = strdup (myFileName);
00186 }
00187
00188 return (sync_err.code());
00189
00190 }
00191