]> code.delx.au - gnu-emacs/blob - src/fileio.c
Merge from mainline.
[gnu-emacs] / src / fileio.c
1 /* File IO for GNU Emacs.
2
3 Copyright (C) 1985-1988, 1993-2011 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include <config.h>
21 #include <limits.h>
22 #include <fcntl.h>
23 #include <stdio.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <setjmp.h>
27 #include <unistd.h>
28
29 #if !defined (S_ISLNK) && defined (S_IFLNK)
30 # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
31 #endif
32
33 #if !defined (S_ISFIFO) && defined (S_IFIFO)
34 # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
35 #endif
36
37 #if !defined (S_ISREG) && defined (S_IFREG)
38 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
39 #endif
40
41 #ifdef HAVE_PWD_H
42 #include <pwd.h>
43 #endif
44
45 #include <ctype.h>
46 #include <errno.h>
47
48 #ifdef HAVE_LIBSELINUX
49 #include <selinux/selinux.h>
50 #include <selinux/context.h>
51 #endif
52
53 #include "lisp.h"
54 #include "intervals.h"
55 #include "buffer.h"
56 #include "character.h"
57 #include "coding.h"
58 #include "window.h"
59 #include "blockinput.h"
60 #include "frame.h"
61 #include "dispextern.h"
62
63 #ifdef WINDOWSNT
64 #define NOMINMAX 1
65 #include <windows.h>
66 #include <fcntl.h>
67 #endif /* not WINDOWSNT */
68
69 #ifdef MSDOS
70 #include "msdos.h"
71 #include <sys/param.h>
72 #include <fcntl.h>
73 #endif
74
75 #ifdef DOS_NT
76 /* On Windows, drive letters must be alphabetic - on DOS, the Netware
77 redirector allows the six letters between 'Z' and 'a' as well. */
78 #ifdef MSDOS
79 #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
80 #endif
81 #ifdef WINDOWSNT
82 #define IS_DRIVE(x) isalpha ((unsigned char) (x))
83 #endif
84 /* Need to lower-case the drive letter, or else expanded
85 filenames will sometimes compare inequal, because
86 `expand-file-name' doesn't always down-case the drive letter. */
87 #define DRIVE_LETTER(x) (tolower ((unsigned char) (x)))
88 #endif
89
90 #include "systime.h"
91
92 #ifdef HPUX
93 #include <netio.h>
94 #endif
95
96 #include "commands.h"
97
98 #ifndef S_ISLNK
99 # define lstat stat
100 #endif
101
102 #ifndef FILE_SYSTEM_CASE
103 #define FILE_SYSTEM_CASE(filename) (filename)
104 #endif
105
106 /* Nonzero during writing of auto-save files */
107 int auto_saving;
108
109 /* Set by auto_save_1 to mode of original file so Fwrite_region will create
110 a new file with the same mode as the original */
111 int auto_save_mode_bits;
112
113 /* Set by auto_save_1 if an error occurred during the last auto-save. */
114 int auto_save_error_occurred;
115
116 /* The symbol bound to coding-system-for-read when
117 insert-file-contents is called for recovering a file. This is not
118 an actual coding system name, but just an indicator to tell
119 insert-file-contents to use `emacs-mule' with a special flag for
120 auto saving and recovering a file. */
121 Lisp_Object Qauto_save_coding;
122
123 /* Property name of a file name handler,
124 which gives a list of operations it handles.. */
125 Lisp_Object Qoperations;
126
127 /* Lisp functions for translating file formats */
128 Lisp_Object Qformat_decode, Qformat_annotate_function;
129
130 /* Lisp function for setting buffer-file-coding-system and the
131 multibyteness of the current buffer after inserting a file. */
132 Lisp_Object Qafter_insert_file_set_coding;
133
134 Lisp_Object Qwrite_region_annotate_functions;
135 /* Each time an annotation function changes the buffer, the new buffer
136 is added here. */
137 Lisp_Object Vwrite_region_annotation_buffers;
138
139 #ifdef HAVE_FSYNC
140 #endif
141
142 Lisp_Object Qdelete_by_moving_to_trash;
143
144 /* Lisp function for moving files to trash. */
145 Lisp_Object Qmove_file_to_trash;
146
147 /* Lisp function for recursively copying directories. */
148 Lisp_Object Qcopy_directory;
149
150 /* Lisp function for recursively deleting directories. */
151 Lisp_Object Qdelete_directory;
152
153 #ifdef WINDOWSNT
154 #endif
155
156 Lisp_Object Qfile_error, Qfile_already_exists, Qfile_date_error;
157 Lisp_Object Qexcl;
158 Lisp_Object Qfile_name_history;
159
160 Lisp_Object Qcar_less_than_car;
161
162 static int a_write (int, Lisp_Object, int, int,
163 Lisp_Object *, struct coding_system *);
164 static int e_write (int, Lisp_Object, int, int, struct coding_system *);
165
166 \f
167 void
168 report_file_error (const char *string, Lisp_Object data)
169 {
170 Lisp_Object errstring;
171 int errorno = errno;
172 char *str;
173
174 synchronize_system_messages_locale ();
175 str = strerror (errorno);
176 errstring = code_convert_string_norecord (make_unibyte_string (str,
177 strlen (str)),
178 Vlocale_coding_system, 0);
179
180 while (1)
181 switch (errorno)
182 {
183 case EEXIST:
184 xsignal (Qfile_already_exists, Fcons (errstring, data));
185 break;
186 default:
187 /* System error messages are capitalized. Downcase the initial
188 unless it is followed by a slash. (The slash case caters to
189 error messages that begin with "I/O" or, in German, "E/A".) */
190 if (STRING_MULTIBYTE (errstring)
191 && ! EQ (Faref (errstring, make_number (1)), make_number ('/')))
192 {
193 int c;
194
195 str = SSDATA (errstring);
196 c = STRING_CHAR ((unsigned char *) str);
197 Faset (errstring, make_number (0), make_number (DOWNCASE (c)));
198 }
199
200 xsignal (Qfile_error,
201 Fcons (build_string (string), Fcons (errstring, data)));
202 }
203 }
204
205 Lisp_Object
206 close_file_unwind (Lisp_Object fd)
207 {
208 emacs_close (XFASTINT (fd));
209 return Qnil;
210 }
211
212 /* Restore point, having saved it as a marker. */
213
214 Lisp_Object
215 restore_point_unwind (Lisp_Object location)
216 {
217 Fgoto_char (location);
218 Fset_marker (location, Qnil, Qnil);
219 return Qnil;
220 }
221
222 \f
223 Lisp_Object Qexpand_file_name;
224 Lisp_Object Qsubstitute_in_file_name;
225 Lisp_Object Qdirectory_file_name;
226 Lisp_Object Qfile_name_directory;
227 Lisp_Object Qfile_name_nondirectory;
228 Lisp_Object Qunhandled_file_name_directory;
229 Lisp_Object Qfile_name_as_directory;
230 Lisp_Object Qcopy_file;
231 Lisp_Object Qmake_directory_internal;
232 Lisp_Object Qmake_directory;
233 Lisp_Object Qdelete_directory_internal;
234 Lisp_Object Qdelete_file;
235 Lisp_Object Qrename_file;
236 Lisp_Object Qadd_name_to_file;
237 Lisp_Object Qmake_symbolic_link;
238 Lisp_Object Qfile_exists_p;
239 Lisp_Object Qfile_executable_p;
240 Lisp_Object Qfile_readable_p;
241 Lisp_Object Qfile_writable_p;
242 Lisp_Object Qfile_symlink_p;
243 Lisp_Object Qaccess_file;
244 Lisp_Object Qfile_directory_p;
245 Lisp_Object Qfile_regular_p;
246 Lisp_Object Qfile_accessible_directory_p;
247 Lisp_Object Qfile_modes;
248 Lisp_Object Qset_file_modes;
249 Lisp_Object Qset_file_times;
250 Lisp_Object Qfile_selinux_context;
251 Lisp_Object Qset_file_selinux_context;
252 Lisp_Object Qfile_newer_than_file_p;
253 Lisp_Object Qinsert_file_contents;
254 Lisp_Object Qwrite_region;
255 Lisp_Object Qverify_visited_file_modtime;
256 Lisp_Object Qset_visited_file_modtime;
257
258 DEFUN ("find-file-name-handler", Ffind_file_name_handler, Sfind_file_name_handler, 2, 2, 0,
259 doc: /* Return FILENAME's handler function for OPERATION, if it has one.
260 Otherwise, return nil.
261 A file name is handled if one of the regular expressions in
262 `file-name-handler-alist' matches it.
263
264 If OPERATION equals `inhibit-file-name-operation', then we ignore
265 any handlers that are members of `inhibit-file-name-handlers',
266 but we still do run any other handlers. This lets handlers
267 use the standard functions without calling themselves recursively. */)
268 (Lisp_Object filename, Lisp_Object operation)
269 {
270 /* This function must not munge the match data. */
271 Lisp_Object chain, inhibited_handlers, result;
272 int pos = -1;
273
274 result = Qnil;
275 CHECK_STRING (filename);
276
277 if (EQ (operation, Vinhibit_file_name_operation))
278 inhibited_handlers = Vinhibit_file_name_handlers;
279 else
280 inhibited_handlers = Qnil;
281
282 for (chain = Vfile_name_handler_alist; CONSP (chain);
283 chain = XCDR (chain))
284 {
285 Lisp_Object elt;
286 elt = XCAR (chain);
287 if (CONSP (elt))
288 {
289 Lisp_Object string = XCAR (elt);
290 int match_pos;
291 Lisp_Object handler = XCDR (elt);
292 Lisp_Object operations = Qnil;
293
294 if (SYMBOLP (handler))
295 operations = Fget (handler, Qoperations);
296
297 if (STRINGP (string)
298 && (match_pos = fast_string_match (string, filename)) > pos
299 && (NILP (operations) || ! NILP (Fmemq (operation, operations))))
300 {
301 Lisp_Object tem;
302
303 handler = XCDR (elt);
304 tem = Fmemq (handler, inhibited_handlers);
305 if (NILP (tem))
306 {
307 result = handler;
308 pos = match_pos;
309 }
310 }
311 }
312
313 QUIT;
314 }
315 return result;
316 }
317 \f
318 DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
319 1, 1, 0,
320 doc: /* Return the directory component in file name FILENAME.
321 Return nil if FILENAME does not include a directory.
322 Otherwise return a directory name.
323 Given a Unix syntax file name, returns a string ending in slash. */)
324 (Lisp_Object filename)
325 {
326 #ifndef DOS_NT
327 register const char *beg;
328 #else
329 register char *beg;
330 #endif
331 register const char *p;
332 Lisp_Object handler;
333
334 CHECK_STRING (filename);
335
336 /* If the file name has special constructs in it,
337 call the corresponding file handler. */
338 handler = Ffind_file_name_handler (filename, Qfile_name_directory);
339 if (!NILP (handler))
340 return call2 (handler, Qfile_name_directory, filename);
341
342 filename = FILE_SYSTEM_CASE (filename);
343 #ifdef DOS_NT
344 beg = (char *) alloca (SBYTES (filename) + 1);
345 memcpy (beg, SSDATA (filename), SBYTES (filename) + 1);
346 #else
347 beg = SSDATA (filename);
348 #endif
349 p = beg + SBYTES (filename);
350
351 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
352 #ifdef DOS_NT
353 /* only recognise drive specifier at the beginning */
354 && !(p[-1] == ':'
355 /* handle the "/:d:foo" and "/:foo" cases correctly */
356 && ((p == beg + 2 && !IS_DIRECTORY_SEP (*beg))
357 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
358 #endif
359 ) p--;
360
361 if (p == beg)
362 return Qnil;
363 #ifdef DOS_NT
364 /* Expansion of "c:" to drive and default directory. */
365 if (p[-1] == ':')
366 {
367 /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir. */
368 char *res = alloca (MAXPATHLEN + 1);
369 char *r = res;
370
371 if (p == beg + 4 && IS_DIRECTORY_SEP (*beg) && beg[1] == ':')
372 {
373 strncpy (res, beg, 2);
374 beg += 2;
375 r += 2;
376 }
377
378 if (getdefdir (toupper ((unsigned char) *beg) - 'A' + 1, r))
379 {
380 if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
381 strcat (res, "/");
382 beg = res;
383 p = beg + strlen (beg);
384 }
385 }
386 dostounix_filename (beg);
387 #endif /* DOS_NT */
388
389 return make_specified_string (beg, -1, p - beg, STRING_MULTIBYTE (filename));
390 }
391
392 DEFUN ("file-name-nondirectory", Ffile_name_nondirectory,
393 Sfile_name_nondirectory, 1, 1, 0,
394 doc: /* Return file name FILENAME sans its directory.
395 For example, in a Unix-syntax file name,
396 this is everything after the last slash,
397 or the entire name if it contains no slash. */)
398 (Lisp_Object filename)
399 {
400 register const char *beg, *p, *end;
401 Lisp_Object handler;
402
403 CHECK_STRING (filename);
404
405 /* If the file name has special constructs in it,
406 call the corresponding file handler. */
407 handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory);
408 if (!NILP (handler))
409 return call2 (handler, Qfile_name_nondirectory, filename);
410
411 beg = SSDATA (filename);
412 end = p = beg + SBYTES (filename);
413
414 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
415 #ifdef DOS_NT
416 /* only recognise drive specifier at beginning */
417 && !(p[-1] == ':'
418 /* handle the "/:d:foo" case correctly */
419 && (p == beg + 2 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
420 #endif
421 )
422 p--;
423
424 return make_specified_string (p, -1, end - p, STRING_MULTIBYTE (filename));
425 }
426
427 DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory,
428 Sunhandled_file_name_directory, 1, 1, 0,
429 doc: /* Return a directly usable directory name somehow associated with FILENAME.
430 A `directly usable' directory name is one that may be used without the
431 intervention of any file handler.
432 If FILENAME is a directly usable file itself, return
433 \(file-name-directory FILENAME).
434 If FILENAME refers to a file which is not accessible from a local process,
435 then this should return nil.
436 The `call-process' and `start-process' functions use this function to
437 get a current directory to run processes in. */)
438 (Lisp_Object filename)
439 {
440 Lisp_Object handler;
441
442 /* If the file name has special constructs in it,
443 call the corresponding file handler. */
444 handler = Ffind_file_name_handler (filename, Qunhandled_file_name_directory);
445 if (!NILP (handler))
446 return call2 (handler, Qunhandled_file_name_directory, filename);
447
448 return Ffile_name_directory (filename);
449 }
450
451 \f
452 char *
453 file_name_as_directory (char *out, char *in)
454 {
455 int size = strlen (in) - 1;
456
457 strcpy (out, in);
458
459 if (size < 0)
460 {
461 out[0] = '.';
462 out[1] = '/';
463 out[2] = 0;
464 return out;
465 }
466
467 /* For Unix syntax, Append a slash if necessary */
468 if (!IS_DIRECTORY_SEP (out[size]))
469 {
470 out[size + 1] = DIRECTORY_SEP;
471 out[size + 2] = '\0';
472 }
473 #ifdef DOS_NT
474 dostounix_filename (out);
475 #endif
476 return out;
477 }
478
479 DEFUN ("file-name-as-directory", Ffile_name_as_directory,
480 Sfile_name_as_directory, 1, 1, 0,
481 doc: /* Return a string representing the file name FILE interpreted as a directory.
482 This operation exists because a directory is also a file, but its name as
483 a directory is different from its name as a file.
484 The result can be used as the value of `default-directory'
485 or passed as second argument to `expand-file-name'.
486 For a Unix-syntax file name, just appends a slash. */)
487 (Lisp_Object file)
488 {
489 char *buf;
490 Lisp_Object handler;
491
492 CHECK_STRING (file);
493 if (NILP (file))
494 return Qnil;
495
496 /* If the file name has special constructs in it,
497 call the corresponding file handler. */
498 handler = Ffind_file_name_handler (file, Qfile_name_as_directory);
499 if (!NILP (handler))
500 return call2 (handler, Qfile_name_as_directory, file);
501
502 buf = (char *) alloca (SBYTES (file) + 10);
503 file_name_as_directory (buf, SSDATA (file));
504 return make_specified_string (buf, -1, strlen (buf),
505 STRING_MULTIBYTE (file));
506 }
507 \f
508 /*
509 * Convert from directory name to filename.
510 * On UNIX, it's simple: just make sure there isn't a terminating /
511
512 * Value is nonzero if the string output is different from the input.
513 */
514
515 int
516 directory_file_name (char *src, char *dst)
517 {
518 long slen;
519
520 slen = strlen (src);
521
522 /* Process as Unix format: just remove any final slash.
523 But leave "/" unchanged; do not change it to "". */
524 strcpy (dst, src);
525 if (slen > 1
526 && IS_DIRECTORY_SEP (dst[slen - 1])
527 #ifdef DOS_NT
528 && !IS_ANY_SEP (dst[slen - 2])
529 #endif
530 )
531 dst[slen - 1] = 0;
532 #ifdef DOS_NT
533 dostounix_filename (dst);
534 #endif
535 return 1;
536 }
537
538 DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
539 1, 1, 0,
540 doc: /* Returns the file name of the directory named DIRECTORY.
541 This is the name of the file that holds the data for the directory DIRECTORY.
542 This operation exists because a directory is also a file, but its name as
543 a directory is different from its name as a file.
544 In Unix-syntax, this function just removes the final slash. */)
545 (Lisp_Object directory)
546 {
547 char *buf;
548 Lisp_Object handler;
549
550 CHECK_STRING (directory);
551
552 if (NILP (directory))
553 return Qnil;
554
555 /* If the file name has special constructs in it,
556 call the corresponding file handler. */
557 handler = Ffind_file_name_handler (directory, Qdirectory_file_name);
558 if (!NILP (handler))
559 return call2 (handler, Qdirectory_file_name, directory);
560
561 buf = (char *) alloca (SBYTES (directory) + 20);
562 directory_file_name (SSDATA (directory), buf);
563 return make_specified_string (buf, -1, strlen (buf),
564 STRING_MULTIBYTE (directory));
565 }
566
567 static const char make_temp_name_tbl[64] =
568 {
569 'A','B','C','D','E','F','G','H',
570 'I','J','K','L','M','N','O','P',
571 'Q','R','S','T','U','V','W','X',
572 'Y','Z','a','b','c','d','e','f',
573 'g','h','i','j','k','l','m','n',
574 'o','p','q','r','s','t','u','v',
575 'w','x','y','z','0','1','2','3',
576 '4','5','6','7','8','9','-','_'
577 };
578
579 static unsigned make_temp_name_count, make_temp_name_count_initialized_p;
580
581 /* Value is a temporary file name starting with PREFIX, a string.
582
583 The Emacs process number forms part of the result, so there is
584 no danger of generating a name being used by another process.
585 In addition, this function makes an attempt to choose a name
586 which has no existing file. To make this work, PREFIX should be
587 an absolute file name.
588
589 BASE64_P non-zero means add the pid as 3 characters in base64
590 encoding. In this case, 6 characters will be added to PREFIX to
591 form the file name. Otherwise, if Emacs is running on a system
592 with long file names, add the pid as a decimal number.
593
594 This function signals an error if no unique file name could be
595 generated. */
596
597 Lisp_Object
598 make_temp_name (Lisp_Object prefix, int base64_p)
599 {
600 Lisp_Object val;
601 int len, clen;
602 int pid;
603 char *p, *data;
604 char pidbuf[20];
605 int pidlen;
606
607 CHECK_STRING (prefix);
608
609 /* VAL is created by adding 6 characters to PREFIX. The first
610 three are the PID of this process, in base 64, and the second
611 three are incremented if the file already exists. This ensures
612 262144 unique file names per PID per PREFIX. */
613
614 pid = (int) getpid ();
615
616 if (base64_p)
617 {
618 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
619 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
620 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
621 pidlen = 3;
622 }
623 else
624 {
625 #ifdef HAVE_LONG_FILE_NAMES
626 sprintf (pidbuf, "%d", pid);
627 pidlen = strlen (pidbuf);
628 #else
629 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
630 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
631 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
632 pidlen = 3;
633 #endif
634 }
635
636 len = SBYTES (prefix); clen = SCHARS (prefix);
637 val = make_uninit_multibyte_string (clen + 3 + pidlen, len + 3 + pidlen);
638 if (!STRING_MULTIBYTE (prefix))
639 STRING_SET_UNIBYTE (val);
640 data = SSDATA (val);
641 memcpy (data, SSDATA (prefix), len);
642 p = data + len;
643
644 memcpy (p, pidbuf, pidlen);
645 p += pidlen;
646
647 /* Here we try to minimize useless stat'ing when this function is
648 invoked many times successively with the same PREFIX. We achieve
649 this by initializing count to a random value, and incrementing it
650 afterwards.
651
652 We don't want make-temp-name to be called while dumping,
653 because then make_temp_name_count_initialized_p would get set
654 and then make_temp_name_count would not be set when Emacs starts. */
655
656 if (!make_temp_name_count_initialized_p)
657 {
658 make_temp_name_count = (unsigned) time (NULL);
659 make_temp_name_count_initialized_p = 1;
660 }
661
662 while (1)
663 {
664 struct stat ignored;
665 unsigned num = make_temp_name_count;
666
667 p[0] = make_temp_name_tbl[num & 63], num >>= 6;
668 p[1] = make_temp_name_tbl[num & 63], num >>= 6;
669 p[2] = make_temp_name_tbl[num & 63], num >>= 6;
670
671 /* Poor man's congruential RN generator. Replace with
672 ++make_temp_name_count for debugging. */
673 make_temp_name_count += 25229;
674 make_temp_name_count %= 225307;
675
676 if (stat (data, &ignored) < 0)
677 {
678 /* We want to return only if errno is ENOENT. */
679 if (errno == ENOENT)
680 return val;
681 else
682 /* The error here is dubious, but there is little else we
683 can do. The alternatives are to return nil, which is
684 as bad as (and in many cases worse than) throwing the
685 error, or to ignore the error, which will likely result
686 in looping through 225307 stat's, which is not only
687 dog-slow, but also useless since eventually nil would
688 have to be returned anyway. */
689 report_file_error ("Cannot create temporary name for prefix",
690 Fcons (prefix, Qnil));
691 /* not reached */
692 }
693 }
694 }
695
696
697 DEFUN ("make-temp-name", Fmake_temp_name, Smake_temp_name, 1, 1, 0,
698 doc: /* Generate temporary file name (string) starting with PREFIX (a string).
699 The Emacs process number forms part of the result,
700 so there is no danger of generating a name being used by another process.
701
702 In addition, this function makes an attempt to choose a name
703 which has no existing file. To make this work,
704 PREFIX should be an absolute file name.
705
706 There is a race condition between calling `make-temp-name' and creating the
707 file which opens all kinds of security holes. For that reason, you should
708 probably use `make-temp-file' instead, except in three circumstances:
709
710 * If you are creating the file in the user's home directory.
711 * If you are creating a directory rather than an ordinary file.
712 * If you are taking special precautions as `make-temp-file' does. */)
713 (Lisp_Object prefix)
714 {
715 return make_temp_name (prefix, 0);
716 }
717
718
719 \f
720 DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
721 doc: /* Convert filename NAME to absolute, and canonicalize it.
722 Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative
723 \(does not start with slash or tilde); if DEFAULT-DIRECTORY is nil or missing,
724 the current buffer's value of `default-directory' is used.
725 NAME should be a string that is a valid file name for the underlying
726 filesystem.
727 File name components that are `.' are removed, and
728 so are file name components followed by `..', along with the `..' itself;
729 note that these simplifications are done without checking the resulting
730 file names in the file system.
731 Multiple consecutive slashes are collapsed into a single slash,
732 except at the beginning of the file name when they are significant (e.g.,
733 UNC file names on MS-Windows.)
734 An initial `~/' expands to your home directory.
735 An initial `~USER/' expands to USER's home directory.
736 See also the function `substitute-in-file-name'.
737
738 For technical reasons, this function can return correct but
739 non-intuitive results for the root directory; for instance,
740 \(expand-file-name ".." "/") returns "/..". For this reason, use
741 \(directory-file-name (file-name-directory dirname)) to traverse a
742 filesystem tree, not (expand-file-name ".." dirname). */)
743 (Lisp_Object name, Lisp_Object default_directory)
744 {
745 /* These point to SDATA and need to be careful with string-relocation
746 during GC (via DECODE_FILE). */
747 char *nm, *newdir;
748 /* This should only point to alloca'd data. */
749 char *target;
750
751 int tlen;
752 struct passwd *pw;
753 #ifdef DOS_NT
754 int drive = 0;
755 int collapse_newdir = 1;
756 int is_escaped = 0;
757 #endif /* DOS_NT */
758 int length;
759 Lisp_Object handler, result;
760 int multibyte;
761 Lisp_Object hdir;
762
763 CHECK_STRING (name);
764
765 /* If the file name has special constructs in it,
766 call the corresponding file handler. */
767 handler = Ffind_file_name_handler (name, Qexpand_file_name);
768 if (!NILP (handler))
769 return call3 (handler, Qexpand_file_name, name, default_directory);
770
771 /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted. */
772 if (NILP (default_directory))
773 default_directory = BVAR (current_buffer, directory);
774 if (! STRINGP (default_directory))
775 {
776 #ifdef DOS_NT
777 /* "/" is not considered a root directory on DOS_NT, so using "/"
778 here causes an infinite recursion in, e.g., the following:
779
780 (let (default-directory)
781 (expand-file-name "a"))
782
783 To avoid this, we set default_directory to the root of the
784 current drive. */
785 default_directory = build_string (emacs_root_dir ());
786 #else
787 default_directory = build_string ("/");
788 #endif
789 }
790
791 if (!NILP (default_directory))
792 {
793 handler = Ffind_file_name_handler (default_directory, Qexpand_file_name);
794 if (!NILP (handler))
795 return call3 (handler, Qexpand_file_name, name, default_directory);
796 }
797
798 {
799 char *o = SSDATA (default_directory);
800
801 /* Make sure DEFAULT_DIRECTORY is properly expanded.
802 It would be better to do this down below where we actually use
803 default_directory. Unfortunately, calling Fexpand_file_name recursively
804 could invoke GC, and the strings might be relocated. This would
805 be annoying because we have pointers into strings lying around
806 that would need adjusting, and people would add new pointers to
807 the code and forget to adjust them, resulting in intermittent bugs.
808 Putting this call here avoids all that crud.
809
810 The EQ test avoids infinite recursion. */
811 if (! NILP (default_directory) && !EQ (default_directory, name)
812 /* Save time in some common cases - as long as default_directory
813 is not relative, it can be canonicalized with name below (if it
814 is needed at all) without requiring it to be expanded now. */
815 #ifdef DOS_NT
816 /* Detect MSDOS file names with drive specifiers. */
817 && ! (IS_DRIVE (o[0]) && IS_DEVICE_SEP (o[1])
818 && IS_DIRECTORY_SEP (o[2]))
819 #ifdef WINDOWSNT
820 /* Detect Windows file names in UNC format. */
821 && ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
822 #endif
823 #else /* not DOS_NT */
824 /* Detect Unix absolute file names (/... alone is not absolute on
825 DOS or Windows). */
826 && ! (IS_DIRECTORY_SEP (o[0]))
827 #endif /* not DOS_NT */
828 )
829 {
830 struct gcpro gcpro1;
831
832 GCPRO1 (name);
833 default_directory = Fexpand_file_name (default_directory, Qnil);
834 UNGCPRO;
835 }
836 }
837 name = FILE_SYSTEM_CASE (name);
838 multibyte = STRING_MULTIBYTE (name);
839 if (multibyte != STRING_MULTIBYTE (default_directory))
840 {
841 if (multibyte)
842 default_directory = string_to_multibyte (default_directory);
843 else
844 {
845 name = string_to_multibyte (name);
846 multibyte = 1;
847 }
848 }
849
850 /* Make a local copy of nm[] to protect it from GC in DECODE_FILE below. */
851 nm = (char *) alloca (SBYTES (name) + 1);
852 memcpy (nm, SSDATA (name), SBYTES (name) + 1);
853
854 #ifdef DOS_NT
855 /* Note if special escape prefix is present, but remove for now. */
856 if (nm[0] == '/' && nm[1] == ':')
857 {
858 is_escaped = 1;
859 nm += 2;
860 }
861
862 /* Find and remove drive specifier if present; this makes nm absolute
863 even if the rest of the name appears to be relative. Only look for
864 drive specifier at the beginning. */
865 if (IS_DRIVE (nm[0]) && IS_DEVICE_SEP (nm[1]))
866 {
867 drive = (unsigned char) nm[0];
868 nm += 2;
869 }
870
871 #ifdef WINDOWSNT
872 /* If we see "c://somedir", we want to strip the first slash after the
873 colon when stripping the drive letter. Otherwise, this expands to
874 "//somedir". */
875 if (drive && IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
876 nm++;
877
878 /* Discard any previous drive specifier if nm is now in UNC format. */
879 if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
880 {
881 drive = 0;
882 }
883 #endif /* WINDOWSNT */
884 #endif /* DOS_NT */
885
886 /* If nm is absolute, look for `/./' or `/../' or `//''sequences; if
887 none are found, we can probably return right away. We will avoid
888 allocating a new string if name is already fully expanded. */
889 if (
890 IS_DIRECTORY_SEP (nm[0])
891 #ifdef MSDOS
892 && drive && !is_escaped
893 #endif
894 #ifdef WINDOWSNT
895 && (drive || IS_DIRECTORY_SEP (nm[1])) && !is_escaped
896 #endif
897 )
898 {
899 /* If it turns out that the filename we want to return is just a
900 suffix of FILENAME, we don't need to go through and edit
901 things; we just need to construct a new string using data
902 starting at the middle of FILENAME. If we set lose to a
903 non-zero value, that means we've discovered that we can't do
904 that cool trick. */
905 int lose = 0;
906 char *p = nm;
907
908 while (*p)
909 {
910 /* Since we know the name is absolute, we can assume that each
911 element starts with a "/". */
912
913 /* "." and ".." are hairy. */
914 if (IS_DIRECTORY_SEP (p[0])
915 && p[1] == '.'
916 && (IS_DIRECTORY_SEP (p[2])
917 || p[2] == 0
918 || (p[2] == '.' && (IS_DIRECTORY_SEP (p[3])
919 || p[3] == 0))))
920 lose = 1;
921 /* We want to replace multiple `/' in a row with a single
922 slash. */
923 else if (p > nm
924 && IS_DIRECTORY_SEP (p[0])
925 && IS_DIRECTORY_SEP (p[1]))
926 lose = 1;
927 p++;
928 }
929 if (!lose)
930 {
931 #ifdef DOS_NT
932 /* Make sure directories are all separated with /, but
933 avoid allocation of a new string when not required. */
934 dostounix_filename (nm);
935 #ifdef WINDOWSNT
936 if (IS_DIRECTORY_SEP (nm[1]))
937 {
938 if (strcmp (nm, SSDATA (name)) != 0)
939 name = make_specified_string (nm, -1, strlen (nm), multibyte);
940 }
941 else
942 #endif
943 /* drive must be set, so this is okay */
944 if (strcmp (nm - 2, SSDATA (name)) != 0)
945 {
946 char temp[] = " :";
947
948 name = make_specified_string (nm, -1, p - nm, multibyte);
949 temp[0] = DRIVE_LETTER (drive);
950 name = concat2 (build_string (temp), name);
951 }
952 return name;
953 #else /* not DOS_NT */
954 if (strcmp (nm, SSDATA (name)) == 0)
955 return name;
956 return make_specified_string (nm, -1, strlen (nm), multibyte);
957 #endif /* not DOS_NT */
958 }
959 }
960
961 /* At this point, nm might or might not be an absolute file name. We
962 need to expand ~ or ~user if present, otherwise prefix nm with
963 default_directory if nm is not absolute, and finally collapse /./
964 and /foo/../ sequences.
965
966 We set newdir to be the appropriate prefix if one is needed:
967 - the relevant user directory if nm starts with ~ or ~user
968 - the specified drive's working dir (DOS/NT only) if nm does not
969 start with /
970 - the value of default_directory.
971
972 Note that these prefixes are not guaranteed to be absolute (except
973 for the working dir of a drive). Therefore, to ensure we always
974 return an absolute name, if the final prefix is not absolute we
975 append it to the current working directory. */
976
977 newdir = 0;
978
979 if (nm[0] == '~') /* prefix ~ */
980 {
981 if (IS_DIRECTORY_SEP (nm[1])
982 || nm[1] == 0) /* ~ by itself */
983 {
984 Lisp_Object tem;
985
986 if (!(newdir = egetenv ("HOME")))
987 newdir = "";
988 nm++;
989 /* egetenv may return a unibyte string, which will bite us since
990 we expect the directory to be multibyte. */
991 tem = build_string (newdir);
992 if (!STRING_MULTIBYTE (tem))
993 {
994 hdir = DECODE_FILE (tem);
995 newdir = SSDATA (hdir);
996 }
997 #ifdef DOS_NT
998 collapse_newdir = 0;
999 #endif
1000 }
1001 else /* ~user/filename */
1002 {
1003 char *o, *p;
1004 for (p = nm; *p && (!IS_DIRECTORY_SEP (*p)); p++);
1005 o = alloca (p - nm + 1);
1006 memcpy (o, nm, p - nm);
1007 o [p - nm] = 0;
1008
1009 BLOCK_INPUT;
1010 pw = (struct passwd *) getpwnam (o + 1);
1011 UNBLOCK_INPUT;
1012 if (pw)
1013 {
1014 newdir = pw->pw_dir;
1015 nm = p;
1016 #ifdef DOS_NT
1017 collapse_newdir = 0;
1018 #endif
1019 }
1020
1021 /* If we don't find a user of that name, leave the name
1022 unchanged; don't move nm forward to p. */
1023 }
1024 }
1025
1026 #ifdef DOS_NT
1027 /* On DOS and Windows, nm is absolute if a drive name was specified;
1028 use the drive's current directory as the prefix if needed. */
1029 if (!newdir && drive)
1030 {
1031 /* Get default directory if needed to make nm absolute. */
1032 if (!IS_DIRECTORY_SEP (nm[0]))
1033 {
1034 newdir = alloca (MAXPATHLEN + 1);
1035 if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
1036 newdir = NULL;
1037 }
1038 if (!newdir)
1039 {
1040 /* Either nm starts with /, or drive isn't mounted. */
1041 newdir = alloca (4);
1042 newdir[0] = DRIVE_LETTER (drive);
1043 newdir[1] = ':';
1044 newdir[2] = '/';
1045 newdir[3] = 0;
1046 }
1047 }
1048 #endif /* DOS_NT */
1049
1050 /* Finally, if no prefix has been specified and nm is not absolute,
1051 then it must be expanded relative to default_directory. */
1052
1053 if (1
1054 #ifndef DOS_NT
1055 /* /... alone is not absolute on DOS and Windows. */
1056 && !IS_DIRECTORY_SEP (nm[0])
1057 #endif
1058 #ifdef WINDOWSNT
1059 && !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
1060 #endif
1061 && !newdir)
1062 {
1063 newdir = SSDATA (default_directory);
1064 #ifdef DOS_NT
1065 /* Note if special escape prefix is present, but remove for now. */
1066 if (newdir[0] == '/' && newdir[1] == ':')
1067 {
1068 is_escaped = 1;
1069 newdir += 2;
1070 }
1071 #endif
1072 }
1073
1074 #ifdef DOS_NT
1075 if (newdir)
1076 {
1077 /* First ensure newdir is an absolute name. */
1078 if (
1079 /* Detect MSDOS file names with drive specifiers. */
1080 ! (IS_DRIVE (newdir[0])
1081 && IS_DEVICE_SEP (newdir[1]) && IS_DIRECTORY_SEP (newdir[2]))
1082 #ifdef WINDOWSNT
1083 /* Detect Windows file names in UNC format. */
1084 && ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1085 #endif
1086 )
1087 {
1088 /* Effectively, let newdir be (expand-file-name newdir cwd).
1089 Because of the admonition against calling expand-file-name
1090 when we have pointers into lisp strings, we accomplish this
1091 indirectly by prepending newdir to nm if necessary, and using
1092 cwd (or the wd of newdir's drive) as the new newdir. */
1093
1094 if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
1095 {
1096 drive = (unsigned char) newdir[0];
1097 newdir += 2;
1098 }
1099 if (!IS_DIRECTORY_SEP (nm[0]))
1100 {
1101 char * tmp = alloca (strlen (newdir) + strlen (nm) + 2);
1102 file_name_as_directory (tmp, newdir);
1103 strcat (tmp, nm);
1104 nm = tmp;
1105 }
1106 newdir = alloca (MAXPATHLEN + 1);
1107 if (drive)
1108 {
1109 if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
1110 newdir = "/";
1111 }
1112 else
1113 getwd (newdir);
1114 }
1115
1116 /* Strip off drive name from prefix, if present. */
1117 if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
1118 {
1119 drive = newdir[0];
1120 newdir += 2;
1121 }
1122
1123 /* Keep only a prefix from newdir if nm starts with slash
1124 (//server/share for UNC, nothing otherwise). */
1125 if (IS_DIRECTORY_SEP (nm[0]) && collapse_newdir)
1126 {
1127 #ifdef WINDOWSNT
1128 if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1129 {
1130 char *p;
1131 newdir = strcpy (alloca (strlen (newdir) + 1), newdir);
1132 p = newdir + 2;
1133 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1134 p++;
1135 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1136 *p = 0;
1137 }
1138 else
1139 #endif
1140 newdir = "";
1141 }
1142 }
1143 #endif /* DOS_NT */
1144
1145 if (newdir)
1146 {
1147 /* Get rid of any slash at the end of newdir, unless newdir is
1148 just / or // (an incomplete UNC name). */
1149 length = strlen (newdir);
1150 if (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
1151 #ifdef WINDOWSNT
1152 && !(length == 2 && IS_DIRECTORY_SEP (newdir[0]))
1153 #endif
1154 )
1155 {
1156 char *temp = (char *) alloca (length);
1157 memcpy (temp, newdir, length - 1);
1158 temp[length - 1] = 0;
1159 newdir = temp;
1160 }
1161 tlen = length + 1;
1162 }
1163 else
1164 tlen = 0;
1165
1166 /* Now concatenate the directory and name to new space in the stack frame */
1167 tlen += strlen (nm) + 1;
1168 #ifdef DOS_NT
1169 /* Reserve space for drive specifier and escape prefix, since either
1170 or both may need to be inserted. (The Microsoft x86 compiler
1171 produces incorrect code if the following two lines are combined.) */
1172 target = (char *) alloca (tlen + 4);
1173 target += 4;
1174 #else /* not DOS_NT */
1175 target = (char *) alloca (tlen);
1176 #endif /* not DOS_NT */
1177 *target = 0;
1178
1179 if (newdir)
1180 {
1181 if (nm[0] == 0 || IS_DIRECTORY_SEP (nm[0]))
1182 {
1183 #ifdef DOS_NT
1184 /* If newdir is effectively "C:/", then the drive letter will have
1185 been stripped and newdir will be "/". Concatenating with an
1186 absolute directory in nm produces "//", which will then be
1187 incorrectly treated as a network share. Ignore newdir in
1188 this case (keeping the drive letter). */
1189 if (!(drive && nm[0] && IS_DIRECTORY_SEP (newdir[0])
1190 && newdir[1] == '\0'))
1191 #endif
1192 strcpy (target, newdir);
1193 }
1194 else
1195 file_name_as_directory (target, newdir);
1196 }
1197
1198 strcat (target, nm);
1199
1200 /* Now canonicalize by removing `//', `/.' and `/foo/..' if they
1201 appear. */
1202 {
1203 char *p = target;
1204 char *o = target;
1205
1206 while (*p)
1207 {
1208 if (!IS_DIRECTORY_SEP (*p))
1209 {
1210 *o++ = *p++;
1211 }
1212 else if (p[1] == '.'
1213 && (IS_DIRECTORY_SEP (p[2])
1214 || p[2] == 0))
1215 {
1216 /* If "/." is the entire filename, keep the "/". Otherwise,
1217 just delete the whole "/.". */
1218 if (o == target && p[2] == '\0')
1219 *o++ = *p;
1220 p += 2;
1221 }
1222 else if (p[1] == '.' && p[2] == '.'
1223 /* `/../' is the "superroot" on certain file systems.
1224 Turned off on DOS_NT systems because they have no
1225 "superroot" and because this causes us to produce
1226 file names like "d:/../foo" which fail file-related
1227 functions of the underlying OS. (To reproduce, try a
1228 long series of "../../" in default_directory, longer
1229 than the number of levels from the root.) */
1230 #ifndef DOS_NT
1231 && o != target
1232 #endif
1233 && (IS_DIRECTORY_SEP (p[3]) || p[3] == 0))
1234 {
1235 #ifdef WINDOWSNT
1236 char *prev_o = o;
1237 #endif
1238 while (o != target && (--o) && !IS_DIRECTORY_SEP (*o))
1239 ;
1240 #ifdef WINDOWSNT
1241 /* Don't go below server level in UNC filenames. */
1242 if (o == target + 1 && IS_DIRECTORY_SEP (*o)
1243 && IS_DIRECTORY_SEP (*target))
1244 o = prev_o;
1245 else
1246 #endif
1247 /* Keep initial / only if this is the whole name. */
1248 if (o == target && IS_ANY_SEP (*o) && p[3] == 0)
1249 ++o;
1250 p += 3;
1251 }
1252 else if (p > target && IS_DIRECTORY_SEP (p[1]))
1253 /* Collapse multiple `/' in a row. */
1254 p++;
1255 else
1256 {
1257 *o++ = *p++;
1258 }
1259 }
1260
1261 #ifdef DOS_NT
1262 /* At last, set drive name. */
1263 #ifdef WINDOWSNT
1264 /* Except for network file name. */
1265 if (!(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1])))
1266 #endif /* WINDOWSNT */
1267 {
1268 if (!drive) abort ();
1269 target -= 2;
1270 target[0] = DRIVE_LETTER (drive);
1271 target[1] = ':';
1272 }
1273 /* Reinsert the escape prefix if required. */
1274 if (is_escaped)
1275 {
1276 target -= 2;
1277 target[0] = '/';
1278 target[1] = ':';
1279 }
1280 dostounix_filename (target);
1281 #endif /* DOS_NT */
1282
1283 result = make_specified_string (target, -1, o - target, multibyte);
1284 }
1285
1286 /* Again look to see if the file name has special constructs in it
1287 and perhaps call the corresponding file handler. This is needed
1288 for filenames such as "/foo/../user@host:/bar/../baz". Expanding
1289 the ".." component gives us "/user@host:/bar/../baz" which needs
1290 to be expanded again. */
1291 handler = Ffind_file_name_handler (result, Qexpand_file_name);
1292 if (!NILP (handler))
1293 return call3 (handler, Qexpand_file_name, result, default_directory);
1294
1295 return result;
1296 }
1297
1298 #if 0
1299 /* PLEASE DO NOT DELETE THIS COMMENTED-OUT VERSION!
1300 This is the old version of expand-file-name, before it was thoroughly
1301 rewritten for Emacs 10.31. We leave this version here commented-out,
1302 because the code is very complex and likely to have subtle bugs. If
1303 bugs _are_ found, it might be of interest to look at the old code and
1304 see what did it do in the relevant situation.
1305
1306 Don't remove this code: it's true that it will be accessible
1307 from the repository, but a few years from deletion, people will
1308 forget it is there. */
1309
1310 /* Changed this DEFUN to a DEAFUN, so as not to confuse `make-docfile'. */
1311 DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
1312 "Convert FILENAME to absolute, and canonicalize it.\n\
1313 Second arg DEFAULT is directory to start with if FILENAME is relative\n\
1314 \(does not start with slash); if DEFAULT is nil or missing,\n\
1315 the current buffer's value of default-directory is used.\n\
1316 Filenames containing `.' or `..' as components are simplified;\n\
1317 initial `~/' expands to your home directory.\n\
1318 See also the function `substitute-in-file-name'.")
1319 (name, defalt)
1320 Lisp_Object name, defalt;
1321 {
1322 unsigned char *nm;
1323
1324 register unsigned char *newdir, *p, *o;
1325 int tlen;
1326 unsigned char *target;
1327 struct passwd *pw;
1328 int lose;
1329
1330 CHECK_STRING (name);
1331 nm = SDATA (name);
1332
1333 /* If nm is absolute, flush ...// and detect /./ and /../.
1334 If no /./ or /../ we can return right away. */
1335 if (nm[0] == '/')
1336 {
1337 p = nm;
1338 lose = 0;
1339 while (*p)
1340 {
1341 if (p[0] == '/' && p[1] == '/'
1342 )
1343 nm = p + 1;
1344 if (p[0] == '/' && p[1] == '~')
1345 nm = p + 1, lose = 1;
1346 if (p[0] == '/' && p[1] == '.'
1347 && (p[2] == '/' || p[2] == 0
1348 || (p[2] == '.' && (p[3] == '/' || p[3] == 0))))
1349 lose = 1;
1350 p++;
1351 }
1352 if (!lose)
1353 {
1354 if (nm == SDATA (name))
1355 return name;
1356 return build_string (nm);
1357 }
1358 }
1359
1360 /* Now determine directory to start with and put it in NEWDIR */
1361
1362 newdir = 0;
1363
1364 if (nm[0] == '~') /* prefix ~ */
1365 if (nm[1] == '/' || nm[1] == 0)/* ~/filename */
1366 {
1367 if (!(newdir = (unsigned char *) egetenv ("HOME")))
1368 newdir = (unsigned char *) "";
1369 nm++;
1370 }
1371 else /* ~user/filename */
1372 {
1373 /* Get past ~ to user */
1374 unsigned char *user = nm + 1;
1375 /* Find end of name. */
1376 unsigned char *ptr = (unsigned char *) strchr (user, '/');
1377 int len = ptr ? ptr - user : strlen (user);
1378 /* Copy the user name into temp storage. */
1379 o = (unsigned char *) alloca (len + 1);
1380 memcpy (o, user, len);
1381 o[len] = 0;
1382
1383 /* Look up the user name. */
1384 BLOCK_INPUT;
1385 pw = (struct passwd *) getpwnam (o + 1);
1386 UNBLOCK_INPUT;
1387 if (!pw)
1388 error ("\"%s\" isn't a registered user", o + 1);
1389
1390 newdir = (unsigned char *) pw->pw_dir;
1391
1392 /* Discard the user name from NM. */
1393 nm += len;
1394 }
1395
1396 if (nm[0] != '/' && !newdir)
1397 {
1398 if (NILP (defalt))
1399 defalt = current_buffer->directory;
1400 CHECK_STRING (defalt);
1401 newdir = SDATA (defalt);
1402 }
1403
1404 /* Now concatenate the directory and name to new space in the stack frame */
1405
1406 tlen = (newdir ? strlen (newdir) + 1 : 0) + strlen (nm) + 1;
1407 target = (unsigned char *) alloca (tlen);
1408 *target = 0;
1409
1410 if (newdir)
1411 {
1412 if (nm[0] == 0 || nm[0] == '/')
1413 strcpy (target, newdir);
1414 else
1415 file_name_as_directory (target, newdir);
1416 }
1417
1418 strcat (target, nm);
1419
1420 /* Now canonicalize by removing /. and /foo/.. if they appear */
1421
1422 p = target;
1423 o = target;
1424
1425 while (*p)
1426 {
1427 if (*p != '/')
1428 {
1429 *o++ = *p++;
1430 }
1431 else if (!strncmp (p, "//", 2)
1432 )
1433 {
1434 o = target;
1435 p++;
1436 }
1437 else if (p[0] == '/' && p[1] == '.'
1438 && (p[2] == '/' || p[2] == 0))
1439 p += 2;
1440 else if (!strncmp (p, "/..", 3)
1441 /* `/../' is the "superroot" on certain file systems. */
1442 && o != target
1443 && (p[3] == '/' || p[3] == 0))
1444 {
1445 while (o != target && *--o != '/')
1446 ;
1447 if (o == target && *o == '/')
1448 ++o;
1449 p += 3;
1450 }
1451 else
1452 {
1453 *o++ = *p++;
1454 }
1455 }
1456
1457 return make_string (target, o - target);
1458 }
1459 #endif
1460 \f
1461 /* If /~ or // appears, discard everything through first slash. */
1462 static int
1463 file_name_absolute_p (const char *filename)
1464 {
1465 return
1466 (IS_DIRECTORY_SEP (*filename) || *filename == '~'
1467 #ifdef DOS_NT
1468 || (IS_DRIVE (*filename) && IS_DEVICE_SEP (filename[1])
1469 && IS_DIRECTORY_SEP (filename[2]))
1470 #endif
1471 );
1472 }
1473
1474 static char *
1475 search_embedded_absfilename (char *nm, char *endp)
1476 {
1477 char *p, *s;
1478
1479 for (p = nm + 1; p < endp; p++)
1480 {
1481 if ((0
1482 || IS_DIRECTORY_SEP (p[-1]))
1483 && file_name_absolute_p (p)
1484 #if defined (WINDOWSNT) || defined(CYGWIN)
1485 /* // at start of file name is meaningful in Apollo,
1486 WindowsNT and Cygwin systems. */
1487 && !(IS_DIRECTORY_SEP (p[0]) && p - 1 == nm)
1488 #endif /* not (WINDOWSNT || CYGWIN) */
1489 )
1490 {
1491 for (s = p; *s && (!IS_DIRECTORY_SEP (*s)); s++);
1492 if (p[0] == '~' && s > p + 1) /* we've got "/~something/" */
1493 {
1494 char *o = alloca (s - p + 1);
1495 struct passwd *pw;
1496 memcpy (o, p, s - p);
1497 o [s - p] = 0;
1498
1499 /* If we have ~user and `user' exists, discard
1500 everything up to ~. But if `user' does not exist, leave
1501 ~user alone, it might be a literal file name. */
1502 BLOCK_INPUT;
1503 pw = getpwnam (o + 1);
1504 UNBLOCK_INPUT;
1505 if (pw)
1506 return p;
1507 }
1508 else
1509 return p;
1510 }
1511 }
1512 return NULL;
1513 }
1514
1515 DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
1516 Ssubstitute_in_file_name, 1, 1, 0,
1517 doc: /* Substitute environment variables referred to in FILENAME.
1518 `$FOO' where FOO is an environment variable name means to substitute
1519 the value of that variable. The variable name should be terminated
1520 with a character not a letter, digit or underscore; otherwise, enclose
1521 the entire variable name in braces.
1522
1523 If `/~' appears, all of FILENAME through that `/' is discarded.
1524 If `//' appears, everything up to and including the first of
1525 those `/' is discarded. */)
1526 (Lisp_Object filename)
1527 {
1528 char *nm;
1529
1530 register char *s, *p, *o, *x, *endp;
1531 char *target = NULL;
1532 int total = 0;
1533 int substituted = 0;
1534 int multibyte;
1535 char *xnm;
1536 Lisp_Object handler;
1537
1538 CHECK_STRING (filename);
1539
1540 multibyte = STRING_MULTIBYTE (filename);
1541
1542 /* If the file name has special constructs in it,
1543 call the corresponding file handler. */
1544 handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
1545 if (!NILP (handler))
1546 return call2 (handler, Qsubstitute_in_file_name, filename);
1547
1548 /* Always work on a copy of the string, in case GC happens during
1549 decode of environment variables, causing the original Lisp_String
1550 data to be relocated. */
1551 nm = (char *) alloca (SBYTES (filename) + 1);
1552 memcpy (nm, SDATA (filename), SBYTES (filename) + 1);
1553
1554 #ifdef DOS_NT
1555 dostounix_filename (nm);
1556 substituted = (strcmp (nm, SDATA (filename)) != 0);
1557 #endif
1558 endp = nm + SBYTES (filename);
1559
1560 /* If /~ or // appears, discard everything through first slash. */
1561 p = search_embedded_absfilename (nm, endp);
1562 if (p)
1563 /* Start over with the new string, so we check the file-name-handler
1564 again. Important with filenames like "/home/foo//:/hello///there"
1565 which whould substitute to "/:/hello///there" rather than "/there". */
1566 return Fsubstitute_in_file_name
1567 (make_specified_string (p, -1, endp - p, multibyte));
1568
1569 /* See if any variables are substituted into the string
1570 and find the total length of their values in `total' */
1571
1572 for (p = nm; p != endp;)
1573 if (*p != '$')
1574 p++;
1575 else
1576 {
1577 p++;
1578 if (p == endp)
1579 goto badsubst;
1580 else if (*p == '$')
1581 {
1582 /* "$$" means a single "$" */
1583 p++;
1584 total -= 1;
1585 substituted = 1;
1586 continue;
1587 }
1588 else if (*p == '{')
1589 {
1590 o = ++p;
1591 while (p != endp && *p != '}') p++;
1592 if (*p != '}') goto missingclose;
1593 s = p;
1594 }
1595 else
1596 {
1597 o = p;
1598 while (p != endp && (isalnum (*p) || *p == '_')) p++;
1599 s = p;
1600 }
1601
1602 /* Copy out the variable name */
1603 target = (char *) alloca (s - o + 1);
1604 strncpy (target, o, s - o);
1605 target[s - o] = 0;
1606 #ifdef DOS_NT
1607 strupr (target); /* $home == $HOME etc. */
1608 #endif /* DOS_NT */
1609
1610 /* Get variable value */
1611 o = egetenv (target);
1612 if (o)
1613 {
1614 /* Don't try to guess a maximum length - UTF8 can use up to
1615 four bytes per character. This code is unlikely to run
1616 in a situation that requires performance, so decoding the
1617 env variables twice should be acceptable. Note that
1618 decoding may cause a garbage collect. */
1619 Lisp_Object orig, decoded;
1620 orig = make_unibyte_string (o, strlen (o));
1621 decoded = DECODE_FILE (orig);
1622 total += SBYTES (decoded);
1623 substituted = 1;
1624 }
1625 else if (*p == '}')
1626 goto badvar;
1627 }
1628
1629 if (!substituted)
1630 return filename;
1631
1632 /* If substitution required, recopy the string and do it */
1633 /* Make space in stack frame for the new copy */
1634 xnm = (char *) alloca (SBYTES (filename) + total + 1);
1635 x = xnm;
1636
1637 /* Copy the rest of the name through, replacing $ constructs with values */
1638 for (p = nm; *p;)
1639 if (*p != '$')
1640 *x++ = *p++;
1641 else
1642 {
1643 p++;
1644 if (p == endp)
1645 goto badsubst;
1646 else if (*p == '$')
1647 {
1648 *x++ = *p++;
1649 continue;
1650 }
1651 else if (*p == '{')
1652 {
1653 o = ++p;
1654 while (p != endp && *p != '}') p++;
1655 if (*p != '}') goto missingclose;
1656 s = p++;
1657 }
1658 else
1659 {
1660 o = p;
1661 while (p != endp && (isalnum (*p) || *p == '_')) p++;
1662 s = p;
1663 }
1664
1665 /* Copy out the variable name */
1666 target = (char *) alloca (s - o + 1);
1667 strncpy (target, o, s - o);
1668 target[s - o] = 0;
1669 #ifdef DOS_NT
1670 strupr (target); /* $home == $HOME etc. */
1671 #endif /* DOS_NT */
1672
1673 /* Get variable value */
1674 o = egetenv (target);
1675 if (!o)
1676 {
1677 *x++ = '$';
1678 strcpy (x, target); x+= strlen (target);
1679 }
1680 else
1681 {
1682 Lisp_Object orig, decoded;
1683 int orig_length, decoded_length;
1684 orig_length = strlen (o);
1685 orig = make_unibyte_string (o, orig_length);
1686 decoded = DECODE_FILE (orig);
1687 decoded_length = SBYTES (decoded);
1688 strncpy (x, SSDATA (decoded), decoded_length);
1689 x += decoded_length;
1690
1691 /* If environment variable needed decoding, return value
1692 needs to be multibyte. */
1693 if (decoded_length != orig_length
1694 || strncmp (SSDATA (decoded), o, orig_length))
1695 multibyte = 1;
1696 }
1697 }
1698
1699 *x = 0;
1700
1701 /* If /~ or // appears, discard everything through first slash. */
1702 while ((p = search_embedded_absfilename (xnm, x)))
1703 /* This time we do not start over because we've already expanded envvars
1704 and replaced $$ with $. Maybe we should start over as well, but we'd
1705 need to quote some $ to $$ first. */
1706 xnm = p;
1707
1708 return make_specified_string (xnm, -1, x - xnm, multibyte);
1709
1710 badsubst:
1711 error ("Bad format environment-variable substitution");
1712 missingclose:
1713 error ("Missing \"}\" in environment-variable substitution");
1714 badvar:
1715 error ("Substituting nonexistent environment variable \"%s\"", target);
1716
1717 /* NOTREACHED */
1718 return Qnil;
1719 }
1720 \f
1721 /* A slightly faster and more convenient way to get
1722 (directory-file-name (expand-file-name FOO)). */
1723
1724 Lisp_Object
1725 expand_and_dir_to_file (Lisp_Object filename, Lisp_Object defdir)
1726 {
1727 register Lisp_Object absname;
1728
1729 absname = Fexpand_file_name (filename, defdir);
1730
1731 /* Remove final slash, if any (unless this is the root dir).
1732 stat behaves differently depending! */
1733 if (SCHARS (absname) > 1
1734 && IS_DIRECTORY_SEP (SREF (absname, SBYTES (absname) - 1))
1735 && !IS_DEVICE_SEP (SREF (absname, SBYTES (absname)-2)))
1736 /* We cannot take shortcuts; they might be wrong for magic file names. */
1737 absname = Fdirectory_file_name (absname);
1738 return absname;
1739 }
1740 \f
1741 /* Signal an error if the file ABSNAME already exists.
1742 If INTERACTIVE is nonzero, ask the user whether to proceed,
1743 and bypass the error if the user says to go ahead.
1744 QUERYSTRING is a name for the action that is being considered
1745 to alter the file.
1746
1747 *STATPTR is used to store the stat information if the file exists.
1748 If the file does not exist, STATPTR->st_mode is set to 0.
1749 If STATPTR is null, we don't store into it.
1750
1751 If QUICK is nonzero, we ask for y or n, not yes or no. */
1752
1753 void
1754 barf_or_query_if_file_exists (Lisp_Object absname, const char *querystring,
1755 int interactive, struct stat *statptr, int quick)
1756 {
1757 register Lisp_Object tem, encoded_filename;
1758 struct stat statbuf;
1759 struct gcpro gcpro1;
1760
1761 encoded_filename = ENCODE_FILE (absname);
1762
1763 /* stat is a good way to tell whether the file exists,
1764 regardless of what access permissions it has. */
1765 if (lstat (SSDATA (encoded_filename), &statbuf) >= 0)
1766 {
1767 if (! interactive)
1768 xsignal2 (Qfile_already_exists,
1769 build_string ("File already exists"), absname);
1770 GCPRO1 (absname);
1771 tem = format2 ("File %s already exists; %s anyway? ",
1772 absname, build_string (querystring));
1773 if (quick)
1774 tem = call1 (intern ("y-or-n-p"), tem);
1775 else
1776 tem = do_yes_or_no_p (tem);
1777 UNGCPRO;
1778 if (NILP (tem))
1779 xsignal2 (Qfile_already_exists,
1780 build_string ("File already exists"), absname);
1781 if (statptr)
1782 *statptr = statbuf;
1783 }
1784 else
1785 {
1786 if (statptr)
1787 statptr->st_mode = 0;
1788 }
1789 return;
1790 }
1791
1792 DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 6,
1793 "fCopy file: \nGCopy %s to file: \np\nP",
1794 doc: /* Copy FILE to NEWNAME. Both args must be strings.
1795 If NEWNAME names a directory, copy FILE there.
1796
1797 This function always sets the file modes of the output file to match
1798 the input file.
1799
1800 The optional third argument OK-IF-ALREADY-EXISTS specifies what to do
1801 if file NEWNAME already exists. If OK-IF-ALREADY-EXISTS is nil, we
1802 signal a `file-already-exists' error without overwriting. If
1803 OK-IF-ALREADY-EXISTS is a number, we request confirmation from the user
1804 about overwriting; this is what happens in interactive use with M-x.
1805 Any other value for OK-IF-ALREADY-EXISTS means to overwrite the
1806 existing file.
1807
1808 Fourth arg KEEP-TIME non-nil means give the output file the same
1809 last-modified time as the old one. (This works on only some systems.)
1810
1811 A prefix arg makes KEEP-TIME non-nil.
1812
1813 If PRESERVE-UID-GID is non-nil, we try to transfer the
1814 uid and gid of FILE to NEWNAME.
1815
1816 If PRESERVE-SELINUX-CONTEXT is non-nil and SELinux is enabled
1817 on the system, we copy the SELinux context of FILE to NEWNAME. */)
1818 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists, Lisp_Object keep_time, Lisp_Object preserve_uid_gid, Lisp_Object preserve_selinux_context)
1819 {
1820 int ifd, ofd, n;
1821 char buf[16 * 1024];
1822 struct stat st, out_st;
1823 Lisp_Object handler;
1824 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1825 int count = SPECPDL_INDEX ();
1826 int input_file_statable_p;
1827 Lisp_Object encoded_file, encoded_newname;
1828 #if HAVE_LIBSELINUX
1829 security_context_t con;
1830 int fail, conlength = 0;
1831 #endif
1832
1833 encoded_file = encoded_newname = Qnil;
1834 GCPRO4 (file, newname, encoded_file, encoded_newname);
1835 CHECK_STRING (file);
1836 CHECK_STRING (newname);
1837
1838 if (!NILP (Ffile_directory_p (newname)))
1839 newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname);
1840 else
1841 newname = Fexpand_file_name (newname, Qnil);
1842
1843 file = Fexpand_file_name (file, Qnil);
1844
1845 /* If the input file name has special constructs in it,
1846 call the corresponding file handler. */
1847 handler = Ffind_file_name_handler (file, Qcopy_file);
1848 /* Likewise for output file name. */
1849 if (NILP (handler))
1850 handler = Ffind_file_name_handler (newname, Qcopy_file);
1851 if (!NILP (handler))
1852 RETURN_UNGCPRO (call7 (handler, Qcopy_file, file, newname,
1853 ok_if_already_exists, keep_time, preserve_uid_gid,
1854 preserve_selinux_context));
1855
1856 encoded_file = ENCODE_FILE (file);
1857 encoded_newname = ENCODE_FILE (newname);
1858
1859 if (NILP (ok_if_already_exists)
1860 || INTEGERP (ok_if_already_exists))
1861 barf_or_query_if_file_exists (newname, "copy to it",
1862 INTEGERP (ok_if_already_exists), &out_st, 0);
1863 else if (stat (SSDATA (encoded_newname), &out_st) < 0)
1864 out_st.st_mode = 0;
1865
1866 #ifdef WINDOWSNT
1867 if (!CopyFile (SDATA (encoded_file),
1868 SDATA (encoded_newname),
1869 FALSE))
1870 report_file_error ("Copying file", Fcons (file, Fcons (newname, Qnil)));
1871 /* CopyFile retains the timestamp by default. */
1872 else if (NILP (keep_time))
1873 {
1874 EMACS_TIME now;
1875 DWORD attributes;
1876 char * filename;
1877
1878 EMACS_GET_TIME (now);
1879 filename = SDATA (encoded_newname);
1880
1881 /* Ensure file is writable while its modified time is set. */
1882 attributes = GetFileAttributes (filename);
1883 SetFileAttributes (filename, attributes & ~FILE_ATTRIBUTE_READONLY);
1884 if (set_file_times (filename, now, now))
1885 {
1886 /* Restore original attributes. */
1887 SetFileAttributes (filename, attributes);
1888 xsignal2 (Qfile_date_error,
1889 build_string ("Cannot set file date"), newname);
1890 }
1891 /* Restore original attributes. */
1892 SetFileAttributes (filename, attributes);
1893 }
1894 #else /* not WINDOWSNT */
1895 immediate_quit = 1;
1896 ifd = emacs_open (SSDATA (encoded_file), O_RDONLY, 0);
1897 immediate_quit = 0;
1898
1899 if (ifd < 0)
1900 report_file_error ("Opening input file", Fcons (file, Qnil));
1901
1902 record_unwind_protect (close_file_unwind, make_number (ifd));
1903
1904 /* We can only copy regular files and symbolic links. Other files are not
1905 copyable by us. */
1906 input_file_statable_p = (fstat (ifd, &st) >= 0);
1907
1908 #if HAVE_LIBSELINUX
1909 if (!NILP (preserve_selinux_context) && is_selinux_enabled ())
1910 {
1911 conlength = fgetfilecon (ifd, &con);
1912 if (conlength == -1)
1913 report_file_error ("Doing fgetfilecon", Fcons (file, Qnil));
1914 }
1915 #endif
1916
1917 if (out_st.st_mode != 0
1918 && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
1919 {
1920 errno = 0;
1921 report_file_error ("Input and output files are the same",
1922 Fcons (file, Fcons (newname, Qnil)));
1923 }
1924
1925 #if defined (S_ISREG) && defined (S_ISLNK)
1926 if (input_file_statable_p)
1927 {
1928 if (!(S_ISREG (st.st_mode)) && !(S_ISLNK (st.st_mode)))
1929 {
1930 #if defined (EISDIR)
1931 /* Get a better looking error message. */
1932 errno = EISDIR;
1933 #endif /* EISDIR */
1934 report_file_error ("Non-regular file", Fcons (file, Qnil));
1935 }
1936 }
1937 #endif /* S_ISREG && S_ISLNK */
1938
1939 #ifdef MSDOS
1940 /* System's default file type was set to binary by _fmode in emacs.c. */
1941 ofd = emacs_open (SDATA (encoded_newname),
1942 O_WRONLY | O_TRUNC | O_CREAT
1943 | (NILP (ok_if_already_exists) ? O_EXCL : 0),
1944 S_IREAD | S_IWRITE);
1945 #else /* not MSDOS */
1946 ofd = emacs_open (SSDATA (encoded_newname),
1947 O_WRONLY | O_TRUNC | O_CREAT
1948 | (NILP (ok_if_already_exists) ? O_EXCL : 0),
1949 0666);
1950 #endif /* not MSDOS */
1951 if (ofd < 0)
1952 report_file_error ("Opening output file", Fcons (newname, Qnil));
1953
1954 record_unwind_protect (close_file_unwind, make_number (ofd));
1955
1956 immediate_quit = 1;
1957 QUIT;
1958 while ((n = emacs_read (ifd, buf, sizeof buf)) > 0)
1959 if (emacs_write (ofd, buf, n) != n)
1960 report_file_error ("I/O error", Fcons (newname, Qnil));
1961 immediate_quit = 0;
1962
1963 #ifndef MSDOS
1964 /* Preserve the original file modes, and if requested, also its
1965 owner and group. */
1966 if (input_file_statable_p)
1967 {
1968 if (! NILP (preserve_uid_gid))
1969 fchown (ofd, st.st_uid, st.st_gid);
1970 fchmod (ofd, st.st_mode & 07777);
1971 }
1972 #endif /* not MSDOS */
1973
1974 #if HAVE_LIBSELINUX
1975 if (conlength > 0)
1976 {
1977 /* Set the modified context back to the file. */
1978 fail = fsetfilecon (ofd, con);
1979 if (fail)
1980 report_file_error ("Doing fsetfilecon", Fcons (newname, Qnil));
1981
1982 freecon (con);
1983 }
1984 #endif
1985
1986 /* Closing the output clobbers the file times on some systems. */
1987 if (emacs_close (ofd) < 0)
1988 report_file_error ("I/O error", Fcons (newname, Qnil));
1989
1990 if (input_file_statable_p)
1991 {
1992 if (!NILP (keep_time))
1993 {
1994 EMACS_TIME atime, mtime;
1995 EMACS_SET_SECS_USECS (atime, st.st_atime, 0);
1996 EMACS_SET_SECS_USECS (mtime, st.st_mtime, 0);
1997 if (set_file_times (SSDATA (encoded_newname),
1998 atime, mtime))
1999 xsignal2 (Qfile_date_error,
2000 build_string ("Cannot set file date"), newname);
2001 }
2002 }
2003
2004 emacs_close (ifd);
2005
2006 #ifdef MSDOS
2007 if (input_file_statable_p)
2008 {
2009 /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
2010 and if it can't, it tells so. Otherwise, under MSDOS we usually
2011 get only the READ bit, which will make the copied file read-only,
2012 so it's better not to chmod at all. */
2013 if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
2014 chmod (SDATA (encoded_newname), st.st_mode & 07777);
2015 }
2016 #endif /* MSDOS */
2017 #endif /* not WINDOWSNT */
2018
2019 /* Discard the unwind protects. */
2020 specpdl_ptr = specpdl + count;
2021
2022 UNGCPRO;
2023 return Qnil;
2024 }
2025 \f
2026 DEFUN ("make-directory-internal", Fmake_directory_internal,
2027 Smake_directory_internal, 1, 1, 0,
2028 doc: /* Create a new directory named DIRECTORY. */)
2029 (Lisp_Object directory)
2030 {
2031 const char *dir;
2032 Lisp_Object handler;
2033 Lisp_Object encoded_dir;
2034
2035 CHECK_STRING (directory);
2036 directory = Fexpand_file_name (directory, Qnil);
2037
2038 handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
2039 if (!NILP (handler))
2040 return call2 (handler, Qmake_directory_internal, directory);
2041
2042 encoded_dir = ENCODE_FILE (directory);
2043
2044 dir = SSDATA (encoded_dir);
2045
2046 #ifdef WINDOWSNT
2047 if (mkdir (dir) != 0)
2048 #else
2049 if (mkdir (dir, 0777) != 0)
2050 #endif
2051 report_file_error ("Creating directory", list1 (directory));
2052
2053 return Qnil;
2054 }
2055
2056 DEFUN ("delete-directory-internal", Fdelete_directory_internal,
2057 Sdelete_directory_internal, 1, 1, 0,
2058 doc: /* Delete the directory named DIRECTORY. Does not follow symlinks. */)
2059 (Lisp_Object directory)
2060 {
2061 const char *dir;
2062 Lisp_Object handler;
2063 Lisp_Object encoded_dir;
2064
2065 CHECK_STRING (directory);
2066 directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil));
2067 encoded_dir = ENCODE_FILE (directory);
2068 dir = SSDATA (encoded_dir);
2069
2070 if (rmdir (dir) != 0)
2071 report_file_error ("Removing directory", list1 (directory));
2072
2073 return Qnil;
2074 }
2075
2076 DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 2,
2077 "(list (read-file-name \
2078 (if (and delete-by-moving-to-trash (null current-prefix-arg)) \
2079 \"Move file to trash: \" \"Delete file: \") \
2080 nil default-directory (confirm-nonexistent-file-or-buffer)) \
2081 (null current-prefix-arg))",
2082 doc: /* Delete file named FILENAME. If it is a symlink, remove the symlink.
2083 If file has multiple names, it continues to exist with the other names.
2084 TRASH non-nil means to trash the file instead of deleting, provided
2085 `delete-by-moving-to-trash' is non-nil.
2086
2087 When called interactively, TRASH is t if no prefix argument is given.
2088 With a prefix argument, TRASH is nil. */)
2089 (Lisp_Object filename, Lisp_Object trash)
2090 {
2091 Lisp_Object handler;
2092 Lisp_Object encoded_file;
2093 struct gcpro gcpro1;
2094
2095 GCPRO1 (filename);
2096 if (!NILP (Ffile_directory_p (filename))
2097 && NILP (Ffile_symlink_p (filename)))
2098 xsignal2 (Qfile_error,
2099 build_string ("Removing old name: is a directory"),
2100 filename);
2101 UNGCPRO;
2102 filename = Fexpand_file_name (filename, Qnil);
2103
2104 handler = Ffind_file_name_handler (filename, Qdelete_file);
2105 if (!NILP (handler))
2106 return call3 (handler, Qdelete_file, filename, trash);
2107
2108 if (delete_by_moving_to_trash && !NILP (trash))
2109 return call1 (Qmove_file_to_trash, filename);
2110
2111 encoded_file = ENCODE_FILE (filename);
2112
2113 if (0 > unlink (SSDATA (encoded_file)))
2114 report_file_error ("Removing old name", list1 (filename));
2115 return Qnil;
2116 }
2117
2118 static Lisp_Object
2119 internal_delete_file_1 (Lisp_Object ignore)
2120 {
2121 return Qt;
2122 }
2123
2124 /* Delete file FILENAME, returning 1 if successful and 0 if failed.
2125 This ignores `delete-by-moving-to-trash'. */
2126
2127 int
2128 internal_delete_file (Lisp_Object filename)
2129 {
2130 Lisp_Object tem;
2131
2132 tem = internal_condition_case_2 (Fdelete_file, filename, Qnil,
2133 Qt, internal_delete_file_1);
2134 return NILP (tem);
2135 }
2136 \f
2137 DEFUN ("rename-file", Frename_file, Srename_file, 2, 3,
2138 "fRename file: \nGRename %s to file: \np",
2139 doc: /* Rename FILE as NEWNAME. Both args must be strings.
2140 If file has names other than FILE, it continues to have those names.
2141 Signals a `file-already-exists' error if a file NEWNAME already exists
2142 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2143 A number as third arg means request confirmation if NEWNAME already exists.
2144 This is what happens in interactive use with M-x. */)
2145 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
2146 {
2147 Lisp_Object handler;
2148 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
2149 Lisp_Object encoded_file, encoded_newname, symlink_target;
2150
2151 symlink_target = encoded_file = encoded_newname = Qnil;
2152 GCPRO5 (file, newname, encoded_file, encoded_newname, symlink_target);
2153 CHECK_STRING (file);
2154 CHECK_STRING (newname);
2155 file = Fexpand_file_name (file, Qnil);
2156
2157 if ((!NILP (Ffile_directory_p (newname)))
2158 #ifdef DOS_NT
2159 /* If the file names are identical but for the case,
2160 don't attempt to move directory to itself. */
2161 && (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2162 #endif
2163 )
2164 {
2165 Lisp_Object fname = NILP (Ffile_directory_p (file))
2166 ? file : Fdirectory_file_name (file);
2167 newname = Fexpand_file_name (Ffile_name_nondirectory (fname), newname);
2168 }
2169 else
2170 newname = Fexpand_file_name (newname, Qnil);
2171
2172 /* If the file name has special constructs in it,
2173 call the corresponding file handler. */
2174 handler = Ffind_file_name_handler (file, Qrename_file);
2175 if (NILP (handler))
2176 handler = Ffind_file_name_handler (newname, Qrename_file);
2177 if (!NILP (handler))
2178 RETURN_UNGCPRO (call4 (handler, Qrename_file,
2179 file, newname, ok_if_already_exists));
2180
2181 encoded_file = ENCODE_FILE (file);
2182 encoded_newname = ENCODE_FILE (newname);
2183
2184 #ifdef DOS_NT
2185 /* If the file names are identical but for the case, don't ask for
2186 confirmation: they simply want to change the letter-case of the
2187 file name. */
2188 if (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2189 #endif
2190 if (NILP (ok_if_already_exists)
2191 || INTEGERP (ok_if_already_exists))
2192 barf_or_query_if_file_exists (newname, "rename to it",
2193 INTEGERP (ok_if_already_exists), 0, 0);
2194 if (0 > rename (SSDATA (encoded_file), SSDATA (encoded_newname)))
2195 {
2196 if (errno == EXDEV)
2197 {
2198 int count;
2199 #ifdef S_IFLNK
2200 symlink_target = Ffile_symlink_p (file);
2201 if (! NILP (symlink_target))
2202 Fmake_symbolic_link (symlink_target, newname,
2203 NILP (ok_if_already_exists) ? Qnil : Qt);
2204 else
2205 #endif
2206 if (!NILP (Ffile_directory_p (file)))
2207 call4 (Qcopy_directory, file, newname, Qt, Qnil);
2208 else
2209 /* We have already prompted if it was an integer, so don't
2210 have copy-file prompt again. */
2211 Fcopy_file (file, newname,
2212 NILP (ok_if_already_exists) ? Qnil : Qt,
2213 Qt, Qt, Qt);
2214
2215 count = SPECPDL_INDEX ();
2216 specbind (Qdelete_by_moving_to_trash, Qnil);
2217
2218 if (!NILP (Ffile_directory_p (file))
2219 #ifdef S_IFLNK
2220 && NILP (symlink_target)
2221 #endif
2222 )
2223 call2 (Qdelete_directory, file, Qt);
2224 else
2225 Fdelete_file (file, Qnil);
2226 unbind_to (count, Qnil);
2227 }
2228 else
2229 report_file_error ("Renaming", list2 (file, newname));
2230 }
2231 UNGCPRO;
2232 return Qnil;
2233 }
2234
2235 DEFUN ("add-name-to-file", Fadd_name_to_file, Sadd_name_to_file, 2, 3,
2236 "fAdd name to file: \nGName to add to %s: \np",
2237 doc: /* Give FILE additional name NEWNAME. Both args must be strings.
2238 Signals a `file-already-exists' error if a file NEWNAME already exists
2239 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2240 A number as third arg means request confirmation if NEWNAME already exists.
2241 This is what happens in interactive use with M-x. */)
2242 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
2243 {
2244 Lisp_Object handler;
2245 Lisp_Object encoded_file, encoded_newname;
2246 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2247
2248 GCPRO4 (file, newname, encoded_file, encoded_newname);
2249 encoded_file = encoded_newname = Qnil;
2250 CHECK_STRING (file);
2251 CHECK_STRING (newname);
2252 file = Fexpand_file_name (file, Qnil);
2253
2254 if (!NILP (Ffile_directory_p (newname)))
2255 newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname);
2256 else
2257 newname = Fexpand_file_name (newname, Qnil);
2258
2259 /* If the file name has special constructs in it,
2260 call the corresponding file handler. */
2261 handler = Ffind_file_name_handler (file, Qadd_name_to_file);
2262 if (!NILP (handler))
2263 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
2264 newname, ok_if_already_exists));
2265
2266 /* If the new name has special constructs in it,
2267 call the corresponding file handler. */
2268 handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
2269 if (!NILP (handler))
2270 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
2271 newname, ok_if_already_exists));
2272
2273 encoded_file = ENCODE_FILE (file);
2274 encoded_newname = ENCODE_FILE (newname);
2275
2276 if (NILP (ok_if_already_exists)
2277 || INTEGERP (ok_if_already_exists))
2278 barf_or_query_if_file_exists (newname, "make it a new name",
2279 INTEGERP (ok_if_already_exists), 0, 0);
2280
2281 unlink (SSDATA (newname));
2282 if (0 > link (SSDATA (encoded_file), SSDATA (encoded_newname)))
2283 report_file_error ("Adding new name", list2 (file, newname));
2284
2285 UNGCPRO;
2286 return Qnil;
2287 }
2288
2289 DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3,
2290 "FMake symbolic link to file: \nGMake symbolic link to file %s: \np",
2291 doc: /* Make a symbolic link to FILENAME, named LINKNAME.
2292 Both args must be strings.
2293 Signals a `file-already-exists' error if a file LINKNAME already exists
2294 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2295 A number as third arg means request confirmation if LINKNAME already exists.
2296 This happens for interactive use with M-x. */)
2297 (Lisp_Object filename, Lisp_Object linkname, Lisp_Object ok_if_already_exists)
2298 {
2299 Lisp_Object handler;
2300 Lisp_Object encoded_filename, encoded_linkname;
2301 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2302
2303 GCPRO4 (filename, linkname, encoded_filename, encoded_linkname);
2304 encoded_filename = encoded_linkname = Qnil;
2305 CHECK_STRING (filename);
2306 CHECK_STRING (linkname);
2307 /* If the link target has a ~, we must expand it to get
2308 a truly valid file name. Otherwise, do not expand;
2309 we want to permit links to relative file names. */
2310 if (SREF (filename, 0) == '~')
2311 filename = Fexpand_file_name (filename, Qnil);
2312
2313 if (!NILP (Ffile_directory_p (linkname)))
2314 linkname = Fexpand_file_name (Ffile_name_nondirectory (filename), linkname);
2315 else
2316 linkname = Fexpand_file_name (linkname, Qnil);
2317
2318 /* If the file name has special constructs in it,
2319 call the corresponding file handler. */
2320 handler = Ffind_file_name_handler (filename, Qmake_symbolic_link);
2321 if (!NILP (handler))
2322 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2323 linkname, ok_if_already_exists));
2324
2325 /* If the new link name has special constructs in it,
2326 call the corresponding file handler. */
2327 handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
2328 if (!NILP (handler))
2329 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2330 linkname, ok_if_already_exists));
2331
2332 #ifdef S_IFLNK
2333 encoded_filename = ENCODE_FILE (filename);
2334 encoded_linkname = ENCODE_FILE (linkname);
2335
2336 if (NILP (ok_if_already_exists)
2337 || INTEGERP (ok_if_already_exists))
2338 barf_or_query_if_file_exists (linkname, "make it a link",
2339 INTEGERP (ok_if_already_exists), 0, 0);
2340 if (0 > symlink (SSDATA (encoded_filename),
2341 SSDATA (encoded_linkname)))
2342 {
2343 /* If we didn't complain already, silently delete existing file. */
2344 if (errno == EEXIST)
2345 {
2346 unlink (SSDATA (encoded_linkname));
2347 if (0 <= symlink (SSDATA (encoded_filename),
2348 SSDATA (encoded_linkname)))
2349 {
2350 UNGCPRO;
2351 return Qnil;
2352 }
2353 }
2354
2355 report_file_error ("Making symbolic link", list2 (filename, linkname));
2356 }
2357 UNGCPRO;
2358 return Qnil;
2359
2360 #else
2361 UNGCPRO;
2362 xsignal1 (Qfile_error, build_string ("Symbolic links are not supported"));
2363
2364 #endif /* S_IFLNK */
2365 }
2366
2367 \f
2368 DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
2369 1, 1, 0,
2370 doc: /* Return t if file FILENAME specifies an absolute file name.
2371 On Unix, this is a name starting with a `/' or a `~'. */)
2372 (Lisp_Object filename)
2373 {
2374 CHECK_STRING (filename);
2375 return file_name_absolute_p (SSDATA (filename)) ? Qt : Qnil;
2376 }
2377 \f
2378 /* Return nonzero if file FILENAME exists and can be executed. */
2379
2380 static int
2381 check_executable (char *filename)
2382 {
2383 #ifdef DOS_NT
2384 int len = strlen (filename);
2385 char *suffix;
2386 struct stat st;
2387 if (stat (filename, &st) < 0)
2388 return 0;
2389 return ((st.st_mode & S_IEXEC) != 0);
2390 #else /* not DOS_NT */
2391 #ifdef HAVE_EUIDACCESS
2392 return (euidaccess (filename, 1) >= 0);
2393 #else
2394 /* Access isn't quite right because it uses the real uid
2395 and we really want to test with the effective uid.
2396 But Unix doesn't give us a right way to do it. */
2397 return (access (filename, 1) >= 0);
2398 #endif
2399 #endif /* not DOS_NT */
2400 }
2401
2402 /* Return nonzero if file FILENAME exists and can be written. */
2403
2404 static int
2405 check_writable (const char *filename)
2406 {
2407 #ifdef MSDOS
2408 struct stat st;
2409 if (stat (filename, &st) < 0)
2410 return 0;
2411 return (st.st_mode & S_IWRITE || (st.st_mode & S_IFMT) == S_IFDIR);
2412 #else /* not MSDOS */
2413 #ifdef HAVE_EUIDACCESS
2414 return (euidaccess (filename, 2) >= 0);
2415 #else
2416 /* Access isn't quite right because it uses the real uid
2417 and we really want to test with the effective uid.
2418 But Unix doesn't give us a right way to do it.
2419 Opening with O_WRONLY could work for an ordinary file,
2420 but would lose for directories. */
2421 return (access (filename, 2) >= 0);
2422 #endif
2423 #endif /* not MSDOS */
2424 }
2425
2426 DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
2427 doc: /* Return t if file FILENAME exists (whether or not you can read it.)
2428 See also `file-readable-p' and `file-attributes'.
2429 This returns nil for a symlink to a nonexistent file.
2430 Use `file-symlink-p' to test for such links. */)
2431 (Lisp_Object filename)
2432 {
2433 Lisp_Object absname;
2434 Lisp_Object handler;
2435 struct stat statbuf;
2436
2437 CHECK_STRING (filename);
2438 absname = Fexpand_file_name (filename, Qnil);
2439
2440 /* If the file name has special constructs in it,
2441 call the corresponding file handler. */
2442 handler = Ffind_file_name_handler (absname, Qfile_exists_p);
2443 if (!NILP (handler))
2444 return call2 (handler, Qfile_exists_p, absname);
2445
2446 absname = ENCODE_FILE (absname);
2447
2448 return (stat (SSDATA (absname), &statbuf) >= 0) ? Qt : Qnil;
2449 }
2450
2451 DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0,
2452 doc: /* Return t if FILENAME can be executed by you.
2453 For a directory, this means you can access files in that directory. */)
2454 (Lisp_Object filename)
2455 {
2456 Lisp_Object absname;
2457 Lisp_Object handler;
2458
2459 CHECK_STRING (filename);
2460 absname = Fexpand_file_name (filename, Qnil);
2461
2462 /* If the file name has special constructs in it,
2463 call the corresponding file handler. */
2464 handler = Ffind_file_name_handler (absname, Qfile_executable_p);
2465 if (!NILP (handler))
2466 return call2 (handler, Qfile_executable_p, absname);
2467
2468 absname = ENCODE_FILE (absname);
2469
2470 return (check_executable (SSDATA (absname)) ? Qt : Qnil);
2471 }
2472
2473 DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0,
2474 doc: /* Return t if file FILENAME exists and you can read it.
2475 See also `file-exists-p' and `file-attributes'. */)
2476 (Lisp_Object filename)
2477 {
2478 Lisp_Object absname;
2479 Lisp_Object handler;
2480 int desc;
2481 int flags;
2482 struct stat statbuf;
2483
2484 CHECK_STRING (filename);
2485 absname = Fexpand_file_name (filename, Qnil);
2486
2487 /* If the file name has special constructs in it,
2488 call the corresponding file handler. */
2489 handler = Ffind_file_name_handler (absname, Qfile_readable_p);
2490 if (!NILP (handler))
2491 return call2 (handler, Qfile_readable_p, absname);
2492
2493 absname = ENCODE_FILE (absname);
2494
2495 #if defined(DOS_NT) || defined(macintosh)
2496 /* Under MS-DOS, Windows, and Macintosh, open does not work for
2497 directories. */
2498 if (access (SDATA (absname), 0) == 0)
2499 return Qt;
2500 return Qnil;
2501 #else /* not DOS_NT and not macintosh */
2502 flags = O_RDONLY;
2503 #if defined (S_ISFIFO) && defined (O_NONBLOCK)
2504 /* Opening a fifo without O_NONBLOCK can wait.
2505 We don't want to wait. But we don't want to mess wth O_NONBLOCK
2506 except in the case of a fifo, on a system which handles it. */
2507 desc = stat (SSDATA (absname), &statbuf);
2508 if (desc < 0)
2509 return Qnil;
2510 if (S_ISFIFO (statbuf.st_mode))
2511 flags |= O_NONBLOCK;
2512 #endif
2513 desc = emacs_open (SSDATA (absname), flags, 0);
2514 if (desc < 0)
2515 return Qnil;
2516 emacs_close (desc);
2517 return Qt;
2518 #endif /* not DOS_NT and not macintosh */
2519 }
2520
2521 /* Having this before file-symlink-p mysteriously caused it to be forgotten
2522 on the RT/PC. */
2523 DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
2524 doc: /* Return t if file FILENAME can be written or created by you. */)
2525 (Lisp_Object filename)
2526 {
2527 Lisp_Object absname, dir, encoded;
2528 Lisp_Object handler;
2529 struct stat statbuf;
2530
2531 CHECK_STRING (filename);
2532 absname = Fexpand_file_name (filename, Qnil);
2533
2534 /* If the file name has special constructs in it,
2535 call the corresponding file handler. */
2536 handler = Ffind_file_name_handler (absname, Qfile_writable_p);
2537 if (!NILP (handler))
2538 return call2 (handler, Qfile_writable_p, absname);
2539
2540 encoded = ENCODE_FILE (absname);
2541 if (stat (SSDATA (encoded), &statbuf) >= 0)
2542 return (check_writable (SSDATA (encoded))
2543 ? Qt : Qnil);
2544
2545 dir = Ffile_name_directory (absname);
2546 #ifdef MSDOS
2547 if (!NILP (dir))
2548 dir = Fdirectory_file_name (dir);
2549 #endif /* MSDOS */
2550
2551 dir = ENCODE_FILE (dir);
2552 #ifdef WINDOWSNT
2553 /* The read-only attribute of the parent directory doesn't affect
2554 whether a file or directory can be created within it. Some day we
2555 should check ACLs though, which do affect this. */
2556 if (stat (SDATA (dir), &statbuf) < 0)
2557 return Qnil;
2558 return (statbuf.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
2559 #else
2560 return (check_writable (!NILP (dir) ? SSDATA (dir) : "")
2561 ? Qt : Qnil);
2562 #endif
2563 }
2564 \f
2565 DEFUN ("access-file", Faccess_file, Saccess_file, 2, 2, 0,
2566 doc: /* Access file FILENAME, and get an error if that does not work.
2567 The second argument STRING is used in the error message.
2568 If there is no error, returns nil. */)
2569 (Lisp_Object filename, Lisp_Object string)
2570 {
2571 Lisp_Object handler, encoded_filename, absname;
2572 int fd;
2573
2574 CHECK_STRING (filename);
2575 absname = Fexpand_file_name (filename, Qnil);
2576
2577 CHECK_STRING (string);
2578
2579 /* If the file name has special constructs in it,
2580 call the corresponding file handler. */
2581 handler = Ffind_file_name_handler (absname, Qaccess_file);
2582 if (!NILP (handler))
2583 return call3 (handler, Qaccess_file, absname, string);
2584
2585 encoded_filename = ENCODE_FILE (absname);
2586
2587 fd = emacs_open (SSDATA (encoded_filename), O_RDONLY, 0);
2588 if (fd < 0)
2589 report_file_error (SSDATA (string), Fcons (filename, Qnil));
2590 emacs_close (fd);
2591
2592 return Qnil;
2593 }
2594 \f
2595 DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0,
2596 doc: /* Return non-nil if file FILENAME is the name of a symbolic link.
2597 The value is the link target, as a string.
2598 Otherwise it returns nil.
2599
2600 This function returns t when given the name of a symlink that
2601 points to a nonexistent file. */)
2602 (Lisp_Object filename)
2603 {
2604 Lisp_Object handler;
2605
2606 CHECK_STRING (filename);
2607 filename = Fexpand_file_name (filename, Qnil);
2608
2609 /* If the file name has special constructs in it,
2610 call the corresponding file handler. */
2611 handler = Ffind_file_name_handler (filename, Qfile_symlink_p);
2612 if (!NILP (handler))
2613 return call2 (handler, Qfile_symlink_p, filename);
2614
2615 #ifdef S_IFLNK
2616 {
2617 char *buf;
2618 int bufsize;
2619 int valsize;
2620 Lisp_Object val;
2621
2622 filename = ENCODE_FILE (filename);
2623
2624 bufsize = 50;
2625 buf = NULL;
2626 do
2627 {
2628 bufsize *= 2;
2629 buf = (char *) xrealloc (buf, bufsize);
2630 memset (buf, 0, bufsize);
2631
2632 errno = 0;
2633 valsize = readlink (SSDATA (filename), buf, bufsize);
2634 if (valsize == -1)
2635 {
2636 #ifdef ERANGE
2637 /* HP-UX reports ERANGE if buffer is too small. */
2638 if (errno == ERANGE)
2639 valsize = bufsize;
2640 else
2641 #endif
2642 {
2643 xfree (buf);
2644 return Qnil;
2645 }
2646 }
2647 }
2648 while (valsize >= bufsize);
2649
2650 val = make_string (buf, valsize);
2651 if (buf[0] == '/' && strchr (buf, ':'))
2652 val = concat2 (build_string ("/:"), val);
2653 xfree (buf);
2654 val = DECODE_FILE (val);
2655 return val;
2656 }
2657 #else /* not S_IFLNK */
2658 return Qnil;
2659 #endif /* not S_IFLNK */
2660 }
2661
2662 DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0,
2663 doc: /* Return t if FILENAME names an existing directory.
2664 Symbolic links to directories count as directories.
2665 See `file-symlink-p' to distinguish symlinks. */)
2666 (Lisp_Object filename)
2667 {
2668 register Lisp_Object absname;
2669 struct stat st;
2670 Lisp_Object handler;
2671
2672 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2673
2674 /* If the file name has special constructs in it,
2675 call the corresponding file handler. */
2676 handler = Ffind_file_name_handler (absname, Qfile_directory_p);
2677 if (!NILP (handler))
2678 return call2 (handler, Qfile_directory_p, absname);
2679
2680 absname = ENCODE_FILE (absname);
2681
2682 if (stat (SSDATA (absname), &st) < 0)
2683 return Qnil;
2684 return (st.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
2685 }
2686
2687 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p, Sfile_accessible_directory_p, 1, 1, 0,
2688 doc: /* Return t if file FILENAME names a directory you can open.
2689 For the value to be t, FILENAME must specify the name of a directory as a file,
2690 and the directory must allow you to open files in it. In order to use a
2691 directory as a buffer's current directory, this predicate must return true.
2692 A directory name spec may be given instead; then the value is t
2693 if the directory so specified exists and really is a readable and
2694 searchable directory. */)
2695 (Lisp_Object filename)
2696 {
2697 Lisp_Object handler;
2698 int tem;
2699 struct gcpro gcpro1;
2700
2701 /* If the file name has special constructs in it,
2702 call the corresponding file handler. */
2703 handler = Ffind_file_name_handler (filename, Qfile_accessible_directory_p);
2704 if (!NILP (handler))
2705 return call2 (handler, Qfile_accessible_directory_p, filename);
2706
2707 GCPRO1 (filename);
2708 tem = (NILP (Ffile_directory_p (filename))
2709 || NILP (Ffile_executable_p (filename)));
2710 UNGCPRO;
2711 return tem ? Qnil : Qt;
2712 }
2713
2714 DEFUN ("file-regular-p", Ffile_regular_p, Sfile_regular_p, 1, 1, 0,
2715 doc: /* Return t if FILENAME names a regular file.
2716 This is the sort of file that holds an ordinary stream of data bytes.
2717 Symbolic links to regular files count as regular files.
2718 See `file-symlink-p' to distinguish symlinks. */)
2719 (Lisp_Object filename)
2720 {
2721 register Lisp_Object absname;
2722 struct stat st;
2723 Lisp_Object handler;
2724
2725 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2726
2727 /* If the file name has special constructs in it,
2728 call the corresponding file handler. */
2729 handler = Ffind_file_name_handler (absname, Qfile_regular_p);
2730 if (!NILP (handler))
2731 return call2 (handler, Qfile_regular_p, absname);
2732
2733 absname = ENCODE_FILE (absname);
2734
2735 #ifdef WINDOWSNT
2736 {
2737 int result;
2738 Lisp_Object tem = Vw32_get_true_file_attributes;
2739
2740 /* Tell stat to use expensive method to get accurate info. */
2741 Vw32_get_true_file_attributes = Qt;
2742 result = stat (SDATA (absname), &st);
2743 Vw32_get_true_file_attributes = tem;
2744
2745 if (result < 0)
2746 return Qnil;
2747 return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
2748 }
2749 #else
2750 if (stat (SSDATA (absname), &st) < 0)
2751 return Qnil;
2752 return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
2753 #endif
2754 }
2755 \f
2756 DEFUN ("file-selinux-context", Ffile_selinux_context,
2757 Sfile_selinux_context, 1, 1, 0,
2758 doc: /* Return SELinux context of file named FILENAME,
2759 as a list ("user", "role", "type", "range"). Return (nil, nil, nil, nil)
2760 if file does not exist, is not accessible, or SELinux is disabled */)
2761 (Lisp_Object filename)
2762 {
2763 Lisp_Object absname;
2764 Lisp_Object values[4];
2765 Lisp_Object handler;
2766 #if HAVE_LIBSELINUX
2767 security_context_t con;
2768 int conlength;
2769 context_t context;
2770 #endif
2771
2772 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2773
2774 /* If the file name has special constructs in it,
2775 call the corresponding file handler. */
2776 handler = Ffind_file_name_handler (absname, Qfile_selinux_context);
2777 if (!NILP (handler))
2778 return call2 (handler, Qfile_selinux_context, absname);
2779
2780 absname = ENCODE_FILE (absname);
2781
2782 values[0] = Qnil;
2783 values[1] = Qnil;
2784 values[2] = Qnil;
2785 values[3] = Qnil;
2786 #if HAVE_LIBSELINUX
2787 if (is_selinux_enabled ())
2788 {
2789 conlength = lgetfilecon (SDATA (absname), &con);
2790 if (conlength > 0)
2791 {
2792 context = context_new (con);
2793 if (context_user_get (context))
2794 values[0] = build_string (context_user_get (context));
2795 if (context_role_get (context))
2796 values[1] = build_string (context_role_get (context));
2797 if (context_type_get (context))
2798 values[2] = build_string (context_type_get (context));
2799 if (context_range_get (context))
2800 values[3] = build_string (context_range_get (context));
2801 context_free (context);
2802 }
2803 if (con)
2804 freecon (con);
2805 }
2806 #endif
2807
2808 return Flist (sizeof(values) / sizeof(values[0]), values);
2809 }
2810 \f
2811 DEFUN ("set-file-selinux-context", Fset_file_selinux_context,
2812 Sset_file_selinux_context, 2, 2, 0,
2813 doc: /* Set SELinux context of file named FILENAME to CONTEXT
2814 as a list ("user", "role", "type", "range"). Has no effect if SELinux
2815 is disabled. */)
2816 (Lisp_Object filename, Lisp_Object context)
2817 {
2818 Lisp_Object absname, encoded_absname;
2819 Lisp_Object handler;
2820 Lisp_Object user = CAR_SAFE (context);
2821 Lisp_Object role = CAR_SAFE (CDR_SAFE (context));
2822 Lisp_Object type = CAR_SAFE (CDR_SAFE (CDR_SAFE (context)));
2823 Lisp_Object range = CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (context))));
2824 #if HAVE_LIBSELINUX
2825 security_context_t con;
2826 int fail, conlength;
2827 context_t parsed_con;
2828 #endif
2829
2830 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
2831
2832 /* If the file name has special constructs in it,
2833 call the corresponding file handler. */
2834 handler = Ffind_file_name_handler (absname, Qset_file_selinux_context);
2835 if (!NILP (handler))
2836 return call3 (handler, Qset_file_selinux_context, absname, context);
2837
2838 encoded_absname = ENCODE_FILE (absname);
2839
2840 #if HAVE_LIBSELINUX
2841 if (is_selinux_enabled ())
2842 {
2843 /* Get current file context. */
2844 conlength = lgetfilecon (SDATA (encoded_absname), &con);
2845 if (conlength > 0)
2846 {
2847 parsed_con = context_new (con);
2848 /* Change the parts defined in the parameter.*/
2849 if (STRINGP (user))
2850 {
2851 if (context_user_set (parsed_con, SDATA (user)))
2852 error ("Doing context_user_set");
2853 }
2854 if (STRINGP (role))
2855 {
2856 if (context_role_set (parsed_con, SDATA (role)))
2857 error ("Doing context_role_set");
2858 }
2859 if (STRINGP (type))
2860 {
2861 if (context_type_set (parsed_con, SDATA (type)))
2862 error ("Doing context_type_set");
2863 }
2864 if (STRINGP (range))
2865 {
2866 if (context_range_set (parsed_con, SDATA (range)))
2867 error ("Doing context_range_set");
2868 }
2869
2870 /* Set the modified context back to the file. */
2871 fail = lsetfilecon (SDATA (encoded_absname), context_str (parsed_con));
2872 if (fail)
2873 report_file_error ("Doing lsetfilecon", Fcons (absname, Qnil));
2874
2875 context_free (parsed_con);
2876 }
2877 else
2878 report_file_error("Doing lgetfilecon", Fcons (absname, Qnil));
2879
2880 if (con)
2881 freecon (con);
2882 }
2883 #endif
2884
2885 return Qnil;
2886 }
2887 \f
2888 DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
2889 doc: /* Return mode bits of file named FILENAME, as an integer.
2890 Return nil, if file does not exist or is not accessible. */)
2891 (Lisp_Object filename)
2892 {
2893 Lisp_Object absname;
2894 struct stat st;
2895 Lisp_Object handler;
2896
2897 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2898
2899 /* If the file name has special constructs in it,
2900 call the corresponding file handler. */
2901 handler = Ffind_file_name_handler (absname, Qfile_modes);
2902 if (!NILP (handler))
2903 return call2 (handler, Qfile_modes, absname);
2904
2905 absname = ENCODE_FILE (absname);
2906
2907 if (stat (SSDATA (absname), &st) < 0)
2908 return Qnil;
2909
2910 return make_number (st.st_mode & 07777);
2911 }
2912
2913 DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2,
2914 "(let ((file (read-file-name \"File: \"))) \
2915 (list file (read-file-modes nil file)))",
2916 doc: /* Set mode bits of file named FILENAME to MODE (an integer).
2917 Only the 12 low bits of MODE are used.
2918
2919 Interactively, mode bits are read by `read-file-modes', which accepts
2920 symbolic notation, like the `chmod' command from GNU Coreutils. */)
2921 (Lisp_Object filename, Lisp_Object mode)
2922 {
2923 Lisp_Object absname, encoded_absname;
2924 Lisp_Object handler;
2925
2926 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
2927 CHECK_NUMBER (mode);
2928
2929 /* If the file name has special constructs in it,
2930 call the corresponding file handler. */
2931 handler = Ffind_file_name_handler (absname, Qset_file_modes);
2932 if (!NILP (handler))
2933 return call3 (handler, Qset_file_modes, absname, mode);
2934
2935 encoded_absname = ENCODE_FILE (absname);
2936
2937 if (chmod (SSDATA (encoded_absname), XINT (mode)) < 0)
2938 report_file_error ("Doing chmod", Fcons (absname, Qnil));
2939
2940 return Qnil;
2941 }
2942
2943 DEFUN ("set-default-file-modes", Fset_default_file_modes, Sset_default_file_modes, 1, 1, 0,
2944 doc: /* Set the file permission bits for newly created files.
2945 The argument MODE should be an integer; only the low 9 bits are used.
2946 This setting is inherited by subprocesses. */)
2947 (Lisp_Object mode)
2948 {
2949 CHECK_NUMBER (mode);
2950
2951 umask ((~ XINT (mode)) & 0777);
2952
2953 return Qnil;
2954 }
2955
2956 DEFUN ("default-file-modes", Fdefault_file_modes, Sdefault_file_modes, 0, 0, 0,
2957 doc: /* Return the default file protection for created files.
2958 The value is an integer. */)
2959 (void)
2960 {
2961 int realmask;
2962 Lisp_Object value;
2963
2964 realmask = umask (0);
2965 umask (realmask);
2966
2967 XSETINT (value, (~ realmask) & 0777);
2968 return value;
2969 }
2970 \f
2971
2972 DEFUN ("set-file-times", Fset_file_times, Sset_file_times, 1, 2, 0,
2973 doc: /* Set times of file FILENAME to TIME.
2974 Set both access and modification times.
2975 Return t on success, else nil.
2976 Use the current time if TIME is nil. TIME is in the format of
2977 `current-time'. */)
2978 (Lisp_Object filename, Lisp_Object time)
2979 {
2980 Lisp_Object absname, encoded_absname;
2981 Lisp_Object handler;
2982 time_t sec;
2983 int usec;
2984
2985 if (! lisp_time_argument (time, &sec, &usec))
2986 error ("Invalid time specification");
2987
2988 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
2989
2990 /* If the file name has special constructs in it,
2991 call the corresponding file handler. */
2992 handler = Ffind_file_name_handler (absname, Qset_file_times);
2993 if (!NILP (handler))
2994 return call3 (handler, Qset_file_times, absname, time);
2995
2996 encoded_absname = ENCODE_FILE (absname);
2997
2998 {
2999 EMACS_TIME t;
3000
3001 EMACS_SET_SECS (t, sec);
3002 EMACS_SET_USECS (t, usec);
3003
3004 if (set_file_times (SSDATA (encoded_absname), t, t))
3005 {
3006 #ifdef DOS_NT
3007 struct stat st;
3008
3009 /* Setting times on a directory always fails. */
3010 if (stat (SDATA (encoded_absname), &st) == 0
3011 && (st.st_mode & S_IFMT) == S_IFDIR)
3012 return Qnil;
3013 #endif
3014 report_file_error ("Setting file times", Fcons (absname, Qnil));
3015 return Qnil;
3016 }
3017 }
3018
3019 return Qt;
3020 }
3021 \f
3022 #ifdef HAVE_SYNC
3023 DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "",
3024 doc: /* Tell Unix to finish all pending disk updates. */)
3025 (void)
3026 {
3027 sync ();
3028 return Qnil;
3029 }
3030
3031 #endif /* HAVE_SYNC */
3032
3033 DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0,
3034 doc: /* Return t if file FILE1 is newer than file FILE2.
3035 If FILE1 does not exist, the answer is nil;
3036 otherwise, if FILE2 does not exist, the answer is t. */)
3037 (Lisp_Object file1, Lisp_Object file2)
3038 {
3039 Lisp_Object absname1, absname2;
3040 struct stat st;
3041 int mtime1;
3042 Lisp_Object handler;
3043 struct gcpro gcpro1, gcpro2;
3044
3045 CHECK_STRING (file1);
3046 CHECK_STRING (file2);
3047
3048 absname1 = Qnil;
3049 GCPRO2 (absname1, file2);
3050 absname1 = expand_and_dir_to_file (file1, BVAR (current_buffer, directory));
3051 absname2 = expand_and_dir_to_file (file2, BVAR (current_buffer, directory));
3052 UNGCPRO;
3053
3054 /* If the file name has special constructs in it,
3055 call the corresponding file handler. */
3056 handler = Ffind_file_name_handler (absname1, Qfile_newer_than_file_p);
3057 if (NILP (handler))
3058 handler = Ffind_file_name_handler (absname2, Qfile_newer_than_file_p);
3059 if (!NILP (handler))
3060 return call3 (handler, Qfile_newer_than_file_p, absname1, absname2);
3061
3062 GCPRO2 (absname1, absname2);
3063 absname1 = ENCODE_FILE (absname1);
3064 absname2 = ENCODE_FILE (absname2);
3065 UNGCPRO;
3066
3067 if (stat (SSDATA (absname1), &st) < 0)
3068 return Qnil;
3069
3070 mtime1 = st.st_mtime;
3071
3072 if (stat (SSDATA (absname2), &st) < 0)
3073 return Qt;
3074
3075 return (mtime1 > st.st_mtime) ? Qt : Qnil;
3076 }
3077 \f
3078 #ifndef READ_BUF_SIZE
3079 #define READ_BUF_SIZE (64 << 10)
3080 #endif
3081
3082 /* This function is called after Lisp functions to decide a coding
3083 system are called, or when they cause an error. Before they are
3084 called, the current buffer is set unibyte and it contains only a
3085 newly inserted text (thus the buffer was empty before the
3086 insertion).
3087
3088 The functions may set markers, overlays, text properties, or even
3089 alter the buffer contents, change the current buffer.
3090
3091 Here, we reset all those changes by:
3092 o set back the current buffer.
3093 o move all markers and overlays to BEG.
3094 o remove all text properties.
3095 o set back the buffer multibyteness. */
3096
3097 static Lisp_Object
3098 decide_coding_unwind (Lisp_Object unwind_data)
3099 {
3100 Lisp_Object multibyte, undo_list, buffer;
3101
3102 multibyte = XCAR (unwind_data);
3103 unwind_data = XCDR (unwind_data);
3104 undo_list = XCAR (unwind_data);
3105 buffer = XCDR (unwind_data);
3106
3107 if (current_buffer != XBUFFER (buffer))
3108 set_buffer_internal (XBUFFER (buffer));
3109 adjust_markers_for_delete (BEG, BEG_BYTE, Z, Z_BYTE);
3110 adjust_overlays_for_delete (BEG, Z - BEG);
3111 BUF_INTERVALS (current_buffer) = 0;
3112 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3113
3114 /* Now we are safe to change the buffer's multibyteness directly. */
3115 BVAR (current_buffer, enable_multibyte_characters) = multibyte;
3116 BVAR (current_buffer, undo_list) = undo_list;
3117
3118 return Qnil;
3119 }
3120
3121
3122 /* Used to pass values from insert-file-contents to read_non_regular. */
3123
3124 static int non_regular_fd;
3125 static EMACS_INT non_regular_inserted;
3126 static EMACS_INT non_regular_nbytes;
3127
3128
3129 /* Read from a non-regular file.
3130 Read non_regular_nbytes bytes max from non_regular_fd.
3131 Non_regular_inserted specifies where to put the read bytes.
3132 Value is the number of bytes read. */
3133
3134 static Lisp_Object
3135 read_non_regular (Lisp_Object ignore)
3136 {
3137 EMACS_INT nbytes;
3138
3139 immediate_quit = 1;
3140 QUIT;
3141 nbytes = emacs_read (non_regular_fd,
3142 ((char *) BEG_ADDR + PT_BYTE - BEG_BYTE
3143 + non_regular_inserted),
3144 non_regular_nbytes);
3145 immediate_quit = 0;
3146 return make_number (nbytes);
3147 }
3148
3149
3150 /* Condition-case handler used when reading from non-regular files
3151 in insert-file-contents. */
3152
3153 static Lisp_Object
3154 read_non_regular_quit (Lisp_Object ignore)
3155 {
3156 return Qnil;
3157 }
3158
3159
3160 DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
3161 1, 5, 0,
3162 doc: /* Insert contents of file FILENAME after point.
3163 Returns list of absolute file name and number of characters inserted.
3164 If second argument VISIT is non-nil, the buffer's visited filename and
3165 last save file modtime are set, and it is marked unmodified. If
3166 visiting and the file does not exist, visiting is completed before the
3167 error is signaled.
3168
3169 The optional third and fourth arguments BEG and END specify what portion
3170 of the file to insert. These arguments count bytes in the file, not
3171 characters in the buffer. If VISIT is non-nil, BEG and END must be nil.
3172
3173 If optional fifth argument REPLACE is non-nil, replace the current
3174 buffer contents (in the accessible portion) with the file contents.
3175 This is better than simply deleting and inserting the whole thing
3176 because (1) it preserves some marker positions and (2) it puts less data
3177 in the undo list. When REPLACE is non-nil, the second return value is
3178 the number of characters that replace previous buffer contents.
3179
3180 This function does code conversion according to the value of
3181 `coding-system-for-read' or `file-coding-system-alist', and sets the
3182 variable `last-coding-system-used' to the coding system actually used. */)
3183 (Lisp_Object filename, Lisp_Object visit, Lisp_Object beg, Lisp_Object end, Lisp_Object replace)
3184 {
3185 struct stat st;
3186 register int fd;
3187 EMACS_INT inserted = 0;
3188 int nochange = 0;
3189 register EMACS_INT how_much;
3190 register EMACS_INT unprocessed;
3191 int count = SPECPDL_INDEX ();
3192 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3193 Lisp_Object handler, val, insval, orig_filename, old_undo;
3194 Lisp_Object p;
3195 EMACS_INT total = 0;
3196 int not_regular = 0;
3197 char read_buf[READ_BUF_SIZE];
3198 struct coding_system coding;
3199 char buffer[1 << 14];
3200 int replace_handled = 0;
3201 int set_coding_system = 0;
3202 Lisp_Object coding_system;
3203 int read_quit = 0;
3204 Lisp_Object old_Vdeactivate_mark = Vdeactivate_mark;
3205 int we_locked_file = 0;
3206 int deferred_remove_unwind_protect = 0;
3207
3208 if (current_buffer->base_buffer && ! NILP (visit))
3209 error ("Cannot do file visiting in an indirect buffer");
3210
3211 if (!NILP (BVAR (current_buffer, read_only)))
3212 Fbarf_if_buffer_read_only ();
3213
3214 val = Qnil;
3215 p = Qnil;
3216 orig_filename = Qnil;
3217 old_undo = Qnil;
3218
3219 GCPRO5 (filename, val, p, orig_filename, old_undo);
3220
3221 CHECK_STRING (filename);
3222 filename = Fexpand_file_name (filename, Qnil);
3223
3224 /* The value Qnil means that the coding system is not yet
3225 decided. */
3226 coding_system = Qnil;
3227
3228 /* If the file name has special constructs in it,
3229 call the corresponding file handler. */
3230 handler = Ffind_file_name_handler (filename, Qinsert_file_contents);
3231 if (!NILP (handler))
3232 {
3233 val = call6 (handler, Qinsert_file_contents, filename,
3234 visit, beg, end, replace);
3235 if (CONSP (val) && CONSP (XCDR (val)))
3236 inserted = XINT (XCAR (XCDR (val)));
3237 goto handled;
3238 }
3239
3240 orig_filename = filename;
3241 filename = ENCODE_FILE (filename);
3242
3243 fd = -1;
3244
3245 #ifdef WINDOWSNT
3246 {
3247 Lisp_Object tem = Vw32_get_true_file_attributes;
3248
3249 /* Tell stat to use expensive method to get accurate info. */
3250 Vw32_get_true_file_attributes = Qt;
3251 total = stat (SSDATA (filename), &st);
3252 Vw32_get_true_file_attributes = tem;
3253 }
3254 if (total < 0)
3255 #else
3256 if (stat (SSDATA (filename), &st) < 0)
3257 #endif /* WINDOWSNT */
3258 {
3259 if (fd >= 0) emacs_close (fd);
3260 badopen:
3261 if (NILP (visit))
3262 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
3263 st.st_mtime = -1;
3264 how_much = 0;
3265 if (!NILP (Vcoding_system_for_read))
3266 Fset (Qbuffer_file_coding_system, Vcoding_system_for_read);
3267 goto notfound;
3268 }
3269
3270 #ifdef S_IFREG
3271 /* This code will need to be changed in order to work on named
3272 pipes, and it's probably just not worth it. So we should at
3273 least signal an error. */
3274 if (!S_ISREG (st.st_mode))
3275 {
3276 not_regular = 1;
3277
3278 if (! NILP (visit))
3279 goto notfound;
3280
3281 if (! NILP (replace) || ! NILP (beg) || ! NILP (end))
3282 xsignal2 (Qfile_error,
3283 build_string ("not a regular file"), orig_filename);
3284 }
3285 #endif
3286
3287 if (fd < 0)
3288 if ((fd = emacs_open (SSDATA (filename), O_RDONLY, 0)) < 0)
3289 goto badopen;
3290
3291 /* Replacement should preserve point as it preserves markers. */
3292 if (!NILP (replace))
3293 record_unwind_protect (restore_point_unwind, Fpoint_marker ());
3294
3295 record_unwind_protect (close_file_unwind, make_number (fd));
3296
3297 /* Can happen on any platform that uses long as type of off_t, but allows
3298 file sizes to exceed 2Gb, so give a suitable message. */
3299 if (! not_regular && st.st_size < 0)
3300 error ("Maximum buffer size exceeded");
3301
3302 /* Prevent redisplay optimizations. */
3303 current_buffer->clip_changed = 1;
3304
3305 if (!NILP (visit))
3306 {
3307 if (!NILP (beg) || !NILP (end))
3308 error ("Attempt to visit less than an entire file");
3309 if (BEG < Z && NILP (replace))
3310 error ("Cannot do file visiting in a non-empty buffer");
3311 }
3312
3313 if (!NILP (beg))
3314 CHECK_NUMBER (beg);
3315 else
3316 XSETFASTINT (beg, 0);
3317
3318 if (!NILP (end))
3319 CHECK_NUMBER (end);
3320 else
3321 {
3322 if (! not_regular)
3323 {
3324 XSETINT (end, st.st_size);
3325
3326 /* Arithmetic overflow can occur if an Emacs integer cannot
3327 represent the file size, or if the calculations below
3328 overflow. The calculations below double the file size
3329 twice, so check that it can be multiplied by 4 safely. */
3330 if (XINT (end) != st.st_size
3331 /* Actually, it should test either INT_MAX or LONG_MAX
3332 depending on which one is used for EMACS_INT. But in
3333 any case, in practice, this test is redundant with the
3334 one above.
3335 || st.st_size > INT_MAX / 4 */)
3336 error ("Maximum buffer size exceeded");
3337
3338 /* The file size returned from stat may be zero, but data
3339 may be readable nonetheless, for example when this is a
3340 file in the /proc filesystem. */
3341 if (st.st_size == 0)
3342 XSETINT (end, READ_BUF_SIZE);
3343 }
3344 }
3345
3346 if (EQ (Vcoding_system_for_read, Qauto_save_coding))
3347 {
3348 coding_system = coding_inherit_eol_type (Qutf_8_emacs, Qunix);
3349 setup_coding_system (coding_system, &coding);
3350 /* Ensure we set Vlast_coding_system_used. */
3351 set_coding_system = 1;
3352 }
3353 else if (BEG < Z)
3354 {
3355 /* Decide the coding system to use for reading the file now
3356 because we can't use an optimized method for handling
3357 `coding:' tag if the current buffer is not empty. */
3358 if (!NILP (Vcoding_system_for_read))
3359 coding_system = Vcoding_system_for_read;
3360 else
3361 {
3362 /* Don't try looking inside a file for a coding system
3363 specification if it is not seekable. */
3364 if (! not_regular && ! NILP (Vset_auto_coding_function))
3365 {
3366 /* Find a coding system specified in the heading two
3367 lines or in the tailing several lines of the file.
3368 We assume that the 1K-byte and 3K-byte for heading
3369 and tailing respectively are sufficient for this
3370 purpose. */
3371 EMACS_INT nread;
3372
3373 if (st.st_size <= (1024 * 4))
3374 nread = emacs_read (fd, read_buf, 1024 * 4);
3375 else
3376 {
3377 nread = emacs_read (fd, read_buf, 1024);
3378 if (nread >= 0)
3379 {
3380 if (lseek (fd, st.st_size - (1024 * 3), 0) < 0)
3381 report_file_error ("Setting file position",
3382 Fcons (orig_filename, Qnil));
3383 nread += emacs_read (fd, read_buf + nread, 1024 * 3);
3384 }
3385 }
3386
3387 if (nread < 0)
3388 error ("IO error reading %s: %s",
3389 SDATA (orig_filename), emacs_strerror (errno));
3390 else if (nread > 0)
3391 {
3392 struct buffer *prev = current_buffer;
3393 Lisp_Object buffer;
3394 struct buffer *buf;
3395
3396 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3397
3398 buffer = Fget_buffer_create (build_string (" *code-converting-work*"));
3399 buf = XBUFFER (buffer);
3400
3401 delete_all_overlays (buf);
3402 BVAR (buf, directory) = BVAR (current_buffer, directory);
3403 BVAR (buf, read_only) = Qnil;
3404 BVAR (buf, filename) = Qnil;
3405 BVAR (buf, undo_list) = Qt;
3406 eassert (buf->overlays_before == NULL);
3407 eassert (buf->overlays_after == NULL);
3408
3409 set_buffer_internal (buf);
3410 Ferase_buffer ();
3411 BVAR (buf, enable_multibyte_characters) = Qnil;
3412
3413 insert_1_both ((char *) read_buf, nread, nread, 0, 0, 0);
3414 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3415 coding_system = call2 (Vset_auto_coding_function,
3416 filename, make_number (nread));
3417 set_buffer_internal (prev);
3418
3419 /* Discard the unwind protect for recovering the
3420 current buffer. */
3421 specpdl_ptr--;
3422
3423 /* Rewind the file for the actual read done later. */
3424 if (lseek (fd, 0, 0) < 0)
3425 report_file_error ("Setting file position",
3426 Fcons (orig_filename, Qnil));
3427 }
3428 }
3429
3430 if (NILP (coding_system))
3431 {
3432 /* If we have not yet decided a coding system, check
3433 file-coding-system-alist. */
3434 Lisp_Object args[6];
3435
3436 args[0] = Qinsert_file_contents, args[1] = orig_filename;
3437 args[2] = visit, args[3] = beg, args[4] = end, args[5] = replace;
3438 coding_system = Ffind_operation_coding_system (6, args);
3439 if (CONSP (coding_system))
3440 coding_system = XCAR (coding_system);
3441 }
3442 }
3443
3444 if (NILP (coding_system))
3445 coding_system = Qundecided;
3446 else
3447 CHECK_CODING_SYSTEM (coding_system);
3448
3449 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
3450 /* We must suppress all character code conversion except for
3451 end-of-line conversion. */
3452 coding_system = raw_text_coding_system (coding_system);
3453
3454 setup_coding_system (coding_system, &coding);
3455 /* Ensure we set Vlast_coding_system_used. */
3456 set_coding_system = 1;
3457 }
3458
3459 /* If requested, replace the accessible part of the buffer
3460 with the file contents. Avoid replacing text at the
3461 beginning or end of the buffer that matches the file contents;
3462 that preserves markers pointing to the unchanged parts.
3463
3464 Here we implement this feature in an optimized way
3465 for the case where code conversion is NOT needed.
3466 The following if-statement handles the case of conversion
3467 in a less optimal way.
3468
3469 If the code conversion is "automatic" then we try using this
3470 method and hope for the best.
3471 But if we discover the need for conversion, we give up on this method
3472 and let the following if-statement handle the replace job. */
3473 if (!NILP (replace)
3474 && BEGV < ZV
3475 && (NILP (coding_system)
3476 || ! CODING_REQUIRE_DECODING (&coding)))
3477 {
3478 /* same_at_start and same_at_end count bytes,
3479 because file access counts bytes
3480 and BEG and END count bytes. */
3481 EMACS_INT same_at_start = BEGV_BYTE;
3482 EMACS_INT same_at_end = ZV_BYTE;
3483 EMACS_INT overlap;
3484 /* There is still a possibility we will find the need to do code
3485 conversion. If that happens, we set this variable to 1 to
3486 give up on handling REPLACE in the optimized way. */
3487 int giveup_match_end = 0;
3488
3489 if (XINT (beg) != 0)
3490 {
3491 if (lseek (fd, XINT (beg), 0) < 0)
3492 report_file_error ("Setting file position",
3493 Fcons (orig_filename, Qnil));
3494 }
3495
3496 immediate_quit = 1;
3497 QUIT;
3498 /* Count how many chars at the start of the file
3499 match the text at the beginning of the buffer. */
3500 while (1)
3501 {
3502 EMACS_INT nread, bufpos;
3503
3504 nread = emacs_read (fd, buffer, sizeof buffer);
3505 if (nread < 0)
3506 error ("IO error reading %s: %s",
3507 SSDATA (orig_filename), emacs_strerror (errno));
3508 else if (nread == 0)
3509 break;
3510
3511 if (CODING_REQUIRE_DETECTION (&coding))
3512 {
3513 coding_system = detect_coding_system ((unsigned char *) buffer,
3514 nread, nread, 1, 0,
3515 coding_system);
3516 setup_coding_system (coding_system, &coding);
3517 }
3518
3519 if (CODING_REQUIRE_DECODING (&coding))
3520 /* We found that the file should be decoded somehow.
3521 Let's give up here. */
3522 {
3523 giveup_match_end = 1;
3524 break;
3525 }
3526
3527 bufpos = 0;
3528 while (bufpos < nread && same_at_start < ZV_BYTE
3529 && FETCH_BYTE (same_at_start) == buffer[bufpos])
3530 same_at_start++, bufpos++;
3531 /* If we found a discrepancy, stop the scan.
3532 Otherwise loop around and scan the next bufferful. */
3533 if (bufpos != nread)
3534 break;
3535 }
3536 immediate_quit = 0;
3537 /* If the file matches the buffer completely,
3538 there's no need to replace anything. */
3539 if (same_at_start - BEGV_BYTE == XINT (end))
3540 {
3541 emacs_close (fd);
3542 specpdl_ptr--;
3543 /* Truncate the buffer to the size of the file. */
3544 del_range_1 (same_at_start, same_at_end, 0, 0);
3545 goto handled;
3546 }
3547 immediate_quit = 1;
3548 QUIT;
3549 /* Count how many chars at the end of the file
3550 match the text at the end of the buffer. But, if we have
3551 already found that decoding is necessary, don't waste time. */
3552 while (!giveup_match_end)
3553 {
3554 EMACS_INT total_read, nread, bufpos, curpos, trial;
3555
3556 /* At what file position are we now scanning? */
3557 curpos = XINT (end) - (ZV_BYTE - same_at_end);
3558 /* If the entire file matches the buffer tail, stop the scan. */
3559 if (curpos == 0)
3560 break;
3561 /* How much can we scan in the next step? */
3562 trial = min (curpos, sizeof buffer);
3563 if (lseek (fd, curpos - trial, 0) < 0)
3564 report_file_error ("Setting file position",
3565 Fcons (orig_filename, Qnil));
3566
3567 total_read = nread = 0;
3568 while (total_read < trial)
3569 {
3570 nread = emacs_read (fd, buffer + total_read, trial - total_read);
3571 if (nread < 0)
3572 error ("IO error reading %s: %s",
3573 SDATA (orig_filename), emacs_strerror (errno));
3574 else if (nread == 0)
3575 break;
3576 total_read += nread;
3577 }
3578
3579 /* Scan this bufferful from the end, comparing with
3580 the Emacs buffer. */
3581 bufpos = total_read;
3582
3583 /* Compare with same_at_start to avoid counting some buffer text
3584 as matching both at the file's beginning and at the end. */
3585 while (bufpos > 0 && same_at_end > same_at_start
3586 && FETCH_BYTE (same_at_end - 1) == buffer[bufpos - 1])
3587 same_at_end--, bufpos--;
3588
3589 /* If we found a discrepancy, stop the scan.
3590 Otherwise loop around and scan the preceding bufferful. */
3591 if (bufpos != 0)
3592 {
3593 /* If this discrepancy is because of code conversion,
3594 we cannot use this method; giveup and try the other. */
3595 if (same_at_end > same_at_start
3596 && FETCH_BYTE (same_at_end - 1) >= 0200
3597 && ! NILP (BVAR (current_buffer, enable_multibyte_characters))
3598 && (CODING_MAY_REQUIRE_DECODING (&coding)))
3599 giveup_match_end = 1;
3600 break;
3601 }
3602
3603 if (nread == 0)
3604 break;
3605 }
3606 immediate_quit = 0;
3607
3608 if (! giveup_match_end)
3609 {
3610 EMACS_INT temp;
3611
3612 /* We win! We can handle REPLACE the optimized way. */
3613
3614 /* Extend the start of non-matching text area to multibyte
3615 character boundary. */
3616 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3617 while (same_at_start > BEGV_BYTE
3618 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
3619 same_at_start--;
3620
3621 /* Extend the end of non-matching text area to multibyte
3622 character boundary. */
3623 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3624 while (same_at_end < ZV_BYTE
3625 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
3626 same_at_end++;
3627
3628 /* Don't try to reuse the same piece of text twice. */
3629 overlap = (same_at_start - BEGV_BYTE
3630 - (same_at_end + st.st_size - ZV));
3631 if (overlap > 0)
3632 same_at_end += overlap;
3633
3634 /* Arrange to read only the nonmatching middle part of the file. */
3635 XSETFASTINT (beg, XINT (beg) + (same_at_start - BEGV_BYTE));
3636 XSETFASTINT (end, XINT (end) - (ZV_BYTE - same_at_end));
3637
3638 del_range_byte (same_at_start, same_at_end, 0);
3639 /* Insert from the file at the proper position. */
3640 temp = BYTE_TO_CHAR (same_at_start);
3641 SET_PT_BOTH (temp, same_at_start);
3642
3643 /* If display currently starts at beginning of line,
3644 keep it that way. */
3645 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
3646 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
3647
3648 replace_handled = 1;
3649 }
3650 }
3651
3652 /* If requested, replace the accessible part of the buffer
3653 with the file contents. Avoid replacing text at the
3654 beginning or end of the buffer that matches the file contents;
3655 that preserves markers pointing to the unchanged parts.
3656
3657 Here we implement this feature for the case where code conversion
3658 is needed, in a simple way that needs a lot of memory.
3659 The preceding if-statement handles the case of no conversion
3660 in a more optimized way. */
3661 if (!NILP (replace) && ! replace_handled && BEGV < ZV)
3662 {
3663 EMACS_INT same_at_start = BEGV_BYTE;
3664 EMACS_INT same_at_end = ZV_BYTE;
3665 EMACS_INT same_at_start_charpos;
3666 EMACS_INT inserted_chars;
3667 EMACS_INT overlap;
3668 EMACS_INT bufpos;
3669 unsigned char *decoded;
3670 EMACS_INT temp;
3671 int this_count = SPECPDL_INDEX ();
3672 int multibyte = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
3673 Lisp_Object conversion_buffer;
3674
3675 conversion_buffer = code_conversion_save (1, multibyte);
3676
3677 /* First read the whole file, performing code conversion into
3678 CONVERSION_BUFFER. */
3679
3680 if (lseek (fd, XINT (beg), 0) < 0)
3681 report_file_error ("Setting file position",
3682 Fcons (orig_filename, Qnil));
3683
3684 total = st.st_size; /* Total bytes in the file. */
3685 how_much = 0; /* Bytes read from file so far. */
3686 inserted = 0; /* Bytes put into CONVERSION_BUFFER so far. */
3687 unprocessed = 0; /* Bytes not processed in previous loop. */
3688
3689 GCPRO1 (conversion_buffer);
3690 while (how_much < total)
3691 {
3692 /* We read one bunch by one (READ_BUF_SIZE bytes) to allow
3693 quitting while reading a huge while. */
3694 /* try is reserved in some compilers (Microsoft C) */
3695 EMACS_INT trytry = min (total - how_much,
3696 READ_BUF_SIZE - unprocessed);
3697 EMACS_INT this;
3698
3699 /* Allow quitting out of the actual I/O. */
3700 immediate_quit = 1;
3701 QUIT;
3702 this = emacs_read (fd, read_buf + unprocessed, trytry);
3703 immediate_quit = 0;
3704
3705 if (this <= 0)
3706 {
3707 if (this < 0)
3708 how_much = this;
3709 break;
3710 }
3711
3712 how_much += this;
3713
3714 BUF_TEMP_SET_PT (XBUFFER (conversion_buffer),
3715 BUF_Z (XBUFFER (conversion_buffer)));
3716 decode_coding_c_string (&coding, (unsigned char *) read_buf,
3717 unprocessed + this, conversion_buffer);
3718 unprocessed = coding.carryover_bytes;
3719 if (coding.carryover_bytes > 0)
3720 memcpy (read_buf, coding.carryover, unprocessed);
3721 }
3722 UNGCPRO;
3723 emacs_close (fd);
3724
3725 /* We should remove the unwind_protect calling
3726 close_file_unwind, but other stuff has been added the stack,
3727 so defer the removal till we reach the `handled' label. */
3728 deferred_remove_unwind_protect = 1;
3729
3730 /* At this point, HOW_MUCH should equal TOTAL, or should be <= 0
3731 if we couldn't read the file. */
3732
3733 if (how_much < 0)
3734 error ("IO error reading %s: %s",
3735 SDATA (orig_filename), emacs_strerror (errno));
3736
3737 if (unprocessed > 0)
3738 {
3739 coding.mode |= CODING_MODE_LAST_BLOCK;
3740 decode_coding_c_string (&coding, (unsigned char *) read_buf,
3741 unprocessed, conversion_buffer);
3742 coding.mode &= ~CODING_MODE_LAST_BLOCK;
3743 }
3744
3745 coding_system = CODING_ID_NAME (coding.id);
3746 set_coding_system = 1;
3747 decoded = BUF_BEG_ADDR (XBUFFER (conversion_buffer));
3748 inserted = (BUF_Z_BYTE (XBUFFER (conversion_buffer))
3749 - BUF_BEG_BYTE (XBUFFER (conversion_buffer)));
3750
3751 /* Compare the beginning of the converted string with the buffer
3752 text. */
3753
3754 bufpos = 0;
3755 while (bufpos < inserted && same_at_start < same_at_end
3756 && FETCH_BYTE (same_at_start) == decoded[bufpos])
3757 same_at_start++, bufpos++;
3758
3759 /* If the file matches the head of buffer completely,
3760 there's no need to replace anything. */
3761
3762 if (bufpos == inserted)
3763 {
3764 /* Truncate the buffer to the size of the file. */
3765 if (same_at_start == same_at_end)
3766 nochange = 1;
3767 else
3768 del_range_byte (same_at_start, same_at_end, 0);
3769 inserted = 0;
3770
3771 unbind_to (this_count, Qnil);
3772 goto handled;
3773 }
3774
3775 /* Extend the start of non-matching text area to the previous
3776 multibyte character boundary. */
3777 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3778 while (same_at_start > BEGV_BYTE
3779 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
3780 same_at_start--;
3781
3782 /* Scan this bufferful from the end, comparing with
3783 the Emacs buffer. */
3784 bufpos = inserted;
3785
3786 /* Compare with same_at_start to avoid counting some buffer text
3787 as matching both at the file's beginning and at the end. */
3788 while (bufpos > 0 && same_at_end > same_at_start
3789 && FETCH_BYTE (same_at_end - 1) == decoded[bufpos - 1])
3790 same_at_end--, bufpos--;
3791
3792 /* Extend the end of non-matching text area to the next
3793 multibyte character boundary. */
3794 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3795 while (same_at_end < ZV_BYTE
3796 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
3797 same_at_end++;
3798
3799 /* Don't try to reuse the same piece of text twice. */
3800 overlap = same_at_start - BEGV_BYTE - (same_at_end + inserted - ZV_BYTE);
3801 if (overlap > 0)
3802 same_at_end += overlap;
3803
3804 /* If display currently starts at beginning of line,
3805 keep it that way. */
3806 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
3807 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
3808
3809 /* Replace the chars that we need to replace,
3810 and update INSERTED to equal the number of bytes
3811 we are taking from the decoded string. */
3812 inserted -= (ZV_BYTE - same_at_end) + (same_at_start - BEGV_BYTE);
3813
3814 if (same_at_end != same_at_start)
3815 {
3816 del_range_byte (same_at_start, same_at_end, 0);
3817 temp = GPT;
3818 same_at_start = GPT_BYTE;
3819 }
3820 else
3821 {
3822 temp = BYTE_TO_CHAR (same_at_start);
3823 }
3824 /* Insert from the file at the proper position. */
3825 SET_PT_BOTH (temp, same_at_start);
3826 same_at_start_charpos
3827 = buf_bytepos_to_charpos (XBUFFER (conversion_buffer),
3828 same_at_start - BEGV_BYTE
3829 + BUF_BEG_BYTE (XBUFFER (conversion_buffer)));
3830 inserted_chars
3831 = (buf_bytepos_to_charpos (XBUFFER (conversion_buffer),
3832 same_at_start + inserted - BEGV_BYTE
3833 + BUF_BEG_BYTE (XBUFFER (conversion_buffer)))
3834 - same_at_start_charpos);
3835 /* This binding is to avoid ask-user-about-supersession-threat
3836 being called in insert_from_buffer (via in
3837 prepare_to_modify_buffer). */
3838 specbind (intern ("buffer-file-name"), Qnil);
3839 insert_from_buffer (XBUFFER (conversion_buffer),
3840 same_at_start_charpos, inserted_chars, 0);
3841 /* Set `inserted' to the number of inserted characters. */
3842 inserted = PT - temp;
3843 /* Set point before the inserted characters. */
3844 SET_PT_BOTH (temp, same_at_start);
3845
3846 unbind_to (this_count, Qnil);
3847
3848 goto handled;
3849 }
3850
3851 if (! not_regular)
3852 {
3853 register Lisp_Object temp;
3854
3855 total = XINT (end) - XINT (beg);
3856
3857 /* Make sure point-max won't overflow after this insertion. */
3858 XSETINT (temp, total);
3859 if (total != XINT (temp))
3860 error ("Maximum buffer size exceeded");
3861 }
3862 else
3863 /* For a special file, all we can do is guess. */
3864 total = READ_BUF_SIZE;
3865
3866 if (NILP (visit) && inserted > 0)
3867 {
3868 #ifdef CLASH_DETECTION
3869 if (!NILP (BVAR (current_buffer, file_truename))
3870 /* Make binding buffer-file-name to nil effective. */
3871 && !NILP (BVAR (current_buffer, filename))
3872 && SAVE_MODIFF >= MODIFF)
3873 we_locked_file = 1;
3874 #endif /* CLASH_DETECTION */
3875 prepare_to_modify_buffer (GPT, GPT, NULL);
3876 }
3877
3878 move_gap (PT);
3879 if (GAP_SIZE < total)
3880 make_gap (total - GAP_SIZE);
3881
3882 if (XINT (beg) != 0 || !NILP (replace))
3883 {
3884 if (lseek (fd, XINT (beg), 0) < 0)
3885 report_file_error ("Setting file position",
3886 Fcons (orig_filename, Qnil));
3887 }
3888
3889 /* In the following loop, HOW_MUCH contains the total bytes read so
3890 far for a regular file, and not changed for a special file. But,
3891 before exiting the loop, it is set to a negative value if I/O
3892 error occurs. */
3893 how_much = 0;
3894
3895 /* Total bytes inserted. */
3896 inserted = 0;
3897
3898 /* Here, we don't do code conversion in the loop. It is done by
3899 decode_coding_gap after all data are read into the buffer. */
3900 {
3901 EMACS_INT gap_size = GAP_SIZE;
3902
3903 while (how_much < total)
3904 {
3905 /* try is reserved in some compilers (Microsoft C) */
3906 EMACS_INT trytry = min (total - how_much, READ_BUF_SIZE);
3907 EMACS_INT this;
3908
3909 if (not_regular)
3910 {
3911 Lisp_Object val;
3912
3913 /* Maybe make more room. */
3914 if (gap_size < trytry)
3915 {
3916 make_gap (total - gap_size);
3917 gap_size = GAP_SIZE;
3918 }
3919
3920 /* Read from the file, capturing `quit'. When an
3921 error occurs, end the loop, and arrange for a quit
3922 to be signaled after decoding the text we read. */
3923 non_regular_fd = fd;
3924 non_regular_inserted = inserted;
3925 non_regular_nbytes = trytry;
3926 val = internal_condition_case_1 (read_non_regular, Qnil, Qerror,
3927 read_non_regular_quit);
3928 if (NILP (val))
3929 {
3930 read_quit = 1;
3931 break;
3932 }
3933
3934 this = XINT (val);
3935 }
3936 else
3937 {
3938 /* Allow quitting out of the actual I/O. We don't make text
3939 part of the buffer until all the reading is done, so a C-g
3940 here doesn't do any harm. */
3941 immediate_quit = 1;
3942 QUIT;
3943 this = emacs_read (fd,
3944 ((char *) BEG_ADDR + PT_BYTE - BEG_BYTE
3945 + inserted),
3946 trytry);
3947 immediate_quit = 0;
3948 }
3949
3950 if (this <= 0)
3951 {
3952 how_much = this;
3953 break;
3954 }
3955
3956 gap_size -= this;
3957
3958 /* For a regular file, where TOTAL is the real size,
3959 count HOW_MUCH to compare with it.
3960 For a special file, where TOTAL is just a buffer size,
3961 so don't bother counting in HOW_MUCH.
3962 (INSERTED is where we count the number of characters inserted.) */
3963 if (! not_regular)
3964 how_much += this;
3965 inserted += this;
3966 }
3967 }
3968
3969 /* Now we have read all the file data into the gap.
3970 If it was empty, undo marking the buffer modified. */
3971
3972 if (inserted == 0)
3973 {
3974 #ifdef CLASH_DETECTION
3975 if (we_locked_file)
3976 unlock_file (BVAR (current_buffer, file_truename));
3977 #endif
3978 Vdeactivate_mark = old_Vdeactivate_mark;
3979 }
3980 else
3981 Vdeactivate_mark = Qt;
3982
3983 /* Make the text read part of the buffer. */
3984 GAP_SIZE -= inserted;
3985 GPT += inserted;
3986 GPT_BYTE += inserted;
3987 ZV += inserted;
3988 ZV_BYTE += inserted;
3989 Z += inserted;
3990 Z_BYTE += inserted;
3991
3992 if (GAP_SIZE > 0)
3993 /* Put an anchor to ensure multi-byte form ends at gap. */
3994 *GPT_ADDR = 0;
3995
3996 emacs_close (fd);
3997
3998 /* Discard the unwind protect for closing the file. */
3999 specpdl_ptr--;
4000
4001 if (how_much < 0)
4002 error ("IO error reading %s: %s",
4003 SDATA (orig_filename), emacs_strerror (errno));
4004
4005 notfound:
4006
4007 if (NILP (coding_system))
4008 {
4009 /* The coding system is not yet decided. Decide it by an
4010 optimized method for handling `coding:' tag.
4011
4012 Note that we can get here only if the buffer was empty
4013 before the insertion. */
4014
4015 if (!NILP (Vcoding_system_for_read))
4016 coding_system = Vcoding_system_for_read;
4017 else
4018 {
4019 /* Since we are sure that the current buffer was empty
4020 before the insertion, we can toggle
4021 enable-multibyte-characters directly here without taking
4022 care of marker adjustment. By this way, we can run Lisp
4023 program safely before decoding the inserted text. */
4024 Lisp_Object unwind_data;
4025 int count = SPECPDL_INDEX ();
4026
4027 unwind_data = Fcons (BVAR (current_buffer, enable_multibyte_characters),
4028 Fcons (BVAR (current_buffer, undo_list),
4029 Fcurrent_buffer ()));
4030 BVAR (current_buffer, enable_multibyte_characters) = Qnil;
4031 BVAR (current_buffer, undo_list) = Qt;
4032 record_unwind_protect (decide_coding_unwind, unwind_data);
4033
4034 if (inserted > 0 && ! NILP (Vset_auto_coding_function))
4035 {
4036 coding_system = call2 (Vset_auto_coding_function,
4037 filename, make_number (inserted));
4038 }
4039
4040 if (NILP (coding_system))
4041 {
4042 /* If the coding system is not yet decided, check
4043 file-coding-system-alist. */
4044 Lisp_Object args[6];
4045
4046 args[0] = Qinsert_file_contents, args[1] = orig_filename;
4047 args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil;
4048 coding_system = Ffind_operation_coding_system (6, args);
4049 if (CONSP (coding_system))
4050 coding_system = XCAR (coding_system);
4051 }
4052 unbind_to (count, Qnil);
4053 inserted = Z_BYTE - BEG_BYTE;
4054 }
4055
4056 if (NILP (coding_system))
4057 coding_system = Qundecided;
4058 else
4059 CHECK_CODING_SYSTEM (coding_system);
4060
4061 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4062 /* We must suppress all character code conversion except for
4063 end-of-line conversion. */
4064 coding_system = raw_text_coding_system (coding_system);
4065 setup_coding_system (coding_system, &coding);
4066 /* Ensure we set Vlast_coding_system_used. */
4067 set_coding_system = 1;
4068 }
4069
4070 if (!NILP (visit))
4071 {
4072 /* When we visit a file by raw-text, we change the buffer to
4073 unibyte. */
4074 if (CODING_FOR_UNIBYTE (&coding)
4075 /* Can't do this if part of the buffer might be preserved. */
4076 && NILP (replace))
4077 /* Visiting a file with these coding system makes the buffer
4078 unibyte. */
4079 BVAR (current_buffer, enable_multibyte_characters) = Qnil;
4080 }
4081
4082 coding.dst_multibyte = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
4083 if (CODING_MAY_REQUIRE_DECODING (&coding)
4084 && (inserted > 0 || CODING_REQUIRE_FLUSHING (&coding)))
4085 {
4086 move_gap_both (PT, PT_BYTE);
4087 GAP_SIZE += inserted;
4088 ZV_BYTE -= inserted;
4089 Z_BYTE -= inserted;
4090 ZV -= inserted;
4091 Z -= inserted;
4092 decode_coding_gap (&coding, inserted, inserted);
4093 inserted = coding.produced_char;
4094 coding_system = CODING_ID_NAME (coding.id);
4095 }
4096 else if (inserted > 0)
4097 adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted,
4098 inserted);
4099
4100 /* Now INSERTED is measured in characters. */
4101
4102 handled:
4103
4104 if (deferred_remove_unwind_protect)
4105 /* If requested above, discard the unwind protect for closing the
4106 file. */
4107 specpdl_ptr--;
4108
4109 if (!NILP (visit))
4110 {
4111 if (!EQ (BVAR (current_buffer, undo_list), Qt) && !nochange)
4112 BVAR (current_buffer, undo_list) = Qnil;
4113
4114 if (NILP (handler))
4115 {
4116 current_buffer->modtime = st.st_mtime;
4117 current_buffer->modtime_size = st.st_size;
4118 BVAR (current_buffer, filename) = orig_filename;
4119 }
4120
4121 SAVE_MODIFF = MODIFF;
4122 BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
4123 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4124 #ifdef CLASH_DETECTION
4125 if (NILP (handler))
4126 {
4127 if (!NILP (BVAR (current_buffer, file_truename)))
4128 unlock_file (BVAR (current_buffer, file_truename));
4129 unlock_file (filename);
4130 }
4131 #endif /* CLASH_DETECTION */
4132 if (not_regular)
4133 xsignal2 (Qfile_error,
4134 build_string ("not a regular file"), orig_filename);
4135 }
4136
4137 if (set_coding_system)
4138 Vlast_coding_system_used = coding_system;
4139
4140 if (! NILP (Ffboundp (Qafter_insert_file_set_coding)))
4141 {
4142 insval = call2 (Qafter_insert_file_set_coding, make_number (inserted),
4143 visit);
4144 if (! NILP (insval))
4145 {
4146 CHECK_NUMBER (insval);
4147 inserted = XFASTINT (insval);
4148 }
4149 }
4150
4151 /* Decode file format. */
4152 if (inserted > 0)
4153 {
4154 /* Don't run point motion or modification hooks when decoding. */
4155 int count = SPECPDL_INDEX ();
4156 EMACS_INT old_inserted = inserted;
4157 specbind (Qinhibit_point_motion_hooks, Qt);
4158 specbind (Qinhibit_modification_hooks, Qt);
4159
4160 /* Save old undo list and don't record undo for decoding. */
4161 old_undo = BVAR (current_buffer, undo_list);
4162 BVAR (current_buffer, undo_list) = Qt;
4163
4164 if (NILP (replace))
4165 {
4166 insval = call3 (Qformat_decode,
4167 Qnil, make_number (inserted), visit);
4168 CHECK_NUMBER (insval);
4169 inserted = XFASTINT (insval);
4170 }
4171 else
4172 {
4173 /* If REPLACE is non-nil and we succeeded in not replacing the
4174 beginning or end of the buffer text with the file's contents,
4175 call format-decode with `point' positioned at the beginning
4176 of the buffer and `inserted' equalling the number of
4177 characters in the buffer. Otherwise, format-decode might
4178 fail to correctly analyze the beginning or end of the buffer.
4179 Hence we temporarily save `point' and `inserted' here and
4180 restore `point' iff format-decode did not insert or delete
4181 any text. Otherwise we leave `point' at point-min. */
4182 EMACS_INT opoint = PT;
4183 EMACS_INT opoint_byte = PT_BYTE;
4184 EMACS_INT oinserted = ZV - BEGV;
4185 int ochars_modiff = CHARS_MODIFF;
4186
4187 TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE);
4188 insval = call3 (Qformat_decode,
4189 Qnil, make_number (oinserted), visit);
4190 CHECK_NUMBER (insval);
4191 if (ochars_modiff == CHARS_MODIFF)
4192 /* format_decode didn't modify buffer's characters => move
4193 point back to position before inserted text and leave
4194 value of inserted alone. */
4195 SET_PT_BOTH (opoint, opoint_byte);
4196 else
4197 /* format_decode modified buffer's characters => consider
4198 entire buffer changed and leave point at point-min. */
4199 inserted = XFASTINT (insval);
4200 }
4201
4202 /* For consistency with format-decode call these now iff inserted > 0
4203 (martin 2007-06-28). */
4204 p = Vafter_insert_file_functions;
4205 while (CONSP (p))
4206 {
4207 if (NILP (replace))
4208 {
4209 insval = call1 (XCAR (p), make_number (inserted));
4210 if (!NILP (insval))
4211 {
4212 CHECK_NUMBER (insval);
4213 inserted = XFASTINT (insval);
4214 }
4215 }
4216 else
4217 {
4218 /* For the rationale of this see the comment on
4219 format-decode above. */
4220 EMACS_INT opoint = PT;
4221 EMACS_INT opoint_byte = PT_BYTE;
4222 EMACS_INT oinserted = ZV - BEGV;
4223 int ochars_modiff = CHARS_MODIFF;
4224
4225 TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE);
4226 insval = call1 (XCAR (p), make_number (oinserted));
4227 if (!NILP (insval))
4228 {
4229 CHECK_NUMBER (insval);
4230 if (ochars_modiff == CHARS_MODIFF)
4231 /* after_insert_file_functions didn't modify
4232 buffer's characters => move point back to
4233 position before inserted text and leave value of
4234 inserted alone. */
4235 SET_PT_BOTH (opoint, opoint_byte);
4236 else
4237 /* after_insert_file_functions did modify buffer's
4238 characters => consider entire buffer changed and
4239 leave point at point-min. */
4240 inserted = XFASTINT (insval);
4241 }
4242 }
4243
4244 QUIT;
4245 p = XCDR (p);
4246 }
4247
4248 if (NILP (visit))
4249 {
4250 BVAR (current_buffer, undo_list) = old_undo;
4251 if (CONSP (old_undo) && inserted != old_inserted)
4252 {
4253 /* Adjust the last undo record for the size change during
4254 the format conversion. */
4255 Lisp_Object tem = XCAR (old_undo);
4256 if (CONSP (tem) && INTEGERP (XCAR (tem))
4257 && INTEGERP (XCDR (tem))
4258 && XFASTINT (XCDR (tem)) == PT + old_inserted)
4259 XSETCDR (tem, make_number (PT + inserted));
4260 }
4261 }
4262 else
4263 /* If undo_list was Qt before, keep it that way.
4264 Otherwise start with an empty undo_list. */
4265 BVAR (current_buffer, undo_list) = EQ (old_undo, Qt) ? Qt : Qnil;
4266
4267 unbind_to (count, Qnil);
4268 }
4269
4270 /* Call after-change hooks for the inserted text, aside from the case
4271 of normal visiting (not with REPLACE), which is done in a new buffer
4272 "before" the buffer is changed. */
4273 if (inserted > 0 && total > 0
4274 && (NILP (visit) || !NILP (replace)))
4275 {
4276 signal_after_change (PT, 0, inserted);
4277 update_compositions (PT, PT, CHECK_BORDER);
4278 }
4279
4280 if (!NILP (visit)
4281 && current_buffer->modtime == -1)
4282 {
4283 /* If visiting nonexistent file, return nil. */
4284 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
4285 }
4286
4287 if (read_quit)
4288 Fsignal (Qquit, Qnil);
4289
4290 /* ??? Retval needs to be dealt with in all cases consistently. */
4291 if (NILP (val))
4292 val = Fcons (orig_filename,
4293 Fcons (make_number (inserted),
4294 Qnil));
4295
4296 RETURN_UNGCPRO (unbind_to (count, val));
4297 }
4298 \f
4299 static Lisp_Object build_annotations (Lisp_Object, Lisp_Object);
4300
4301 static Lisp_Object
4302 build_annotations_unwind (Lisp_Object arg)
4303 {
4304 Vwrite_region_annotation_buffers = arg;
4305 return Qnil;
4306 }
4307
4308 /* Decide the coding-system to encode the data with. */
4309
4310 static Lisp_Object
4311 choose_write_coding_system (Lisp_Object start, Lisp_Object end, Lisp_Object filename,
4312 Lisp_Object append, Lisp_Object visit, Lisp_Object lockname,
4313 struct coding_system *coding)
4314 {
4315 Lisp_Object val;
4316 Lisp_Object eol_parent = Qnil;
4317
4318 if (auto_saving
4319 && NILP (Fstring_equal (BVAR (current_buffer, filename),
4320 BVAR (current_buffer, auto_save_file_name))))
4321 {
4322 val = Qutf_8_emacs;
4323 eol_parent = Qunix;
4324 }
4325 else if (!NILP (Vcoding_system_for_write))
4326 {
4327 val = Vcoding_system_for_write;
4328 if (coding_system_require_warning
4329 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4330 /* Confirm that VAL can surely encode the current region. */
4331 val = call5 (Vselect_safe_coding_system_function,
4332 start, end, Fcons (Qt, Fcons (val, Qnil)),
4333 Qnil, filename);
4334 }
4335 else
4336 {
4337 /* If the variable `buffer-file-coding-system' is set locally,
4338 it means that the file was read with some kind of code
4339 conversion or the variable is explicitly set by users. We
4340 had better write it out with the same coding system even if
4341 `enable-multibyte-characters' is nil.
4342
4343 If it is not set locally, we anyway have to convert EOL
4344 format if the default value of `buffer-file-coding-system'
4345 tells that it is not Unix-like (LF only) format. */
4346 int using_default_coding = 0;
4347 int force_raw_text = 0;
4348
4349 val = BVAR (current_buffer, buffer_file_coding_system);
4350 if (NILP (val)
4351 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
4352 {
4353 val = Qnil;
4354 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4355 force_raw_text = 1;
4356 }
4357
4358 if (NILP (val))
4359 {
4360 /* Check file-coding-system-alist. */
4361 Lisp_Object args[7], coding_systems;
4362
4363 args[0] = Qwrite_region; args[1] = start; args[2] = end;
4364 args[3] = filename; args[4] = append; args[5] = visit;
4365 args[6] = lockname;
4366 coding_systems = Ffind_operation_coding_system (7, args);
4367 if (CONSP (coding_systems) && !NILP (XCDR (coding_systems)))
4368 val = XCDR (coding_systems);
4369 }
4370
4371 if (NILP (val))
4372 {
4373 /* If we still have not decided a coding system, use the
4374 default value of buffer-file-coding-system. */
4375 val = BVAR (current_buffer, buffer_file_coding_system);
4376 using_default_coding = 1;
4377 }
4378
4379 if (! NILP (val) && ! force_raw_text)
4380 {
4381 Lisp_Object spec, attrs;
4382
4383 CHECK_CODING_SYSTEM_GET_SPEC (val, spec);
4384 attrs = AREF (spec, 0);
4385 if (EQ (CODING_ATTR_TYPE (attrs), Qraw_text))
4386 force_raw_text = 1;
4387 }
4388
4389 if (!force_raw_text
4390 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4391 /* Confirm that VAL can surely encode the current region. */
4392 val = call5 (Vselect_safe_coding_system_function,
4393 start, end, val, Qnil, filename);
4394
4395 /* If the decided coding-system doesn't specify end-of-line
4396 format, we use that of
4397 `default-buffer-file-coding-system'. */
4398 if (! using_default_coding
4399 && ! NILP (BVAR (&buffer_defaults, buffer_file_coding_system)))
4400 val = (coding_inherit_eol_type
4401 (val, BVAR (&buffer_defaults, buffer_file_coding_system)));
4402
4403 /* If we decide not to encode text, use `raw-text' or one of its
4404 subsidiaries. */
4405 if (force_raw_text)
4406 val = raw_text_coding_system (val);
4407 }
4408
4409 val = coding_inherit_eol_type (val, eol_parent);
4410 setup_coding_system (val, coding);
4411
4412 if (!STRINGP (start) && !NILP (BVAR (current_buffer, selective_display)))
4413 coding->mode |= CODING_MODE_SELECTIVE_DISPLAY;
4414 return val;
4415 }
4416
4417 DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 7,
4418 "r\nFWrite region to file: \ni\ni\ni\np",
4419 doc: /* Write current region into specified file.
4420 When called from a program, requires three arguments:
4421 START, END and FILENAME. START and END are normally buffer positions
4422 specifying the part of the buffer to write.
4423 If START is nil, that means to use the entire buffer contents.
4424 If START is a string, then output that string to the file
4425 instead of any buffer contents; END is ignored.
4426
4427 Optional fourth argument APPEND if non-nil means
4428 append to existing file contents (if any). If it is an integer,
4429 seek to that offset in the file before writing.
4430 Optional fifth argument VISIT, if t or a string, means
4431 set the last-save-file-modtime of buffer to this file's modtime
4432 and mark buffer not modified.
4433 If VISIT is a string, it is a second file name;
4434 the output goes to FILENAME, but the buffer is marked as visiting VISIT.
4435 VISIT is also the file name to lock and unlock for clash detection.
4436 If VISIT is neither t nor nil nor a string,
4437 that means do not display the \"Wrote file\" message.
4438 The optional sixth arg LOCKNAME, if non-nil, specifies the name to
4439 use for locking and unlocking, overriding FILENAME and VISIT.
4440 The optional seventh arg MUSTBENEW, if non-nil, insists on a check
4441 for an existing file with the same name. If MUSTBENEW is `excl',
4442 that means to get an error if the file already exists; never overwrite.
4443 If MUSTBENEW is neither nil nor `excl', that means ask for
4444 confirmation before overwriting, but do go ahead and overwrite the file
4445 if the user confirms.
4446
4447 This does code conversion according to the value of
4448 `coding-system-for-write', `buffer-file-coding-system', or
4449 `file-coding-system-alist', and sets the variable
4450 `last-coding-system-used' to the coding system actually used.
4451
4452 This calls `write-region-annotate-functions' at the start, and
4453 `write-region-post-annotation-function' at the end. */)
4454 (Lisp_Object start, Lisp_Object end, Lisp_Object filename, Lisp_Object append, Lisp_Object visit, Lisp_Object lockname, Lisp_Object mustbenew)
4455 {
4456 register int desc;
4457 int failure;
4458 int save_errno = 0;
4459 const char *fn;
4460 struct stat st;
4461 int count = SPECPDL_INDEX ();
4462 int count1;
4463 Lisp_Object handler;
4464 Lisp_Object visit_file;
4465 Lisp_Object annotations;
4466 Lisp_Object encoded_filename;
4467 int visiting = (EQ (visit, Qt) || STRINGP (visit));
4468 int quietly = !NILP (visit);
4469 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
4470 struct buffer *given_buffer;
4471 struct coding_system coding;
4472
4473 if (current_buffer->base_buffer && visiting)
4474 error ("Cannot do file visiting in an indirect buffer");
4475
4476 if (!NILP (start) && !STRINGP (start))
4477 validate_region (&start, &end);
4478
4479 visit_file = Qnil;
4480 GCPRO5 (start, filename, visit, visit_file, lockname);
4481
4482 filename = Fexpand_file_name (filename, Qnil);
4483
4484 if (!NILP (mustbenew) && !EQ (mustbenew, Qexcl))
4485 barf_or_query_if_file_exists (filename, "overwrite", 1, 0, 1);
4486
4487 if (STRINGP (visit))
4488 visit_file = Fexpand_file_name (visit, Qnil);
4489 else
4490 visit_file = filename;
4491
4492 if (NILP (lockname))
4493 lockname = visit_file;
4494
4495 annotations = Qnil;
4496
4497 /* If the file name has special constructs in it,
4498 call the corresponding file handler. */
4499 handler = Ffind_file_name_handler (filename, Qwrite_region);
4500 /* If FILENAME has no handler, see if VISIT has one. */
4501 if (NILP (handler) && STRINGP (visit))
4502 handler = Ffind_file_name_handler (visit, Qwrite_region);
4503
4504 if (!NILP (handler))
4505 {
4506 Lisp_Object val;
4507 val = call6 (handler, Qwrite_region, start, end,
4508 filename, append, visit);
4509
4510 if (visiting)
4511 {
4512 SAVE_MODIFF = MODIFF;
4513 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4514 BVAR (current_buffer, filename) = visit_file;
4515 }
4516 UNGCPRO;
4517 return val;
4518 }
4519
4520 record_unwind_protect (save_restriction_restore, save_restriction_save ());
4521
4522 /* Special kludge to simplify auto-saving. */
4523 if (NILP (start))
4524 {
4525 /* Do it later, so write-region-annotate-function can work differently
4526 if we save "the buffer" vs "a region".
4527 This is useful in tar-mode. --Stef
4528 XSETFASTINT (start, BEG);
4529 XSETFASTINT (end, Z); */
4530 Fwiden ();
4531 }
4532
4533 record_unwind_protect (build_annotations_unwind,
4534 Vwrite_region_annotation_buffers);
4535 Vwrite_region_annotation_buffers = Fcons (Fcurrent_buffer (), Qnil);
4536 count1 = SPECPDL_INDEX ();
4537
4538 given_buffer = current_buffer;
4539
4540 if (!STRINGP (start))
4541 {
4542 annotations = build_annotations (start, end);
4543
4544 if (current_buffer != given_buffer)
4545 {
4546 XSETFASTINT (start, BEGV);
4547 XSETFASTINT (end, ZV);
4548 }
4549 }
4550
4551 if (NILP (start))
4552 {
4553 XSETFASTINT (start, BEGV);
4554 XSETFASTINT (end, ZV);
4555 }
4556
4557 UNGCPRO;
4558
4559 GCPRO5 (start, filename, annotations, visit_file, lockname);
4560
4561 /* Decide the coding-system to encode the data with.
4562 We used to make this choice before calling build_annotations, but that
4563 leads to problems when a write-annotate-function takes care of
4564 unsavable chars (as was the case with X-Symbol). */
4565 Vlast_coding_system_used
4566 = choose_write_coding_system (start, end, filename,
4567 append, visit, lockname, &coding);
4568
4569 #ifdef CLASH_DETECTION
4570 if (!auto_saving)
4571 lock_file (lockname);
4572 #endif /* CLASH_DETECTION */
4573
4574 encoded_filename = ENCODE_FILE (filename);
4575
4576 fn = SSDATA (encoded_filename);
4577 desc = -1;
4578 if (!NILP (append))
4579 #ifdef DOS_NT
4580 desc = emacs_open (fn, O_WRONLY | O_BINARY, 0);
4581 #else /* not DOS_NT */
4582 desc = emacs_open (fn, O_WRONLY, 0);
4583 #endif /* not DOS_NT */
4584
4585 if (desc < 0 && (NILP (append) || errno == ENOENT))
4586 #ifdef DOS_NT
4587 desc = emacs_open (fn,
4588 O_WRONLY | O_CREAT | O_BINARY
4589 | (EQ (mustbenew, Qexcl) ? O_EXCL : O_TRUNC),
4590 S_IREAD | S_IWRITE);
4591 #else /* not DOS_NT */
4592 desc = emacs_open (fn, O_WRONLY | O_TRUNC | O_CREAT
4593 | (EQ (mustbenew, Qexcl) ? O_EXCL : 0),
4594 auto_saving ? auto_save_mode_bits : 0666);
4595 #endif /* not DOS_NT */
4596
4597 if (desc < 0)
4598 {
4599 #ifdef CLASH_DETECTION
4600 save_errno = errno;
4601 if (!auto_saving) unlock_file (lockname);
4602 errno = save_errno;
4603 #endif /* CLASH_DETECTION */
4604 UNGCPRO;
4605 report_file_error ("Opening output file", Fcons (filename, Qnil));
4606 }
4607
4608 record_unwind_protect (close_file_unwind, make_number (desc));
4609
4610 if (!NILP (append) && !NILP (Ffile_regular_p (filename)))
4611 {
4612 long ret;
4613
4614 if (NUMBERP (append))
4615 ret = lseek (desc, XINT (append), 1);
4616 else
4617 ret = lseek (desc, 0, 2);
4618 if (ret < 0)
4619 {
4620 #ifdef CLASH_DETECTION
4621 if (!auto_saving) unlock_file (lockname);
4622 #endif /* CLASH_DETECTION */
4623 UNGCPRO;
4624 report_file_error ("Lseek error", Fcons (filename, Qnil));
4625 }
4626 }
4627
4628 UNGCPRO;
4629
4630 failure = 0;
4631 immediate_quit = 1;
4632
4633 if (STRINGP (start))
4634 {
4635 failure = 0 > a_write (desc, start, 0, SCHARS (start),
4636 &annotations, &coding);
4637 save_errno = errno;
4638 }
4639 else if (XINT (start) != XINT (end))
4640 {
4641 failure = 0 > a_write (desc, Qnil,
4642 XINT (start), XINT (end) - XINT (start),
4643 &annotations, &coding);
4644 save_errno = errno;
4645 }
4646 else
4647 {
4648 /* If file was empty, still need to write the annotations */
4649 coding.mode |= CODING_MODE_LAST_BLOCK;
4650 failure = 0 > a_write (desc, Qnil, XINT (end), 0, &annotations, &coding);
4651 save_errno = errno;
4652 }
4653
4654 if (CODING_REQUIRE_FLUSHING (&coding)
4655 && !(coding.mode & CODING_MODE_LAST_BLOCK)
4656 && ! failure)
4657 {
4658 /* We have to flush out a data. */
4659 coding.mode |= CODING_MODE_LAST_BLOCK;
4660 failure = 0 > e_write (desc, Qnil, 1, 1, &coding);
4661 save_errno = errno;
4662 }
4663
4664 immediate_quit = 0;
4665
4666 #ifdef HAVE_FSYNC
4667 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun).
4668 Disk full in NFS may be reported here. */
4669 /* mib says that closing the file will try to write as fast as NFS can do
4670 it, and that means the fsync here is not crucial for autosave files. */
4671 if (!auto_saving && !write_region_inhibit_fsync && fsync (desc) < 0)
4672 {
4673 /* If fsync fails with EINTR, don't treat that as serious. Also
4674 ignore EINVAL which happens when fsync is not supported on this
4675 file. */
4676 if (errno != EINTR && errno != EINVAL)
4677 failure = 1, save_errno = errno;
4678 }
4679 #endif
4680
4681 /* NFS can report a write failure now. */
4682 if (emacs_close (desc) < 0)
4683 failure = 1, save_errno = errno;
4684
4685 stat (fn, &st);
4686
4687 /* Discard the unwind protect for close_file_unwind. */
4688 specpdl_ptr = specpdl + count1;
4689
4690 /* Call write-region-post-annotation-function. */
4691 while (CONSP (Vwrite_region_annotation_buffers))
4692 {
4693 Lisp_Object buf = XCAR (Vwrite_region_annotation_buffers);
4694 if (!NILP (Fbuffer_live_p (buf)))
4695 {
4696 Fset_buffer (buf);
4697 if (FUNCTIONP (Vwrite_region_post_annotation_function))
4698 call0 (Vwrite_region_post_annotation_function);
4699 }
4700 Vwrite_region_annotation_buffers
4701 = XCDR (Vwrite_region_annotation_buffers);
4702 }
4703
4704 unbind_to (count, Qnil);
4705
4706 #ifdef CLASH_DETECTION
4707 if (!auto_saving)
4708 unlock_file (lockname);
4709 #endif /* CLASH_DETECTION */
4710
4711 /* Do this before reporting IO error
4712 to avoid a "file has changed on disk" warning on
4713 next attempt to save. */
4714 if (visiting)
4715 {
4716 current_buffer->modtime = st.st_mtime;
4717 current_buffer->modtime_size = st.st_size;
4718 }
4719
4720 if (failure)
4721 error ("IO error writing %s: %s", SDATA (filename),
4722 emacs_strerror (save_errno));
4723
4724 if (visiting)
4725 {
4726 SAVE_MODIFF = MODIFF;
4727 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4728 BVAR (current_buffer, filename) = visit_file;
4729 update_mode_lines++;
4730 }
4731 else if (quietly)
4732 {
4733 if (auto_saving
4734 && ! NILP (Fstring_equal (BVAR (current_buffer, filename),
4735 BVAR (current_buffer, auto_save_file_name))))
4736 SAVE_MODIFF = MODIFF;
4737
4738 return Qnil;
4739 }
4740
4741 if (!auto_saving)
4742 message_with_string ((INTEGERP (append)
4743 ? "Updated %s"
4744 : ! NILP (append)
4745 ? "Added to %s"
4746 : "Wrote %s"),
4747 visit_file, 1);
4748
4749 return Qnil;
4750 }
4751 \f
4752 Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
4753
4754 DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0,
4755 doc: /* Return t if (car A) is numerically less than (car B). */)
4756 (Lisp_Object a, Lisp_Object b)
4757 {
4758 return Flss (Fcar (a), Fcar (b));
4759 }
4760
4761 /* Build the complete list of annotations appropriate for writing out
4762 the text between START and END, by calling all the functions in
4763 write-region-annotate-functions and merging the lists they return.
4764 If one of these functions switches to a different buffer, we assume
4765 that buffer contains altered text. Therefore, the caller must
4766 make sure to restore the current buffer in all cases,
4767 as save-excursion would do. */
4768
4769 static Lisp_Object
4770 build_annotations (Lisp_Object start, Lisp_Object end)
4771 {
4772 Lisp_Object annotations;
4773 Lisp_Object p, res;
4774 struct gcpro gcpro1, gcpro2;
4775 Lisp_Object original_buffer;
4776 int i, used_global = 0;
4777
4778 XSETBUFFER (original_buffer, current_buffer);
4779
4780 annotations = Qnil;
4781 p = Vwrite_region_annotate_functions;
4782 GCPRO2 (annotations, p);
4783 while (CONSP (p))
4784 {
4785 struct buffer *given_buffer = current_buffer;
4786 if (EQ (Qt, XCAR (p)) && !used_global)
4787 { /* Use the global value of the hook. */
4788 Lisp_Object arg[2];
4789 used_global = 1;
4790 arg[0] = Fdefault_value (Qwrite_region_annotate_functions);
4791 arg[1] = XCDR (p);
4792 p = Fappend (2, arg);
4793 continue;
4794 }
4795 Vwrite_region_annotations_so_far = annotations;
4796 res = call2 (XCAR (p), start, end);
4797 /* If the function makes a different buffer current,
4798 assume that means this buffer contains altered text to be output.
4799 Reset START and END from the buffer bounds
4800 and discard all previous annotations because they should have
4801 been dealt with by this function. */
4802 if (current_buffer != given_buffer)
4803 {
4804 Vwrite_region_annotation_buffers
4805 = Fcons (Fcurrent_buffer (),
4806 Vwrite_region_annotation_buffers);
4807 XSETFASTINT (start, BEGV);
4808 XSETFASTINT (end, ZV);
4809 annotations = Qnil;
4810 }
4811 Flength (res); /* Check basic validity of return value */
4812 annotations = merge (annotations, res, Qcar_less_than_car);
4813 p = XCDR (p);
4814 }
4815
4816 /* Now do the same for annotation functions implied by the file-format */
4817 if (auto_saving && (!EQ (BVAR (current_buffer, auto_save_file_format), Qt)))
4818 p = BVAR (current_buffer, auto_save_file_format);
4819 else
4820 p = BVAR (current_buffer, file_format);
4821 for (i = 0; CONSP (p); p = XCDR (p), ++i)
4822 {
4823 struct buffer *given_buffer = current_buffer;
4824
4825 Vwrite_region_annotations_so_far = annotations;
4826
4827 /* Value is either a list of annotations or nil if the function
4828 has written annotations to a temporary buffer, which is now
4829 current. */
4830 res = call5 (Qformat_annotate_function, XCAR (p), start, end,
4831 original_buffer, make_number (i));
4832 if (current_buffer != given_buffer)
4833 {
4834 XSETFASTINT (start, BEGV);
4835 XSETFASTINT (end, ZV);
4836 annotations = Qnil;
4837 }
4838
4839 if (CONSP (res))
4840 annotations = merge (annotations, res, Qcar_less_than_car);
4841 }
4842
4843 UNGCPRO;
4844 return annotations;
4845 }
4846
4847 \f
4848 /* Write to descriptor DESC the NCHARS chars starting at POS of STRING.
4849 If STRING is nil, POS is the character position in the current buffer.
4850 Intersperse with them the annotations from *ANNOT
4851 which fall within the range of POS to POS + NCHARS,
4852 each at its appropriate position.
4853
4854 We modify *ANNOT by discarding elements as we use them up.
4855
4856 The return value is negative in case of system call failure. */
4857
4858 static int
4859 a_write (int desc, Lisp_Object string, int pos, register int nchars, Lisp_Object *annot, struct coding_system *coding)
4860 {
4861 Lisp_Object tem;
4862 int nextpos;
4863 int lastpos = pos + nchars;
4864
4865 while (NILP (*annot) || CONSP (*annot))
4866 {
4867 tem = Fcar_safe (Fcar (*annot));
4868 nextpos = pos - 1;
4869 if (INTEGERP (tem))
4870 nextpos = XFASTINT (tem);
4871
4872 /* If there are no more annotations in this range,
4873 output the rest of the range all at once. */
4874 if (! (nextpos >= pos && nextpos <= lastpos))
4875 return e_write (desc, string, pos, lastpos, coding);
4876
4877 /* Output buffer text up to the next annotation's position. */
4878 if (nextpos > pos)
4879 {
4880 if (0 > e_write (desc, string, pos, nextpos, coding))
4881 return -1;
4882 pos = nextpos;
4883 }
4884 /* Output the annotation. */
4885 tem = Fcdr (Fcar (*annot));
4886 if (STRINGP (tem))
4887 {
4888 if (0 > e_write (desc, tem, 0, SCHARS (tem), coding))
4889 return -1;
4890 }
4891 *annot = Fcdr (*annot);
4892 }
4893 return 0;
4894 }
4895
4896
4897 /* Write text in the range START and END into descriptor DESC,
4898 encoding them with coding system CODING. If STRING is nil, START
4899 and END are character positions of the current buffer, else they
4900 are indexes to the string STRING. */
4901
4902 static int
4903 e_write (int desc, Lisp_Object string, int start, int end, struct coding_system *coding)
4904 {
4905 if (STRINGP (string))
4906 {
4907 start = 0;
4908 end = SCHARS (string);
4909 }
4910
4911 /* We used to have a code for handling selective display here. But,
4912 now it is handled within encode_coding. */
4913
4914 while (start < end)
4915 {
4916 if (STRINGP (string))
4917 {
4918 coding->src_multibyte = SCHARS (string) < SBYTES (string);
4919 if (CODING_REQUIRE_ENCODING (coding))
4920 {
4921 encode_coding_object (coding, string,
4922 start, string_char_to_byte (string, start),
4923 end, string_char_to_byte (string, end), Qt);
4924 }
4925 else
4926 {
4927 coding->dst_object = string;
4928 coding->consumed_char = SCHARS (string);
4929 coding->produced = SBYTES (string);
4930 }
4931 }
4932 else
4933 {
4934 int start_byte = CHAR_TO_BYTE (start);
4935 int end_byte = CHAR_TO_BYTE (end);
4936
4937 coding->src_multibyte = (end - start) < (end_byte - start_byte);
4938 if (CODING_REQUIRE_ENCODING (coding))
4939 {
4940 encode_coding_object (coding, Fcurrent_buffer (),
4941 start, start_byte, end, end_byte, Qt);
4942 }
4943 else
4944 {
4945 coding->dst_object = Qnil;
4946 coding->dst_pos_byte = start_byte;
4947 if (start >= GPT || end <= GPT)
4948 {
4949 coding->consumed_char = end - start;
4950 coding->produced = end_byte - start_byte;
4951 }
4952 else
4953 {
4954 coding->consumed_char = GPT - start;
4955 coding->produced = GPT_BYTE - start_byte;
4956 }
4957 }
4958 }
4959
4960 if (coding->produced > 0)
4961 {
4962 coding->produced -=
4963 emacs_write (desc,
4964 STRINGP (coding->dst_object)
4965 ? SSDATA (coding->dst_object)
4966 : (char *) BYTE_POS_ADDR (coding->dst_pos_byte),
4967 coding->produced);
4968
4969 if (coding->produced)
4970 return -1;
4971 }
4972 start += coding->consumed_char;
4973 }
4974
4975 return 0;
4976 }
4977 \f
4978 DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime,
4979 Sverify_visited_file_modtime, 0, 1, 0,
4980 doc: /* Return t if last mod time of BUF's visited file matches what BUF records.
4981 This means that the file has not been changed since it was visited or saved.
4982 If BUF is omitted or nil, it defaults to the current buffer.
4983 See Info node `(elisp)Modification Time' for more details. */)
4984 (Lisp_Object buf)
4985 {
4986 struct buffer *b;
4987 struct stat st;
4988 Lisp_Object handler;
4989 Lisp_Object filename;
4990
4991 if (NILP (buf))
4992 b = current_buffer;
4993 else
4994 {
4995 CHECK_BUFFER (buf);
4996 b = XBUFFER (buf);
4997 }
4998
4999 if (!STRINGP (BVAR (b, filename))) return Qt;
5000 if (b->modtime == 0) return Qt;
5001
5002 /* If the file name has special constructs in it,
5003 call the corresponding file handler. */
5004 handler = Ffind_file_name_handler (BVAR (b, filename),
5005 Qverify_visited_file_modtime);
5006 if (!NILP (handler))
5007 return call2 (handler, Qverify_visited_file_modtime, buf);
5008
5009 filename = ENCODE_FILE (BVAR (b, filename));
5010
5011 if (stat (SSDATA (filename), &st) < 0)
5012 {
5013 /* If the file doesn't exist now and didn't exist before,
5014 we say that it isn't modified, provided the error is a tame one. */
5015 if (errno == ENOENT || errno == EACCES || errno == ENOTDIR)
5016 st.st_mtime = -1;
5017 else
5018 st.st_mtime = 0;
5019 }
5020 if ((st.st_mtime == b->modtime
5021 /* If both are positive, accept them if they are off by one second. */
5022 || (st.st_mtime > 0 && b->modtime > 0
5023 && (st.st_mtime == b->modtime + 1
5024 || st.st_mtime == b->modtime - 1)))
5025 && (st.st_size == b->modtime_size
5026 || b->modtime_size < 0))
5027 return Qt;
5028 return Qnil;
5029 }
5030
5031 DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime,
5032 Sclear_visited_file_modtime, 0, 0, 0,
5033 doc: /* Clear out records of last mod time of visited file.
5034 Next attempt to save will certainly not complain of a discrepancy. */)
5035 (void)
5036 {
5037 current_buffer->modtime = 0;
5038 current_buffer->modtime_size = -1;
5039 return Qnil;
5040 }
5041
5042 DEFUN ("visited-file-modtime", Fvisited_file_modtime,
5043 Svisited_file_modtime, 0, 0, 0,
5044 doc: /* Return the current buffer's recorded visited file modification time.
5045 The value is a list of the form (HIGH LOW), like the time values
5046 that `file-attributes' returns. If the current buffer has no recorded
5047 file modification time, this function returns 0.
5048 See Info node `(elisp)Modification Time' for more details. */)
5049 (void)
5050 {
5051 if (! current_buffer->modtime)
5052 return make_number (0);
5053 return make_time ((time_t) current_buffer->modtime);
5054 }
5055
5056 DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime,
5057 Sset_visited_file_modtime, 0, 1, 0,
5058 doc: /* Update buffer's recorded modification time from the visited file's time.
5059 Useful if the buffer was not read from the file normally
5060 or if the file itself has been changed for some known benign reason.
5061 An argument specifies the modification time value to use
5062 \(instead of that of the visited file), in the form of a list
5063 \(HIGH . LOW) or (HIGH LOW). */)
5064 (Lisp_Object time_list)
5065 {
5066 if (!NILP (time_list))
5067 {
5068 current_buffer->modtime = cons_to_long (time_list);
5069 current_buffer->modtime_size = -1;
5070 }
5071 else
5072 {
5073 register Lisp_Object filename;
5074 struct stat st;
5075 Lisp_Object handler;
5076
5077 filename = Fexpand_file_name (BVAR (current_buffer, filename), Qnil);
5078
5079 /* If the file name has special constructs in it,
5080 call the corresponding file handler. */
5081 handler = Ffind_file_name_handler (filename, Qset_visited_file_modtime);
5082 if (!NILP (handler))
5083 /* The handler can find the file name the same way we did. */
5084 return call2 (handler, Qset_visited_file_modtime, Qnil);
5085
5086 filename = ENCODE_FILE (filename);
5087
5088 if (stat (SSDATA (filename), &st) >= 0)
5089 {
5090 current_buffer->modtime = st.st_mtime;
5091 current_buffer->modtime_size = st.st_size;
5092 }
5093 }
5094
5095 return Qnil;
5096 }
5097 \f
5098 Lisp_Object
5099 auto_save_error (Lisp_Object error)
5100 {
5101 Lisp_Object args[3], msg;
5102 int i, nbytes;
5103 struct gcpro gcpro1;
5104 char *msgbuf;
5105 USE_SAFE_ALLOCA;
5106
5107 auto_save_error_occurred = 1;
5108
5109 ring_bell (XFRAME (selected_frame));
5110
5111 args[0] = build_string ("Auto-saving %s: %s");
5112 args[1] = BVAR (current_buffer, name);
5113 args[2] = Ferror_message_string (error);
5114 msg = Fformat (3, args);
5115 GCPRO1 (msg);
5116 nbytes = SBYTES (msg);
5117 SAFE_ALLOCA (msgbuf, char *, nbytes);
5118 memcpy (msgbuf, SDATA (msg), nbytes);
5119
5120 for (i = 0; i < 3; ++i)
5121 {
5122 if (i == 0)
5123 message2 (msgbuf, nbytes, STRING_MULTIBYTE (msg));
5124 else
5125 message2_nolog (msgbuf, nbytes, STRING_MULTIBYTE (msg));
5126 Fsleep_for (make_number (1), Qnil);
5127 }
5128
5129 SAFE_FREE ();
5130 UNGCPRO;
5131 return Qnil;
5132 }
5133
5134 Lisp_Object
5135 auto_save_1 (void)
5136 {
5137 struct stat st;
5138 Lisp_Object modes;
5139
5140 auto_save_mode_bits = 0666;
5141
5142 /* Get visited file's mode to become the auto save file's mode. */
5143 if (! NILP (BVAR (current_buffer, filename)))
5144 {
5145 if (stat (SSDATA (BVAR (current_buffer, filename)), &st) >= 0)
5146 /* But make sure we can overwrite it later! */
5147 auto_save_mode_bits = st.st_mode | 0600;
5148 else if ((modes = Ffile_modes (BVAR (current_buffer, filename)),
5149 INTEGERP (modes)))
5150 /* Remote files don't cooperate with stat. */
5151 auto_save_mode_bits = XINT (modes) | 0600;
5152 }
5153
5154 return
5155 Fwrite_region (Qnil, Qnil, BVAR (current_buffer, auto_save_file_name), Qnil,
5156 NILP (Vauto_save_visited_file_name) ? Qlambda : Qt,
5157 Qnil, Qnil);
5158 }
5159
5160 static Lisp_Object
5161 do_auto_save_unwind (Lisp_Object arg) /* used as unwind-protect function */
5162
5163 {
5164 FILE *stream = (FILE *) XSAVE_VALUE (arg)->pointer;
5165 auto_saving = 0;
5166 if (stream != NULL)
5167 {
5168 BLOCK_INPUT;
5169 fclose (stream);
5170 UNBLOCK_INPUT;
5171 }
5172 return Qnil;
5173 }
5174
5175 static Lisp_Object
5176 do_auto_save_unwind_1 (Lisp_Object value) /* used as unwind-protect function */
5177
5178 {
5179 minibuffer_auto_raise = XINT (value);
5180 return Qnil;
5181 }
5182
5183 static Lisp_Object
5184 do_auto_save_make_dir (Lisp_Object dir)
5185 {
5186 Lisp_Object mode;
5187
5188 call2 (Qmake_directory, dir, Qt);
5189 XSETFASTINT (mode, 0700);
5190 return Fset_file_modes (dir, mode);
5191 }
5192
5193 static Lisp_Object
5194 do_auto_save_eh (Lisp_Object ignore)
5195 {
5196 return Qnil;
5197 }
5198
5199 DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "",
5200 doc: /* Auto-save all buffers that need it.
5201 This is all buffers that have auto-saving enabled
5202 and are changed since last auto-saved.
5203 Auto-saving writes the buffer into a file
5204 so that your editing is not lost if the system crashes.
5205 This file is not the file you visited; that changes only when you save.
5206 Normally we run the normal hook `auto-save-hook' before saving.
5207
5208 A non-nil NO-MESSAGE argument means do not print any message if successful.
5209 A non-nil CURRENT-ONLY argument means save only current buffer. */)
5210 (Lisp_Object no_message, Lisp_Object current_only)
5211 {
5212 struct buffer *old = current_buffer, *b;
5213 Lisp_Object tail, buf;
5214 int auto_saved = 0;
5215 int do_handled_files;
5216 Lisp_Object oquit;
5217 FILE *stream = NULL;
5218 int count = SPECPDL_INDEX ();
5219 int orig_minibuffer_auto_raise = minibuffer_auto_raise;
5220 int old_message_p = 0;
5221 struct gcpro gcpro1, gcpro2;
5222
5223 if (max_specpdl_size < specpdl_size + 40)
5224 max_specpdl_size = specpdl_size + 40;
5225
5226 if (minibuf_level)
5227 no_message = Qt;
5228
5229 if (NILP (no_message))
5230 {
5231 old_message_p = push_message ();
5232 record_unwind_protect (pop_message_unwind, Qnil);
5233 }
5234
5235 /* Ordinarily don't quit within this function,
5236 but don't make it impossible to quit (in case we get hung in I/O). */
5237 oquit = Vquit_flag;
5238 Vquit_flag = Qnil;
5239
5240 /* No GCPRO needed, because (when it matters) all Lisp_Object variables
5241 point to non-strings reached from Vbuffer_alist. */
5242
5243 if (!NILP (Vrun_hooks))
5244 call1 (Vrun_hooks, intern ("auto-save-hook"));
5245
5246 if (STRINGP (Vauto_save_list_file_name))
5247 {
5248 Lisp_Object listfile;
5249
5250 listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
5251
5252 /* Don't try to create the directory when shutting down Emacs,
5253 because creating the directory might signal an error, and
5254 that would leave Emacs in a strange state. */
5255 if (!NILP (Vrun_hooks))
5256 {
5257 Lisp_Object dir;
5258 dir = Qnil;
5259 GCPRO2 (dir, listfile);
5260 dir = Ffile_name_directory (listfile);
5261 if (NILP (Ffile_directory_p (dir)))
5262 internal_condition_case_1 (do_auto_save_make_dir,
5263 dir, Fcons (Fcons (Qfile_error, Qnil), Qnil),
5264 do_auto_save_eh);
5265 UNGCPRO;
5266 }
5267
5268 stream = fopen (SSDATA (listfile), "w");
5269 }
5270
5271 record_unwind_protect (do_auto_save_unwind,
5272 make_save_value (stream, 0));
5273 record_unwind_protect (do_auto_save_unwind_1,
5274 make_number (minibuffer_auto_raise));
5275 minibuffer_auto_raise = 0;
5276 auto_saving = 1;
5277 auto_save_error_occurred = 0;
5278
5279 /* On first pass, save all files that don't have handlers.
5280 On second pass, save all files that do have handlers.
5281
5282 If Emacs is crashing, the handlers may tweak what is causing
5283 Emacs to crash in the first place, and it would be a shame if
5284 Emacs failed to autosave perfectly ordinary files because it
5285 couldn't handle some ange-ftp'd file. */
5286
5287 for (do_handled_files = 0; do_handled_files < 2; do_handled_files++)
5288 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
5289 {
5290 buf = XCDR (XCAR (tail));
5291 b = XBUFFER (buf);
5292
5293 /* Record all the buffers that have auto save mode
5294 in the special file that lists them. For each of these buffers,
5295 Record visited name (if any) and auto save name. */
5296 if (STRINGP (BVAR (b, auto_save_file_name))
5297 && stream != NULL && do_handled_files == 0)
5298 {
5299 BLOCK_INPUT;
5300 if (!NILP (BVAR (b, filename)))
5301 {
5302 fwrite (SDATA (BVAR (b, filename)), 1,
5303 SBYTES (BVAR (b, filename)), stream);
5304 }
5305 putc ('\n', stream);
5306 fwrite (SDATA (BVAR (b, auto_save_file_name)), 1,
5307 SBYTES (BVAR (b, auto_save_file_name)), stream);
5308 putc ('\n', stream);
5309 UNBLOCK_INPUT;
5310 }
5311
5312 if (!NILP (current_only)
5313 && b != current_buffer)
5314 continue;
5315
5316 /* Don't auto-save indirect buffers.
5317 The base buffer takes care of it. */
5318 if (b->base_buffer)
5319 continue;
5320
5321 /* Check for auto save enabled
5322 and file changed since last auto save
5323 and file changed since last real save. */
5324 if (STRINGP (BVAR (b, auto_save_file_name))
5325 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
5326 && BUF_AUTOSAVE_MODIFF (b) < BUF_MODIFF (b)
5327 /* -1 means we've turned off autosaving for a while--see below. */
5328 && XINT (BVAR (b, save_length)) >= 0
5329 && (do_handled_files
5330 || NILP (Ffind_file_name_handler (BVAR (b, auto_save_file_name),
5331 Qwrite_region))))
5332 {
5333 EMACS_TIME before_time, after_time;
5334
5335 EMACS_GET_TIME (before_time);
5336
5337 /* If we had a failure, don't try again for 20 minutes. */
5338 if (b->auto_save_failure_time >= 0
5339 && EMACS_SECS (before_time) - b->auto_save_failure_time < 1200)
5340 continue;
5341
5342 set_buffer_internal (b);
5343 if (NILP (Vauto_save_include_big_deletions)
5344 && (XFASTINT (BVAR (b, save_length)) * 10
5345 > (BUF_Z (b) - BUF_BEG (b)) * 13)
5346 /* A short file is likely to change a large fraction;
5347 spare the user annoying messages. */
5348 && XFASTINT (BVAR (b, save_length)) > 5000
5349 /* These messages are frequent and annoying for `*mail*'. */
5350 && !EQ (BVAR (b, filename), Qnil)
5351 && NILP (no_message))
5352 {
5353 /* It has shrunk too much; turn off auto-saving here. */
5354 minibuffer_auto_raise = orig_minibuffer_auto_raise;
5355 message_with_string ("Buffer %s has shrunk a lot; auto save disabled in that buffer until next real save",
5356 BVAR (b, name), 1);
5357 minibuffer_auto_raise = 0;
5358 /* Turn off auto-saving until there's a real save,
5359 and prevent any more warnings. */
5360 XSETINT (BVAR (b, save_length), -1);
5361 Fsleep_for (make_number (1), Qnil);
5362 continue;
5363 }
5364 if (!auto_saved && NILP (no_message))
5365 message1 ("Auto-saving...");
5366 internal_condition_case (auto_save_1, Qt, auto_save_error);
5367 auto_saved++;
5368 BUF_AUTOSAVE_MODIFF (b) = BUF_MODIFF (b);
5369 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
5370 set_buffer_internal (old);
5371
5372 EMACS_GET_TIME (after_time);
5373
5374 /* If auto-save took more than 60 seconds,
5375 assume it was an NFS failure that got a timeout. */
5376 if (EMACS_SECS (after_time) - EMACS_SECS (before_time) > 60)
5377 b->auto_save_failure_time = EMACS_SECS (after_time);
5378 }
5379 }
5380
5381 /* Prevent another auto save till enough input events come in. */
5382 record_auto_save ();
5383
5384 if (auto_saved && NILP (no_message))
5385 {
5386 if (old_message_p)
5387 {
5388 /* If we are going to restore an old message,
5389 give time to read ours. */
5390 sit_for (make_number (1), 0, 0);
5391 restore_message ();
5392 }
5393 else if (!auto_save_error_occurred)
5394 /* Don't overwrite the error message if an error occurred.
5395 If we displayed a message and then restored a state
5396 with no message, leave a "done" message on the screen. */
5397 message1 ("Auto-saving...done");
5398 }
5399
5400 Vquit_flag = oquit;
5401
5402 /* This restores the message-stack status. */
5403 unbind_to (count, Qnil);
5404 return Qnil;
5405 }
5406
5407 DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved,
5408 Sset_buffer_auto_saved, 0, 0, 0,
5409 doc: /* Mark current buffer as auto-saved with its current text.
5410 No auto-save file will be written until the buffer changes again. */)
5411 (void)
5412 {
5413 /* FIXME: This should not be called in indirect buffers, since
5414 they're not autosaved. */
5415 BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
5416 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
5417 current_buffer->auto_save_failure_time = -1;
5418 return Qnil;
5419 }
5420
5421 DEFUN ("clear-buffer-auto-save-failure", Fclear_buffer_auto_save_failure,
5422 Sclear_buffer_auto_save_failure, 0, 0, 0,
5423 doc: /* Clear any record of a recent auto-save failure in the current buffer. */)
5424 (void)
5425 {
5426 current_buffer->auto_save_failure_time = -1;
5427 return Qnil;
5428 }
5429
5430 DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p,
5431 0, 0, 0,
5432 doc: /* Return t if current buffer has been auto-saved recently.
5433 More precisely, if it has been auto-saved since last read from or saved
5434 in the visited file. If the buffer has no visited file,
5435 then any auto-save counts as "recent". */)
5436 (void)
5437 {
5438 /* FIXME: maybe we should return nil for indirect buffers since
5439 they're never autosaved. */
5440 return (SAVE_MODIFF < BUF_AUTOSAVE_MODIFF (current_buffer) ? Qt : Qnil);
5441 }
5442 \f
5443 /* Reading and completing file names */
5444
5445 DEFUN ("next-read-file-uses-dialog-p", Fnext_read_file_uses_dialog_p,
5446 Snext_read_file_uses_dialog_p, 0, 0, 0,
5447 doc: /* Return t if a call to `read-file-name' will use a dialog.
5448 The return value is only relevant for a call to `read-file-name' that happens
5449 before any other event (mouse or keypress) is handled. */)
5450 (void)
5451 {
5452 #if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK)
5453 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
5454 && use_dialog_box
5455 && use_file_dialog
5456 && have_menus_p ())
5457 return Qt;
5458 #endif
5459 return Qnil;
5460 }
5461
5462 Lisp_Object
5463 Fread_file_name (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate)
5464 {
5465 struct gcpro gcpro1, gcpro2;
5466 Lisp_Object args[7];
5467
5468 GCPRO1 (default_filename);
5469 args[0] = intern ("read-file-name");
5470 args[1] = prompt;
5471 args[2] = dir;
5472 args[3] = default_filename;
5473 args[4] = mustmatch;
5474 args[5] = initial;
5475 args[6] = predicate;
5476 RETURN_UNGCPRO (Ffuncall (7, args));
5477 }
5478
5479 \f
5480 void
5481 syms_of_fileio (void)
5482 {
5483 Qoperations = intern_c_string ("operations");
5484 Qexpand_file_name = intern_c_string ("expand-file-name");
5485 Qsubstitute_in_file_name = intern_c_string ("substitute-in-file-name");
5486 Qdirectory_file_name = intern_c_string ("directory-file-name");
5487 Qfile_name_directory = intern_c_string ("file-name-directory");
5488 Qfile_name_nondirectory = intern_c_string ("file-name-nondirectory");
5489 Qunhandled_file_name_directory = intern_c_string ("unhandled-file-name-directory");
5490 Qfile_name_as_directory = intern_c_string ("file-name-as-directory");
5491 Qcopy_file = intern_c_string ("copy-file");
5492 Qmake_directory_internal = intern_c_string ("make-directory-internal");
5493 Qmake_directory = intern_c_string ("make-directory");
5494 Qdelete_directory_internal = intern_c_string ("delete-directory-internal");
5495 Qdelete_file = intern_c_string ("delete-file");
5496 Qrename_file = intern_c_string ("rename-file");
5497 Qadd_name_to_file = intern_c_string ("add-name-to-file");
5498 Qmake_symbolic_link = intern_c_string ("make-symbolic-link");
5499 Qfile_exists_p = intern_c_string ("file-exists-p");
5500 Qfile_executable_p = intern_c_string ("file-executable-p");
5501 Qfile_readable_p = intern_c_string ("file-readable-p");
5502 Qfile_writable_p = intern_c_string ("file-writable-p");
5503 Qfile_symlink_p = intern_c_string ("file-symlink-p");
5504 Qaccess_file = intern_c_string ("access-file");
5505 Qfile_directory_p = intern_c_string ("file-directory-p");
5506 Qfile_regular_p = intern_c_string ("file-regular-p");
5507 Qfile_accessible_directory_p = intern_c_string ("file-accessible-directory-p");
5508 Qfile_modes = intern_c_string ("file-modes");
5509 Qset_file_modes = intern_c_string ("set-file-modes");
5510 Qset_file_times = intern_c_string ("set-file-times");
5511 Qfile_selinux_context = intern_c_string("file-selinux-context");
5512 Qset_file_selinux_context = intern_c_string("set-file-selinux-context");
5513 Qfile_newer_than_file_p = intern_c_string ("file-newer-than-file-p");
5514 Qinsert_file_contents = intern_c_string ("insert-file-contents");
5515 Qwrite_region = intern_c_string ("write-region");
5516 Qverify_visited_file_modtime = intern_c_string ("verify-visited-file-modtime");
5517 Qset_visited_file_modtime = intern_c_string ("set-visited-file-modtime");
5518 Qauto_save_coding = intern_c_string ("auto-save-coding");
5519
5520 staticpro (&Qoperations);
5521 staticpro (&Qexpand_file_name);
5522 staticpro (&Qsubstitute_in_file_name);
5523 staticpro (&Qdirectory_file_name);
5524 staticpro (&Qfile_name_directory);
5525 staticpro (&Qfile_name_nondirectory);
5526 staticpro (&Qunhandled_file_name_directory);
5527 staticpro (&Qfile_name_as_directory);
5528 staticpro (&Qcopy_file);
5529 staticpro (&Qmake_directory_internal);
5530 staticpro (&Qmake_directory);
5531 staticpro (&Qdelete_directory_internal);
5532 staticpro (&Qdelete_file);
5533 staticpro (&Qrename_file);
5534 staticpro (&Qadd_name_to_file);
5535 staticpro (&Qmake_symbolic_link);
5536 staticpro (&Qfile_exists_p);
5537 staticpro (&Qfile_executable_p);
5538 staticpro (&Qfile_readable_p);
5539 staticpro (&Qfile_writable_p);
5540 staticpro (&Qaccess_file);
5541 staticpro (&Qfile_symlink_p);
5542 staticpro (&Qfile_directory_p);
5543 staticpro (&Qfile_regular_p);
5544 staticpro (&Qfile_accessible_directory_p);
5545 staticpro (&Qfile_modes);
5546 staticpro (&Qset_file_modes);
5547 staticpro (&Qset_file_times);
5548 staticpro (&Qfile_selinux_context);
5549 staticpro (&Qset_file_selinux_context);
5550 staticpro (&Qfile_newer_than_file_p);
5551 staticpro (&Qinsert_file_contents);
5552 staticpro (&Qwrite_region);
5553 staticpro (&Qverify_visited_file_modtime);
5554 staticpro (&Qset_visited_file_modtime);
5555 staticpro (&Qauto_save_coding);
5556
5557 Qfile_name_history = intern_c_string ("file-name-history");
5558 Fset (Qfile_name_history, Qnil);
5559 staticpro (&Qfile_name_history);
5560
5561 Qfile_error = intern_c_string ("file-error");
5562 staticpro (&Qfile_error);
5563 Qfile_already_exists = intern_c_string ("file-already-exists");
5564 staticpro (&Qfile_already_exists);
5565 Qfile_date_error = intern_c_string ("file-date-error");
5566 staticpro (&Qfile_date_error);
5567 Qexcl = intern_c_string ("excl");
5568 staticpro (&Qexcl);
5569
5570 DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system,
5571 doc: /* *Coding system for encoding file names.
5572 If it is nil, `default-file-name-coding-system' (which see) is used. */);
5573 Vfile_name_coding_system = Qnil;
5574
5575 DEFVAR_LISP ("default-file-name-coding-system",
5576 Vdefault_file_name_coding_system,
5577 doc: /* Default coding system for encoding file names.
5578 This variable is used only when `file-name-coding-system' is nil.
5579
5580 This variable is set/changed by the command `set-language-environment'.
5581 User should not set this variable manually,
5582 instead use `file-name-coding-system' to get a constant encoding
5583 of file names regardless of the current language environment. */);
5584 Vdefault_file_name_coding_system = Qnil;
5585
5586 Qformat_decode = intern_c_string ("format-decode");
5587 staticpro (&Qformat_decode);
5588 Qformat_annotate_function = intern_c_string ("format-annotate-function");
5589 staticpro (&Qformat_annotate_function);
5590 Qafter_insert_file_set_coding = intern_c_string ("after-insert-file-set-coding");
5591 staticpro (&Qafter_insert_file_set_coding);
5592
5593 Qcar_less_than_car = intern_c_string ("car-less-than-car");
5594 staticpro (&Qcar_less_than_car);
5595
5596 Fput (Qfile_error, Qerror_conditions,
5597 Fpurecopy (list2 (Qfile_error, Qerror)));
5598 Fput (Qfile_error, Qerror_message,
5599 make_pure_c_string ("File error"));
5600
5601 Fput (Qfile_already_exists, Qerror_conditions,
5602 Fpurecopy (list3 (Qfile_already_exists, Qfile_error, Qerror)));
5603 Fput (Qfile_already_exists, Qerror_message,
5604 make_pure_c_string ("File already exists"));
5605
5606 Fput (Qfile_date_error, Qerror_conditions,
5607 Fpurecopy (list3 (Qfile_date_error, Qfile_error, Qerror)));
5608 Fput (Qfile_date_error, Qerror_message,
5609 make_pure_c_string ("Cannot set file date"));
5610
5611 DEFVAR_LISP ("file-name-handler-alist", Vfile_name_handler_alist,
5612 doc: /* *Alist of elements (REGEXP . HANDLER) for file names handled specially.
5613 If a file name matches REGEXP, then all I/O on that file is done by calling
5614 HANDLER.
5615
5616 The first argument given to HANDLER is the name of the I/O primitive
5617 to be handled; the remaining arguments are the arguments that were
5618 passed to that primitive. For example, if you do
5619 (file-exists-p FILENAME)
5620 and FILENAME is handled by HANDLER, then HANDLER is called like this:
5621 (funcall HANDLER 'file-exists-p FILENAME)
5622 The function `find-file-name-handler' checks this list for a handler
5623 for its argument. */);
5624 Vfile_name_handler_alist = Qnil;
5625
5626 DEFVAR_LISP ("set-auto-coding-function",
5627 Vset_auto_coding_function,
5628 doc: /* If non-nil, a function to call to decide a coding system of file.
5629 Two arguments are passed to this function: the file name
5630 and the length of a file contents following the point.
5631 This function should return a coding system to decode the file contents.
5632 It should check the file name against `auto-coding-alist'.
5633 If no coding system is decided, it should check a coding system
5634 specified in the heading lines with the format:
5635 -*- ... coding: CODING-SYSTEM; ... -*-
5636 or local variable spec of the tailing lines with `coding:' tag. */);
5637 Vset_auto_coding_function = Qnil;
5638
5639 DEFVAR_LISP ("after-insert-file-functions", Vafter_insert_file_functions,
5640 doc: /* A list of functions to be called at the end of `insert-file-contents'.
5641 Each is passed one argument, the number of characters inserted,
5642 with point at the start of the inserted text. Each function
5643 should leave point the same, and return the new character count.
5644 If `insert-file-contents' is intercepted by a handler from
5645 `file-name-handler-alist', that handler is responsible for calling the
5646 functions in `after-insert-file-functions' if appropriate. */);
5647 Vafter_insert_file_functions = Qnil;
5648
5649 DEFVAR_LISP ("write-region-annotate-functions", Vwrite_region_annotate_functions,
5650 doc: /* A list of functions to be called at the start of `write-region'.
5651 Each is passed two arguments, START and END as for `write-region'.
5652 These are usually two numbers but not always; see the documentation
5653 for `write-region'. The function should return a list of pairs
5654 of the form (POSITION . STRING), consisting of strings to be effectively
5655 inserted at the specified positions of the file being written (1 means to
5656 insert before the first byte written). The POSITIONs must be sorted into
5657 increasing order.
5658
5659 If there are several annotation functions, the lists returned by these
5660 functions are merged destructively. As each annotation function runs,
5661 the variable `write-region-annotations-so-far' contains a list of all
5662 annotations returned by previous annotation functions.
5663
5664 An annotation function can return with a different buffer current.
5665 Doing so removes the annotations returned by previous functions, and
5666 resets START and END to `point-min' and `point-max' of the new buffer.
5667
5668 After `write-region' completes, Emacs calls the function stored in
5669 `write-region-post-annotation-function', once for each buffer that was
5670 current when building the annotations (i.e., at least once), with that
5671 buffer current. */);
5672 Vwrite_region_annotate_functions = Qnil;
5673 staticpro (&Qwrite_region_annotate_functions);
5674 Qwrite_region_annotate_functions
5675 = intern_c_string ("write-region-annotate-functions");
5676
5677 DEFVAR_LISP ("write-region-post-annotation-function",
5678 Vwrite_region_post_annotation_function,
5679 doc: /* Function to call after `write-region' completes.
5680 The function is called with no arguments. If one or more of the
5681 annotation functions in `write-region-annotate-functions' changed the
5682 current buffer, the function stored in this variable is called for
5683 each of those additional buffers as well, in addition to the original
5684 buffer. The relevant buffer is current during each function call. */);
5685 Vwrite_region_post_annotation_function = Qnil;
5686 staticpro (&Vwrite_region_annotation_buffers);
5687
5688 DEFVAR_LISP ("write-region-annotations-so-far",
5689 Vwrite_region_annotations_so_far,
5690 doc: /* When an annotation function is called, this holds the previous annotations.
5691 These are the annotations made by other annotation functions
5692 that were already called. See also `write-region-annotate-functions'. */);
5693 Vwrite_region_annotations_so_far = Qnil;
5694
5695 DEFVAR_LISP ("inhibit-file-name-handlers", Vinhibit_file_name_handlers,
5696 doc: /* A list of file name handlers that temporarily should not be used.
5697 This applies only to the operation `inhibit-file-name-operation'. */);
5698 Vinhibit_file_name_handlers = Qnil;
5699
5700 DEFVAR_LISP ("inhibit-file-name-operation", Vinhibit_file_name_operation,
5701 doc: /* The operation for which `inhibit-file-name-handlers' is applicable. */);
5702 Vinhibit_file_name_operation = Qnil;
5703
5704 DEFVAR_LISP ("auto-save-list-file-name", Vauto_save_list_file_name,
5705 doc: /* File name in which we write a list of all auto save file names.
5706 This variable is initialized automatically from `auto-save-list-file-prefix'
5707 shortly after Emacs reads your `.emacs' file, if you have not yet given it
5708 a non-nil value. */);
5709 Vauto_save_list_file_name = Qnil;
5710
5711 DEFVAR_LISP ("auto-save-visited-file-name", Vauto_save_visited_file_name,
5712 doc: /* Non-nil says auto-save a buffer in the file it is visiting, when practical.
5713 Normally auto-save files are written under other names. */);
5714 Vauto_save_visited_file_name = Qnil;
5715
5716 DEFVAR_LISP ("auto-save-include-big-deletions", Vauto_save_include_big_deletions,
5717 doc: /* If non-nil, auto-save even if a large part of the text is deleted.
5718 If nil, deleting a substantial portion of the text disables auto-save
5719 in the buffer; this is the default behavior, because the auto-save
5720 file is usually more useful if it contains the deleted text. */);
5721 Vauto_save_include_big_deletions = Qnil;
5722
5723 #ifdef HAVE_FSYNC
5724 DEFVAR_BOOL ("write-region-inhibit-fsync", write_region_inhibit_fsync,
5725 doc: /* *Non-nil means don't call fsync in `write-region'.
5726 This variable affects calls to `write-region' as well as save commands.
5727 A non-nil value may result in data loss! */);
5728 write_region_inhibit_fsync = 0;
5729 #endif
5730
5731 DEFVAR_BOOL ("delete-by-moving-to-trash", delete_by_moving_to_trash,
5732 doc: /* Specifies whether to use the system's trash can.
5733 When non-nil, certain file deletion commands use the function
5734 `move-file-to-trash' instead of deleting files outright.
5735 This includes interactive calls to `delete-file' and
5736 `delete-directory' and the Dired deletion commands. */);
5737 delete_by_moving_to_trash = 0;
5738 Qdelete_by_moving_to_trash = intern_c_string ("delete-by-moving-to-trash");
5739 Qmove_file_to_trash = intern_c_string ("move-file-to-trash");
5740 staticpro (&Qmove_file_to_trash);
5741 Qcopy_directory = intern_c_string ("copy-directory");
5742 staticpro (&Qcopy_directory);
5743 Qdelete_directory = intern_c_string ("delete-directory");
5744 staticpro (&Qdelete_directory);
5745
5746 defsubr (&Sfind_file_name_handler);
5747 defsubr (&Sfile_name_directory);
5748 defsubr (&Sfile_name_nondirectory);
5749 defsubr (&Sunhandled_file_name_directory);
5750 defsubr (&Sfile_name_as_directory);
5751 defsubr (&Sdirectory_file_name);
5752 defsubr (&Smake_temp_name);
5753 defsubr (&Sexpand_file_name);
5754 defsubr (&Ssubstitute_in_file_name);
5755 defsubr (&Scopy_file);
5756 defsubr (&Smake_directory_internal);
5757 defsubr (&Sdelete_directory_internal);
5758 defsubr (&Sdelete_file);
5759 defsubr (&Srename_file);
5760 defsubr (&Sadd_name_to_file);
5761 defsubr (&Smake_symbolic_link);
5762 defsubr (&Sfile_name_absolute_p);
5763 defsubr (&Sfile_exists_p);
5764 defsubr (&Sfile_executable_p);
5765 defsubr (&Sfile_readable_p);
5766 defsubr (&Sfile_writable_p);
5767 defsubr (&Saccess_file);
5768 defsubr (&Sfile_symlink_p);
5769 defsubr (&Sfile_directory_p);
5770 defsubr (&Sfile_accessible_directory_p);
5771 defsubr (&Sfile_regular_p);
5772 defsubr (&Sfile_modes);
5773 defsubr (&Sset_file_modes);
5774 defsubr (&Sset_file_times);
5775 defsubr (&Sfile_selinux_context);
5776 defsubr (&Sset_file_selinux_context);
5777 defsubr (&Sset_default_file_modes);
5778 defsubr (&Sdefault_file_modes);
5779 defsubr (&Sfile_newer_than_file_p);
5780 defsubr (&Sinsert_file_contents);
5781 defsubr (&Swrite_region);
5782 defsubr (&Scar_less_than_car);
5783 defsubr (&Sverify_visited_file_modtime);
5784 defsubr (&Sclear_visited_file_modtime);
5785 defsubr (&Svisited_file_modtime);
5786 defsubr (&Sset_visited_file_modtime);
5787 defsubr (&Sdo_auto_save);
5788 defsubr (&Sset_buffer_auto_saved);
5789 defsubr (&Sclear_buffer_auto_save_failure);
5790 defsubr (&Srecent_auto_save_p);
5791
5792 defsubr (&Snext_read_file_uses_dialog_p);
5793
5794 #ifdef HAVE_SYNC
5795 defsubr (&Sunix_sync);
5796 #endif
5797 }