summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <root>2011-07-05 09:24:11 +0000
committerroot <root>2011-07-05 09:24:11 +0000
commitc386664b94e2392f2d2cca35d7f8e9c6cb3c85c2 (patch)
tree5e82b156b8395dd502ff1028fb4cb1e2528030f4
parentf40f89e5846a01dba0a726a5f30fde548ad63c0c (diff)
realpath
-rw-r--r--Changes1
-rw-r--r--eio.c14
-rw-r--r--eio.h3
-rw-r--r--eio.pod6
4 files changed, 23 insertions, 1 deletions
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<ptr2> - 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)