summaryrefslogtreecommitdiff
path: root/src/unix
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2013-01-29 18:00:32 +0100
committerCarlos Martín Nieto <cmn@dwim.me>2013-01-29 18:46:17 +0100
commit67fcac567ba25753e7500e40081bea1a418dc6da (patch)
tree673fb1c2d65576677928491fb1097d3d8b1dd072 /src/unix
parentf42beff7e2e74da066eb91dac869c6f2e616f9e3 (diff)
downloadlibgit2-67fcac567ba25753e7500e40081bea1a418dc6da.tar.gz
Fix p_realpath on OpenBSD
OpenBSD's realpath(3) doesn't require the last part of the path to exist. Override p_realpath in this OS to bring it in line with the library's assumptions.
Diffstat (limited to 'src/unix')
-rw-r--r--src/unix/posix.h7
-rw-r--r--src/unix/realpath.c30
2 files changed, 36 insertions, 1 deletions
diff --git a/src/unix/posix.h b/src/unix/posix.h
index 2c169bd04..c738b531d 100644
--- a/src/unix/posix.h
+++ b/src/unix/posix.h
@@ -16,7 +16,12 @@
#define p_unlink(p) unlink(p)
#define p_mkdir(p,m) mkdir(p, m)
#define p_fsync(fd) fsync(fd)
-#define p_realpath(p, po) realpath(p, po)
+
+/* The OpenBSD realpath function behaves differently */
+#if !defined(__OpenBSD__)
+# define p_realpath(p, po) realpath(p, po)
+#endif
+
#define p_vsnprintf(b, c, f, a) vsnprintf(b, c, f, a)
#define p_snprintf(b, c, f, ...) snprintf(b, c, f, __VA_ARGS__)
#define p_mkstemp(p) mkstemp(p)
diff --git a/src/unix/realpath.c b/src/unix/realpath.c
new file mode 100644
index 000000000..f382c2b73
--- /dev/null
+++ b/src/unix/realpath.c
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+#include <git2/common.h>
+
+#ifdef __OpenBSD__
+
+#include <limits.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+char *p_realpath(const char *pathname, char *resolved)
+{
+ char *ret;
+
+ if ((ret = realpath(pathname, resolved)) == NULL)
+ return NULL;
+
+ /* Figure out if the file exists */
+ if (!access(ret, F_OK))
+ ret;
+
+ return NULL;
+}
+
+#endif