Merge from origin/emacs-24
[emacs.git] / src / dired.c
blobe31fdf87ac29d81a38991366ef32647be41dccd9
1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985-1986, 1993-1994, 1999-2015 Free Software
3 Foundation, Inc.
5 This file is part of GNU Emacs.
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.
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.
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/>. */
21 #include <config.h>
23 #include <stdio.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
27 #ifdef HAVE_PWD_H
28 #include <pwd.h>
29 #endif
30 #include <grp.h>
32 #include <errno.h>
33 #include <fcntl.h>
34 #include <unistd.h>
36 #include <dirent.h>
37 #include <filemode.h>
38 #include <stat-time.h>
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"
50 #ifdef MSDOS
51 #include "msdos.h" /* for fstatat */
52 #endif
54 static ptrdiff_t scmp (const char *, const char *, ptrdiff_t);
55 static Lisp_Object file_attributes (int, char const *, Lisp_Object);
57 /* Return the number of bytes in DP's name. */
58 static ptrdiff_t
59 dirent_namelen (struct dirent *dp)
61 #ifdef _D_EXACT_NAMLEN
62 return _D_EXACT_NAMLEN (dp);
63 #else
64 return strlen (dp->d_name);
65 #endif
68 static DIR *
69 open_directory (char const *name, int *fdp)
71 DIR *d;
72 int fd, opendir_errno;
74 block_input ();
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)
87 opendir_errno = errno;
88 d = 0;
90 else
92 d = fdopendir (fd);
93 opendir_errno = errno;
94 if (! d)
95 emacs_close (fd);
97 #endif
99 unblock_input ();
101 *fdp = fd;
102 errno = opendir_errno;
103 return d;
106 #ifdef WINDOWSNT
107 void
108 directory_files_internal_w32_unwind (Lisp_Object arg)
110 Vw32_get_true_file_attributes = arg;
112 #endif
114 static void
115 directory_files_internal_unwind (void *dh)
117 DIR *d = dh;
118 block_input ();
119 closedir (d);
120 unblock_input ();
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. */
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)
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
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;
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);
158 if (!NILP (match))
160 CHECK_STRING (match);
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 */
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);
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! */
185 d = open_directory (SSDATA (dirfilename), &fd);
186 if (d == NULL)
187 report_file_error ("Opening directory", directory);
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);
194 #ifdef WINDOWSNT
195 if (attrs)
197 extern int is_slow_fs (const char *);
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))
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;
214 #endif
216 directory_nbytes = SBYTES (directory);
217 re_match_object = Qt;
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;
224 /* Loop reading blocks until EOF or error. */
225 for (;;)
227 ptrdiff_t len;
228 bool wanted = 0;
229 Lisp_Object name, finalname;
230 struct gcpro gcpro1, gcpro2;
232 errno = 0;
233 dp = readdir (d);
234 if (!dp)
236 if (errno == EAGAIN || errno == EINTR)
238 QUIT;
239 continue;
241 break;
244 len = dirent_namelen (dp);
245 name = finalname = make_unibyte_string (dp->d_name, len);
246 GCPRO2 (finalname, name);
248 /* Note: DECODE_FILE can GC; it should protect its argument,
249 though. */
250 name = DECODE_FILE (name);
251 len = SBYTES (name);
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;
258 if (NILP (match)
259 || re_search (bufp, SSDATA (name), len, 0, len, 0) >= 0)
260 wanted = 1;
262 immediate_quit = 0;
264 if (wanted)
266 if (!NILP (full))
268 Lisp_Object fullname;
269 ptrdiff_t nbytes = len + directory_nbytes + needsep;
270 ptrdiff_t nchars;
272 fullname = make_uninit_multibyte_string (nbytes, nbytes);
273 memcpy (SDATA (fullname), SDATA (directory),
274 directory_nbytes);
276 if (needsep)
277 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
279 memcpy (SDATA (fullname) + directory_nbytes + needsep,
280 SDATA (name), len);
282 nchars = multibyte_chars_in_text (SDATA (fullname), nbytes);
284 /* Some bug somewhere. */
285 if (nchars > nbytes)
286 emacs_abort ();
288 STRING_SET_CHARS (fullname, nchars);
289 if (nchars == nbytes)
290 STRING_SET_UNIBYTE (fullname);
292 finalname = fullname;
294 else
295 finalname = name;
297 if (attrs)
299 Lisp_Object fileattrs
300 = file_attributes (fd, dp->d_name, id_format);
301 list = Fcons (Fcons (finalname, fileattrs), list);
303 else
304 list = Fcons (finalname, list);
307 UNGCPRO;
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
318 /* Discard the unwind protect. */
319 specpdl_ptr = specpdl + count;
321 if (NILP (nosort))
322 list = Fsort (Fnreverse (list),
323 attrs ? Qfile_attributes_lessp : Qstring_lessp);
325 (void) directory_volatile;
326 RETURN_UNGCPRO (list);
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)
341 Lisp_Object handler;
342 directory = Fexpand_file_name (directory, Qnil);
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);
351 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
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)
369 Lisp_Object handler;
370 directory = Fexpand_file_name (directory, Qnil);
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);
379 return directory_files_internal (directory, full, match, nosort, 1, id_format);
383 static Lisp_Object file_name_completion (Lisp_Object, Lisp_Object, bool,
384 Lisp_Object);
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.
394 If PREDICATE is non-nil, call PREDICATE with each possible
395 completion (in absolute form) and ignore it if PREDICATE returns nil.
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)
401 Lisp_Object handler;
402 directory = Fexpand_file_name (directory, Qnil);
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);
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);
416 return file_name_completion (file, directory, 0, predicate);
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)
425 Lisp_Object handler;
426 directory = Fexpand_file_name (directory, Qnil);
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);
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);
440 return file_name_completion (file, directory, 1, Qnil);
443 static int file_name_completion_stat (int, struct dirent *, struct stat *);
445 static Lisp_Object
446 file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag,
447 Lisp_Object predicate)
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;
468 elt = Qnil;
470 CHECK_STRING (file);
472 bestmatch = Qnil;
473 encoded_file = encoded_dir = Qnil;
474 GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
475 specbind (Qdefault_directory, dirname);
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);
485 encoded_dir = ENCODE_FILE (Fdirectory_file_name (dirname));
487 d = open_directory (SSDATA (encoded_dir), &fd);
488 if (!d)
489 report_file_error ("Opening directory", dirname);
491 record_unwind_protect_ptr (directory_files_internal_unwind, d);
493 /* Loop reading blocks */
494 /* (att3b compiler bug requires do a null comparison this way) */
495 while (1)
497 struct dirent *dp;
498 ptrdiff_t len;
499 bool canexclude = 0;
501 errno = 0;
502 dp = readdir (d);
503 if (!dp)
505 if (errno == EAGAIN || errno == EINTR)
507 QUIT;
508 continue;
510 break;
513 len = dirent_namelen (dp);
515 QUIT;
516 if (len < SCHARS (encoded_file)
517 || (scmp (dp->d_name, SSDATA (encoded_file),
518 SCHARS (encoded_file))
519 >= 0))
520 continue;
522 if (file_name_completion_stat (fd, dp, &st) < 0)
523 continue;
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)
532 ptrdiff_t skip;
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
547 if (directoryp)
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))
562 ptrdiff_t elt_len;
563 char *p1;
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;
581 if (scmp (dp->d_name + skip, p1, elt_len) >= 0)
582 continue;
583 break;
586 else
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))
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;
603 if (scmp (dp->d_name + skip, SSDATA (elt), SCHARS (elt))
604 >= 0)
605 continue;
606 break;
610 /* If an ignored-extensions match was found,
611 don't process this name as a completion. */
612 if (CONSP (tem))
613 canexclude = 1;
615 if (!includeall && canexclude)
616 /* We're not including all files and this file can be excluded. */
617 continue;
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;
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);
635 Lisp_Object regexps, table = (completion_ignore_case
636 ? Vascii_canon_table : Qnil);
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;
644 if (CONSP (regexps))
645 continue;
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);
653 /* Test the predicate, if any. */
654 if (!NILP (predicate))
656 Lisp_Object val;
657 struct gcpro gcpro1;
659 GCPRO1 (name);
660 val = call1 (predicate, name);
661 UNGCPRO;
663 if (NILP (val))
664 continue;
667 /* Suitably record this match. */
669 matchcount += matchcount <= 1;
671 if (all_flag)
672 bestmatch = Fcons (name, bestmatch);
673 else if (NILP (bestmatch))
675 bestmatch = name;
676 bestmatchsize = SCHARS (name);
678 else
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;
691 if (completion_ignore_case)
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))
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))
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;
727 bestmatchsize = matchsize;
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;
745 UNGCPRO;
746 /* This closes the directory. */
747 bestmatch = unbind_to (count, bestmatch);
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;
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. */
765 static ptrdiff_t
766 scmp (const char *s1, const char *s2, ptrdiff_t len)
768 register ptrdiff_t l = len;
770 if (completion_ignore_case)
772 while (l
773 && (downcase ((unsigned char) *s1++)
774 == downcase ((unsigned char) *s2++)))
775 l--;
777 else
779 while (l && *s1++ == *s2++)
780 l--;
782 if (l == 0)
783 return -1;
784 else
785 return len - l;
788 static int
789 file_name_completion_stat (int fd, struct dirent *dp, struct stat *st_addr)
791 int value;
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. */
799 unsigned short save_djstat_flags = _djstat_flags;
801 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
802 #endif /* MSDOS */
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;
816 static char *
817 stat_uname (struct stat *st)
819 #ifdef WINDOWSNT
820 return st->st_uname;
821 #else
822 struct passwd *pw = getpwuid (st->st_uid);
824 if (pw)
825 return pw->pw_name;
826 else
827 return NULL;
828 #endif
831 static char *
832 stat_gname (struct stat *st)
834 #ifdef WINDOWSNT
835 return st->st_gname;
836 #else
837 struct group *gr = getgrgid (st->st_gid);
839 if (gr)
840 return gr->gr_name;
841 else
842 return NULL;
843 #endif
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.
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.
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.
880 On most filesystems, the combination of the inode and the device
881 number uniquely identifies the file.
883 On MS-Windows, performance depends on `w32-get-true-file-attributes',
884 which see.
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)
890 Lisp_Object encoded;
891 Lisp_Object handler;
893 filename = internal_condition_case_2 (Fexpand_file_name, filename, Qnil,
894 Qt, Fidentity);
895 if (!STRINGP (filename))
896 return Qnil;
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);
910 encoded = ENCODE_FILE (filename);
911 return file_attributes (AT_FDCWD, SSDATA (encoded), id_format);
914 static Lisp_Object
915 file_attributes (int fd, char const *name, Lisp_Object id_format)
917 struct stat s;
918 int lstat_result;
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 "];
924 char *uname = NULL, *gname = NULL;
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
934 lstat_result = fstatat (fd, name, &s, AT_SYMLINK_NOFOLLOW);
936 #ifdef WINDOWSNT
937 w32_stat_get_owner_group = 0;
938 #endif
940 if (lstat_result < 0)
941 return Qnil;
943 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
945 block_input ();
946 uname = stat_uname (&s);
947 gname = stat_gname (&s);
948 unblock_input ();
951 filemodestring (&s, modes);
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)),
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),
975 make_string (modes, 10),
977 INTEGER_TO_CONS (s.st_ino),
978 INTEGER_TO_CONS (s.st_dev));
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)
986 return Fstring_lessp (Fcar (f1), Fcar (f2));
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)
996 Lisp_Object users = Qnil;
997 #if defined HAVE_GETPWENT && defined HAVE_ENDPWENT
998 struct passwd *pw;
1000 while ((pw = getpwent ()))
1001 users = Fcons (DECODE_SYSTEM (build_string (pw->pw_name)), users);
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;
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)
1016 Lisp_Object groups = Qnil;
1017 #if defined HAVE_GETGRENT && defined HAVE_ENDGRENT
1018 struct group *gr;
1020 while ((gr = getgrent ()))
1021 groups = Fcons (DECODE_SYSTEM (build_string (gr->gr_name)), groups);
1023 endgrent ();
1024 #endif
1025 return groups;
1028 void
1029 syms_of_dired (void)
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");
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);
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;