1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985-1986, 1993-1994, 1999-2011 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
23 #include <sys/types.h>
35 /* The d_nameln member of a struct dirent includes the '\0' character
36 on some systems, but not on others. What's worse, you can't tell
37 at compile-time which one it will be, since it really depends on
38 the sort of system providing the filesystem you're reading from,
39 not the system you are running on. Paul Eggert
40 <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
41 SunOS 4.1.2 host, reading a directory that is remote-mounted from a
42 Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
44 Since applying strlen to the name always works, we'll just do that. */
45 #define NAMLEN(p) strlen (p->d_name)
50 #define DIRENTRY struct dirent
52 #else /* not HAVE_DIRENT_H */
57 #define DIRENTRY struct direct
59 extern DIR *opendir (char *);
60 extern struct direct
*readdir (DIR *);
62 #endif /* HAVE_DIRENT_H */
67 #define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
69 #define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
76 #include "character.h"
80 #include "blockinput.h"
82 /* Returns a search buffer, with a fastmap allocated and ready to go. */
83 extern struct re_pattern_buffer
*compile_pattern (Lisp_Object
,
84 struct re_registers
*,
85 Lisp_Object
, int, int);
87 Lisp_Object Qdirectory_files
;
88 Lisp_Object Qdirectory_files_and_attributes
;
89 Lisp_Object Qfile_name_completion
;
90 Lisp_Object Qfile_name_all_completions
;
91 Lisp_Object Qfile_attributes
;
92 Lisp_Object Qfile_attributes_lessp
;
94 static int scmp (const char *, const char *, int);
98 directory_files_internal_w32_unwind (Lisp_Object arg
)
100 Vw32_get_true_file_attributes
= arg
;
106 directory_files_internal_unwind (Lisp_Object dh
)
108 DIR *d
= (DIR *) XSAVE_VALUE (dh
)->pointer
;
115 /* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
116 When ATTRS is zero, return a list of directory filenames; when
117 non-zero, return a list of directory filenames and their attributes.
118 In the latter case, ID_FORMAT is passed to Ffile_attributes. */
121 directory_files_internal (Lisp_Object directory
, Lisp_Object full
, Lisp_Object match
, Lisp_Object nosort
, int attrs
, Lisp_Object id_format
)
124 int directory_nbytes
;
125 Lisp_Object list
, dirfilename
, encoded_directory
;
126 struct re_pattern_buffer
*bufp
= NULL
;
128 int count
= SPECPDL_INDEX ();
129 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
132 Lisp_Object w32_save
= Qnil
;
135 /* Because of file name handlers, these functions might call
136 Ffuncall, and cause a GC. */
137 list
= encoded_directory
= dirfilename
= Qnil
;
138 GCPRO5 (match
, directory
, list
, dirfilename
, encoded_directory
);
139 dirfilename
= Fdirectory_file_name (directory
);
143 CHECK_STRING (match
);
145 /* MATCH might be a flawed regular expression. Rather than
146 catching and signaling our own errors, we just call
147 compile_pattern to do the work for us. */
148 /* Pass 1 for the MULTIBYTE arg
149 because we do make multibyte strings if the contents warrant. */
151 /* Windows users want case-insensitive wildcards. */
152 bufp
= compile_pattern (match
, 0,
153 BVAR (&buffer_defaults
, case_canon_table
), 0, 1);
154 # else /* !WINDOWSNT */
155 bufp
= compile_pattern (match
, 0, Qnil
, 0, 1);
156 # endif /* !WINDOWSNT */
159 /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
160 run_pre_post_conversion_on_str which calls Lisp directly and
162 if (STRING_MULTIBYTE (dirfilename
))
163 dirfilename
= ENCODE_FILE (dirfilename
);
164 encoded_directory
= (STRING_MULTIBYTE (directory
)
165 ? ENCODE_FILE (directory
) : directory
);
167 /* Now *bufp is the compiled form of MATCH; don't call anything
168 which might compile a new regexp until we're done with the loop! */
171 d
= opendir (SSDATA (dirfilename
));
174 report_file_error ("Opening directory", Fcons (directory
, Qnil
));
176 /* Unfortunately, we can now invoke expand-file-name and
177 file-attributes on filenames, both of which can throw, so we must
178 do a proper unwind-protect. */
179 record_unwind_protect (directory_files_internal_unwind
,
180 make_save_value (d
, 0));
185 extern int is_slow_fs (const char *);
187 /* Do this only once to avoid doing it (in w32.c:stat) for each
188 file in the directory, when we call Ffile_attributes below. */
189 record_unwind_protect (directory_files_internal_w32_unwind
,
190 Vw32_get_true_file_attributes
);
191 w32_save
= Vw32_get_true_file_attributes
;
192 if (EQ (Vw32_get_true_file_attributes
, Qlocal
))
194 /* w32.c:stat will notice these bindings and avoid calling
195 GetDriveType for each file. */
196 if (is_slow_fs (SDATA (dirfilename
)))
197 Vw32_get_true_file_attributes
= Qnil
;
199 Vw32_get_true_file_attributes
= Qt
;
204 directory_nbytes
= SBYTES (directory
);
205 re_match_object
= Qt
;
207 /* Decide whether we need to add a directory separator. */
208 if (directory_nbytes
== 0
209 || !IS_ANY_SEP (SREF (directory
, directory_nbytes
- 1)))
212 /* Loop reading blocks until EOF or error. */
231 if (DIRENTRY_NONEMPTY (dp
))
235 Lisp_Object name
, finalname
;
236 struct gcpro gcpro1
, gcpro2
;
239 name
= finalname
= make_unibyte_string (dp
->d_name
, len
);
240 GCPRO2 (finalname
, name
);
242 /* Note: DECODE_FILE can GC; it should protect its argument,
244 name
= DECODE_FILE (name
);
247 /* Now that we have unwind_protect in place, we might as well
248 allow matching to be interrupted. */
253 || (0 <= re_search (bufp
, SSDATA (name
), len
, 0, len
, 0)))
262 Lisp_Object fullname
;
263 int nbytes
= len
+ directory_nbytes
+ needsep
;
266 fullname
= make_uninit_multibyte_string (nbytes
, nbytes
);
267 memcpy (SDATA (fullname
), SDATA (directory
),
271 SSET (fullname
, directory_nbytes
, DIRECTORY_SEP
);
273 memcpy (SDATA (fullname
) + directory_nbytes
+ needsep
,
276 nchars
= chars_in_text (SDATA (fullname
), nbytes
);
278 /* Some bug somewhere. */
282 STRING_SET_CHARS (fullname
, nchars
);
283 if (nchars
== nbytes
)
284 STRING_SET_UNIBYTE (fullname
);
286 finalname
= fullname
;
293 /* Construct an expanded filename for the directory entry.
294 Use the decoded names for input to Ffile_attributes. */
295 Lisp_Object decoded_fullname
, fileattrs
;
296 struct gcpro gcpro1
, gcpro2
;
298 decoded_fullname
= fileattrs
= Qnil
;
299 GCPRO2 (decoded_fullname
, fileattrs
);
301 /* Both Fexpand_file_name and Ffile_attributes can GC. */
302 decoded_fullname
= Fexpand_file_name (name
, directory
);
303 fileattrs
= Ffile_attributes (decoded_fullname
, id_format
);
305 list
= Fcons (Fcons (finalname
, fileattrs
), list
);
309 list
= Fcons (finalname
, list
);
321 Vw32_get_true_file_attributes
= w32_save
;
324 /* Discard the unwind protect. */
325 specpdl_ptr
= specpdl
+ count
;
328 list
= Fsort (Fnreverse (list
),
329 attrs
? Qfile_attributes_lessp
: Qstring_lessp
);
331 RETURN_UNGCPRO (list
);
335 DEFUN ("directory-files", Fdirectory_files
, Sdirectory_files
, 1, 4, 0,
336 doc
: /* Return a list of names of files in DIRECTORY.
337 There are three optional arguments:
338 If FULL is non-nil, return absolute file names. Otherwise return names
339 that are relative to the specified directory.
340 If MATCH is non-nil, mention only file names that match the regexp MATCH.
341 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
342 Otherwise, the list returned is sorted with `string-lessp'.
343 NOSORT is useful if you plan to sort the result yourself. */)
344 (Lisp_Object directory
, Lisp_Object full
, Lisp_Object match
, Lisp_Object nosort
)
347 directory
= Fexpand_file_name (directory
, Qnil
);
349 /* If the file name has special constructs in it,
350 call the corresponding file handler. */
351 handler
= Ffind_file_name_handler (directory
, Qdirectory_files
);
353 return call5 (handler
, Qdirectory_files
, directory
,
354 full
, match
, nosort
);
356 return directory_files_internal (directory
, full
, match
, nosort
, 0, Qnil
);
359 DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes
,
360 Sdirectory_files_and_attributes
, 1, 5, 0,
361 doc
: /* Return a list of names of files and their attributes in DIRECTORY.
362 There are four optional arguments:
363 If FULL is non-nil, return absolute file names. Otherwise return names
364 that are relative to the specified directory.
365 If MATCH is non-nil, mention only file names that match the regexp MATCH.
366 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
367 NOSORT is useful if you plan to sort the result yourself.
368 ID-FORMAT specifies the preferred format of attributes uid and gid, see
369 `file-attributes' for further documentation.
370 On MS-Windows, performance depends on `w32-get-true-file-attributes',
372 (Lisp_Object directory
, Lisp_Object full
, Lisp_Object match
, Lisp_Object nosort
, Lisp_Object id_format
)
375 directory
= Fexpand_file_name (directory
, Qnil
);
377 /* If the file name has special constructs in it,
378 call the corresponding file handler. */
379 handler
= Ffind_file_name_handler (directory
, Qdirectory_files_and_attributes
);
381 return call6 (handler
, Qdirectory_files_and_attributes
,
382 directory
, full
, match
, nosort
, id_format
);
384 return directory_files_internal (directory
, full
, match
, nosort
, 1, id_format
);
388 Lisp_Object
file_name_completion (Lisp_Object file
, Lisp_Object dirname
, int all_flag
, int ver_flag
, Lisp_Object predicate
);
390 DEFUN ("file-name-completion", Ffile_name_completion
, Sfile_name_completion
,
392 doc
: /* Complete file name FILE in directory DIRECTORY.
393 Returns the longest string
394 common to all file names in DIRECTORY that start with FILE.
395 If there is only one and FILE matches it exactly, returns t.
396 Returns nil if DIRECTORY contains no name starting with FILE.
398 If PREDICATE is non-nil, call PREDICATE with each possible
399 completion (in absolute form) and ignore it if PREDICATE returns nil.
401 This function ignores some of the possible completions as
402 determined by the variable `completion-ignored-extensions', which see. */)
403 (Lisp_Object file
, Lisp_Object directory
, Lisp_Object predicate
)
407 /* If the directory name has special constructs in it,
408 call the corresponding file handler. */
409 handler
= Ffind_file_name_handler (directory
, Qfile_name_completion
);
411 return call4 (handler
, Qfile_name_completion
, file
, directory
, predicate
);
413 /* If the file name has special constructs in it,
414 call the corresponding file handler. */
415 handler
= Ffind_file_name_handler (file
, Qfile_name_completion
);
417 return call4 (handler
, Qfile_name_completion
, file
, directory
, predicate
);
419 return file_name_completion (file
, directory
, 0, 0, predicate
);
422 DEFUN ("file-name-all-completions", Ffile_name_all_completions
,
423 Sfile_name_all_completions
, 2, 2, 0,
424 doc
: /* Return a list of all completions of file name FILE in directory DIRECTORY.
425 These are all file names in directory DIRECTORY which begin with FILE. */)
426 (Lisp_Object file
, Lisp_Object directory
)
430 /* If the directory name has special constructs in it,
431 call the corresponding file handler. */
432 handler
= Ffind_file_name_handler (directory
, Qfile_name_all_completions
);
434 return call3 (handler
, Qfile_name_all_completions
, file
, directory
);
436 /* If the file name has special constructs in it,
437 call the corresponding file handler. */
438 handler
= Ffind_file_name_handler (file
, Qfile_name_all_completions
);
440 return call3 (handler
, Qfile_name_all_completions
, file
, directory
);
442 return file_name_completion (file
, directory
, 1, 0, Qnil
);
445 static int file_name_completion_stat (Lisp_Object dirname
, DIRENTRY
*dp
, struct stat
*st_addr
);
446 Lisp_Object Qdefault_directory
;
449 file_name_completion (Lisp_Object file
, Lisp_Object dirname
, int all_flag
, int ver_flag
, Lisp_Object predicate
)
452 int bestmatchsize
= 0;
454 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
455 If ALL_FLAG is 0, BESTMATCH is either nil
456 or the best match so far, not decoded. */
457 Lisp_Object bestmatch
, tem
, elt
, name
;
458 Lisp_Object encoded_file
;
459 Lisp_Object encoded_dir
;
462 /* If includeall is zero, exclude files in completion-ignored-extensions as
463 well as "." and "..". Until shown otherwise, assume we can't exclude
466 int count
= SPECPDL_INDEX ();
467 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
473 #ifdef FILE_SYSTEM_CASE
474 file
= FILE_SYSTEM_CASE (file
);
477 encoded_file
= encoded_dir
= Qnil
;
478 GCPRO5 (file
, dirname
, bestmatch
, encoded_file
, encoded_dir
);
479 dirname
= Fexpand_file_name (dirname
, Qnil
);
480 specbind (Qdefault_directory
, dirname
);
482 /* Do completion on the encoded file name
483 because the other names in the directory are (we presume)
484 encoded likewise. We decode the completed string at the end. */
485 /* Actually, this is not quite true any more: we do most of the completion
486 work with decoded file names, but we still do some filtering based
487 on the encoded file name. */
488 encoded_file
= STRING_MULTIBYTE (file
) ? ENCODE_FILE (file
) : file
;
490 encoded_dir
= ENCODE_FILE (dirname
);
493 d
= opendir (SSDATA (Fdirectory_file_name (encoded_dir
)));
496 report_file_error ("Opening directory", Fcons (dirname
, Qnil
));
498 record_unwind_protect (directory_files_internal_unwind
,
499 make_save_value (d
, 0));
501 /* Loop reading blocks */
502 /* (att3b compiler bug requires do a null comparison this way) */
526 if (! DIRENTRY_NONEMPTY (dp
)
527 || len
< SCHARS (encoded_file
)
528 || 0 <= scmp (dp
->d_name
, SSDATA (encoded_file
),
529 SCHARS (encoded_file
)))
532 if (file_name_completion_stat (encoded_dir
, dp
, &st
) < 0)
535 directoryp
= S_ISDIR (st
.st_mode
);
537 /* If all_flag is set, always include all.
538 It would not actually be helpful to the user to ignore any possible
539 completions when making a list of them. */
544 #if 0 /* FIXME: The `scmp' call compares an encoded and a decoded string. */
545 /* If this entry matches the current bestmatch, the only
546 thing it can do is increase matchcount, so don't bother
547 investigating it any further. */
548 if (!completion_ignore_case
549 /* The return result depends on whether it's the sole match. */
551 && !includeall
/* This match may allow includeall to 0. */
552 && len
>= bestmatchsize
553 && 0 > scmp (dp
->d_name
, SSDATA (bestmatch
), bestmatchsize
))
559 #ifndef TRIVIAL_DIRECTORY_ENTRY
560 #define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
562 /* "." and ".." are never interesting as completions, and are
563 actually in the way in a directory with only one file. */
564 if (TRIVIAL_DIRECTORY_ENTRY (dp
->d_name
))
566 else if (len
> SCHARS (encoded_file
))
567 /* Ignore directories if they match an element of
568 completion-ignored-extensions which ends in a slash. */
569 for (tem
= Vcompletion_ignored_extensions
;
570 CONSP (tem
); tem
= XCDR (tem
))
578 /* Need to encode ELT, since scmp compares unibyte
580 elt
= ENCODE_FILE (elt
);
581 elt_len
= SCHARS (elt
) - 1; /* -1 for trailing / */
585 if (p1
[elt_len
] != '/')
587 skip
= len
- elt_len
;
591 if (0 <= scmp (dp
->d_name
+ skip
, p1
, elt_len
))
598 /* Compare extensions-to-be-ignored against end of this file name */
599 /* if name is not an exact match against specified string */
600 if (len
> SCHARS (encoded_file
))
601 /* and exit this for loop if a match is found */
602 for (tem
= Vcompletion_ignored_extensions
;
603 CONSP (tem
); tem
= XCDR (tem
))
606 if (!STRINGP (elt
)) continue;
607 /* Need to encode ELT, since scmp compares unibyte
609 elt
= ENCODE_FILE (elt
);
610 skip
= len
- SCHARS (elt
);
611 if (skip
< 0) continue;
613 if (0 <= scmp (dp
->d_name
+ skip
,
621 /* If an ignored-extensions match was found,
622 don't process this name as a completion. */
626 if (!includeall
&& canexclude
)
627 /* We're not including all files and this file can be excluded. */
630 if (includeall
&& !canexclude
)
631 { /* If we have one non-excludable file, we want to exclude the
634 /* Throw away any previous excludable match found. */
640 /* FIXME: If we move this `decode' earlier we can eliminate
641 the repeated ENCODE_FILE on Vcompletion_ignored_extensions. */
642 name
= make_unibyte_string (dp
->d_name
, len
);
643 name
= DECODE_FILE (name
);
648 XSETFASTINT (zero
, 0);
650 /* Ignore this element if it fails to match all the regexps. */
651 if (completion_ignore_case
)
653 for (regexps
= Vcompletion_regexp_list
; CONSP (regexps
);
654 regexps
= XCDR (regexps
))
655 if (fast_string_match_ignore_case (XCAR (regexps
), name
) < 0)
660 for (regexps
= Vcompletion_regexp_list
; CONSP (regexps
);
661 regexps
= XCDR (regexps
))
662 if (fast_string_match (XCAR (regexps
), name
) < 0)
670 /* This is a possible completion */
672 /* This completion is a directory; make it end with '/'. */
673 name
= Ffile_name_as_directory (name
);
675 /* Test the predicate, if any. */
676 if (!NILP (predicate
))
682 val
= call1 (predicate
, name
);
689 /* Suitably record this match. */
694 bestmatch
= Fcons (name
, bestmatch
);
695 else if (NILP (bestmatch
))
698 bestmatchsize
= SCHARS (name
);
702 Lisp_Object zero
= make_number (0);
703 /* FIXME: This is a copy of the code in Ftry_completion. */
704 int compare
= min (bestmatchsize
, SCHARS (name
));
706 = Fcompare_strings (bestmatch
, zero
,
707 make_number (compare
),
709 make_number (compare
),
710 completion_ignore_case
? Qt
: Qnil
);
712 = (EQ (tem
, Qt
) ? compare
713 : XINT (tem
) < 0 ? - XINT (tem
) - 1
716 if (completion_ignore_case
)
718 /* If this is an exact match except for case,
719 use it as the best match rather than one that is not
720 an exact match. This way, we get the case pattern
721 of the actual match. */
722 /* This tests that the current file is an exact match
723 but BESTMATCH is not (it is too long). */
724 if ((matchsize
== SCHARS (name
)
725 && matchsize
+ !!directoryp
< SCHARS (bestmatch
))
727 /* If there is no exact match ignoring case,
728 prefer a match that does not change the case
730 /* If there is more than one exact match aside from
731 case, and one of them is exact including case,
733 /* This == checks that, of current file and BESTMATCH,
734 either both or neither are exact. */
735 (((matchsize
== SCHARS (name
))
737 (matchsize
+ !!directoryp
== SCHARS (bestmatch
)))
738 && (tem
= Fcompare_strings (name
, zero
,
739 make_number (SCHARS (file
)),
744 && (tem
= Fcompare_strings (bestmatch
, zero
,
745 make_number (SCHARS (file
)),
752 bestmatchsize
= matchsize
;
754 /* If the best completion so far is reduced to the string
755 we're trying to complete, then we already know there's no
756 other completion, so there's no point looking any further. */
757 if (matchsize
<= SCHARS (file
)
758 && !includeall
/* A future match may allow includeall to 0. */
759 /* If completion-ignore-case is non-nil, don't
760 short-circuit because we want to find the best
761 possible match *including* case differences. */
762 && (!completion_ignore_case
|| matchsize
== 0)
763 /* The return value depends on whether it's the sole match. */
771 /* This closes the directory. */
772 bestmatch
= unbind_to (count
, bestmatch
);
774 if (all_flag
|| NILP (bestmatch
))
776 /* Return t if the supplied string is an exact match (counting case);
777 it does not require any change to be made. */
778 if (matchcount
== 1 && !NILP (Fequal (bestmatch
, file
)))
780 bestmatch
= Fsubstring (bestmatch
, make_number (0),
781 make_number (bestmatchsize
));
785 /* Compare exactly LEN chars of strings at S1 and S2,
786 ignoring case if appropriate.
787 Return -1 if strings match,
788 else number of chars that match at the beginning. */
791 scmp (const char *s1
, const char *s2
, int len
)
793 register int l
= len
;
795 if (completion_ignore_case
)
798 && (DOWNCASE ((unsigned char) *s1
++)
799 == DOWNCASE ((unsigned char) *s2
++)))
804 while (l
&& *s1
++ == *s2
++)
814 file_name_completion_stat (Lisp_Object dirname
, DIRENTRY
*dp
, struct stat
*st_addr
)
816 int len
= NAMLEN (dp
);
817 int pos
= SCHARS (dirname
);
819 char *fullname
= (char *) alloca (len
+ pos
+ 2);
822 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
823 but aren't required here. Avoid computing the following fields:
824 st_inode, st_size and st_nlink for directories, and the execute bits
825 in st_mode for non-directory files with non-standard extensions. */
827 unsigned short save_djstat_flags
= _djstat_flags
;
829 _djstat_flags
= _STAT_INODE
| _STAT_EXEC_MAGIC
| _STAT_DIRSIZE
;
832 memcpy (fullname
, SDATA (dirname
), pos
);
833 if (!IS_DIRECTORY_SEP (fullname
[pos
- 1]))
834 fullname
[pos
++] = DIRECTORY_SEP
;
836 memcpy (fullname
+ pos
, dp
->d_name
, len
);
837 fullname
[pos
+ len
] = 0;
839 /* We want to return success if a link points to a nonexistent file,
840 but we want to return the status for what the link points to,
841 in case it is a directory. */
842 value
= lstat (fullname
, st_addr
);
843 if (value
== 0 && S_ISLNK (st_addr
->st_mode
))
844 stat (fullname
, st_addr
);
846 _djstat_flags
= save_djstat_flags
;
852 make_time (time_t time
)
854 return Fcons (make_number (time
>> 16),
855 Fcons (make_number (time
& 0177777), Qnil
));
859 stat_uname (struct stat
*st
)
864 struct passwd
*pw
= (struct passwd
*) getpwuid (st
->st_uid
);
874 stat_gname (struct stat
*st
)
879 struct group
*gr
= (struct group
*) getgrgid (st
->st_gid
);
888 DEFUN ("file-attributes", Ffile_attributes
, Sfile_attributes
, 1, 2, 0,
889 doc
: /* Return a list of attributes of file FILENAME.
890 Value is nil if specified file cannot be opened.
892 ID-FORMAT specifies the preferred format of attributes uid and gid (see
893 below) - valid values are 'string and 'integer. The latter is the
894 default, but we plan to change that, so you should specify a non-nil value
895 for ID-FORMAT if you use the returned uid or gid.
897 Elements of the attribute list are:
898 0. t for directory, string (name linked to) for symbolic link, or nil.
899 1. Number of links to file.
900 2. File uid as a string or a number. If a string value cannot be
901 looked up, a numeric value, either an integer or a float, is returned.
902 3. File gid, likewise.
903 4. Last access time, as a list of two integers.
904 First integer has high-order 16 bits of time, second has low 16 bits.
905 (See a note below about access time on FAT-based filesystems.)
906 5. Last modification time, likewise. This is the time of the last
907 change to the file's contents.
908 6. Last status change time, likewise. This is the time of last change
909 to the file's attributes: owner and group, access mode bits, etc.
911 This is a floating point number if the size is too large for an integer.
912 8. File modes, as a string of ten letters or dashes as in ls -l.
913 9. t if file's gid would change if file were deleted and recreated.
914 10. inode number. If inode number is larger than what Emacs integer
915 can hold, but still fits into a 32-bit number, this is a cons cell
916 containing two integers: first the high part, then the low 16 bits.
917 If the inode number is wider than 32 bits, this is of the form
918 (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
919 and finally the low 16 bits.
920 11. Filesystem device number. If it is larger than what the Emacs
921 integer can hold, this is a cons cell, similar to the inode number.
923 On most filesystems, the combination of the inode and the device
924 number uniquely identifies the file.
926 On MS-Windows, performance depends on `w32-get-true-file-attributes',
929 On some FAT-based filesystems, only the date of last access is recorded,
930 so last access time will always be midnight of that day. */)
931 (Lisp_Object filename
, Lisp_Object id_format
)
933 Lisp_Object values
[12];
943 char *uname
= NULL
, *gname
= NULL
;
945 filename
= Fexpand_file_name (filename
, Qnil
);
947 /* If the file name has special constructs in it,
948 call the corresponding file handler. */
949 handler
= Ffind_file_name_handler (filename
, Qfile_attributes
);
951 { /* Only pass the extra arg if it is used to help backward compatibility
952 with old file handlers which do not implement the new arg. --Stef */
953 if (NILP (id_format
))
954 return call2 (handler
, Qfile_attributes
, filename
);
956 return call3 (handler
, Qfile_attributes
, filename
, id_format
);
960 encoded
= ENCODE_FILE (filename
);
963 if (lstat (SSDATA (encoded
), &s
) < 0)
966 values
[0] = (S_ISLNK (s
.st_mode
) ? Ffile_symlink_p (filename
)
967 : S_ISDIR (s
.st_mode
) ? Qt
: Qnil
);
968 values
[1] = make_number (s
.st_nlink
);
970 if (!(NILP (id_format
) || EQ (id_format
, Qinteger
)))
973 uname
= stat_uname (&s
);
974 gname
= stat_gname (&s
);
978 values
[2] = DECODE_SYSTEM (build_string (uname
));
980 values
[2] = make_fixnum_or_float (s
.st_uid
);
982 values
[3] = DECODE_SYSTEM (build_string (gname
));
984 values
[3] = make_fixnum_or_float (s
.st_gid
);
986 values
[4] = make_time (s
.st_atime
);
987 values
[5] = make_time (s
.st_mtime
);
988 values
[6] = make_time (s
.st_ctime
);
989 values
[7] = make_fixnum_or_float (s
.st_size
);
990 /* If the size is negative, and its type is long, convert it back to
992 if (s
.st_size
< 0 && sizeof (s
.st_size
) == sizeof (long))
993 values
[7] = make_float ((double) ((unsigned long) s
.st_size
));
995 filemodestring (&s
, modes
);
996 values
[8] = make_string (modes
, 10);
997 #ifdef BSD4_2 /* file gid will be dir gid */
998 dirname
= Ffile_name_directory (filename
);
999 if (! NILP (dirname
))
1000 encoded
= ENCODE_FILE (dirname
);
1001 if (! NILP (dirname
) && stat (SDATA (encoded
), &sdir
) == 0)
1002 values
[9] = (sdir
.st_gid
!= s
.st_gid
) ? Qt
: Qnil
;
1003 else /* if we can't tell, assume worst */
1005 #else /* file gid will be egid */
1006 values
[9] = (s
.st_gid
!= getegid ()) ? Qt
: Qnil
;
1007 #endif /* not BSD4_2 */
1008 if (!FIXNUM_OVERFLOW_P (s
.st_ino
))
1009 /* Keep the most common cases as integers. */
1010 values
[10] = make_number (s
.st_ino
);
1011 else if (!FIXNUM_OVERFLOW_P (s
.st_ino
>> 16))
1012 /* To allow inode numbers larger than VALBITS, separate the bottom
1014 values
[10] = Fcons (make_number ((EMACS_INT
)(s
.st_ino
>> 16)),
1015 make_number ((EMACS_INT
)(s
.st_ino
& 0xffff)));
1018 /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
1019 high parts and a 16-bit bottom part.
1020 The code on the next line avoids a compiler warning on
1021 systems where st_ino is 32 bit wide. (bug#766). */
1022 EMACS_INT high_ino
= s
.st_ino
>> 31 >> 1;
1023 EMACS_INT low_ino
= s
.st_ino
& 0xffffffff;
1025 values
[10] = Fcons (make_number (high_ino
>> 8),
1026 Fcons (make_number (((high_ino
& 0xff) << 16)
1028 make_number (low_ino
& 0xffff)));
1031 /* Likewise for device. */
1032 if (FIXNUM_OVERFLOW_P (s
.st_dev
))
1033 values
[11] = Fcons (make_number (s
.st_dev
>> 16),
1034 make_number (s
.st_dev
& 0xffff));
1036 values
[11] = make_number (s
.st_dev
);
1038 return Flist (sizeof(values
) / sizeof(values
[0]), values
);
1041 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp
, Sfile_attributes_lessp
, 2, 2, 0,
1042 doc
: /* Return t if first arg file attributes list is less than second.
1043 Comparison is in lexicographic order and case is significant. */)
1044 (Lisp_Object f1
, Lisp_Object f2
)
1046 return Fstring_lessp (Fcar (f1
), Fcar (f2
));
1050 syms_of_dired (void)
1052 Qdirectory_files
= intern_c_string ("directory-files");
1053 Qdirectory_files_and_attributes
= intern_c_string ("directory-files-and-attributes");
1054 Qfile_name_completion
= intern_c_string ("file-name-completion");
1055 Qfile_name_all_completions
= intern_c_string ("file-name-all-completions");
1056 Qfile_attributes
= intern_c_string ("file-attributes");
1057 Qfile_attributes_lessp
= intern_c_string ("file-attributes-lessp");
1058 Qdefault_directory
= intern_c_string ("default-directory");
1060 staticpro (&Qdirectory_files
);
1061 staticpro (&Qdirectory_files_and_attributes
);
1062 staticpro (&Qfile_name_completion
);
1063 staticpro (&Qfile_name_all_completions
);
1064 staticpro (&Qfile_attributes
);
1065 staticpro (&Qfile_attributes_lessp
);
1066 staticpro (&Qdefault_directory
);
1068 defsubr (&Sdirectory_files
);
1069 defsubr (&Sdirectory_files_and_attributes
);
1070 defsubr (&Sfile_name_completion
);
1071 defsubr (&Sfile_name_all_completions
);
1072 defsubr (&Sfile_attributes
);
1073 defsubr (&Sfile_attributes_lessp
);
1075 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions
,
1076 doc
: /* Completion ignores file names ending in any string in this list.
1077 It does not ignore them if all possible completions end in one of
1078 these strings or when displaying a list of completions.
1079 It ignores directory names if they match any string in this list which
1080 ends in a slash. */);
1081 Vcompletion_ignored_extensions
= Qnil
;