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 (rsComm_t *rsComm, fileRmdirInp_t *fileRmdirInp) {
00081
00082 int status = 0;
00083 eirods::collection_object coll_obj( fileRmdirInp->dirName, fileRmdirInp->rescHier, 0, 0 );
00084
00085 if ((fileRmdirInp->flags & RMDIR_RECUR) != 0) {
00086
00087
00088
00089
00090
00091 struct rodsDirent* myFileDirent = 0;
00092
00093
00094
00095
00096 if( strstr( fileRmdirInp->dirName, CACHE_DIR_STR) == NULL ) {
00097 rodsLog( LOG_ERROR,"_rsFileRmdir: recursive rm of non cachedir path %s",
00098 fileRmdirInp->dirName );
00099 return (SYS_INVALID_FILE_PATH);
00100 }
00101
00102
00103
00104 eirods::error opendir_err = fileOpendir( rsComm, coll_obj );
00105
00106
00107
00108 if( !opendir_err.ok() ) {
00109 std::stringstream msg;
00110 msg << "fileOpendir failed for [";
00111 msg << fileRmdirInp->dirName;
00112 msg << "]";
00113 eirods::error err = PASSMSG( msg.str(), opendir_err );
00114 eirods::log ( err );
00115 return (status);
00116 }
00117
00118
00119
00120 eirods::error readdir_err = fileReaddir( rsComm, coll_obj, &myFileDirent );
00121 while( readdir_err.ok() && 0 == readdir_err.code() ) {
00122 struct stat statbuf;
00123 char myPath[MAX_NAME_LEN];
00124
00125
00126
00127 if( strcmp( myFileDirent->d_name, "." ) == 0 ||
00128 strcmp( myFileDirent->d_name, ".." ) == 0) {
00129 readdir_err = fileReaddir( rsComm, coll_obj, &myFileDirent );
00130 continue;
00131 }
00132
00133
00134
00135 snprintf( myPath, MAX_NAME_LEN, "%s/%s", fileRmdirInp->dirName, &myFileDirent->d_name );
00136
00137
00138
00139 eirods::collection_object myPath_obj( myPath, fileRmdirInp->rescHier, 0, 0 );
00140 eirods::error stat_err = fileStat( rsComm, myPath_obj, &statbuf );
00141 if( !stat_err.ok() ) {
00142 std::stringstream msg;
00143 msg << "fileStat failed for [";
00144 msg << myPath;
00145 msg << "]";
00146 eirods::error log_err = PASSMSG( 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 << "fileClosedir for [";
00155 msg << myPath;
00156 msg << "]";
00157 eirods::error log_err = PASSMSG( msg.str(), closedir_err );
00158 eirods::log( log_err );
00159 }
00160
00161 return (status);
00162
00163 }
00164
00165
00166
00167 if ((statbuf.st_mode & S_IFREG) != 0) {
00168
00169
00170 eirods::error unlink_err = fileUnlink( rsComm, myPath_obj );
00171 if( !unlink_err.ok() ) {
00172 eirods::error log_err = PASSMSG( "error during unlink.", unlink_err );
00173 eirods::log( log_err );
00174 }
00175
00176 } else if ((statbuf.st_mode & S_IFDIR) != 0) {
00177
00178
00179 fileRmdirInp_t myRmdirInp;
00180 memset( &myRmdirInp, 0, sizeof( myRmdirInp ) );
00181
00182 myRmdirInp.fileType = fileRmdirInp->fileType;
00183 myRmdirInp.flags = fileRmdirInp->flags;
00184 rstrcpy( myRmdirInp.dirName, myPath, MAX_NAME_LEN );
00185 rstrcpy( myRmdirInp.rescHier, fileRmdirInp->rescHier, MAX_NAME_LEN);
00186
00187
00188
00189 status = _rsFileRmdir (rsComm, &myRmdirInp);
00190
00191 } else {
00192 rodsLog( LOG_NOTICE, "_rsFileRmdir: for %s, status = %d", myPath, status);
00193 }
00194
00195
00196
00197 if( status < 0 ) {
00198 rodsLog( LOG_NOTICE,"_rsFileRmdir: rm of %s failed, status = %d", myPath, status );
00199
00200
00201
00202 eirods::error closedir_err = fileClosedir( rsComm, myPath_obj );
00203 if( !closedir_err.ok() ) {
00204 std::stringstream msg;
00205 msg << "fileClosedir failed for [";
00206 msg << myPath;
00207 msg << "]";
00208 eirods::error log_err = PASSMSG( msg.str(), closedir_err );
00209 eirods::log( log_err );
00210 }
00211
00212 return closedir_err.code();
00213
00214 }
00215
00216
00217
00218 readdir_err = fileReaddir( rsComm, coll_obj, &myFileDirent );
00219
00220 }
00221
00222
00223
00224 eirods::error closedir_err = fileClosedir( rsComm, coll_obj );
00225 if( !closedir_err.ok() ) {
00226 std::stringstream msg;
00227 msg << "fileClosedir failed for [";
00228 msg << fileRmdirInp->dirName;
00229 msg << "]";
00230 eirods::error log_err = PASSMSG( msg.str(), closedir_err );
00231 eirods::log( log_err );
00232 }
00233
00234 if( status < 0 && status != -1 ) {
00235 return (status);
00236 }
00237
00238 }
00239
00240
00241
00242 eirods::error rmdir_err = fileRmdir( rsComm, coll_obj );
00243 if( !rmdir_err.ok() ) {
00244 std::stringstream msg;
00245 msg << "fileRmdir failed for [";
00246 msg << fileRmdirInp->dirName;
00247 msg << "]";
00248 eirods::error err = PASSMSG( msg.str(), rmdir_err );
00249 eirods::log ( err );
00250 }
00251
00252 return rmdir_err.code();
00253
00254 }
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276