1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985-1986, 1993-1994, 1999-2015 Free Software
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/>. */
24 #include <sys/types.h>
38 #include <stat-time.h>
42 #include "character.h"
48 #include "blockinput.h"
51 #include "msdos.h" /* for fstatat */
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. */
59 dirent_namelen (struct dirent
*dp
)
61 #ifdef _D_EXACT_NAMLEN
62 return _D_EXACT_NAMLEN (dp
);
64 return strlen (dp
->d_name
);
69 open_directory (char const *name
, int *fdp
)
72 int fd
, opendir_errno
;
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. */
82 opendir_errno
= errno
;
84 fd
= emacs_open (name
, O_RDONLY
| O_DIRECTORY
, 0);
87 opendir_errno
= errno
;
93 opendir_errno
= errno
;
102 errno
= opendir_errno
;
108 directory_files_internal_w32_unwind (Lisp_Object arg
)
110 Vw32_get_true_file_attributes
= arg
;
115 directory_files_internal_unwind (void *dh
)
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. */
129 directory_files_internal (Lisp_Object directory
, Lisp_Object full
,
130 Lisp_Object match
, Lisp_Object nosort
, bool attrs
,
131 Lisp_Object id_format
)
135 ptrdiff_t directory_nbytes
;
136 Lisp_Object list
, dirfilename
, encoded_directory
;
137 struct re_pattern_buffer
*bufp
= NULL
;
139 ptrdiff_t count
= SPECPDL_INDEX ();
140 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
143 Lisp_Object w32_save
= Qnil
;
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
);
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. */
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
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
);
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
);
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
;
211 Vw32_get_true_file_attributes
= Qt
;
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)))
224 /* Loop reading blocks until EOF or error. */
229 Lisp_Object name
, finalname
;
230 struct gcpro gcpro1
, gcpro2
;
236 if (errno
== EAGAIN
|| errno
== EINTR
)
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,
250 name
= DECODE_FILE (name
);
253 /* Now that we have unwind_protect in place, we might as well
254 allow matching to be interrupted. */
259 || re_search (bufp
, SSDATA (name
), len
, 0, len
, 0) >= 0)
268 Lisp_Object fullname
;
269 ptrdiff_t nbytes
= len
+ directory_nbytes
+ needsep
;
272 fullname
= make_uninit_multibyte_string (nbytes
, nbytes
);
273 memcpy (SDATA (fullname
), SDATA (directory
),
277 SSET (fullname
, directory_nbytes
, DIRECTORY_SEP
);
279 memcpy (SDATA (fullname
) + directory_nbytes
+ needsep
,
282 nchars
= multibyte_chars_in_text (SDATA (fullname
), nbytes
);
284 /* Some bug somewhere. */
288 STRING_SET_CHARS (fullname
, nchars
);
289 if (nchars
== nbytes
)
290 STRING_SET_UNIBYTE (fullname
);
292 finalname
= fullname
;
299 Lisp_Object fileattrs
300 = file_attributes (fd
, dp
->d_name
, id_format
);
301 list
= Fcons (Fcons (finalname
, fileattrs
), list
);
304 list
= Fcons (finalname
, list
);
315 Vw32_get_true_file_attributes
= w32_save
;
318 /* Discard the unwind protect. */
319 specpdl_ptr
= specpdl
+ count
;
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
)
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
);
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',
367 (Lisp_Object directory
, Lisp_Object full
, Lisp_Object match
, Lisp_Object nosort
, Lisp_Object id_format
)
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
);
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,
386 DEFUN ("file-name-completion", Ffile_name_completion
, Sfile_name_completion
,
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
)
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
);
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
);
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
)
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
);
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
);
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
*);
446 file_name_completion (Lisp_Object file
, Lisp_Object dirname
, bool all_flag
,
447 Lisp_Object predicate
)
451 ptrdiff_t bestmatchsize
= 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
;
461 /* If not INCLUDEALL, exclude files in completion-ignored-extensions as
462 well as "." and "..". Until shown otherwise, assume we can't exclude
465 ptrdiff_t count
= SPECPDL_INDEX ();
466 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
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
);
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) */
505 if (errno
== EAGAIN
|| errno
== EINTR
)
513 len
= dirent_namelen (dp
);
516 if (len
< SCHARS (encoded_file
)
517 || (scmp (dp
->d_name
, SSDATA (encoded_file
),
518 SCHARS (encoded_file
))
522 if (file_name_completion_stat (fd
, dp
, &st
) < 0)
525 directoryp
= S_ISDIR (st
.st_mode
) != 0;
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. */
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. */
541 && !includeall
/* This match may allow includeall to 0. */
542 && len
>= bestmatchsize
543 && 0 > scmp (dp
->d_name
, SSDATA (bestmatch
), bestmatchsize
))
549 #ifndef TRIVIAL_DIRECTORY_ENTRY
550 #define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
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
))
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
))
568 /* Need to encode ELT, since scmp compares unibyte
570 elt
= ENCODE_FILE (elt
);
571 elt_len
= SCHARS (elt
) - 1; /* -1 for trailing / */
575 if (p1
[elt_len
] != '/')
577 skip
= len
- elt_len
;
581 if (scmp (dp
->d_name
+ skip
, p1
, elt_len
) >= 0)
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
))
596 if (!STRINGP (elt
)) continue;
597 /* Need to encode ELT, since scmp compares unibyte
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
))
610 /* If an ignored-extensions match was found,
611 don't process this name as a completion. */
615 if (!includeall
&& canexclude
)
616 /* We're not including all files and this file can be excluded. */
619 if (includeall
&& !canexclude
)
620 { /* If we have one non-excludable file, we want to exclude the
623 /* Throw away any previous excludable match found. */
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)
648 /* This is a possible completion */
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
))
660 val
= call1 (predicate
, name
);
667 /* Suitably record this match. */
669 matchcount
+= matchcount
<= 1;
672 bestmatch
= Fcons (name
, bestmatch
);
673 else if (NILP (bestmatch
))
676 bestmatchsize
= SCHARS (name
);
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
));
684 = Fcompare_strings (bestmatch
, zero
,
685 make_number (compare
),
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
705 /* If there is more than one exact match aside from
706 case, and one of them is exact including case,
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
)),
719 && (cmp
= Fcompare_strings (bestmatch
, zero
,
720 make_number (SCHARS (file
)),
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. */
746 /* This closes the directory. */
747 bestmatch
= unbind_to (count
, bestmatch
);
749 if (all_flag
|| NILP (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
)))
755 bestmatch
= Fsubstring (bestmatch
, make_number (0),
756 make_number (bestmatchsize
));
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. */
766 scmp (const char *s1
, const char *s2
, ptrdiff_t len
)
768 register ptrdiff_t l
= len
;
770 if (completion_ignore_case
)
773 && (downcase ((unsigned char) *s1
++)
774 == downcase ((unsigned char) *s2
++)))
779 while (l
&& *s1
++ == *s2
++)
789 file_name_completion_stat (int fd
, struct dirent
*dp
, struct stat
*st_addr
)
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
;
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);
811 _djstat_flags
= save_djstat_flags
;
817 stat_uname (struct stat
*st
)
822 struct passwd
*pw
= getpwuid (st
->st_uid
);
832 stat_gname (struct stat
*st
)
837 struct group
*gr
= getgrgid (st
->st_gid
);
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.
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',
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
)
893 filename
= internal_condition_case_2 (Fexpand_file_name
, filename
, Qnil
,
895 if (!STRINGP (filename
))
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
);
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
);
907 return call3 (handler
, Qfile_attributes
, filename
, id_format
);
910 encoded
= ENCODE_FILE (filename
);
911 return file_attributes (AT_FDCWD
, SSDATA (encoded
), id_format
);
915 file_attributes (int fd
, char const *name
, Lisp_Object id_format
)
917 Lisp_Object values
[12];
921 /* An array to hold the mode string generated by filemodestring,
922 including its terminating space and null byte. */
923 char modes
[sizeof "-rwxr-xr-x "];
925 char *uname
= NULL
, *gname
= NULL
;
928 /* We usually don't request accurate owner and group info, because
929 it can be very expensive on Windows to get that, and most callers
930 of 'lstat' don't need that. But here we do want that information
932 w32_stat_get_owner_group
= 1;
935 lstat_result
= fstatat (fd
, name
, &s
, AT_SYMLINK_NOFOLLOW
);
938 w32_stat_get_owner_group
= 0;
941 if (lstat_result
< 0)
944 values
[0] = (S_ISLNK (s
.st_mode
) ? emacs_readlinkat (fd
, name
)
945 : S_ISDIR (s
.st_mode
) ? Qt
: Qnil
);
946 values
[1] = make_number (s
.st_nlink
);
948 if (!(NILP (id_format
) || EQ (id_format
, Qinteger
)))
951 uname
= stat_uname (&s
);
952 gname
= stat_gname (&s
);
956 values
[2] = DECODE_SYSTEM (build_unibyte_string (uname
));
958 values
[2] = make_fixnum_or_float (s
.st_uid
);
960 values
[3] = DECODE_SYSTEM (build_unibyte_string (gname
));
962 values
[3] = make_fixnum_or_float (s
.st_gid
);
964 values
[4] = make_lisp_time (get_stat_atime (&s
));
965 values
[5] = make_lisp_time (get_stat_mtime (&s
));
966 values
[6] = make_lisp_time (get_stat_ctime (&s
));
968 /* If the file size is a 4-byte type, assume that files of sizes in
969 the 2-4 GiB range wrap around to negative values, as this is a
970 common bug on older 32-bit platforms. */
971 if (sizeof (s
.st_size
) == 4)
972 values
[7] = make_fixnum_or_float (s
.st_size
& 0xffffffffu
);
974 values
[7] = make_fixnum_or_float (s
.st_size
);
976 filemodestring (&s
, modes
);
977 values
[8] = make_string (modes
, 10);
979 values
[10] = INTEGER_TO_CONS (s
.st_ino
);
980 values
[11] = INTEGER_TO_CONS (s
.st_dev
);
982 return Flist (ARRAYELTS (values
), values
);
985 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp
, Sfile_attributes_lessp
, 2, 2, 0,
986 doc
: /* Return t if first arg file attributes list is less than second.
987 Comparison is in lexicographic order and case is significant. */)
988 (Lisp_Object f1
, Lisp_Object f2
)
990 return Fstring_lessp (Fcar (f1
), Fcar (f2
));
994 DEFUN ("system-users", Fsystem_users
, Ssystem_users
, 0, 0, 0,
995 doc
: /* Return a list of user names currently registered in the system.
996 If we don't know how to determine that on this platform, just
997 return a list with one element, taken from `user-real-login-name'. */)
1000 Lisp_Object users
= Qnil
;
1001 #if defined HAVE_GETPWENT && defined HAVE_ENDPWENT
1004 while ((pw
= getpwent ()))
1005 users
= Fcons (DECODE_SYSTEM (build_string (pw
->pw_name
)), users
);
1009 if (EQ (users
, Qnil
))
1010 /* At least current user is always known. */
1011 users
= list1 (Vuser_real_login_name
);
1015 DEFUN ("system-groups", Fsystem_groups
, Ssystem_groups
, 0, 0, 0,
1016 doc
: /* Return a list of user group names currently registered in the system.
1017 The value may be nil if not supported on this platform. */)
1020 Lisp_Object groups
= Qnil
;
1021 #if defined HAVE_GETGRENT && defined HAVE_ENDGRENT
1024 while ((gr
= getgrent ()))
1025 groups
= Fcons (DECODE_SYSTEM (build_string (gr
->gr_name
)), groups
);
1033 syms_of_dired (void)
1035 DEFSYM (Qdirectory_files
, "directory-files");
1036 DEFSYM (Qdirectory_files_and_attributes
, "directory-files-and-attributes");
1037 DEFSYM (Qfile_name_completion
, "file-name-completion");
1038 DEFSYM (Qfile_name_all_completions
, "file-name-all-completions");
1039 DEFSYM (Qfile_attributes
, "file-attributes");
1040 DEFSYM (Qfile_attributes_lessp
, "file-attributes-lessp");
1041 DEFSYM (Qdefault_directory
, "default-directory");
1043 defsubr (&Sdirectory_files
);
1044 defsubr (&Sdirectory_files_and_attributes
);
1045 defsubr (&Sfile_name_completion
);
1046 defsubr (&Sfile_name_all_completions
);
1047 defsubr (&Sfile_attributes
);
1048 defsubr (&Sfile_attributes_lessp
);
1049 defsubr (&Ssystem_users
);
1050 defsubr (&Ssystem_groups
);
1052 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions
,
1053 doc
: /* Completion ignores file names ending in any string in this list.
1054 It does not ignore them if all possible completions end in one of
1055 these strings or when displaying a list of completions.
1056 It ignores directory names if they match any string in this list which
1057 ends in a slash. */);
1058 Vcompletion_ignored_extensions
= Qnil
;