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