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 #include "ktempdir.h"
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 <errno.h>
00035 #include <dirent.h>
00036
00037 #ifdef HAVE_TEST
00038 #include <test.h>
00039 #endif
00040 #ifdef HAVE_PATHS_H
00041 #include <paths.h>
00042 #endif
00043
00044 #include <QtCore/QDir>
00045
00046 #include "kglobal.h"
00047 #include "krandom.h"
00048 #include "kcomponentdata.h"
00049 #include "kstandarddirs.h"
00050 #include <kdebug.h>
00051 #include "kde_file.h"
00052
00053 class KTempDir::Private
00054 {
00055 public:
00056 int error;
00057 QString tmpName;
00058 bool exists;
00059 bool autoRemove;
00060
00061 Private()
00062 {
00063 autoRemove = true;
00064 exists = false;
00065 error=0;
00066 }
00067 };
00068
00069 KTempDir::KTempDir(const QString &directoryPrefix, int mode) : d(new Private)
00070 {
00071 (void) create( directoryPrefix.isEmpty() ? KStandardDirs::locateLocal("tmp", KGlobal::mainComponent().componentName()) : directoryPrefix , mode);
00072 }
00073
00074 bool KTempDir::create(const QString &directoryPrefix, int mode)
00075 {
00076
00077 (void) KRandom::random();
00078
00079 QByteArray nme = QFile::encodeName(directoryPrefix) + "XXXXXX";
00080 char *realName;
00081 if((realName=mkdtemp(nme.data())) == 0)
00082 {
00083
00084 nme = QFile::encodeName(directoryPrefix) + "XXXXXX";
00085 kWarning(180) << "KTempDir: Error trying to create " << nme.data()
00086 << ": " << ::strerror(errno) << endl;
00087 d->error = errno;
00088 d->tmpName.clear();
00089 return false;
00090 }
00091
00092
00093 QByteArray realNameStr(realName);
00094 d->tmpName = QFile::decodeName(realNameStr)+'/';
00095 kDebug(180) << "KTempDir: Temporary directory created :" << d->tmpName
00096 << endl;
00097 mode_t umsk = KGlobal::umask();
00098 chmod(nme, mode&(~umsk));
00099
00100
00101 d->exists = true;
00102
00103
00104 chown(nme, getuid(), getgid());
00105 return true;
00106 }
00107
00108 KTempDir::~KTempDir()
00109 {
00110 if (d->autoRemove) {
00111 unlink();
00112 }
00113
00114 delete d;
00115 }
00116
00117 int KTempDir::status() const
00118 {
00119 return d->error;
00120 }
00121
00122 QString KTempDir::name() const
00123 {
00124 return d->tmpName;
00125 }
00126
00127 bool KTempDir::exists() const
00128 {
00129 return d->exists;
00130 }
00131
00132 void KTempDir::setAutoRemove(bool autoRemove)
00133 {
00134 d->autoRemove = autoRemove;
00135 }
00136
00137 bool KTempDir::autoRemove() const
00138 {
00139 return d->autoRemove;
00140 }
00141
00142 void KTempDir::unlink()
00143 {
00144 if (!d->exists) return;
00145 if (KTempDir::removeDir(d->tmpName))
00146 d->error=0;
00147 else
00148 d->error=errno;
00149 d->exists=false;
00150 }
00151
00152
00153 static bool rmtree(const QByteArray& name)
00154 {
00155
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
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
00170 if ( !qstrcmp( ep->d_name, "." ) || !qstrcmp( ep->d_name, ".." ) )
00171 continue;
00172 QByteArray 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
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
00197 return ! ::rmdir( name );
00198 }
00199 else
00200 {
00201
00202 kDebug(180) << "KTempDir: unlinking file " << name;
00203 return ! ::unlink( name );
00204 }
00205 }
00206
00207 bool KTempDir::removeDir( const QString& path )
00208 {
00209 kDebug(180) << " " << path;
00210 if ( !QFile::exists( path ) )
00211 return true;
00212
00213 const QByteArray cstr( QFile::encodeName( path ) );
00214 return rmtree( cstr );
00215 }
00216