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
00035
#ifdef HAVE_TEST
00036
#include <test.h>
00037
#endif
00038
#ifdef HAVE_PATHS_H
00039
#include <paths.h>
00040
#endif
00041
00042
#ifndef _PATH_TMP
00043
#define _PATH_TMP "/tmp"
00044
#endif
00045
00046
#include <qdatetime.h>
00047
#include <qdir.h>
00048
00049
#include "kglobal.h"
00050
#include "kapplication.h"
00051
#include "kinstance.h"
00052
#include "ktempdir.h"
00053
#include "kstandarddirs.h"
00054
#include "kprocess.h"
00055
#include <kdebug.h>
00056
00057 KTempDir::KTempDir(
QString directoryPrefix,
int mode)
00058 {
00059 bAutoDelete =
false;
00060 bExisting =
false;
00061 mError=0;
00062
if (directoryPrefix.
isEmpty())
00063 {
00064 directoryPrefix = locateLocal(
"tmp", KGlobal::instance()->instanceName());
00065 }
00066 (
void)
create(directoryPrefix , mode);
00067 }
00068
00069
bool
00070 KTempDir::create(
const QString &directoryPrefix,
int mode)
00071 {
00072
00073 (
void)
KApplication::random();
00074
00075
QCString nme = QFile::encodeName(directoryPrefix) +
"XXXXXX";
00076
char *realName;
00077
if((realName=mkdtemp(nme.data())) == 0)
00078 {
00079
00080
QCString nme = QFile::encodeName(directoryPrefix) +
"XXXXXX";
00081 qWarning(
"KTempDir: Error trying to create %s: %s", nme.data(), strerror(errno));
00082 mError = errno;
00083 mTmpName = QString::null;
00084
return false;
00085 }
00086
00087
00088
QCString realNameStr(realName);
00089 mTmpName = QFile::decodeName(realNameStr)+
"/";
00090 kdDebug(180) <<
"KTempDir: Temporary directory created :" << mTmpName <<
endl;
00091 mode_t tmp = 0;
00092 mode_t umsk = umask(tmp);
00093 umask(umsk);
00094 chmod(nme, mode&(~umsk));
00095
00096
00097 bExisting =
true;
00098
00099
00100 chown(nme, getuid(), getgid());
00101
return true;
00102 }
00103
00104 KTempDir::~KTempDir()
00105 {
00106
if (bAutoDelete)
00107
unlink();
00108 }
00109
00110
int
00111 KTempDir::status()
const
00112
{
00113
return mError;
00114 }
00115
00116
QString
00117 KTempDir::name()
const
00118
{
00119
return mTmpName;
00120 }
00121
00122
bool
00123 KTempDir::existing()
const
00124
{
00125
return bExisting;
00126 }
00127
00128
QDir *
00129 KTempDir::qDir()
00130 {
00131
if (bExisting)
return new QDir(mTmpName);
00132
return 0;
00133 }
00134
00135
void
00136 KTempDir::unlink()
00137 {
00138
if (!bExisting)
return;
00139
QString rmstr(
"/bin/rm -rf ");
00140 rmstr += KProcess::quote(mTmpName);
00141 ::system( QFile::encodeName(rmstr) );
00142
00143 bExisting=
false;
00144 mError=0;
00145 }
00146
00147