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 */
65 #define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
67 #define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
74 #include "character.h"
78 #include "blockinput.h"
80 /* Returns a search buffer, with a fastmap allocated and ready to go. */
81 extern struct re_pattern_buffer
*compile_pattern (Lisp_Object
,
82 struct re_registers
*,
83 Lisp_Object
, int, int);
85 /* From filemode.c. Can't go in Lisp.h because of `stat'. */
86 extern void filemodestring (struct stat
*, char *);
88 /* if system does not have symbolic links, it does not have lstat.
89 In that case, use ordinary stat instead. */
95 Lisp_Object Qdirectory_files
;
96 Lisp_Object Qdirectory_files_and_attributes
;
97 Lisp_Object Qfile_name_completion
;
98 Lisp_Object Qfile_name_all_completions
;
99 Lisp_Object Qfile_attributes
;
100 Lisp_Object Qfile_attributes_lessp
;
102 static int scmp (const char *, const char *, int);
106 directory_files_internal_w32_unwind (Lisp_Object arg
)
108 Vw32_get_true_file_attributes
= arg
;
114 directory_files_internal_unwind (Lisp_Object dh
)
116 DIR *d
= (DIR *) XSAVE_VALUE (dh
)->pointer
;
123 /* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
124 When ATTRS is zero, return a list of directory filenames; when
125 non-zero, 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
, Lisp_Object match
, Lisp_Object nosort
, int attrs
, Lisp_Object id_format
)
132 int directory_nbytes
;
133 Lisp_Object list
, dirfilename
, encoded_directory
;
134 struct re_pattern_buffer
*bufp
= NULL
;
136 int count
= SPECPDL_INDEX ();
137 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
140 Lisp_Object w32_save
= Qnil
;
143 /* Because of file name handlers, these functions might call
144 Ffuncall, and cause a GC. */
145 list
= encoded_directory
= dirfilename
= Qnil
;
146 GCPRO5 (match
, directory
, list
, dirfilename
, encoded_directory
);
147 dirfilename
= Fdirectory_file_name (directory
);
151 CHECK_STRING (match
);
153 /* MATCH might be a flawed regular expression. Rather than
154 catching and signaling our own errors, we just call
155 compile_pattern to do the work for us. */
156 /* Pass 1 for the MULTIBYTE arg
157 because we do make multibyte strings if the contents warrant. */
159 /* Windows users want case-insensitive wildcards. */
160 bufp
= compile_pattern (match
, 0,
161 buffer_defaults
.case_canon_table
, 0, 1);
162 # else /* !WINDOWSNT */
163 bufp
= compile_pattern (match
, 0, Qnil
, 0, 1);
164 # endif /* !WINDOWSNT */
167 /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
168 run_pre_post_conversion_on_str which calls Lisp directly and
170 if (STRING_MULTIBYTE (dirfilename
))
171 dirfilename
= ENCODE_FILE (dirfilename
);
172 encoded_directory
= (STRING_MULTIBYTE (directory
)
173 ? ENCODE_FILE (directory
) : directory
);
175 /* Now *bufp is the compiled form of MATCH; don't call anything
176 which might compile a new regexp until we're done with the loop! */
179 d
= opendir (SSDATA (dirfilename
));
182 report_file_error ("Opening directory", Fcons (directory
, Qnil
));
184 /* Unfortunately, we can now invoke expand-file-name and
185 file-attributes on filenames, both of which can throw, so we must
186 do a proper unwind-protect. */
187 record_unwind_protect (directory_files_internal_unwind
,
188 make_save_value (d
, 0));
193 extern int is_slow_fs (const char *);
195 /* Do this only once to avoid doing it (in w32.c:stat) for each
196 file in the directory, when we call Ffile_attributes below. */
197 record_unwind_protect (directory_files_internal_w32_unwind
,
198 Vw32_get_true_file_attributes
);
199 w32_save
= Vw32_get_true_file_attributes
;
200 if (EQ (Vw32_get_true_file_attributes
, Qlocal
))
202 /* w32.c:stat will notice these bindings and avoid calling
203 GetDriveType for each file. */
204 if (is_slow_fs (SDATA (dirfilename
)))
205 Vw32_get_true_file_attributes
= Qnil
;
207 Vw32_get_true_file_attributes
= Qt
;
212 directory_nbytes
= SBYTES (directory
);
213 re_match_object
= Qt
;
215 /* Decide whether we need to add a directory separator. */
216 if (directory_nbytes
== 0
217 || !IS_ANY_SEP (SREF (directory
, directory_nbytes
- 1)))
220 /* Loop reading blocks until EOF or error. */
239 if (DIRENTRY_NONEMPTY (dp
))
243 Lisp_Object name
, finalname
;
244 struct gcpro gcpro1
, gcpro2
;
247 name
= finalname
= make_unibyte_string (dp
->d_name
, len
);
248 GCPRO2 (finalname
, name
);
250 /* Note: DECODE_FILE can GC; it should protect its argument,
252 name
= DECODE_FILE (name
);
255 /* Now that we have unwind_protect in place, we might as well
256 allow matching to be interrupted. */
261 || (0 <= re_search (bufp
, SSDATA (name
), len
, 0, len
, 0)))
270 Lisp_Object fullname
;
271 int nbytes
= len
+ directory_nbytes
+ needsep
;
274 fullname
= make_uninit_multibyte_string (nbytes
, nbytes
);
275 memcpy (SDATA (fullname
), SDATA (directory
),
279 SSET (fullname
, directory_nbytes
, DIRECTORY_SEP
);
281 memcpy (SDATA (fullname
) + directory_nbytes
+ needsep
,
284 nchars
= chars_in_text (SDATA (fullname
), nbytes
);
286 /* Some bug somewhere. */
290 STRING_SET_CHARS (fullname
, nchars
);
291 if (nchars
== nbytes
)
292 STRING_SET_UNIBYTE (fullname
);
294 finalname
= fullname
;
301 /* Construct an expanded filename for the directory entry.
302 Use the decoded names for input to Ffile_attributes. */
303 Lisp_Object decoded_fullname
, fileattrs
;
304 struct gcpro gcpro1
, gcpro2
;
306 decoded_fullname
= fileattrs
= Qnil
;
307 GCPRO2 (decoded_fullname
, fileattrs
);
309 /* Both Fexpand_file_name and Ffile_attributes can GC. */
310 decoded_fullname
= Fexpand_file_name (name
, directory
);
311 fileattrs
= Ffile_attributes (decoded_fullname
, id_format
);
313 list
= Fcons (Fcons (finalname
, fileattrs
), list
);
317 list
= Fcons (finalname
, list
);
329 Vw32_get_true_file_attributes
= w32_save
;
332 /* Discard the unwind protect. */
333 specpdl_ptr
= specpdl
+ count
;
336 list
= Fsort (Fnreverse (list
),
337 attrs
? Qfile_attributes_lessp
: Qstring_lessp
);
339 RETURN_UNGCPRO (list
);
343 DEFUN ("directory-files", Fdirectory_files
, Sdirectory_files
, 1, 4, 0,
344 doc
: /* Return a list of names of files in DIRECTORY.
345 There are three optional arguments:
346 If FULL is non-nil, return absolute file names. Otherwise return names
347 that are relative to the specified directory.
348 If MATCH is non-nil, mention only file names that match the regexp MATCH.
349 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
350 Otherwise, the list returned is sorted with `string-lessp'.
351 NOSORT is useful if you plan to sort the result yourself. */)
352 (Lisp_Object directory
, Lisp_Object full
, Lisp_Object match
, Lisp_Object nosort
)
355 directory
= Fexpand_file_name (directory
, Qnil
);
357 /* If the file name has special constructs in it,
358 call the corresponding file handler. */
359 handler
= Ffind_file_name_handler (directory
, Qdirectory_files
);
361 return call5 (handler
, Qdirectory_files
, directory
,
362 full
, match
, nosort
);
364 return directory_files_internal (directory
, full
, match
, nosort
, 0, Qnil
);
367 DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes
,
368 Sdirectory_files_and_attributes
, 1, 5, 0,
369 doc
: /* Return a list of names of files and their attributes in DIRECTORY.
370 There are four optional arguments:
371 If FULL is non-nil, return absolute file names. Otherwise return names
372 that are relative to the specified directory.
373 If MATCH is non-nil, mention only file names that match the regexp MATCH.
374 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
375 NOSORT is useful if you plan to sort the result yourself.
376 ID-FORMAT specifies the preferred format of attributes uid and gid, see
377 `file-attributes' for further documentation.
378 On MS-Windows, performance depends on `w32-get-true-file-attributes',
380 (Lisp_Object directory
, Lisp_Object full
, Lisp_Object match
, Lisp_Object nosort
, Lisp_Object id_format
)
383 directory
= Fexpand_file_name (directory
, Qnil
);
385 /* If the file name has special constructs in it,
386 call the corresponding file handler. */
387 handler
= Ffind_file_name_handler (directory
, Qdirectory_files_and_attributes
);
389 return call6 (handler
, Qdirectory_files_and_attributes
,
390 directory
, full
, match
, nosort
, id_format
);
392 return directory_files_internal (directory
, full
, match
, nosort
, 1, id_format
);
396 Lisp_Object
file_name_completion (Lisp_Object file
, Lisp_Object dirname
, int all_flag
, int ver_flag
, Lisp_Object predicate
);
398 DEFUN ("file-name-completion", Ffile_name_completion
, Sfile_name_completion
,
400 doc
: /* Complete file name FILE in directory DIRECTORY.
401 Returns the longest string
402 common to all file names in DIRECTORY that start with FILE.
403 If there is only one and FILE matches it exactly, returns t.
404 Returns nil if DIRECTORY contains no name starting with FILE.
406 If PREDICATE is non-nil, call PREDICATE with each possible
407 completion (in absolute form) and ignore it if PREDICATE returns nil.
409 This function ignores some of the possible completions as
410 determined by the variable `completion-ignored-extensions', which see. */)
411 (Lisp_Object file
, Lisp_Object directory
, Lisp_Object predicate
)
415 /* If the directory name has special constructs in it,
416 call the corresponding file handler. */
417 handler
= Ffind_file_name_handler (directory
, Qfile_name_completion
);
419 return call4 (handler
, Qfile_name_completion
, file
, directory
, predicate
);
421 /* If the file name has special constructs in it,
422 call the corresponding file handler. */
423 handler
= Ffind_file_name_handler (file
, Qfile_name_completion
);
425 return call4 (handler
, Qfile_name_completion
, file
, directory
, predicate
);
427 return file_name_completion (file
, directory
, 0, 0, predicate
);
430 DEFUN ("file-name-all-completions", Ffile_name_all_completions
,
431 Sfile_name_all_completions
, 2, 2, 0,
432 doc
: /* Return a list of all completions of file name FILE in directory DIRECTORY.
433 These are all file names in directory DIRECTORY which begin with FILE. */)
434 (Lisp_Object file
, Lisp_Object directory
)
438 /* If the directory name has special constructs in it,
439 call the corresponding file handler. */
440 handler
= Ffind_file_name_handler (directory
, Qfile_name_all_completions
);
442 return call3 (handler
, Qfile_name_all_completions
, file
, directory
);
444 /* If the file name has special constructs in it,
445 call the corresponding file handler. */
446 handler
= Ffind_file_name_handler (file
, Qfile_name_all_completions
);
448 return call3 (handler
, Qfile_name_all_completions
, file
, directory
);
450 return file_name_completion (file
, directory
, 1, 0, Qnil
);
453 static int file_name_completion_stat (Lisp_Object dirname
, DIRENTRY
*dp
, struct stat
*st_addr
);
454 Lisp_Object Qdefault_directory
;
457 file_name_completion (Lisp_Object file
, Lisp_Object dirname
, int all_flag
, int ver_flag
, Lisp_Object predicate
)
460 int bestmatchsize
= 0;
462 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
463 If ALL_FLAG is 0, BESTMATCH is either nil
464 or the best match so far, not decoded. */
465 Lisp_Object bestmatch
, tem
, elt
, name
;
466 Lisp_Object encoded_file
;
467 Lisp_Object encoded_dir
;
470 /* If includeall is zero, exclude files in completion-ignored-extensions as
471 well as "." and "..". Until shown otherwise, assume we can't exclude
474 int count
= SPECPDL_INDEX ();
475 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
481 #ifdef FILE_SYSTEM_CASE
482 file
= FILE_SYSTEM_CASE (file
);
485 encoded_file
= encoded_dir
= Qnil
;
486 GCPRO5 (file
, dirname
, bestmatch
, encoded_file
, encoded_dir
);
487 dirname
= Fexpand_file_name (dirname
, Qnil
);
488 specbind (Qdefault_directory
, dirname
);
490 /* Do completion on the encoded file name
491 because the other names in the directory are (we presume)
492 encoded likewise. We decode the completed string at the end. */
493 /* Actually, this is not quite true any more: we do most of the completion
494 work with decoded file names, but we still do some filtering based
495 on the encoded file name. */
496 encoded_file
= STRING_MULTIBYTE (file
) ? ENCODE_FILE (file
) : file
;
498 encoded_dir
= ENCODE_FILE (dirname
);
501 d
= opendir (SSDATA (Fdirectory_file_name (encoded_dir
)));
504 report_file_error ("Opening directory", Fcons (dirname
, Qnil
));
506 record_unwind_protect (directory_files_internal_unwind
,
507 make_save_value (d
, 0));
509 /* Loop reading blocks */
510 /* (att3b compiler bug requires do a null comparison this way) */
534 if (! DIRENTRY_NONEMPTY (dp
)
535 || len
< SCHARS (encoded_file
)
536 || 0 <= scmp (dp
->d_name
, SSDATA (encoded_file
),
537 SCHARS (encoded_file
)))
540 if (file_name_completion_stat (encoded_dir
, dp
, &st
) < 0)
543 directoryp
= ((st
.st_mode
& S_IFMT
) == S_IFDIR
);
545 /* If all_flag is set, always include all.
546 It would not actually be helpful to the user to ignore any possible
547 completions when making a list of them. */
552 #if 0 /* FIXME: The `scmp' call compares an encoded and a decoded string. */
553 /* If this entry matches the current bestmatch, the only
554 thing it can do is increase matchcount, so don't bother
555 investigating it any further. */
556 if (!completion_ignore_case
557 /* The return result depends on whether it's the sole match. */
559 && !includeall
/* This match may allow includeall to 0. */
560 && len
>= bestmatchsize
561 && 0 > scmp (dp
->d_name
, SSDATA (bestmatch
), bestmatchsize
))
567 #ifndef TRIVIAL_DIRECTORY_ENTRY
568 #define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
570 /* "." and ".." are never interesting as completions, and are
571 actually in the way in a directory with only one file. */
572 if (TRIVIAL_DIRECTORY_ENTRY (dp
->d_name
))
574 else if (len
> SCHARS (encoded_file
))
575 /* Ignore directories if they match an element of
576 completion-ignored-extensions which ends in a slash. */
577 for (tem
= Vcompletion_ignored_extensions
;
578 CONSP (tem
); tem
= XCDR (tem
))
586 /* Need to encode ELT, since scmp compares unibyte
588 elt
= ENCODE_FILE (elt
);
589 elt_len
= SCHARS (elt
) - 1; /* -1 for trailing / */
593 if (p1
[elt_len
] != '/')
595 skip
= len
- elt_len
;
599 if (0 <= scmp (dp
->d_name
+ skip
, p1
, elt_len
))
606 /* Compare extensions-to-be-ignored against end of this file name */
607 /* if name is not an exact match against specified string */
608 if (len
> SCHARS (encoded_file
))
609 /* and exit this for loop if a match is found */
610 for (tem
= Vcompletion_ignored_extensions
;
611 CONSP (tem
); tem
= XCDR (tem
))
614 if (!STRINGP (elt
)) continue;
615 /* Need to encode ELT, since scmp compares unibyte
617 elt
= ENCODE_FILE (elt
);
618 skip
= len
- SCHARS (elt
);
619 if (skip
< 0) continue;
621 if (0 <= scmp (dp
->d_name
+ skip
,
629 /* If an ignored-extensions match was found,
630 don't process this name as a completion. */
634 if (!includeall
&& canexclude
)
635 /* We're not including all files and this file can be excluded. */
638 if (includeall
&& !canexclude
)
639 { /* If we have one non-excludable file, we want to exclude the
642 /* Throw away any previous excludable match found. */
648 /* FIXME: If we move this `decode' earlier we can eliminate
649 the repeated ENCODE_FILE on Vcompletion_ignored_extensions. */
650 name
= make_unibyte_string (dp
->d_name
, len
);
651 name
= DECODE_FILE (name
);
656 XSETFASTINT (zero
, 0);
658 /* Ignore this element if it fails to match all the regexps. */
659 if (completion_ignore_case
)
661 for (regexps
= Vcompletion_regexp_list
; CONSP (regexps
);
662 regexps
= XCDR (regexps
))
663 if (fast_string_match_ignore_case (XCAR (regexps
), name
) < 0)
668 for (regexps
= Vcompletion_regexp_list
; CONSP (regexps
);
669 regexps
= XCDR (regexps
))
670 if (fast_string_match (XCAR (regexps
), name
) < 0)
678 /* This is a possible completion */
680 /* This completion is a directory; make it end with '/'. */
681 name
= Ffile_name_as_directory (name
);
683 /* Test the predicate, if any. */
684 if (!NILP (predicate
))
690 val
= call1 (predicate
, name
);
697 /* Suitably record this match. */
702 bestmatch
= Fcons (name
, bestmatch
);
703 else if (NILP (bestmatch
))
706 bestmatchsize
= SCHARS (name
);
710 Lisp_Object zero
= make_number (0);
711 /* FIXME: This is a copy of the code in Ftry_completion. */
712 int compare
= min (bestmatchsize
, SCHARS (name
));
714 = Fcompare_strings (bestmatch
, zero
,
715 make_number (compare
),
717 make_number (compare
),
718 completion_ignore_case
? Qt
: Qnil
);
720 = (EQ (tem
, Qt
) ? compare
721 : XINT (tem
) < 0 ? - XINT (tem
) - 1
724 if (completion_ignore_case
)
726 /* If this is an exact match except for case,
727 use it as the best match rather than one that is not
728 an exact match. This way, we get the case pattern
729 of the actual match. */
730 /* This tests that the current file is an exact match
731 but BESTMATCH is not (it is too long). */
732 if ((matchsize
== SCHARS (name
)
733 && matchsize
+ !!directoryp
< SCHARS (bestmatch
))
735 /* If there is no exact match ignoring case,
736 prefer a match that does not change the case
738 /* If there is more than one exact match aside from
739 case, and one of them is exact including case,
741 /* This == checks that, of current file and BESTMATCH,
742 either both or neither are exact. */
743 (((matchsize
== SCHARS (name
))
745 (matchsize
+ !!directoryp
== SCHARS (bestmatch
)))
746 && (tem
= Fcompare_strings (name
, zero
,
747 make_number (SCHARS (file
)),
752 && (tem
= Fcompare_strings (bestmatch
, zero
,
753 make_number (SCHARS (file
)),
760 bestmatchsize
= matchsize
;
762 /* If the best completion so far is reduced to the string
763 we're trying to complete, then we already know there's no
764 other completion, so there's no point looking any further. */
765 if (matchsize
<= SCHARS (file
)
766 && !includeall
/* A future match may allow includeall to 0. */
767 /* If completion-ignore-case is non-nil, don't
768 short-circuit because we want to find the best
769 possible match *including* case differences. */
770 && (!completion_ignore_case
|| matchsize
== 0)
771 /* The return value depends on whether it's the sole match. */
779 /* This closes the directory. */
780 bestmatch
= unbind_to (count
, bestmatch
);
782 if (all_flag
|| NILP (bestmatch
))
784 /* Return t if the supplied string is an exact match (counting case);
785 it does not require any change to be made. */
786 if (matchcount
== 1 && !NILP (Fequal (bestmatch
, file
)))
788 bestmatch
= Fsubstring (bestmatch
, make_number (0),
789 make_number (bestmatchsize
));
793 /* Compare exactly LEN chars of strings at S1 and S2,
794 ignoring case if appropriate.
795 Return -1 if strings match,
796 else number of chars that match at the beginning. */
799 scmp (const char *s1
, const char *s2
, int len
)
801 register int l
= len
;
803 if (completion_ignore_case
)
806 && (DOWNCASE ((unsigned char) *s1
++)
807 == DOWNCASE ((unsigned char) *s2
++)))
812 while (l
&& *s1
++ == *s2
++)
822 file_name_completion_stat (Lisp_Object dirname
, DIRENTRY
*dp
, struct stat
*st_addr
)
824 int len
= NAMLEN (dp
);
825 int pos
= SCHARS (dirname
);
827 char *fullname
= (char *) alloca (len
+ pos
+ 2);
830 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
831 but aren't required here. Avoid computing the following fields:
832 st_inode, st_size and st_nlink for directories, and the execute bits
833 in st_mode for non-directory files with non-standard extensions. */
835 unsigned short save_djstat_flags
= _djstat_flags
;
837 _djstat_flags
= _STAT_INODE
| _STAT_EXEC_MAGIC
| _STAT_DIRSIZE
;
840 memcpy (fullname
, SDATA (dirname
), pos
);
841 if (!IS_DIRECTORY_SEP (fullname
[pos
- 1]))
842 fullname
[pos
++] = DIRECTORY_SEP
;
844 memcpy (fullname
+ pos
, dp
->d_name
, len
);
845 fullname
[pos
+ len
] = 0;
848 /* We want to return success if a link points to a nonexistent file,
849 but we want to return the status for what the link points to,
850 in case it is a directory. */
851 value
= lstat (fullname
, st_addr
);
852 stat (fullname
, st_addr
);
855 value
= stat (fullname
, st_addr
);
857 _djstat_flags
= save_djstat_flags
;
864 make_time (time_t time
)
866 return Fcons (make_number (time
>> 16),
867 Fcons (make_number (time
& 0177777), Qnil
));
871 stat_uname (struct stat
*st
)
876 struct passwd
*pw
= (struct passwd
*) getpwuid (st
->st_uid
);
886 stat_gname (struct stat
*st
)
891 struct group
*gr
= (struct group
*) getgrgid (st
->st_gid
);
900 DEFUN ("file-attributes", Ffile_attributes
, Sfile_attributes
, 1, 2, 0,
901 doc
: /* Return a list of attributes of file FILENAME.
902 Value is nil if specified file cannot be opened.
904 ID-FORMAT specifies the preferred format of attributes uid and gid (see
905 below) - valid values are 'string and 'integer. The latter is the
906 default, but we plan to change that, so you should specify a non-nil value
907 for ID-FORMAT if you use the returned uid or gid.
909 Elements of the attribute list are:
910 0. t for directory, string (name linked to) for symbolic link, or nil.
911 1. Number of links to file.
912 2. File uid as a string or a number. If a string value cannot be
913 looked up, a numeric value, either an integer or a float, is returned.
914 3. File gid, likewise.
915 4. Last access time, as a list of two integers.
916 First integer has high-order 16 bits of time, second has low 16 bits.
917 (See a note below about access time on FAT-based filesystems.)
918 5. Last modification time, likewise. This is the time of the last
919 change to the file's contents.
920 6. Last status change time, likewise. This is the time of last change
921 to the file's attributes: owner and group, access mode bits, etc.
923 This is a floating point number if the size is too large for an integer.
924 8. File modes, as a string of ten letters or dashes as in ls -l.
925 9. t if file's gid would change if file were deleted and recreated.
926 10. inode number. If inode number is larger than what Emacs integer
927 can hold, but still fits into a 32-bit number, this is a cons cell
928 containing two integers: first the high part, then the low 16 bits.
929 If the inode number is wider than 32 bits, this is of the form
930 (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
931 and finally the low 16 bits.
932 11. Filesystem device number. If it is larger than what the Emacs
933 integer can hold, this is a cons cell, similar to the inode number.
935 On most filesystems, the combination of the inode and the device
936 number uniquely identifies the file.
938 On MS-Windows, performance depends on `w32-get-true-file-attributes',
941 On some FAT-based filesystems, only the date of last access is recorded,
942 so last access time will always be midnight of that day. */)
943 (Lisp_Object filename
, Lisp_Object id_format
)
945 Lisp_Object values
[12];
955 char *uname
= NULL
, *gname
= NULL
;
957 filename
= Fexpand_file_name (filename
, Qnil
);
959 /* If the file name has special constructs in it,
960 call the corresponding file handler. */
961 handler
= Ffind_file_name_handler (filename
, Qfile_attributes
);
963 { /* Only pass the extra arg if it is used to help backward compatibility
964 with old file handlers which do not implement the new arg. --Stef */
965 if (NILP (id_format
))
966 return call2 (handler
, Qfile_attributes
, filename
);
968 return call3 (handler
, Qfile_attributes
, filename
, id_format
);
972 encoded
= ENCODE_FILE (filename
);
975 if (lstat (SSDATA (encoded
), &s
) < 0)
978 switch (s
.st_mode
& S_IFMT
)
981 values
[0] = Qnil
; break;
983 values
[0] = Qt
; break;
986 values
[0] = Ffile_symlink_p (filename
); break;
989 values
[1] = make_number (s
.st_nlink
);
991 if (!(NILP (id_format
) || EQ (id_format
, Qinteger
)))
994 uname
= stat_uname (&s
);
995 gname
= stat_gname (&s
);
999 values
[2] = DECODE_SYSTEM (build_string (uname
));
1001 values
[2] = make_fixnum_or_float (s
.st_uid
);
1003 values
[3] = DECODE_SYSTEM (build_string (gname
));
1005 values
[3] = make_fixnum_or_float (s
.st_gid
);
1007 values
[4] = make_time (s
.st_atime
);
1008 values
[5] = make_time (s
.st_mtime
);
1009 values
[6] = make_time (s
.st_ctime
);
1010 values
[7] = make_fixnum_or_float (s
.st_size
);
1011 /* If the size is negative, and its type is long, convert it back to
1013 if (s
.st_size
< 0 && sizeof (s
.st_size
) == sizeof (long))
1014 values
[7] = make_float ((double) ((unsigned long) s
.st_size
));
1016 filemodestring (&s
, modes
);
1017 values
[8] = make_string (modes
, 10);
1018 #ifdef BSD4_2 /* file gid will be dir gid */
1019 dirname
= Ffile_name_directory (filename
);
1020 if (! NILP (dirname
))
1021 encoded
= ENCODE_FILE (dirname
);
1022 if (! NILP (dirname
) && stat (SDATA (encoded
), &sdir
) == 0)
1023 values
[9] = (sdir
.st_gid
!= s
.st_gid
) ? Qt
: Qnil
;
1024 else /* if we can't tell, assume worst */
1026 #else /* file gid will be egid */
1027 values
[9] = (s
.st_gid
!= getegid ()) ? Qt
: Qnil
;
1028 #endif /* not BSD4_2 */
1029 if (!FIXNUM_OVERFLOW_P (s
.st_ino
))
1030 /* Keep the most common cases as integers. */
1031 values
[10] = make_number (s
.st_ino
);
1032 else if (!FIXNUM_OVERFLOW_P (s
.st_ino
>> 16))
1033 /* To allow inode numbers larger than VALBITS, separate the bottom
1035 values
[10] = Fcons (make_number ((EMACS_INT
)(s
.st_ino
>> 16)),
1036 make_number ((EMACS_INT
)(s
.st_ino
& 0xffff)));
1039 /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
1040 high parts and a 16-bit bottom part.
1041 The code on the next line avoids a compiler warning on
1042 systems where st_ino is 32 bit wide. (bug#766). */
1043 EMACS_INT high_ino
= s
.st_ino
>> 31 >> 1;
1044 EMACS_INT low_ino
= s
.st_ino
& 0xffffffff;
1046 values
[10] = Fcons (make_number (high_ino
>> 8),
1047 Fcons (make_number (((high_ino
& 0xff) << 16)
1049 make_number (low_ino
& 0xffff)));
1052 /* Likewise for device. */
1053 if (FIXNUM_OVERFLOW_P (s
.st_dev
))
1054 values
[11] = Fcons (make_number (s
.st_dev
>> 16),
1055 make_number (s
.st_dev
& 0xffff));
1057 values
[11] = make_number (s
.st_dev
);
1059 return Flist (sizeof(values
) / sizeof(values
[0]), values
);
1062 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp
, Sfile_attributes_lessp
, 2, 2, 0,
1063 doc
: /* Return t if first arg file attributes list is less than second.
1064 Comparison is in lexicographic order and case is significant. */)
1065 (Lisp_Object f1
, Lisp_Object f2
)
1067 return Fstring_lessp (Fcar (f1
), Fcar (f2
));
1071 syms_of_dired (void)
1073 Qdirectory_files
= intern_c_string ("directory-files");
1074 Qdirectory_files_and_attributes
= intern_c_string ("directory-files-and-attributes");
1075 Qfile_name_completion
= intern_c_string ("file-name-completion");
1076 Qfile_name_all_completions
= intern_c_string ("file-name-all-completions");
1077 Qfile_attributes
= intern_c_string ("file-attributes");
1078 Qfile_attributes_lessp
= intern_c_string ("file-attributes-lessp");
1079 Qdefault_directory
= intern_c_string ("default-directory");
1081 staticpro (&Qdirectory_files
);
1082 staticpro (&Qdirectory_files_and_attributes
);
1083 staticpro (&Qfile_name_completion
);
1084 staticpro (&Qfile_name_all_completions
);
1085 staticpro (&Qfile_attributes
);
1086 staticpro (&Qfile_attributes_lessp
);
1087 staticpro (&Qdefault_directory
);
1089 defsubr (&Sdirectory_files
);
1090 defsubr (&Sdirectory_files_and_attributes
);
1091 defsubr (&Sfile_name_completion
);
1092 defsubr (&Sfile_name_all_completions
);
1093 defsubr (&Sfile_attributes
);
1094 defsubr (&Sfile_attributes_lessp
);
1096 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions
,
1097 doc
: /* Completion ignores file names ending in any string in this list.
1098 It does not ignore them if all possible completions end in one of
1099 these strings or when displaying a list of completions.
1100 It ignores directory names if they match any string in this list which
1101 ends in a slash. */);
1102 Vcompletion_ignored_extensions
= Qnil
;