You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by mj...@apache.org on 2016/03/20 03:24:43 UTC
[13/50] incubator-guacamole-server git commit: GUAC-236: Acquire
write lock on output file for in-progress screen recordings.
GUAC-236: Acquire write lock on output file for in-progress screen recordings.
Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/commit/0361dd23
Tree: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/tree/0361dd23
Diff: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/diff/0361dd23
Branch: refs/heads/master
Commit: 0361dd23921f36b961a8d01b0e033463efc1cdb3
Parents: c50561e
Author: Michael Jumper <mi...@guac-dev.org>
Authored: Tue Mar 15 17:06:52 2016 -0700
Committer: Michael Jumper <mi...@guac-dev.org>
Committed: Tue Mar 15 17:06:52 2016 -0700
----------------------------------------------------------------------
src/common/guac_recording.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/0361dd23/src/common/guac_recording.c
----------------------------------------------------------------------
diff --git a/src/common/guac_recording.c b/src/common/guac_recording.c
index 1b8d513..461b80e 100644
--- a/src/common/guac_recording.c
+++ b/src/common/guac_recording.c
@@ -25,13 +25,14 @@
#include <guacamole/client.h>
#include <guacamole/socket.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#include <unistd.h>
/**
* Attempts to open a new recording within the given path and having the given
@@ -105,6 +106,21 @@ static int guac_common_recording_open(const char* path,
} /* end if open succeeded */
+ /* Lock entire output file for writing by the current process */
+ struct flock file_lock = {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 0,
+ .l_pid = getpid()
+ };
+
+ /* Abort if file cannot be locked for reading */
+ if (fcntl(fd, F_SETLK, &file_lock) == -1) {
+ close(fd);
+ return -1;
+ }
+
return fd;
}