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 #include "tarSubStructFileDriver.h"
00012
00013 int
00014 rsFileRmdir (rsComm_t *rsComm, fileRmdirInp_t *fileRmdirInp)
00015 {
00016 rodsServerHost_t *rodsServerHost;
00017 int remoteFlag;
00018 int status;
00019
00020 remoteFlag = resolveHost (&fileRmdirInp->addr, &rodsServerHost);
00021 if (remoteFlag == LOCAL_HOST) {
00022 status = _rsFileRmdir (rsComm, fileRmdirInp);
00023 } else if (remoteFlag == REMOTE_HOST) {
00024 status = remoteFileRmdir (rsComm, fileRmdirInp, rodsServerHost);
00025 } else {
00026 if (remoteFlag < 0) {
00027 return (remoteFlag);
00028 } else {
00029 rodsLog (LOG_NOTICE,
00030 "rsFileRmdir: resolveHost returned unrecognized value %d",
00031 remoteFlag);
00032 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00033 }
00034 }
00035
00036
00037
00038 return (status);
00039 }
00040
00041 int
00042 remoteFileRmdir (rsComm_t *rsComm, fileRmdirInp_t *fileRmdirInp,
00043 rodsServerHost_t *rodsServerHost)
00044 {
00045 int status;
00046
00047 if (rodsServerHost == NULL) {
00048 rodsLog (LOG_NOTICE,
00049 "remoteFileRmdir: Invalid rodsServerHost");
00050 return SYS_INVALID_SERVER_HOST;
00051 }
00052
00053 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00054 return status;
00055 }
00056
00057
00058 status = rcFileRmdir (rodsServerHost->conn, fileRmdirInp);
00059
00060 if (status < 0) {
00061 rodsLog (LOG_NOTICE,
00062 "remoteFileOpen: rcFileRmdir failed for %s",
00063 fileRmdirInp->dirName);
00064 }
00065
00066 return status;
00067 }
00068
00069 int
00070 _rsFileRmdir (rsComm_t *rsComm, fileRmdirInp_t *fileRmdirInp)
00071 {
00072 int status;
00073
00074 if ((fileRmdirInp->flags & RMDIR_RECUR) != 0) {
00075
00076
00077
00078 void *dirPtr = NULL;
00079 #if defined(solaris_platform)
00080 char fileDirent[sizeof (struct dirent) + MAX_NAME_LEN];
00081 struct dirent *myFileDirent = (struct dirent *) fileDirent;
00082 #else
00083 struct dirent fileDirent;
00084 struct dirent *myFileDirent = &fileDirent;
00085 #endif
00086
00087 if (strstr (fileRmdirInp->dirName, CACHE_DIR_STR) == NULL) {
00088 rodsLog (LOG_ERROR,
00089 "_rsFileRmdir: recursive rm of non cachedir path %s",
00090 fileRmdirInp->dirName);
00091 return (SYS_INVALID_FILE_PATH);
00092 }
00093
00094 status = fileOpendir (fileRmdirInp->fileType, rsComm,
00095 fileRmdirInp->dirName, &dirPtr);
00096
00097 if (status < 0) {
00098 rodsLog (LOG_NOTICE,
00099 "_rsFileRmdir: fileOpendir for %s, status = %d",
00100 fileRmdirInp->dirName, status);
00101 return (status);
00102 }
00103
00104 while ((status = fileReaddir (fileRmdirInp->fileType, rsComm,
00105 dirPtr, myFileDirent)) >= 0) {
00106 struct stat statbuf;
00107 char myPath[MAX_NAME_LEN];
00108
00109 if (strcmp (myFileDirent->d_name, ".") == 0 ||
00110 strcmp (myFileDirent->d_name, "..") == 0) {
00111 continue;
00112 }
00113
00114 snprintf (myPath, MAX_NAME_LEN, "%s/%s",
00115 fileRmdirInp->dirName, myFileDirent->d_name);
00116
00117 status = fileStat (fileRmdirInp->fileType, rsComm,
00118 myPath, &statbuf);
00119 if (status < 0) {
00120 rodsLog (LOG_NOTICE,
00121 "_rsFileRmdir: fileStat for %s, status = %d",
00122 myPath, status);
00123 fileClosedir (fileRmdirInp->fileType, rsComm, dirPtr);
00124 return (status);
00125 }
00126 if ((statbuf.st_mode & S_IFREG) != 0) {
00127 status = fileUnlink (fileRmdirInp->fileType, rsComm, myPath);
00128 } else if ((statbuf.st_mode & S_IFDIR) != 0) {
00129
00130 fileRmdirInp_t myRmdirInp;
00131 memset (&myRmdirInp, 0, sizeof (myRmdirInp));
00132 myRmdirInp.fileType = fileRmdirInp->fileType;
00133 myRmdirInp.flags = fileRmdirInp->flags;
00134 rstrcpy (myRmdirInp.dirName, myPath, MAX_NAME_LEN);
00135 status = _rsFileRmdir (rsComm, &myRmdirInp);
00136 } else {
00137 rodsLog (LOG_NOTICE,
00138 "_rsFileRmdir: for %s, status = %d",
00139 myPath, status);
00140
00141 }
00142 if (status < 0) {
00143 rodsLog (LOG_NOTICE,
00144 "_rsFileRmdir: rm of %s failed, status = %d",
00145 myPath, status);
00146 fileClosedir (fileRmdirInp->fileType, rsComm, dirPtr);
00147 return (status);
00148 }
00149 }
00150 fileClosedir (fileRmdirInp->fileType, rsComm, dirPtr);
00151 if (status < 0 && status != -1) {
00152 return (status);
00153 }
00154 }
00155 status = fileRmdir (fileRmdirInp->fileType, rsComm, fileRmdirInp->dirName);
00156
00157 if (status < 0) {
00158 rodsLog (LOG_NOTICE,
00159 "_rsFileRmdir: fileRmdir for %s, status = %d",
00160 fileRmdirInp->dirName, status);
00161 return (status);
00162 }
00163
00164 return (status);
00165 }