mercurial/cext/osutil.c
author Raphaël Gomès <rgomes@octobus.net>
Thu, 10 Aug 2023 11:01:07 +0200
changeset 50978 27e773aa607d
parent 49275 c6a3243567b6
child 51742 b619ba39d10a
permissions -rw-r--r--
rust: implement the `Graph` trait for all revlogs This is trivial and makes all the algorithms relying on the trait usable for more use cases.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     1
/*
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     2
 osutil.c - native operating system services
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     3
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46374
diff changeset
     4
 Copyright 2007 Olivia Mackall and others
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     5
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     6
 This software may be used and distributed according to the terms of
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     7
 the GNU General Public License, incorporated herein by reference.
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     8
*/
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     9
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
    10
#define _ATFILE_SOURCE
42069
668eff08387f cext: make osutil.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39610
diff changeset
    11
#define PY_SSIZE_T_CLEAN
5397
11caa374f497 osutil.c: include Python.h before the other headers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5396
diff changeset
    12
#include <Python.h>
34438
b90e8da190da cext: reorder #include
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32367
diff changeset
    13
#include <errno.h>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
    14
#include <fcntl.h>
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
    15
#include <stdio.h>
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
    16
#include <stdlib.h>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
    17
#include <string.h>
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
    18
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    19
#ifdef _WIN32
34438
b90e8da190da cext: reorder #include
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32367
diff changeset
    20
#include <io.h>
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
    21
#include <windows.h>
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    22
#else
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
    23
#include <dirent.h>
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
    24
#include <signal.h>
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
    25
#include <sys/socket.h>
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
    26
#include <sys/stat.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
    27
#include <sys/types.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
    28
#include <unistd.h>
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
    29
#ifdef HAVE_LINUX_STATFS
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
    30
#include <linux/magic.h>
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
    31
#include <sys/vfs.h>
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
    32
#endif
31597
2d501fb60b2d osutil: report fstype for BSD and OSX
Jun Wu <quark@fb.com>
parents: 31564
diff changeset
    33
#ifdef HAVE_BSD_STATFS
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
    34
#include <sys/mount.h>
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
    35
#include <sys/param.h>
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
    36
#endif
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    37
#endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    38
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
    39
#ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
    40
#include <sys/attr.h>
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
    41
#include <sys/vnode.h>
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
    42
#endif
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
    43
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    44
#include "util.h"
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    45
9353
3ac42ca1f3e6 osutil: fix compilation with -ansi
Sebastien Binet <binet@cern.ch>
parents: 8723
diff changeset
    46
/* some platforms lack the PATH_MAX definition (eg. GNU/Hurd) */
8722
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
    47
#ifndef PATH_MAX
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
    48
#define PATH_MAX 4096
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
    49
#endif
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
    50
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    51
#ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    52
/*
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    53
stat struct compatible with hg expectations
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    54
Mercurial only uses st_mode, st_size and st_mtime
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    55
the rest is kept to minimize changes between implementations
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    56
*/
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    57
struct hg_stat {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    58
	int st_dev;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    59
	int st_mode;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    60
	int st_nlink;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    61
	__int64 st_size;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    62
	int st_mtime;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    63
	int st_ctime;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    64
};
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    65
struct listdir_stat {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    66
	PyObject_HEAD
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    67
	struct hg_stat st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    68
};
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    69
#else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    70
struct listdir_stat {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
    71
	PyObject_HEAD
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
    72
	struct stat st;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    73
};
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    74
#endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    75
30111
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
    76
#define listdir_slot(name) \
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
    77
	static PyObject *listdir_stat_##name(PyObject *self, void *x) \
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
    78
	{ \
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
    79
		return PyLong_FromLong(((struct listdir_stat *)self)->st.name); \
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
    80
	}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    81
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
    82
listdir_slot(st_dev)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
    83
listdir_slot(st_mode)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
    84
listdir_slot(st_nlink)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    85
#ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    86
static PyObject *listdir_stat_st_size(PyObject *self, void *x)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    87
{
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    88
	return PyLong_FromLongLong(
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    89
		(PY_LONG_LONG)((struct listdir_stat *)self)->st.st_size);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    90
}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    91
#else
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
    92
listdir_slot(st_size)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
    93
#endif
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
    94
listdir_slot(st_mtime)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
    95
listdir_slot(st_ctime)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    96
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    97
static struct PyGetSetDef listdir_stat_getsets[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
    98
	{"st_dev", listdir_stat_st_dev, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
    99
	{"st_mode", listdir_stat_st_mode, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   100
	{"st_nlink", listdir_stat_st_nlink, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   101
	{"st_size", listdir_stat_st_size, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   102
	{"st_mtime", listdir_stat_st_mtime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   103
	{"st_ctime", listdir_stat_st_ctime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   104
	{0, 0, 0, 0, 0}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   105
};
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   106
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   107
static PyObject *listdir_stat_new(PyTypeObject *t, PyObject *a, PyObject *k)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   108
{
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   109
	return t->tp_alloc(t, 0);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   110
}
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   111
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   112
static void listdir_stat_dealloc(PyObject *o)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   113
{
46374
e92ca942ddca cext: add Python 3.10 support
Victor Stinner <vstinner@python.org>
parents: 45174
diff changeset
   114
	Py_TYPE(o)->tp_free(o);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   115
}
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   116
36780
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   117
static PyObject *listdir_stat_getitem(PyObject *self, PyObject *key)
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   118
{
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   119
	long index = PyLong_AsLong(key);
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   120
	if (index == -1 && PyErr_Occurred()) {
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   121
		return NULL;
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   122
	}
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   123
	if (index != 8) {
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   124
		PyErr_Format(PyExc_IndexError, "osutil.stat objects only "
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   125
		                               "support stat.ST_MTIME in "
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   126
		                               "__getitem__");
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   127
		return NULL;
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   128
	}
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   129
	return listdir_stat_st_mtime(self, NULL);
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   130
}
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   131
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   132
static PyMappingMethods listdir_stat_type_mapping_methods = {
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   133
	(lenfunc)NULL,             /* mp_length */
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   134
	(binaryfunc)listdir_stat_getitem,       /* mp_subscript */
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   135
	(objobjargproc)NULL,    /* mp_ass_subscript */
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   136
};
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   137
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   138
static PyTypeObject listdir_stat_type = {
34861
6ece4a85c350 cext: add /* header */ comment to all PyVarObject_HEAD_INIT() calls
Augie Fackler <augie@google.com>
parents: 34438
diff changeset
   139
	PyVarObject_HEAD_INIT(NULL, 0) /* header */
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   140
	"osutil.stat",             /*tp_name*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   141
	sizeof(struct listdir_stat), /*tp_basicsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   142
	0,                         /*tp_itemsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   143
	(destructor)listdir_stat_dealloc, /*tp_dealloc*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   144
	0,                         /*tp_print*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   145
	0,                         /*tp_getattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   146
	0,                         /*tp_setattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   147
	0,                         /*tp_compare*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   148
	0,                         /*tp_repr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   149
	0,                         /*tp_as_number*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   150
	0,                         /*tp_as_sequence*/
36780
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
   151
	&listdir_stat_type_mapping_methods, /*tp_as_mapping*/
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   152
	0,                         /*tp_hash */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   153
	0,                         /*tp_call*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   154
	0,                         /*tp_str*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   155
	0,                         /*tp_getattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   156
	0,                         /*tp_setattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   157
	0,                         /*tp_as_buffer*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   158
	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   159
	"stat objects",            /* tp_doc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   160
	0,                         /* tp_traverse */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   161
	0,                         /* tp_clear */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   162
	0,                         /* tp_richcompare */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   163
	0,                         /* tp_weaklistoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   164
	0,                         /* tp_iter */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   165
	0,                         /* tp_iternext */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   166
	0,                         /* tp_methods */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   167
	0,                         /* tp_members */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   168
	listdir_stat_getsets,      /* tp_getset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   169
	0,                         /* tp_base */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   170
	0,                         /* tp_dict */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   171
	0,                         /* tp_descr_get */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   172
	0,                         /* tp_descr_set */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   173
	0,                         /* tp_dictoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   174
	0,                         /* tp_init */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   175
	0,                         /* tp_alloc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   176
	listdir_stat_new,          /* tp_new */
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   177
};
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   178
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   179
#ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   180
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   181
static int to_python_time(const FILETIME *tm)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   182
{
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   183
	/* number of seconds between epoch and January 1 1601 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   184
	const __int64 a0 = (__int64)134774L * (__int64)24L * (__int64)3600L;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   185
	/* conversion factor from 100ns to 1s */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   186
	const __int64 a1 = 10000000;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   187
	/* explicit (int) cast to suspend compiler warnings */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   188
	return (int)((((__int64)tm->dwHighDateTime << 32)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   189
			+ tm->dwLowDateTime) / a1 - a0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   190
}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   191
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   192
static PyObject *make_item(const WIN32_FIND_DATAA *fd, int wantstat)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   193
{
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   194
	PyObject *py_st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   195
	struct hg_stat *stp;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   196
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   197
	int kind = (fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   198
		? _S_IFDIR : _S_IFREG;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   199
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   200
	if (!wantstat)
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   201
		return Py_BuildValue("yi", fd->cFileName, kind);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   202
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   203
	py_st = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   204
	if (!py_st)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   205
		return NULL;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   206
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   207
	stp = &((struct listdir_stat *)py_st)->st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   208
	/*
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   209
	use kind as st_mode
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   210
	rwx bits on Win32 are meaningless
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   211
	and Hg does not use them anyway
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   212
	*/
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   213
	stp->st_mode  = kind;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   214
	stp->st_mtime = to_python_time(&fd->ftLastWriteTime);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   215
	stp->st_ctime = to_python_time(&fd->ftCreationTime);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   216
	if (kind == _S_IFREG)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
   217
		stp->st_size = ((__int64)fd->nFileSizeHigh << 32)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   218
				+ fd->nFileSizeLow;
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   219
	return Py_BuildValue("yiN", fd->cFileName,
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   220
		kind, py_st);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   221
}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   222
42069
668eff08387f cext: make osutil.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39610
diff changeset
   223
static PyObject *_listdir(char *path, Py_ssize_t plen, int wantstat, char *skip)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   224
{
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   225
	PyObject *rval = NULL; /* initialize - return value */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   226
	PyObject *list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   227
	HANDLE fh;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   228
	WIN32_FIND_DATAA fd;
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   229
	char *pattern;
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   230
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   231
	/* build the path + \* pattern string */
31468
b9dd03ed564f osutil: use Python memory allocator in _listdir
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30409
diff changeset
   232
	pattern = PyMem_Malloc(plen + 3); /* path + \* + \0 */
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   233
	if (!pattern) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   234
		PyErr_NoMemory();
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   235
		goto error_nomem;
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   236
	}
28593
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
   237
	memcpy(pattern, path, plen);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   238
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   239
	if (plen > 0) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   240
		char c = path[plen-1];
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   241
		if (c != ':' && c != '/' && c != '\\')
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   242
			pattern[plen++] = '\\';
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   243
	}
28593
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
   244
	pattern[plen++] = '*';
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
   245
	pattern[plen] = '\0';
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   246
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   247
	fh = FindFirstFileA(pattern, &fd);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   248
	if (fh == INVALID_HANDLE_VALUE) {
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
   249
		PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   250
		goto error_file;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   251
	}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   252
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   253
	list = PyList_New(0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   254
	if (!list)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   255
		goto error_list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   256
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   257
	do {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   258
		PyObject *item;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   259
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   260
		if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   261
			if (!strcmp(fd.cFileName, ".")
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   262
			|| !strcmp(fd.cFileName, ".."))
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   263
				continue;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   264
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   265
			if (skip && !strcmp(fd.cFileName, skip)) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   266
				rval = PyList_New(0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   267
				goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   268
			}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   269
		}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   270
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   271
		item = make_item(&fd, wantstat);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   272
		if (!item)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   273
			goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   274
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   275
		if (PyList_Append(list, item)) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   276
			Py_XDECREF(item);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   277
			goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   278
		}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   279
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   280
		Py_XDECREF(item);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   281
	} while (FindNextFileA(fh, &fd));
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   282
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   283
	if (GetLastError() != ERROR_NO_MORE_FILES) {
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
   284
		PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   285
		goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   286
	}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   287
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   288
	rval = list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   289
	Py_XINCREF(rval);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   290
error:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   291
	Py_XDECREF(list);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   292
error_list:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   293
	FindClose(fh);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   294
error_file:
31468
b9dd03ed564f osutil: use Python memory allocator in _listdir
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30409
diff changeset
   295
	PyMem_Free(pattern);
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   296
error_nomem:
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   297
	return rval;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   298
}
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   299
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   300
#else
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   301
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   302
int entkind(struct dirent *ent)
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
   303
{
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   304
#ifdef DT_REG
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   305
	switch (ent->d_type) {
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   306
	case DT_REG: return S_IFREG;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   307
	case DT_DIR: return S_IFDIR;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   308
	case DT_LNK: return S_IFLNK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   309
	case DT_BLK: return S_IFBLK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   310
	case DT_CHR: return S_IFCHR;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   311
	case DT_FIFO: return S_IFIFO;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   312
	case DT_SOCK: return S_IFSOCK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   313
	}
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
   314
#endif
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   315
	return -1;
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
   316
}
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
   317
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
   318
static PyObject *makestat(const struct stat *st)
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
   319
{
18021
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
   320
	PyObject *stat;
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
   321
18021
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
   322
	stat = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
   323
	if (stat)
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
   324
		memcpy(&((struct listdir_stat *)stat)->st, st, sizeof(*st));
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
   325
	return stat;
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
   326
}
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
   327
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   328
static PyObject *_listdir_stat(char *path, int pathlen, int keepstat,
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   329
			       char *skip)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   330
{
45174
f93a4e3d35ab osutil: fix excessive decref on tuple creation failure in listdir()
Yuya Nishihara <yuya@tcha.org>
parents: 44586
diff changeset
   331
	PyObject *list, *elem, *ret = NULL;
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   332
	char fullpath[PATH_MAX + 10];
7136
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
   333
	int kind, err;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   334
	struct stat st;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   335
	struct dirent *ent;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   336
	DIR *dir;
7136
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
   337
#ifdef AT_SYMLINK_NOFOLLOW
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
   338
	int dfd = -1;
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
   339
#endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   340
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
   341
	if (pathlen >= PATH_MAX) {
14873
f79d47813b8b osutil: emulate os.listdir's OSError for long names (issue2898)
Matt Mackall <mpm@selenic.com>
parents: 13748
diff changeset
   342
		errno = ENAMETOOLONG;
f79d47813b8b osutil: emulate os.listdir's OSError for long names (issue2898)
Matt Mackall <mpm@selenic.com>
parents: 13748
diff changeset
   343
		PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   344
		goto error_value;
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
   345
	}
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   346
	strncpy(fullpath, path, PATH_MAX);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   347
	fullpath[pathlen] = '/';
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   348
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   349
#ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   350
	dfd = open(path, O_RDONLY);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   351
	if (dfd == -1) {
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   352
		PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   353
		goto error_value;
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   354
	}
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   355
	dir = fdopendir(dfd);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   356
#else
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   357
	dir = opendir(path);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   358
#endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   359
	if (!dir) {
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   360
		PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   361
		goto error_dir;
23961
bc851e2851b1 osutil.c: clean up space before a tab
Augie Fackler <augie@google.com>
parents: 18027
diff changeset
   362
	}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   363
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   364
	list = PyList_New(0);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   365
	if (!list)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   366
		goto error_list;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   367
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   368
	while ((ent = readdir(dir))) {
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   369
		if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   370
			continue;
5416
ca890c0c3f1f osutil.c: style fix - delete trailing end-of-line spaces
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 5398
diff changeset
   371
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   372
		kind = entkind(ent);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   373
		if (kind == -1 || keepstat) {
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   374
#ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   375
			err = fstatat(dfd, ent->d_name, &st,
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   376
				      AT_SYMLINK_NOFOLLOW);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   377
#else
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   378
			strncpy(fullpath + pathlen + 1, ent->d_name,
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   379
				PATH_MAX - pathlen);
24462
40b05303ac32 osutil: mark end of string with null char, not 0
Siddharth Agarwal <sid0@fb.com>
parents: 24461
diff changeset
   380
			fullpath[PATH_MAX] = '\0';
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   381
			err = lstat(fullpath, &st);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   382
#endif
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   383
			if (err == -1) {
16747
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
   384
				/* race with file deletion? */
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
   385
				if (errno == ENOENT)
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
   386
					continue;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   387
				strncpy(fullpath + pathlen + 1, ent->d_name,
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   388
					PATH_MAX - pathlen);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   389
				fullpath[PATH_MAX] = 0;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   390
				PyErr_SetFromErrnoWithFilename(PyExc_OSError,
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   391
							       fullpath);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   392
				goto error;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   393
			}
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   394
			kind = st.st_mode & S_IFMT;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   395
		}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   396
7034
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
   397
		/* quit early? */
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
   398
		if (skip && kind == S_IFDIR && !strcmp(ent->d_name, skip)) {
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
   399
			ret = PyList_New(0);
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
   400
			goto error;
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
   401
		}
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
   402
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   403
		if (keepstat) {
45174
f93a4e3d35ab osutil: fix excessive decref on tuple creation failure in listdir()
Yuya Nishihara <yuya@tcha.org>
parents: 44586
diff changeset
   404
			PyObject *stat = makestat(&st);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   405
			if (!stat)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   406
				goto error;
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   407
			elem = Py_BuildValue("yiN", ent->d_name,
36619
1f8c3fadbb8e py3: bulk-replace bytes format specifier passed to Py_BuildValue()
Yuya Nishihara <yuya@tcha.org>
parents: 35515
diff changeset
   408
					     kind, stat);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   409
		} else
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   410
			elem = Py_BuildValue("yi", ent->d_name,
36619
1f8c3fadbb8e py3: bulk-replace bytes format specifier passed to Py_BuildValue()
Yuya Nishihara <yuya@tcha.org>
parents: 35515
diff changeset
   411
					     kind);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   412
		if (!elem)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   413
			goto error;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   414
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   415
		PyList_Append(list, elem);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   416
		Py_DECREF(elem);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   417
	}
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   418
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   419
	ret = list;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   420
	Py_INCREF(ret);
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   421
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   422
error:
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   423
	Py_DECREF(list);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   424
error_list:
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   425
	closedir(dir);
31471
95be8b7181d3 osutil: fix potential wrong fd close
Jun Wu <quark@fb.com>
parents: 31468
diff changeset
   426
	/* closedir also closes its dirfd */
95be8b7181d3 osutil: fix potential wrong fd close
Jun Wu <quark@fb.com>
parents: 31468
diff changeset
   427
	goto error_value;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   428
error_dir:
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   429
#ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   430
	close(dfd);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
   431
#endif
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
   432
error_value:
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
   433
	return ret;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
   434
}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   435
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   436
#ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   437
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   438
typedef struct {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   439
	u_int32_t length;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   440
	attrreference_t name;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   441
	fsobj_type_t obj_type;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   442
	struct timespec mtime;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   443
#if __LITTLE_ENDIAN__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   444
	mode_t access_mask;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   445
	uint16_t padding;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   446
#else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   447
	uint16_t padding;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   448
	mode_t access_mask;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   449
#endif
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   450
	off_t size;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   451
} __attribute__((packed)) attrbuf_entry;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   452
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   453
int attrkind(attrbuf_entry *entry)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   454
{
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   455
	switch (entry->obj_type) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   456
	case VREG: return S_IFREG;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   457
	case VDIR: return S_IFDIR;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   458
	case VLNK: return S_IFLNK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   459
	case VBLK: return S_IFBLK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   460
	case VCHR: return S_IFCHR;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   461
	case VFIFO: return S_IFIFO;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   462
	case VSOCK: return S_IFSOCK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   463
	}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   464
	return -1;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   465
}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   466
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   467
/* get these many entries at a time */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   468
#define LISTDIR_BATCH_SIZE 50
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   469
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   470
static PyObject *_listdir_batch(char *path, int pathlen, int keepstat,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   471
				char *skip, bool *fallback)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   472
{
45174
f93a4e3d35ab osutil: fix excessive decref on tuple creation failure in listdir()
Yuya Nishihara <yuya@tcha.org>
parents: 44586
diff changeset
   473
	PyObject *list, *elem, *ret = NULL;
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   474
	int kind, err;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   475
	unsigned long index;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   476
	unsigned int count, old_state, new_state;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   477
	bool state_seen = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   478
	attrbuf_entry *entry;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   479
	/* from the getattrlist(2) man page: a path can be no longer than
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   480
	   (NAME_MAX * 3 + 1) bytes. Also, "The getattrlist() function will
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   481
	   silently truncate attribute data if attrBufSize is too small." So
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   482
	   pass in a buffer big enough for the worst case. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   483
	char attrbuf[LISTDIR_BATCH_SIZE * (sizeof(attrbuf_entry) + NAME_MAX * 3 + 1)];
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   484
	unsigned int basep_unused;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   485
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   486
	struct stat st;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   487
	int dfd = -1;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   488
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   489
	/* these must match the attrbuf_entry struct, otherwise you'll end up
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   490
	   with garbage */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   491
	struct attrlist requested_attr = {0};
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   492
	requested_attr.bitmapcount = ATTR_BIT_MAP_COUNT;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   493
	requested_attr.commonattr = (ATTR_CMN_NAME | ATTR_CMN_OBJTYPE |
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   494
				     ATTR_CMN_MODTIME | ATTR_CMN_ACCESSMASK);
27877
f6d1e92fdf8c mac: ignore resource fork when checking file sizes
Matt Mackall <mpm@selenic.com>
parents: 27473
diff changeset
   495
	requested_attr.fileattr = ATTR_FILE_DATALENGTH;
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   496
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   497
	*fallback = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   498
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   499
	if (pathlen >= PATH_MAX) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   500
		errno = ENAMETOOLONG;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   501
		PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   502
		goto error_value;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   503
	}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   504
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   505
	dfd = open(path, O_RDONLY);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   506
	if (dfd == -1) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   507
		PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   508
		goto error_value;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   509
	}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   510
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   511
	list = PyList_New(0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   512
	if (!list)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   513
		goto error_dir;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   514
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   515
	do {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   516
		count = LISTDIR_BATCH_SIZE;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   517
		err = getdirentriesattr(dfd, &requested_attr, &attrbuf,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   518
					sizeof(attrbuf), &count, &basep_unused,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   519
					&new_state, 0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   520
		if (err < 0) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   521
			if (errno == ENOTSUP) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   522
				/* We're on a filesystem that doesn't support
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   523
				   getdirentriesattr. Fall back to the
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   524
				   stat-based implementation. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   525
				*fallback = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   526
			} else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   527
				PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   528
			goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   529
		}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   530
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   531
		if (!state_seen) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   532
			old_state = new_state;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   533
			state_seen = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   534
		} else if (old_state != new_state) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   535
			/* There's an edge case with getdirentriesattr. Consider
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   536
			   the following initial list of files:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   537
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   538
			   a
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   539
			   b
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   540
			   <--
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   541
			   c
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   542
			   d
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   543
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   544
			   If the iteration is paused at the arrow, and b is
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   545
			   deleted before it is resumed, getdirentriesattr will
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   546
			   not return d at all!  Ordinarily we're expected to
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   547
			   restart the iteration from the beginning. To avoid
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   548
			   getting stuck in a retry loop here, fall back to
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   549
			   stat. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   550
			*fallback = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   551
			goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   552
		}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   553
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   554
		entry = (attrbuf_entry *)attrbuf;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   555
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   556
		for (index = 0; index < count; index++) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   557
			char *filename = ((char *)&entry->name) +
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   558
				entry->name.attr_dataoffset;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   559
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   560
			if (!strcmp(filename, ".") || !strcmp(filename, ".."))
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   561
				continue;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   562
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   563
			kind = attrkind(entry);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   564
			if (kind == -1) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   565
				PyErr_Format(PyExc_OSError,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   566
					     "unknown object type %u for file "
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   567
					     "%s%s!",
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   568
					     entry->obj_type, path, filename);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   569
				goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   570
			}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   571
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   572
			/* quit early? */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   573
			if (skip && kind == S_IFDIR && !strcmp(filename, skip)) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   574
				ret = PyList_New(0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   575
				goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   576
			}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   577
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   578
			if (keepstat) {
45174
f93a4e3d35ab osutil: fix excessive decref on tuple creation failure in listdir()
Yuya Nishihara <yuya@tcha.org>
parents: 44586
diff changeset
   579
				PyObject *stat = NULL;
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   580
				/* from the getattrlist(2) man page: "Only the
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   581
				   permission bits ... are valid". */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   582
				st.st_mode = (entry->access_mask & ~S_IFMT) | kind;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   583
				st.st_mtime = entry->mtime.tv_sec;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   584
				st.st_size = entry->size;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   585
				stat = makestat(&st);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   586
				if (!stat)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   587
					goto error;
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   588
				elem = Py_BuildValue("yiN",
36619
1f8c3fadbb8e py3: bulk-replace bytes format specifier passed to Py_BuildValue()
Yuya Nishihara <yuya@tcha.org>
parents: 35515
diff changeset
   589
						     filename, kind, stat);
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   590
			} else
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   591
				elem = Py_BuildValue("yi",
36619
1f8c3fadbb8e py3: bulk-replace bytes format specifier passed to Py_BuildValue()
Yuya Nishihara <yuya@tcha.org>
parents: 35515
diff changeset
   592
						     filename, kind);
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   593
			if (!elem)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   594
				goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   595
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   596
			PyList_Append(list, elem);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   597
			Py_DECREF(elem);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   598
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   599
			entry = (attrbuf_entry *)((char *)entry + entry->length);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   600
		}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   601
	} while (err == 0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   602
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   603
	ret = list;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   604
	Py_INCREF(ret);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   605
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   606
error:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   607
	Py_DECREF(list);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   608
error_dir:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   609
	close(dfd);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   610
error_value:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   611
	return ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   612
}
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   613
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   614
#endif /* __APPLE__ */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   615
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   616
static PyObject *_listdir(char *path, int pathlen, int keepstat, char *skip)
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   617
{
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   618
#ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   619
	PyObject *ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   620
	bool fallback = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   621
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   622
	ret = _listdir_batch(path, pathlen, keepstat, skip, &fallback);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   623
	if (ret != NULL || !fallback)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   624
		return ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
   625
#endif
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   626
	return _listdir_stat(path, pathlen, keepstat, skip);
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   627
}
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
   628
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   629
static PyObject *statfiles(PyObject *self, PyObject *args)
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   630
{
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   631
	PyObject *names, *stats;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   632
	Py_ssize_t i, count;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   633
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   634
	if (!PyArg_ParseTuple(args, "O:statfiles", &names))
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   635
		return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   636
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   637
	count = PySequence_Length(names);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   638
	if (count == -1) {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   639
		PyErr_SetString(PyExc_TypeError, "not a sequence");
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   640
		return NULL;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   641
	}
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   642
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   643
	stats = PyList_New(count);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   644
	if (stats == NULL)
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   645
		return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   646
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   647
	for (i = 0; i < count; i++) {
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
   648
		PyObject *stat, *pypath;
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   649
		struct stat st;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   650
		int ret, kind;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   651
		char *path;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   652
26983
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
   653
		/* With a large file count or on a slow filesystem,
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
   654
		   don't block signals for long (issue4878). */
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
   655
		if ((i % 1000) == 999 && PyErr_CheckSignals() == -1)
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
   656
			goto bail;
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
   657
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
   658
		pypath = PySequence_GetItem(names, i);
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
   659
		if (!pypath)
26982
fa6685ea7ad8 osutil: don't leak on statfiles error
Bryan O'Sullivan <bos@serpentine.com>
parents: 24462
diff changeset
   660
			goto bail;
30098
301ef65e8ebb osutil: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28593
diff changeset
   661
		path = PyBytes_AsString(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   662
		if (path == NULL) {
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
   663
			Py_DECREF(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   664
			PyErr_SetString(PyExc_TypeError, "not a string");
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   665
			goto bail;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   666
		}
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   667
		ret = lstat(path, &st);
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
   668
		Py_DECREF(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   669
		kind = st.st_mode & S_IFMT;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   670
		if (ret != -1 && (kind == S_IFREG || kind == S_IFLNK)) {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   671
			stat = makestat(&st);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   672
			if (stat == NULL)
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   673
				goto bail;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   674
			PyList_SET_ITEM(stats, i, stat);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   675
		} else {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   676
			Py_INCREF(Py_None);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   677
			PyList_SET_ITEM(stats, i, Py_None);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   678
		}
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   679
	}
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   680
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   681
	return stats;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   682
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   683
bail:
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   684
	Py_DECREF(stats);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
   685
	return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   686
}
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
   687
42961
460f8bf58020 osutil: allow disabling setprocname via a define passed to the compiler
Kyle Lippincott <spectral@google.com>
parents: 42069
diff changeset
   688
/* allow disabling setprocname via compiler flags */
460f8bf58020 osutil: allow disabling setprocname via a define passed to the compiler
Kyle Lippincott <spectral@google.com>
parents: 42069
diff changeset
   689
#ifndef SETPROCNAME_USE_NONE
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   690
#if defined(HAVE_SETPROCTITLE)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   691
/* setproctitle is the first choice - available in FreeBSD */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   692
#define SETPROCNAME_USE_SETPROCTITLE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   693
#else
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   694
#define SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   695
#endif
42961
460f8bf58020 osutil: allow disabling setprocname via a define passed to the compiler
Kyle Lippincott <spectral@google.com>
parents: 42069
diff changeset
   696
#endif /* ndef SETPROCNAME_USE_NONE */
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   697
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   698
#ifndef SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   699
static PyObject *setprocname(PyObject *self, PyObject *args)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   700
{
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   701
	const char *name = NULL;
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
   702
	if (!PyArg_ParseTuple(args, "y", &name))
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   703
		return NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   704
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   705
#if defined(SETPROCNAME_USE_SETPROCTITLE)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   706
	setproctitle("%s", name);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   707
#endif
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   708
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   709
	Py_RETURN_NONE;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   710
}
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   711
#endif /* ndef SETPROCNAME_USE_NONE */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
   712
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
   713
#if defined(HAVE_BSD_STATFS)
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
   714
static const char *describefstype(const struct statfs *pbuf)
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
   715
{
31597
2d501fb60b2d osutil: report fstype for BSD and OSX
Jun Wu <quark@fb.com>
parents: 31564
diff changeset
   716
	/* BSD or OSX provides a f_fstypename field */
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   717
	return pbuf->f_fstypename;
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
   718
}
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
   719
#elif defined(HAVE_LINUX_STATFS)
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
   720
static const char *describefstype(const struct statfs *pbuf)
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
   721
{
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   722
	/* Begin of Linux filesystems */
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   723
#ifdef ADFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   724
	if (pbuf->f_type == ADFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   725
		return "adfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   726
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   727
#ifdef AFFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   728
	if (pbuf->f_type == AFFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   729
		return "affs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   730
#endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   731
#ifdef AUTOFS_SUPER_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   732
	if (pbuf->f_type == AUTOFS_SUPER_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   733
		return "autofs";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   734
#endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   735
#ifdef BDEVFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   736
	if (pbuf->f_type == BDEVFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   737
		return "bdevfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   738
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   739
#ifdef BEFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   740
	if (pbuf->f_type == BEFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   741
		return "befs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   742
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   743
#ifdef BFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   744
	if (pbuf->f_type == BFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   745
		return "bfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   746
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   747
#ifdef BINFMTFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   748
	if (pbuf->f_type == BINFMTFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   749
		return "binfmtfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   750
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   751
#ifdef BTRFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   752
	if (pbuf->f_type == BTRFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   753
		return "btrfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   754
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   755
#ifdef CGROUP_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   756
	if (pbuf->f_type == CGROUP_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   757
		return "cgroup";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   758
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   759
#ifdef CIFS_MAGIC_NUMBER
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   760
	if (pbuf->f_type == CIFS_MAGIC_NUMBER)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   761
		return "cifs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   762
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   763
#ifdef CODA_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   764
	if (pbuf->f_type == CODA_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   765
		return "coda";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   766
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   767
#ifdef COH_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   768
	if (pbuf->f_type == COH_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   769
		return "coh";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   770
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   771
#ifdef CRAMFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   772
	if (pbuf->f_type == CRAMFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   773
		return "cramfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   774
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   775
#ifdef DEBUGFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   776
	if (pbuf->f_type == DEBUGFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   777
		return "debugfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   778
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   779
#ifdef DEVFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   780
	if (pbuf->f_type == DEVFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   781
		return "devfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   782
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   783
#ifdef DEVPTS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   784
	if (pbuf->f_type == DEVPTS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   785
		return "devpts";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   786
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   787
#ifdef EFIVARFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   788
	if (pbuf->f_type == EFIVARFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   789
		return "efivarfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   790
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   791
#ifdef EFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   792
	if (pbuf->f_type == EFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   793
		return "efs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   794
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   795
#ifdef EXT_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   796
	if (pbuf->f_type == EXT_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   797
		return "ext";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   798
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   799
#ifdef EXT2_OLD_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   800
	if (pbuf->f_type == EXT2_OLD_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   801
		return "ext2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   802
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   803
#ifdef EXT2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   804
	if (pbuf->f_type == EXT2_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   805
		return "ext2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   806
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   807
#ifdef EXT3_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   808
	if (pbuf->f_type == EXT3_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   809
		return "ext3";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   810
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   811
#ifdef EXT4_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   812
	if (pbuf->f_type == EXT4_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   813
		return "ext4";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   814
#endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   815
#ifdef F2FS_SUPER_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   816
	if (pbuf->f_type == F2FS_SUPER_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   817
		return "f2fs";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   818
#endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   819
#ifdef FUSE_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   820
	if (pbuf->f_type == FUSE_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   821
		return "fuse";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   822
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   823
#ifdef FUTEXFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   824
	if (pbuf->f_type == FUTEXFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   825
		return "futexfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   826
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   827
#ifdef HFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   828
	if (pbuf->f_type == HFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   829
		return "hfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   830
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   831
#ifdef HOSTFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   832
	if (pbuf->f_type == HOSTFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   833
		return "hostfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   834
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   835
#ifdef HPFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   836
	if (pbuf->f_type == HPFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   837
		return "hpfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   838
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   839
#ifdef HUGETLBFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   840
	if (pbuf->f_type == HUGETLBFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   841
		return "hugetlbfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   842
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   843
#ifdef ISOFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   844
	if (pbuf->f_type == ISOFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   845
		return "isofs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   846
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   847
#ifdef JFFS2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   848
	if (pbuf->f_type == JFFS2_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   849
		return "jffs2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   850
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   851
#ifdef JFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   852
	if (pbuf->f_type == JFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   853
		return "jfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   854
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   855
#ifdef MINIX_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   856
	if (pbuf->f_type == MINIX_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   857
		return "minix";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   858
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   859
#ifdef MINIX2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   860
	if (pbuf->f_type == MINIX2_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   861
		return "minix2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   862
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   863
#ifdef MINIX3_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   864
	if (pbuf->f_type == MINIX3_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   865
		return "minix3";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   866
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   867
#ifdef MQUEUE_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   868
	if (pbuf->f_type == MQUEUE_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   869
		return "mqueue";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   870
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   871
#ifdef MSDOS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   872
	if (pbuf->f_type == MSDOS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   873
		return "msdos";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   874
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   875
#ifdef NCP_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   876
	if (pbuf->f_type == NCP_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   877
		return "ncp";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   878
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   879
#ifdef NFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   880
	if (pbuf->f_type == NFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   881
		return "nfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   882
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   883
#ifdef NILFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   884
	if (pbuf->f_type == NILFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   885
		return "nilfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   886
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   887
#ifdef NTFS_SB_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   888
	if (pbuf->f_type == NTFS_SB_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   889
		return "ntfs-sb";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   890
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   891
#ifdef OCFS2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   892
	if (pbuf->f_type == OCFS2_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   893
		return "ocfs2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   894
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   895
#ifdef OPENPROM_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   896
	if (pbuf->f_type == OPENPROM_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   897
		return "openprom";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   898
#endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   899
#ifdef OVERLAYFS_SUPER_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   900
	if (pbuf->f_type == OVERLAYFS_SUPER_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   901
		return "overlay";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   902
#endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   903
#ifdef PIPEFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   904
	if (pbuf->f_type == PIPEFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   905
		return "pipefs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   906
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   907
#ifdef PROC_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   908
	if (pbuf->f_type == PROC_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   909
		return "proc";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   910
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   911
#ifdef PSTOREFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   912
	if (pbuf->f_type == PSTOREFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   913
		return "pstorefs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   914
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   915
#ifdef QNX4_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   916
	if (pbuf->f_type == QNX4_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   917
		return "qnx4";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   918
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   919
#ifdef QNX6_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   920
	if (pbuf->f_type == QNX6_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   921
		return "qnx6";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   922
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   923
#ifdef RAMFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   924
	if (pbuf->f_type == RAMFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   925
		return "ramfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   926
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   927
#ifdef REISERFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   928
	if (pbuf->f_type == REISERFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   929
		return "reiserfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   930
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   931
#ifdef ROMFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   932
	if (pbuf->f_type == ROMFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   933
		return "romfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   934
#endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   935
#ifdef SECURITYFS_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   936
	if (pbuf->f_type == SECURITYFS_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   937
		return "securityfs";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
   938
#endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   939
#ifdef SELINUX_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   940
	if (pbuf->f_type == SELINUX_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   941
		return "selinux";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   942
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   943
#ifdef SMACK_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   944
	if (pbuf->f_type == SMACK_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   945
		return "smack";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   946
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   947
#ifdef SMB_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   948
	if (pbuf->f_type == SMB_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   949
		return "smb";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   950
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   951
#ifdef SOCKFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   952
	if (pbuf->f_type == SOCKFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   953
		return "sockfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   954
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   955
#ifdef SQUASHFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   956
	if (pbuf->f_type == SQUASHFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   957
		return "squashfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   958
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   959
#ifdef SYSFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   960
	if (pbuf->f_type == SYSFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   961
		return "sysfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   962
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   963
#ifdef SYSV2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   964
	if (pbuf->f_type == SYSV2_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   965
		return "sysv2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   966
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   967
#ifdef SYSV4_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   968
	if (pbuf->f_type == SYSV4_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   969
		return "sysv4";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   970
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   971
#ifdef TMPFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   972
	if (pbuf->f_type == TMPFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   973
		return "tmpfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   974
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   975
#ifdef UDF_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   976
	if (pbuf->f_type == UDF_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   977
		return "udf";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   978
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   979
#ifdef UFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   980
	if (pbuf->f_type == UFS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   981
		return "ufs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   982
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   983
#ifdef USBDEVICE_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   984
	if (pbuf->f_type == USBDEVICE_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   985
		return "usbdevice";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   986
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   987
#ifdef V9FS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   988
	if (pbuf->f_type == V9FS_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   989
		return "v9fs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   990
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   991
#ifdef VXFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   992
	if (pbuf->f_type == VXFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   993
		return "vxfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   994
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   995
#ifdef XENFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
   996
	if (pbuf->f_type == XENFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   997
		return "xenfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   998
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
   999
#ifdef XENIX_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
  1000
	if (pbuf->f_type == XENIX_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1001
		return "xenix";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1002
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1003
#ifdef XFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
  1004
	if (pbuf->f_type == XFS_SUPER_MAGIC)
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1005
		return "xfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1006
#endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1007
	/* End of Linux filesystems */
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1008
	return NULL;
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1009
}
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
  1010
#endif /* def HAVE_LINUX_STATFS */
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1011
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
  1012
#if defined(HAVE_BSD_STATFS) || defined(HAVE_LINUX_STATFS)
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
  1013
/* given a directory path, return filesystem type name (best-effort) */
31677
58d4622bc1ef statfs: rename pygetfstype to getfstype
Yuya Nishihara <yuya@tcha.org>
parents: 31676
diff changeset
  1014
static PyObject *getfstype(PyObject *self, PyObject *args)
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1015
{
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1016
	const char *path = NULL;
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
  1017
	struct statfs buf;
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
  1018
	int r;
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
  1019
	if (!PyArg_ParseTuple(args, "y", &path))
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1020
		return NULL;
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1021
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
  1022
	memset(&buf, 0, sizeof(buf));
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
  1023
	r = statfs(path, &buf);
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
  1024
	if (r != 0)
31678
1ed57a7dd904 statfs: make getfstype() raise OSError
Yuya Nishihara <yuya@tcha.org>
parents: 31677
diff changeset
  1025
		return PyErr_SetFromErrno(PyExc_OSError);
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
  1026
	return Py_BuildValue("y", describefstype(&buf));
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1027
}
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
  1028
#endif /* defined(HAVE_LINUX_STATFS) || defined(HAVE_BSD_STATFS) */
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
  1029
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1030
#if defined(HAVE_BSD_STATFS)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1031
/* given a directory path, return filesystem mount point (best-effort) */
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1032
static PyObject *getfsmountpoint(PyObject *self, PyObject *args)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1033
{
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1034
	const char *path = NULL;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1035
	struct statfs buf;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1036
	int r;
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
  1037
	if (!PyArg_ParseTuple(args, "y", &path))
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1038
		return NULL;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1039
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1040
	memset(&buf, 0, sizeof(buf));
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1041
	r = statfs(path, &buf);
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1042
	if (r != 0)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1043
		return PyErr_SetFromErrno(PyExc_OSError);
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
  1044
	return Py_BuildValue("y", buf.f_mntonname);
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1045
}
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1046
#endif /* defined(HAVE_BSD_STATFS) */
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1047
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1048
static PyObject *unblocksignal(PyObject *self, PyObject *args)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1049
{
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1050
	int sig = 0;
44586
0424a9134bcf osutil: move declaration to top of the scope
Yuya Nishihara <yuya@tcha.org>
parents: 42962
diff changeset
  1051
	sigset_t set;
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1052
	int r;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1053
	if (!PyArg_ParseTuple(args, "i", &sig))
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1054
		return NULL;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1055
	r = sigemptyset(&set);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1056
	if (r != 0)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1057
		return PyErr_SetFromErrno(PyExc_OSError);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1058
	r = sigaddset(&set, sig);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1059
	if (r != 0)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1060
		return PyErr_SetFromErrno(PyExc_OSError);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1061
	r = sigprocmask(SIG_UNBLOCK, &set, NULL);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1062
	if (r != 0)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1063
		return PyErr_SetFromErrno(PyExc_OSError);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1064
	Py_RETURN_NONE;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1065
}
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1066
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
  1067
#endif /* ndef _WIN32 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
  1068
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1069
static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs)
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1070
{
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1071
	PyObject *statobj = NULL; /* initialize - optional arg */
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1072
	PyObject *skipobj = NULL; /* initialize - optional arg */
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1073
	char *path, *skip = NULL;
42069
668eff08387f cext: make osutil.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39610
diff changeset
  1074
	Py_ssize_t plen;
668eff08387f cext: make osutil.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39610
diff changeset
  1075
	int wantstat;
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1076
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1077
	static char *kwlist[] = {"path", "stat", "skip", NULL};
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1078
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
  1079
	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y#|OO:listdir",
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1080
			kwlist, &path, &plen, &statobj, &skipobj))
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1081
		return NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1082
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1083
	wantstat = statobj && PyObject_IsTrue(statobj);
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1084
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1085
	if (skipobj && skipobj != Py_None) {
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1086
		skip = PyBytes_AsString(skipobj);
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1087
		if (!skip)
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1088
			return NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1089
	}
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1090
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1091
	return _listdir(path, plen, wantstat, skip);
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1092
}
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
  1093
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1094
#ifdef _WIN32
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1095
static PyObject *posixfile(PyObject *self, PyObject *args, PyObject *kwds)
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1096
{
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1097
	static char *kwlist[] = {"name", "mode", "buffering", NULL};
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1098
	PyObject *file_obj = NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1099
	char *name = NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1100
	char *mode = "rb";
8597
dc1b9e22f288 osutil: silence uninitialized variable warning
Patrick Mezard <pmezard@gmail.com>
parents: 8330
diff changeset
  1101
	DWORD access = 0;
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1102
	DWORD creation;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1103
	HANDLE handle;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1104
	int fd, flags = 0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1105
	int bufsize = -1;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1106
	char m0, m1, m2;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1107
	char fpmode[4];
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1108
	int fppos = 0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1109
	int plus;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1110
48821
b0dd39b91e7a cext: remove PY23()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48815
diff changeset
  1111
	if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|yi:posixfile",
36620
186c6df3a373 py3: bulk-replace 'const char*' format specifier passed to PyArg_ParseTuple*()
Yuya Nishihara <yuya@tcha.org>
parents: 36619
diff changeset
  1112
					 kwlist,
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1113
					 Py_FileSystemDefaultEncoding,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1114
					 &name, &mode, &bufsize))
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1115
		return NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1116
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1117
	m0 = mode[0];
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1118
	m1 = m0 ? mode[1] : '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1119
	m2 = m1 ? mode[2] : '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1120
	plus = m1 == '+' || m2 == '+';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1121
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1122
	fpmode[fppos++] = m0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1123
	if (m1 == 'b' || m2 == 'b') {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1124
		flags = _O_BINARY;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1125
		fpmode[fppos++] = 'b';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1126
	}
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1127
	else
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1128
		flags = _O_TEXT;
13273
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1129
	if (m0 == 'r' && !plus) {
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1130
		flags |= _O_RDONLY;
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1131
		access = GENERIC_READ;
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1132
	} else {
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1133
		/*
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1134
		work around http://support.microsoft.com/kb/899149 and
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1135
		set _O_RDWR for 'w' and 'a', even if mode has no '+'
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
  1136
		*/
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1137
		flags |= _O_RDWR;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1138
		access = GENERIC_READ | GENERIC_WRITE;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1139
		fpmode[fppos++] = '+';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1140
	}
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1141
	fpmode[fppos++] = '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1142
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1143
	switch (m0) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1144
	case 'r':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1145
		creation = OPEN_EXISTING;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1146
		break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1147
	case 'w':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1148
		creation = CREATE_ALWAYS;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1149
		break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1150
	case 'a':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1151
		creation = OPEN_ALWAYS;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1152
		flags |= _O_APPEND;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1153
		break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1154
	default:
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1155
		PyErr_Format(PyExc_ValueError,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1156
			     "mode string must begin with one of 'r', 'w', "
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1157
			     "or 'a', not '%c'", m0);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1158
		goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1159
	}
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1160
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1161
	handle = CreateFile(name, access,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1162
			    FILE_SHARE_READ | FILE_SHARE_WRITE |
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1163
			    FILE_SHARE_DELETE,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1164
			    NULL,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1165
			    creation,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1166
			    FILE_ATTRIBUTE_NORMAL,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1167
			    0);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1168
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1169
	if (handle == INVALID_HANDLE_VALUE) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1170
		PyErr_SetFromWindowsErrWithFilename(GetLastError(), name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1171
		goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1172
	}
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1173
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
  1174
	fd = _open_osfhandle((intptr_t)handle, flags);
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1175
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1176
	if (fd == -1) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1177
		CloseHandle(handle);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1178
		PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1179
		goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1180
	}
48840
499733de460f cext: backout e9ca736f5b52 "remove Python 2 file handling code"
Yuya Nishihara <yuya@tcha.org>
parents: 48822
diff changeset
  1181
	file_obj = PyFile_FromFd(fd, name, mode, bufsize, NULL, NULL, NULL, 1);
499733de460f cext: backout e9ca736f5b52 "remove Python 2 file handling code"
Yuya Nishihara <yuya@tcha.org>
parents: 48822
diff changeset
  1182
	if (file_obj == NULL)
499733de460f cext: backout e9ca736f5b52 "remove Python 2 file handling code"
Yuya Nishihara <yuya@tcha.org>
parents: 48822
diff changeset
  1183
		goto bail;
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1184
bail:
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1185
	PyMem_Free(name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1186
	return file_obj;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1187
}
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1188
#endif
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1189
13734
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1190
#ifdef __APPLE__
13748
26f8844d1757 osutil: replace #import with #include, and add a check for it
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13736
diff changeset
  1191
#include <ApplicationServices/ApplicationServices.h>
13734
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1192
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1193
static PyObject *isgui(PyObject *self)
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1194
{
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1195
	CFDictionaryRef dict = CGSessionCopyCurrentDictionary();
13734
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1196
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1197
	if (dict != NULL) {
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1198
		CFRelease(dict);
15094
258eee414ab7 osutil: avoid accidentally destroying the True object in isgui (issue2937)
Steve Streeting <steve@stevestreeting.com>
parents: 13748
diff changeset
  1199
		Py_RETURN_TRUE;
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1200
	} else {
15094
258eee414ab7 osutil: avoid accidentally destroying the True object in isgui (issue2937)
Steve Streeting <steve@stevestreeting.com>
parents: 13748
diff changeset
  1201
		Py_RETURN_FALSE;
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1202
	}
13734
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1203
}
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1204
#endif
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1205
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1206
static char osutil_doc[] = "Native operating system services.";
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1207
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1208
static PyMethodDef methods[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
  1209
	{"listdir", (PyCFunction)listdir, METH_VARARGS | METH_KEYWORDS,
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
  1210
	 "list a directory\n"},
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1211
#ifdef _WIN32
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1212
	{"posixfile", (PyCFunction)posixfile, METH_VARARGS | METH_KEYWORDS,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1213
	 "Open a file with POSIX-like semantics.\n"
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
  1214
"On error, this function may raise either a WindowsError or an IOError."},
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
  1215
#else
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
  1216
	{"statfiles", (PyCFunction)statfiles, METH_VARARGS | METH_KEYWORDS,
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
  1217
	 "stat a series of files or symlinks\n"
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
  1218
"Returns None for non-existent entries and entries of other types.\n"},
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
  1219
#ifndef SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
  1220
	{"setprocname", (PyCFunction)setprocname, METH_VARARGS,
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
  1221
	 "set process title (best-effort)\n"},
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
  1222
#endif
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
  1223
#if defined(HAVE_BSD_STATFS) || defined(HAVE_LINUX_STATFS)
31677
58d4622bc1ef statfs: rename pygetfstype to getfstype
Yuya Nishihara <yuya@tcha.org>
parents: 31676
diff changeset
  1224
	{"getfstype", (PyCFunction)getfstype, METH_VARARGS,
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1225
	 "get filesystem type (best-effort)\n"},
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
  1226
#endif
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1227
#if defined(HAVE_BSD_STATFS)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1228
	{"getfsmountpoint", (PyCFunction)getfsmountpoint, METH_VARARGS,
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1229
	 "get filesystem mount point (best-effort)\n"},
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
  1230
#endif
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1231
	{"unblocksignal", (PyCFunction)unblocksignal, METH_VARARGS,
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
  1232
	 "change signal mask to unblock a given signal\n"},
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
  1233
#endif /* ndef _WIN32 */
13734
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1234
#ifdef __APPLE__
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1235
	{
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1236
		"isgui", (PyCFunction)isgui, METH_NOARGS,
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1237
		"Is a CoreGraphics session available?"
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
  1238
	},
13734
16118b4859a1 util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13302
diff changeset
  1239
#endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
  1240
	{NULL, NULL}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1241
};
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1242
36780
f3c314020beb osutil: implement minimal __getitem__ compatibility on our custom listdir type
Augie Fackler <augie@google.com>
parents: 36620
diff changeset
  1243
static const int version = 4;
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
  1244
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1245
static struct PyModuleDef osutil_module = {
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1246
	PyModuleDef_HEAD_INIT,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1247
	"osutil",
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1248
	osutil_doc,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1249
	-1,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1250
	methods
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1251
};
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1252
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1253
PyMODINIT_FUNC PyInit_osutil(void)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1254
{
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
  1255
	PyObject *m;
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1256
	if (PyType_Ready(&listdir_stat_type) < 0)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1257
		return NULL;
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1258
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
  1259
	m = PyModule_Create(&osutil_module);
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
  1260
	PyModule_AddIntConstant(m, "version", version);
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
  1261
	return m;
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
  1262
}