Mercurial > hg
changeset 5457:7372b6bbc5e6
osutil: improve portability
- manually inline mode_to_kind
- remove unused alloca include
- remove fstatat and associated bits
It's not obvious that there's an advantage to using fstatat in terms
of performance. The race-avoidance properties of fstatat aren't
terribly useful to us either. So best to avoid it until we figure out
how to use it portably.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 11 Oct 2007 17:46:06 -0500 |
parents | a58d415b272e |
children | cd1a6e7216c5 b0e5f44fdeb3 |
files | mercurial/osutil.c |
diffstat | 1 files changed, 18 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/osutil.c Thu Oct 11 16:28:30 2007 +0200 +++ b/mercurial/osutil.c Thu Oct 11 17:46:06 2007 -0500 @@ -7,9 +7,7 @@ the GNU General Public License, incorporated herein by reference. */ -#define _ATFILE_SOURCE #include <Python.h> -#include <alloca.h> #include <dirent.h> #include <fcntl.h> #include <string.h> @@ -101,18 +99,6 @@ listdir_stat_new, /* tp_new */ }; -static inline int mode_to_kind(int mode) -{ - if (S_ISREG(mode)) return S_IFREG; - if (S_ISDIR(mode)) return S_IFDIR; - if (S_ISLNK(mode)) return S_IFLNK; - if (S_ISBLK(mode)) return S_IFBLK; - if (S_ISCHR(mode)) return S_IFCHR; - if (S_ISFIFO(mode)) return S_IFIFO; - if (S_ISSOCK(mode)) return S_IFSOCK; - return mode; -} - static PyObject *listfiles(PyObject *list, DIR *dir, int keep_stat, int *need_stat) { @@ -187,9 +173,6 @@ int ret; ssize_t i; ssize_t size = PyList_Size(list); -#ifdef AT_SYMLINK_NOFOLLOW - int dfd = dirfd(dir); -#endif for (i = 0; i < size; i++) { PyObject *elt = PyList_GetItem(list, i); @@ -213,17 +196,29 @@ PyTuple_SET_ITEM(elt, 2, py_st); } -#ifdef AT_SYMLINK_NOFOLLOW - ret = fstatat(dfd, name, stp, AT_SYMLINK_NOFOLLOW); -#else ret = lstat(path, stp); -#endif if (ret == -1) return PyErr_SetFromErrnoWithFilename(PyExc_OSError, path); - if (kind == -1) - kind = mode_to_kind(stp->st_mode); + if (kind == -1) { + if (S_ISREG(stp->st_mode)) + kind = S_IFREG; + else if (S_ISDIR(stp->st_mode)) + kind = S_IFDIR; + else if (S_ISLNK(stp->st_mode)) + kind = S_IFLNK; + else if (S_ISBLK(stp->st_mode)) + kind = S_IFBLK; + else if (S_ISCHR(stp->st_mode)) + kind = S_IFCHR; + else if (S_ISFIFO(stp->st_mode)) + kind = S_IFIFO; + else if (S_ISSOCK(stp->st_mode)) + kind = S_IFSOCK; + else + kind = stp->st_mode; + } if (py_kind == Py_None && kind != -1) { py_kind = PyInt_FromLong(kind);