summaryrefslogtreecommitdiffstats
path: root/tsak
diff options
context:
space:
mode:
Diffstat (limited to 'tsak')
-rw-r--r--tsak/main.cpp80
1 files changed, 58 insertions, 22 deletions
diff --git a/tsak/main.cpp b/tsak/main.cpp
index 2b51dbc85..b73609a67 100644
--- a/tsak/main.cpp
+++ b/tsak/main.cpp
@@ -144,7 +144,47 @@ void tearDownPipe()
}
}
-void setupPipe()
+bool setFileLock(int fd, bool close_on_failure)
+{
+ struct flock fl;
+
+ fl.l_type = F_WRLCK;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = 0;
+ fl.l_len = 1;
+
+ // Set the exclusive file lock
+ if (fcntl(mPipe_fd_out, F_SETLK, &fl) == -1) {
+ close(mPipe_fd_out);
+ return false;
+ }
+
+ return true;
+}
+
+bool checkFileLock()
+{
+ struct flock fl;
+
+ fl.l_type = F_WRLCK; /* Test for any lock on any part of file. */
+ fl.l_start = 0;
+ fl.l_whence = SEEK_SET;
+ fl.l_len = 0;
+
+ int fd = open(FIFO_FILE_OUT, O_RDWR | O_NONBLOCK);
+ fcntl(fd, F_GETLK, &fl); /* Overwrites lock structure with preventors. */
+
+ if (fd > -1) {
+ if (fl.l_type == F_WRLCK) {
+ return false;
+ }
+ return true;
+ }
+
+ return true;
+}
+
+bool setupPipe()
{
/* Create the FIFOs if they do not exist */
umask(0);
@@ -153,30 +193,13 @@ void setupPipe()
mknod(FIFO_FILE_OUT, S_IFIFO|0600, 0);
chmod(FIFO_FILE_OUT, 0600);
- mPipe_fd_out = open(FIFO_FILE_OUT, O_WRONLY | O_NONBLOCK);
+ mPipe_fd_out = open(FIFO_FILE_OUT, O_RDWR | O_NONBLOCK);
if (mPipe_fd_out > -1) {
mPipeOpen_out = true;
}
-}
-bool checkLocks()
-{
- int fdlock;
- struct flock fl;
-
- fl.l_type = F_WRLCK;
- fl.l_whence = SEEK_SET;
- fl.l_start = 0;
- fl.l_len = 1;
-
- fdlock = open(FIFO_FILE_OUT, O_RDWR | O_NONBLOCK);
- if (fdlock != -1) {
- if(fcntl(fdlock, F_SETLK, &fl) == -1) {
- return 0;
- }
- }
-
- return 1;
+ // Set the exclusive file lock
+ return setFileLock(mPipe_fd_out, true);
}
class PipeHandler
@@ -214,13 +237,18 @@ int main (int argc, char *argv[])
}
}
- if (!checkLocks()) {
+ // Check for existing file locks
+ if (!checkFileLock()) {
fprintf(stderr, "Another instance of this program is already running\n");
return 8;
}
// Create the output pipe
PipeHandler controlpipe;
+ if (!setupPipe()) {
+ fprintf(stderr, "Another instance of this program is already running\n");
+ return 8;
+ }
while (1) {
if ((getuid ()) != 0) {
@@ -283,6 +311,14 @@ int main (int argc, char *argv[])
fprintf(stderr,"Device created.\n");
if (established == false) {
+ tearDownPipe();
+ int i=fork();
+ if (i<0) return 9; // fork failed
+ if (i>0) {
+ // close parent process
+ close(mPipe_fd_out);
+ return 0;
+ }
setupPipe();
}