eio: forgotten lstat.

SVN revision: 68499
This commit is contained in:
Cedric BAIL 2012-02-28 09:20:43 +00:00
parent 178339291d
commit b9fbbaa656
2 changed files with 107 additions and 29 deletions

View File

@ -176,6 +176,32 @@ if test "x${have_splice}" = "xyes" ; then
AC_DEFINE([EFL_HAVE_SPLICE], [1], [Define to mention that splice syscall is supported])
fi
### Check for lstat
have_lstat="no"
AC_TRY_LINK(
[
#include <sys/types.h>
#include <sys/stat.h>
#if defined(HAVE_UNISTD_H)
# include <unistd.h>
#endif
],
[
struct stat st;
lstat("/tmp", &st);
],
[have_lstat="yes"],
[have_lstat="no"])
AC_MSG_CHECKING([whether lstat is available])
AC_MSG_RESULT([${have_lstat}])
if test "x${have_lstat}" = "xyes" ; then
AC_DEFINE([EFL_HAVE_LSTAT], [1], [Define to mention that lstat syscall is supported])
fi
### Check for inotify specificity
have_inotify="no"
have_notify_win32="no"

View File

@ -101,6 +101,39 @@ _eio_file_unlink_error(void *data, Ecore_Thread *thread __UNUSED__)
_eio_unlink_free(l);
}
static void
_eio_file_struct_2_eina(Eina_Stat *es, struct stat *st)
{
es->dev = st->st_dev;
es->ino = st->st_ino;
es->mode = st->st_mode;
es->nlink = st->st_nlink;
es->uid = st->st_uid;
es->gid = st->st_gid;
es->rdev = st->st_rdev;
es->size = st->st_size;
es->blksize = st->st_blksize;
es->blocks = st->st_blocks;
es->atime = st->st_atime;
es->mtime = st->st_mtime;
es->ctime = st->st_ctime;
#ifdef _STAT_VER_LINUX
# if (defined __USE_MISC && defined st_mtime)
es->atimensec = st->st_atim.tv_nsec;
es->mtimensec = st->st_mtim.tv_nsec;
es->ctimensec = st->st_ctim.tv_nsec;
# else
es->atimensec = st->st_atimensec;
es->mtimensec = st->st_mtimensec;
es->ctimensec = st->st_ctimensec;
# endif
#else
es->atimensec = 0;
es->mtimensec = 0;
es->ctimensec = 0;
#endif
}
static void
_eio_file_stat(void *data, Ecore_Thread *thread)
{
@ -110,37 +143,23 @@ _eio_file_stat(void *data, Ecore_Thread *thread)
if (stat(s->path, &buf) != 0)
eio_file_thread_error(&s->common, thread);
s->buffer.dev = buf.st_dev;
s->buffer.ino = buf.st_ino;
s->buffer.mode = buf.st_mode;
s->buffer.nlink = buf.st_nlink;
s->buffer.uid = buf.st_uid;
s->buffer.gid = buf.st_gid;
s->buffer.rdev = buf.st_rdev;
s->buffer.size = buf.st_size;
s->buffer.blksize = buf.st_blksize;
s->buffer.blocks = buf.st_blocks;
s->buffer.atime = buf.st_atime;
s->buffer.mtime = buf.st_mtime;
s->buffer.ctime = buf.st_ctime;
#ifdef _STAT_VER_LINUX
# if (defined __USE_MISC && defined st_mtime)
s->buffer.atimensec = buf.st_atim.tv_nsec;
s->buffer.mtimensec = buf.st_mtim.tv_nsec;
s->buffer.ctimensec = buf.st_ctim.tv_nsec;
# else
s->buffer.atimensec = buf.st_atimensec;
s->buffer.mtimensec = buf.st_mtimensec;
s->buffer.ctimensec = buf.st_ctimensec;
# endif
#else
s->buffer.atimensec = 0;
s->buffer.mtimensec = 0;
s->buffer.ctimensec = 0;
#endif
_eio_file_struct_2_eina(&s->buffer, &buf);
}
#ifdef EFL_HAVE_LSTAT
static void
_eio_file_lstat(void *data, Ecore_Thread *thread)
{
Eio_File_Stat *s = data;
struct stat buf;
if (lstat(s->path, &buf) != 0)
eio_file_thread_error(&s->common, thread);
_eio_file_struct_2_eina(&s->buffer, &buf);
}
#endif
static void
_eio_stat_free(Eio_File_Stat *s)
{
@ -394,6 +413,39 @@ eio_file_direct_stat(const char *path,
return &s->common;
}
EAPI Eio_File *
eio_file_direct_lstat(const char *path,
Eio_Stat_Cb done_cb,
Eio_Error_Cb error_cb,
const void *data)
{
#ifdef EFL_HAVE_LSTAT
Eio_File_Stat *s = NULL;
if (!path || !done_cb || !error_cb)
return NULL;
s = malloc(sizeof (Eio_File_Stat));
if (!s) return NULL;
s->path = eina_stringshare_add(path);
s->done_cb = done_cb;
if (!eio_file_set(&s->common,
NULL,
error_cb,
data,
_eio_file_lstat,
_eio_file_stat_done,
_eio_file_stat_error))
return NULL;
return &s->common;
#else
return eio_file_direct_stat(path, done_cb, error_cb, data);
#endif
}
EAPI Eio_File *
eio_file_unlink(const char *path,
Eio_Done_Cb done_cb,