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