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