summaryrefslogtreecommitdiffstats
path: root/kmobile/kmobiledevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmobile/kmobiledevice.cpp')
-rw-r--r--kmobile/kmobiledevice.cpp124
1 files changed, 24 insertions, 100 deletions
diff --git a/kmobile/kmobiledevice.cpp b/kmobile/kmobiledevice.cpp
index c408d72d0..abf750579 100644
--- a/kmobile/kmobiledevice.cpp
+++ b/kmobile/kmobiledevice.cpp
@@ -19,7 +19,7 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/types.h>
+#include <sys/file.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
@@ -48,8 +48,7 @@
*/
KMobileDevice::KMobileDevice(TQObject *obj, const char *name, const TQStringList &args)
- : KLibFactory(obj,name),
- m_config(0L), d(0L)
+ : KLibFactory(obj,name), m_config(0L), d(0L), m_fd(-1)
{
setClassType(Unclassified);
setCapabilities(hasNothing);
@@ -348,103 +347,33 @@ void KMobileDevice::special( const TQByteArray & )
// and no one is in this group. Only the binary /usr/sbin/lockdev is
// owned by this group and has the setgid flag set. This binary is called
// in ttylock etc ...
-# include <sys/types.h>
-# include <sys/stat.h>
-# include <fcntl.h>
# include <baudboy.h>
# include <cstdlib>
-#else
-# ifdef HAVE_LOCKDEV_H
-// Library shipped with newer RedHat and Debian(?) distributions.
-// Use this if bauddev is not available.
-# include <lockdev.h>
-# include <sys/types.h>
-# include <unistd.h>
-# else
-// If lockdev.h is also unavailable do locking
-// like described in the serial HOWTO.
-# include <sys/types.h>
-# include <sys/stat.h>
-# include <unistd.h>
-# include <tqfile.h>
-# include <signal.h>
-# include <errno.h>
-# endif
#endif
-#define DEVICE_LOCK_PATH_PREFIX "/var/lock/LCK.."
-
bool KMobileDevice::lockDevice(const TQString &device, TQString &err_reason)
{
#ifdef HAVE_BAUDBOY_H
- return ttylock(device.local8bit()) == EXIT_SUCCESS;
+ return ttylock(device.local8Bit()) == EXIT_SUCCESS;
#else
-# ifdef HAVE_LOCKDEV_H
- return !dev_lock(device.local8bit());
-# else
- int pid = -1;
- TQStringList all = TQStringList::split('/', device);
- if (!all.count()) {
- err_reason = i18n("Invalid device (%1)").arg(device);
- return false;
- }
- TQString lockName = DEVICE_LOCK_PATH_PREFIX + all[all.count()-1];
- TQFile file(lockName);
- if (file.exists() && file.open(IO_ReadOnly)) {
- if (file.size() == 0) {
- err_reason = i18n("Unable to read lockfile %s. Please check for reason and "
- "remove the lockfile by hand.").arg(lockName);
- PRINT_DEBUG << err_reason;
- return false;
- }
- if (file.size() == 4 && sizeof(int)==4) {
- file.readLine((char *)(&pid), 4); /* Kermit-style lockfile */
- } else {
- TQTextStream ts(&file);
- ts >> pid; /* Ascii lockfile */
- }
- file.close();
-
- if (pid > 0 && kill((pid_t)pid, 0) < 0 && errno == ESRCH) {
- PRINT_DEBUG << TQString("Lockfile %1 is stale. Overriding it..\n").arg(lockName);
- sleep(1);
- if (!file.remove()) {
- PRINT_DEBUG << TQString("Overriding failed, please check the permissions\n");
- PRINT_DEBUG << TQString("Cannot lock device %1\n").arg(device);
- err_reason = i18n("Lockfile %1 is stale. Please check permissions.").arg(lockName);
+ if (m_fd != -1)
+ return true;
+
+ TQCString dev = TQFile::encodeName(device.local8Bit());
+ const char *fdev = dev.data();
+ if ((m_fd = open(fdev, O_RDWR)) == -1)
+ {
+ PRINT_DEBUG << i18n("Unable to open device '%1'. "
+ "Please check that you have sufficient permissions.").arg(fdev);
return false;
}
- } else {
- err_reason = i18n("Device %1 already locked.").arg(device);
- return false;
- }
- }
-
- /* Try to create a new file, with 0644 mode */
- int fd = open(lockName.local8Bit(), O_CREAT | O_EXCL | O_WRONLY, 0644);
- if (fd == -1) {
- if (errno == EEXIST)
- err_reason = i18n("Device %1 seems to be locked by unknown process.").arg(device);
- else if (errno == EACCES)
- err_reason = i18n("Please check permission on lock directory.");
- else if (errno == ENOENT)
- err_reason = i18n("Cannot create lockfile %1. Please check for existence of path.").arg(lockName);
- else
- err_reason = i18n("Could not create lockfile %1. Error-Code is %2.").arg(lockName).arg(errno);
- return false;
- }
- TQString lockText;
- lockText = TQString("%1 kmobile\n").arg(getpid(),10);
- write(fd, lockText.utf8(), lockText.utf8().length());
- close(fd);
-
- PRINT_DEBUG << TQString("%1: Device %2 locked with lockfile %3.\n")
- .arg(deviceName()).arg(device).arg(lockName);
-
- err_reason = TQString();
-
+ if (flock(m_fd, LOCK_EX))
+ {
+ // Locking failed
+ PRINT_DEBUG << i18n("Unable to lock device '%1'.").arg(fdev);
+ return false;
+ }
return true;
-# endif
#endif
}
@@ -453,17 +382,12 @@ bool KMobileDevice::unlockDevice(const TQString &device)
#ifdef HAVE_BAUDBOY_H
return ttyunlock(device.local8bit()) == EXIT_SUCCESS;
#else
-# ifdef HAVE_LOCKDEV_H
- return 0 <= dev_unlock(device.local8bit(), getpid());
-# else
- TQStringList all = TQStringList::split('/', device);
- if (!all.count()) return false;
- TQString lockName = DEVICE_LOCK_PATH_PREFIX + all[all.count()-1];
- TQFile file(lockName);
- if (!file.exists())
- return true;
- return file.remove();
-# endif
+ if (m_fd != -1)
+ {
+ flock(m_fd, LOCK_UN);
+ }
+ close(m_fd);
+ m_fd = -1;
#endif
}