[tracker] libtracker-common: Add replacement function for flock() on Solaris
- From: Martyn James Russell <mr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-common: Add replacement function for flock() on Solaris
- Date: Thu, 24 Jan 2013 15:52:57 +0000 (UTC)
commit 18f8d97cd04a8a0a2cdf8cfbfd06195307cbfdb1
Author: Frank Lahm <franklahm gmail com>
Date: Wed Jan 9 15:37:04 2013 +0100
libtracker-common: Add replacement function for flock() on Solaris
src/libtracker-common/tracker-file-utils.c | 45 ++++++++++++++++++++++++++++
1 files changed, 45 insertions(+), 0 deletions(-)
---
diff --git a/src/libtracker-common/tracker-file-utils.c b/src/libtracker-common/tracker-file-utils.c
index 1ee4cee..09b99f2 100644
--- a/src/libtracker-common/tracker-file-utils.c
+++ b/src/libtracker-common/tracker-file-utils.c
@@ -50,6 +50,51 @@
static GHashTable *file_locks = NULL;
+#ifndef LOCK_EX
+
+/* Required on Solaris */
+#define LOCK_EX 1
+#define LOCK_SH 2
+#define LOCK_UN 3
+#define LOCK_NB 4
+
+static int flock(int fd, int op)
+{
+ int rc = 0;
+
+#if defined(F_SETLK) && defined(F_SETLKW)
+ struct flock fl = {0};
+
+ switch (op & (LOCK_EX|LOCK_SH|LOCK_UN)) {
+ case LOCK_EX:
+ fl.l_type = F_WRLCK;
+ break;
+
+ case LOCK_SH:
+ fl.l_type = F_RDLCK;
+ break;
+
+ case LOCK_UN:
+ fl.l_type = F_UNLCK;
+ break;
+
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ fl.l_whence = SEEK_SET;
+ rc = fcntl (fd, op & LOCK_NB ? F_SETLK : F_SETLKW, &fl);
+
+ if (rc && (errno == EAGAIN))
+ errno = EWOULDBLOCK;
+#endif /* defined(F_SETLK) && defined(F_SETLKW) */
+
+ return rc;
+}
+
+#endif /* LOCK_EX */
+
int
tracker_file_open_fd (const gchar *path)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]