00001
00002
00003
00004
00005
00006
00007
00008 #include "fileRmdir.h"
00009 #include "fileOpendir.h"
00010 #include "fileReaddir.h"
00011 #include "fileClosedir.h"
00012 #include "miscServerFunct.h"
00013
00014
00015
00016
00017 #include "eirods_log.h"
00018 #include "eirods_collection_object.h"
00019
00020 #define CACHE_DIR_STR "cacheDir" // FIXME JMC - need a better place for this. also used in tar plugin
00021
00022 int
00023 rsFileRmdir (rsComm_t *rsComm, fileRmdirInp_t *fileRmdirInp)
00024 {
00025 rodsServerHost_t *rodsServerHost;
00026 int remoteFlag;
00027 int status;
00028
00029 remoteFlag = resolveHost (&fileRmdirInp->addr, &rodsServerHost);
00030 if (remoteFlag == LOCAL_HOST) {
00031 status = _rsFileRmdir (rsComm, fileRmdirInp);
00032 } else if (remoteFlag == REMOTE_HOST) {
00033 status = remoteFileRmdir (rsComm, fileRmdirInp, rodsServerHost);
00034 } else {
00035 if (remoteFlag < 0) {
00036 return (remoteFlag);
00037 } else {
00038 rodsLog (LOG_NOTICE,
00039 "rsFileRmdir: resolveHost returned unrecognized value %d",
00040 remoteFlag);
00041 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00042 }
00043 }
00044
00045
00046
00047 return (status);
00048 }
00049
00050 int
00051 remoteFileRmdir (rsComm_t *rsComm, fileRmdirInp_t *fileRmdirInp,
00052 rodsServerHost_t *rodsServerHost)
00053 {
00054 int status;
00055
00056 if (rodsServerHost == NULL) {
00057 rodsLog (LOG_NOTICE,
00058 "remoteFileRmdir: Invalid rodsServerHost");
00059 return SYS_INVALID_SERVER_HOST;
00060 }
00061
00062 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00063 return status;
00064 }
00065
00066
00067 status = rcFileRmdir (rodsServerHost->conn, fileRmdirInp);
00068
00069 if (status < 0) {
00070 rodsLog (LOG_NOTICE,
00071 "remoteFileOpen: rcFileRmdir failed for %s",
00072 fileRmdirInp->dirName);
00073 }
00074
00075 return status;
00076 }
00077
00078
00079
00080 int _rsFileRmdir(
00081 rsComm_t* _comm,
00082 fileRmdirInp_t* _rmdir_inp ) {
00083
00084 int status = 0;
00085 eirods::collection_object_ptr coll_obj(
00086 new eirods::collection_object(
00087 _rmdir_inp->dirName,
00088 _rmdir_inp->rescHier,
00089 0, 0 ) );
00090
00091 if ((_rmdir_inp->flags & RMDIR_RECUR) != 0) {
00092
00093
00094
00095
00096
00097 struct rodsDirent* myFileDirent = 0;
00098
00099
00100
00101
00102 if( strstr( _rmdir_inp->dirName, CACHE_DIR_STR) == NULL ) {
00103 rodsLog( LOG_ERROR,"_rsFileRmdir: recursive rm of non cachedir path %s",
00104 _rmdir_inp->dirName );
00105 return (SYS_INVALID_FILE_PATH);
00106 }
00107
00108
00109
00110 eirods::error opendir_err = fileOpendir( _comm, coll_obj );
00111
00112
00113
00114 if( !opendir_err.ok() ) {
00115 std::stringstream msg;
00116 msg << "fileOpendir failed for [";
00117 msg << _rmdir_inp->dirName;
00118 msg << "]";
00119 eirods::error err = PASSMSG( msg.str(), opendir_err );
00120 eirods::log ( err );
00121 return (status);
00122 }
00123
00124
00125
00126 eirods::error readdir_err = fileReaddir( _comm, coll_obj, &myFileDirent );
00127 while( readdir_err.ok() && 0 == readdir_err.code() ) {
00128 struct stat statbuf;
00129 char myPath[MAX_NAME_LEN];
00130
00131
00132
00133 if( strcmp( myFileDirent->d_name, "." ) == 0 ||
00134 strcmp( myFileDirent->d_name, ".." ) == 0) {
00135 readdir_err = fileReaddir( _comm, coll_obj, &myFileDirent );
00136 continue;
00137 }
00138
00139
00140
00141 snprintf( myPath, MAX_NAME_LEN, "%s/%s", &_rmdir_inp->dirName[0], &myFileDirent->d_name[0] );
00142
00143
00144
00145 eirods::collection_object_ptr myPath_obj(
00146 new eirods::collection_object(
00147 myPath,
00148 _rmdir_inp->rescHier,
00149 0, 0 ) );
00150 eirods::error stat_err = fileStat( _comm, myPath_obj, &statbuf );
00151 if( !stat_err.ok() ) {
00152 std::stringstream msg;
00153 msg << "fileStat failed for [";
00154 msg << myPath;
00155 msg << "]";
00156 eirods::error log_err = PASSMSG( msg.str(), stat_err );
00157 eirods::log( log_err );
00158
00159
00160
00161 eirods::error closedir_err = fileClosedir( _comm, myPath_obj );
00162 if( !closedir_err.ok() ) {
00163 std::stringstream msg;
00164 msg << "fileClosedir for [";
00165 msg << myPath;
00166 msg << "]";
00167 eirods::error log_err = PASSMSG( msg.str(), closedir_err );
00168 eirods::log( log_err );
00169 }
00170
00171 return (status);
00172
00173 }
00174
00175
00176
00177 if ((statbuf.st_mode & S_IFREG) != 0) {
00178
00179
00180 eirods::error unlink_err = fileUnlink( _comm, myPath_obj );
00181 if( !unlink_err.ok() ) {
00182 eirods::error log_err = PASSMSG( "error during unlink.", unlink_err );
00183 eirods::log( log_err );
00184 }
00185
00186 } else if ((statbuf.st_mode & S_IFDIR) != 0) {
00187
00188
00189 fileRmdirInp_t myRmdirInp;
00190 memset( &myRmdirInp, 0, sizeof( myRmdirInp ) );
00191
00192 myRmdirInp.fileType = _rmdir_inp->fileType;
00193 myRmdirInp.flags = _rmdir_inp->flags;
00194 rstrcpy( myRmdirInp.dirName, myPath, MAX_NAME_LEN );
00195 rstrcpy( myRmdirInp.rescHier, _rmdir_inp->rescHier, MAX_NAME_LEN);
00196
00197
00198
00199 status = _rsFileRmdir (_comm, &myRmdirInp);
00200
00201 } else {
00202 rodsLog( LOG_NOTICE, "_rsFileRmdir: for %s, status = %d", myPath, status);
00203 }
00204
00205
00206
00207 if( status < 0 ) {
00208 rodsLog( LOG_NOTICE,"_rsFileRmdir: rm of %s failed, status = %d", myPath, status );
00209
00210
00211
00212 eirods::error closedir_err = fileClosedir( _comm, myPath_obj );
00213 if( !closedir_err.ok() ) {
00214 std::stringstream msg;
00215 msg << "fileClosedir failed for [";
00216 msg << myPath;
00217 msg << "]";
00218 eirods::error log_err = PASSMSG( msg.str(), closedir_err );
00219 eirods::log( log_err );
00220 }
00221
00222 return closedir_err.code();
00223
00224 }
00225
00226
00227
00228 readdir_err = fileReaddir( _comm, coll_obj, &myFileDirent );
00229
00230 }
00231
00232
00233
00234 eirods::error closedir_err = fileClosedir( _comm, coll_obj );
00235 if( !closedir_err.ok() ) {
00236 std::stringstream msg;
00237 msg << "fileClosedir failed for [";
00238 msg << _rmdir_inp->dirName;
00239 msg << "]";
00240 eirods::error log_err = PASSMSG( msg.str(), closedir_err );
00241 eirods::log( log_err );
00242 }
00243
00244 if( status < 0 && status != -1 ) {
00245 return (status);
00246 }
00247
00248 }
00249
00250
00251
00252 eirods::error rmdir_err = fileRmdir( _comm, coll_obj );
00253 if( !rmdir_err.ok() ) {
00254 std::stringstream msg;
00255 msg << "fileRmdir failed for [";
00256 msg << _rmdir_inp->dirName;
00257 msg << "]";
00258 eirods::error err = PASSMSG( msg.str(), rmdir_err );
00259 eirods::log ( err );
00260 }
00261
00262 return rmdir_err.code();
00263
00264 }
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286