annotate mercurial/cext/osutil.c @ 35816:f6ca1e11d8b4 stable

revset: evaluate filesets against each revision for 'file()' (issue5778) After f2aeff8a87b6, the fileset was evaluated to a set of files against the working directory, and then those files were applied against each revision. The result was nonsense. For example, `hg log -r 'file("set:exec()")'` on the Mercurial repo listed revision 0 because it has the `hg` script, which is currently +x. But that bit wasn't applied until revision 280 (which 'contains()' properly indicates). This technique was borrowed from checkstatus(), which services adds(), modifies(), and removes(), so it seems safe enough. The 'r:' case is explicitly assigned to wdirrev, freeing up rev=None to mean "re-evaluate at each revision". The distinction is important to avoid behavior changes with `hg log set:...` (test-largefiles-misc.t and test-fileset-generated.t drop current log output without this). I'm not sure what the right behavior for that is (1fd352aa08fc explicitly enabled this behavior for graphlog), but the day before the release isn't the time to experiment.
author Matt Harbison <matt_harbison@yahoo.com>
date Sun, 28 Jan 2018 14:08:59 -0500
parents e01549a7bf0a
children 1f8c3fadbb8e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
4 Copyright 2007 Matt Mackall and others
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
5397
11caa374f497 osutil.c: include Python.h before the other headers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5396
diff changeset
11 #include <Python.h>
34438
b90e8da190da cext: reorder #include
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32367
diff changeset
12 #include <errno.h>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
13 #include <fcntl.h>
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
14 #include <stdio.h>
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
15 #include <stdlib.h>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
16 #include <string.h>
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
17
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
18 #ifdef _WIN32
34438
b90e8da190da cext: reorder #include
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32367
diff changeset
19 #include <io.h>
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
20 #include <windows.h>
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
21 #else
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
22 #include <dirent.h>
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
23 #include <signal.h>
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
24 #include <sys/socket.h>
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
25 #include <sys/stat.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
26 #include <sys/types.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
27 #include <unistd.h>
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
28 #ifdef HAVE_LINUX_STATFS
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
29 #include <linux/magic.h>
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
30 #include <sys/vfs.h>
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
31 #endif
31597
2d501fb60b2d osutil: report fstype for BSD and OSX
Jun Wu <quark@fb.com>
parents: 31564
diff changeset
32 #ifdef HAVE_BSD_STATFS
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
33 #include <sys/mount.h>
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
34 #include <sys/param.h>
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
35 #endif
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
36 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
37
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
38 #ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
39 #include <sys/attr.h>
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
40 #include <sys/vnode.h>
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
41 #endif
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
42
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
43 #include "util.h"
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
44
9353
3ac42ca1f3e6 osutil: fix compilation with -ansi
Sebastien Binet <binet@cern.ch>
parents: 8723
diff changeset
45 /* 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
46 #ifndef PATH_MAX
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
47 #define PATH_MAX 4096
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
48 #endif
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
49
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
50 #ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
51 /*
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
52 stat struct compatible with hg expectations
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
53 Mercurial only uses st_mode, st_size and st_mtime
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
54 the rest is kept to minimize changes between implementations
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
55 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
56 struct hg_stat {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
57 int st_dev;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
58 int st_mode;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
59 int st_nlink;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
60 __int64 st_size;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
61 int st_mtime;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
62 int st_ctime;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
63 };
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
64 struct listdir_stat {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
65 PyObject_HEAD
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
66 struct hg_stat st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
67 };
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
68 #else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
69 struct listdir_stat {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
70 PyObject_HEAD
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
71 struct stat st;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
72 };
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
73 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
74
30111
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
75 #ifdef IS_PY3K
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 }
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
81 #else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
82 #define listdir_slot(name) \
7190
aecea6934fdd Some additional space/tab cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7136
diff changeset
83 static PyObject *listdir_stat_##name(PyObject *self, void *x) \
aecea6934fdd Some additional space/tab cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7136
diff changeset
84 { \
aecea6934fdd Some additional space/tab cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7136
diff changeset
85 return PyInt_FromLong(((struct listdir_stat *)self)->st.name); \
aecea6934fdd Some additional space/tab cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7136
diff changeset
86 }
30111
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
87 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
88
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
89 listdir_slot(st_dev)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
90 listdir_slot(st_mode)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
91 listdir_slot(st_nlink)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
92 #ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
93 static PyObject *listdir_stat_st_size(PyObject *self, void *x)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
94 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
95 return PyLong_FromLongLong(
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
96 (PY_LONG_LONG)((struct listdir_stat *)self)->st.st_size);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
97 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
98 #else
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
99 listdir_slot(st_size)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
100 #endif
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
101 listdir_slot(st_mtime)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
102 listdir_slot(st_ctime)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
103
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
104 static struct PyGetSetDef listdir_stat_getsets[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
105 {"st_dev", listdir_stat_st_dev, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
106 {"st_mode", listdir_stat_st_mode, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
107 {"st_nlink", listdir_stat_st_nlink, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
108 {"st_size", listdir_stat_st_size, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
109 {"st_mtime", listdir_stat_st_mtime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
110 {"st_ctime", listdir_stat_st_ctime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
111 {0, 0, 0, 0, 0}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
112 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
113
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
114 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
115 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
116 return t->tp_alloc(t, 0);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
117 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
118
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
119 static void listdir_stat_dealloc(PyObject *o)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
120 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
121 o->ob_type->tp_free(o);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
122 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
123
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
124 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
125 PyVarObject_HEAD_INIT(NULL, 0) /* header */
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
126 "osutil.stat", /*tp_name*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
127 sizeof(struct listdir_stat), /*tp_basicsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
128 0, /*tp_itemsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
129 (destructor)listdir_stat_dealloc, /*tp_dealloc*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
130 0, /*tp_print*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
131 0, /*tp_getattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
132 0, /*tp_setattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
133 0, /*tp_compare*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
134 0, /*tp_repr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
135 0, /*tp_as_number*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
136 0, /*tp_as_sequence*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
137 0, /*tp_as_mapping*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
138 0, /*tp_hash */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
139 0, /*tp_call*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
140 0, /*tp_str*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
141 0, /*tp_getattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
142 0, /*tp_setattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
143 0, /*tp_as_buffer*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
144 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
145 "stat objects", /* tp_doc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
146 0, /* tp_traverse */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
147 0, /* tp_clear */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
148 0, /* tp_richcompare */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
149 0, /* tp_weaklistoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
150 0, /* tp_iter */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
151 0, /* tp_iternext */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
152 0, /* tp_methods */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
153 0, /* tp_members */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
154 listdir_stat_getsets, /* tp_getset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
155 0, /* tp_base */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
156 0, /* tp_dict */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
157 0, /* tp_descr_get */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
158 0, /* tp_descr_set */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
159 0, /* tp_dictoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
160 0, /* tp_init */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
161 0, /* tp_alloc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
162 listdir_stat_new, /* tp_new */
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
163 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
164
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
165 #ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
166
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
167 static int to_python_time(const FILETIME *tm)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
168 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
169 /* number of seconds between epoch and January 1 1601 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
170 const __int64 a0 = (__int64)134774L * (__int64)24L * (__int64)3600L;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
171 /* conversion factor from 100ns to 1s */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
172 const __int64 a1 = 10000000;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
173 /* explicit (int) cast to suspend compiler warnings */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
174 return (int)((((__int64)tm->dwHighDateTime << 32)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
175 + tm->dwLowDateTime) / a1 - a0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
176 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
177
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
178 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
179 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
180 PyObject *py_st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
181 struct hg_stat *stp;
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 int kind = (fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
184 ? _S_IFDIR : _S_IFREG;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
185
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
186 if (!wantstat)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
187 return Py_BuildValue("si", fd->cFileName, kind);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
188
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
189 py_st = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
190 if (!py_st)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
191 return NULL;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
192
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
193 stp = &((struct listdir_stat *)py_st)->st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
194 /*
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
195 use kind as st_mode
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
196 rwx bits on Win32 are meaningless
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
197 and Hg does not use them anyway
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
198 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
199 stp->st_mode = kind;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
200 stp->st_mtime = to_python_time(&fd->ftLastWriteTime);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
201 stp->st_ctime = to_python_time(&fd->ftCreationTime);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
202 if (kind == _S_IFREG)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
203 stp->st_size = ((__int64)fd->nFileSizeHigh << 32)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
204 + fd->nFileSizeLow;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
205 return Py_BuildValue("siN", fd->cFileName,
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
206 kind, py_st);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
207 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
208
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
209 static PyObject *_listdir(char *path, int plen, int wantstat, char *skip)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
210 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
211 PyObject *rval = NULL; /* initialize - return value */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
212 PyObject *list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
213 HANDLE fh;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
214 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
215 char *pattern;
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
216
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
217 /* build the path + \* pattern string */
31468
b9dd03ed564f osutil: use Python memory allocator in _listdir
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30409
diff changeset
218 pattern = PyMem_Malloc(plen + 3); /* path + \* + \0 */
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
219 if (!pattern) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
220 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
221 goto error_nomem;
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
222 }
28593
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
223 memcpy(pattern, path, plen);
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 if (plen > 0) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
226 char c = path[plen-1];
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
227 if (c != ':' && c != '/' && c != '\\')
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
228 pattern[plen++] = '\\';
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
229 }
28593
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
230 pattern[plen++] = '*';
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
231 pattern[plen] = '\0';
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
232
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
233 fh = FindFirstFileA(pattern, &fd);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
234 if (fh == INVALID_HANDLE_VALUE) {
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
235 PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
236 goto error_file;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
237 }
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 list = PyList_New(0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
240 if (!list)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
241 goto error_list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
242
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
243 do {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
244 PyObject *item;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
245
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
246 if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
247 if (!strcmp(fd.cFileName, ".")
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
248 || !strcmp(fd.cFileName, ".."))
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
249 continue;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
250
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
251 if (skip && !strcmp(fd.cFileName, skip)) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
252 rval = PyList_New(0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
253 goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
254 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
255 }
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 item = make_item(&fd, wantstat);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
258 if (!item)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
259 goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
260
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
261 if (PyList_Append(list, item)) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
262 Py_XDECREF(item);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
263 goto error;
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
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
266 Py_XDECREF(item);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
267 } while (FindNextFileA(fh, &fd));
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 if (GetLastError() != ERROR_NO_MORE_FILES) {
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
270 PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
271 goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
272 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
273
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
274 rval = list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
275 Py_XINCREF(rval);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
276 error:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
277 Py_XDECREF(list);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
278 error_list:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
279 FindClose(fh);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
280 error_file:
31468
b9dd03ed564f osutil: use Python memory allocator in _listdir
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30409
diff changeset
281 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
282 error_nomem:
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
283 return rval;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
284 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
285
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
286 #else
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
287
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
288 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
289 {
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
290 #ifdef DT_REG
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
291 switch (ent->d_type) {
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
292 case DT_REG: return S_IFREG;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
293 case DT_DIR: return S_IFDIR;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
294 case DT_LNK: return S_IFLNK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
295 case DT_BLK: return S_IFBLK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
296 case DT_CHR: return S_IFCHR;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
297 case DT_FIFO: return S_IFIFO;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
298 case DT_SOCK: return S_IFSOCK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
299 }
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
300 #endif
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
301 return -1;
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
302 }
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
303
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
304 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
305 {
18021
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
306 PyObject *stat;
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
307
18021
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
308 stat = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
309 if (stat)
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
310 memcpy(&((struct listdir_stat *)stat)->st, st, sizeof(*st));
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
311 return stat;
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
312 }
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
313
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
314 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
315 char *skip)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
316 {
23962
1f3b94e8dc40 osutil: fix leak of stat in makestat when Py_BuildValue fails
Augie Fackler <augie@google.com>
parents: 23961
diff changeset
317 PyObject *list, *elem, *stat = NULL, *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
318 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
319 int kind, err;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
320 struct stat st;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
321 struct dirent *ent;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
322 DIR *dir;
7136
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
323 #ifdef AT_SYMLINK_NOFOLLOW
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
324 int dfd = -1;
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
325 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
326
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
327 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
328 errno = ENAMETOOLONG;
f79d47813b8b osutil: emulate os.listdir's OSError for long names (issue2898)
Matt Mackall <mpm@selenic.com>
parents: 13748
diff changeset
329 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
330 goto error_value;
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
331 }
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
332 strncpy(fullpath, path, PATH_MAX);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
333 fullpath[pathlen] = '/';
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
334
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
335 #ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
336 dfd = open(path, O_RDONLY);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
337 if (dfd == -1) {
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
338 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
339 goto error_value;
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
340 }
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
341 dir = fdopendir(dfd);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
342 #else
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
343 dir = opendir(path);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
344 #endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
345 if (!dir) {
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
346 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
347 goto error_dir;
23961
bc851e2851b1 osutil.c: clean up space before a tab
Augie Fackler <augie@google.com>
parents: 18027
diff changeset
348 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
349
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
350 list = PyList_New(0);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
351 if (!list)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
352 goto error_list;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
353
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
354 while ((ent = readdir(dir))) {
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
355 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
356 continue;
5416
ca890c0c3f1f osutil.c: style fix - delete trailing end-of-line spaces
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 5398
diff changeset
357
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
358 kind = entkind(ent);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
359 if (kind == -1 || keepstat) {
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
360 #ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
361 err = fstatat(dfd, ent->d_name, &st,
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
362 AT_SYMLINK_NOFOLLOW);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
363 #else
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
364 strncpy(fullpath + pathlen + 1, ent->d_name,
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
365 PATH_MAX - pathlen);
24462
40b05303ac32 osutil: mark end of string with null char, not 0
Siddharth Agarwal <sid0@fb.com>
parents: 24461
diff changeset
366 fullpath[PATH_MAX] = '\0';
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
367 err = lstat(fullpath, &st);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
368 #endif
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
369 if (err == -1) {
16747
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
370 /* race with file deletion? */
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
371 if (errno == ENOENT)
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
372 continue;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
373 strncpy(fullpath + pathlen + 1, ent->d_name,
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
374 PATH_MAX - pathlen);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
375 fullpath[PATH_MAX] = 0;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
376 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
377 fullpath);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
378 goto error;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
379 }
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
380 kind = st.st_mode & S_IFMT;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
381 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
382
7034
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
383 /* quit early? */
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
384 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
385 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
386 goto error;
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
387 }
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
388
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
389 if (keepstat) {
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
390 stat = makestat(&st);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
391 if (!stat)
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 elem = Py_BuildValue("siN", ent->d_name, kind, stat);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
394 } else
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
395 elem = Py_BuildValue("si", ent->d_name, kind);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
396 if (!elem)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
397 goto error;
23962
1f3b94e8dc40 osutil: fix leak of stat in makestat when Py_BuildValue fails
Augie Fackler <augie@google.com>
parents: 23961
diff changeset
398 stat = NULL;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
399
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
400 PyList_Append(list, elem);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
401 Py_DECREF(elem);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
402 }
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
403
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
404 ret = list;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
405 Py_INCREF(ret);
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
406
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
407 error:
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
408 Py_DECREF(list);
23962
1f3b94e8dc40 osutil: fix leak of stat in makestat when Py_BuildValue fails
Augie Fackler <augie@google.com>
parents: 23961
diff changeset
409 Py_XDECREF(stat);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
410 error_list:
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
411 closedir(dir);
31471
95be8b7181d3 osutil: fix potential wrong fd close
Jun Wu <quark@fb.com>
parents: 31468
diff changeset
412 /* closedir also closes its dirfd */
95be8b7181d3 osutil: fix potential wrong fd close
Jun Wu <quark@fb.com>
parents: 31468
diff changeset
413 goto error_value;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
414 error_dir:
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
415 #ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
416 close(dfd);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
417 #endif
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
418 error_value:
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
419 return ret;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
420 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
421
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
422 #ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
423
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
424 typedef struct {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
425 u_int32_t length;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
426 attrreference_t name;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
427 fsobj_type_t obj_type;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
428 struct timespec mtime;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
429 #if __LITTLE_ENDIAN__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
430 mode_t access_mask;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
431 uint16_t padding;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
432 #else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
433 uint16_t padding;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
434 mode_t access_mask;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
435 #endif
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
436 off_t size;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
437 } __attribute__((packed)) attrbuf_entry;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
438
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
439 int attrkind(attrbuf_entry *entry)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
440 {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
441 switch (entry->obj_type) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
442 case VREG: return S_IFREG;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
443 case VDIR: return S_IFDIR;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
444 case VLNK: return S_IFLNK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
445 case VBLK: return S_IFBLK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
446 case VCHR: return S_IFCHR;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
447 case VFIFO: return S_IFIFO;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
448 case VSOCK: return S_IFSOCK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
449 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
450 return -1;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
451 }
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 /* 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
454 #define LISTDIR_BATCH_SIZE 50
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
455
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
456 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
457 char *skip, bool *fallback)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
458 {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
459 PyObject *list, *elem, *stat = NULL, *ret = NULL;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
460 int kind, err;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
461 unsigned long index;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
462 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
463 bool state_seen = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
464 attrbuf_entry *entry;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
465 /* 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
466 (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
467 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
468 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
469 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
470 unsigned int basep_unused;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
471
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
472 struct stat st;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
473 int dfd = -1;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
474
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
475 /* 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
476 with garbage */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
477 struct attrlist requested_attr = {0};
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
478 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
479 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
480 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
481 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
482
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
483 *fallback = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
484
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
485 if (pathlen >= PATH_MAX) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
486 errno = ENAMETOOLONG;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
487 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
488 goto error_value;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
489 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
490
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
491 dfd = open(path, O_RDONLY);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
492 if (dfd == -1) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
493 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
494 goto error_value;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
495 }
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 list = PyList_New(0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
498 if (!list)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
499 goto error_dir;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
500
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
501 do {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
502 count = LISTDIR_BATCH_SIZE;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
503 err = getdirentriesattr(dfd, &requested_attr, &attrbuf,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
504 sizeof(attrbuf), &count, &basep_unused,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
505 &new_state, 0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
506 if (err < 0) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
507 if (errno == ENOTSUP) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
508 /* 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
509 getdirentriesattr. Fall back to the
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
510 stat-based implementation. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
511 *fallback = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
512 } else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
513 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
514 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
515 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
516
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
517 if (!state_seen) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
518 old_state = new_state;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
519 state_seen = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
520 } else if (old_state != new_state) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
521 /* 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
522 the following initial list of files:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
523
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
524 a
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
525 b
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
526 <--
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
527 c
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
528 d
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 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
531 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
532 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
533 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
534 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
535 stat. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
536 *fallback = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
537 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
538 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
539
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
540 entry = (attrbuf_entry *)attrbuf;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
541
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
542 for (index = 0; index < count; index++) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
543 char *filename = ((char *)&entry->name) +
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
544 entry->name.attr_dataoffset;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
545
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
546 if (!strcmp(filename, ".") || !strcmp(filename, ".."))
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
547 continue;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
548
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
549 kind = attrkind(entry);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
550 if (kind == -1) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
551 PyErr_Format(PyExc_OSError,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
552 "unknown object type %u for file "
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
553 "%s%s!",
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
554 entry->obj_type, path, filename);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
555 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
556 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
557
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
558 /* quit early? */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
559 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
560 ret = PyList_New(0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
561 goto error;
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
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
564 if (keepstat) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
565 /* 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
566 permission bits ... are valid". */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
567 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
568 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
569 st.st_size = entry->size;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
570 stat = makestat(&st);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
571 if (!stat)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
572 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
573 elem = Py_BuildValue("siN", filename, kind, stat);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
574 } else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
575 elem = Py_BuildValue("si", filename, kind);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
576 if (!elem)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
577 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
578 stat = NULL;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
579
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
580 PyList_Append(list, elem);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
581 Py_DECREF(elem);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
582
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
583 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
584 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
585 } while (err == 0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
586
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
587 ret = list;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
588 Py_INCREF(ret);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
589
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
590 error:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
591 Py_DECREF(list);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
592 Py_XDECREF(stat);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
593 error_dir:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
594 close(dfd);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
595 error_value:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
596 return ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
597 }
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 #endif /* __APPLE__ */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
600
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
601 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
602 {
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
603 #ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
604 PyObject *ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
605 bool fallback = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
606
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
607 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
608 if (ret != NULL || !fallback)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
609 return ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
610 #endif
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
611 return _listdir_stat(path, pathlen, keepstat, skip);
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
612 }
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
613
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
614 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
615 {
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
616 PyObject *names, *stats;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
617 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
618
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
619 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
620 return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
621
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
622 count = PySequence_Length(names);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
623 if (count == -1) {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
624 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
625 return NULL;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
626 }
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
627
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
628 stats = PyList_New(count);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
629 if (stats == NULL)
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
630 return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
631
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
632 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
633 PyObject *stat, *pypath;
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
634 struct stat st;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
635 int ret, kind;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
636 char *path;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
637
26983
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
638 /* 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
639 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
640 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
641 goto bail;
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
642
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
643 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
644 if (!pypath)
26982
fa6685ea7ad8 osutil: don't leak on statfiles error
Bryan O'Sullivan <bos@serpentine.com>
parents: 24462
diff changeset
645 goto bail;
30098
301ef65e8ebb osutil: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28593
diff changeset
646 path = PyBytes_AsString(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
647 if (path == NULL) {
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
648 Py_DECREF(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
649 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
650 goto bail;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
651 }
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
652 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
653 Py_DECREF(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
654 kind = st.st_mode & S_IFMT;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
655 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
656 stat = makestat(&st);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
657 if (stat == NULL)
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
658 goto bail;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
659 PyList_SET_ITEM(stats, i, stat);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
660 } else {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
661 Py_INCREF(Py_None);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
662 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
663 }
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
664 }
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
665
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
666 return stats;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
667
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
668 bail:
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
669 Py_DECREF(stats);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
670 return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
671 }
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
672
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
673 /*
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
674 * recvfds() simply does not release GIL during blocking io operation because
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
675 * command server is known to be single-threaded.
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
676 *
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
677 * Old systems such as Solaris don't provide CMSG_LEN, msg_control, etc.
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
678 * Currently, recvfds() is not supported on these platforms.
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
679 */
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
680 #ifdef CMSG_LEN
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
681
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
682 static ssize_t recvfdstobuf(int sockfd, int **rfds, void *cbuf, size_t cbufsize)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
683 {
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
684 char dummy[1];
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
685 struct iovec iov = {dummy, sizeof(dummy)};
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
686 struct msghdr msgh = {0};
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
687 struct cmsghdr *cmsg;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
688
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
689 msgh.msg_iov = &iov;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
690 msgh.msg_iovlen = 1;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
691 msgh.msg_control = cbuf;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
692 msgh.msg_controllen = (socklen_t)cbufsize;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
693 if (recvmsg(sockfd, &msgh, 0) < 0)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
694 return -1;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
695
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
696 for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
697 cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
698 if (cmsg->cmsg_level != SOL_SOCKET ||
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
699 cmsg->cmsg_type != SCM_RIGHTS)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
700 continue;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
701 *rfds = (int *)CMSG_DATA(cmsg);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
702 return (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
703 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
704
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
705 *rfds = cbuf;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
706 return 0;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
707 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
708
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
709 static PyObject *recvfds(PyObject *self, PyObject *args)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
710 {
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
711 int sockfd;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
712 int *rfds = NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
713 ssize_t rfdscount, i;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
714 char cbuf[256];
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
715 PyObject *rfdslist = NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
716
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
717 if (!PyArg_ParseTuple(args, "i", &sockfd))
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
718 return NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
719
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
720 rfdscount = recvfdstobuf(sockfd, &rfds, cbuf, sizeof(cbuf));
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
721 if (rfdscount < 0)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
722 return PyErr_SetFromErrno(PyExc_OSError);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
723
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
724 rfdslist = PyList_New(rfdscount);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
725 if (!rfdslist)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
726 goto bail;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
727 for (i = 0; i < rfdscount; i++) {
30110
79f438f5dd02 osutil: use PyLongObject in recvfds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30098
diff changeset
728 PyObject *obj = PyLong_FromLong(rfds[i]);
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
729 if (!obj)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
730 goto bail;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
731 PyList_SET_ITEM(rfdslist, i, obj);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
732 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
733 return rfdslist;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
734
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
735 bail:
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
736 Py_XDECREF(rfdslist);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
737 return NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
738 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
739
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
740 #endif /* CMSG_LEN */
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
741
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
742 #if defined(HAVE_SETPROCTITLE)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
743 /* 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
744 #define SETPROCNAME_USE_SETPROCTITLE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
745 #elif (defined(__linux__) || defined(__APPLE__)) && PY_MAJOR_VERSION == 2
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
746 /* rewrite the argv buffer in place - works in Linux and OS X. Py_GetArgcArgv
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
747 * in Python 3 returns the copied wchar_t **argv, thus unsupported. */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
748 #define SETPROCNAME_USE_ARGVREWRITE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
749 #else
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
750 #define SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
751 #endif
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
752
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
753 #ifndef SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
754 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
755 {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
756 const char *name = NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
757 if (!PyArg_ParseTuple(args, "s", &name))
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
758 return NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
759
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
760 #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
761 setproctitle("%s", name);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
762 #elif defined(SETPROCNAME_USE_ARGVREWRITE)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
763 {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
764 static char *argvstart = NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
765 static size_t argvsize = 0;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
766 if (argvstart == NULL) {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
767 int argc = 0, i;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
768 char **argv = NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
769 char *argvend;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
770 extern void Py_GetArgcArgv(int *argc, char ***argv);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
771 Py_GetArgcArgv(&argc, &argv);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
772
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
773 /* Check the memory we can use. Typically, argv[i] and
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
774 * argv[i + 1] are continuous. */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
775 argvend = argvstart = argv[0];
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
776 for (i = 0; i < argc; ++i) {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
777 if (argv[i] > argvend || argv[i] < argvstart)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
778 break; /* not continuous */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
779 size_t len = strlen(argv[i]);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
780 argvend = argv[i] + len + 1 /* '\0' */;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
781 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
782 if (argvend > argvstart) /* sanity check */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
783 argvsize = argvend - argvstart;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
784 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
785
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
786 if (argvstart && argvsize > 1) {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
787 int n = snprintf(argvstart, argvsize, "%s", name);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
788 if (n >= 0 && (size_t)n < argvsize)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
789 memset(argvstart + n, 0, argvsize - n);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
790 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
791 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
792 #endif
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
793
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
794 Py_RETURN_NONE;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
795 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
796 #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
797
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
798 #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
799 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
800 {
31597
2d501fb60b2d osutil: report fstype for BSD and OSX
Jun Wu <quark@fb.com>
parents: 31564
diff changeset
801 /* BSD or OSX provides a f_fstypename field */
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
802 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
803 }
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
804 #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
805 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
806 {
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
807 /* Begin of Linux filesystems */
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
808 #ifdef ADFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
809 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
810 return "adfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
811 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
812 #ifdef AFFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
813 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
814 return "affs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
815 #endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
816 #ifdef AUTOFS_SUPER_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
817 if (pbuf->f_type == AUTOFS_SUPER_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
818 return "autofs";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
819 #endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
820 #ifdef BDEVFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
821 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
822 return "bdevfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
823 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
824 #ifdef BEFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
825 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
826 return "befs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
827 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
828 #ifdef BFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
829 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
830 return "bfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
831 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
832 #ifdef BINFMTFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
833 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
834 return "binfmtfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
835 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
836 #ifdef BTRFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
837 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
838 return "btrfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
839 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
840 #ifdef CGROUP_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
841 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
842 return "cgroup";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
843 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
844 #ifdef CIFS_MAGIC_NUMBER
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
845 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
846 return "cifs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
847 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
848 #ifdef CODA_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
849 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
850 return "coda";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
851 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
852 #ifdef COH_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
853 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
854 return "coh";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
855 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
856 #ifdef CRAMFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
857 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
858 return "cramfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
859 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
860 #ifdef DEBUGFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
861 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
862 return "debugfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
863 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
864 #ifdef DEVFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
865 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
866 return "devfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
867 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
868 #ifdef DEVPTS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
869 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
870 return "devpts";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
871 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
872 #ifdef EFIVARFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
873 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
874 return "efivarfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
875 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
876 #ifdef EFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
877 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
878 return "efs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
879 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
880 #ifdef EXT_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
881 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
882 return "ext";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
883 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
884 #ifdef EXT2_OLD_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
885 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
886 return "ext2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
887 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
888 #ifdef EXT2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
889 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
890 return "ext2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
891 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
892 #ifdef EXT3_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
893 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
894 return "ext3";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
895 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
896 #ifdef EXT4_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
897 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
898 return "ext4";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
899 #endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
900 #ifdef F2FS_SUPER_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
901 if (pbuf->f_type == F2FS_SUPER_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
902 return "f2fs";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
903 #endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
904 #ifdef FUSE_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
905 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
906 return "fuse";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
907 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
908 #ifdef FUTEXFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
909 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
910 return "futexfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
911 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
912 #ifdef HFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
913 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
914 return "hfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
915 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
916 #ifdef HOSTFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
917 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
918 return "hostfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
919 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
920 #ifdef HPFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
921 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
922 return "hpfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
923 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
924 #ifdef HUGETLBFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
925 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
926 return "hugetlbfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
927 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
928 #ifdef ISOFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
929 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
930 return "isofs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
931 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
932 #ifdef JFFS2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
933 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
934 return "jffs2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
935 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
936 #ifdef JFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
937 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
938 return "jfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
939 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
940 #ifdef MINIX_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
941 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
942 return "minix";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
943 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
944 #ifdef MINIX2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
945 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
946 return "minix2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
947 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
948 #ifdef MINIX3_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
949 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
950 return "minix3";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
951 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
952 #ifdef MQUEUE_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
953 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
954 return "mqueue";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
955 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
956 #ifdef MSDOS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
957 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
958 return "msdos";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
959 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
960 #ifdef NCP_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
961 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
962 return "ncp";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
963 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
964 #ifdef NFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
965 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
966 return "nfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
967 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
968 #ifdef NILFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
969 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
970 return "nilfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
971 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
972 #ifdef NTFS_SB_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
973 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
974 return "ntfs-sb";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
975 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
976 #ifdef OCFS2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
977 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
978 return "ocfs2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
979 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
980 #ifdef OPENPROM_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
981 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
982 return "openprom";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
983 #endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
984 #ifdef OVERLAYFS_SUPER_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
985 if (pbuf->f_type == OVERLAYFS_SUPER_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
986 return "overlay";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
987 #endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
988 #ifdef PIPEFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
989 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
990 return "pipefs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
991 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
992 #ifdef PROC_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
993 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
994 return "proc";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
995 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
996 #ifdef PSTOREFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
997 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
998 return "pstorefs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
999 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1000 #ifdef QNX4_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1001 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
1002 return "qnx4";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1003 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1004 #ifdef QNX6_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1005 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
1006 return "qnx6";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1007 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1008 #ifdef RAMFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1009 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
1010 return "ramfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1011 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1012 #ifdef REISERFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1013 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
1014 return "reiserfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1015 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1016 #ifdef ROMFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1017 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
1018 return "romfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1019 #endif
31627
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
1020 #ifdef SECURITYFS_MAGIC
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
1021 if (pbuf->f_type == SECURITYFS_MAGIC)
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
1022 return "securityfs";
814733e4c02a statfs: detect more filesystems on Linux
Jun Wu <quark@fb.com>
parents: 31623
diff changeset
1023 #endif
31563
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1024 #ifdef SELINUX_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1025 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
1026 return "selinux";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1027 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1028 #ifdef SMACK_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1029 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
1030 return "smack";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1031 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1032 #ifdef SMB_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1033 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
1034 return "smb";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1035 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1036 #ifdef SOCKFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1037 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
1038 return "sockfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1039 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1040 #ifdef SQUASHFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1041 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
1042 return "squashfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1043 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1044 #ifdef SYSFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1045 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
1046 return "sysfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1047 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1048 #ifdef SYSV2_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1049 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
1050 return "sysv2";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1051 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1052 #ifdef SYSV4_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1053 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
1054 return "sysv4";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1055 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1056 #ifdef TMPFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1057 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
1058 return "tmpfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1059 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1060 #ifdef UDF_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1061 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
1062 return "udf";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1063 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1064 #ifdef UFS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1065 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
1066 return "ufs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1067 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1068 #ifdef USBDEVICE_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1069 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
1070 return "usbdevice";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1071 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1072 #ifdef V9FS_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1073 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
1074 return "v9fs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1075 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1076 #ifdef VXFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1077 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
1078 return "vxfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1079 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1080 #ifdef XENFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1081 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
1082 return "xenfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1083 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1084 #ifdef XENIX_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1085 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
1086 return "xenix";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1087 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1088 #ifdef XFS_SUPER_MAGIC
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1089 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
1090 return "xfs";
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1091 #endif
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1092 /* End of Linux filesystems */
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1093 return NULL;
cc3ec3027695 osutil: add a C function getting filesystem type
Jun Wu <quark@fb.com>
parents: 31471
diff changeset
1094 }
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
1095 #endif /* def HAVE_LINUX_STATFS */
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1096
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
1097 #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
1098 /* 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
1099 static PyObject *getfstype(PyObject *self, PyObject *args)
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1100 {
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1101 const char *path = NULL;
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1102 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
1103 int r;
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1104 if (!PyArg_ParseTuple(args, "s", &path))
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1105 return NULL;
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1106
31623
a01e1132f6fa statfs: avoid static allocation
Jun Wu <quark@fb.com>
parents: 31622
diff changeset
1107 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
1108 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
1109 if (r != 0)
31678
1ed57a7dd904 statfs: make getfstype() raise OSError
Yuya Nishihara <yuya@tcha.org>
parents: 31677
diff changeset
1110 return PyErr_SetFromErrno(PyExc_OSError);
31676
f7aeb1f4b110 statfs: refactor inner function as a mapping from statfs to string
Yuya Nishihara <yuya@tcha.org>
parents: 31675
diff changeset
1111 return Py_BuildValue("s", describefstype(&buf));
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1112 }
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
1113 #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
1114
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1115 #if defined(HAVE_BSD_STATFS)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1116 /* 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
1117 static PyObject *getfsmountpoint(PyObject *self, PyObject *args)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1118 {
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1119 const char *path = NULL;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1120 struct statfs buf;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1121 int r;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1122 if (!PyArg_ParseTuple(args, "s", &path))
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1123 return NULL;
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1124
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1125 memset(&buf, 0, sizeof(buf));
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1126 r = statfs(path, &buf);
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1127 if (r != 0)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1128 return PyErr_SetFromErrno(PyExc_OSError);
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1129 return Py_BuildValue("s", buf.f_mntonname);
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1130 }
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1131 #endif /* defined(HAVE_BSD_STATFS) */
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1132
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1133 static PyObject *unblocksignal(PyObject *self, PyObject *args)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1134 {
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1135 int sig = 0;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1136 int r;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1137 if (!PyArg_ParseTuple(args, "i", &sig))
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1138 return NULL;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1139 sigset_t set;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1140 r = sigemptyset(&set);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1141 if (r != 0)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1142 return PyErr_SetFromErrno(PyExc_OSError);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1143 r = sigaddset(&set, sig);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1144 if (r != 0)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1145 return PyErr_SetFromErrno(PyExc_OSError);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1146 r = sigprocmask(SIG_UNBLOCK, &set, NULL);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1147 if (r != 0)
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1148 return PyErr_SetFromErrno(PyExc_OSError);
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1149 Py_RETURN_NONE;
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1150 }
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1151
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
1152 #endif /* ndef _WIN32 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
1153
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1154 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
1155 {
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1156 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
1157 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
1158 char *path, *skip = NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1159 int wantstat, plen;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1160
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1161 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
1162
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1163 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|OO:listdir",
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1164 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
1165 return NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1166
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1167 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
1168
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1169 if (skipobj && skipobj != Py_None) {
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1170 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
1171 if (!skip)
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1172 return NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1173 }
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1174
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1175 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
1176 }
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
1177
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1178 #ifdef _WIN32
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1179 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
1180 {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1181 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
1182 PyObject *file_obj = NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1183 char *name = NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1184 char *mode = "rb";
8597
dc1b9e22f288 osutil: silence uninitialized variable warning
Patrick Mezard <pmezard@gmail.com>
parents: 8330
diff changeset
1185 DWORD access = 0;
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1186 DWORD creation;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1187 HANDLE handle;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1188 int fd, flags = 0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1189 int bufsize = -1;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1190 char m0, m1, m2;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1191 char fpmode[4];
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1192 int fppos = 0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1193 int plus;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1194 FILE *fp;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1195
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1196 if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:posixfile", kwlist,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1197 Py_FileSystemDefaultEncoding,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1198 &name, &mode, &bufsize))
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1199 return NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1200
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1201 m0 = mode[0];
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1202 m1 = m0 ? mode[1] : '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1203 m2 = m1 ? mode[2] : '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1204 plus = m1 == '+' || m2 == '+';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1205
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1206 fpmode[fppos++] = m0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1207 if (m1 == 'b' || m2 == 'b') {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1208 flags = _O_BINARY;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1209 fpmode[fppos++] = 'b';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1210 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1211 else
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1212 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
1213 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
1214 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
1215 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
1216 } else {
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
1217 /*
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
1218 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
1219 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
1220 */
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1221 flags |= _O_RDWR;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1222 access = GENERIC_READ | GENERIC_WRITE;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1223 fpmode[fppos++] = '+';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1224 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1225 fpmode[fppos++] = '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1226
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1227 switch (m0) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1228 case 'r':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1229 creation = OPEN_EXISTING;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1230 break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1231 case 'w':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1232 creation = CREATE_ALWAYS;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1233 break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1234 case 'a':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1235 creation = OPEN_ALWAYS;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1236 flags |= _O_APPEND;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1237 break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1238 default:
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1239 PyErr_Format(PyExc_ValueError,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1240 "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
1241 "or 'a', not '%c'", m0);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1242 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1243 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1244
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1245 handle = CreateFile(name, access,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1246 FILE_SHARE_READ | FILE_SHARE_WRITE |
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1247 FILE_SHARE_DELETE,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1248 NULL,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1249 creation,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1250 FILE_ATTRIBUTE_NORMAL,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1251 0);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1252
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1253 if (handle == INVALID_HANDLE_VALUE) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1254 PyErr_SetFromWindowsErrWithFilename(GetLastError(), name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1255 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1256 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1257
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
1258 fd = _open_osfhandle((intptr_t)handle, flags);
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1259
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1260 if (fd == -1) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1261 CloseHandle(handle);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1262 PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1263 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1264 }
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1265 #ifndef IS_PY3K
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1266 fp = _fdopen(fd, fpmode);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1267 if (fp == NULL) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1268 _close(fd);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1269 PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1270 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1271 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1272
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1273 file_obj = PyFile_FromFile(fp, name, mode, fclose);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1274 if (file_obj == NULL) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1275 fclose(fp);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1276 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1277 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1278
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1279 PyFile_SetBufSize(file_obj, bufsize);
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1280 #else
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1281 file_obj = PyFile_FromFd(fd, name, mode, bufsize, NULL, NULL, NULL, 1);
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1282 if (file_obj == NULL)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1283 goto bail;
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1284 #endif
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1285 bail:
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1286 PyMem_Free(name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1287 return file_obj;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1288 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1289 #endif
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1290
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
1291 #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
1292 #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
1293
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
1294 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
1295 {
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1296 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
1297
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1298 if (dict != NULL) {
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1299 CFRelease(dict);
15094
258eee414ab7 osutil: avoid accidentally destroying the True object in isgui (issue2937)
Steve Streeting <steve@stevestreeting.com>
parents: 13748
diff changeset
1300 Py_RETURN_TRUE;
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1301 } else {
15094
258eee414ab7 osutil: avoid accidentally destroying the True object in isgui (issue2937)
Steve Streeting <steve@stevestreeting.com>
parents: 13748
diff changeset
1302 Py_RETURN_FALSE;
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1303 }
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
1304 }
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
1305 #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
1306
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1307 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
1308
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1309 static PyMethodDef methods[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
1310 {"listdir", (PyCFunction)listdir, METH_VARARGS | METH_KEYWORDS,
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
1311 "list a directory\n"},
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1312 #ifdef _WIN32
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1313 {"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
1314 "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
1315 "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
1316 #else
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
1317 {"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
1318 "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
1319 "Returns None for non-existent entries and entries of other types.\n"},
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
1320 #ifdef CMSG_LEN
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
1321 {"recvfds", (PyCFunction)recvfds, METH_VARARGS,
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
1322 "receive list of file descriptors via socket\n"},
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
1323 #endif
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
1324 #ifndef SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
1325 {"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
1326 "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
1327 #endif
31622
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31597
diff changeset
1328 #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
1329 {"getfstype", (PyCFunction)getfstype, METH_VARARGS,
31564
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1330 "get filesystem type (best-effort)\n"},
102f291807c9 osutil: export a "getfstype" method
Jun Wu <quark@fb.com>
parents: 31563
diff changeset
1331 #endif
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1332 #if defined(HAVE_BSD_STATFS)
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1333 {"getfsmountpoint", (PyCFunction)getfsmountpoint, METH_VARARGS,
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1334 "get filesystem mount point (best-effort)\n"},
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1335 #endif
35460
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1336 {"unblocksignal", (PyCFunction)unblocksignal, METH_VARARGS,
8652ab4046e4 osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents: 34861
diff changeset
1337 "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
1338 #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
1339 #ifdef __APPLE__
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1340 {
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1341 "isgui", (PyCFunction)isgui, METH_NOARGS,
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1342 "Is a CoreGraphics session available?"
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
1343 },
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
1344 #endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
1345 {NULL, NULL}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1346 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1347
35515
e01549a7bf0a osutil: implement getfsmountpoint() on BSD systems
Matt Harbison <matt_harbison@yahoo.com>
parents: 35460
diff changeset
1348 static const int version = 3;
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1349
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1350 #ifdef IS_PY3K
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1351 static struct PyModuleDef osutil_module = {
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1352 PyModuleDef_HEAD_INIT,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1353 "osutil",
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1354 osutil_doc,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1355 -1,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1356 methods
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1357 };
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1358
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1359 PyMODINIT_FUNC PyInit_osutil(void)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1360 {
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1361 PyObject *m;
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1362 if (PyType_Ready(&listdir_stat_type) < 0)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1363 return NULL;
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1364
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1365 m = PyModule_Create(&osutil_module);
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1366 PyModule_AddIntConstant(m, "version", version);
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1367 return m;
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1368 }
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1369 #else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1370 PyMODINIT_FUNC initosutil(void)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1371 {
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1372 PyObject *m;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
1373 if (PyType_Ready(&listdir_stat_type) == -1)
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
1374 return;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1375
32359
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1376 m = Py_InitModule3("osutil", methods, osutil_doc);
dc51700be00c osutil: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31678
diff changeset
1377 PyModule_AddIntConstant(m, "version", version);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1378 }
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
1379 #endif