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