diff options
Diffstat (limited to 'kmobile/kmobiledevice.cpp')
-rw-r--r-- | kmobile/kmobiledevice.cpp | 124 |
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 } |