]> git.sur5r.net Git - minitube/blob - src/qtsingleapplication/qtlockedfile_unix.cpp
Updated qtsingleapplication
[minitube] / src / qtsingleapplication / qtlockedfile_unix.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the Qt Solutions component.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 **     of its contributors may be used to endorse or promote products derived
22 **     from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 #include <string.h>
42 #include <errno.h>
43 #include <unistd.h>
44 #include <fcntl.h>
45
46 #include "qtlockedfile.h"
47
48 bool QtLockedFile::lock(LockMode mode, bool block)
49 {
50     if (!isOpen()) {
51         qWarning("QtLockedFile::lock(): file is not opened");
52         return false;
53     }
54  
55     if (mode == NoLock)
56         return unlock();
57            
58     if (mode == m_lock_mode)
59         return true;
60
61     if (m_lock_mode != NoLock)
62         unlock();
63
64     struct flock fl;
65     fl.l_whence = SEEK_SET;
66     fl.l_start = 0;
67     fl.l_len = 0;
68     fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK;
69     int cmd = block ? F_SETLKW : F_SETLK;
70     int ret = fcntl(handle(), cmd, &fl);
71     
72     if (ret == -1) {
73         if (errno != EINTR && errno != EAGAIN)
74             qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
75         return false;
76     }
77
78     
79     m_lock_mode = mode;
80     return true;
81 }
82
83
84 bool QtLockedFile::unlock()
85 {
86     if (!isOpen()) {
87         qWarning("QtLockedFile::unlock(): file is not opened");
88         return false;
89     }
90
91     if (!isLocked())
92         return true;
93
94     struct flock fl;
95     fl.l_whence = SEEK_SET;
96     fl.l_start = 0;
97     fl.l_len = 0;
98     fl.l_type = F_UNLCK;
99     int ret = fcntl(handle(), F_SETLKW, &fl);
100     
101     if (ret == -1) {
102         qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
103         return false;
104     }
105     
106     m_lock_mode = NoLock;
107     return true;
108 }
109
110 QtLockedFile::~QtLockedFile()
111 {
112     if (isOpen())
113         unlock();
114 }
115