KDECore
ktempdir.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024
00025 #include <sys/types.h>
00026
00027 #ifdef HAVE_SYS_STAT_H
00028 #include <sys/stat.h>
00029 #endif
00030
00031 #include <fcntl.h>
00032 #include <stdlib.h>
00033 #include <unistd.h>
00034 #include <dirent.h>
00035
00036 #ifdef HAVE_TEST
00037 #include <test.h>
00038 #endif
00039 #ifdef HAVE_PATHS_H
00040 #include <paths.h>
00041 #endif
00042
00043 #ifndef _PATH_TMP
00044 #define _PATH_TMP "/tmp"
00045 #endif
00046
00047 #include <qdatetime.h>
00048 #include <qdir.h>
00049
00050 #include "kglobal.h"
00051 #include "kapplication.h"
00052 #include "kinstance.h"
00053 #include "ktempdir.h"
00054 #include "kstandarddirs.h"
00055 #include "kprocess.h"
00056 #include <kdebug.h>
00057 #include "kde_file.h"
00058
00059 KTempDir::KTempDir(QString directoryPrefix, int mode)
00060 {
00061 bAutoDelete = false;
00062 bExisting = false;
00063 mError=0;
00064 if (directoryPrefix.isEmpty())
00065 {
00066 directoryPrefix = locateLocal("tmp", KGlobal::instance()->instanceName());
00067 }
00068 (void) create(directoryPrefix , mode);
00069 }
00070
00071 bool
00072 KTempDir::create(const QString &directoryPrefix, int mode)
00073 {
00074
00075 (void) KApplication::random();
00076
00077 QCString nme = QFile::encodeName(directoryPrefix) + "XXXXXX";
00078 char *realName;
00079 if((realName=mkdtemp(nme.data())) == 0)
00080 {
00081
00082 QCString nme = QFile::encodeName(directoryPrefix) + "XXXXXX";
00083 qWarning("KTempDir: Error trying to create %s: %s", nme.data(), strerror(errno));
00084 mError = errno;
00085 mTmpName = QString::null;
00086 return false;
00087 }
00088
00089
00090 QCString realNameStr(realName);
00091 mTmpName = QFile::decodeName(realNameStr)+"/";
00092 kdDebug(180) << "KTempDir: Temporary directory created :" << mTmpName << endl;
00093 mode_t tmp = 0;
00094 mode_t umsk = umask(tmp);
00095 umask(umsk);
00096 chmod(nme, mode&(~umsk));
00097
00098
00099 bExisting = true;
00100
00101
00102 chown(nme, getuid(), getgid());
00103 return true;
00104 }
00105
00106 KTempDir::~KTempDir()
00107 {
00108 if (bAutoDelete)
00109 unlink();
00110
00111
00112
00113 }
00114
00115 int
00116 KTempDir::status() const
00117 {
00118 return mError;
00119 }
00120
00121 QString
00122 KTempDir::name() const
00123 {
00124 return mTmpName;
00125 }
00126
00127 bool
00128 KTempDir::existing() const
00129 {
00130 return bExisting;
00131 }
00132
00133 QDir *
00134 KTempDir::qDir()
00135 {
00136 if (bExisting) return new QDir(mTmpName);
00137 return 0;
00138 }
00139
00140 void
00141 KTempDir::unlink()
00142 {
00143 if (!bExisting) return;
00144 if (KTempDir::removeDir(mTmpName))
00145 mError=0;
00146 else
00147 mError=errno;
00148 bExisting=false;
00149 }
00150
00151
00152 static bool
00153 rmtree(const QCString& name)
00154 {
00155 kdDebug() << "Checking directory for remove " << name << endl;
00156 KDE_struct_stat st;
00157 if ( KDE_lstat( name.data(), &st ) == -1 )
00158 return false;
00159 if ( S_ISDIR( st.st_mode ) )
00160 {
00161
00162 kdDebug() << "File " << name << " is DIRECTORY!" << endl;
00163 KDE_struct_dirent* ep;
00164 DIR* dp = ::opendir( name.data() );
00165 if ( !dp )
00166 return false;
00167 while ( ( ep = KDE_readdir( dp ) ) )
00168 {
00169 kdDebug() << "CHECKING " << name << "/" << ep->d_name << endl;
00170 if ( !qstrcmp( ep->d_name, "." ) || !qstrcmp( ep->d_name, ".." ) )
00171 continue;
00172 QCString newName( name );
00173 newName += "/";
00174 newName += ep->d_name;
00175
00176
00177
00178
00179
00180
00181
00182
00183 if ( ::closedir( dp ) )
00184 return false;
00185
00186 kdDebug() << "RECURSE: " << newName << endl;
00187 if ( ! rmtree( newName ) )
00188 return false;
00189
00190 dp = ::opendir( name.data() );
00191 if ( !dp )
00192 return false;
00193 }
00194 if ( ::closedir( dp ) )
00195 return false;
00196 kdDebug() << "RMDIR dir " << name << endl;
00197 return ! ::rmdir( name );
00198 }
00199 else
00200 {
00201
00202 kdDebug() << "UNLINKING file " << name << endl;
00203 return ! ::unlink( name );
00204 }
00205 }
00206
00207 bool
00208 KTempDir::removeDir(const QString& path)
00209 {
00210 kdDebug() << k_funcinfo << " " << path << endl;
00211 if ( !QFile::exists( path ) )
00212 return true;
00213
00214 const QCString cstr( QFile::encodeName( path ) );
00215 return rmtree( cstr );
00216 }
00217
00218