• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

KDE3Support

  • sources
  • kde-4.14
  • kdelibs
  • kde3support
  • kdecore
k3tempfile.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the KDE libraries
3  * Copyright (c) 1999 Waldo Bastian <bastian@kde.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License version 2 as published by the Free Software Foundation.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB. If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  **/
19 
20 #include "k3tempfile.h"
21 
22 #include <config.h>
23 
24 #include <sys/types.h>
25 
26 #ifdef HAVE_SYS_STAT_H
27 #include <sys/stat.h>
28 #endif
29 
30 #include <fcntl.h>
31 #include <stdlib.h>
32 #include <unistd.h>
33 #include <errno.h>
34 
35 #ifdef HAVE_PATHS_H
36 #include <paths.h>
37 #endif
38 
39 #ifndef _PATH_TMP
40 #define _PATH_TMP "/tmp"
41 #endif
42 
43 #include <QtCore/QCharRef>
44 #include <QtCore/QDate>
45 #include <QtCore/QFile>
46 #include <QtCore/QDataStream>
47 #include <QtCore/QTextIStream>
48 
49 #include "kglobal.h"
50 #include "krandom.h"
51 #include "kcomponentdata.h"
52 #include "kstandarddirs.h"
53 #include "kde_file.h"
54 #include "kdebug.h"
55 
56 class K3TempFile::Private
57 {
58 public:
59  int _Error;
60 #define mError d->_Error
61  QString _TmpName;
62 #define mTmpName d->_TmpName
63  int _Fd;
64 #define mFd d->_Fd
65  FILE *_Stream;
66 #define mStream d->_Stream
67  QFile *_File;
68 #define mFile d->_File
69  QTextStream *_TextStream;
70 #define mTextStream d->_TextStream
71  QDataStream *_DataStream;
72 #define mDataStream d->_DataStream
73  bool _Open;
74 #define bOpen d->_Open
75  bool _AutoDelete;
76 #define bAutoDelete d->_AutoDelete
77 };
78 
79 K3TempFile::K3TempFile(const QString& filePrefix,
80  const QString& fileExtension, int mode)
81  : d(new Private)
82 {
83  bAutoDelete = false;
84  mFd = -1;
85  mStream = 0;
86  mFile = 0;
87  mTextStream = 0;
88  mDataStream = 0;
89  mError = 0;
90  bOpen = false;
91  QString extension = fileExtension;
92  QString prefix = filePrefix;
93  if (extension.isEmpty())
94  extension = QLatin1String(".tmp");
95  if (prefix.isEmpty())
96  {
97  prefix = KStandardDirs::locateLocal("tmp", KGlobal::mainComponent().componentName());
98  }
99  (void) create(prefix, extension, mode);
100 }
101 
102 K3TempFile::K3TempFile(bool):d(new Private)
103 {
104  bAutoDelete = false;
105  mFd = -1;
106  mStream = 0;
107  mFile = 0;
108  mTextStream = 0;
109  mDataStream = 0;
110  mError = 0;
111  bOpen = false;
112 }
113 
114 bool
115 K3TempFile::create(const QString &filePrefix, const QString &fileExtension,
116  int mode)
117 {
118  // make sure the random seed is randomized
119  (void) KRandom::random();
120 
121  QByteArray ext = QFile::encodeName(fileExtension);
122  QByteArray nme = QFile::encodeName(filePrefix) + "XXXXXX" + ext;
123  if((mFd = mkstemps(nme.data(), ext.length())) < 0)
124  {
125  // Recreate it for the warning, mkstemps emptied it
126  nme = QFile::encodeName(filePrefix) + "XXXXXX" + ext;
127  kWarning() << "K3TempFile: Error trying to create " << nme << ": " << strerror(errno);
128  mError = errno;
129  mTmpName.clear();
130  return false;
131  }
132 
133  // got a file descriptor. nme contains the name
134  mTmpName = QFile::decodeName(nme);
135  mode_t tmp = 0;
136  mode_t umsk = umask(tmp);
137  umask(umsk);
138  fchmod(mFd, mode&(~umsk));
139 
140  // Success!
141  bOpen = true;
142 
143  // Set uid/gid (necessary for SUID programs)
144  fchown(mFd, getuid(), getgid());
145 
146 #ifndef Q_WS_WIN
147  // Set close on exec
148  fcntl(mFd, F_SETFD, FD_CLOEXEC);
149 #endif
150  return true;
151 }
152 
153 K3TempFile::~K3TempFile()
154 {
155  close();
156  if (bAutoDelete)
157  unlink();
158  delete d;
159 }
160 
161 int
162 K3TempFile::status() const
163 {
164  return mError;
165 }
166 
167 QString
168 K3TempFile::name() const
169 {
170  return mTmpName;
171 }
172 
173 int
174 K3TempFile::handle() const
175 {
176  return mFd;
177 }
178 
179 FILE *
180 K3TempFile::fstream()
181 {
182  if (mStream) return mStream;
183  if (mFd < 0) return 0;
184 
185  // Create a stream
186  mStream = KDE_fdopen(mFd, "r+");
187  if (!mStream) {
188  kWarning() << "K3TempFile: Error trying to open " << mTmpName << ": " << strerror(errno);
189  mError = errno;
190  }
191  return mStream;
192 }
193 
194 QFile *
195 K3TempFile::file()
196 {
197  if (mFile) return mFile;
198  if ( !fstream() ) return 0;
199 
200  mFile = new QFile();
201  mFile->setFileName( name() );
202  mFile->open(mStream, QIODevice::ReadWrite);
203  return mFile;
204 }
205 
206 QTextStream *
207 K3TempFile::textStream()
208 {
209  if (mTextStream) return mTextStream;
210  if ( !file() ) return 0; // Initialize mFile
211 
212  mTextStream = new QTextStream( mFile );
213  return mTextStream;
214 }
215 
216 QDataStream *
217 K3TempFile::dataStream()
218 {
219  if (mDataStream) return mDataStream;
220  if ( !file() ) return 0; // Initialize mFile
221 
222  mDataStream = new QDataStream( mFile );
223  return mDataStream;
224 }
225 
226 void
227 K3TempFile::unlink()
228 {
229  if (!mTmpName.isEmpty())
230  QFile::remove( mTmpName );
231  mTmpName.clear();
232 }
233 
234 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
235 #define FDATASYNC fdatasync
236 #else
237 #define FDATASYNC fsync
238 #endif
239 
240 bool
241 K3TempFile::sync()
242 {
243  int result = 0;
244 
245  if (mStream)
246  {
247  do {
248  result = fflush(mStream); // We need to flush first otherwise fsync may not have our data
249  }
250  while ((result == -1) && (errno == EINTR));
251 
252  if (result)
253  {
254  kWarning() << "K3TempFile: Error trying to flush " << mTmpName << ": " << strerror(errno);
255  mError = errno;
256  }
257  }
258 
259  if (mFd >= 0)
260  {
261  if( qgetenv( "KDE_EXTRA_FSYNC" ) == "1" )
262  {
263  result = FDATASYNC(mFd);
264  if (result)
265  {
266  kWarning() << "K3TempFile: Error trying to sync " << mTmpName << ": " << strerror(errno);
267  mError = errno;
268  }
269  }
270  }
271 
272  return (mError == 0);
273 }
274 
275 #undef FDATASYNC
276 
277 bool
278 K3TempFile::close()
279 {
280  int result = 0;
281  delete mTextStream; mTextStream = 0;
282  delete mDataStream; mDataStream = 0;
283  delete mFile; mFile = 0;
284 
285  if (mStream)
286  {
287  result = ferror(mStream);
288  if (result)
289  mError = ENOSPC; // Assume disk full.
290 
291  result = fclose(mStream);
292  mStream = 0;
293  mFd = -1;
294  if (result != 0) {
295  kWarning() << "K3TempFile: Error trying to close " << mTmpName << ": " << strerror(errno);
296  mError = errno;
297  }
298  }
299 
300 
301  if (mFd >= 0)
302  {
303  result = ::close(mFd);
304  mFd = -1;
305  if (result != 0) {
306  kWarning() << "K3TempFile: Error trying to close " << mTmpName << ": " << strerror(errno);
307  mError = errno;
308  }
309  }
310 
311  bOpen = false;
312  return (mError == 0);
313 }
314 
315 void
316 K3TempFile::setAutoDelete(bool autoDelete)
317 {
318  bAutoDelete = autoDelete;
319 }
320 
321 void
322 K3TempFile::setError(int error)
323 {
324  mError = error;
325 }
326 
327 bool
328 K3TempFile::isOpen() const
329 {
330  return bOpen;
331 }
332 
333 #undef mError
334 #undef mTmpName
335 #undef mFd
336 #undef mStream
337 #undef mFile
338 #undef mTextStream
339 #undef mDataStream
340 #undef bOpen
341 #undef bAutoDelete
K3TempFile::status
int status() const
Returns the status of the file based on errno.
Definition: k3tempfile.cpp:162
K3TempFile::setAutoDelete
void setAutoDelete(bool autoDelete)
Turn automatic deletion on or off.
Definition: k3tempfile.cpp:316
mTextStream
#define mTextStream
Definition: k3tempfile.cpp:70
krandom.h
mTmpName
#define mTmpName
Definition: k3tempfile.cpp:62
kdebug.h
k3tempfile.h
K3TempFile::fstream
FILE * fstream()
Returns the FILE* of the temporary file.
Definition: k3tempfile.cpp:180
QByteArray
K3TempFile::~K3TempFile
~K3TempFile()
The destructor closes the file.
Definition: k3tempfile.cpp:153
QFile::remove
bool remove()
QDataStream
FDATASYNC
#define FDATASYNC
Definition: k3tempfile.cpp:237
QByteArray::length
int length() const
QFile
QTextStream
prefix
QString prefix()
KRandom::random
int random()
bOpen
#define bOpen
Definition: k3tempfile.cpp:74
kglobal.h
K3TempFile::dataStream
QDataStream * dataStream()
Returns a QDataStream for writing.
Definition: k3tempfile.cpp:217
umask
mode_t umask()
QString::isEmpty
bool isEmpty() const
mDataStream
#define mDataStream
Definition: k3tempfile.cpp:72
K3TempFile::K3TempFile
K3TempFile(const QString &filePrefix=QString(), const QString &fileExtension=QString(), int mode=0600)
Creates a temporary file with the name:
Definition: k3tempfile.cpp:79
K3TempFile::close
bool close()
Closes the file.
Definition: k3tempfile.cpp:278
QString
K3TempFile::isOpen
bool isOpen() const
Definition: k3tempfile.cpp:328
K3TempFile::setError
void setError(int error)
Set the error value (for subclasses).
Definition: k3tempfile.cpp:322
K3TempFile::unlink
void unlink()
Unlinks the file from the directory.
Definition: k3tempfile.cpp:227
QLatin1String
KStandardDirs::locateLocal
static QString locateLocal(const char *type, const QString &filename, const KComponentData &cData=KGlobal::mainComponent())
kstandarddirs.h
K3TempFile::textStream
QTextStream * textStream()
Returns the QTextStream for writing.
Definition: k3tempfile.cpp:207
KGlobal::mainComponent
const KComponentData & mainComponent()
QByteArray::data
char * data()
K3TempFile::file
QFile * file()
Returns a QFile.
Definition: k3tempfile.cpp:195
kWarning
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
K3TempFile::sync
bool sync()
Flushes file to disk (fsync).
Definition: k3tempfile.cpp:241
kcomponentdata.h
bAutoDelete
#define bAutoDelete
Definition: k3tempfile.cpp:76
mStream
#define mStream
Definition: k3tempfile.cpp:66
mFd
#define mFd
Definition: k3tempfile.cpp:64
K3TempFile::name
QString name() const
Returns the full path and name of the file.
Definition: k3tempfile.cpp:168
K3TempFile::create
bool create(const QString &filePrefix, const QString &fileExtension, int mode)
Create function used internally by K3TempFile and KSaveFile.
Definition: k3tempfile.cpp:115
QFile::encodeName
QByteArray encodeName(const QString &fileName)
mFile
#define mFile
Definition: k3tempfile.cpp:68
QFile::decodeName
QString decodeName(const QByteArray &localFileName)
K3TempFile::handle
int handle() const
An integer file descriptor open for writing to the file.
Definition: k3tempfile.cpp:174
mError
#define mError
Definition: k3tempfile.cpp:60
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:26:48 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDE3Support

Skip menu "KDE3Support"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal