Support higher-resolution time stamps.
[bpt/emacs.git] / src / dired.c
CommitLineData
14d55bce 1/* Lisp functions for making directory listings.
acaf905b 2 Copyright (C) 1985-1986, 1993-1994, 1999-2012 Free Software Foundation, Inc.
14d55bce
RS
3
4This file is part of GNU Emacs.
5
9ec0b715 6GNU Emacs is free software: you can redistribute it and/or modify
14d55bce 7it under the terms of the GNU General Public License as published by
9ec0b715
GM
8the Free Software Foundation, either version 3 of the License, or
9(at your option) any later version.
14d55bce
RS
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
9ec0b715 17along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
14d55bce
RS
18
19
3964b9a7
RS
20#include <config.h>
21
14d55bce
RS
22#include <stdio.h>
23#include <sys/types.h>
24#include <sys/stat.h>
d7306fe6 25#include <setjmp.h>
14d55bce 26
5b9c0a1d 27#ifdef HAVE_PWD_H
6b61353c 28#include <pwd.h>
5b9c0a1d 29#endif
6b61353c 30#include <grp.h>
6b61353c 31
7cc9f69f 32#include <errno.h>
dfcf069d 33#include <unistd.h>
dfcf069d 34
d6717cdb
JB
35/* The d_nameln member of a struct dirent includes the '\0' character
36 on some systems, but not on others. What's worse, you can't tell
37 at compile-time which one it will be, since it really depends on
38 the sort of system providing the filesystem you're reading from,
39 not the system you are running on. Paul Eggert
40 <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
41 SunOS 4.1.2 host, reading a directory that is remote-mounted from a
42 Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
43
44 Since applying strlen to the name always works, we'll just do that. */
45#define NAMLEN(p) strlen (p->d_name)
46
1c97e857 47#ifdef HAVE_DIRENT_H
14d55bce
RS
48
49#include <dirent.h>
50#define DIRENTRY struct dirent
14d55bce 51
1c97e857 52#else /* not HAVE_DIRENT_H */
14d55bce 53
14d55bce 54#include <sys/dir.h>
851cab13
DL
55#include <sys/stat.h>
56
14d55bce 57#define DIRENTRY struct direct
14d55bce 58
361358ea
JB
59extern DIR *opendir (char *);
60extern struct direct *readdir (DIR *);
14d55bce 61
1c97e857 62#endif /* HAVE_DIRENT_H */
128ecc89 63
d209feed 64#include <filemode.h>
d35af63c 65#include <stat-time.h>
d209feed 66
9f8c08a7 67#ifdef MSDOS
128ecc89
RS
68#define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
69#else
70#define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
14d55bce
RS
71#endif
72
14d55bce 73#include "lisp.h"
fa8459a3 74#include "systime.h"
e5560ff7 75#include "character.h"
14d55bce
RS
76#include "buffer.h"
77#include "commands.h"
bd33479f
KH
78#include "charset.h"
79#include "coding.h"
14d55bce 80#include "regex.h"
8c8a7c58 81#include "blockinput.h"
14d55bce 82
955cbe7b
PE
83static Lisp_Object Qdirectory_files;
84static Lisp_Object Qdirectory_files_and_attributes;
85static Lisp_Object Qfile_name_completion;
86static Lisp_Object Qfile_name_all_completions;
87static Lisp_Object Qfile_attributes;
88static Lisp_Object Qfile_attributes_lessp;
b3f04ced 89
d311d28c 90static ptrdiff_t scmp (const char *, const char *, ptrdiff_t);
cd64ea1d 91static Lisp_Object Ffile_attributes (Lisp_Object, Lisp_Object);
14d55bce 92\f
65156807
EZ
93#ifdef WINDOWSNT
94Lisp_Object
95directory_files_internal_w32_unwind (Lisp_Object arg)
96{
97 Vw32_get_true_file_attributes = arg;
98 return Qnil;
99}
100#endif
2488aba5 101
4a6bea26 102static Lisp_Object
971de7fb 103directory_files_internal_unwind (Lisp_Object dh)
2488aba5 104{
9d291bdf 105 DIR *d = (DIR *) XSAVE_VALUE (dh)->pointer;
d15b573e 106 BLOCK_INPUT;
2488aba5 107 closedir (d);
d15b573e 108 UNBLOCK_INPUT;
2488aba5
AI
109 return Qnil;
110}
111
177c0ea7 112/* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
4424b255 113 When ATTRS is zero, return a list of directory filenames; when
6b61353c
KH
114 non-zero, return a list of directory filenames and their attributes.
115 In the latter case, ID_FORMAT is passed to Ffile_attributes. */
f69f9da1 116
4424b255 117Lisp_Object
971de7fb 118directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, int attrs, Lisp_Object id_format)
14d55bce
RS
119{
120 DIR *d;
d311d28c 121 ptrdiff_t directory_nbytes;
388ac098 122 Lisp_Object list, dirfilename, encoded_directory;
6bbd7a29 123 struct re_pattern_buffer *bufp = NULL;
96d64004 124 int needsep = 0;
d311d28c 125 ptrdiff_t count = SPECPDL_INDEX ();
388ac098 126 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
8e42f043 127 DIRENTRY *dp;
65156807
EZ
128#ifdef WINDOWSNT
129 Lisp_Object w32_save = Qnil;
130#endif
32f4334d 131
96d64004 132 /* Because of file name handlers, these functions might call
6155fae1 133 Ffuncall, and cause a GC. */
388ac098
GM
134 list = encoded_directory = dirfilename = Qnil;
135 GCPRO5 (match, directory, list, dirfilename, encoded_directory);
96d64004 136 dirfilename = Fdirectory_file_name (directory);
6155fae1 137
265a9e55 138 if (!NILP (match))
14d55bce 139 {
b7826503 140 CHECK_STRING (match);
ebb9e16f
JB
141
142 /* MATCH might be a flawed regular expression. Rather than
8e6208c5 143 catching and signaling our own errors, we just call
ebb9e16f 144 compile_pattern to do the work for us. */
c872c6b2
RS
145 /* Pass 1 for the MULTIBYTE arg
146 because we do make multibyte strings if the contents warrant. */
1a9fbabe
EZ
147# ifdef WINDOWSNT
148 /* Windows users want case-insensitive wildcards. */
149 bufp = compile_pattern (match, 0,
4b4deea2 150 BVAR (&buffer_defaults, case_canon_table), 0, 1);
1a9fbabe 151# else /* !WINDOWSNT */
3e937712 152 bufp = compile_pattern (match, 0, Qnil, 0, 1);
1a9fbabe 153# endif /* !WINDOWSNT */
14d55bce
RS
154 }
155
b3edfc9b 156 /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
388ac098
GM
157 run_pre_post_conversion_on_str which calls Lisp directly and
158 indirectly. */
6c8b4f07
SM
159 if (STRING_MULTIBYTE (dirfilename))
160 dirfilename = ENCODE_FILE (dirfilename);
161 encoded_directory = (STRING_MULTIBYTE (directory)
162 ? ENCODE_FILE (directory) : directory);
24c2a54f 163
e50c66d3 164 /* Now *bufp is the compiled form of MATCH; don't call anything
6155fae1
JB
165 which might compile a new regexp until we're done with the loop! */
166
d15b573e 167 BLOCK_INPUT;
42a5b22f 168 d = opendir (SSDATA (dirfilename));
d15b573e 169 UNBLOCK_INPUT;
388ac098 170 if (d == NULL)
23bd240f 171 report_file_error ("Opening directory", Fcons (directory, Qnil));
14d55bce 172
2488aba5
AI
173 /* Unfortunately, we can now invoke expand-file-name and
174 file-attributes on filenames, both of which can throw, so we must
175 do a proper unwind-protect. */
176 record_unwind_protect (directory_files_internal_unwind,
9d291bdf 177 make_save_value (d, 0));
2488aba5 178
65156807
EZ
179#ifdef WINDOWSNT
180 if (attrs)
181 {
65156807
EZ
182 extern int is_slow_fs (const char *);
183
184 /* Do this only once to avoid doing it (in w32.c:stat) for each
185 file in the directory, when we call Ffile_attributes below. */
186 record_unwind_protect (directory_files_internal_w32_unwind,
187 Vw32_get_true_file_attributes);
188 w32_save = Vw32_get_true_file_attributes;
189 if (EQ (Vw32_get_true_file_attributes, Qlocal))
190 {
65156807
EZ
191 /* w32.c:stat will notice these bindings and avoid calling
192 GetDriveType for each file. */
b6046155 193 if (is_slow_fs (SDATA (dirfilename)))
65156807
EZ
194 Vw32_get_true_file_attributes = Qnil;
195 else
196 Vw32_get_true_file_attributes = Qt;
197 }
198 }
199#endif
200
d5db4077 201 directory_nbytes = SBYTES (directory);
c81a9bdc 202 re_match_object = Qt;
14d55bce 203
96d64004 204 /* Decide whether we need to add a directory separator. */
388ac098 205 if (directory_nbytes == 0
d5db4077 206 || !IS_ANY_SEP (SREF (directory, directory_nbytes - 1)))
96d64004 207 needsep = 1;
96d64004 208
8e42f043 209 /* Loop reading blocks until EOF or error. */
f69f9da1 210 for (;;)
14d55bce 211 {
f69f9da1
GM
212 errno = 0;
213 dp = readdir (d);
214
9d291bdf 215 if (dp == NULL && (0
f69f9da1 216#ifdef EAGAIN
9d291bdf
SM
217 || errno == EAGAIN
218#endif
219#ifdef EINTR
220 || errno == EINTR
f69f9da1 221#endif
9d291bdf
SM
222 ))
223 { QUIT; continue; }
177c0ea7 224
f69f9da1
GM
225 if (dp == NULL)
226 break;
227
128ecc89 228 if (DIRENTRY_NONEMPTY (dp))
14d55bce 229 {
d311d28c 230 ptrdiff_t len;
2488aba5 231 int wanted = 0;
388ac098 232 Lisp_Object name, finalname;
dbf31225 233 struct gcpro gcpro1, gcpro2;
e23f810c
KH
234
235 len = NAMLEN (dp);
9ad4f3e5 236 name = finalname = make_unibyte_string (dp->d_name, len);
dbf31225 237 GCPRO2 (finalname, name);
177c0ea7 238
6c8b4f07 239 /* Note: DECODE_FILE can GC; it should protect its argument,
388ac098
GM
240 though. */
241 name = DECODE_FILE (name);
d5db4077 242 len = SBYTES (name);
e23f810c 243
2488aba5
AI
244 /* Now that we have unwind_protect in place, we might as well
245 allow matching to be interrupted. */
246 immediate_quit = 1;
247 QUIT;
248
265a9e55 249 if (NILP (match)
42a5b22f 250 || (0 <= re_search (bufp, SSDATA (name), len, 0, len, 0)))
388ac098 251 wanted = 1;
2488aba5
AI
252
253 immediate_quit = 0;
254
255 if (wanted)
14d55bce 256 {
265a9e55 257 if (!NILP (full))
14d55bce 258 {
e23f810c 259 Lisp_Object fullname;
d311d28c
PE
260 ptrdiff_t nbytes = len + directory_nbytes + needsep;
261 ptrdiff_t nchars;
5617588f 262
388ac098 263 fullname = make_uninit_multibyte_string (nbytes, nbytes);
72af86bd
AS
264 memcpy (SDATA (fullname), SDATA (directory),
265 directory_nbytes);
177c0ea7 266
5617588f 267 if (needsep)
d549c5db 268 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
177c0ea7 269
72af86bd
AS
270 memcpy (SDATA (fullname) + directory_nbytes + needsep,
271 SDATA (name), len);
177c0ea7 272
d5db4077 273 nchars = chars_in_text (SDATA (fullname), nbytes);
388ac098
GM
274
275 /* Some bug somewhere. */
276 if (nchars > nbytes)
277 abort ();
177c0ea7 278
437fcd47 279 STRING_SET_CHARS (fullname, nchars);
388ac098 280 if (nchars == nbytes)
d5db4077 281 STRING_SET_UNIBYTE (fullname);
177c0ea7 282
4424b255
GV
283 finalname = fullname;
284 }
aab9c564
KH
285 else
286 finalname = name;
4424b255
GV
287
288 if (attrs)
289 {
290 /* Construct an expanded filename for the directory entry.
291 Use the decoded names for input to Ffile_attributes. */
388ac098 292 Lisp_Object decoded_fullname, fileattrs;
dbf31225 293 struct gcpro gcpro1, gcpro2;
388ac098
GM
294
295 decoded_fullname = fileattrs = Qnil;
dbf31225 296 GCPRO2 (decoded_fullname, fileattrs);
4424b255 297
388ac098 298 /* Both Fexpand_file_name and Ffile_attributes can GC. */
4424b255 299 decoded_fullname = Fexpand_file_name (name, directory);
6b61353c 300 fileattrs = Ffile_attributes (decoded_fullname, id_format);
4424b255
GV
301
302 list = Fcons (Fcons (finalname, fileattrs), list);
dbf31225 303 UNGCPRO;
4424b255
GV
304 }
305 else
388ac098 306 list = Fcons (finalname, list);
14d55bce 307 }
388ac098 308
dbf31225 309 UNGCPRO;
14d55bce
RS
310 }
311 }
2488aba5 312
d15b573e 313 BLOCK_INPUT;
14d55bce 314 closedir (d);
d15b573e 315 UNBLOCK_INPUT;
65156807
EZ
316#ifdef WINDOWSNT
317 if (attrs)
318 Vw32_get_true_file_attributes = w32_save;
319#endif
2488aba5
AI
320
321 /* Discard the unwind protect. */
322 specpdl_ptr = specpdl + count;
323
388ac098
GM
324 if (NILP (nosort))
325 list = Fsort (Fnreverse (list),
326 attrs ? Qfile_attributes_lessp : Qstring_lessp);
177c0ea7 327
388ac098 328 RETURN_UNGCPRO (list);
14d55bce 329}
4424b255
GV
330
331
332DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
335c5470
PJ
333 doc: /* Return a list of names of files in DIRECTORY.
334There are three optional arguments:
335If FULL is non-nil, return absolute file names. Otherwise return names
336 that are relative to the specified directory.
337If MATCH is non-nil, mention only file names that match the regexp MATCH.
338If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
a489517b
JB
339 Otherwise, the list returned is sorted with `string-lessp'.
340 NOSORT is useful if you plan to sort the result yourself. */)
5842a27b 341 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort)
4424b255
GV
342{
343 Lisp_Object handler;
4ece81a6 344 directory = Fexpand_file_name (directory, Qnil);
4424b255
GV
345
346 /* If the file name has special constructs in it,
347 call the corresponding file handler. */
348 handler = Ffind_file_name_handler (directory, Qdirectory_files);
349 if (!NILP (handler))
6b61353c
KH
350 return call5 (handler, Qdirectory_files, directory,
351 full, match, nosort);
4424b255 352
6b61353c 353 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
4424b255
GV
354}
355
335c5470 356DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
6b61353c 357 Sdirectory_files_and_attributes, 1, 5, 0,
335c5470 358 doc: /* Return a list of names of files and their attributes in DIRECTORY.
6b61353c 359There are four optional arguments:
335c5470
PJ
360If FULL is non-nil, return absolute file names. Otherwise return names
361 that are relative to the specified directory.
362If MATCH is non-nil, mention only file names that match the regexp MATCH.
363If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
6b61353c
KH
364 NOSORT is useful if you plan to sort the result yourself.
365ID-FORMAT specifies the preferred format of attributes uid and gid, see
6c5665e9
EZ
366`file-attributes' for further documentation.
367On MS-Windows, performance depends on `w32-get-true-file-attributes',
368which see. */)
5842a27b 369 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, Lisp_Object id_format)
4424b255
GV
370{
371 Lisp_Object handler;
4ece81a6 372 directory = Fexpand_file_name (directory, Qnil);
4424b255
GV
373
374 /* If the file name has special constructs in it,
375 call the corresponding file handler. */
376 handler = Ffind_file_name_handler (directory, Qdirectory_files_and_attributes);
377 if (!NILP (handler))
6b61353c
KH
378 return call6 (handler, Qdirectory_files_and_attributes,
379 directory, full, match, nosort, id_format);
4424b255 380
6b61353c 381 return directory_files_internal (directory, full, match, nosort, 1, id_format);
4424b255
GV
382}
383
14d55bce 384\f
16390cd2
PE
385static Lisp_Object file_name_completion
386 (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag,
387 Lisp_Object predicate);
14d55bce
RS
388
389DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
abfb1932 390 2, 3, 0,
335c5470
PJ
391 doc: /* Complete file name FILE in directory DIRECTORY.
392Returns the longest string
393common to all file names in DIRECTORY that start with FILE.
394If there is only one and FILE matches it exactly, returns t.
2f60660a 395Returns nil if DIRECTORY contains no name starting with FILE.
335c5470 396
b6ce54d6
RS
397If PREDICATE is non-nil, call PREDICATE with each possible
398completion (in absolute form) and ignore it if PREDICATE returns nil.
399
335c5470
PJ
400This function ignores some of the possible completions as
401determined by the variable `completion-ignored-extensions', which see. */)
5842a27b 402 (Lisp_Object file, Lisp_Object directory, Lisp_Object predicate)
14d55bce 403{
32f4334d 404 Lisp_Object handler;
32c1fffd 405 directory = Fexpand_file_name (directory, Qnil);
32f4334d 406
8436e231 407 /* If the directory name has special constructs in it,
32f4334d 408 call the corresponding file handler. */
23bd240f 409 handler = Ffind_file_name_handler (directory, Qfile_name_completion);
32f4334d 410 if (!NILP (handler))
abfb1932 411 return call4 (handler, Qfile_name_completion, file, directory, predicate);
32f4334d 412
8436e231
RS
413 /* If the file name has special constructs in it,
414 call the corresponding file handler. */
415 handler = Ffind_file_name_handler (file, Qfile_name_completion);
416 if (!NILP (handler))
abfb1932 417 return call4 (handler, Qfile_name_completion, file, directory, predicate);
8436e231 418
abfb1932 419 return file_name_completion (file, directory, 0, 0, predicate);
14d55bce
RS
420}
421
422DEFUN ("file-name-all-completions", Ffile_name_all_completions,
335c5470
PJ
423 Sfile_name_all_completions, 2, 2, 0,
424 doc: /* Return a list of all completions of file name FILE in directory DIRECTORY.
425These are all file names in directory DIRECTORY which begin with FILE. */)
5842a27b 426 (Lisp_Object file, Lisp_Object directory)
14d55bce 427{
32f4334d 428 Lisp_Object handler;
32c1fffd 429 directory = Fexpand_file_name (directory, Qnil);
32f4334d 430
8436e231 431 /* If the directory name has special constructs in it,
32f4334d 432 call the corresponding file handler. */
23bd240f 433 handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
32f4334d 434 if (!NILP (handler))
23bd240f 435 return call3 (handler, Qfile_name_all_completions, file, directory);
32f4334d 436
8436e231
RS
437 /* If the file name has special constructs in it,
438 call the corresponding file handler. */
439 handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
440 if (!NILP (handler))
23bd240f 441 return call3 (handler, Qfile_name_all_completions, file, directory);
8436e231 442
abfb1932 443 return file_name_completion (file, directory, 1, 0, Qnil);
14d55bce
RS
444}
445
438105ed 446static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
955cbe7b 447static Lisp_Object Qdefault_directory;
dfcf069d 448
16390cd2 449static Lisp_Object
971de7fb 450file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate)
14d55bce
RS
451{
452 DIR *d;
d311d28c 453 ptrdiff_t bestmatchsize = 0;
14d55bce 454 int matchcount = 0;
abfb1932
RS
455 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
456 If ALL_FLAG is 0, BESTMATCH is either nil
457 or the best match so far, not decoded. */
14d55bce 458 Lisp_Object bestmatch, tem, elt, name;
24c2a54f
RS
459 Lisp_Object encoded_file;
460 Lisp_Object encoded_dir;
14d55bce
RS
461 struct stat st;
462 int directoryp;
3271a8f5
SM
463 /* If includeall is zero, exclude files in completion-ignored-extensions as
464 well as "." and "..". Until shown otherwise, assume we can't exclude
465 anything. */
466 int includeall = 1;
d311d28c 467 ptrdiff_t count = SPECPDL_INDEX ();
24c2a54f 468 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3fcc88cc 469
6bbd7a29
GM
470 elt = Qnil;
471
b7826503 472 CHECK_STRING (file);
14d55bce 473
128ecc89
RS
474#ifdef FILE_SYSTEM_CASE
475 file = FILE_SYSTEM_CASE (file);
476#endif
14d55bce 477 bestmatch = Qnil;
24c2a54f
RS
478 encoded_file = encoded_dir = Qnil;
479 GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
01bb4018 480 specbind (Qdefault_directory, dirname);
14d55bce 481
24c2a54f
RS
482 /* Do completion on the encoded file name
483 because the other names in the directory are (we presume)
484 encoded likewise. We decode the completed string at the end. */
2a54a229
SM
485 /* Actually, this is not quite true any more: we do most of the completion
486 work with decoded file names, but we still do some filtering based
487 on the encoded file name. */
6c8b4f07 488 encoded_file = STRING_MULTIBYTE (file) ? ENCODE_FILE (file) : file;
24c2a54f
RS
489
490 encoded_dir = ENCODE_FILE (dirname);
491
3271a8f5 492 BLOCK_INPUT;
42a5b22f 493 d = opendir (SSDATA (Fdirectory_file_name (encoded_dir)));
3271a8f5
SM
494 UNBLOCK_INPUT;
495 if (!d)
496 report_file_error ("Opening directory", Fcons (dirname, Qnil));
14d55bce 497
3271a8f5
SM
498 record_unwind_protect (directory_files_internal_unwind,
499 make_save_value (d, 0));
14d55bce 500
3271a8f5
SM
501 /* Loop reading blocks */
502 /* (att3b compiler bug requires do a null comparison this way) */
503 while (1)
14d55bce 504 {
3271a8f5 505 DIRENTRY *dp;
d311d28c 506 ptrdiff_t len;
3271a8f5 507 int canexclude = 0;
14d55bce 508
3271a8f5
SM
509 errno = 0;
510 dp = readdir (d);
511 if (dp == NULL && (0
9d291bdf 512# ifdef EAGAIN
3271a8f5 513 || errno == EAGAIN
9d291bdf
SM
514# endif
515# ifdef EINTR
3271a8f5 516 || errno == EINTR
9d291bdf 517# endif
3271a8f5
SM
518 ))
519 { QUIT; continue; }
9d291bdf 520
3271a8f5 521 if (!dp) break;
14d55bce 522
3271a8f5 523 len = NAMLEN (dp);
14d55bce 524
3271a8f5
SM
525 QUIT;
526 if (! DIRENTRY_NONEMPTY (dp)
527 || len < SCHARS (encoded_file)
4f043d0f 528 || 0 <= scmp (dp->d_name, SSDATA (encoded_file),
3271a8f5
SM
529 SCHARS (encoded_file)))
530 continue;
14d55bce 531
3271a8f5
SM
532 if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
533 continue;
14d55bce 534
f68c809d 535 directoryp = S_ISDIR (st.st_mode);
3271a8f5
SM
536 tem = Qnil;
537 /* If all_flag is set, always include all.
538 It would not actually be helpful to the user to ignore any possible
539 completions when making a list of them. */
540 if (!all_flag)
541 {
d311d28c 542 ptrdiff_t skip;
2cd298e2 543
7519c40d 544#if 0 /* FIXME: The `scmp' call compares an encoded and a decoded string. */
2cd298e2
SM
545 /* If this entry matches the current bestmatch, the only
546 thing it can do is increase matchcount, so don't bother
547 investigating it any further. */
548 if (!completion_ignore_case
549 /* The return result depends on whether it's the sole match. */
550 && matchcount > 1
551 && !includeall /* This match may allow includeall to 0. */
552 && len >= bestmatchsize
4f043d0f 553 && 0 > scmp (dp->d_name, SSDATA (bestmatch), bestmatchsize))
2cd298e2 554 continue;
7519c40d 555#endif
2cd298e2 556
3271a8f5 557 if (directoryp)
ad456ad4
RS
558 {
559#ifndef TRIVIAL_DIRECTORY_ENTRY
560#define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
561#endif
abfb1932
RS
562 /* "." and ".." are never interesting as completions, and are
563 actually in the way in a directory with only one file. */
3271a8f5
SM
564 if (TRIVIAL_DIRECTORY_ENTRY (dp->d_name))
565 canexclude = 1;
566 else if (len > SCHARS (encoded_file))
d013f29b
EZ
567 /* Ignore directories if they match an element of
568 completion-ignored-extensions which ends in a slash. */
569 for (tem = Vcompletion_ignored_extensions;
570 CONSP (tem); tem = XCDR (tem))
571 {
d311d28c 572 ptrdiff_t elt_len;
4f043d0f 573 char *p1;
d013f29b
EZ
574
575 elt = XCAR (tem);
576 if (!STRINGP (elt))
577 continue;
a74aaa9d
EZ
578 /* Need to encode ELT, since scmp compares unibyte
579 strings only. */
580 elt = ENCODE_FILE (elt);
d5db4077 581 elt_len = SCHARS (elt) - 1; /* -1 for trailing / */
7a8d465a 582 if (elt_len <= 0)
d013f29b 583 continue;
4f043d0f 584 p1 = SSDATA (elt);
d013f29b
EZ
585 if (p1[elt_len] != '/')
586 continue;
587 skip = len - elt_len;
588 if (skip < 0)
589 continue;
590
591 if (0 <= scmp (dp->d_name + skip, p1, elt_len))
592 continue;
593 break;
594 }
ad456ad4
RS
595 }
596 else
3271a8f5 597 {
14d55bce
RS
598 /* Compare extensions-to-be-ignored against end of this file name */
599 /* if name is not an exact match against specified string */
3271a8f5 600 if (len > SCHARS (encoded_file))
14d55bce
RS
601 /* and exit this for loop if a match is found */
602 for (tem = Vcompletion_ignored_extensions;
70949dac 603 CONSP (tem); tem = XCDR (tem))
14d55bce 604 {
70949dac 605 elt = XCAR (tem);
88cf1852 606 if (!STRINGP (elt)) continue;
a74aaa9d
EZ
607 /* Need to encode ELT, since scmp compares unibyte
608 strings only. */
609 elt = ENCODE_FILE (elt);
d5db4077 610 skip = len - SCHARS (elt);
14d55bce
RS
611 if (skip < 0) continue;
612
613 if (0 <= scmp (dp->d_name + skip,
4f043d0f 614 SSDATA (elt),
d5db4077 615 SCHARS (elt)))
14d55bce
RS
616 continue;
617 break;
618 }
619 }
620
f676868d
KH
621 /* If an ignored-extensions match was found,
622 don't process this name as a completion. */
3271a8f5
SM
623 if (CONSP (tem))
624 canexclude = 1;
f676868d 625
3271a8f5
SM
626 if (!includeall && canexclude)
627 /* We're not including all files and this file can be excluded. */
628 continue;
9c691c00 629
3271a8f5
SM
630 if (includeall && !canexclude)
631 { /* If we have one non-excludable file, we want to exclude the
4c36be58 632 excludable files. */
3271a8f5
SM
633 includeall = 0;
634 /* Throw away any previous excludable match found. */
635 bestmatch = Qnil;
636 bestmatchsize = 0;
637 matchcount = 0;
f676868d 638 }
3271a8f5
SM
639 }
640 /* FIXME: If we move this `decode' earlier we can eliminate
641 the repeated ENCODE_FILE on Vcompletion_ignored_extensions. */
642 name = make_unibyte_string (dp->d_name, len);
643 name = DECODE_FILE (name);
644
645 {
646 Lisp_Object regexps;
3271a8f5
SM
647
648 /* Ignore this element if it fails to match all the regexps. */
cc524e3b
CY
649 if (completion_ignore_case)
650 {
651 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
652 regexps = XCDR (regexps))
653 if (fast_string_match_ignore_case (XCAR (regexps), name) < 0)
654 break;
655 }
656 else
657 {
658 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
659 regexps = XCDR (regexps))
660 if (fast_string_match (XCAR (regexps), name) < 0)
661 break;
662 }
663
3271a8f5
SM
664 if (CONSP (regexps))
665 continue;
666 }
667
668 /* This is a possible completion */
669 if (directoryp)
670 /* This completion is a directory; make it end with '/'. */
671 name = Ffile_name_as_directory (name);
672
673 /* Test the predicate, if any. */
674 if (!NILP (predicate))
675 {
676 Lisp_Object val;
dbf31225 677 struct gcpro gcpro1;
14d55bce 678
dbf31225 679 GCPRO1 (name);
3271a8f5 680 val = call1 (predicate, name);
dbf31225 681 UNGCPRO;
c4c52bb7 682
3271a8f5
SM
683 if (NILP (val))
684 continue;
685 }
abfb1932 686
3271a8f5 687 /* Suitably record this match. */
14d55bce 688
d311d28c 689 matchcount += matchcount <= 1;
f676868d 690
3271a8f5
SM
691 if (all_flag)
692 bestmatch = Fcons (name, bestmatch);
693 else if (NILP (bestmatch))
694 {
695 bestmatch = name;
696 bestmatchsize = SCHARS (name);
697 }
698 else
699 {
700 Lisp_Object zero = make_number (0);
701 /* FIXME: This is a copy of the code in Ftry_completion. */
d311d28c 702 ptrdiff_t compare = min (bestmatchsize, SCHARS (name));
38b2c076 703 Lisp_Object cmp
3271a8f5
SM
704 = Fcompare_strings (bestmatch, zero,
705 make_number (compare),
706 name, zero,
707 make_number (compare),
708 completion_ignore_case ? Qt : Qnil);
d311d28c 709 ptrdiff_t matchsize
38b2c076
PE
710 = (EQ (cmp, Qt) ? compare
711 : XINT (cmp) < 0 ? - XINT (cmp) - 1
712 : XINT (cmp) - 1);
3271a8f5
SM
713
714 if (completion_ignore_case)
f676868d 715 {
3271a8f5
SM
716 /* If this is an exact match except for case,
717 use it as the best match rather than one that is not
718 an exact match. This way, we get the case pattern
719 of the actual match. */
720 /* This tests that the current file is an exact match
721 but BESTMATCH is not (it is too long). */
722 if ((matchsize == SCHARS (name)
2cd298e2 723 && matchsize + !!directoryp < SCHARS (bestmatch))
3271a8f5
SM
724 ||
725 /* If there is no exact match ignoring case,
726 prefer a match that does not change the case
727 of the input. */
728 /* If there is more than one exact match aside from
729 case, and one of them is exact including case,
730 prefer that one. */
731 /* This == checks that, of current file and BESTMATCH,
732 either both or neither are exact. */
733 (((matchsize == SCHARS (name))
734 ==
735 (matchsize + !!directoryp == SCHARS (bestmatch)))
38b2c076 736 && (cmp = Fcompare_strings (name, zero,
3271a8f5
SM
737 make_number (SCHARS (file)),
738 file, zero,
739 Qnil,
740 Qnil),
38b2c076
PE
741 EQ (Qt, cmp))
742 && (cmp = Fcompare_strings (bestmatch, zero,
3271a8f5
SM
743 make_number (SCHARS (file)),
744 file, zero,
745 Qnil,
746 Qnil),
38b2c076 747 ! EQ (Qt, cmp))))
3271a8f5 748 bestmatch = name;
14d55bce 749 }
3271a8f5 750 bestmatchsize = matchsize;
2cd298e2
SM
751
752 /* If the best completion so far is reduced to the string
753 we're trying to complete, then we already know there's no
754 other completion, so there's no point looking any further. */
755 if (matchsize <= SCHARS (file)
756 && !includeall /* A future match may allow includeall to 0. */
757 /* If completion-ignore-case is non-nil, don't
758 short-circuit because we want to find the best
759 possible match *including* case differences. */
760 && (!completion_ignore_case || matchsize == 0)
761 /* The return value depends on whether it's the sole match. */
762 && matchcount > 1)
763 break;
764
14d55bce 765 }
14d55bce
RS
766 }
767
3fcc88cc 768 UNGCPRO;
3271a8f5 769 /* This closes the directory. */
c3a3229c 770 bestmatch = unbind_to (count, bestmatch);
14d55bce 771
265a9e55 772 if (all_flag || NILP (bestmatch))
2a54a229 773 return bestmatch;
928b5acc
SM
774 /* Return t if the supplied string is an exact match (counting case);
775 it does not require any change to be made. */
776 if (matchcount == 1 && !NILP (Fequal (bestmatch, file)))
14d55bce 777 return Qt;
24c2a54f
RS
778 bestmatch = Fsubstring (bestmatch, make_number (0),
779 make_number (bestmatchsize));
24c2a54f 780 return bestmatch;
14d55bce
RS
781}
782
b3f04ced
RS
783/* Compare exactly LEN chars of strings at S1 and S2,
784 ignoring case if appropriate.
785 Return -1 if strings match,
786 else number of chars that match at the beginning. */
787
d311d28c
PE
788static ptrdiff_t
789scmp (const char *s1, const char *s2, ptrdiff_t len)
b3f04ced 790{
d311d28c 791 register ptrdiff_t l = len;
b3f04ced
RS
792
793 if (completion_ignore_case)
794 {
4f043d0f 795 while (l
5da9919f
PE
796 && (downcase ((unsigned char) *s1++)
797 == downcase ((unsigned char) *s2++)))
b3f04ced
RS
798 l--;
799 }
800 else
801 {
802 while (l && *s1++ == *s2++)
803 l--;
804 }
805 if (l == 0)
806 return -1;
807 else
808 return len - l;
809}
810
dfcf069d 811static int
438105ed 812file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
14d55bce 813{
d311d28c
PE
814 ptrdiff_t len = NAMLEN (dp);
815 ptrdiff_t pos = SCHARS (dirname);
7e3cf34f 816 int value;
d311d28c
PE
817 char *fullname;
818 USE_SAFE_ALLOCA;
819 SAFE_ALLOCA (fullname, char *, len + pos + 2);
14d55bce 820
04924ee3 821#ifdef MSDOS
04924ee3
RS
822 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
823 but aren't required here. Avoid computing the following fields:
824 st_inode, st_size and st_nlink for directories, and the execute bits
825 in st_mode for non-directory files with non-standard extensions. */
826
827 unsigned short save_djstat_flags = _djstat_flags;
828
829 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
04924ee3
RS
830#endif /* MSDOS */
831
72af86bd 832 memcpy (fullname, SDATA (dirname), pos);
0b39d75d
RS
833 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
834 fullname[pos++] = DIRECTORY_SEP;
14d55bce 835
72af86bd 836 memcpy (fullname + pos, dp->d_name, len);
14d55bce
RS
837 fullname[pos + len] = 0;
838
7e3cf34f
RS
839 /* We want to return success if a link points to a nonexistent file,
840 but we want to return the status for what the link points to,
841 in case it is a directory. */
842 value = lstat (fullname, st_addr);
f68c809d
PE
843 if (value == 0 && S_ISLNK (st_addr->st_mode))
844 stat (fullname, st_addr);
04924ee3 845#ifdef MSDOS
04924ee3 846 _djstat_flags = save_djstat_flags;
04924ee3 847#endif /* MSDOS */
d311d28c 848 SAFE_FREE ();
04924ee3 849 return value;
14d55bce
RS
850}
851\f
8aaaec6b
EZ
852static char *
853stat_uname (struct stat *st)
854{
855#ifdef WINDOWSNT
856 return st->st_uname;
857#else
858 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
859
860 if (pw)
861 return pw->pw_name;
862 else
863 return NULL;
864#endif
865}
866
867static char *
868stat_gname (struct stat *st)
869{
870#ifdef WINDOWSNT
871 return st->st_gname;
872#else
873 struct group *gr = (struct group *) getgrgid (st->st_gid);
874
875 if (gr)
876 return gr->gr_name;
877 else
878 return NULL;
879#endif
880}
881
6b61353c 882DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
335c5470
PJ
883 doc: /* Return a list of attributes of file FILENAME.
884Value is nil if specified file cannot be opened.
6b61353c
KH
885
886ID-FORMAT specifies the preferred format of attributes uid and gid (see
e42cd1a7
JB
887below) - valid values are 'string and 'integer. The latter is the
888default, but we plan to change that, so you should specify a non-nil value
889for ID-FORMAT if you use the returned uid or gid.
6b61353c
KH
890
891Elements of the attribute list are:
335c5470
PJ
892 0. t for directory, string (name linked to) for symbolic link, or nil.
893 1. Number of links to file.
78e7d1fe
EZ
894 2. File uid as a string or a number. If a string value cannot be
895 looked up, a numeric value, either an integer or a float, is returned.
6b61353c 896 3. File gid, likewise.
d35af63c
PE
897 4. Last access time, as a list of integers (HIGH LOW USEC PSEC) in the
898 same style as (current-time).
e02131a2
EZ
899 (See a note below about access time on FAT-based filesystems.)
900 5. Last modification time, likewise. This is the time of the last
901 change to the file's contents.
902 6. Last status change time, likewise. This is the time of last change
903 to the file's attributes: owner and group, access mode bits, etc.
335c5470
PJ
904 7. Size in bytes.
905 This is a floating point number if the size is too large for an integer.
906 8. File modes, as a string of ten letters or dashes as in ls -l.
e0f24100 907 9. t if file's gid would change if file were deleted and recreated.
be44ca6c
PE
90810. inode number. If it is larger than what an Emacs integer can hold,
909 this is of the form (HIGH . LOW): first the high bits, then the low 16 bits.
910 If even HIGH is too large for an Emacs integer, this is instead of the form
911 (HIGH MIDDLE . LOW): first the high bits, then the middle 24 bits,
e02131a2
EZ
912 and finally the low 16 bits.
91311. Filesystem device number. If it is larger than what the Emacs
914 integer can hold, this is a cons cell, similar to the inode number.
915
916On most filesystems, the combination of the inode and the device
917number uniquely identifies the file.
6c5665e9
EZ
918
919On MS-Windows, performance depends on `w32-get-true-file-attributes',
21f73755
EZ
920which see.
921
922On some FAT-based filesystems, only the date of last access is recorded,
923so last access time will always be midnight of that day. */)
5842a27b 924 (Lisp_Object filename, Lisp_Object id_format)
14d55bce
RS
925{
926 Lisp_Object values[12];
24c2a54f 927 Lisp_Object encoded;
14d55bce 928 struct stat s;
98601119 929#ifdef BSD4_2
b3edfc9b 930 Lisp_Object dirname;
14d55bce 931 struct stat sdir;
98601119 932#endif /* BSD4_2 */
4ad89555
PE
933
934 /* An array to hold the mode string generated by filemodestring,
935 including its terminating space and null byte. */
936 char modes[sizeof "-rwxr-xr-x "];
937
32f4334d 938 Lisp_Object handler;
7435aef8 939 struct gcpro gcpro1;
51105b13 940 char *uname = NULL, *gname = NULL;
14d55bce
RS
941
942 filename = Fexpand_file_name (filename, Qnil);
32f4334d
RS
943
944 /* If the file name has special constructs in it,
945 call the corresponding file handler. */
a617e913 946 handler = Ffind_file_name_handler (filename, Qfile_attributes);
32f4334d 947 if (!NILP (handler))
6b61353c
KH
948 { /* Only pass the extra arg if it is used to help backward compatibility
949 with old file handlers which do not implement the new arg. --Stef */
950 if (NILP (id_format))
951 return call2 (handler, Qfile_attributes, filename);
952 else
953 return call3 (handler, Qfile_attributes, filename, id_format);
954 }
32f4334d 955
7435aef8 956 GCPRO1 (filename);
24c2a54f 957 encoded = ENCODE_FILE (filename);
7435aef8 958 UNGCPRO;
24c2a54f 959
42a5b22f 960 if (lstat (SSDATA (encoded), &s) < 0)
14d55bce
RS
961 return Qnil;
962
8d40723d
PE
963 values[0] = (S_ISLNK (s.st_mode) ? Ffile_symlink_p (filename)
964 : S_ISDIR (s.st_mode) ? Qt : Qnil);
14d55bce 965 values[1] = make_number (s.st_nlink);
51105b13
EZ
966
967 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
6b61353c 968 {
8c8a7c58 969 BLOCK_INPUT;
8aaaec6b 970 uname = stat_uname (&s);
8aaaec6b 971 gname = stat_gname (&s);
8c8a7c58 972 UNBLOCK_INPUT;
6b61353c 973 }
51105b13 974 if (uname)
80904120 975 values[2] = DECODE_SYSTEM (build_string (uname));
51105b13 976 else
58a12889 977 values[2] = make_fixnum_or_float (s.st_uid);
51105b13 978 if (gname)
80904120 979 values[3] = DECODE_SYSTEM (build_string (gname));
51105b13 980 else
58a12889 981 values[3] = make_fixnum_or_float (s.st_gid);
51105b13 982
d35af63c
PE
983 values[4] = make_lisp_time (get_stat_atime (&s));
984 values[5] = make_lisp_time (get_stat_mtime (&s));
985 values[6] = make_lisp_time (get_stat_ctime (&s));
83c77d31
PE
986
987 /* If the file size is a 4-byte type, assume that files of sizes in
988 the 2-4 GiB range wrap around to negative values, as this is a
989 common bug on older 32-bit platforms. */
990 if (sizeof (s.st_size) == 4)
991 values[7] = make_fixnum_or_float (s.st_size & 0xffffffffu);
992 else
993 values[7] = make_fixnum_or_float (s.st_size);
4bc12672 994
14d55bce
RS
995 filemodestring (&s, modes);
996 values[8] = make_string (modes, 10);
98601119 997#ifdef BSD4_2 /* file gid will be dir gid */
14d55bce 998 dirname = Ffile_name_directory (filename);
24c2a54f
RS
999 if (! NILP (dirname))
1000 encoded = ENCODE_FILE (dirname);
d5db4077 1001 if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
01388a3d 1002 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
14d55bce
RS
1003 else /* if we can't tell, assume worst */
1004 values[9] = Qt;
1005#else /* file gid will be egid */
01388a3d 1006 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
98601119 1007#endif /* not BSD4_2 */
be44ca6c
PE
1008 values[10] = INTEGER_TO_CONS (s.st_ino);
1009 values[11] = INTEGER_TO_CONS (s.st_dev);
68c45bf0 1010
5e617bc2 1011 return Flist (sizeof (values) / sizeof (values[0]), values);
14d55bce 1012}
4424b255
GV
1013
1014DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
335c5470
PJ
1015 doc: /* Return t if first arg file attributes list is less than second.
1016Comparison is in lexicographic order and case is significant. */)
5842a27b 1017 (Lisp_Object f1, Lisp_Object f2)
4424b255
GV
1018{
1019 return Fstring_lessp (Fcar (f1), Fcar (f2));
1020}
14d55bce 1021\f
316411f0
DA
1022
1023DEFUN ("system-users", Fsystem_users, Ssystem_users, 0, 0, 0,
1024 doc: /* Return a list of user names currently registered in the system.
e5a36063
GM
1025If we don't know how to determine that on this platform, just
1026return a list with one element, taken from `user-real-login-name'. */)
316411f0
DA
1027 (void)
1028{
1029 Lisp_Object users = Qnil;
aba027e8 1030#if defined HAVE_GETPWENT && defined HAVE_ENDPWENT
316411f0
DA
1031 struct passwd *pw;
1032
1033 while ((pw = getpwent ()))
1034 users = Fcons (DECODE_SYSTEM (build_string (pw->pw_name)), users);
1035
1036 endpwent ();
1037#endif
1038 if (EQ (users, Qnil))
1039 /* At least current user is always known. */
1040 users = Fcons (Vuser_real_login_name, Qnil);
1041 return users;
1042}
1043
1044DEFUN ("system-groups", Fsystem_groups, Ssystem_groups, 0, 0, 0,
1045 doc: /* Return a list of user group names currently registered in the system.
1046The value may be nil if not supported on this platform. */)
1047 (void)
1048{
1049 Lisp_Object groups = Qnil;
aba027e8 1050#if defined HAVE_GETGRENT && defined HAVE_ENDGRENT
316411f0 1051 struct group *gr;
316411f0
DA
1052
1053 while ((gr = getgrent ()))
1054 groups = Fcons (DECODE_SYSTEM (build_string (gr->gr_name)), groups);
1055
1056 endgrent ();
1057#endif
1058 return groups;
1059}
1060
dfcf069d 1061void
971de7fb 1062syms_of_dired (void)
14d55bce 1063{
cd3520a4
JB
1064 DEFSYM (Qdirectory_files, "directory-files");
1065 DEFSYM (Qdirectory_files_and_attributes, "directory-files-and-attributes");
1066 DEFSYM (Qfile_name_completion, "file-name-completion");
1067 DEFSYM (Qfile_name_all_completions, "file-name-all-completions");
1068 DEFSYM (Qfile_attributes, "file-attributes");
1069 DEFSYM (Qfile_attributes_lessp, "file-attributes-lessp");
1070 DEFSYM (Qdefault_directory, "default-directory");
a2d3836c 1071
14d55bce 1072 defsubr (&Sdirectory_files);
4424b255 1073 defsubr (&Sdirectory_files_and_attributes);
14d55bce 1074 defsubr (&Sfile_name_completion);
14d55bce
RS
1075 defsubr (&Sfile_name_all_completions);
1076 defsubr (&Sfile_attributes);
4424b255 1077 defsubr (&Sfile_attributes_lessp);
316411f0
DA
1078 defsubr (&Ssystem_users);
1079 defsubr (&Ssystem_groups);
14d55bce 1080
29208e82 1081 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
407a52c4
LT
1082 doc: /* Completion ignores file names ending in any string in this list.
1083It does not ignore them if all possible completions end in one of
1084these strings or when displaying a list of completions.
1085It ignores directory names if they match any string in this list which
1086ends in a slash. */);
14d55bce
RS
1087 Vcompletion_ignored_extensions = Qnil;
1088}