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(
00101 rsComm_t* _comm,
00102 fileCreateInp_t* _create_inp,
00103 rodsServerHost_t* _server_host ) {
00104
00105
00106
00107
00108
00109
00110 if( ( _create_inp->otherFlags & NO_CHK_PERM_FLAG ) == 0 ) {
00111 int status = chkFilePathPerm(
00112 _comm,
00113 _create_inp,
00114 _server_host,
00115 DO_CHK_PATH_PERM );
00116 if( status < 0 ) {
00117 rodsLog( LOG_ERROR, "_rsFileCreate - chkFilePathPerm returned %d", status );
00118 return (status);
00119 }
00120 }
00121
00122 if(_create_inp->objPath[0] == '\0') {
00123 std::stringstream msg;
00124 msg << __FUNCTION__;
00125 msg << " - Empty logical path.";
00126 eirods::log(LOG_ERROR, msg.str());
00127 return -1;
00128 }
00129
00130
00131
00132
00133 eirods::file_object_ptr file_obj( new eirods::file_object(
00134 _comm,
00135 _create_inp->objPath,
00136 _create_inp->fileName,
00137 _create_inp->resc_hier_,
00138 0,
00139 _create_inp->mode,
00140 _create_inp->flags ) );
00141 file_obj->in_pdmo(_create_inp->in_pdmo);
00142
00143 eirods::error create_err = fileCreate( _comm, file_obj );
00144
00145
00146
00147 if( !create_err.ok() ) {
00148
00149
00150 if( getErrno ( create_err.code() ) == ENOENT ) {
00151
00152
00153
00154 int status = mkDirForFilePath(
00155 _comm,
00156 "/",
00157 file_obj->physical_path().c_str(),
00158 getDefDirMode() );
00159 if(status != 0) {
00160 std::stringstream msg;
00161 msg << "Unable to make directory: \""
00162 << file_obj->physical_path()
00163 << "\"";
00164 eirods::log(LOG_ERROR, msg.str());
00165 return status;
00166 }
00167
00168 create_err = fileCreate( _comm, file_obj );
00169
00170
00171
00172
00173 if( !create_err.ok() ) {
00174 std::stringstream msg;
00175 msg << "ENOENT fileCreate for [";
00176 msg << _create_inp->fileName;
00177 msg << "]";
00178 eirods::error ret_err = PASSMSG( msg.str(), create_err );
00179 eirods::log( ret_err );
00180
00181 }
00182
00183 } else if( getErrno( create_err.code() ) == EEXIST ) {
00184
00185
00186 eirods::collection_object_ptr coll_obj(
00187 new eirods::collection_object(
00188 _create_inp->fileName,
00189 _create_inp->resc_hier_,
00190 0, 0 ) );
00191 eirods::error rmdir_err = fileRmdir( _comm, coll_obj );
00192 if( !rmdir_err.ok() ) {
00193 std::stringstream msg;
00194 msg << "EEXIST 1 fileRmdir for [";
00195 msg << _create_inp->fileName;
00196 msg << "]";
00197 eirods::error err = PASSMSG( msg.str(), rmdir_err );
00198 eirods::log ( err );
00199 }
00200
00201 create_err = fileCreate( _comm, file_obj );
00202
00203
00204
00205
00206 if( !create_err.ok() ) {
00207 std::stringstream msg;
00208 msg << "EEXIST 2 fileCreate for [";
00209 msg << _create_inp->fileName;
00210 msg << "]";
00211 eirods::error ret_err = PASSMSG( msg.str(), create_err );
00212 eirods::log( ret_err );
00213 }
00214
00215 } else {
00216 std::stringstream msg;
00217 msg << "UNHANDLED fileCreate for [";
00218 msg << _create_inp->fileName;
00219 msg << "]";
00220 eirods::error ret_err = PASSMSG( msg.str(), create_err );
00221 eirods::log( ret_err );
00222
00223 }
00224
00225 }
00226
00227 rstrcpy(
00228 _create_inp->resc_hier_,
00229 file_obj->resc_hier().c_str(),
00230 MAX_NAME_LEN );
00231 rstrcpy(
00232 _create_inp->fileName,
00233 file_obj->physical_path().c_str(),
00234 MAX_NAME_LEN );
00235
00236 return file_obj->file_descriptor();
00237
00238 }