00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "fileCreate.h"
00011 #include "fileOpr.h"
00012 #include "miscServerFunct.h"
00013 #include "dataObjOpr.h"
00014 #include "physPath.h"
00015 #include "rsGlobalExtern.h"
00016 #include "icatHighLevelRoutines.h"
00017
00018
00019
00020 #include "eirods_log.h"
00021 #include "eirods_file_object.h"
00022 #include "eirods_collection_object.h"
00023 #include "eirods_hierarchy_parser.h"
00024 #include "eirods_stacktrace.h"
00025 #include "eirods_resource_backport.h"
00026
00027
00028 #include <string>
00029
00030 int
00031 rsFileCreate (rsComm_t *rsComm, fileCreateInp_t *fileCreateInp)
00032 {
00033 rodsServerHost_t *rodsServerHost;
00034 int remoteFlag;
00035 int fileInx;
00036 int fd;
00037
00038
00039 eirods::error ret = eirods::get_host_for_hier_string( fileCreateInp->resc_hier_, remoteFlag, rodsServerHost );
00040 if( !ret.ok() ) {
00041 eirods::log( PASSMSG( "failed in call to eirods::get_host_for_hier_string", ret ) );
00042 return -1;
00043 }
00044
00045 if (remoteFlag == LOCAL_HOST) {
00046 fd = _rsFileCreate (rsComm, fileCreateInp, rodsServerHost);
00047 } else if (remoteFlag == REMOTE_HOST) {
00048 fd = remoteFileCreate (rsComm, fileCreateInp, rodsServerHost);
00049 } else {
00050 if (remoteFlag < 0) {
00051 return (remoteFlag);
00052 } else {
00053 rodsLog (LOG_NOTICE,
00054 "rsFileCreate: resolveHost returned unrecognized value %d",
00055 remoteFlag);
00056 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00057 }
00058 }
00059
00060 if (fd < 0) {
00061 return (fd);
00062 }
00063
00064 fileInx = allocAndFillFileDesc (rodsServerHost, fileCreateInp->objPath, fileCreateInp->fileName, fileCreateInp->resc_hier_,
00065 fileCreateInp->fileType, fd, fileCreateInp->mode);
00066
00067 return (fileInx);
00068 }
00069
00070 int
00071 remoteFileCreate (rsComm_t *rsComm, fileCreateInp_t *fileCreateInp,
00072 rodsServerHost_t *rodsServerHost)
00073 {
00074 int fileInx;
00075 int status;
00076
00077 if (rodsServerHost == NULL) {
00078 rodsLog (LOG_NOTICE,
00079 "remoteFileCreate: Invalid rodsServerHost");
00080 return SYS_INVALID_SERVER_HOST;
00081 }
00082
00083 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00084 return status;
00085 }
00086
00087 fileInx = rcFileCreate (rodsServerHost->conn, fileCreateInp);
00088
00089 if (fileInx < 0) {
00090 rodsLog (LOG_NOTICE,
00091 "remoteFileCreate: rcFileCreate failed for %s",
00092 fileCreateInp->fileName);
00093 }
00094
00095 return fileInx;
00096 }
00097
00098
00099
00100 int _rsFileCreate( rsComm_t *rsComm, fileCreateInp_t *fileCreateInp,
00101 rodsServerHost_t *rodsServerHost ) {
00102
00103
00104
00105
00106
00107
00108
00109 if( ( fileCreateInp->otherFlags & NO_CHK_PERM_FLAG ) == 0 ) {
00110 int status = chkFilePathPerm( rsComm, fileCreateInp, rodsServerHost, DO_CHK_PATH_PERM );
00111 if( status < 0 ) {
00112 rodsLog( LOG_ERROR, "_rsFileCreate - chkFilePathPerm returned %d", status );
00113 return (status);
00114 }
00115 }
00116
00117 if(fileCreateInp->objPath[0] == '\0') {
00118 std::stringstream msg;
00119 msg << __FUNCTION__;
00120 msg << " - Empty logical path.";
00121 eirods::log(LOG_ERROR, msg.str());
00122 return -1;
00123 }
00124
00125
00126
00127
00128 eirods::file_object file_obj( rsComm, fileCreateInp->objPath, fileCreateInp->fileName, fileCreateInp->resc_hier_, 0, fileCreateInp->mode, fileCreateInp->flags );
00129 if(fileCreateInp->in_pdmo) {
00130 file_obj.in_pdmo(true);
00131 }
00132
00133 eirods::error create_err = fileCreate( rsComm, file_obj );
00134
00135
00136
00137 if( !create_err.ok() ) {
00138
00139
00140
00141 if( getErrno ( create_err.code() ) == ENOENT ) {
00142
00143
00144
00145 int status = mkDirForFilePath( rsComm, "/", file_obj.physical_path().c_str(), getDefDirMode() );
00146 if(status != 0) {
00147 std::stringstream msg;
00148 msg << "Unable to make directory: \"" << file_obj.physical_path() << "\"";
00149 eirods::log(LOG_ERROR, msg.str());
00150 return status;
00151 }
00152
00153 create_err = fileCreate( rsComm, file_obj );
00154
00155
00156
00157
00158 if( !create_err.ok() ) {
00159 std::stringstream msg;
00160 msg << "ENOENT fileCreate for [";
00161 msg << fileCreateInp->fileName;
00162 msg << "]";
00163 eirods::error ret_err = PASSMSG( msg.str(), create_err );
00164 eirods::log( ret_err );
00165
00166 }
00167
00168 } else if( getErrno( create_err.code() ) == EEXIST ) {
00169
00170
00171 eirods::collection_object coll_obj( fileCreateInp->fileName, fileCreateInp->resc_hier_, 0, 0 );
00172 eirods::error rmdir_err = fileRmdir( rsComm, coll_obj );
00173 if( !rmdir_err.ok() ) {
00174 std::stringstream msg;
00175 msg << "EEXIST 1 fileRmdir for [";
00176 msg << fileCreateInp->fileName;
00177 msg << "]";
00178 eirods::error err = PASSMSG( msg.str(), rmdir_err );
00179 eirods::log ( err );
00180 }
00181
00182 create_err = fileCreate( rsComm, file_obj );
00183
00184
00185
00186
00187 if( !create_err.ok() ) {
00188 std::stringstream msg;
00189 msg << "EEXIST 2 fileCreate for [";
00190 msg << fileCreateInp->fileName;
00191 msg << "]";
00192 eirods::error ret_err = PASSMSG( msg.str(), create_err );
00193 eirods::log( ret_err );
00194 }
00195
00196 } else {
00197 std::stringstream msg;
00198 msg << "UNHANDLED fileCreate for [";
00199 msg << fileCreateInp->fileName;
00200 msg << "]";
00201 eirods::error ret_err = PASSMSG( msg.str(), create_err );
00202 eirods::log( ret_err );
00203
00204 }
00205
00206 }
00207
00208 rstrcpy(fileCreateInp->resc_hier_, file_obj.resc_hier().c_str(), MAX_NAME_LEN);
00209 rstrcpy(fileCreateInp->fileName, file_obj.physical_path().c_str(), MAX_NAME_LEN);
00210 return file_obj.file_descriptor();
00211
00212 }