annotate mercurial/osutil.c @ 30978:fdecd24ca4dc

ui: log time spent blocked on stdio We use a wrapper around Mercurial at Facebook that logs key statistics (like elpased time) to our standard performance tooling. This is less useful than it could be, because we currently can't tell when a command is slow because we need to fix Mercurial versus when a command is slow because the user isn't interacting quickly. Teach Mercurial to log the time it spends blocked, so that our tooling can pick it up and submit it with the elapsed time - we can then do the math in our tooling to see if Mercurial is slow, or if the user simply failed to interact. Combining this with the command duration log means that we can ensure that we concentrate performance efforts on the things that bite Facebook users. The perfwrite microbenchmark shifts from: Linux: ! wall 3.213560 comb 0.410000 user 0.350000 sys 0.060000 (best of 4) Mac: ! wall 0.342325 comb 0.180000 user 0.110000 sys 0.070000 (best of 20) before this change to: ! wall 3.478070 comb 0.500000 user 0.420000 sys 0.080000 (best of 3) Mac: ! wall 0.218112 comb 0.220000 user 0.150000 sys 0.070000 (best of 15) showing a small hit in comb time, but firmly in the noise on wall time.
author Simon Farnsworth <simonfar@fb.com>
date Wed, 15 Feb 2017 13:50:06 -0800
parents 0852161588c6
children b9dd03ed564f
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>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
12 #include <fcntl.h>
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
13 #include <stdio.h>
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
14 #include <stdlib.h>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
15 #include <string.h>
14873
f79d47813b8b osutil: emulate os.listdir's OSError for long names (issue2898)
Matt Mackall <mpm@selenic.com>
parents: 13748
diff changeset
16 #include <errno.h>
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
17
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
18 #ifdef _WIN32
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
19 #include <windows.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
20 #include <io.h>
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
21 #else
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
22 #include <dirent.h>
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
23 #include <sys/socket.h>
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
24 #include <sys/stat.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
25 #include <sys/types.h>
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
26 #include <unistd.h>
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
27 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
28
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
29 #ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
30 #include <sys/attr.h>
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
31 #include <sys/vnode.h>
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
32 #endif
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
33
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
34 #include "util.h"
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
35
9353
3ac42ca1f3e6 osutil: fix compilation with -ansi
Sebastien Binet <binet@cern.ch>
parents: 8723
diff changeset
36 /* 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
37 #ifndef PATH_MAX
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
38 #define PATH_MAX 4096
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
39 #endif
48da69ff79bd Some platforms lack the PATH_MAX definition (eg. GNU/Hurd).
Arne Babenhauserheide <bab@draketo.de>
parents: 7190
diff changeset
40
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
41 #ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
42 /*
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
43 stat struct compatible with hg expectations
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
44 Mercurial only uses st_mode, st_size and st_mtime
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
45 the rest is kept to minimize changes between implementations
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
46 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
47 struct hg_stat {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
48 int st_dev;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
49 int st_mode;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
50 int st_nlink;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
51 __int64 st_size;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
52 int st_mtime;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
53 int st_ctime;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
54 };
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
55 struct listdir_stat {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
56 PyObject_HEAD
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
57 struct hg_stat st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
58 };
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
59 #else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
60 struct listdir_stat {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
61 PyObject_HEAD
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
62 struct stat st;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
63 };
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
64 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
65
30111
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
66 #ifdef IS_PY3K
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
67 #define listdir_slot(name) \
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
68 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
69 { \
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
70 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
71 }
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
72 #else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
73 #define listdir_slot(name) \
7190
aecea6934fdd Some additional space/tab cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7136
diff changeset
74 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
75 { \
aecea6934fdd Some additional space/tab cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7136
diff changeset
76 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
77 }
30111
a989fa78dafa osutil: use PyLongObject on Python 3 for listdir_slot
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30110
diff changeset
78 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
79
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
80 listdir_slot(st_dev)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
81 listdir_slot(st_mode)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
82 listdir_slot(st_nlink)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
83 #ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
84 static PyObject *listdir_stat_st_size(PyObject *self, void *x)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
85 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
86 return PyLong_FromLongLong(
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
87 (PY_LONG_LONG)((struct listdir_stat *)self)->st.st_size);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
88 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
89 #else
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
90 listdir_slot(st_size)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
91 #endif
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
92 listdir_slot(st_mtime)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
93 listdir_slot(st_ctime)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
94
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
95 static struct PyGetSetDef listdir_stat_getsets[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
96 {"st_dev", listdir_stat_st_dev, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
97 {"st_mode", listdir_stat_st_mode, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
98 {"st_nlink", listdir_stat_st_nlink, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
99 {"st_size", listdir_stat_st_size, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
100 {"st_mtime", listdir_stat_st_mtime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
101 {"st_ctime", listdir_stat_st_ctime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
102 {0, 0, 0, 0, 0}
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
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
105 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
106 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
107 return t->tp_alloc(t, 0);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
108 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
109
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
110 static void listdir_stat_dealloc(PyObject *o)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
111 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
112 o->ob_type->tp_free(o);
5396
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
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
115 static PyTypeObject listdir_stat_type = {
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
116 PyVarObject_HEAD_INIT(NULL, 0)
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
117 "osutil.stat", /*tp_name*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
118 sizeof(struct listdir_stat), /*tp_basicsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
119 0, /*tp_itemsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
120 (destructor)listdir_stat_dealloc, /*tp_dealloc*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
121 0, /*tp_print*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
122 0, /*tp_getattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
123 0, /*tp_setattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
124 0, /*tp_compare*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
125 0, /*tp_repr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
126 0, /*tp_as_number*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
127 0, /*tp_as_sequence*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
128 0, /*tp_as_mapping*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
129 0, /*tp_hash */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
130 0, /*tp_call*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
131 0, /*tp_str*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
132 0, /*tp_getattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
133 0, /*tp_setattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
134 0, /*tp_as_buffer*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
135 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
136 "stat objects", /* tp_doc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
137 0, /* tp_traverse */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
138 0, /* tp_clear */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
139 0, /* tp_richcompare */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
140 0, /* tp_weaklistoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
141 0, /* tp_iter */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
142 0, /* tp_iternext */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
143 0, /* tp_methods */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
144 0, /* tp_members */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
145 listdir_stat_getsets, /* tp_getset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
146 0, /* tp_base */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
147 0, /* tp_dict */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
148 0, /* tp_descr_get */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
149 0, /* tp_descr_set */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
150 0, /* tp_dictoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
151 0, /* tp_init */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
152 0, /* tp_alloc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
153 listdir_stat_new, /* tp_new */
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
154 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
155
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
156 #ifdef _WIN32
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
157
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
158 static int to_python_time(const FILETIME *tm)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
159 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
160 /* number of seconds between epoch and January 1 1601 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
161 const __int64 a0 = (__int64)134774L * (__int64)24L * (__int64)3600L;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
162 /* conversion factor from 100ns to 1s */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
163 const __int64 a1 = 10000000;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
164 /* explicit (int) cast to suspend compiler warnings */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
165 return (int)((((__int64)tm->dwHighDateTime << 32)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
166 + tm->dwLowDateTime) / a1 - a0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
167 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
168
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
169 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
170 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
171 PyObject *py_st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
172 struct hg_stat *stp;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
173
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
174 int kind = (fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
175 ? _S_IFDIR : _S_IFREG;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
176
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
177 if (!wantstat)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
178 return Py_BuildValue("si", fd->cFileName, kind);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
179
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
180 py_st = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
181 if (!py_st)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
182 return NULL;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
183
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
184 stp = &((struct listdir_stat *)py_st)->st;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
185 /*
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
186 use kind as st_mode
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
187 rwx bits on Win32 are meaningless
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
188 and Hg does not use them anyway
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 stp->st_mode = kind;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
191 stp->st_mtime = to_python_time(&fd->ftLastWriteTime);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
192 stp->st_ctime = to_python_time(&fd->ftCreationTime);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
193 if (kind == _S_IFREG)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
194 stp->st_size = ((__int64)fd->nFileSizeHigh << 32)
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
195 + fd->nFileSizeLow;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
196 return Py_BuildValue("siN", fd->cFileName,
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
197 kind, py_st);
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
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
200 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
201 {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
202 PyObject *rval = NULL; /* initialize - return value */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
203 PyObject *list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
204 HANDLE fh;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
205 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
206 char *pattern;
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
207
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
208 /* build the path + \* pattern string */
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
209 pattern = malloc(plen + 3); /* path + \* + \0 */
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
210 if (!pattern) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
211 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
212 goto error_nomem;
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
213 }
28593
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
214 memcpy(pattern, path, plen);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
215
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
216 if (plen > 0) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
217 char c = path[plen-1];
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
218 if (c != ':' && c != '/' && c != '\\')
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
219 pattern[plen++] = '\\';
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
220 }
28593
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
221 pattern[plen++] = '*';
e60c492a0d9b osutil: stop using strcpy
Augie Fackler <augie@google.com>
parents: 27970
diff changeset
222 pattern[plen] = '\0';
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
223
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
224 fh = FindFirstFileA(pattern, &fd);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
225 if (fh == INVALID_HANDLE_VALUE) {
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
226 PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
227 goto error_file;
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
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
230 list = PyList_New(0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
231 if (!list)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
232 goto error_list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
233
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
234 do {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
235 PyObject *item;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
236
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
237 if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
238 if (!strcmp(fd.cFileName, ".")
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
239 || !strcmp(fd.cFileName, ".."))
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
240 continue;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
241
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
242 if (skip && !strcmp(fd.cFileName, skip)) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
243 rval = PyList_New(0);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
244 goto error;
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 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
247
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
248 item = make_item(&fd, wantstat);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
249 if (!item)
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
250 goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
251
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
252 if (PyList_Append(list, item)) {
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
253 Py_XDECREF(item);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
254 goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
255 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
256
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
257 Py_XDECREF(item);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
258 } while (FindNextFileA(fh, &fd));
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
259
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
260 if (GetLastError() != ERROR_NO_MORE_FILES) {
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
261 PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
262 goto error;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
263 }
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
264
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
265 rval = list;
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
266 Py_XINCREF(rval);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
267 error:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
268 Py_XDECREF(list);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
269 error_list:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
270 FindClose(fh);
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
271 error_file:
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
272 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
273 error_nomem:
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
274 return rval;
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 #else
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
278
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
279 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
280 {
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
281 #ifdef DT_REG
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
282 switch (ent->d_type) {
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
283 case DT_REG: return S_IFREG;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
284 case DT_DIR: return S_IFDIR;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
285 case DT_LNK: return S_IFLNK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
286 case DT_BLK: return S_IFBLK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
287 case DT_CHR: return S_IFCHR;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
288 case DT_FIFO: return S_IFIFO;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
289 case DT_SOCK: return S_IFSOCK;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
290 }
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
291 #endif
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
292 return -1;
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
293 }
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
294
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
295 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
296 {
18021
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
297 PyObject *stat;
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
298
18021
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
299 stat = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
300 if (stat)
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
301 memcpy(&((struct listdir_stat *)stat)->st, st, sizeof(*st));
9b05b31b413c osutil: fix tab damage
Bryan O'Sullivan <bryano@fb.com>
parents: 18019
diff changeset
302 return stat;
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
303 }
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
304
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
305 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
306 char *skip)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
307 {
23962
1f3b94e8dc40 osutil: fix leak of stat in makestat when Py_BuildValue fails
Augie Fackler <augie@google.com>
parents: 23961
diff changeset
308 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
309 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
310 int kind, err;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
311 struct stat st;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
312 struct dirent *ent;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
313 DIR *dir;
7136
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
314 #ifdef AT_SYMLINK_NOFOLLOW
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
315 int dfd = -1;
d834ed27199f _listdir only uses dfd if AT_SYMLINK_NOFOLLOW is defined
Brendan Cully <brendan@kublai.com>
parents: 7098
diff changeset
316 #endif
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
317
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
318 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
319 errno = ENAMETOOLONG;
f79d47813b8b osutil: emulate os.listdir's OSError for long names (issue2898)
Matt Mackall <mpm@selenic.com>
parents: 13748
diff changeset
320 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
321 goto error_value;
7059
6a76cf980999 Improve error handling in osutil.c
Petr Kodl <petrkodl@gmail.com>
parents: 7056
diff changeset
322 }
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
323 strncpy(fullpath, path, PATH_MAX);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
324 fullpath[pathlen] = '/';
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
325
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
326 #ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
327 dfd = open(path, O_RDONLY);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
328 if (dfd == -1) {
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
329 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
330 goto error_value;
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
331 }
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
332 dir = fdopendir(dfd);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
333 #else
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
334 dir = opendir(path);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
335 #endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
336 if (!dir) {
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
337 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
338 goto error_dir;
23961
bc851e2851b1 osutil.c: clean up space before a tab
Augie Fackler <augie@google.com>
parents: 18027
diff changeset
339 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
340
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
341 list = PyList_New(0);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
342 if (!list)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
343 goto error_list;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
344
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
345 while ((ent = readdir(dir))) {
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
346 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
347 continue;
5416
ca890c0c3f1f osutil.c: style fix - delete trailing end-of-line spaces
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 5398
diff changeset
348
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
349 kind = entkind(ent);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
350 if (kind == -1 || keepstat) {
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
351 #ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
352 err = fstatat(dfd, ent->d_name, &st,
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
353 AT_SYMLINK_NOFOLLOW);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
354 #else
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
355 strncpy(fullpath + pathlen + 1, ent->d_name,
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
356 PATH_MAX - pathlen);
24462
40b05303ac32 osutil: mark end of string with null char, not 0
Siddharth Agarwal <sid0@fb.com>
parents: 24461
diff changeset
357 fullpath[PATH_MAX] = '\0';
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
358 err = lstat(fullpath, &st);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
359 #endif
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
360 if (err == -1) {
16747
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
361 /* race with file deletion? */
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
362 if (errno == ENOENT)
6476a21337a6 osutil: handle deletion race with readdir/stat (issue3463)
Matt Mackall <mpm@selenic.com>
parents: 15098
diff changeset
363 continue;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
364 strncpy(fullpath + pathlen + 1, ent->d_name,
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
365 PATH_MAX - pathlen);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
366 fullpath[PATH_MAX] = 0;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
367 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
368 fullpath);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
369 goto error;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
370 }
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
371 kind = st.st_mode & S_IFMT;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
372 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
373
7034
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
374 /* quit early? */
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
375 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
376 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
377 goto error;
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
378 }
0d513661d6c2 listdir: add support for aborting if a certain path is found
Matt Mackall <mpm@selenic.com>
parents: 7033
diff changeset
379
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
380 if (keepstat) {
18019
e248bff2d8dd osutil: factor out creation and init of listdir_stat
Bryan O'Sullivan <bryano@fb.com>
parents: 16747
diff changeset
381 stat = makestat(&st);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
382 if (!stat)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
383 goto error;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
384 elem = Py_BuildValue("siN", ent->d_name, kind, stat);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
385 } else
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
386 elem = Py_BuildValue("si", ent->d_name, kind);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
387 if (!elem)
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
388 goto error;
23962
1f3b94e8dc40 osutil: fix leak of stat in makestat when Py_BuildValue fails
Augie Fackler <augie@google.com>
parents: 23961
diff changeset
389 stat = NULL;
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
390
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
391 PyList_Append(list, elem);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
392 Py_DECREF(elem);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
393 }
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
394
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
395 ret = list;
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
396 Py_INCREF(ret);
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
397
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
398 error:
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
399 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
400 Py_XDECREF(stat);
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
401 error_list:
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
402 closedir(dir);
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
403 error_dir:
7033
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
404 #ifdef AT_SYMLINK_NOFOLLOW
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
405 close(dfd);
892d27fb04a5 osutil: fix some braindamage
Matt Mackall <mpm@selenic.com>
parents: 7031
diff changeset
406 #endif
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
407 error_value:
7031
19e8d034932e osutil: major listdir cleanup
Matt Mackall <mpm@selenic.com>
parents: 7022
diff changeset
408 return ret;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
409 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
410
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
411 #ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
412
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
413 typedef struct {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
414 u_int32_t length;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
415 attrreference_t name;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
416 fsobj_type_t obj_type;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
417 struct timespec mtime;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
418 #if __LITTLE_ENDIAN__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
419 mode_t access_mask;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
420 uint16_t padding;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
421 #else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
422 uint16_t padding;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
423 mode_t access_mask;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
424 #endif
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
425 off_t size;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
426 } __attribute__((packed)) attrbuf_entry;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
427
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
428 int attrkind(attrbuf_entry *entry)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
429 {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
430 switch (entry->obj_type) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
431 case VREG: return S_IFREG;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
432 case VDIR: return S_IFDIR;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
433 case VLNK: return S_IFLNK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
434 case VBLK: return S_IFBLK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
435 case VCHR: return S_IFCHR;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
436 case VFIFO: return S_IFIFO;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
437 case VSOCK: return S_IFSOCK;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
438 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
439 return -1;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
440 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
441
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
442 /* 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
443 #define LISTDIR_BATCH_SIZE 50
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
444
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
445 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
446 char *skip, bool *fallback)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
447 {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
448 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
449 int kind, err;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
450 unsigned long index;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
451 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
452 bool state_seen = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
453 attrbuf_entry *entry;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
454 /* 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
455 (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
456 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
457 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
458 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
459 unsigned int basep_unused;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
460
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
461 struct stat st;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
462 int dfd = -1;
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 /* 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
465 with garbage */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
466 struct attrlist requested_attr = {0};
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
467 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
468 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
469 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
470 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
471
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
472 *fallback = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
473
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
474 if (pathlen >= PATH_MAX) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
475 errno = ENAMETOOLONG;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
476 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
477 goto error_value;
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
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
480 dfd = open(path, O_RDONLY);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
481 if (dfd == -1) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
482 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
483 goto error_value;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
484 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
485
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
486 list = PyList_New(0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
487 if (!list)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
488 goto error_dir;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
489
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
490 do {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
491 count = LISTDIR_BATCH_SIZE;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
492 err = getdirentriesattr(dfd, &requested_attr, &attrbuf,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
493 sizeof(attrbuf), &count, &basep_unused,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
494 &new_state, 0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
495 if (err < 0) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
496 if (errno == ENOTSUP) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
497 /* 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
498 getdirentriesattr. Fall back to the
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
499 stat-based implementation. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
500 *fallback = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
501 } else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
502 PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
503 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
504 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
505
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
506 if (!state_seen) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
507 old_state = new_state;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
508 state_seen = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
509 } else if (old_state != new_state) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
510 /* 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
511 the following initial list of files:
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 a
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
514 b
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
515 <--
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
516 c
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
517 d
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 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
520 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
521 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
522 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
523 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
524 stat. */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
525 *fallback = true;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
526 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
527 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
528
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
529 entry = (attrbuf_entry *)attrbuf;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
530
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
531 for (index = 0; index < count; index++) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
532 char *filename = ((char *)&entry->name) +
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
533 entry->name.attr_dataoffset;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
534
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
535 if (!strcmp(filename, ".") || !strcmp(filename, ".."))
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
536 continue;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
537
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
538 kind = attrkind(entry);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
539 if (kind == -1) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
540 PyErr_Format(PyExc_OSError,
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
541 "unknown object type %u for file "
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
542 "%s%s!",
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
543 entry->obj_type, path, filename);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
544 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
545 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
546
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
547 /* quit early? */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
548 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
549 ret = PyList_New(0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
550 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
551 }
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 (keepstat) {
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
554 /* 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
555 permission bits ... are valid". */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
556 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
557 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
558 st.st_size = entry->size;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
559 stat = makestat(&st);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
560 if (!stat)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
561 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
562 elem = Py_BuildValue("siN", filename, kind, stat);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
563 } else
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
564 elem = Py_BuildValue("si", filename, kind);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
565 if (!elem)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
566 goto error;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
567 stat = NULL;
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 PyList_Append(list, elem);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
570 Py_DECREF(elem);
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 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
573 }
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
574 } while (err == 0);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
575
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
576 ret = list;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
577 Py_INCREF(ret);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
578
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
579 error:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
580 Py_DECREF(list);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
581 Py_XDECREF(stat);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
582 error_dir:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
583 close(dfd);
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
584 error_value:
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
585 return ret;
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
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
588 #endif /* __APPLE__ */
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
589
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
590 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
591 {
24461
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
592 #ifdef __APPLE__
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
593 PyObject *ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
594 bool fallback = false;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
595
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
596 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
597 if (ret != NULL || !fallback)
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
598 return ret;
05ccfe6763f1 osutil: use getdirentriesattr on OS X if possible
Siddharth Agarwal <sid0@fb.com>
parents: 24460
diff changeset
599 #endif
24460
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
600 return _listdir_stat(path, pathlen, keepstat, skip);
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
601 }
73477e755cd2 osutil._listdir: rename to _listdir_stat
Siddharth Agarwal <sid0@fb.com>
parents: 23966
diff changeset
602
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
603 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
604 {
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
605 PyObject *names, *stats;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
606 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
607
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
608 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
609 return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
610
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
611 count = PySequence_Length(names);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
612 if (count == -1) {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
613 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
614 return NULL;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
615 }
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
616
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
617 stats = PyList_New(count);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
618 if (stats == NULL)
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
619 return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
620
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
621 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
622 PyObject *stat, *pypath;
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
623 struct stat st;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
624 int ret, kind;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
625 char *path;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
626
26983
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
627 /* 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
628 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
629 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
630 goto bail;
f9f2f29ce023 osutil: make statfiles check for interrupts periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 26982
diff changeset
631
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
632 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
633 if (!pypath)
26982
fa6685ea7ad8 osutil: don't leak on statfiles error
Bryan O'Sullivan <bos@serpentine.com>
parents: 24462
diff changeset
634 goto bail;
30098
301ef65e8ebb osutil: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28593
diff changeset
635 path = PyBytes_AsString(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
636 if (path == NULL) {
23966
2d2c0a8eeeb8 osutil: fix memory leak of PyBytes of path in statfiles
Augie Fackler <augie@google.com>
parents: 23962
diff changeset
637 Py_DECREF(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
638 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
639 goto bail;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
640 }
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
641 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
642 Py_DECREF(pypath);
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
643 kind = st.st_mode & S_IFMT;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
644 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
645 stat = makestat(&st);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
646 if (stat == NULL)
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
647 goto bail;
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
648 PyList_SET_ITEM(stats, i, stat);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
649 } else {
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
650 Py_INCREF(Py_None);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
651 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
652 }
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
653 }
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
654
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
655 return stats;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
656
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
657 bail:
18027
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
658 Py_DECREF(stats);
4ca434500dbf osutil: tab damage, how i hate thee
Bryan O'Sullivan <bryano@fb.com>
parents: 18026
diff changeset
659 return NULL;
18026
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
660 }
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
661
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
662 /*
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
663 * 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
664 * 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
665 *
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
666 * 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
667 * 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
668 */
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
669 #ifdef CMSG_LEN
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
670
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
671 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
672 {
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
673 char dummy[1];
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
674 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
675 struct msghdr msgh = {0};
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
676 struct cmsghdr *cmsg;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
677
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
678 msgh.msg_iov = &iov;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
679 msgh.msg_iovlen = 1;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
680 msgh.msg_control = cbuf;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
681 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
682 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
683 return -1;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
684
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
685 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
686 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
687 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
688 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
689 continue;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
690 *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
691 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
692 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
693
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
694 *rfds = cbuf;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
695 return 0;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
696 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
697
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
698 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
699 {
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
700 int sockfd;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
701 int *rfds = NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
702 ssize_t rfdscount, i;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
703 char cbuf[256];
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
704 PyObject *rfdslist = NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
705
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
706 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
707 return NULL;
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 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
710 if (rfdscount < 0)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
711 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
712
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
713 rfdslist = PyList_New(rfdscount);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
714 if (!rfdslist)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
715 goto bail;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
716 for (i = 0; i < rfdscount; i++) {
30110
79f438f5dd02 osutil: use PyLongObject in recvfds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30098
diff changeset
717 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
718 if (!obj)
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
719 goto bail;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
720 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
721 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
722 return rfdslist;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
723
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
724 bail:
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
725 Py_XDECREF(rfdslist);
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
726 return NULL;
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
727 }
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
728
27970
3d23700cf4a9 osutil: disable compilation of recvfds() on unsupported platforms
Yuya Nishihara <yuya@tcha.org>
parents: 27877
diff changeset
729 #endif /* CMSG_LEN */
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
730
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
731 #if defined(HAVE_SETPROCTITLE)
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
732 /* 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
733 #define SETPROCNAME_USE_SETPROCTITLE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
734 #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
735 /* 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
736 * 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
737 #define SETPROCNAME_USE_ARGVREWRITE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
738 #else
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
739 #define SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
740 #endif
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
741
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
742 #ifndef SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
743 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
744 {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
745 const char *name = NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
746 if (!PyArg_ParseTuple(args, "s", &name))
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
747 return NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
748
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
749 #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
750 setproctitle("%s", name);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
751 #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
752 {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
753 static char *argvstart = NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
754 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
755 if (argvstart == NULL) {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
756 int argc = 0, i;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
757 char **argv = NULL;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
758 char *argvend;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
759 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
760 Py_GetArgcArgv(&argc, &argv);
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
761
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
762 /* 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
763 * 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
764 argvend = argvstart = argv[0];
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
765 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
766 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
767 break; /* not continuous */
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
768 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
769 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
770 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
771 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
772 argvsize = argvend - argvstart;
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
773 }
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
774
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
775 if (argvstart && argvsize > 1) {
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
776 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
777 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
778 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
779 }
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 #endif
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
782
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
783 Py_RETURN_NONE;
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 #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
786
7056
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
787 #endif /* ndef _WIN32 */
2c1f18b88b6a osutil: implementation for Win32
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
788
7098
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
789 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
790 {
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
791 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
792 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
793 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
794 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
795
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
796 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
797
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
798 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|OO:listdir",
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
799 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
800 return NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
801
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
802 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
803
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
804 if (skipobj && skipobj != Py_None) {
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
805 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
806 if (!skip)
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
807 return NULL;
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
808 }
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
809
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
810 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
811 }
8a5c88c7e97b osutil.c: refactor argument parsing, allow skip=None being passed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7059
diff changeset
812
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
813 #ifdef _WIN32
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
814 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
815 {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
816 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
817 PyObject *file_obj = NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
818 char *name = NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
819 char *mode = "rb";
8597
dc1b9e22f288 osutil: silence uninitialized variable warning
Patrick Mezard <pmezard@gmail.com>
parents: 8330
diff changeset
820 DWORD access = 0;
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
821 DWORD creation;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
822 HANDLE handle;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
823 int fd, flags = 0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
824 int bufsize = -1;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
825 char m0, m1, m2;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
826 char fpmode[4];
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
827 int fppos = 0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
828 int plus;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
829 FILE *fp;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
830
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
831 if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:posixfile", kwlist,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
832 Py_FileSystemDefaultEncoding,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
833 &name, &mode, &bufsize))
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
834 return NULL;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
835
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
836 m0 = mode[0];
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
837 m1 = m0 ? mode[1] : '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
838 m2 = m1 ? mode[2] : '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
839 plus = m1 == '+' || m2 == '+';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
840
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
841 fpmode[fppos++] = m0;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
842 if (m1 == 'b' || m2 == 'b') {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
843 flags = _O_BINARY;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
844 fpmode[fppos++] = 'b';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
845 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
846 else
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
847 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
848 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
849 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
850 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
851 } else {
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
852 /*
764441ecbf2e osutil: treat open modes 'w' and 'a' as 'w+' and 'a+' in posixfile
Adrian Buehlmann <adrian@cadifra.com>
parents: 11359
diff changeset
853 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
854 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
855 */
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
856 flags |= _O_RDWR;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
857 access = GENERIC_READ | GENERIC_WRITE;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
858 fpmode[fppos++] = '+';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
859 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
860 fpmode[fppos++] = '\0';
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
861
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
862 switch (m0) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
863 case 'r':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
864 creation = OPEN_EXISTING;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
865 break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
866 case 'w':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
867 creation = CREATE_ALWAYS;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
868 break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
869 case 'a':
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
870 creation = OPEN_ALWAYS;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
871 flags |= _O_APPEND;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
872 break;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
873 default:
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
874 PyErr_Format(PyExc_ValueError,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
875 "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
876 "or 'a', not '%c'", m0);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
877 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
878 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
879
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
880 handle = CreateFile(name, access,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
881 FILE_SHARE_READ | FILE_SHARE_WRITE |
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
882 FILE_SHARE_DELETE,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
883 NULL,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
884 creation,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
885 FILE_ATTRIBUTE_NORMAL,
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
886 0);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
887
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
888 if (handle == INVALID_HANDLE_VALUE) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
889 PyErr_SetFromWindowsErrWithFilename(GetLastError(), name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
890 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
891 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
892
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 9353
diff changeset
893 fd = _open_osfhandle((intptr_t)handle, flags);
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
894
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
895 if (fd == -1) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
896 CloseHandle(handle);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
897 PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
898 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
899 }
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
900 #ifndef IS_PY3K
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
901 fp = _fdopen(fd, fpmode);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
902 if (fp == NULL) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
903 _close(fd);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
904 PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
905 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
906 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
907
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
908 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
909 if (file_obj == NULL) {
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
910 fclose(fp);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
911 goto bail;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
912 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
913
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
914 PyFile_SetBufSize(file_obj, bufsize);
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
915 #else
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
916 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
917 if (file_obj == NULL)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
918 goto bail;
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
919 #endif
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
920 bail:
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
921 PyMem_Free(name);
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
922 return file_obj;
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
923 }
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
924 #endif
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
925
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
926 #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
927 #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
928
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
929 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
930 {
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
931 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
932
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
933 if (dict != NULL) {
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
934 CFRelease(dict);
15094
258eee414ab7 osutil: avoid accidentally destroying the True object in isgui (issue2937)
Steve Streeting <steve@stevestreeting.com>
parents: 13748
diff changeset
935 Py_RETURN_TRUE;
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
936 } else {
15094
258eee414ab7 osutil: avoid accidentally destroying the True object in isgui (issue2937)
Steve Streeting <steve@stevestreeting.com>
parents: 13748
diff changeset
937 Py_RETURN_FALSE;
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
938 }
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
939 }
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
940 #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
941
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
942 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
943
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
944 static PyMethodDef methods[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
945 {"listdir", (PyCFunction)listdir, METH_VARARGS | METH_KEYWORDS,
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
946 "list a directory\n"},
8330
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
947 #ifdef _WIN32
7de68012f86e Windows: improve performance via buffered I/O
Bryan O'Sullivan <bos@serpentine.com>
parents: 7190
diff changeset
948 {"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
949 "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
950 "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
951 #else
ddc0323db78b osutil: write a C implementation of statfiles for unix
Bryan O'Sullivan <bryano@fb.com>
parents: 18021
diff changeset
952 {"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
953 "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
954 "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
955 #ifdef CMSG_LEN
27473
34a37a2e03e6 osutil: implement recvmsg() of SCM_RIGHTS for chg command server
Yuya Nishihara <yuya@tcha.org>
parents: 26983
diff changeset
956 {"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
957 "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
958 #endif
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
959 #ifndef SETPROCNAME_USE_NONE
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
960 {"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
961 "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
962 #endif
30409
0852161588c6 osutil: implement setprocname to set process title for some platforms
Jun Wu <quark@fb.com>
parents: 30111
diff changeset
963 #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
964 #ifdef __APPLE__
13736
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
965 {
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
966 "isgui", (PyCFunction)isgui, METH_NOARGS,
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
967 "Is a CoreGraphics session available?"
f3c4421e121c osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents: 13734
diff changeset
968 },
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
969 #endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
970 {NULL, NULL}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
971 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
972
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
973 #ifdef IS_PY3K
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
974 static struct PyModuleDef osutil_module = {
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
975 PyModuleDef_HEAD_INIT,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
976 "osutil",
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
977 osutil_doc,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
978 -1,
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
979 methods
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
980 };
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
981
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
982 PyMODINIT_FUNC PyInit_osutil(void)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
983 {
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
984 if (PyType_Ready(&listdir_stat_type) < 0)
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
985 return NULL;
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
986
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
987 return PyModule_Create(&osutil_module);
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
988 }
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
989 #else
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
990 PyMODINIT_FUNC initosutil(void)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
991 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
992 if (PyType_Ready(&listdir_stat_type) == -1)
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
993 return;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
994
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
995 Py_InitModule3("osutil", methods, osutil_doc);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
996 }
11359
4eaacccbb2ca osutil.c: Support for py3k added.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
997 #endif