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