annotate mercurial/cext/osutil.c @ 36809:3c15b84ab66c

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