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 + +#ifdef __OpenBSD__ + +#include +#include +#include +#include + +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