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

KDE3Support

  • 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
56class K3TempFile::Private
57{
58public:
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
79K3TempFile::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
102K3TempFile::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
114bool
115K3TempFile::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
153K3TempFile::~K3TempFile()
154{
155 close();
156 if (bAutoDelete)
157 unlink();
158 delete d;
159}
160
161int
162K3TempFile::status() const
163{
164 return mError;
165}
166
167QString
168K3TempFile::name() const
169{
170 return mTmpName;
171}
172
173int
174K3TempFile::handle() const
175{
176 return mFd;
177}
178
179FILE *
180K3TempFile::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
194QFile *
195K3TempFile::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
206QTextStream *
207K3TempFile::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
216QDataStream *
217K3TempFile::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
226void
227K3TempFile::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
240bool
241K3TempFile::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
277bool
278K3TempFile::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
315void
316K3TempFile::setAutoDelete(bool autoDelete)
317{
318 bAutoDelete = autoDelete;
319}
320
321void
322K3TempFile::setError(int error)
323{
324 mError = error;
325}
326
327bool
328K3TempFile::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::fstream
FILE * fstream()
Returns the FILE* of the temporary file.
Definition: k3tempfile.cpp:180
K3TempFile::K3TempFile
K3TempFile(const QString &filePrefix=QString(), const QString &fileExtension=QString(), int mode=0600)
Creates a temporary file with the name: <filePrefix><six letters><fileExtension>
Definition: k3tempfile.cpp:79
K3TempFile::textStream
QTextStream * textStream()
Returns the QTextStream for writing.
Definition: k3tempfile.cpp:207
K3TempFile::dataStream
QDataStream * dataStream()
Returns a QDataStream for writing.
Definition: k3tempfile.cpp:217
K3TempFile::isOpen
bool isOpen() const
Definition: k3tempfile.cpp:328
K3TempFile::name
QString name() const
Returns the full path and name of the file.
Definition: k3tempfile.cpp:168
K3TempFile::close
bool close()
Closes the file.
Definition: k3tempfile.cpp:278
K3TempFile::setAutoDelete
void setAutoDelete(bool autoDelete)
Turn automatic deletion on or off.
Definition: k3tempfile.cpp:316
K3TempFile::create
bool create(const QString &filePrefix, const QString &fileExtension, int mode)
Create function used internally by K3TempFile and KSaveFile.
Definition: k3tempfile.cpp:115
K3TempFile::file
QFile * file()
Returns a QFile.
Definition: k3tempfile.cpp:195
K3TempFile::sync
bool sync()
Flushes file to disk (fsync).
Definition: k3tempfile.cpp:241
K3TempFile::unlink
void unlink()
Unlinks the file from the directory.
Definition: k3tempfile.cpp:227
K3TempFile::handle
int handle() const
An integer file descriptor open for writing to the file.
Definition: k3tempfile.cpp:174
K3TempFile::setError
void setError(int error)
Set the error value (for subclasses).
Definition: k3tempfile.cpp:322
K3TempFile::~K3TempFile
~K3TempFile()
The destructor closes the file.
Definition: k3tempfile.cpp:153
K3TempFile::status
int status() const
Returns the status of the file based on errno.
Definition: k3tempfile.cpp:162
KStandardDirs::locateLocal
static QString locateLocal(const char *type, const QString &filename, bool createDir, const KComponentData &cData=KGlobal::mainComponent())
kWarning
#define kWarning
mFd
#define mFd
Definition: k3tempfile.cpp:64
FDATASYNC
#define FDATASYNC
Definition: k3tempfile.cpp:237
bAutoDelete
#define bAutoDelete
Definition: k3tempfile.cpp:76
bOpen
#define bOpen
Definition: k3tempfile.cpp:74
mError
#define mError
Definition: k3tempfile.cpp:60
mFile
#define mFile
Definition: k3tempfile.cpp:68
mTextStream
#define mTextStream
Definition: k3tempfile.cpp:70
mTmpName
#define mTmpName
Definition: k3tempfile.cpp:62
mDataStream
#define mDataStream
Definition: k3tempfile.cpp:72
mStream
#define mStream
Definition: k3tempfile.cpp:66
k3tempfile.h
kcomponentdata.h
kdebug.h
kglobal.h
krandom.h
kstandarddirs.h
prefix
QString prefix()
KGlobal::mainComponent
const KComponentData & mainComponent()
umask
mode_t umask()
KRandom::random
int random()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 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-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 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
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