summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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