From c386664b94e2392f2d2cca35d7f8e9c6cb3c85c2 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 5 Jul 2011 09:24:11 +0000 Subject: realpath --- Changes | 1 + eio.c | 14 ++++++++++++++ eio.h | 3 ++- eio.pod | 6 ++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index df451d9..7db1bf2 100644 --- a/Changes +++ b/Changes @@ -49,4 +49,5 @@ TODO: fadvise request large transfers, using a heuristic. - use libecb, and apply lots of minor space optimisations. - disable sendfile on darwin, broken as everything else. + - add realpath function. diff --git a/eio.c b/eio.c index 7330a7f..c3795e0 100644 --- a/eio.c +++ b/eio.c @@ -837,6 +837,10 @@ int eio_poll (void) /*****************************************************************************/ /* work around various missing functions */ +#if _POSIX_VERSION < 200809L +# define realpath(path,resolved_path) (errno = ENOSYS, 0) +#endif + #if !HAVE_PREADWRITE # undef pread # undef pwrite @@ -1776,6 +1780,11 @@ eio_execute (etp_worker *self, eio_req *req) case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; + case EIO_REALPATH: req->flags |= EIO_FLAG_PTR2_FREE; + req->ptr2 = realpath (req->ptr1, 0); + req->result = req->ptr2 ? strlen (req->ptr2) : -1; + break; + case EIO_READLINK: ALLOC (PATH_MAX); req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break; @@ -2002,6 +2011,11 @@ eio_req *eio_readlink (const char *path, int pri, eio_cb cb, void *data) return eio__1path (EIO_READLINK, path, pri, cb, data); } +eio_req *eio_realpath (const char *path, int pri, eio_cb cb, void *data) +{ + return eio__1path (EIO_REALPATH, path, pri, cb, data); +} + eio_req *eio_stat (const char *path, int pri, eio_cb cb, void *data) { return eio__1path (EIO_STAT, path, pri, cb, data); diff --git a/eio.h b/eio.h index cad405d..2f96681 100644 --- a/eio.h +++ b/eio.h @@ -154,7 +154,7 @@ enum EIO_MLOCK, EIO_MLOCKALL, EIO_UNLINK, EIO_RMDIR, EIO_MKDIR, EIO_RENAME, EIO_MKNOD, EIO_READDIR, - EIO_LINK, EIO_SYMLINK, EIO_READLINK, + EIO_LINK, EIO_SYMLINK, EIO_READLINK, EIO_REALPATH, EIO_GROUP, EIO_NOP, EIO_BUSY }; @@ -284,6 +284,7 @@ eio_req *eio_readdir (const char *path, int flags, int pri, eio_cb cb, void *d eio_req *eio_rmdir (const char *path, int pri, eio_cb cb, void *data); eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data); eio_req *eio_readlink (const char *path, int pri, eio_cb cb, void *data); /* result=ptr2 allocated dynamically */ +eio_req *eio_realpath (const char *path, int pri, eio_cb cb, void *data); /* result=ptr2 allocated dynamically */ eio_req *eio_stat (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */ eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */ eio_req *eio_statvfs (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */ diff --git a/eio.pod b/eio.pod index d14df1c..3b1f31b 100644 --- a/eio.pod +++ b/eio.pod @@ -322,6 +322,12 @@ C<< req->result >>. free (target); } +=item eio_realpath (const char *path, int pri, eio_cb cb, void *data) + +Similar to the realpath libc function, but unlike that one, result is +C<0> on failure and the length of the returned path in C - this is +similar to readlink. + =item eio_stat (const char *path, int pri, eio_cb cb, void *data) =item eio_lstat (const char *path, int pri, eio_cb cb, void *data) -- cgit v1.2.3