Fix a typo in a comment.
[emacs.git] / src / fileio.c
blob0df2abe5c33f8766f2ad14b639763098bc06c5f2
1 /* File IO for GNU Emacs.
3 Copyright (C) 1985-1988, 1993-2013 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
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 <unistd.h>
28 #ifdef HAVE_PWD_H
29 #include <pwd.h>
30 #endif
32 #include <errno.h>
34 #ifdef HAVE_LIBSELINUX
35 #include <selinux/selinux.h>
36 #include <selinux/context.h>
37 #endif
39 #include <c-ctype.h>
41 #include "lisp.h"
42 #include "intervals.h"
43 #include "character.h"
44 #include "buffer.h"
45 #include "coding.h"
46 #include "window.h"
47 #include "blockinput.h"
48 #include "frame.h"
49 #include "dispextern.h"
51 #ifdef WINDOWSNT
52 #define NOMINMAX 1
53 #include <windows.h>
54 #include <fcntl.h>
55 #include <sys/file.h>
56 #include "w32.h"
57 #endif /* not WINDOWSNT */
59 #ifdef MSDOS
60 #include "msdos.h"
61 #include <sys/param.h>
62 #include <fcntl.h>
63 #endif
65 #ifdef DOS_NT
66 /* On Windows, drive letters must be alphabetic - on DOS, the Netware
67 redirector allows the six letters between 'Z' and 'a' as well. */
68 #ifdef MSDOS
69 #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
70 #endif
71 #ifdef WINDOWSNT
72 #define IS_DRIVE(x) c_isalpha (x)
73 #endif
74 /* Need to lower-case the drive letter, or else expanded
75 filenames will sometimes compare unequal, because
76 `expand-file-name' doesn't always down-case the drive letter. */
77 #define DRIVE_LETTER(x) c_tolower (x)
78 #endif
80 #include "systime.h"
81 #include <stat-time.h>
83 #ifdef HPUX
84 #include <netio.h>
85 #endif
87 #include "commands.h"
89 /* True during writing of auto-save files. */
90 static bool auto_saving;
92 /* Nonzero umask during creation of auto-save directories. */
93 static mode_t auto_saving_dir_umask;
95 /* Set by auto_save_1 to mode of original file so Fwrite_region will create
96 a new file with the same mode as the original. */
97 static mode_t auto_save_mode_bits;
99 /* Set by auto_save_1 if an error occurred during the last auto-save. */
100 static bool auto_save_error_occurred;
102 /* The symbol bound to coding-system-for-read when
103 insert-file-contents is called for recovering a file. This is not
104 an actual coding system name, but just an indicator to tell
105 insert-file-contents to use `emacs-mule' with a special flag for
106 auto saving and recovering a file. */
107 static Lisp_Object Qauto_save_coding;
109 /* Property name of a file name handler,
110 which gives a list of operations it handles.. */
111 static Lisp_Object Qoperations;
113 /* Lisp functions for translating file formats. */
114 static Lisp_Object Qformat_decode, Qformat_annotate_function;
116 /* Lisp function for setting buffer-file-coding-system and the
117 multibyteness of the current buffer after inserting a file. */
118 static Lisp_Object Qafter_insert_file_set_coding;
120 static Lisp_Object Qwrite_region_annotate_functions;
121 /* Each time an annotation function changes the buffer, the new buffer
122 is added here. */
123 static Lisp_Object Vwrite_region_annotation_buffers;
125 #ifdef HAVE_FSYNC
126 #endif
128 static Lisp_Object Qdelete_by_moving_to_trash;
130 /* Lisp function for moving files to trash. */
131 static Lisp_Object Qmove_file_to_trash;
133 /* Lisp function for recursively copying directories. */
134 static Lisp_Object Qcopy_directory;
136 /* Lisp function for recursively deleting directories. */
137 static Lisp_Object Qdelete_directory;
139 #ifdef WINDOWSNT
140 #endif
142 Lisp_Object Qfile_error;
143 static Lisp_Object Qfile_already_exists, Qfile_date_error;
144 static Lisp_Object Qexcl;
145 Lisp_Object Qfile_name_history;
147 static Lisp_Object Qcar_less_than_car;
149 static bool a_write (int, Lisp_Object, ptrdiff_t, ptrdiff_t,
150 Lisp_Object *, struct coding_system *);
151 static bool e_write (int, Lisp_Object, ptrdiff_t, ptrdiff_t,
152 struct coding_system *);
155 void
156 report_file_error (const char *string, Lisp_Object data)
158 Lisp_Object errstring;
159 int errorno = errno;
160 char *str;
162 synchronize_system_messages_locale ();
163 str = strerror (errorno);
164 errstring = code_convert_string_norecord (build_unibyte_string (str),
165 Vlocale_coding_system, 0);
167 while (1)
168 switch (errorno)
170 case EEXIST:
171 xsignal (Qfile_already_exists, Fcons (errstring, data));
172 break;
173 default:
174 /* System error messages are capitalized. Downcase the initial
175 unless it is followed by a slash. (The slash case caters to
176 error messages that begin with "I/O" or, in German, "E/A".) */
177 if (STRING_MULTIBYTE (errstring)
178 && ! EQ (Faref (errstring, make_number (1)), make_number ('/')))
180 int c;
182 str = SSDATA (errstring);
183 c = STRING_CHAR ((unsigned char *) str);
184 Faset (errstring, make_number (0), make_number (downcase (c)));
187 xsignal (Qfile_error,
188 Fcons (build_string (string), Fcons (errstring, data)));
192 Lisp_Object
193 close_file_unwind (Lisp_Object fd)
195 emacs_close (XFASTINT (fd));
196 return Qnil;
199 /* Restore point, having saved it as a marker. */
201 Lisp_Object
202 restore_point_unwind (Lisp_Object location)
204 Fgoto_char (location);
205 Fset_marker (location, Qnil, Qnil);
206 return Qnil;
210 static Lisp_Object Qexpand_file_name;
211 static Lisp_Object Qsubstitute_in_file_name;
212 static Lisp_Object Qdirectory_file_name;
213 static Lisp_Object Qfile_name_directory;
214 static Lisp_Object Qfile_name_nondirectory;
215 static Lisp_Object Qunhandled_file_name_directory;
216 static Lisp_Object Qfile_name_as_directory;
217 static Lisp_Object Qcopy_file;
218 static Lisp_Object Qmake_directory_internal;
219 static Lisp_Object Qmake_directory;
220 static Lisp_Object Qdelete_directory_internal;
221 Lisp_Object Qdelete_file;
222 static Lisp_Object Qrename_file;
223 static Lisp_Object Qadd_name_to_file;
224 static Lisp_Object Qmake_symbolic_link;
225 Lisp_Object Qfile_exists_p;
226 static Lisp_Object Qfile_executable_p;
227 static Lisp_Object Qfile_readable_p;
228 static Lisp_Object Qfile_writable_p;
229 static Lisp_Object Qfile_symlink_p;
230 static Lisp_Object Qaccess_file;
231 Lisp_Object Qfile_directory_p;
232 static Lisp_Object Qfile_regular_p;
233 static Lisp_Object Qfile_accessible_directory_p;
234 static Lisp_Object Qfile_modes;
235 static Lisp_Object Qset_file_modes;
236 static Lisp_Object Qset_file_times;
237 static Lisp_Object Qfile_selinux_context;
238 static Lisp_Object Qset_file_selinux_context;
239 static Lisp_Object Qfile_newer_than_file_p;
240 Lisp_Object Qinsert_file_contents;
241 Lisp_Object Qwrite_region;
242 static Lisp_Object Qverify_visited_file_modtime;
243 static Lisp_Object Qset_visited_file_modtime;
245 DEFUN ("find-file-name-handler", Ffind_file_name_handler,
246 Sfind_file_name_handler, 2, 2, 0,
247 doc: /* Return FILENAME's handler function for OPERATION, if it has one.
248 Otherwise, return nil.
249 A file name is handled if one of the regular expressions in
250 `file-name-handler-alist' matches it.
252 If OPERATION equals `inhibit-file-name-operation', then we ignore
253 any handlers that are members of `inhibit-file-name-handlers',
254 but we still do run any other handlers. This lets handlers
255 use the standard functions without calling themselves recursively. */)
256 (Lisp_Object filename, Lisp_Object operation)
258 /* This function must not munge the match data. */
259 Lisp_Object chain, inhibited_handlers, result;
260 ptrdiff_t pos = -1;
262 result = Qnil;
263 CHECK_STRING (filename);
265 if (EQ (operation, Vinhibit_file_name_operation))
266 inhibited_handlers = Vinhibit_file_name_handlers;
267 else
268 inhibited_handlers = Qnil;
270 for (chain = Vfile_name_handler_alist; CONSP (chain);
271 chain = XCDR (chain))
273 Lisp_Object elt;
274 elt = XCAR (chain);
275 if (CONSP (elt))
277 Lisp_Object string = XCAR (elt);
278 ptrdiff_t match_pos;
279 Lisp_Object handler = XCDR (elt);
280 Lisp_Object operations = Qnil;
282 if (SYMBOLP (handler))
283 operations = Fget (handler, Qoperations);
285 if (STRINGP (string)
286 && (match_pos = fast_string_match (string, filename)) > pos
287 && (NILP (operations) || ! NILP (Fmemq (operation, operations))))
289 Lisp_Object tem;
291 handler = XCDR (elt);
292 tem = Fmemq (handler, inhibited_handlers);
293 if (NILP (tem))
295 result = handler;
296 pos = match_pos;
301 QUIT;
303 return result;
306 DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
307 1, 1, 0,
308 doc: /* Return the directory component in file name FILENAME.
309 Return nil if FILENAME does not include a directory.
310 Otherwise return a directory name.
311 Given a Unix syntax file name, returns a string ending in slash. */)
312 (Lisp_Object filename)
314 #ifndef DOS_NT
315 register const char *beg;
316 #else
317 register char *beg;
318 Lisp_Object tem_fn;
319 #endif
320 register const char *p;
321 Lisp_Object handler;
323 CHECK_STRING (filename);
325 /* If the file name has special constructs in it,
326 call the corresponding file handler. */
327 handler = Ffind_file_name_handler (filename, Qfile_name_directory);
328 if (!NILP (handler))
330 Lisp_Object handled_name = call2 (handler, Qfile_name_directory,
331 filename);
332 return STRINGP (handled_name) ? handled_name : Qnil;
335 #ifdef DOS_NT
336 beg = alloca (SBYTES (filename) + 1);
337 memcpy (beg, SSDATA (filename), SBYTES (filename) + 1);
338 #else
339 beg = SSDATA (filename);
340 #endif
341 p = beg + SBYTES (filename);
343 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
344 #ifdef DOS_NT
345 /* only recognize drive specifier at the beginning */
346 && !(p[-1] == ':'
347 /* handle the "/:d:foo" and "/:foo" cases correctly */
348 && ((p == beg + 2 && !IS_DIRECTORY_SEP (*beg))
349 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
350 #endif
351 ) p--;
353 if (p == beg)
354 return Qnil;
355 #ifdef DOS_NT
356 /* Expansion of "c:" to drive and default directory. */
357 if (p[-1] == ':')
359 /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir. */
360 char *res = alloca (MAXPATHLEN + 1);
361 char *r = res;
363 if (p == beg + 4 && IS_DIRECTORY_SEP (*beg) && beg[1] == ':')
365 memcpy (res, beg, 2);
366 beg += 2;
367 r += 2;
370 if (getdefdir (c_toupper (*beg) - 'A' + 1, r))
372 if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
373 strcat (res, "/");
374 beg = res;
375 p = beg + strlen (beg);
376 dostounix_filename (beg);
377 tem_fn = make_specified_string (beg, -1, p - beg,
378 STRING_MULTIBYTE (filename));
380 else
381 tem_fn = make_specified_string (beg - 2, -1, p - beg + 2,
382 STRING_MULTIBYTE (filename));
384 else if (STRING_MULTIBYTE (filename))
386 tem_fn = ENCODE_FILE (make_specified_string (beg, -1, p - beg, 1));
387 dostounix_filename (SSDATA (tem_fn));
388 tem_fn = DECODE_FILE (tem_fn);
390 else
392 dostounix_filename (beg);
393 tem_fn = make_specified_string (beg, -1, p - beg, 0);
395 return tem_fn;
396 #else /* DOS_NT */
397 return make_specified_string (beg, -1, p - beg, STRING_MULTIBYTE (filename));
398 #endif /* DOS_NT */
401 DEFUN ("file-name-nondirectory", Ffile_name_nondirectory,
402 Sfile_name_nondirectory, 1, 1, 0,
403 doc: /* Return file name FILENAME sans its directory.
404 For example, in a Unix-syntax file name,
405 this is everything after the last slash,
406 or the entire name if it contains no slash. */)
407 (Lisp_Object filename)
409 register const char *beg, *p, *end;
410 Lisp_Object handler;
412 CHECK_STRING (filename);
414 /* If the file name has special constructs in it,
415 call the corresponding file handler. */
416 handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory);
417 if (!NILP (handler))
419 Lisp_Object handled_name = call2 (handler, Qfile_name_nondirectory,
420 filename);
421 if (STRINGP (handled_name))
422 return handled_name;
423 error ("Invalid handler in `file-name-handler-alist'");
426 beg = SSDATA (filename);
427 end = p = beg + SBYTES (filename);
429 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
430 #ifdef DOS_NT
431 /* only recognize drive specifier at beginning */
432 && !(p[-1] == ':'
433 /* handle the "/:d:foo" case correctly */
434 && (p == beg + 2 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
435 #endif
437 p--;
439 return make_specified_string (p, -1, end - p, STRING_MULTIBYTE (filename));
442 DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory,
443 Sunhandled_file_name_directory, 1, 1, 0,
444 doc: /* Return a directly usable directory name somehow associated with FILENAME.
445 A `directly usable' directory name is one that may be used without the
446 intervention of any file handler.
447 If FILENAME is a directly usable file itself, return
448 \(file-name-directory FILENAME).
449 If FILENAME refers to a file which is not accessible from a local process,
450 then this should return nil.
451 The `call-process' and `start-process' functions use this function to
452 get a current directory to run processes in. */)
453 (Lisp_Object filename)
455 Lisp_Object handler;
457 /* If the file name has special constructs in it,
458 call the corresponding file handler. */
459 handler = Ffind_file_name_handler (filename, Qunhandled_file_name_directory);
460 if (!NILP (handler))
462 Lisp_Object handled_name = call2 (handler, Qunhandled_file_name_directory,
463 filename);
464 return STRINGP (handled_name) ? handled_name : Qnil;
467 return Ffile_name_directory (filename);
470 /* Convert from file name SRC of length SRCLEN to directory name in
471 DST. MULTIBYTE non-zero means the file name in SRC is a multibyte
472 string. On UNIX, just make sure there is a terminating /. Return
473 the length of DST in bytes. */
475 static ptrdiff_t
476 file_name_as_directory (char *dst, const char *src, ptrdiff_t srclen,
477 bool multibyte)
479 if (srclen == 0)
481 dst[0] = '.';
482 dst[1] = '/';
483 dst[2] = '\0';
484 return 2;
487 strcpy (dst, src);
489 if (!IS_DIRECTORY_SEP (dst[srclen - 1]))
491 dst[srclen] = DIRECTORY_SEP;
492 dst[srclen + 1] = '\0';
493 srclen++;
495 #ifdef DOS_NT
496 if (multibyte)
498 Lisp_Object tem_fn = make_specified_string (dst, -1, srclen, 1);
500 tem_fn = ENCODE_FILE (tem_fn);
501 dostounix_filename (SSDATA (tem_fn));
502 tem_fn = DECODE_FILE (tem_fn);
503 memcpy (dst, SSDATA (tem_fn), (srclen = SBYTES (tem_fn)) + 1);
505 else
506 dostounix_filename (dst);
507 #endif
508 return srclen;
511 DEFUN ("file-name-as-directory", Ffile_name_as_directory,
512 Sfile_name_as_directory, 1, 1, 0,
513 doc: /* Return a string representing the file name FILE interpreted as a directory.
514 This operation exists because a directory is also a file, but its name as
515 a directory is different from its name as a file.
516 The result can be used as the value of `default-directory'
517 or passed as second argument to `expand-file-name'.
518 For a Unix-syntax file name, just appends a slash. */)
519 (Lisp_Object file)
521 char *buf;
522 ptrdiff_t length;
523 Lisp_Object handler;
525 CHECK_STRING (file);
526 if (NILP (file))
527 return Qnil;
529 /* If the file name has special constructs in it,
530 call the corresponding file handler. */
531 handler = Ffind_file_name_handler (file, Qfile_name_as_directory);
532 if (!NILP (handler))
534 Lisp_Object handled_name = call2 (handler, Qfile_name_as_directory,
535 file);
536 if (STRINGP (handled_name))
537 return handled_name;
538 error ("Invalid handler in `file-name-handler-alist'");
541 buf = alloca (SBYTES (file) + 10);
542 length = file_name_as_directory (buf, SSDATA (file), SBYTES (file),
543 STRING_MULTIBYTE (file));
544 return make_specified_string (buf, -1, length, STRING_MULTIBYTE (file));
547 /* Convert from directory name SRC of length SRCLEN to file name in
548 DST. MULTIBYTE non-zero means the file name in SRC is a multibyte
549 string. On UNIX, just make sure there isn't a terminating /.
550 Return the length of DST in bytes. */
552 static ptrdiff_t
553 directory_file_name (char *dst, char *src, ptrdiff_t srclen, bool multibyte)
555 /* Process as Unix format: just remove any final slash.
556 But leave "/" unchanged; do not change it to "". */
557 strcpy (dst, src);
558 if (srclen > 1
559 && IS_DIRECTORY_SEP (dst[srclen - 1])
560 #ifdef DOS_NT
561 && !IS_ANY_SEP (dst[srclen - 2])
562 #endif
565 dst[srclen - 1] = 0;
566 srclen--;
568 #ifdef DOS_NT
569 if (multibyte)
571 Lisp_Object tem_fn = make_specified_string (dst, -1, srclen, 1);
573 tem_fn = ENCODE_FILE (tem_fn);
574 dostounix_filename (SSDATA (tem_fn));
575 tem_fn = DECODE_FILE (tem_fn);
576 memcpy (dst, SSDATA (tem_fn), (srclen = SBYTES (tem_fn)) + 1);
578 else
579 dostounix_filename (dst);
580 #endif
581 return srclen;
584 DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
585 1, 1, 0,
586 doc: /* Returns the file name of the directory named DIRECTORY.
587 This is the name of the file that holds the data for the directory DIRECTORY.
588 This operation exists because a directory is also a file, but its name as
589 a directory is different from its name as a file.
590 In Unix-syntax, this function just removes the final slash. */)
591 (Lisp_Object directory)
593 char *buf;
594 ptrdiff_t length;
595 Lisp_Object handler;
597 CHECK_STRING (directory);
599 if (NILP (directory))
600 return Qnil;
602 /* If the file name has special constructs in it,
603 call the corresponding file handler. */
604 handler = Ffind_file_name_handler (directory, Qdirectory_file_name);
605 if (!NILP (handler))
607 Lisp_Object handled_name = call2 (handler, Qdirectory_file_name,
608 directory);
609 if (STRINGP (handled_name))
610 return handled_name;
611 error ("Invalid handler in `file-name-handler-alist'");
614 buf = alloca (SBYTES (directory) + 20);
615 length = directory_file_name (buf, SSDATA (directory), SBYTES (directory),
616 STRING_MULTIBYTE (directory));
617 return make_specified_string (buf, -1, length, STRING_MULTIBYTE (directory));
620 static const char make_temp_name_tbl[64] =
622 'A','B','C','D','E','F','G','H',
623 'I','J','K','L','M','N','O','P',
624 'Q','R','S','T','U','V','W','X',
625 'Y','Z','a','b','c','d','e','f',
626 'g','h','i','j','k','l','m','n',
627 'o','p','q','r','s','t','u','v',
628 'w','x','y','z','0','1','2','3',
629 '4','5','6','7','8','9','-','_'
632 static unsigned make_temp_name_count, make_temp_name_count_initialized_p;
634 /* Value is a temporary file name starting with PREFIX, a string.
636 The Emacs process number forms part of the result, so there is
637 no danger of generating a name being used by another process.
638 In addition, this function makes an attempt to choose a name
639 which has no existing file. To make this work, PREFIX should be
640 an absolute file name.
642 BASE64_P means add the pid as 3 characters in base64
643 encoding. In this case, 6 characters will be added to PREFIX to
644 form the file name. Otherwise, if Emacs is running on a system
645 with long file names, add the pid as a decimal number.
647 This function signals an error if no unique file name could be
648 generated. */
650 Lisp_Object
651 make_temp_name (Lisp_Object prefix, bool base64_p)
653 Lisp_Object val;
654 int len, clen;
655 printmax_t pid;
656 char *p, *data;
657 char pidbuf[INT_BUFSIZE_BOUND (printmax_t)];
658 int pidlen;
660 CHECK_STRING (prefix);
662 /* VAL is created by adding 6 characters to PREFIX. The first
663 three are the PID of this process, in base 64, and the second
664 three are incremented if the file already exists. This ensures
665 262144 unique file names per PID per PREFIX. */
667 pid = getpid ();
669 if (base64_p)
671 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
672 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
673 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
674 pidlen = 3;
676 else
678 #ifdef HAVE_LONG_FILE_NAMES
679 pidlen = sprintf (pidbuf, "%"pMd, pid);
680 #else
681 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
682 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
683 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
684 pidlen = 3;
685 #endif
688 len = SBYTES (prefix); clen = SCHARS (prefix);
689 val = make_uninit_multibyte_string (clen + 3 + pidlen, len + 3 + pidlen);
690 if (!STRING_MULTIBYTE (prefix))
691 STRING_SET_UNIBYTE (val);
692 data = SSDATA (val);
693 memcpy (data, SSDATA (prefix), len);
694 p = data + len;
696 memcpy (p, pidbuf, pidlen);
697 p += pidlen;
699 /* Here we try to minimize useless stat'ing when this function is
700 invoked many times successively with the same PREFIX. We achieve
701 this by initializing count to a random value, and incrementing it
702 afterwards.
704 We don't want make-temp-name to be called while dumping,
705 because then make_temp_name_count_initialized_p would get set
706 and then make_temp_name_count would not be set when Emacs starts. */
708 if (!make_temp_name_count_initialized_p)
710 make_temp_name_count = time (NULL);
711 make_temp_name_count_initialized_p = 1;
714 while (1)
716 unsigned num = make_temp_name_count;
718 p[0] = make_temp_name_tbl[num & 63], num >>= 6;
719 p[1] = make_temp_name_tbl[num & 63], num >>= 6;
720 p[2] = make_temp_name_tbl[num & 63], num >>= 6;
722 /* Poor man's congruential RN generator. Replace with
723 ++make_temp_name_count for debugging. */
724 make_temp_name_count += 25229;
725 make_temp_name_count %= 225307;
727 if (!check_existing (data))
729 /* We want to return only if errno is ENOENT. */
730 if (errno == ENOENT)
731 return val;
732 else
733 /* The error here is dubious, but there is little else we
734 can do. The alternatives are to return nil, which is
735 as bad as (and in many cases worse than) throwing the
736 error, or to ignore the error, which will likely result
737 in looping through 225307 stat's, which is not only
738 dog-slow, but also useless since eventually nil would
739 have to be returned anyway. */
740 report_file_error ("Cannot create temporary name for prefix",
741 Fcons (prefix, Qnil));
742 /* not reached */
748 DEFUN ("make-temp-name", Fmake_temp_name, Smake_temp_name, 1, 1, 0,
749 doc: /* Generate temporary file name (string) starting with PREFIX (a string).
750 The Emacs process number forms part of the result,
751 so there is no danger of generating a name being used by another process.
753 In addition, this function makes an attempt to choose a name
754 which has no existing file. To make this work,
755 PREFIX should be an absolute file name.
757 There is a race condition between calling `make-temp-name' and creating the
758 file which opens all kinds of security holes. For that reason, you should
759 probably use `make-temp-file' instead, except in three circumstances:
761 * If you are creating the file in the user's home directory.
762 * If you are creating a directory rather than an ordinary file.
763 * If you are taking special precautions as `make-temp-file' does. */)
764 (Lisp_Object prefix)
766 return make_temp_name (prefix, 0);
771 DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
772 doc: /* Convert filename NAME to absolute, and canonicalize it.
773 Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative
774 \(does not start with slash or tilde); if DEFAULT-DIRECTORY is nil or missing,
775 the current buffer's value of `default-directory' is used.
776 NAME should be a string that is a valid file name for the underlying
777 filesystem.
778 File name components that are `.' are removed, and
779 so are file name components followed by `..', along with the `..' itself;
780 note that these simplifications are done without checking the resulting
781 file names in the file system.
782 Multiple consecutive slashes are collapsed into a single slash,
783 except at the beginning of the file name when they are significant (e.g.,
784 UNC file names on MS-Windows.)
785 An initial `~/' expands to your home directory.
786 An initial `~USER/' expands to USER's home directory.
787 See also the function `substitute-in-file-name'.
789 For technical reasons, this function can return correct but
790 non-intuitive results for the root directory; for instance,
791 \(expand-file-name ".." "/") returns "/..". For this reason, use
792 \(directory-file-name (file-name-directory dirname)) to traverse a
793 filesystem tree, not (expand-file-name ".." dirname). */)
794 (Lisp_Object name, Lisp_Object default_directory)
796 /* These point to SDATA and need to be careful with string-relocation
797 during GC (via DECODE_FILE). */
798 char *nm;
799 const char *newdir;
800 /* This should only point to alloca'd data. */
801 char *target;
803 ptrdiff_t tlen;
804 struct passwd *pw;
805 #ifdef DOS_NT
806 int drive = 0;
807 bool collapse_newdir = 1;
808 bool is_escaped = 0;
809 #endif /* DOS_NT */
810 ptrdiff_t length;
811 Lisp_Object handler, result, handled_name;
812 bool multibyte;
813 Lisp_Object hdir;
815 CHECK_STRING (name);
817 /* If the file name has special constructs in it,
818 call the corresponding file handler. */
819 handler = Ffind_file_name_handler (name, Qexpand_file_name);
820 if (!NILP (handler))
822 handled_name = call3 (handler, Qexpand_file_name,
823 name, default_directory);
824 if (STRINGP (handled_name))
825 return handled_name;
826 error ("Invalid handler in `file-name-handler-alist'");
830 /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted. */
831 if (NILP (default_directory))
832 default_directory = BVAR (current_buffer, directory);
833 if (! STRINGP (default_directory))
835 #ifdef DOS_NT
836 /* "/" is not considered a root directory on DOS_NT, so using "/"
837 here causes an infinite recursion in, e.g., the following:
839 (let (default-directory)
840 (expand-file-name "a"))
842 To avoid this, we set default_directory to the root of the
843 current drive. */
844 default_directory = build_string (emacs_root_dir ());
845 #else
846 default_directory = build_string ("/");
847 #endif
850 if (!NILP (default_directory))
852 handler = Ffind_file_name_handler (default_directory, Qexpand_file_name);
853 if (!NILP (handler))
855 handled_name = call3 (handler, Qexpand_file_name,
856 name, default_directory);
857 if (STRINGP (handled_name))
858 return handled_name;
859 error ("Invalid handler in `file-name-handler-alist'");
864 char *o = SSDATA (default_directory);
866 /* Make sure DEFAULT_DIRECTORY is properly expanded.
867 It would be better to do this down below where we actually use
868 default_directory. Unfortunately, calling Fexpand_file_name recursively
869 could invoke GC, and the strings might be relocated. This would
870 be annoying because we have pointers into strings lying around
871 that would need adjusting, and people would add new pointers to
872 the code and forget to adjust them, resulting in intermittent bugs.
873 Putting this call here avoids all that crud.
875 The EQ test avoids infinite recursion. */
876 if (! NILP (default_directory) && !EQ (default_directory, name)
877 /* Save time in some common cases - as long as default_directory
878 is not relative, it can be canonicalized with name below (if it
879 is needed at all) without requiring it to be expanded now. */
880 #ifdef DOS_NT
881 /* Detect MSDOS file names with drive specifiers. */
882 && ! (IS_DRIVE (o[0]) && IS_DEVICE_SEP (o[1])
883 && IS_DIRECTORY_SEP (o[2]))
884 #ifdef WINDOWSNT
885 /* Detect Windows file names in UNC format. */
886 && ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
887 #endif
888 #else /* not DOS_NT */
889 /* Detect Unix absolute file names (/... alone is not absolute on
890 DOS or Windows). */
891 && ! (IS_DIRECTORY_SEP (o[0]))
892 #endif /* not DOS_NT */
895 struct gcpro gcpro1;
897 GCPRO1 (name);
898 default_directory = Fexpand_file_name (default_directory, Qnil);
899 UNGCPRO;
902 multibyte = STRING_MULTIBYTE (name);
903 if (multibyte != STRING_MULTIBYTE (default_directory))
905 if (multibyte)
906 default_directory = string_to_multibyte (default_directory);
907 else
909 name = string_to_multibyte (name);
910 multibyte = 1;
914 /* Make a local copy of nm[] to protect it from GC in DECODE_FILE below. */
915 nm = alloca (SBYTES (name) + 1);
916 memcpy (nm, SSDATA (name), SBYTES (name) + 1);
918 #ifdef DOS_NT
919 /* Note if special escape prefix is present, but remove for now. */
920 if (nm[0] == '/' && nm[1] == ':')
922 is_escaped = 1;
923 nm += 2;
926 /* Find and remove drive specifier if present; this makes nm absolute
927 even if the rest of the name appears to be relative. Only look for
928 drive specifier at the beginning. */
929 if (IS_DRIVE (nm[0]) && IS_DEVICE_SEP (nm[1]))
931 drive = (unsigned char) nm[0];
932 nm += 2;
935 #ifdef WINDOWSNT
936 /* If we see "c://somedir", we want to strip the first slash after the
937 colon when stripping the drive letter. Otherwise, this expands to
938 "//somedir". */
939 if (drive && IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
940 nm++;
942 /* Discard any previous drive specifier if nm is now in UNC format. */
943 if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
945 drive = 0;
947 #endif /* WINDOWSNT */
948 #endif /* DOS_NT */
950 /* If nm is absolute, look for `/./' or `/../' or `//''sequences; if
951 none are found, we can probably return right away. We will avoid
952 allocating a new string if name is already fully expanded. */
953 if (
954 IS_DIRECTORY_SEP (nm[0])
955 #ifdef MSDOS
956 && drive && !is_escaped
957 #endif
958 #ifdef WINDOWSNT
959 && (drive || IS_DIRECTORY_SEP (nm[1])) && !is_escaped
960 #endif
963 /* If it turns out that the filename we want to return is just a
964 suffix of FILENAME, we don't need to go through and edit
965 things; we just need to construct a new string using data
966 starting at the middle of FILENAME. If we set LOSE, that
967 means we've discovered that we can't do that cool trick. */
968 bool lose = 0;
969 char *p = nm;
971 while (*p)
973 /* Since we know the name is absolute, we can assume that each
974 element starts with a "/". */
976 /* "." and ".." are hairy. */
977 if (IS_DIRECTORY_SEP (p[0])
978 && p[1] == '.'
979 && (IS_DIRECTORY_SEP (p[2])
980 || p[2] == 0
981 || (p[2] == '.' && (IS_DIRECTORY_SEP (p[3])
982 || p[3] == 0))))
983 lose = 1;
984 /* We want to replace multiple `/' in a row with a single
985 slash. */
986 else if (p > nm
987 && IS_DIRECTORY_SEP (p[0])
988 && IS_DIRECTORY_SEP (p[1]))
989 lose = 1;
990 p++;
992 if (!lose)
994 #ifdef DOS_NT
995 /* Make sure directories are all separated with /, but
996 avoid allocation of a new string when not required. */
997 if (multibyte)
999 Lisp_Object tem_name = make_specified_string (nm, -1, strlen (nm),
1000 multibyte);
1002 tem_name = ENCODE_FILE (tem_name);
1003 dostounix_filename (SSDATA (tem_name));
1004 tem_name = DECODE_FILE (tem_name);
1005 memcpy (nm, SSDATA (tem_name), SBYTES (tem_name) + 1);
1007 else
1008 dostounix_filename (nm);
1009 #ifdef WINDOWSNT
1010 if (IS_DIRECTORY_SEP (nm[1]))
1012 if (strcmp (nm, SSDATA (name)) != 0)
1013 name = make_specified_string (nm, -1, strlen (nm), multibyte);
1015 else
1016 #endif
1017 /* Drive must be set, so this is okay. */
1018 if (strcmp (nm - 2, SSDATA (name)) != 0)
1020 char temp[] = " :";
1022 name = make_specified_string (nm, -1, p - nm, multibyte);
1023 temp[0] = DRIVE_LETTER (drive);
1024 name = concat2 (build_string (temp), name);
1026 return name;
1027 #else /* not DOS_NT */
1028 if (strcmp (nm, SSDATA (name)) == 0)
1029 return name;
1030 return make_specified_string (nm, -1, strlen (nm), multibyte);
1031 #endif /* not DOS_NT */
1035 /* At this point, nm might or might not be an absolute file name. We
1036 need to expand ~ or ~user if present, otherwise prefix nm with
1037 default_directory if nm is not absolute, and finally collapse /./
1038 and /foo/../ sequences.
1040 We set newdir to be the appropriate prefix if one is needed:
1041 - the relevant user directory if nm starts with ~ or ~user
1042 - the specified drive's working dir (DOS/NT only) if nm does not
1043 start with /
1044 - the value of default_directory.
1046 Note that these prefixes are not guaranteed to be absolute (except
1047 for the working dir of a drive). Therefore, to ensure we always
1048 return an absolute name, if the final prefix is not absolute we
1049 append it to the current working directory. */
1051 newdir = 0;
1053 if (nm[0] == '~') /* prefix ~ */
1055 if (IS_DIRECTORY_SEP (nm[1])
1056 || nm[1] == 0) /* ~ by itself */
1058 Lisp_Object tem;
1060 if (!(newdir = egetenv ("HOME")))
1061 newdir = "";
1062 nm++;
1063 /* `egetenv' may return a unibyte string, which will bite us since
1064 we expect the directory to be multibyte. */
1065 tem = build_string (newdir);
1066 if (multibyte && !STRING_MULTIBYTE (tem))
1068 hdir = DECODE_FILE (tem);
1069 newdir = SSDATA (hdir);
1071 #ifdef DOS_NT
1072 collapse_newdir = 0;
1073 #endif
1075 else /* ~user/filename */
1077 char *o, *p;
1078 for (p = nm; *p && (!IS_DIRECTORY_SEP (*p)); p++);
1079 o = alloca (p - nm + 1);
1080 memcpy (o, nm, p - nm);
1081 o [p - nm] = 0;
1083 block_input ();
1084 pw = (struct passwd *) getpwnam (o + 1);
1085 unblock_input ();
1086 if (pw)
1088 Lisp_Object tem;
1090 newdir = pw->pw_dir;
1091 /* `getpwnam' may return a unibyte string, which will
1092 bite us since we expect the directory to be
1093 multibyte. */
1094 tem = build_string (newdir);
1095 if (multibyte && !STRING_MULTIBYTE (tem))
1097 hdir = DECODE_FILE (tem);
1098 newdir = SSDATA (hdir);
1100 nm = p;
1101 #ifdef DOS_NT
1102 collapse_newdir = 0;
1103 #endif
1106 /* If we don't find a user of that name, leave the name
1107 unchanged; don't move nm forward to p. */
1111 #ifdef DOS_NT
1112 /* On DOS and Windows, nm is absolute if a drive name was specified;
1113 use the drive's current directory as the prefix if needed. */
1114 if (!newdir && drive)
1116 /* Get default directory if needed to make nm absolute. */
1117 char *adir = NULL;
1118 if (!IS_DIRECTORY_SEP (nm[0]))
1120 adir = alloca (MAXPATHLEN + 1);
1121 if (!getdefdir (c_toupper (drive) - 'A' + 1, adir))
1122 adir = NULL;
1123 else if (multibyte)
1125 Lisp_Object tem = build_string (adir);
1127 tem = DECODE_FILE (tem);
1128 memcpy (adir, SSDATA (tem), SBYTES (tem) + 1);
1131 if (!adir)
1133 /* Either nm starts with /, or drive isn't mounted. */
1134 adir = alloca (4);
1135 adir[0] = DRIVE_LETTER (drive);
1136 adir[1] = ':';
1137 adir[2] = '/';
1138 adir[3] = 0;
1140 newdir = adir;
1142 #endif /* DOS_NT */
1144 /* Finally, if no prefix has been specified and nm is not absolute,
1145 then it must be expanded relative to default_directory. */
1147 if (1
1148 #ifndef DOS_NT
1149 /* /... alone is not absolute on DOS and Windows. */
1150 && !IS_DIRECTORY_SEP (nm[0])
1151 #endif
1152 #ifdef WINDOWSNT
1153 && !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
1154 #endif
1155 && !newdir)
1157 newdir = SSDATA (default_directory);
1158 #ifdef DOS_NT
1159 /* Note if special escape prefix is present, but remove for now. */
1160 if (newdir[0] == '/' && newdir[1] == ':')
1162 is_escaped = 1;
1163 newdir += 2;
1165 #endif
1168 #ifdef DOS_NT
1169 if (newdir)
1171 /* First ensure newdir is an absolute name. */
1172 if (
1173 /* Detect MSDOS file names with drive specifiers. */
1174 ! (IS_DRIVE (newdir[0])
1175 && IS_DEVICE_SEP (newdir[1]) && IS_DIRECTORY_SEP (newdir[2]))
1176 #ifdef WINDOWSNT
1177 /* Detect Windows file names in UNC format. */
1178 && ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1179 #endif
1182 /* Effectively, let newdir be (expand-file-name newdir cwd).
1183 Because of the admonition against calling expand-file-name
1184 when we have pointers into lisp strings, we accomplish this
1185 indirectly by prepending newdir to nm if necessary, and using
1186 cwd (or the wd of newdir's drive) as the new newdir. */
1187 char *adir;
1189 if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
1191 drive = (unsigned char) newdir[0];
1192 newdir += 2;
1194 if (!IS_DIRECTORY_SEP (nm[0]))
1196 ptrdiff_t newlen = strlen (newdir);
1197 char *tmp = alloca (newlen + strlen (nm) + 2);
1198 file_name_as_directory (tmp, newdir, newlen, multibyte);
1199 strcat (tmp, nm);
1200 nm = tmp;
1202 adir = alloca (MAXPATHLEN + 1);
1203 if (drive)
1205 if (!getdefdir (c_toupper (drive) - 'A' + 1, adir))
1206 strcpy (adir, "/");
1208 else
1209 getwd (adir);
1210 if (multibyte)
1212 Lisp_Object tem = build_string (adir);
1214 tem = DECODE_FILE (tem);
1215 memcpy (adir, SSDATA (tem), SBYTES (tem) + 1);
1217 newdir = adir;
1220 /* Strip off drive name from prefix, if present. */
1221 if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
1223 drive = newdir[0];
1224 newdir += 2;
1227 /* Keep only a prefix from newdir if nm starts with slash
1228 (//server/share for UNC, nothing otherwise). */
1229 if (IS_DIRECTORY_SEP (nm[0]) && collapse_newdir)
1231 #ifdef WINDOWSNT
1232 if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1234 char *adir = strcpy (alloca (strlen (newdir) + 1), newdir);
1235 char *p = adir + 2;
1236 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1237 p++;
1238 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1239 *p = 0;
1240 newdir = adir;
1242 else
1243 #endif
1244 newdir = "";
1247 #endif /* DOS_NT */
1249 if (newdir)
1251 /* Get rid of any slash at the end of newdir, unless newdir is
1252 just / or // (an incomplete UNC name). */
1253 length = strlen (newdir);
1254 tlen = length + 1;
1255 if (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
1256 #ifdef WINDOWSNT
1257 && !(length == 2 && IS_DIRECTORY_SEP (newdir[0]))
1258 #endif
1261 char *temp = alloca (length);
1262 memcpy (temp, newdir, length - 1);
1263 temp[length - 1] = 0;
1264 length--;
1265 newdir = temp;
1268 else
1270 length = 0;
1271 tlen = 0;
1274 /* Now concatenate the directory and name to new space in the stack frame. */
1275 tlen += strlen (nm) + 1;
1276 #ifdef DOS_NT
1277 /* Reserve space for drive specifier and escape prefix, since either
1278 or both may need to be inserted. (The Microsoft x86 compiler
1279 produces incorrect code if the following two lines are combined.) */
1280 target = alloca (tlen + 4);
1281 target += 4;
1282 #else /* not DOS_NT */
1283 target = alloca (tlen);
1284 #endif /* not DOS_NT */
1285 *target = 0;
1287 if (newdir)
1289 if (nm[0] == 0 || IS_DIRECTORY_SEP (nm[0]))
1291 #ifdef DOS_NT
1292 /* If newdir is effectively "C:/", then the drive letter will have
1293 been stripped and newdir will be "/". Concatenating with an
1294 absolute directory in nm produces "//", which will then be
1295 incorrectly treated as a network share. Ignore newdir in
1296 this case (keeping the drive letter). */
1297 if (!(drive && nm[0] && IS_DIRECTORY_SEP (newdir[0])
1298 && newdir[1] == '\0'))
1299 #endif
1300 strcpy (target, newdir);
1302 else
1303 file_name_as_directory (target, newdir, length, multibyte);
1306 strcat (target, nm);
1308 /* Now canonicalize by removing `//', `/.' and `/foo/..' if they
1309 appear. */
1311 char *p = target;
1312 char *o = target;
1314 while (*p)
1316 if (!IS_DIRECTORY_SEP (*p))
1318 *o++ = *p++;
1320 else if (p[1] == '.'
1321 && (IS_DIRECTORY_SEP (p[2])
1322 || p[2] == 0))
1324 /* If "/." is the entire filename, keep the "/". Otherwise,
1325 just delete the whole "/.". */
1326 if (o == target && p[2] == '\0')
1327 *o++ = *p;
1328 p += 2;
1330 else if (p[1] == '.' && p[2] == '.'
1331 /* `/../' is the "superroot" on certain file systems.
1332 Turned off on DOS_NT systems because they have no
1333 "superroot" and because this causes us to produce
1334 file names like "d:/../foo" which fail file-related
1335 functions of the underlying OS. (To reproduce, try a
1336 long series of "../../" in default_directory, longer
1337 than the number of levels from the root.) */
1338 #ifndef DOS_NT
1339 && o != target
1340 #endif
1341 && (IS_DIRECTORY_SEP (p[3]) || p[3] == 0))
1343 #ifdef WINDOWSNT
1344 char *prev_o = o;
1345 #endif
1346 while (o != target && (--o) && !IS_DIRECTORY_SEP (*o))
1348 #ifdef WINDOWSNT
1349 /* Don't go below server level in UNC filenames. */
1350 if (o == target + 1 && IS_DIRECTORY_SEP (*o)
1351 && IS_DIRECTORY_SEP (*target))
1352 o = prev_o;
1353 else
1354 #endif
1355 /* Keep initial / only if this is the whole name. */
1356 if (o == target && IS_ANY_SEP (*o) && p[3] == 0)
1357 ++o;
1358 p += 3;
1360 else if (p > target && IS_DIRECTORY_SEP (p[1]))
1361 /* Collapse multiple `/' in a row. */
1362 p++;
1363 else
1365 *o++ = *p++;
1369 #ifdef DOS_NT
1370 /* At last, set drive name. */
1371 #ifdef WINDOWSNT
1372 /* Except for network file name. */
1373 if (!(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1])))
1374 #endif /* WINDOWSNT */
1376 if (!drive) emacs_abort ();
1377 target -= 2;
1378 target[0] = DRIVE_LETTER (drive);
1379 target[1] = ':';
1381 /* Reinsert the escape prefix if required. */
1382 if (is_escaped)
1384 target -= 2;
1385 target[0] = '/';
1386 target[1] = ':';
1388 result = make_specified_string (target, -1, o - target, multibyte);
1389 if (multibyte)
1391 result = ENCODE_FILE (result);
1392 dostounix_filename (SSDATA (result));
1393 result = DECODE_FILE (result);
1395 else
1396 dostounix_filename (SSDATA (result));
1397 #else /* !DOS_NT */
1398 result = make_specified_string (target, -1, o - target, multibyte);
1399 #endif /* !DOS_NT */
1402 /* Again look to see if the file name has special constructs in it
1403 and perhaps call the corresponding file handler. This is needed
1404 for filenames such as "/foo/../user@host:/bar/../baz". Expanding
1405 the ".." component gives us "/user@host:/bar/../baz" which needs
1406 to be expanded again. */
1407 handler = Ffind_file_name_handler (result, Qexpand_file_name);
1408 if (!NILP (handler))
1410 handled_name = call3 (handler, Qexpand_file_name,
1411 result, default_directory);
1412 if (STRINGP (handled_name))
1413 return handled_name;
1414 error ("Invalid handler in `file-name-handler-alist'");
1417 return result;
1420 #if 0
1421 /* PLEASE DO NOT DELETE THIS COMMENTED-OUT VERSION!
1422 This is the old version of expand-file-name, before it was thoroughly
1423 rewritten for Emacs 10.31. We leave this version here commented-out,
1424 because the code is very complex and likely to have subtle bugs. If
1425 bugs _are_ found, it might be of interest to look at the old code and
1426 see what did it do in the relevant situation.
1428 Don't remove this code: it's true that it will be accessible
1429 from the repository, but a few years from deletion, people will
1430 forget it is there. */
1432 /* Changed this DEFUN to a DEAFUN, so as not to confuse `make-docfile'. */
1433 DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
1434 "Convert FILENAME to absolute, and canonicalize it.\n\
1435 Second arg DEFAULT is directory to start with if FILENAME is relative\n\
1436 \(does not start with slash); if DEFAULT is nil or missing,\n\
1437 the current buffer's value of default-directory is used.\n\
1438 Filenames containing `.' or `..' as components are simplified;\n\
1439 initial `~/' expands to your home directory.\n\
1440 See also the function `substitute-in-file-name'.")
1441 (name, defalt)
1442 Lisp_Object name, defalt;
1444 unsigned char *nm;
1446 register unsigned char *newdir, *p, *o;
1447 ptrdiff_t tlen;
1448 unsigned char *target;
1449 struct passwd *pw;
1451 CHECK_STRING (name);
1452 nm = SDATA (name);
1454 /* If nm is absolute, flush ...// and detect /./ and /../.
1455 If no /./ or /../ we can return right away. */
1456 if (nm[0] == '/')
1458 bool lose = 0;
1459 p = nm;
1460 while (*p)
1462 if (p[0] == '/' && p[1] == '/')
1463 nm = p + 1;
1464 if (p[0] == '/' && p[1] == '~')
1465 nm = p + 1, lose = 1;
1466 if (p[0] == '/' && p[1] == '.'
1467 && (p[2] == '/' || p[2] == 0
1468 || (p[2] == '.' && (p[3] == '/' || p[3] == 0))))
1469 lose = 1;
1470 p++;
1472 if (!lose)
1474 if (nm == SDATA (name))
1475 return name;
1476 return build_string (nm);
1480 /* Now determine directory to start with and put it in NEWDIR. */
1482 newdir = 0;
1484 if (nm[0] == '~') /* prefix ~ */
1485 if (nm[1] == '/' || nm[1] == 0)/* ~/filename */
1487 if (!(newdir = (unsigned char *) egetenv ("HOME")))
1488 newdir = (unsigned char *) "";
1489 nm++;
1491 else /* ~user/filename */
1493 /* Get past ~ to user. */
1494 unsigned char *user = nm + 1;
1495 /* Find end of name. */
1496 unsigned char *ptr = (unsigned char *) strchr (user, '/');
1497 ptrdiff_t len = ptr ? ptr - user : strlen (user);
1498 /* Copy the user name into temp storage. */
1499 o = alloca (len + 1);
1500 memcpy (o, user, len);
1501 o[len] = 0;
1503 /* Look up the user name. */
1504 block_input ();
1505 pw = (struct passwd *) getpwnam (o + 1);
1506 unblock_input ();
1507 if (!pw)
1508 error ("\"%s\" isn't a registered user", o + 1);
1510 newdir = (unsigned char *) pw->pw_dir;
1512 /* Discard the user name from NM. */
1513 nm += len;
1516 if (nm[0] != '/' && !newdir)
1518 if (NILP (defalt))
1519 defalt = current_buffer->directory;
1520 CHECK_STRING (defalt);
1521 newdir = SDATA (defalt);
1524 /* Now concatenate the directory and name to new space in the stack frame. */
1526 tlen = (newdir ? strlen (newdir) + 1 : 0) + strlen (nm) + 1;
1527 target = alloca (tlen);
1528 *target = 0;
1530 if (newdir)
1532 if (nm[0] == 0 || nm[0] == '/')
1533 strcpy (target, newdir);
1534 else
1535 file_name_as_directory (target, newdir);
1538 strcat (target, nm);
1540 /* Now canonicalize by removing /. and /foo/.. if they appear. */
1542 p = target;
1543 o = target;
1545 while (*p)
1547 if (*p != '/')
1549 *o++ = *p++;
1551 else if (!strncmp (p, "//", 2)
1554 o = target;
1555 p++;
1557 else if (p[0] == '/' && p[1] == '.'
1558 && (p[2] == '/' || p[2] == 0))
1559 p += 2;
1560 else if (!strncmp (p, "/..", 3)
1561 /* `/../' is the "superroot" on certain file systems. */
1562 && o != target
1563 && (p[3] == '/' || p[3] == 0))
1565 while (o != target && *--o != '/')
1567 if (o == target && *o == '/')
1568 ++o;
1569 p += 3;
1571 else
1573 *o++ = *p++;
1577 return make_string (target, o - target);
1579 #endif
1581 /* If /~ or // appears, discard everything through first slash. */
1582 static bool
1583 file_name_absolute_p (const char *filename)
1585 return
1586 (IS_DIRECTORY_SEP (*filename) || *filename == '~'
1587 #ifdef DOS_NT
1588 || (IS_DRIVE (*filename) && IS_DEVICE_SEP (filename[1])
1589 && IS_DIRECTORY_SEP (filename[2]))
1590 #endif
1594 static char *
1595 search_embedded_absfilename (char *nm, char *endp)
1597 char *p, *s;
1599 for (p = nm + 1; p < endp; p++)
1601 if (IS_DIRECTORY_SEP (p[-1])
1602 && file_name_absolute_p (p)
1603 #if defined (WINDOWSNT) || defined (CYGWIN)
1604 /* // at start of file name is meaningful in Apollo,
1605 WindowsNT and Cygwin systems. */
1606 && !(IS_DIRECTORY_SEP (p[0]) && p - 1 == nm)
1607 #endif /* not (WINDOWSNT || CYGWIN) */
1610 for (s = p; *s && !IS_DIRECTORY_SEP (*s); s++);
1611 if (p[0] == '~' && s > p + 1) /* We've got "/~something/". */
1613 char *o = alloca (s - p + 1);
1614 struct passwd *pw;
1615 memcpy (o, p, s - p);
1616 o [s - p] = 0;
1618 /* If we have ~user and `user' exists, discard
1619 everything up to ~. But if `user' does not exist, leave
1620 ~user alone, it might be a literal file name. */
1621 block_input ();
1622 pw = getpwnam (o + 1);
1623 unblock_input ();
1624 if (pw)
1625 return p;
1627 else
1628 return p;
1631 return NULL;
1634 DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
1635 Ssubstitute_in_file_name, 1, 1, 0,
1636 doc: /* Substitute environment variables referred to in FILENAME.
1637 `$FOO' where FOO is an environment variable name means to substitute
1638 the value of that variable. The variable name should be terminated
1639 with a character not a letter, digit or underscore; otherwise, enclose
1640 the entire variable name in braces.
1642 If `/~' appears, all of FILENAME through that `/' is discarded.
1643 If `//' appears, everything up to and including the first of
1644 those `/' is discarded. */)
1645 (Lisp_Object filename)
1647 char *nm, *s, *p, *o, *x, *endp;
1648 char *target = NULL;
1649 int total = 0;
1650 bool substituted = 0;
1651 bool multibyte;
1652 char *xnm;
1653 Lisp_Object handler;
1655 CHECK_STRING (filename);
1657 multibyte = STRING_MULTIBYTE (filename);
1659 /* If the file name has special constructs in it,
1660 call the corresponding file handler. */
1661 handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
1662 if (!NILP (handler))
1664 Lisp_Object handled_name = call2 (handler, Qsubstitute_in_file_name,
1665 filename);
1666 if (STRINGP (handled_name))
1667 return handled_name;
1668 error ("Invalid handler in `file-name-handler-alist'");
1671 /* Always work on a copy of the string, in case GC happens during
1672 decode of environment variables, causing the original Lisp_String
1673 data to be relocated. */
1674 nm = alloca (SBYTES (filename) + 1);
1675 memcpy (nm, SDATA (filename), SBYTES (filename) + 1);
1677 #ifdef DOS_NT
1678 if (multibyte)
1680 Lisp_Object encoded_filename = ENCODE_FILE (filename);
1681 Lisp_Object tem_fn;
1683 dostounix_filename (SDATA (encoded_filename));
1684 tem_fn = DECODE_FILE (encoded_filename);
1685 nm = alloca (SBYTES (tem_fn) + 1);
1686 memcpy (nm, SDATA (tem_fn), SBYTES (tem_fn) + 1);
1687 substituted = (memcmp (nm, SDATA (filename), SBYTES (filename)) != 0);
1688 if (substituted)
1689 filename = tem_fn;
1691 else
1693 dostounix_filename (nm);
1694 substituted = (memcmp (nm, SDATA (filename), SBYTES (filename)) != 0);
1696 #endif
1697 endp = nm + SBYTES (filename);
1699 /* If /~ or // appears, discard everything through first slash. */
1700 p = search_embedded_absfilename (nm, endp);
1701 if (p)
1702 /* Start over with the new string, so we check the file-name-handler
1703 again. Important with filenames like "/home/foo//:/hello///there"
1704 which would substitute to "/:/hello///there" rather than "/there". */
1705 return Fsubstitute_in_file_name
1706 (make_specified_string (p, -1, endp - p, multibyte));
1708 /* See if any variables are substituted into the string
1709 and find the total length of their values in `total'. */
1711 for (p = nm; p != endp;)
1712 if (*p != '$')
1713 p++;
1714 else
1716 p++;
1717 if (p == endp)
1718 goto badsubst;
1719 else if (*p == '$')
1721 /* "$$" means a single "$". */
1722 p++;
1723 total -= 1;
1724 substituted = 1;
1725 continue;
1727 else if (*p == '{')
1729 o = ++p;
1730 while (p != endp && *p != '}') p++;
1731 if (*p != '}') goto missingclose;
1732 s = p;
1734 else
1736 o = p;
1737 while (p != endp && (c_isalnum (*p) || *p == '_')) p++;
1738 s = p;
1741 /* Copy out the variable name. */
1742 target = alloca (s - o + 1);
1743 memcpy (target, o, s - o);
1744 target[s - o] = 0;
1745 #ifdef DOS_NT
1746 strupr (target); /* $home == $HOME etc. */
1747 #endif /* DOS_NT */
1749 /* Get variable value. */
1750 o = egetenv (target);
1751 if (o)
1753 /* Don't try to guess a maximum length - UTF8 can use up to
1754 four bytes per character. This code is unlikely to run
1755 in a situation that requires performance, so decoding the
1756 env variables twice should be acceptable. Note that
1757 decoding may cause a garbage collect. */
1758 Lisp_Object orig, decoded;
1759 orig = build_unibyte_string (o);
1760 decoded = DECODE_FILE (orig);
1761 total += SBYTES (decoded);
1762 substituted = 1;
1764 else if (*p == '}')
1765 goto badvar;
1768 if (!substituted)
1769 return filename;
1771 /* If substitution required, recopy the string and do it. */
1772 /* Make space in stack frame for the new copy. */
1773 xnm = alloca (SBYTES (filename) + total + 1);
1774 x = xnm;
1776 /* Copy the rest of the name through, replacing $ constructs with values. */
1777 for (p = nm; *p;)
1778 if (*p != '$')
1779 *x++ = *p++;
1780 else
1782 p++;
1783 if (p == endp)
1784 goto badsubst;
1785 else if (*p == '$')
1787 *x++ = *p++;
1788 continue;
1790 else if (*p == '{')
1792 o = ++p;
1793 while (p != endp && *p != '}') p++;
1794 if (*p != '}') goto missingclose;
1795 s = p++;
1797 else
1799 o = p;
1800 while (p != endp && (c_isalnum (*p) || *p == '_')) p++;
1801 s = p;
1804 /* Copy out the variable name. */
1805 target = alloca (s - o + 1);
1806 memcpy (target, o, s - o);
1807 target[s - o] = 0;
1808 #ifdef DOS_NT
1809 strupr (target); /* $home == $HOME etc. */
1810 #endif /* DOS_NT */
1812 /* Get variable value. */
1813 o = egetenv (target);
1814 if (!o)
1816 *x++ = '$';
1817 strcpy (x, target); x+= strlen (target);
1819 else
1821 Lisp_Object orig, decoded;
1822 ptrdiff_t orig_length, decoded_length;
1823 orig_length = strlen (o);
1824 orig = make_unibyte_string (o, orig_length);
1825 decoded = DECODE_FILE (orig);
1826 decoded_length = SBYTES (decoded);
1827 memcpy (x, SDATA (decoded), decoded_length);
1828 x += decoded_length;
1830 /* If environment variable needed decoding, return value
1831 needs to be multibyte. */
1832 if (decoded_length != orig_length
1833 || memcmp (SDATA (decoded), o, orig_length))
1834 multibyte = 1;
1838 *x = 0;
1840 /* If /~ or // appears, discard everything through first slash. */
1841 while ((p = search_embedded_absfilename (xnm, x)) != NULL)
1842 /* This time we do not start over because we've already expanded envvars
1843 and replaced $$ with $. Maybe we should start over as well, but we'd
1844 need to quote some $ to $$ first. */
1845 xnm = p;
1847 return make_specified_string (xnm, -1, x - xnm, multibyte);
1849 badsubst:
1850 error ("Bad format environment-variable substitution");
1851 missingclose:
1852 error ("Missing \"}\" in environment-variable substitution");
1853 badvar:
1854 error ("Substituting nonexistent environment variable \"%s\"", target);
1856 /* NOTREACHED */
1857 return Qnil;
1860 /* A slightly faster and more convenient way to get
1861 (directory-file-name (expand-file-name FOO)). */
1863 Lisp_Object
1864 expand_and_dir_to_file (Lisp_Object filename, Lisp_Object defdir)
1866 register Lisp_Object absname;
1868 absname = Fexpand_file_name (filename, defdir);
1870 /* Remove final slash, if any (unless this is the root dir).
1871 stat behaves differently depending! */
1872 if (SCHARS (absname) > 1
1873 && IS_DIRECTORY_SEP (SREF (absname, SBYTES (absname) - 1))
1874 && !IS_DEVICE_SEP (SREF (absname, SBYTES (absname) - 2)))
1875 /* We cannot take shortcuts; they might be wrong for magic file names. */
1876 absname = Fdirectory_file_name (absname);
1877 return absname;
1880 /* Signal an error if the file ABSNAME already exists.
1881 If INTERACTIVE, ask the user whether to proceed,
1882 and bypass the error if the user says to go ahead.
1883 QUERYSTRING is a name for the action that is being considered
1884 to alter the file.
1886 *STATPTR is used to store the stat information if the file exists.
1887 If the file does not exist, STATPTR->st_mode is set to 0.
1888 If STATPTR is null, we don't store into it.
1890 If QUICK, ask for y or n, not yes or no. */
1892 static void
1893 barf_or_query_if_file_exists (Lisp_Object absname, const char *querystring,
1894 bool interactive, struct stat *statptr,
1895 bool quick)
1897 Lisp_Object tem, encoded_filename;
1898 struct stat statbuf;
1899 struct gcpro gcpro1;
1901 encoded_filename = ENCODE_FILE (absname);
1903 /* `stat' is a good way to tell whether the file exists,
1904 regardless of what access permissions it has. */
1905 if (lstat (SSDATA (encoded_filename), &statbuf) >= 0)
1907 if (S_ISDIR (statbuf.st_mode))
1908 xsignal2 (Qfile_error,
1909 build_string ("File is a directory"), absname);
1911 if (! interactive)
1912 xsignal2 (Qfile_already_exists,
1913 build_string ("File already exists"), absname);
1914 GCPRO1 (absname);
1915 tem = format2 ("File %s already exists; %s anyway? ",
1916 absname, build_string (querystring));
1917 if (quick)
1918 tem = call1 (intern ("y-or-n-p"), tem);
1919 else
1920 tem = do_yes_or_no_p (tem);
1921 UNGCPRO;
1922 if (NILP (tem))
1923 xsignal2 (Qfile_already_exists,
1924 build_string ("File already exists"), absname);
1925 if (statptr)
1926 *statptr = statbuf;
1928 else
1930 if (statptr)
1931 statptr->st_mode = 0;
1933 return;
1936 DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 6,
1937 "fCopy file: \nGCopy %s to file: \np\nP",
1938 doc: /* Copy FILE to NEWNAME. Both args must be strings.
1939 If NEWNAME names a directory, copy FILE there.
1941 This function always sets the file modes of the output file to match
1942 the input file.
1944 The optional third argument OK-IF-ALREADY-EXISTS specifies what to do
1945 if file NEWNAME already exists. If OK-IF-ALREADY-EXISTS is nil, we
1946 signal a `file-already-exists' error without overwriting. If
1947 OK-IF-ALREADY-EXISTS is a number, we request confirmation from the user
1948 about overwriting; this is what happens in interactive use with M-x.
1949 Any other value for OK-IF-ALREADY-EXISTS means to overwrite the
1950 existing file.
1952 Fourth arg KEEP-TIME non-nil means give the output file the same
1953 last-modified time as the old one. (This works on only some systems.)
1955 A prefix arg makes KEEP-TIME non-nil.
1957 If PRESERVE-UID-GID is non-nil, we try to transfer the
1958 uid and gid of FILE to NEWNAME.
1960 If PRESERVE-SELINUX-CONTEXT is non-nil and SELinux is enabled
1961 on the system, we copy the SELinux context of FILE to NEWNAME. */)
1962 (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)
1964 int ifd, ofd;
1965 int n;
1966 char buf[16 * 1024];
1967 struct stat st, out_st;
1968 Lisp_Object handler;
1969 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1970 ptrdiff_t count = SPECPDL_INDEX ();
1971 bool input_file_statable_p;
1972 Lisp_Object encoded_file, encoded_newname;
1973 #if HAVE_LIBSELINUX
1974 security_context_t con;
1975 int conlength = 0;
1976 #endif
1978 encoded_file = encoded_newname = Qnil;
1979 GCPRO4 (file, newname, encoded_file, encoded_newname);
1980 CHECK_STRING (file);
1981 CHECK_STRING (newname);
1983 if (!NILP (Ffile_directory_p (newname)))
1984 newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname);
1985 else
1986 newname = Fexpand_file_name (newname, Qnil);
1988 file = Fexpand_file_name (file, Qnil);
1990 /* If the input file name has special constructs in it,
1991 call the corresponding file handler. */
1992 handler = Ffind_file_name_handler (file, Qcopy_file);
1993 /* Likewise for output file name. */
1994 if (NILP (handler))
1995 handler = Ffind_file_name_handler (newname, Qcopy_file);
1996 if (!NILP (handler))
1997 RETURN_UNGCPRO (call7 (handler, Qcopy_file, file, newname,
1998 ok_if_already_exists, keep_time, preserve_uid_gid,
1999 preserve_selinux_context));
2001 encoded_file = ENCODE_FILE (file);
2002 encoded_newname = ENCODE_FILE (newname);
2004 if (NILP (ok_if_already_exists)
2005 || INTEGERP (ok_if_already_exists))
2006 barf_or_query_if_file_exists (newname, "copy to it",
2007 INTEGERP (ok_if_already_exists), &out_st, 0);
2008 else if (stat (SSDATA (encoded_newname), &out_st) < 0)
2009 out_st.st_mode = 0;
2011 #ifdef WINDOWSNT
2012 if (!CopyFile (SDATA (encoded_file),
2013 SDATA (encoded_newname),
2014 FALSE))
2015 report_file_error ("Copying file", Fcons (file, Fcons (newname, Qnil)));
2016 /* CopyFile retains the timestamp by default. */
2017 else if (NILP (keep_time))
2019 EMACS_TIME now;
2020 DWORD attributes;
2021 char * filename;
2023 filename = SDATA (encoded_newname);
2025 /* Ensure file is writable while its modified time is set. */
2026 attributes = GetFileAttributes (filename);
2027 SetFileAttributes (filename, attributes & ~FILE_ATTRIBUTE_READONLY);
2028 now = current_emacs_time ();
2029 if (set_file_times (-1, filename, now, now))
2031 /* Restore original attributes. */
2032 SetFileAttributes (filename, attributes);
2033 xsignal2 (Qfile_date_error,
2034 build_string ("Cannot set file date"), newname);
2036 /* Restore original attributes. */
2037 SetFileAttributes (filename, attributes);
2039 #else /* not WINDOWSNT */
2040 immediate_quit = 1;
2041 ifd = emacs_open (SSDATA (encoded_file), O_RDONLY, 0);
2042 immediate_quit = 0;
2044 if (ifd < 0)
2045 report_file_error ("Opening input file", Fcons (file, Qnil));
2047 record_unwind_protect (close_file_unwind, make_number (ifd));
2049 /* We can only copy regular files and symbolic links. Other files are not
2050 copyable by us. */
2051 input_file_statable_p = (fstat (ifd, &st) >= 0);
2053 #if HAVE_LIBSELINUX
2054 if (!NILP (preserve_selinux_context) && is_selinux_enabled ())
2056 conlength = fgetfilecon (ifd, &con);
2057 if (conlength == -1)
2058 report_file_error ("Doing fgetfilecon", Fcons (file, Qnil));
2060 #endif
2062 if (out_st.st_mode != 0
2063 && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
2065 errno = 0;
2066 report_file_error ("Input and output files are the same",
2067 Fcons (file, Fcons (newname, Qnil)));
2070 if (input_file_statable_p)
2072 if (!(S_ISREG (st.st_mode)) && !(S_ISLNK (st.st_mode)))
2074 #if defined (EISDIR)
2075 /* Get a better looking error message. */
2076 errno = EISDIR;
2077 #endif /* EISDIR */
2078 report_file_error ("Non-regular file", Fcons (file, Qnil));
2082 #ifdef MSDOS
2083 /* System's default file type was set to binary by _fmode in emacs.c. */
2084 ofd = emacs_open (SDATA (encoded_newname),
2085 O_WRONLY | O_TRUNC | O_CREAT
2086 | (NILP (ok_if_already_exists) ? O_EXCL : 0),
2087 S_IREAD | S_IWRITE);
2088 #else /* not MSDOS */
2090 mode_t new_mask = 0666;
2091 if (input_file_statable_p)
2093 if (!NILP (preserve_uid_gid))
2094 new_mask = 0600;
2095 new_mask &= st.st_mode;
2097 ofd = emacs_open (SSDATA (encoded_newname),
2098 (O_WRONLY | O_TRUNC | O_CREAT
2099 | (NILP (ok_if_already_exists) ? O_EXCL : 0)),
2100 new_mask);
2102 #endif /* not MSDOS */
2103 if (ofd < 0)
2104 report_file_error ("Opening output file", Fcons (newname, Qnil));
2106 record_unwind_protect (close_file_unwind, make_number (ofd));
2108 immediate_quit = 1;
2109 QUIT;
2110 while ((n = emacs_read (ifd, buf, sizeof buf)) > 0)
2111 if (emacs_write (ofd, buf, n) != n)
2112 report_file_error ("I/O error", Fcons (newname, Qnil));
2113 immediate_quit = 0;
2115 #ifndef MSDOS
2116 /* Preserve the original file modes, and if requested, also its
2117 owner and group. */
2118 if (input_file_statable_p)
2120 mode_t mode_mask = 07777;
2121 if (!NILP (preserve_uid_gid))
2123 /* Attempt to change owner and group. If that doesn't work
2124 attempt to change just the group, as that is sometimes allowed.
2125 Adjust the mode mask to eliminate setuid or setgid bits
2126 that are inappropriate if the owner and group are wrong. */
2127 if (fchown (ofd, st.st_uid, st.st_gid) != 0)
2129 mode_mask &= ~06000;
2130 if (fchown (ofd, -1, st.st_gid) == 0)
2131 mode_mask |= 02000;
2134 if (fchmod (ofd, st.st_mode & mode_mask) != 0)
2135 report_file_error ("Doing chmod", Fcons (newname, Qnil));
2137 #endif /* not MSDOS */
2139 #if HAVE_LIBSELINUX
2140 if (conlength > 0)
2142 /* Set the modified context back to the file. */
2143 bool fail = fsetfilecon (ofd, con) != 0;
2144 /* See http://debbugs.gnu.org/11245 for ENOTSUP. */
2145 if (fail && errno != ENOTSUP)
2146 report_file_error ("Doing fsetfilecon", Fcons (newname, Qnil));
2148 freecon (con);
2150 #endif
2152 if (input_file_statable_p)
2154 if (!NILP (keep_time))
2156 EMACS_TIME atime = get_stat_atime (&st);
2157 EMACS_TIME mtime = get_stat_mtime (&st);
2158 if (set_file_times (ofd, SSDATA (encoded_newname), atime, mtime))
2159 xsignal2 (Qfile_date_error,
2160 build_string ("Cannot set file date"), newname);
2164 if (emacs_close (ofd) < 0)
2165 report_file_error ("I/O error", Fcons (newname, Qnil));
2167 emacs_close (ifd);
2169 #ifdef MSDOS
2170 if (input_file_statable_p)
2172 /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
2173 and if it can't, it tells so. Otherwise, under MSDOS we usually
2174 get only the READ bit, which will make the copied file read-only,
2175 so it's better not to chmod at all. */
2176 if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
2177 chmod (SDATA (encoded_newname), st.st_mode & 07777);
2179 #endif /* MSDOS */
2180 #endif /* not WINDOWSNT */
2182 /* Discard the unwind protects. */
2183 specpdl_ptr = specpdl + count;
2185 UNGCPRO;
2186 return Qnil;
2189 DEFUN ("make-directory-internal", Fmake_directory_internal,
2190 Smake_directory_internal, 1, 1, 0,
2191 doc: /* Create a new directory named DIRECTORY. */)
2192 (Lisp_Object directory)
2194 const char *dir;
2195 Lisp_Object handler;
2196 Lisp_Object encoded_dir;
2198 CHECK_STRING (directory);
2199 directory = Fexpand_file_name (directory, Qnil);
2201 handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
2202 if (!NILP (handler))
2203 return call2 (handler, Qmake_directory_internal, directory);
2205 encoded_dir = ENCODE_FILE (directory);
2207 dir = SSDATA (encoded_dir);
2209 #ifdef WINDOWSNT
2210 if (mkdir (dir) != 0)
2211 #else
2212 if (mkdir (dir, 0777 & ~auto_saving_dir_umask) != 0)
2213 #endif
2214 report_file_error ("Creating directory", list1 (directory));
2216 return Qnil;
2219 DEFUN ("delete-directory-internal", Fdelete_directory_internal,
2220 Sdelete_directory_internal, 1, 1, 0,
2221 doc: /* Delete the directory named DIRECTORY. Does not follow symlinks. */)
2222 (Lisp_Object directory)
2224 const char *dir;
2225 Lisp_Object encoded_dir;
2227 CHECK_STRING (directory);
2228 directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil));
2229 encoded_dir = ENCODE_FILE (directory);
2230 dir = SSDATA (encoded_dir);
2232 if (rmdir (dir) != 0)
2233 report_file_error ("Removing directory", list1 (directory));
2235 return Qnil;
2238 DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 2,
2239 "(list (read-file-name \
2240 (if (and delete-by-moving-to-trash (null current-prefix-arg)) \
2241 \"Move file to trash: \" \"Delete file: \") \
2242 nil default-directory (confirm-nonexistent-file-or-buffer)) \
2243 (null current-prefix-arg))",
2244 doc: /* Delete file named FILENAME. If it is a symlink, remove the symlink.
2245 If file has multiple names, it continues to exist with the other names.
2246 TRASH non-nil means to trash the file instead of deleting, provided
2247 `delete-by-moving-to-trash' is non-nil.
2249 When called interactively, TRASH is t if no prefix argument is given.
2250 With a prefix argument, TRASH is nil. */)
2251 (Lisp_Object filename, Lisp_Object trash)
2253 Lisp_Object handler;
2254 Lisp_Object encoded_file;
2255 struct gcpro gcpro1;
2257 GCPRO1 (filename);
2258 if (!NILP (Ffile_directory_p (filename))
2259 && NILP (Ffile_symlink_p (filename)))
2260 xsignal2 (Qfile_error,
2261 build_string ("Removing old name: is a directory"),
2262 filename);
2263 UNGCPRO;
2264 filename = Fexpand_file_name (filename, Qnil);
2266 handler = Ffind_file_name_handler (filename, Qdelete_file);
2267 if (!NILP (handler))
2268 return call3 (handler, Qdelete_file, filename, trash);
2270 if (delete_by_moving_to_trash && !NILP (trash))
2271 return call1 (Qmove_file_to_trash, filename);
2273 encoded_file = ENCODE_FILE (filename);
2275 if (unlink (SSDATA (encoded_file)) < 0)
2276 report_file_error ("Removing old name", list1 (filename));
2277 return Qnil;
2280 static Lisp_Object
2281 internal_delete_file_1 (Lisp_Object ignore)
2283 return Qt;
2286 /* Delete file FILENAME.
2287 This ignores `delete-by-moving-to-trash'. */
2289 void
2290 internal_delete_file (Lisp_Object filename)
2292 internal_condition_case_2 (Fdelete_file, filename, Qnil,
2293 Qt, internal_delete_file_1);
2296 DEFUN ("rename-file", Frename_file, Srename_file, 2, 3,
2297 "fRename file: \nGRename %s to file: \np",
2298 doc: /* Rename FILE as NEWNAME. Both args must be strings.
2299 If file has names other than FILE, it continues to have those names.
2300 Signals a `file-already-exists' error if a file NEWNAME already exists
2301 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2302 A number as third arg means request confirmation if NEWNAME already exists.
2303 This is what happens in interactive use with M-x. */)
2304 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
2306 Lisp_Object handler;
2307 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
2308 Lisp_Object encoded_file, encoded_newname, symlink_target;
2310 symlink_target = encoded_file = encoded_newname = Qnil;
2311 GCPRO5 (file, newname, encoded_file, encoded_newname, symlink_target);
2312 CHECK_STRING (file);
2313 CHECK_STRING (newname);
2314 file = Fexpand_file_name (file, Qnil);
2316 if ((!NILP (Ffile_directory_p (newname)))
2317 #ifdef DOS_NT
2318 /* If the file names are identical but for the case,
2319 don't attempt to move directory to itself. */
2320 && (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2321 #endif
2324 Lisp_Object fname = (NILP (Ffile_directory_p (file))
2325 ? file : Fdirectory_file_name (file));
2326 newname = Fexpand_file_name (Ffile_name_nondirectory (fname), newname);
2328 else
2329 newname = Fexpand_file_name (newname, Qnil);
2331 /* If the file name has special constructs in it,
2332 call the corresponding file handler. */
2333 handler = Ffind_file_name_handler (file, Qrename_file);
2334 if (NILP (handler))
2335 handler = Ffind_file_name_handler (newname, Qrename_file);
2336 if (!NILP (handler))
2337 RETURN_UNGCPRO (call4 (handler, Qrename_file,
2338 file, newname, ok_if_already_exists));
2340 encoded_file = ENCODE_FILE (file);
2341 encoded_newname = ENCODE_FILE (newname);
2343 #ifdef DOS_NT
2344 /* If the file names are identical but for the case, don't ask for
2345 confirmation: they simply want to change the letter-case of the
2346 file name. */
2347 if (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2348 #endif
2349 if (NILP (ok_if_already_exists)
2350 || INTEGERP (ok_if_already_exists))
2351 barf_or_query_if_file_exists (newname, "rename to it",
2352 INTEGERP (ok_if_already_exists), 0, 0);
2353 if (rename (SSDATA (encoded_file), SSDATA (encoded_newname)) < 0)
2355 if (errno == EXDEV)
2357 ptrdiff_t count;
2358 symlink_target = Ffile_symlink_p (file);
2359 if (! NILP (symlink_target))
2360 Fmake_symbolic_link (symlink_target, newname,
2361 NILP (ok_if_already_exists) ? Qnil : Qt);
2362 else if (!NILP (Ffile_directory_p (file)))
2363 call4 (Qcopy_directory, file, newname, Qt, Qnil);
2364 else
2365 /* We have already prompted if it was an integer, so don't
2366 have copy-file prompt again. */
2367 Fcopy_file (file, newname,
2368 NILP (ok_if_already_exists) ? Qnil : Qt,
2369 Qt, Qt, Qt);
2371 count = SPECPDL_INDEX ();
2372 specbind (Qdelete_by_moving_to_trash, Qnil);
2374 if (!NILP (Ffile_directory_p (file)) && NILP (symlink_target))
2375 call2 (Qdelete_directory, file, Qt);
2376 else
2377 Fdelete_file (file, Qnil);
2378 unbind_to (count, Qnil);
2380 else
2381 report_file_error ("Renaming", list2 (file, newname));
2383 UNGCPRO;
2384 return Qnil;
2387 DEFUN ("add-name-to-file", Fadd_name_to_file, Sadd_name_to_file, 2, 3,
2388 "fAdd name to file: \nGName to add to %s: \np",
2389 doc: /* Give FILE additional name NEWNAME. Both args must be strings.
2390 Signals a `file-already-exists' error if a file NEWNAME already exists
2391 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2392 A number as third arg means request confirmation if NEWNAME already exists.
2393 This is what happens in interactive use with M-x. */)
2394 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
2396 Lisp_Object handler;
2397 Lisp_Object encoded_file, encoded_newname;
2398 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2400 GCPRO4 (file, newname, encoded_file, encoded_newname);
2401 encoded_file = encoded_newname = Qnil;
2402 CHECK_STRING (file);
2403 CHECK_STRING (newname);
2404 file = Fexpand_file_name (file, Qnil);
2406 if (!NILP (Ffile_directory_p (newname)))
2407 newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname);
2408 else
2409 newname = Fexpand_file_name (newname, Qnil);
2411 /* If the file name has special constructs in it,
2412 call the corresponding file handler. */
2413 handler = Ffind_file_name_handler (file, Qadd_name_to_file);
2414 if (!NILP (handler))
2415 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
2416 newname, ok_if_already_exists));
2418 /* If the new name has special constructs in it,
2419 call the corresponding file handler. */
2420 handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
2421 if (!NILP (handler))
2422 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
2423 newname, ok_if_already_exists));
2425 encoded_file = ENCODE_FILE (file);
2426 encoded_newname = ENCODE_FILE (newname);
2428 if (NILP (ok_if_already_exists)
2429 || INTEGERP (ok_if_already_exists))
2430 barf_or_query_if_file_exists (newname, "make it a new name",
2431 INTEGERP (ok_if_already_exists), 0, 0);
2433 unlink (SSDATA (newname));
2434 if (link (SSDATA (encoded_file), SSDATA (encoded_newname)) < 0)
2435 report_file_error ("Adding new name", list2 (file, newname));
2437 UNGCPRO;
2438 return Qnil;
2441 DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3,
2442 "FMake symbolic link to file: \nGMake symbolic link to file %s: \np",
2443 doc: /* Make a symbolic link to FILENAME, named LINKNAME.
2444 Both args must be strings.
2445 Signals a `file-already-exists' error if a file LINKNAME already exists
2446 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2447 A number as third arg means request confirmation if LINKNAME already exists.
2448 This happens for interactive use with M-x. */)
2449 (Lisp_Object filename, Lisp_Object linkname, Lisp_Object ok_if_already_exists)
2451 Lisp_Object handler;
2452 Lisp_Object encoded_filename, encoded_linkname;
2453 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2455 GCPRO4 (filename, linkname, encoded_filename, encoded_linkname);
2456 encoded_filename = encoded_linkname = Qnil;
2457 CHECK_STRING (filename);
2458 CHECK_STRING (linkname);
2459 /* If the link target has a ~, we must expand it to get
2460 a truly valid file name. Otherwise, do not expand;
2461 we want to permit links to relative file names. */
2462 if (SREF (filename, 0) == '~')
2463 filename = Fexpand_file_name (filename, Qnil);
2465 if (!NILP (Ffile_directory_p (linkname)))
2466 linkname = Fexpand_file_name (Ffile_name_nondirectory (filename), linkname);
2467 else
2468 linkname = Fexpand_file_name (linkname, Qnil);
2470 /* If the file name has special constructs in it,
2471 call the corresponding file handler. */
2472 handler = Ffind_file_name_handler (filename, Qmake_symbolic_link);
2473 if (!NILP (handler))
2474 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2475 linkname, ok_if_already_exists));
2477 /* If the new link name has special constructs in it,
2478 call the corresponding file handler. */
2479 handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
2480 if (!NILP (handler))
2481 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2482 linkname, ok_if_already_exists));
2484 encoded_filename = ENCODE_FILE (filename);
2485 encoded_linkname = ENCODE_FILE (linkname);
2487 if (NILP (ok_if_already_exists)
2488 || INTEGERP (ok_if_already_exists))
2489 barf_or_query_if_file_exists (linkname, "make it a link",
2490 INTEGERP (ok_if_already_exists), 0, 0);
2491 if (symlink (SSDATA (encoded_filename), SSDATA (encoded_linkname)) < 0)
2493 /* If we didn't complain already, silently delete existing file. */
2494 if (errno == EEXIST)
2496 unlink (SSDATA (encoded_linkname));
2497 if (symlink (SSDATA (encoded_filename), SSDATA (encoded_linkname))
2498 >= 0)
2500 UNGCPRO;
2501 return Qnil;
2504 if (errno == ENOSYS)
2506 UNGCPRO;
2507 xsignal1 (Qfile_error,
2508 build_string ("Symbolic links are not supported"));
2511 report_file_error ("Making symbolic link", list2 (filename, linkname));
2513 UNGCPRO;
2514 return Qnil;
2518 DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
2519 1, 1, 0,
2520 doc: /* Return t if file FILENAME specifies an absolute file name.
2521 On Unix, this is a name starting with a `/' or a `~'. */)
2522 (Lisp_Object filename)
2524 CHECK_STRING (filename);
2525 return file_name_absolute_p (SSDATA (filename)) ? Qt : Qnil;
2528 /* Return true if FILENAME exists. */
2529 bool
2530 check_existing (const char *filename)
2532 #ifdef DOS_NT
2533 /* The full emulation of Posix 'stat' is too expensive on
2534 DOS/Windows, when all we want to know is whether the file exists.
2535 So we use 'access' instead, which is much more lightweight. */
2536 return (access (filename, F_OK) >= 0);
2537 #else
2538 struct stat st;
2539 return (stat (filename, &st) >= 0);
2540 #endif
2543 /* Return true if file FILENAME exists and can be executed. */
2545 static bool
2546 check_executable (char *filename)
2548 #ifdef DOS_NT
2549 struct stat st;
2550 if (stat (filename, &st) < 0)
2551 return 0;
2552 return ((st.st_mode & S_IEXEC) != 0);
2553 #else /* not DOS_NT */
2554 #ifdef HAVE_EUIDACCESS
2555 return (euidaccess (filename, 1) >= 0);
2556 #else
2557 /* Access isn't quite right because it uses the real uid
2558 and we really want to test with the effective uid.
2559 But Unix doesn't give us a right way to do it. */
2560 return (access (filename, 1) >= 0);
2561 #endif
2562 #endif /* not DOS_NT */
2565 /* Return true if file FILENAME exists and can be written. */
2567 static bool
2568 check_writable (const char *filename)
2570 #ifdef MSDOS
2571 struct stat st;
2572 if (stat (filename, &st) < 0)
2573 return 0;
2574 return (st.st_mode & S_IWRITE || S_ISDIR (st.st_mode));
2575 #else /* not MSDOS */
2576 #ifdef HAVE_EUIDACCESS
2577 bool res = (euidaccess (filename, 2) >= 0);
2578 #ifdef CYGWIN
2579 /* euidaccess may have returned failure because Cygwin couldn't
2580 determine the file's UID or GID; if so, we return success. */
2581 if (!res)
2583 struct stat st;
2584 if (stat (filename, &st) < 0)
2585 return 0;
2586 res = (st.st_uid == -1 || st.st_gid == -1);
2588 #endif /* CYGWIN */
2589 return res;
2590 #else /* not HAVE_EUIDACCESS */
2591 /* Access isn't quite right because it uses the real uid
2592 and we really want to test with the effective uid.
2593 But Unix doesn't give us a right way to do it.
2594 Opening with O_WRONLY could work for an ordinary file,
2595 but would lose for directories. */
2596 return (access (filename, 2) >= 0);
2597 #endif /* not HAVE_EUIDACCESS */
2598 #endif /* not MSDOS */
2601 DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
2602 doc: /* Return t if file FILENAME exists (whether or not you can read it.)
2603 See also `file-readable-p' and `file-attributes'.
2604 This returns nil for a symlink to a nonexistent file.
2605 Use `file-symlink-p' to test for such links. */)
2606 (Lisp_Object filename)
2608 Lisp_Object absname;
2609 Lisp_Object handler;
2611 CHECK_STRING (filename);
2612 absname = Fexpand_file_name (filename, Qnil);
2614 /* If the file name has special constructs in it,
2615 call the corresponding file handler. */
2616 handler = Ffind_file_name_handler (absname, Qfile_exists_p);
2617 if (!NILP (handler))
2618 return call2 (handler, Qfile_exists_p, absname);
2620 absname = ENCODE_FILE (absname);
2622 return (check_existing (SSDATA (absname))) ? Qt : Qnil;
2625 DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0,
2626 doc: /* Return t if FILENAME can be executed by you.
2627 For a directory, this means you can access files in that directory. */)
2628 (Lisp_Object filename)
2630 Lisp_Object absname;
2631 Lisp_Object handler;
2633 CHECK_STRING (filename);
2634 absname = Fexpand_file_name (filename, Qnil);
2636 /* If the file name has special constructs in it,
2637 call the corresponding file handler. */
2638 handler = Ffind_file_name_handler (absname, Qfile_executable_p);
2639 if (!NILP (handler))
2640 return call2 (handler, Qfile_executable_p, absname);
2642 absname = ENCODE_FILE (absname);
2644 return (check_executable (SSDATA (absname)) ? Qt : Qnil);
2647 DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0,
2648 doc: /* Return t if file FILENAME exists and you can read it.
2649 See also `file-exists-p' and `file-attributes'. */)
2650 (Lisp_Object filename)
2652 Lisp_Object absname;
2653 Lisp_Object handler;
2654 int desc;
2655 int flags;
2656 struct stat statbuf;
2658 CHECK_STRING (filename);
2659 absname = Fexpand_file_name (filename, Qnil);
2661 /* If the file name has special constructs in it,
2662 call the corresponding file handler. */
2663 handler = Ffind_file_name_handler (absname, Qfile_readable_p);
2664 if (!NILP (handler))
2665 return call2 (handler, Qfile_readable_p, absname);
2667 absname = ENCODE_FILE (absname);
2669 #if defined (DOS_NT) || defined (macintosh)
2670 /* Under MS-DOS, Windows, and Macintosh, open does not work for
2671 directories. */
2672 if (access (SDATA (absname), 0) == 0)
2673 return Qt;
2674 return Qnil;
2675 #else /* not DOS_NT and not macintosh */
2676 flags = O_RDONLY;
2677 #ifdef O_NONBLOCK
2678 /* Opening a fifo without O_NONBLOCK can wait.
2679 We don't want to wait. But we don't want to mess wth O_NONBLOCK
2680 except in the case of a fifo, on a system which handles it. */
2681 desc = stat (SSDATA (absname), &statbuf);
2682 if (desc < 0)
2683 return Qnil;
2684 if (S_ISFIFO (statbuf.st_mode))
2685 flags |= O_NONBLOCK;
2686 #endif
2687 desc = emacs_open (SSDATA (absname), flags, 0);
2688 if (desc < 0)
2689 return Qnil;
2690 emacs_close (desc);
2691 return Qt;
2692 #endif /* not DOS_NT and not macintosh */
2695 /* Having this before file-symlink-p mysteriously caused it to be forgotten
2696 on the RT/PC. */
2697 DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
2698 doc: /* Return t if file FILENAME can be written or created by you. */)
2699 (Lisp_Object filename)
2701 Lisp_Object absname, dir, encoded;
2702 Lisp_Object handler;
2704 CHECK_STRING (filename);
2705 absname = Fexpand_file_name (filename, Qnil);
2707 /* If the file name has special constructs in it,
2708 call the corresponding file handler. */
2709 handler = Ffind_file_name_handler (absname, Qfile_writable_p);
2710 if (!NILP (handler))
2711 return call2 (handler, Qfile_writable_p, absname);
2713 encoded = ENCODE_FILE (absname);
2714 if (check_existing (SSDATA (encoded)))
2715 return (check_writable (SSDATA (encoded))
2716 ? Qt : Qnil);
2718 dir = Ffile_name_directory (absname);
2719 #ifdef MSDOS
2720 if (!NILP (dir))
2721 dir = Fdirectory_file_name (dir);
2722 #endif /* MSDOS */
2724 dir = ENCODE_FILE (dir);
2725 #ifdef WINDOWSNT
2726 /* The read-only attribute of the parent directory doesn't affect
2727 whether a file or directory can be created within it. Some day we
2728 should check ACLs though, which do affect this. */
2729 return (access (SDATA (dir), D_OK) < 0) ? Qnil : Qt;
2730 #else
2731 return (check_writable (!NILP (dir) ? SSDATA (dir) : "")
2732 ? Qt : Qnil);
2733 #endif
2736 DEFUN ("access-file", Faccess_file, Saccess_file, 2, 2, 0,
2737 doc: /* Access file FILENAME, and get an error if that does not work.
2738 The second argument STRING is used in the error message.
2739 If there is no error, returns nil. */)
2740 (Lisp_Object filename, Lisp_Object string)
2742 Lisp_Object handler, encoded_filename, absname;
2743 int fd;
2745 CHECK_STRING (filename);
2746 absname = Fexpand_file_name (filename, Qnil);
2748 CHECK_STRING (string);
2750 /* If the file name has special constructs in it,
2751 call the corresponding file handler. */
2752 handler = Ffind_file_name_handler (absname, Qaccess_file);
2753 if (!NILP (handler))
2754 return call3 (handler, Qaccess_file, absname, string);
2756 encoded_filename = ENCODE_FILE (absname);
2758 fd = emacs_open (SSDATA (encoded_filename), O_RDONLY, 0);
2759 if (fd < 0)
2760 report_file_error (SSDATA (string), Fcons (filename, Qnil));
2761 emacs_close (fd);
2763 return Qnil;
2766 DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0,
2767 doc: /* Return non-nil if file FILENAME is the name of a symbolic link.
2768 The value is the link target, as a string.
2769 Otherwise it returns nil.
2771 This function returns t when given the name of a symlink that
2772 points to a nonexistent file. */)
2773 (Lisp_Object filename)
2775 Lisp_Object handler;
2776 char *buf;
2777 Lisp_Object val;
2778 char readlink_buf[READLINK_BUFSIZE];
2780 CHECK_STRING (filename);
2781 filename = Fexpand_file_name (filename, Qnil);
2783 /* If the file name has special constructs in it,
2784 call the corresponding file handler. */
2785 handler = Ffind_file_name_handler (filename, Qfile_symlink_p);
2786 if (!NILP (handler))
2787 return call2 (handler, Qfile_symlink_p, filename);
2789 filename = ENCODE_FILE (filename);
2791 buf = emacs_readlink (SSDATA (filename), readlink_buf);
2792 if (! buf)
2793 return Qnil;
2795 val = build_string (buf);
2796 if (buf[0] == '/' && strchr (buf, ':'))
2797 val = concat2 (build_string ("/:"), val);
2798 if (buf != readlink_buf)
2799 xfree (buf);
2800 val = DECODE_FILE (val);
2801 return val;
2804 DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0,
2805 doc: /* Return t if FILENAME names an existing directory.
2806 Symbolic links to directories count as directories.
2807 See `file-symlink-p' to distinguish symlinks. */)
2808 (Lisp_Object filename)
2810 register Lisp_Object absname;
2811 struct stat st;
2812 Lisp_Object handler;
2814 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2816 /* If the file name has special constructs in it,
2817 call the corresponding file handler. */
2818 handler = Ffind_file_name_handler (absname, Qfile_directory_p);
2819 if (!NILP (handler))
2820 return call2 (handler, Qfile_directory_p, absname);
2822 absname = ENCODE_FILE (absname);
2824 if (stat (SSDATA (absname), &st) < 0)
2825 return Qnil;
2826 return S_ISDIR (st.st_mode) ? Qt : Qnil;
2829 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p,
2830 Sfile_accessible_directory_p, 1, 1, 0,
2831 doc: /* Return t if file FILENAME names a directory you can open.
2832 For the value to be t, FILENAME must specify the name of a directory as a file,
2833 and the directory must allow you to open files in it. In order to use a
2834 directory as a buffer's current directory, this predicate must return true.
2835 A directory name spec may be given instead; then the value is t
2836 if the directory so specified exists and really is a readable and
2837 searchable directory. */)
2838 (Lisp_Object filename)
2840 Lisp_Object handler;
2841 bool tem;
2842 struct gcpro gcpro1;
2844 /* If the file name has special constructs in it,
2845 call the corresponding file handler. */
2846 handler = Ffind_file_name_handler (filename, Qfile_accessible_directory_p);
2847 if (!NILP (handler))
2848 return call2 (handler, Qfile_accessible_directory_p, filename);
2850 GCPRO1 (filename);
2851 tem = (NILP (Ffile_directory_p (filename))
2852 || NILP (Ffile_executable_p (filename)));
2853 UNGCPRO;
2854 return tem ? Qnil : Qt;
2857 DEFUN ("file-regular-p", Ffile_regular_p, Sfile_regular_p, 1, 1, 0,
2858 doc: /* Return t if FILENAME names a regular file.
2859 This is the sort of file that holds an ordinary stream of data bytes.
2860 Symbolic links to regular files count as regular files.
2861 See `file-symlink-p' to distinguish symlinks. */)
2862 (Lisp_Object filename)
2864 register Lisp_Object absname;
2865 struct stat st;
2866 Lisp_Object handler;
2868 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2870 /* If the file name has special constructs in it,
2871 call the corresponding file handler. */
2872 handler = Ffind_file_name_handler (absname, Qfile_regular_p);
2873 if (!NILP (handler))
2874 return call2 (handler, Qfile_regular_p, absname);
2876 absname = ENCODE_FILE (absname);
2878 #ifdef WINDOWSNT
2880 int result;
2881 Lisp_Object tem = Vw32_get_true_file_attributes;
2883 /* Tell stat to use expensive method to get accurate info. */
2884 Vw32_get_true_file_attributes = Qt;
2885 result = stat (SDATA (absname), &st);
2886 Vw32_get_true_file_attributes = tem;
2888 if (result < 0)
2889 return Qnil;
2890 return S_ISREG (st.st_mode) ? Qt : Qnil;
2892 #else
2893 if (stat (SSDATA (absname), &st) < 0)
2894 return Qnil;
2895 return S_ISREG (st.st_mode) ? Qt : Qnil;
2896 #endif
2899 DEFUN ("file-selinux-context", Ffile_selinux_context,
2900 Sfile_selinux_context, 1, 1, 0,
2901 doc: /* Return SELinux context of file named FILENAME.
2902 The return value is a list (USER ROLE TYPE RANGE), where the list
2903 elements are strings naming the user, role, type, and range of the
2904 file's SELinux security context.
2906 Return (nil nil nil nil) if the file is nonexistent or inaccessible,
2907 or if SELinux is disabled, or if Emacs lacks SELinux support. */)
2908 (Lisp_Object filename)
2910 Lisp_Object absname;
2911 Lisp_Object values[4];
2912 Lisp_Object handler;
2913 #if HAVE_LIBSELINUX
2914 security_context_t con;
2915 int conlength;
2916 context_t context;
2917 #endif
2919 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
2921 /* If the file name has special constructs in it,
2922 call the corresponding file handler. */
2923 handler = Ffind_file_name_handler (absname, Qfile_selinux_context);
2924 if (!NILP (handler))
2925 return call2 (handler, Qfile_selinux_context, absname);
2927 absname = ENCODE_FILE (absname);
2929 values[0] = Qnil;
2930 values[1] = Qnil;
2931 values[2] = Qnil;
2932 values[3] = Qnil;
2933 #if HAVE_LIBSELINUX
2934 if (is_selinux_enabled ())
2936 conlength = lgetfilecon (SSDATA (absname), &con);
2937 if (conlength > 0)
2939 context = context_new (con);
2940 if (context_user_get (context))
2941 values[0] = build_string (context_user_get (context));
2942 if (context_role_get (context))
2943 values[1] = build_string (context_role_get (context));
2944 if (context_type_get (context))
2945 values[2] = build_string (context_type_get (context));
2946 if (context_range_get (context))
2947 values[3] = build_string (context_range_get (context));
2948 context_free (context);
2949 freecon (con);
2952 #endif
2954 return Flist (sizeof (values) / sizeof (values[0]), values);
2957 DEFUN ("set-file-selinux-context", Fset_file_selinux_context,
2958 Sset_file_selinux_context, 2, 2, 0,
2959 doc: /* Set SELinux context of file named FILENAME to CONTEXT.
2960 CONTEXT should be a list (USER ROLE TYPE RANGE), where the list
2961 elements are strings naming the components of a SELinux context.
2963 This function does nothing if SELinux is disabled, or if Emacs was not
2964 compiled with SELinux support. */)
2965 (Lisp_Object filename, Lisp_Object context)
2967 Lisp_Object absname;
2968 Lisp_Object handler;
2969 #if HAVE_LIBSELINUX
2970 Lisp_Object encoded_absname;
2971 Lisp_Object user = CAR_SAFE (context);
2972 Lisp_Object role = CAR_SAFE (CDR_SAFE (context));
2973 Lisp_Object type = CAR_SAFE (CDR_SAFE (CDR_SAFE (context)));
2974 Lisp_Object range = CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (context))));
2975 security_context_t con;
2976 bool fail;
2977 int conlength;
2978 context_t parsed_con;
2979 #endif
2981 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
2983 /* If the file name has special constructs in it,
2984 call the corresponding file handler. */
2985 handler = Ffind_file_name_handler (absname, Qset_file_selinux_context);
2986 if (!NILP (handler))
2987 return call3 (handler, Qset_file_selinux_context, absname, context);
2989 #if HAVE_LIBSELINUX
2990 if (is_selinux_enabled ())
2992 /* Get current file context. */
2993 encoded_absname = ENCODE_FILE (absname);
2994 conlength = lgetfilecon (SSDATA (encoded_absname), &con);
2995 if (conlength > 0)
2997 parsed_con = context_new (con);
2998 /* Change the parts defined in the parameter.*/
2999 if (STRINGP (user))
3001 if (context_user_set (parsed_con, SSDATA (user)))
3002 error ("Doing context_user_set");
3004 if (STRINGP (role))
3006 if (context_role_set (parsed_con, SSDATA (role)))
3007 error ("Doing context_role_set");
3009 if (STRINGP (type))
3011 if (context_type_set (parsed_con, SSDATA (type)))
3012 error ("Doing context_type_set");
3014 if (STRINGP (range))
3016 if (context_range_set (parsed_con, SSDATA (range)))
3017 error ("Doing context_range_set");
3020 /* Set the modified context back to the file. */
3021 fail = (lsetfilecon (SSDATA (encoded_absname),
3022 context_str (parsed_con))
3023 != 0);
3024 /* See http://debbugs.gnu.org/11245 for ENOTSUP. */
3025 if (fail && errno != ENOTSUP)
3026 report_file_error ("Doing lsetfilecon", Fcons (absname, Qnil));
3028 context_free (parsed_con);
3029 freecon (con);
3031 else
3032 report_file_error ("Doing lgetfilecon", Fcons (absname, Qnil));
3034 #endif
3036 return Qnil;
3039 DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
3040 doc: /* Return mode bits of file named FILENAME, as an integer.
3041 Return nil, if file does not exist or is not accessible. */)
3042 (Lisp_Object filename)
3044 Lisp_Object absname;
3045 struct stat st;
3046 Lisp_Object handler;
3048 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
3050 /* If the file name has special constructs in it,
3051 call the corresponding file handler. */
3052 handler = Ffind_file_name_handler (absname, Qfile_modes);
3053 if (!NILP (handler))
3054 return call2 (handler, Qfile_modes, absname);
3056 absname = ENCODE_FILE (absname);
3058 if (stat (SSDATA (absname), &st) < 0)
3059 return Qnil;
3061 return make_number (st.st_mode & 07777);
3064 DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2,
3065 "(let ((file (read-file-name \"File: \"))) \
3066 (list file (read-file-modes nil file)))",
3067 doc: /* Set mode bits of file named FILENAME to MODE (an integer).
3068 Only the 12 low bits of MODE are used.
3070 Interactively, mode bits are read by `read-file-modes', which accepts
3071 symbolic notation, like the `chmod' command from GNU Coreutils. */)
3072 (Lisp_Object filename, Lisp_Object mode)
3074 Lisp_Object absname, encoded_absname;
3075 Lisp_Object handler;
3077 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
3078 CHECK_NUMBER (mode);
3080 /* If the file name has special constructs in it,
3081 call the corresponding file handler. */
3082 handler = Ffind_file_name_handler (absname, Qset_file_modes);
3083 if (!NILP (handler))
3084 return call3 (handler, Qset_file_modes, absname, mode);
3086 encoded_absname = ENCODE_FILE (absname);
3088 if (chmod (SSDATA (encoded_absname), XINT (mode) & 07777) < 0)
3089 report_file_error ("Doing chmod", Fcons (absname, Qnil));
3091 return Qnil;
3094 DEFUN ("set-default-file-modes", Fset_default_file_modes, Sset_default_file_modes, 1, 1, 0,
3095 doc: /* Set the file permission bits for newly created files.
3096 The argument MODE should be an integer; only the low 9 bits are used.
3097 This setting is inherited by subprocesses. */)
3098 (Lisp_Object mode)
3100 CHECK_NUMBER (mode);
3102 umask ((~ XINT (mode)) & 0777);
3104 return Qnil;
3107 DEFUN ("default-file-modes", Fdefault_file_modes, Sdefault_file_modes, 0, 0, 0,
3108 doc: /* Return the default file protection for created files.
3109 The value is an integer. */)
3110 (void)
3112 mode_t realmask;
3113 Lisp_Object value;
3115 block_input ();
3116 realmask = umask (0);
3117 umask (realmask);
3118 unblock_input ();
3120 XSETINT (value, (~ realmask) & 0777);
3121 return value;
3125 DEFUN ("set-file-times", Fset_file_times, Sset_file_times, 1, 2, 0,
3126 doc: /* Set times of file FILENAME to TIMESTAMP.
3127 Set both access and modification times.
3128 Return t on success, else nil.
3129 Use the current time if TIMESTAMP is nil. TIMESTAMP is in the format of
3130 `current-time'. */)
3131 (Lisp_Object filename, Lisp_Object timestamp)
3133 Lisp_Object absname, encoded_absname;
3134 Lisp_Object handler;
3135 EMACS_TIME t = lisp_time_argument (timestamp);
3137 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
3139 /* If the file name has special constructs in it,
3140 call the corresponding file handler. */
3141 handler = Ffind_file_name_handler (absname, Qset_file_times);
3142 if (!NILP (handler))
3143 return call3 (handler, Qset_file_times, absname, timestamp);
3145 encoded_absname = ENCODE_FILE (absname);
3148 if (set_file_times (-1, SSDATA (encoded_absname), t, t))
3150 #ifdef MSDOS
3151 struct stat st;
3153 /* Setting times on a directory always fails. */
3154 if (stat (SSDATA (encoded_absname), &st) == 0 && S_ISDIR (st.st_mode))
3155 return Qnil;
3156 #endif
3157 report_file_error ("Setting file times", Fcons (absname, Qnil));
3158 return Qnil;
3162 return Qt;
3165 #ifdef HAVE_SYNC
3166 DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "",
3167 doc: /* Tell Unix to finish all pending disk updates. */)
3168 (void)
3170 sync ();
3171 return Qnil;
3174 #endif /* HAVE_SYNC */
3176 DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0,
3177 doc: /* Return t if file FILE1 is newer than file FILE2.
3178 If FILE1 does not exist, the answer is nil;
3179 otherwise, if FILE2 does not exist, the answer is t. */)
3180 (Lisp_Object file1, Lisp_Object file2)
3182 Lisp_Object absname1, absname2;
3183 struct stat st1, st2;
3184 Lisp_Object handler;
3185 struct gcpro gcpro1, gcpro2;
3187 CHECK_STRING (file1);
3188 CHECK_STRING (file2);
3190 absname1 = Qnil;
3191 GCPRO2 (absname1, file2);
3192 absname1 = expand_and_dir_to_file (file1, BVAR (current_buffer, directory));
3193 absname2 = expand_and_dir_to_file (file2, BVAR (current_buffer, directory));
3194 UNGCPRO;
3196 /* If the file name has special constructs in it,
3197 call the corresponding file handler. */
3198 handler = Ffind_file_name_handler (absname1, Qfile_newer_than_file_p);
3199 if (NILP (handler))
3200 handler = Ffind_file_name_handler (absname2, Qfile_newer_than_file_p);
3201 if (!NILP (handler))
3202 return call3 (handler, Qfile_newer_than_file_p, absname1, absname2);
3204 GCPRO2 (absname1, absname2);
3205 absname1 = ENCODE_FILE (absname1);
3206 absname2 = ENCODE_FILE (absname2);
3207 UNGCPRO;
3209 if (stat (SSDATA (absname1), &st1) < 0)
3210 return Qnil;
3212 if (stat (SSDATA (absname2), &st2) < 0)
3213 return Qt;
3215 return (EMACS_TIME_GT (get_stat_mtime (&st1), get_stat_mtime (&st2))
3216 ? Qt : Qnil);
3219 #ifndef READ_BUF_SIZE
3220 #define READ_BUF_SIZE (64 << 10)
3221 #endif
3222 /* Some buffer offsets are stored in 'int' variables. */
3223 verify (READ_BUF_SIZE <= INT_MAX);
3225 /* This function is called after Lisp functions to decide a coding
3226 system are called, or when they cause an error. Before they are
3227 called, the current buffer is set unibyte and it contains only a
3228 newly inserted text (thus the buffer was empty before the
3229 insertion).
3231 The functions may set markers, overlays, text properties, or even
3232 alter the buffer contents, change the current buffer.
3234 Here, we reset all those changes by:
3235 o set back the current buffer.
3236 o move all markers and overlays to BEG.
3237 o remove all text properties.
3238 o set back the buffer multibyteness. */
3240 static Lisp_Object
3241 decide_coding_unwind (Lisp_Object unwind_data)
3243 Lisp_Object multibyte, undo_list, buffer;
3245 multibyte = XCAR (unwind_data);
3246 unwind_data = XCDR (unwind_data);
3247 undo_list = XCAR (unwind_data);
3248 buffer = XCDR (unwind_data);
3250 set_buffer_internal (XBUFFER (buffer));
3251 adjust_markers_for_delete (BEG, BEG_BYTE, Z, Z_BYTE);
3252 adjust_overlays_for_delete (BEG, Z - BEG);
3253 set_buffer_intervals (current_buffer, NULL);
3254 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3256 /* Now we are safe to change the buffer's multibyteness directly. */
3257 bset_enable_multibyte_characters (current_buffer, multibyte);
3258 bset_undo_list (current_buffer, undo_list);
3260 return Qnil;
3264 /* Used to pass values from insert-file-contents to read_non_regular. */
3266 static int non_regular_fd;
3267 static ptrdiff_t non_regular_inserted;
3268 static int non_regular_nbytes;
3271 /* Read from a non-regular file.
3272 Read non_regular_nbytes bytes max from non_regular_fd.
3273 Non_regular_inserted specifies where to put the read bytes.
3274 Value is the number of bytes read. */
3276 static Lisp_Object
3277 read_non_regular (Lisp_Object ignore)
3279 int nbytes;
3281 immediate_quit = 1;
3282 QUIT;
3283 nbytes = emacs_read (non_regular_fd,
3284 ((char *) BEG_ADDR + PT_BYTE - BEG_BYTE
3285 + non_regular_inserted),
3286 non_regular_nbytes);
3287 immediate_quit = 0;
3288 return make_number (nbytes);
3292 /* Condition-case handler used when reading from non-regular files
3293 in insert-file-contents. */
3295 static Lisp_Object
3296 read_non_regular_quit (Lisp_Object ignore)
3298 return Qnil;
3301 /* Reposition FD to OFFSET, based on WHENCE. This acts like lseek
3302 except that it also tests for OFFSET being out of lseek's range. */
3303 static off_t
3304 emacs_lseek (int fd, EMACS_INT offset, int whence)
3306 /* Use "&" rather than "&&" to suppress a bogus GCC warning; see
3307 <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772>. */
3308 if (! ((offset >= TYPE_MINIMUM (off_t)) & (offset <= TYPE_MAXIMUM (off_t))))
3310 errno = EINVAL;
3311 return -1;
3313 return lseek (fd, offset, whence);
3316 /* Return a special time value indicating the error number ERRNUM. */
3317 static EMACS_TIME
3318 time_error_value (int errnum)
3320 int ns = (errnum == ENOENT || errnum == EACCES || errnum == ENOTDIR
3321 ? NONEXISTENT_MODTIME_NSECS
3322 : UNKNOWN_MODTIME_NSECS);
3323 return make_emacs_time (0, ns);
3326 DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
3327 1, 5, 0,
3328 doc: /* Insert contents of file FILENAME after point.
3329 Returns list of absolute file name and number of characters inserted.
3330 If second argument VISIT is non-nil, the buffer's visited filename and
3331 last save file modtime are set, and it is marked unmodified. If
3332 visiting and the file does not exist, visiting is completed before the
3333 error is signaled.
3335 The optional third and fourth arguments BEG and END specify what portion
3336 of the file to insert. These arguments count bytes in the file, not
3337 characters in the buffer. If VISIT is non-nil, BEG and END must be nil.
3339 If optional fifth argument REPLACE is non-nil, replace the current
3340 buffer contents (in the accessible portion) with the file contents.
3341 This is better than simply deleting and inserting the whole thing
3342 because (1) it preserves some marker positions and (2) it puts less data
3343 in the undo list. When REPLACE is non-nil, the second return value is
3344 the number of characters that replace previous buffer contents.
3346 This function does code conversion according to the value of
3347 `coding-system-for-read' or `file-coding-system-alist', and sets the
3348 variable `last-coding-system-used' to the coding system actually used.
3350 In addition, this function decodes the inserted text from known formats
3351 by calling `format-decode', which see. */)
3352 (Lisp_Object filename, Lisp_Object visit, Lisp_Object beg, Lisp_Object end, Lisp_Object replace)
3354 struct stat st;
3355 int file_status;
3356 EMACS_TIME mtime;
3357 int fd;
3358 ptrdiff_t inserted = 0;
3359 bool nochange = 0;
3360 ptrdiff_t how_much;
3361 off_t beg_offset, end_offset;
3362 int unprocessed;
3363 ptrdiff_t count = SPECPDL_INDEX ();
3364 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3365 Lisp_Object handler, val, insval, orig_filename, old_undo;
3366 Lisp_Object p;
3367 ptrdiff_t total = 0;
3368 bool not_regular = 0;
3369 int save_errno = 0;
3370 char read_buf[READ_BUF_SIZE];
3371 struct coding_system coding;
3372 char buffer[1 << 14];
3373 bool replace_handled = 0;
3374 bool set_coding_system = 0;
3375 Lisp_Object coding_system;
3376 bool read_quit = 0;
3377 Lisp_Object old_Vdeactivate_mark = Vdeactivate_mark;
3378 bool we_locked_file = 0;
3379 bool deferred_remove_unwind_protect = 0;
3381 if (current_buffer->base_buffer && ! NILP (visit))
3382 error ("Cannot do file visiting in an indirect buffer");
3384 if (!NILP (BVAR (current_buffer, read_only)))
3385 Fbarf_if_buffer_read_only ();
3387 val = Qnil;
3388 p = Qnil;
3389 orig_filename = Qnil;
3390 old_undo = Qnil;
3392 GCPRO5 (filename, val, p, orig_filename, old_undo);
3394 CHECK_STRING (filename);
3395 filename = Fexpand_file_name (filename, Qnil);
3397 /* The value Qnil means that the coding system is not yet
3398 decided. */
3399 coding_system = Qnil;
3401 /* If the file name has special constructs in it,
3402 call the corresponding file handler. */
3403 handler = Ffind_file_name_handler (filename, Qinsert_file_contents);
3404 if (!NILP (handler))
3406 val = call6 (handler, Qinsert_file_contents, filename,
3407 visit, beg, end, replace);
3408 if (CONSP (val) && CONSP (XCDR (val))
3409 && RANGED_INTEGERP (0, XCAR (XCDR (val)), ZV - PT))
3410 inserted = XINT (XCAR (XCDR (val)));
3411 goto handled;
3414 orig_filename = filename;
3415 filename = ENCODE_FILE (filename);
3417 fd = -1;
3419 #ifdef WINDOWSNT
3421 Lisp_Object tem = Vw32_get_true_file_attributes;
3423 /* Tell stat to use expensive method to get accurate info. */
3424 Vw32_get_true_file_attributes = Qt;
3425 file_status = stat (SSDATA (filename), &st);
3426 Vw32_get_true_file_attributes = tem;
3428 #else
3429 file_status = stat (SSDATA (filename), &st);
3430 #endif /* WINDOWSNT */
3432 if (file_status == 0)
3433 mtime = get_stat_mtime (&st);
3434 else
3436 badopen:
3437 save_errno = errno;
3438 if (NILP (visit))
3439 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
3440 mtime = time_error_value (save_errno);
3441 st.st_size = -1;
3442 how_much = 0;
3443 if (!NILP (Vcoding_system_for_read))
3444 Fset (Qbuffer_file_coding_system, Vcoding_system_for_read);
3445 goto notfound;
3448 /* This code will need to be changed in order to work on named
3449 pipes, and it's probably just not worth it. So we should at
3450 least signal an error. */
3451 if (!S_ISREG (st.st_mode))
3453 not_regular = 1;
3455 if (! NILP (visit))
3456 goto notfound;
3458 if (! NILP (replace) || ! NILP (beg) || ! NILP (end))
3459 xsignal2 (Qfile_error,
3460 build_string ("not a regular file"), orig_filename);
3463 if (fd < 0)
3464 if ((fd = emacs_open (SSDATA (filename), O_RDONLY, 0)) < 0)
3465 goto badopen;
3467 /* Replacement should preserve point as it preserves markers. */
3468 if (!NILP (replace))
3469 record_unwind_protect (restore_point_unwind, Fpoint_marker ());
3471 record_unwind_protect (close_file_unwind, make_number (fd));
3474 if (!NILP (visit))
3476 if (!NILP (beg) || !NILP (end))
3477 error ("Attempt to visit less than an entire file");
3478 if (BEG < Z && NILP (replace))
3479 error ("Cannot do file visiting in a non-empty buffer");
3482 if (!NILP (beg))
3484 if (! RANGED_INTEGERP (0, beg, TYPE_MAXIMUM (off_t)))
3485 wrong_type_argument (intern ("file-offset"), beg);
3486 beg_offset = XFASTINT (beg);
3488 else
3489 beg_offset = 0;
3491 if (!NILP (end))
3493 if (! RANGED_INTEGERP (0, end, TYPE_MAXIMUM (off_t)))
3494 wrong_type_argument (intern ("file-offset"), end);
3495 end_offset = XFASTINT (end);
3497 else
3499 if (not_regular)
3500 end_offset = TYPE_MAXIMUM (off_t);
3501 else
3503 end_offset = st.st_size;
3505 /* A negative size can happen on a platform that allows file
3506 sizes greater than the maximum off_t value. */
3507 if (end_offset < 0)
3508 buffer_overflow ();
3510 /* The file size returned from stat may be zero, but data
3511 may be readable nonetheless, for example when this is a
3512 file in the /proc filesystem. */
3513 if (end_offset == 0)
3514 end_offset = READ_BUF_SIZE;
3518 /* Check now whether the buffer will become too large,
3519 in the likely case where the file's length is not changing.
3520 This saves a lot of needless work before a buffer overflow. */
3521 if (! not_regular)
3523 /* The likely offset where we will stop reading. We could read
3524 more (or less), if the file grows (or shrinks) as we read it. */
3525 off_t likely_end = min (end_offset, st.st_size);
3527 if (beg_offset < likely_end)
3529 ptrdiff_t buf_bytes
3530 = Z_BYTE - (!NILP (replace) ? ZV_BYTE - BEGV_BYTE : 0);
3531 ptrdiff_t buf_growth_max = BUF_BYTES_MAX - buf_bytes;
3532 off_t likely_growth = likely_end - beg_offset;
3533 if (buf_growth_max < likely_growth)
3534 buffer_overflow ();
3538 /* Prevent redisplay optimizations. */
3539 current_buffer->clip_changed = 1;
3541 if (EQ (Vcoding_system_for_read, Qauto_save_coding))
3543 coding_system = coding_inherit_eol_type (Qutf_8_emacs, Qunix);
3544 setup_coding_system (coding_system, &coding);
3545 /* Ensure we set Vlast_coding_system_used. */
3546 set_coding_system = 1;
3548 else if (BEG < Z)
3550 /* Decide the coding system to use for reading the file now
3551 because we can't use an optimized method for handling
3552 `coding:' tag if the current buffer is not empty. */
3553 if (!NILP (Vcoding_system_for_read))
3554 coding_system = Vcoding_system_for_read;
3555 else
3557 /* Don't try looking inside a file for a coding system
3558 specification if it is not seekable. */
3559 if (! not_regular && ! NILP (Vset_auto_coding_function))
3561 /* Find a coding system specified in the heading two
3562 lines or in the tailing several lines of the file.
3563 We assume that the 1K-byte and 3K-byte for heading
3564 and tailing respectively are sufficient for this
3565 purpose. */
3566 int nread;
3568 if (st.st_size <= (1024 * 4))
3569 nread = emacs_read (fd, read_buf, 1024 * 4);
3570 else
3572 nread = emacs_read (fd, read_buf, 1024);
3573 if (nread >= 0)
3575 if (lseek (fd, st.st_size - (1024 * 3), SEEK_SET) < 0)
3576 report_file_error ("Setting file position",
3577 Fcons (orig_filename, Qnil));
3578 nread += emacs_read (fd, read_buf + nread, 1024 * 3);
3582 if (nread < 0)
3583 error ("IO error reading %s: %s",
3584 SDATA (orig_filename), emacs_strerror (errno));
3585 else if (nread > 0)
3587 struct buffer *prev = current_buffer;
3588 Lisp_Object workbuf;
3589 struct buffer *buf;
3591 record_unwind_current_buffer ();
3593 workbuf = Fget_buffer_create (build_string (" *code-converting-work*"));
3594 buf = XBUFFER (workbuf);
3596 delete_all_overlays (buf);
3597 bset_directory (buf, BVAR (current_buffer, directory));
3598 bset_read_only (buf, Qnil);
3599 bset_filename (buf, Qnil);
3600 bset_undo_list (buf, Qt);
3601 eassert (buf->overlays_before == NULL);
3602 eassert (buf->overlays_after == NULL);
3604 set_buffer_internal (buf);
3605 Ferase_buffer ();
3606 bset_enable_multibyte_characters (buf, Qnil);
3608 insert_1_both ((char *) read_buf, nread, nread, 0, 0, 0);
3609 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3610 coding_system = call2 (Vset_auto_coding_function,
3611 filename, make_number (nread));
3612 set_buffer_internal (prev);
3614 /* Discard the unwind protect for recovering the
3615 current buffer. */
3616 specpdl_ptr--;
3618 /* Rewind the file for the actual read done later. */
3619 if (lseek (fd, 0, SEEK_SET) < 0)
3620 report_file_error ("Setting file position",
3621 Fcons (orig_filename, Qnil));
3625 if (NILP (coding_system))
3627 /* If we have not yet decided a coding system, check
3628 file-coding-system-alist. */
3629 Lisp_Object args[6];
3631 args[0] = Qinsert_file_contents, args[1] = orig_filename;
3632 args[2] = visit, args[3] = beg, args[4] = end, args[5] = replace;
3633 coding_system = Ffind_operation_coding_system (6, args);
3634 if (CONSP (coding_system))
3635 coding_system = XCAR (coding_system);
3639 if (NILP (coding_system))
3640 coding_system = Qundecided;
3641 else
3642 CHECK_CODING_SYSTEM (coding_system);
3644 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
3645 /* We must suppress all character code conversion except for
3646 end-of-line conversion. */
3647 coding_system = raw_text_coding_system (coding_system);
3649 setup_coding_system (coding_system, &coding);
3650 /* Ensure we set Vlast_coding_system_used. */
3651 set_coding_system = 1;
3654 /* If requested, replace the accessible part of the buffer
3655 with the file contents. Avoid replacing text at the
3656 beginning or end of the buffer that matches the file contents;
3657 that preserves markers pointing to the unchanged parts.
3659 Here we implement this feature in an optimized way
3660 for the case where code conversion is NOT needed.
3661 The following if-statement handles the case of conversion
3662 in a less optimal way.
3664 If the code conversion is "automatic" then we try using this
3665 method and hope for the best.
3666 But if we discover the need for conversion, we give up on this method
3667 and let the following if-statement handle the replace job. */
3668 if (!NILP (replace)
3669 && BEGV < ZV
3670 && (NILP (coding_system)
3671 || ! CODING_REQUIRE_DECODING (&coding)))
3673 /* same_at_start and same_at_end count bytes,
3674 because file access counts bytes
3675 and BEG and END count bytes. */
3676 ptrdiff_t same_at_start = BEGV_BYTE;
3677 ptrdiff_t same_at_end = ZV_BYTE;
3678 ptrdiff_t overlap;
3679 /* There is still a possibility we will find the need to do code
3680 conversion. If that happens, set this variable to
3681 give up on handling REPLACE in the optimized way. */
3682 bool giveup_match_end = 0;
3684 if (beg_offset != 0)
3686 if (lseek (fd, beg_offset, SEEK_SET) < 0)
3687 report_file_error ("Setting file position",
3688 Fcons (orig_filename, Qnil));
3691 immediate_quit = 1;
3692 QUIT;
3693 /* Count how many chars at the start of the file
3694 match the text at the beginning of the buffer. */
3695 while (1)
3697 int nread, bufpos;
3699 nread = emacs_read (fd, buffer, sizeof buffer);
3700 if (nread < 0)
3701 error ("IO error reading %s: %s",
3702 SSDATA (orig_filename), emacs_strerror (errno));
3703 else if (nread == 0)
3704 break;
3706 if (CODING_REQUIRE_DETECTION (&coding))
3708 coding_system = detect_coding_system ((unsigned char *) buffer,
3709 nread, nread, 1, 0,
3710 coding_system);
3711 setup_coding_system (coding_system, &coding);
3714 if (CODING_REQUIRE_DECODING (&coding))
3715 /* We found that the file should be decoded somehow.
3716 Let's give up here. */
3718 giveup_match_end = 1;
3719 break;
3722 bufpos = 0;
3723 while (bufpos < nread && same_at_start < ZV_BYTE
3724 && FETCH_BYTE (same_at_start) == buffer[bufpos])
3725 same_at_start++, bufpos++;
3726 /* If we found a discrepancy, stop the scan.
3727 Otherwise loop around and scan the next bufferful. */
3728 if (bufpos != nread)
3729 break;
3731 immediate_quit = 0;
3732 /* If the file matches the buffer completely,
3733 there's no need to replace anything. */
3734 if (same_at_start - BEGV_BYTE == end_offset - beg_offset)
3736 emacs_close (fd);
3737 specpdl_ptr--;
3738 /* Truncate the buffer to the size of the file. */
3739 del_range_1 (same_at_start, same_at_end, 0, 0);
3740 goto handled;
3742 immediate_quit = 1;
3743 QUIT;
3744 /* Count how many chars at the end of the file
3745 match the text at the end of the buffer. But, if we have
3746 already found that decoding is necessary, don't waste time. */
3747 while (!giveup_match_end)
3749 int total_read, nread, bufpos, trial;
3750 off_t curpos;
3752 /* At what file position are we now scanning? */
3753 curpos = end_offset - (ZV_BYTE - same_at_end);
3754 /* If the entire file matches the buffer tail, stop the scan. */
3755 if (curpos == 0)
3756 break;
3757 /* How much can we scan in the next step? */
3758 trial = min (curpos, sizeof buffer);
3759 if (lseek (fd, curpos - trial, SEEK_SET) < 0)
3760 report_file_error ("Setting file position",
3761 Fcons (orig_filename, Qnil));
3763 total_read = nread = 0;
3764 while (total_read < trial)
3766 nread = emacs_read (fd, buffer + total_read, trial - total_read);
3767 if (nread < 0)
3768 error ("IO error reading %s: %s",
3769 SDATA (orig_filename), emacs_strerror (errno));
3770 else if (nread == 0)
3771 break;
3772 total_read += nread;
3775 /* Scan this bufferful from the end, comparing with
3776 the Emacs buffer. */
3777 bufpos = total_read;
3779 /* Compare with same_at_start to avoid counting some buffer text
3780 as matching both at the file's beginning and at the end. */
3781 while (bufpos > 0 && same_at_end > same_at_start
3782 && FETCH_BYTE (same_at_end - 1) == buffer[bufpos - 1])
3783 same_at_end--, bufpos--;
3785 /* If we found a discrepancy, stop the scan.
3786 Otherwise loop around and scan the preceding bufferful. */
3787 if (bufpos != 0)
3789 /* If this discrepancy is because of code conversion,
3790 we cannot use this method; giveup and try the other. */
3791 if (same_at_end > same_at_start
3792 && FETCH_BYTE (same_at_end - 1) >= 0200
3793 && ! NILP (BVAR (current_buffer, enable_multibyte_characters))
3794 && (CODING_MAY_REQUIRE_DECODING (&coding)))
3795 giveup_match_end = 1;
3796 break;
3799 if (nread == 0)
3800 break;
3802 immediate_quit = 0;
3804 if (! giveup_match_end)
3806 ptrdiff_t temp;
3808 /* We win! We can handle REPLACE the optimized way. */
3810 /* Extend the start of non-matching text area to multibyte
3811 character boundary. */
3812 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3813 while (same_at_start > BEGV_BYTE
3814 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
3815 same_at_start--;
3817 /* Extend the end of non-matching text area to multibyte
3818 character boundary. */
3819 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3820 while (same_at_end < ZV_BYTE
3821 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
3822 same_at_end++;
3824 /* Don't try to reuse the same piece of text twice. */
3825 overlap = (same_at_start - BEGV_BYTE
3826 - (same_at_end
3827 + (! NILP (end) ? end_offset : st.st_size) - ZV_BYTE));
3828 if (overlap > 0)
3829 same_at_end += overlap;
3831 /* Arrange to read only the nonmatching middle part of the file. */
3832 beg_offset += same_at_start - BEGV_BYTE;
3833 end_offset -= ZV_BYTE - same_at_end;
3835 del_range_byte (same_at_start, same_at_end, 0);
3836 /* Insert from the file at the proper position. */
3837 temp = BYTE_TO_CHAR (same_at_start);
3838 SET_PT_BOTH (temp, same_at_start);
3840 /* If display currently starts at beginning of line,
3841 keep it that way. */
3842 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
3843 XWINDOW (selected_window)->start_at_line_beg = !NILP (Fbolp ());
3845 replace_handled = 1;
3849 /* If requested, replace the accessible part of the buffer
3850 with the file contents. Avoid replacing text at the
3851 beginning or end of the buffer that matches the file contents;
3852 that preserves markers pointing to the unchanged parts.
3854 Here we implement this feature for the case where code conversion
3855 is needed, in a simple way that needs a lot of memory.
3856 The preceding if-statement handles the case of no conversion
3857 in a more optimized way. */
3858 if (!NILP (replace) && ! replace_handled && BEGV < ZV)
3860 ptrdiff_t same_at_start = BEGV_BYTE;
3861 ptrdiff_t same_at_end = ZV_BYTE;
3862 ptrdiff_t same_at_start_charpos;
3863 ptrdiff_t inserted_chars;
3864 ptrdiff_t overlap;
3865 ptrdiff_t bufpos;
3866 unsigned char *decoded;
3867 ptrdiff_t temp;
3868 ptrdiff_t this = 0;
3869 ptrdiff_t this_count = SPECPDL_INDEX ();
3870 bool multibyte
3871 = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
3872 Lisp_Object conversion_buffer;
3873 struct gcpro gcpro1;
3875 conversion_buffer = code_conversion_save (1, multibyte);
3877 /* First read the whole file, performing code conversion into
3878 CONVERSION_BUFFER. */
3880 if (lseek (fd, beg_offset, SEEK_SET) < 0)
3881 report_file_error ("Setting file position",
3882 Fcons (orig_filename, Qnil));
3884 total = st.st_size; /* Total bytes in the file. */
3885 how_much = 0; /* Bytes read from file so far. */
3886 inserted = 0; /* Bytes put into CONVERSION_BUFFER so far. */
3887 unprocessed = 0; /* Bytes not processed in previous loop. */
3889 GCPRO1 (conversion_buffer);
3890 while (how_much < total)
3892 /* We read one bunch by one (READ_BUF_SIZE bytes) to allow
3893 quitting while reading a huge while. */
3894 /* `try'' is reserved in some compilers (Microsoft C). */
3895 int trytry = min (total - how_much, READ_BUF_SIZE - unprocessed);
3897 /* Allow quitting out of the actual I/O. */
3898 immediate_quit = 1;
3899 QUIT;
3900 this = emacs_read (fd, read_buf + unprocessed, trytry);
3901 immediate_quit = 0;
3903 if (this <= 0)
3904 break;
3906 how_much += this;
3908 BUF_TEMP_SET_PT (XBUFFER (conversion_buffer),
3909 BUF_Z (XBUFFER (conversion_buffer)));
3910 decode_coding_c_string (&coding, (unsigned char *) read_buf,
3911 unprocessed + this, conversion_buffer);
3912 unprocessed = coding.carryover_bytes;
3913 if (coding.carryover_bytes > 0)
3914 memcpy (read_buf, coding.carryover, unprocessed);
3916 UNGCPRO;
3917 emacs_close (fd);
3919 /* We should remove the unwind_protect calling
3920 close_file_unwind, but other stuff has been added the stack,
3921 so defer the removal till we reach the `handled' label. */
3922 deferred_remove_unwind_protect = 1;
3924 /* At this point, HOW_MUCH should equal TOTAL, or should be <= 0
3925 if we couldn't read the file. */
3927 if (this < 0)
3928 error ("IO error reading %s: %s",
3929 SDATA (orig_filename), emacs_strerror (errno));
3931 if (unprocessed > 0)
3933 coding.mode |= CODING_MODE_LAST_BLOCK;
3934 decode_coding_c_string (&coding, (unsigned char *) read_buf,
3935 unprocessed, conversion_buffer);
3936 coding.mode &= ~CODING_MODE_LAST_BLOCK;
3939 coding_system = CODING_ID_NAME (coding.id);
3940 set_coding_system = 1;
3941 decoded = BUF_BEG_ADDR (XBUFFER (conversion_buffer));
3942 inserted = (BUF_Z_BYTE (XBUFFER (conversion_buffer))
3943 - BUF_BEG_BYTE (XBUFFER (conversion_buffer)));
3945 /* Compare the beginning of the converted string with the buffer
3946 text. */
3948 bufpos = 0;
3949 while (bufpos < inserted && same_at_start < same_at_end
3950 && FETCH_BYTE (same_at_start) == decoded[bufpos])
3951 same_at_start++, bufpos++;
3953 /* If the file matches the head of buffer completely,
3954 there's no need to replace anything. */
3956 if (bufpos == inserted)
3958 /* Truncate the buffer to the size of the file. */
3959 if (same_at_start == same_at_end)
3960 nochange = 1;
3961 else
3962 del_range_byte (same_at_start, same_at_end, 0);
3963 inserted = 0;
3965 unbind_to (this_count, Qnil);
3966 goto handled;
3969 /* Extend the start of non-matching text area to the previous
3970 multibyte character boundary. */
3971 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3972 while (same_at_start > BEGV_BYTE
3973 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
3974 same_at_start--;
3976 /* Scan this bufferful from the end, comparing with
3977 the Emacs buffer. */
3978 bufpos = inserted;
3980 /* Compare with same_at_start to avoid counting some buffer text
3981 as matching both at the file's beginning and at the end. */
3982 while (bufpos > 0 && same_at_end > same_at_start
3983 && FETCH_BYTE (same_at_end - 1) == decoded[bufpos - 1])
3984 same_at_end--, bufpos--;
3986 /* Extend the end of non-matching text area to the next
3987 multibyte character boundary. */
3988 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
3989 while (same_at_end < ZV_BYTE
3990 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
3991 same_at_end++;
3993 /* Don't try to reuse the same piece of text twice. */
3994 overlap = same_at_start - BEGV_BYTE - (same_at_end + inserted - ZV_BYTE);
3995 if (overlap > 0)
3996 same_at_end += overlap;
3998 /* If display currently starts at beginning of line,
3999 keep it that way. */
4000 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
4001 XWINDOW (selected_window)->start_at_line_beg = !NILP (Fbolp ());
4003 /* Replace the chars that we need to replace,
4004 and update INSERTED to equal the number of bytes
4005 we are taking from the decoded string. */
4006 inserted -= (ZV_BYTE - same_at_end) + (same_at_start - BEGV_BYTE);
4008 if (same_at_end != same_at_start)
4010 del_range_byte (same_at_start, same_at_end, 0);
4011 temp = GPT;
4012 same_at_start = GPT_BYTE;
4014 else
4016 temp = BYTE_TO_CHAR (same_at_start);
4018 /* Insert from the file at the proper position. */
4019 SET_PT_BOTH (temp, same_at_start);
4020 same_at_start_charpos
4021 = buf_bytepos_to_charpos (XBUFFER (conversion_buffer),
4022 same_at_start - BEGV_BYTE
4023 + BUF_BEG_BYTE (XBUFFER (conversion_buffer)));
4024 inserted_chars
4025 = (buf_bytepos_to_charpos (XBUFFER (conversion_buffer),
4026 same_at_start + inserted - BEGV_BYTE
4027 + BUF_BEG_BYTE (XBUFFER (conversion_buffer)))
4028 - same_at_start_charpos);
4029 /* This binding is to avoid ask-user-about-supersession-threat
4030 being called in insert_from_buffer (via in
4031 prepare_to_modify_buffer). */
4032 specbind (intern ("buffer-file-name"), Qnil);
4033 insert_from_buffer (XBUFFER (conversion_buffer),
4034 same_at_start_charpos, inserted_chars, 0);
4035 /* Set `inserted' to the number of inserted characters. */
4036 inserted = PT - temp;
4037 /* Set point before the inserted characters. */
4038 SET_PT_BOTH (temp, same_at_start);
4040 unbind_to (this_count, Qnil);
4042 goto handled;
4045 if (! not_regular)
4046 total = end_offset - beg_offset;
4047 else
4048 /* For a special file, all we can do is guess. */
4049 total = READ_BUF_SIZE;
4051 if (NILP (visit) && total > 0)
4053 #ifdef CLASH_DETECTION
4054 if (!NILP (BVAR (current_buffer, file_truename))
4055 /* Make binding buffer-file-name to nil effective. */
4056 && !NILP (BVAR (current_buffer, filename))
4057 && SAVE_MODIFF >= MODIFF)
4058 we_locked_file = 1;
4059 #endif /* CLASH_DETECTION */
4060 prepare_to_modify_buffer (GPT, GPT, NULL);
4063 move_gap (PT);
4064 if (GAP_SIZE < total)
4065 make_gap (total - GAP_SIZE);
4067 if (beg_offset != 0 || !NILP (replace))
4069 if (lseek (fd, beg_offset, SEEK_SET) < 0)
4070 report_file_error ("Setting file position",
4071 Fcons (orig_filename, Qnil));
4074 /* In the following loop, HOW_MUCH contains the total bytes read so
4075 far for a regular file, and not changed for a special file. But,
4076 before exiting the loop, it is set to a negative value if I/O
4077 error occurs. */
4078 how_much = 0;
4080 /* Total bytes inserted. */
4081 inserted = 0;
4083 /* Here, we don't do code conversion in the loop. It is done by
4084 decode_coding_gap after all data are read into the buffer. */
4086 ptrdiff_t gap_size = GAP_SIZE;
4088 while (how_much < total)
4090 /* try is reserved in some compilers (Microsoft C) */
4091 int trytry = min (total - how_much, READ_BUF_SIZE);
4092 ptrdiff_t this;
4094 if (not_regular)
4096 Lisp_Object nbytes;
4098 /* Maybe make more room. */
4099 if (gap_size < trytry)
4101 make_gap (total - gap_size);
4102 gap_size = GAP_SIZE;
4105 /* Read from the file, capturing `quit'. When an
4106 error occurs, end the loop, and arrange for a quit
4107 to be signaled after decoding the text we read. */
4108 non_regular_fd = fd;
4109 non_regular_inserted = inserted;
4110 non_regular_nbytes = trytry;
4111 nbytes = internal_condition_case_1 (read_non_regular,
4112 Qnil, Qerror,
4113 read_non_regular_quit);
4114 if (NILP (nbytes))
4116 read_quit = 1;
4117 break;
4120 this = XINT (nbytes);
4122 else
4124 /* Allow quitting out of the actual I/O. We don't make text
4125 part of the buffer until all the reading is done, so a C-g
4126 here doesn't do any harm. */
4127 immediate_quit = 1;
4128 QUIT;
4129 this = emacs_read (fd,
4130 ((char *) BEG_ADDR + PT_BYTE - BEG_BYTE
4131 + inserted),
4132 trytry);
4133 immediate_quit = 0;
4136 if (this <= 0)
4138 how_much = this;
4139 break;
4142 gap_size -= this;
4144 /* For a regular file, where TOTAL is the real size,
4145 count HOW_MUCH to compare with it.
4146 For a special file, where TOTAL is just a buffer size,
4147 so don't bother counting in HOW_MUCH.
4148 (INSERTED is where we count the number of characters inserted.) */
4149 if (! not_regular)
4150 how_much += this;
4151 inserted += this;
4155 /* Now we have read all the file data into the gap.
4156 If it was empty, undo marking the buffer modified. */
4158 if (inserted == 0)
4160 #ifdef CLASH_DETECTION
4161 if (we_locked_file)
4162 unlock_file (BVAR (current_buffer, file_truename));
4163 #endif
4164 Vdeactivate_mark = old_Vdeactivate_mark;
4166 else
4167 Vdeactivate_mark = Qt;
4169 /* Make the text read part of the buffer. */
4170 GAP_SIZE -= inserted;
4171 GPT += inserted;
4172 GPT_BYTE += inserted;
4173 ZV += inserted;
4174 ZV_BYTE += inserted;
4175 Z += inserted;
4176 Z_BYTE += inserted;
4178 if (GAP_SIZE > 0)
4179 /* Put an anchor to ensure multi-byte form ends at gap. */
4180 *GPT_ADDR = 0;
4182 emacs_close (fd);
4184 /* Discard the unwind protect for closing the file. */
4185 specpdl_ptr--;
4187 if (how_much < 0)
4188 error ("IO error reading %s: %s",
4189 SDATA (orig_filename), emacs_strerror (errno));
4191 notfound:
4193 if (NILP (coding_system))
4195 /* The coding system is not yet decided. Decide it by an
4196 optimized method for handling `coding:' tag.
4198 Note that we can get here only if the buffer was empty
4199 before the insertion. */
4201 if (!NILP (Vcoding_system_for_read))
4202 coding_system = Vcoding_system_for_read;
4203 else
4205 /* Since we are sure that the current buffer was empty
4206 before the insertion, we can toggle
4207 enable-multibyte-characters directly here without taking
4208 care of marker adjustment. By this way, we can run Lisp
4209 program safely before decoding the inserted text. */
4210 Lisp_Object unwind_data;
4211 ptrdiff_t count1 = SPECPDL_INDEX ();
4213 unwind_data = Fcons (BVAR (current_buffer, enable_multibyte_characters),
4214 Fcons (BVAR (current_buffer, undo_list),
4215 Fcurrent_buffer ()));
4216 bset_enable_multibyte_characters (current_buffer, Qnil);
4217 bset_undo_list (current_buffer, Qt);
4218 record_unwind_protect (decide_coding_unwind, unwind_data);
4220 if (inserted > 0 && ! NILP (Vset_auto_coding_function))
4222 coding_system = call2 (Vset_auto_coding_function,
4223 filename, make_number (inserted));
4226 if (NILP (coding_system))
4228 /* If the coding system is not yet decided, check
4229 file-coding-system-alist. */
4230 Lisp_Object args[6];
4232 args[0] = Qinsert_file_contents, args[1] = orig_filename;
4233 args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil;
4234 coding_system = Ffind_operation_coding_system (6, args);
4235 if (CONSP (coding_system))
4236 coding_system = XCAR (coding_system);
4238 unbind_to (count1, Qnil);
4239 inserted = Z_BYTE - BEG_BYTE;
4242 if (NILP (coding_system))
4243 coding_system = Qundecided;
4244 else
4245 CHECK_CODING_SYSTEM (coding_system);
4247 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4248 /* We must suppress all character code conversion except for
4249 end-of-line conversion. */
4250 coding_system = raw_text_coding_system (coding_system);
4251 setup_coding_system (coding_system, &coding);
4252 /* Ensure we set Vlast_coding_system_used. */
4253 set_coding_system = 1;
4256 if (!NILP (visit))
4258 /* When we visit a file by raw-text, we change the buffer to
4259 unibyte. */
4260 if (CODING_FOR_UNIBYTE (&coding)
4261 /* Can't do this if part of the buffer might be preserved. */
4262 && NILP (replace))
4263 /* Visiting a file with these coding system makes the buffer
4264 unibyte. */
4265 bset_enable_multibyte_characters (current_buffer, Qnil);
4268 coding.dst_multibyte = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
4269 if (CODING_MAY_REQUIRE_DECODING (&coding)
4270 && (inserted > 0 || CODING_REQUIRE_FLUSHING (&coding)))
4272 move_gap_both (PT, PT_BYTE);
4273 GAP_SIZE += inserted;
4274 ZV_BYTE -= inserted;
4275 Z_BYTE -= inserted;
4276 ZV -= inserted;
4277 Z -= inserted;
4278 decode_coding_gap (&coding, inserted, inserted);
4279 inserted = coding.produced_char;
4280 coding_system = CODING_ID_NAME (coding.id);
4282 else if (inserted > 0)
4283 adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted,
4284 inserted);
4286 /* Call after-change hooks for the inserted text, aside from the case
4287 of normal visiting (not with REPLACE), which is done in a new buffer
4288 "before" the buffer is changed. */
4289 if (inserted > 0 && total > 0
4290 && (NILP (visit) || !NILP (replace)))
4292 signal_after_change (PT, 0, inserted);
4293 update_compositions (PT, PT, CHECK_BORDER);
4296 /* Now INSERTED is measured in characters. */
4298 handled:
4300 if (deferred_remove_unwind_protect)
4301 /* If requested above, discard the unwind protect for closing the
4302 file. */
4303 specpdl_ptr--;
4305 if (!NILP (visit))
4307 if (!EQ (BVAR (current_buffer, undo_list), Qt) && !nochange)
4308 bset_undo_list (current_buffer, Qnil);
4310 if (NILP (handler))
4312 current_buffer->modtime = mtime;
4313 current_buffer->modtime_size = st.st_size;
4314 bset_filename (current_buffer, orig_filename);
4317 SAVE_MODIFF = MODIFF;
4318 BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
4319 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4320 #ifdef CLASH_DETECTION
4321 if (NILP (handler))
4323 if (!NILP (BVAR (current_buffer, file_truename)))
4324 unlock_file (BVAR (current_buffer, file_truename));
4325 unlock_file (filename);
4327 #endif /* CLASH_DETECTION */
4328 if (not_regular)
4329 xsignal2 (Qfile_error,
4330 build_string ("not a regular file"), orig_filename);
4333 if (set_coding_system)
4334 Vlast_coding_system_used = coding_system;
4336 if (! NILP (Ffboundp (Qafter_insert_file_set_coding)))
4338 insval = call2 (Qafter_insert_file_set_coding, make_number (inserted),
4339 visit);
4340 if (! NILP (insval))
4342 if (! RANGED_INTEGERP (0, insval, ZV - PT))
4343 wrong_type_argument (intern ("inserted-chars"), insval);
4344 inserted = XFASTINT (insval);
4348 /* Decode file format. */
4349 if (inserted > 0)
4351 /* Don't run point motion or modification hooks when decoding. */
4352 ptrdiff_t count1 = SPECPDL_INDEX ();
4353 ptrdiff_t old_inserted = inserted;
4354 specbind (Qinhibit_point_motion_hooks, Qt);
4355 specbind (Qinhibit_modification_hooks, Qt);
4357 /* Save old undo list and don't record undo for decoding. */
4358 old_undo = BVAR (current_buffer, undo_list);
4359 bset_undo_list (current_buffer, Qt);
4361 if (NILP (replace))
4363 insval = call3 (Qformat_decode,
4364 Qnil, make_number (inserted), visit);
4365 if (! RANGED_INTEGERP (0, insval, ZV - PT))
4366 wrong_type_argument (intern ("inserted-chars"), insval);
4367 inserted = XFASTINT (insval);
4369 else
4371 /* If REPLACE is non-nil and we succeeded in not replacing the
4372 beginning or end of the buffer text with the file's contents,
4373 call format-decode with `point' positioned at the beginning
4374 of the buffer and `inserted' equaling the number of
4375 characters in the buffer. Otherwise, format-decode might
4376 fail to correctly analyze the beginning or end of the buffer.
4377 Hence we temporarily save `point' and `inserted' here and
4378 restore `point' iff format-decode did not insert or delete
4379 any text. Otherwise we leave `point' at point-min. */
4380 ptrdiff_t opoint = PT;
4381 ptrdiff_t opoint_byte = PT_BYTE;
4382 ptrdiff_t oinserted = ZV - BEGV;
4383 EMACS_INT ochars_modiff = CHARS_MODIFF;
4385 TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE);
4386 insval = call3 (Qformat_decode,
4387 Qnil, make_number (oinserted), visit);
4388 if (! RANGED_INTEGERP (0, insval, ZV - PT))
4389 wrong_type_argument (intern ("inserted-chars"), insval);
4390 if (ochars_modiff == CHARS_MODIFF)
4391 /* format_decode didn't modify buffer's characters => move
4392 point back to position before inserted text and leave
4393 value of inserted alone. */
4394 SET_PT_BOTH (opoint, opoint_byte);
4395 else
4396 /* format_decode modified buffer's characters => consider
4397 entire buffer changed and leave point at point-min. */
4398 inserted = XFASTINT (insval);
4401 /* For consistency with format-decode call these now iff inserted > 0
4402 (martin 2007-06-28). */
4403 p = Vafter_insert_file_functions;
4404 while (CONSP (p))
4406 if (NILP (replace))
4408 insval = call1 (XCAR (p), make_number (inserted));
4409 if (!NILP (insval))
4411 if (! RANGED_INTEGERP (0, insval, ZV - PT))
4412 wrong_type_argument (intern ("inserted-chars"), insval);
4413 inserted = XFASTINT (insval);
4416 else
4418 /* For the rationale of this see the comment on
4419 format-decode above. */
4420 ptrdiff_t opoint = PT;
4421 ptrdiff_t opoint_byte = PT_BYTE;
4422 ptrdiff_t oinserted = ZV - BEGV;
4423 EMACS_INT ochars_modiff = CHARS_MODIFF;
4425 TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE);
4426 insval = call1 (XCAR (p), make_number (oinserted));
4427 if (!NILP (insval))
4429 if (! RANGED_INTEGERP (0, insval, ZV - PT))
4430 wrong_type_argument (intern ("inserted-chars"), insval);
4431 if (ochars_modiff == CHARS_MODIFF)
4432 /* after_insert_file_functions didn't modify
4433 buffer's characters => move point back to
4434 position before inserted text and leave value of
4435 inserted alone. */
4436 SET_PT_BOTH (opoint, opoint_byte);
4437 else
4438 /* after_insert_file_functions did modify buffer's
4439 characters => consider entire buffer changed and
4440 leave point at point-min. */
4441 inserted = XFASTINT (insval);
4445 QUIT;
4446 p = XCDR (p);
4449 if (NILP (visit))
4451 bset_undo_list (current_buffer, old_undo);
4452 if (CONSP (old_undo) && inserted != old_inserted)
4454 /* Adjust the last undo record for the size change during
4455 the format conversion. */
4456 Lisp_Object tem = XCAR (old_undo);
4457 if (CONSP (tem) && INTEGERP (XCAR (tem))
4458 && INTEGERP (XCDR (tem))
4459 && XFASTINT (XCDR (tem)) == PT + old_inserted)
4460 XSETCDR (tem, make_number (PT + inserted));
4463 else
4464 /* If undo_list was Qt before, keep it that way.
4465 Otherwise start with an empty undo_list. */
4466 bset_undo_list (current_buffer, EQ (old_undo, Qt) ? Qt : Qnil);
4468 unbind_to (count1, Qnil);
4471 if (!NILP (visit)
4472 && EMACS_NSECS (current_buffer->modtime) == NONEXISTENT_MODTIME_NSECS)
4474 /* If visiting nonexistent file, return nil. */
4475 errno = save_errno;
4476 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
4479 if (read_quit)
4480 Fsignal (Qquit, Qnil);
4482 /* ??? Retval needs to be dealt with in all cases consistently. */
4483 if (NILP (val))
4484 val = Fcons (orig_filename,
4485 Fcons (make_number (inserted),
4486 Qnil));
4488 RETURN_UNGCPRO (unbind_to (count, val));
4491 static Lisp_Object build_annotations (Lisp_Object, Lisp_Object);
4493 static Lisp_Object
4494 build_annotations_unwind (Lisp_Object arg)
4496 Vwrite_region_annotation_buffers = arg;
4497 return Qnil;
4500 /* Decide the coding-system to encode the data with. */
4502 static Lisp_Object
4503 choose_write_coding_system (Lisp_Object start, Lisp_Object end, Lisp_Object filename,
4504 Lisp_Object append, Lisp_Object visit, Lisp_Object lockname,
4505 struct coding_system *coding)
4507 Lisp_Object val;
4508 Lisp_Object eol_parent = Qnil;
4510 if (auto_saving
4511 && NILP (Fstring_equal (BVAR (current_buffer, filename),
4512 BVAR (current_buffer, auto_save_file_name))))
4514 val = Qutf_8_emacs;
4515 eol_parent = Qunix;
4517 else if (!NILP (Vcoding_system_for_write))
4519 val = Vcoding_system_for_write;
4520 if (coding_system_require_warning
4521 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4522 /* Confirm that VAL can surely encode the current region. */
4523 val = call5 (Vselect_safe_coding_system_function,
4524 start, end, Fcons (Qt, Fcons (val, Qnil)),
4525 Qnil, filename);
4527 else
4529 /* If the variable `buffer-file-coding-system' is set locally,
4530 it means that the file was read with some kind of code
4531 conversion or the variable is explicitly set by users. We
4532 had better write it out with the same coding system even if
4533 `enable-multibyte-characters' is nil.
4535 If it is not set locally, we anyway have to convert EOL
4536 format if the default value of `buffer-file-coding-system'
4537 tells that it is not Unix-like (LF only) format. */
4538 bool using_default_coding = 0;
4539 bool force_raw_text = 0;
4541 val = BVAR (current_buffer, buffer_file_coding_system);
4542 if (NILP (val)
4543 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
4545 val = Qnil;
4546 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4547 force_raw_text = 1;
4550 if (NILP (val))
4552 /* Check file-coding-system-alist. */
4553 Lisp_Object args[7], coding_systems;
4555 args[0] = Qwrite_region; args[1] = start; args[2] = end;
4556 args[3] = filename; args[4] = append; args[5] = visit;
4557 args[6] = lockname;
4558 coding_systems = Ffind_operation_coding_system (7, args);
4559 if (CONSP (coding_systems) && !NILP (XCDR (coding_systems)))
4560 val = XCDR (coding_systems);
4563 if (NILP (val))
4565 /* If we still have not decided a coding system, use the
4566 default value of buffer-file-coding-system. */
4567 val = BVAR (current_buffer, buffer_file_coding_system);
4568 using_default_coding = 1;
4571 if (! NILP (val) && ! force_raw_text)
4573 Lisp_Object spec, attrs;
4575 CHECK_CODING_SYSTEM_GET_SPEC (val, spec);
4576 attrs = AREF (spec, 0);
4577 if (EQ (CODING_ATTR_TYPE (attrs), Qraw_text))
4578 force_raw_text = 1;
4581 if (!force_raw_text
4582 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4583 /* Confirm that VAL can surely encode the current region. */
4584 val = call5 (Vselect_safe_coding_system_function,
4585 start, end, val, Qnil, filename);
4587 /* If the decided coding-system doesn't specify end-of-line
4588 format, we use that of
4589 `default-buffer-file-coding-system'. */
4590 if (! using_default_coding
4591 && ! NILP (BVAR (&buffer_defaults, buffer_file_coding_system)))
4592 val = (coding_inherit_eol_type
4593 (val, BVAR (&buffer_defaults, buffer_file_coding_system)));
4595 /* If we decide not to encode text, use `raw-text' or one of its
4596 subsidiaries. */
4597 if (force_raw_text)
4598 val = raw_text_coding_system (val);
4601 val = coding_inherit_eol_type (val, eol_parent);
4602 setup_coding_system (val, coding);
4604 if (!STRINGP (start) && !NILP (BVAR (current_buffer, selective_display)))
4605 coding->mode |= CODING_MODE_SELECTIVE_DISPLAY;
4606 return val;
4609 DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 7,
4610 "r\nFWrite region to file: \ni\ni\ni\np",
4611 doc: /* Write current region into specified file.
4612 When called from a program, requires three arguments:
4613 START, END and FILENAME. START and END are normally buffer positions
4614 specifying the part of the buffer to write.
4615 If START is nil, that means to use the entire buffer contents.
4616 If START is a string, then output that string to the file
4617 instead of any buffer contents; END is ignored.
4619 Optional fourth argument APPEND if non-nil means
4620 append to existing file contents (if any). If it is an integer,
4621 seek to that offset in the file before writing.
4622 Optional fifth argument VISIT, if t or a string, means
4623 set the last-save-file-modtime of buffer to this file's modtime
4624 and mark buffer not modified.
4625 If VISIT is a string, it is a second file name;
4626 the output goes to FILENAME, but the buffer is marked as visiting VISIT.
4627 VISIT is also the file name to lock and unlock for clash detection.
4628 If VISIT is neither t nor nil nor a string,
4629 that means do not display the \"Wrote file\" message.
4630 The optional sixth arg LOCKNAME, if non-nil, specifies the name to
4631 use for locking and unlocking, overriding FILENAME and VISIT.
4632 The optional seventh arg MUSTBENEW, if non-nil, insists on a check
4633 for an existing file with the same name. If MUSTBENEW is `excl',
4634 that means to get an error if the file already exists; never overwrite.
4635 If MUSTBENEW is neither nil nor `excl', that means ask for
4636 confirmation before overwriting, but do go ahead and overwrite the file
4637 if the user confirms.
4639 This does code conversion according to the value of
4640 `coding-system-for-write', `buffer-file-coding-system', or
4641 `file-coding-system-alist', and sets the variable
4642 `last-coding-system-used' to the coding system actually used.
4644 This calls `write-region-annotate-functions' at the start, and
4645 `write-region-post-annotation-function' at the end. */)
4646 (Lisp_Object start, Lisp_Object end, Lisp_Object filename, Lisp_Object append, Lisp_Object visit, Lisp_Object lockname, Lisp_Object mustbenew)
4648 int desc;
4649 bool ok;
4650 int save_errno = 0;
4651 const char *fn;
4652 struct stat st;
4653 EMACS_TIME modtime;
4654 ptrdiff_t count = SPECPDL_INDEX ();
4655 int count1;
4656 Lisp_Object handler;
4657 Lisp_Object visit_file;
4658 Lisp_Object annotations;
4659 Lisp_Object encoded_filename;
4660 bool visiting = (EQ (visit, Qt) || STRINGP (visit));
4661 bool quietly = !NILP (visit);
4662 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
4663 struct buffer *given_buffer;
4664 struct coding_system coding;
4666 if (current_buffer->base_buffer && visiting)
4667 error ("Cannot do file visiting in an indirect buffer");
4669 if (!NILP (start) && !STRINGP (start))
4670 validate_region (&start, &end);
4672 visit_file = Qnil;
4673 GCPRO5 (start, filename, visit, visit_file, lockname);
4675 filename = Fexpand_file_name (filename, Qnil);
4677 if (!NILP (mustbenew) && !EQ (mustbenew, Qexcl))
4678 barf_or_query_if_file_exists (filename, "overwrite", 1, 0, 1);
4680 if (STRINGP (visit))
4681 visit_file = Fexpand_file_name (visit, Qnil);
4682 else
4683 visit_file = filename;
4685 if (NILP (lockname))
4686 lockname = visit_file;
4688 annotations = Qnil;
4690 /* If the file name has special constructs in it,
4691 call the corresponding file handler. */
4692 handler = Ffind_file_name_handler (filename, Qwrite_region);
4693 /* If FILENAME has no handler, see if VISIT has one. */
4694 if (NILP (handler) && STRINGP (visit))
4695 handler = Ffind_file_name_handler (visit, Qwrite_region);
4697 if (!NILP (handler))
4699 Lisp_Object val;
4700 val = call6 (handler, Qwrite_region, start, end,
4701 filename, append, visit);
4703 if (visiting)
4705 SAVE_MODIFF = MODIFF;
4706 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4707 bset_filename (current_buffer, visit_file);
4709 UNGCPRO;
4710 return val;
4713 record_unwind_protect (save_restriction_restore, save_restriction_save ());
4715 /* Special kludge to simplify auto-saving. */
4716 if (NILP (start))
4718 /* Do it later, so write-region-annotate-function can work differently
4719 if we save "the buffer" vs "a region".
4720 This is useful in tar-mode. --Stef
4721 XSETFASTINT (start, BEG);
4722 XSETFASTINT (end, Z); */
4723 Fwiden ();
4726 record_unwind_protect (build_annotations_unwind,
4727 Vwrite_region_annotation_buffers);
4728 Vwrite_region_annotation_buffers = Fcons (Fcurrent_buffer (), Qnil);
4729 count1 = SPECPDL_INDEX ();
4731 given_buffer = current_buffer;
4733 if (!STRINGP (start))
4735 annotations = build_annotations (start, end);
4737 if (current_buffer != given_buffer)
4739 XSETFASTINT (start, BEGV);
4740 XSETFASTINT (end, ZV);
4744 if (NILP (start))
4746 XSETFASTINT (start, BEGV);
4747 XSETFASTINT (end, ZV);
4750 UNGCPRO;
4752 GCPRO5 (start, filename, annotations, visit_file, lockname);
4754 /* Decide the coding-system to encode the data with.
4755 We used to make this choice before calling build_annotations, but that
4756 leads to problems when a write-annotate-function takes care of
4757 unsavable chars (as was the case with X-Symbol). */
4758 Vlast_coding_system_used
4759 = choose_write_coding_system (start, end, filename,
4760 append, visit, lockname, &coding);
4762 #ifdef CLASH_DETECTION
4763 if (!auto_saving)
4764 lock_file (lockname);
4765 #endif /* CLASH_DETECTION */
4767 encoded_filename = ENCODE_FILE (filename);
4769 fn = SSDATA (encoded_filename);
4770 desc = -1;
4771 if (!NILP (append))
4772 #ifdef DOS_NT
4773 desc = emacs_open (fn, O_WRONLY | O_BINARY, 0);
4774 #else /* not DOS_NT */
4775 desc = emacs_open (fn, O_WRONLY, 0);
4776 #endif /* not DOS_NT */
4778 if (desc < 0 && (NILP (append) || errno == ENOENT))
4779 #ifdef DOS_NT
4780 desc = emacs_open (fn,
4781 O_WRONLY | O_CREAT | O_BINARY
4782 | (EQ (mustbenew, Qexcl) ? O_EXCL : O_TRUNC),
4783 S_IREAD | S_IWRITE);
4784 #else /* not DOS_NT */
4785 desc = emacs_open (fn, O_WRONLY | O_TRUNC | O_CREAT
4786 | (EQ (mustbenew, Qexcl) ? O_EXCL : 0),
4787 auto_saving ? auto_save_mode_bits : 0666);
4788 #endif /* not DOS_NT */
4790 if (desc < 0)
4792 #ifdef CLASH_DETECTION
4793 save_errno = errno;
4794 if (!auto_saving) unlock_file (lockname);
4795 errno = save_errno;
4796 #endif /* CLASH_DETECTION */
4797 UNGCPRO;
4798 report_file_error ("Opening output file", Fcons (filename, Qnil));
4801 record_unwind_protect (close_file_unwind, make_number (desc));
4803 if (!NILP (append) && !NILP (Ffile_regular_p (filename)))
4805 off_t ret;
4807 if (NUMBERP (append))
4808 ret = emacs_lseek (desc, XINT (append), SEEK_CUR);
4809 else
4810 ret = lseek (desc, 0, SEEK_END);
4811 if (ret < 0)
4813 #ifdef CLASH_DETECTION
4814 save_errno = errno;
4815 if (!auto_saving) unlock_file (lockname);
4816 errno = save_errno;
4817 #endif /* CLASH_DETECTION */
4818 UNGCPRO;
4819 report_file_error ("Lseek error", Fcons (filename, Qnil));
4823 UNGCPRO;
4825 immediate_quit = 1;
4827 if (STRINGP (start))
4828 ok = a_write (desc, start, 0, SCHARS (start), &annotations, &coding);
4829 else if (XINT (start) != XINT (end))
4830 ok = a_write (desc, Qnil, XINT (start), XINT (end) - XINT (start),
4831 &annotations, &coding);
4832 else
4834 /* If file was empty, still need to write the annotations. */
4835 coding.mode |= CODING_MODE_LAST_BLOCK;
4836 ok = a_write (desc, Qnil, XINT (end), 0, &annotations, &coding);
4838 save_errno = errno;
4840 if (ok && CODING_REQUIRE_FLUSHING (&coding)
4841 && !(coding.mode & CODING_MODE_LAST_BLOCK))
4843 /* We have to flush out a data. */
4844 coding.mode |= CODING_MODE_LAST_BLOCK;
4845 ok = e_write (desc, Qnil, 1, 1, &coding);
4846 save_errno = errno;
4849 immediate_quit = 0;
4851 #ifdef HAVE_FSYNC
4852 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun).
4853 Disk full in NFS may be reported here. */
4854 /* mib says that closing the file will try to write as fast as NFS can do
4855 it, and that means the fsync here is not crucial for autosave files. */
4856 if (!auto_saving && !write_region_inhibit_fsync && fsync (desc) < 0)
4858 /* If fsync fails with EINTR, don't treat that as serious. Also
4859 ignore EINVAL which happens when fsync is not supported on this
4860 file. */
4861 if (errno != EINTR && errno != EINVAL)
4862 ok = 0, save_errno = errno;
4864 #endif
4866 modtime = invalid_emacs_time ();
4867 if (visiting)
4869 if (fstat (desc, &st) == 0)
4870 modtime = get_stat_mtime (&st);
4871 else
4872 ok = 0, save_errno = errno;
4875 /* NFS can report a write failure now. */
4876 if (emacs_close (desc) < 0)
4877 ok = 0, save_errno = errno;
4879 /* Discard the unwind protect for close_file_unwind. */
4880 specpdl_ptr = specpdl + count1;
4882 /* Call write-region-post-annotation-function. */
4883 while (CONSP (Vwrite_region_annotation_buffers))
4885 Lisp_Object buf = XCAR (Vwrite_region_annotation_buffers);
4886 if (!NILP (Fbuffer_live_p (buf)))
4888 Fset_buffer (buf);
4889 if (FUNCTIONP (Vwrite_region_post_annotation_function))
4890 call0 (Vwrite_region_post_annotation_function);
4892 Vwrite_region_annotation_buffers
4893 = XCDR (Vwrite_region_annotation_buffers);
4896 unbind_to (count, Qnil);
4898 #ifdef CLASH_DETECTION
4899 if (!auto_saving)
4900 unlock_file (lockname);
4901 #endif /* CLASH_DETECTION */
4903 /* Do this before reporting IO error
4904 to avoid a "file has changed on disk" warning on
4905 next attempt to save. */
4906 if (EMACS_TIME_VALID_P (modtime))
4908 current_buffer->modtime = modtime;
4909 current_buffer->modtime_size = st.st_size;
4912 if (! ok)
4913 error ("IO error writing %s: %s", SDATA (filename),
4914 emacs_strerror (save_errno));
4916 if (visiting)
4918 SAVE_MODIFF = MODIFF;
4919 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4920 bset_filename (current_buffer, visit_file);
4921 update_mode_lines++;
4923 else if (quietly)
4925 if (auto_saving
4926 && ! NILP (Fstring_equal (BVAR (current_buffer, filename),
4927 BVAR (current_buffer, auto_save_file_name))))
4928 SAVE_MODIFF = MODIFF;
4930 return Qnil;
4933 if (!auto_saving)
4934 message_with_string ((INTEGERP (append)
4935 ? "Updated %s"
4936 : ! NILP (append)
4937 ? "Added to %s"
4938 : "Wrote %s"),
4939 visit_file, 1);
4941 return Qnil;
4944 Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
4946 DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0,
4947 doc: /* Return t if (car A) is numerically less than (car B). */)
4948 (Lisp_Object a, Lisp_Object b)
4950 return Flss (Fcar (a), Fcar (b));
4953 /* Build the complete list of annotations appropriate for writing out
4954 the text between START and END, by calling all the functions in
4955 write-region-annotate-functions and merging the lists they return.
4956 If one of these functions switches to a different buffer, we assume
4957 that buffer contains altered text. Therefore, the caller must
4958 make sure to restore the current buffer in all cases,
4959 as save-excursion would do. */
4961 static Lisp_Object
4962 build_annotations (Lisp_Object start, Lisp_Object end)
4964 Lisp_Object annotations;
4965 Lisp_Object p, res;
4966 struct gcpro gcpro1, gcpro2;
4967 Lisp_Object original_buffer;
4968 int i;
4969 bool used_global = 0;
4971 XSETBUFFER (original_buffer, current_buffer);
4973 annotations = Qnil;
4974 p = Vwrite_region_annotate_functions;
4975 GCPRO2 (annotations, p);
4976 while (CONSP (p))
4978 struct buffer *given_buffer = current_buffer;
4979 if (EQ (Qt, XCAR (p)) && !used_global)
4980 { /* Use the global value of the hook. */
4981 Lisp_Object arg[2];
4982 used_global = 1;
4983 arg[0] = Fdefault_value (Qwrite_region_annotate_functions);
4984 arg[1] = XCDR (p);
4985 p = Fappend (2, arg);
4986 continue;
4988 Vwrite_region_annotations_so_far = annotations;
4989 res = call2 (XCAR (p), start, end);
4990 /* If the function makes a different buffer current,
4991 assume that means this buffer contains altered text to be output.
4992 Reset START and END from the buffer bounds
4993 and discard all previous annotations because they should have
4994 been dealt with by this function. */
4995 if (current_buffer != given_buffer)
4997 Vwrite_region_annotation_buffers
4998 = Fcons (Fcurrent_buffer (),
4999 Vwrite_region_annotation_buffers);
5000 XSETFASTINT (start, BEGV);
5001 XSETFASTINT (end, ZV);
5002 annotations = Qnil;
5004 Flength (res); /* Check basic validity of return value */
5005 annotations = merge (annotations, res, Qcar_less_than_car);
5006 p = XCDR (p);
5009 /* Now do the same for annotation functions implied by the file-format */
5010 if (auto_saving && (!EQ (BVAR (current_buffer, auto_save_file_format), Qt)))
5011 p = BVAR (current_buffer, auto_save_file_format);
5012 else
5013 p = BVAR (current_buffer, file_format);
5014 for (i = 0; CONSP (p); p = XCDR (p), ++i)
5016 struct buffer *given_buffer = current_buffer;
5018 Vwrite_region_annotations_so_far = annotations;
5020 /* Value is either a list of annotations or nil if the function
5021 has written annotations to a temporary buffer, which is now
5022 current. */
5023 res = call5 (Qformat_annotate_function, XCAR (p), start, end,
5024 original_buffer, make_number (i));
5025 if (current_buffer != given_buffer)
5027 XSETFASTINT (start, BEGV);
5028 XSETFASTINT (end, ZV);
5029 annotations = Qnil;
5032 if (CONSP (res))
5033 annotations = merge (annotations, res, Qcar_less_than_car);
5036 UNGCPRO;
5037 return annotations;
5041 /* Write to descriptor DESC the NCHARS chars starting at POS of STRING.
5042 If STRING is nil, POS is the character position in the current buffer.
5043 Intersperse with them the annotations from *ANNOT
5044 which fall within the range of POS to POS + NCHARS,
5045 each at its appropriate position.
5047 We modify *ANNOT by discarding elements as we use them up.
5049 Return true if successful. */
5051 static bool
5052 a_write (int desc, Lisp_Object string, ptrdiff_t pos,
5053 ptrdiff_t nchars, Lisp_Object *annot,
5054 struct coding_system *coding)
5056 Lisp_Object tem;
5057 ptrdiff_t nextpos;
5058 ptrdiff_t lastpos = pos + nchars;
5060 while (NILP (*annot) || CONSP (*annot))
5062 tem = Fcar_safe (Fcar (*annot));
5063 nextpos = pos - 1;
5064 if (INTEGERP (tem))
5065 nextpos = XFASTINT (tem);
5067 /* If there are no more annotations in this range,
5068 output the rest of the range all at once. */
5069 if (! (nextpos >= pos && nextpos <= lastpos))
5070 return e_write (desc, string, pos, lastpos, coding);
5072 /* Output buffer text up to the next annotation's position. */
5073 if (nextpos > pos)
5075 if (!e_write (desc, string, pos, nextpos, coding))
5076 return 0;
5077 pos = nextpos;
5079 /* Output the annotation. */
5080 tem = Fcdr (Fcar (*annot));
5081 if (STRINGP (tem))
5083 if (!e_write (desc, tem, 0, SCHARS (tem), coding))
5084 return 0;
5086 *annot = Fcdr (*annot);
5088 return 1;
5092 /* Write text in the range START and END into descriptor DESC,
5093 encoding them with coding system CODING. If STRING is nil, START
5094 and END are character positions of the current buffer, else they
5095 are indexes to the string STRING. Return true if successful. */
5097 static bool
5098 e_write (int desc, Lisp_Object string, ptrdiff_t start, ptrdiff_t end,
5099 struct coding_system *coding)
5101 if (STRINGP (string))
5103 start = 0;
5104 end = SCHARS (string);
5107 /* We used to have a code for handling selective display here. But,
5108 now it is handled within encode_coding. */
5110 while (start < end)
5112 if (STRINGP (string))
5114 coding->src_multibyte = SCHARS (string) < SBYTES (string);
5115 if (CODING_REQUIRE_ENCODING (coding))
5117 encode_coding_object (coding, string,
5118 start, string_char_to_byte (string, start),
5119 end, string_char_to_byte (string, end), Qt);
5121 else
5123 coding->dst_object = string;
5124 coding->consumed_char = SCHARS (string);
5125 coding->produced = SBYTES (string);
5128 else
5130 ptrdiff_t start_byte = CHAR_TO_BYTE (start);
5131 ptrdiff_t end_byte = CHAR_TO_BYTE (end);
5133 coding->src_multibyte = (end - start) < (end_byte - start_byte);
5134 if (CODING_REQUIRE_ENCODING (coding))
5136 encode_coding_object (coding, Fcurrent_buffer (),
5137 start, start_byte, end, end_byte, Qt);
5139 else
5141 coding->dst_object = Qnil;
5142 coding->dst_pos_byte = start_byte;
5143 if (start >= GPT || end <= GPT)
5145 coding->consumed_char = end - start;
5146 coding->produced = end_byte - start_byte;
5148 else
5150 coding->consumed_char = GPT - start;
5151 coding->produced = GPT_BYTE - start_byte;
5156 if (coding->produced > 0)
5158 coding->produced
5159 -= emacs_write (desc,
5160 STRINGP (coding->dst_object)
5161 ? SSDATA (coding->dst_object)
5162 : (char *) BYTE_POS_ADDR (coding->dst_pos_byte),
5163 coding->produced);
5165 if (coding->produced)
5166 return 0;
5168 start += coding->consumed_char;
5171 return 1;
5174 DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime,
5175 Sverify_visited_file_modtime, 0, 1, 0,
5176 doc: /* Return t if last mod time of BUF's visited file matches what BUF records.
5177 This means that the file has not been changed since it was visited or saved.
5178 If BUF is omitted or nil, it defaults to the current buffer.
5179 See Info node `(elisp)Modification Time' for more details. */)
5180 (Lisp_Object buf)
5182 struct buffer *b;
5183 struct stat st;
5184 Lisp_Object handler;
5185 Lisp_Object filename;
5186 EMACS_TIME mtime, diff;
5188 if (NILP (buf))
5189 b = current_buffer;
5190 else
5192 CHECK_BUFFER (buf);
5193 b = XBUFFER (buf);
5196 if (!STRINGP (BVAR (b, filename))) return Qt;
5197 if (EMACS_NSECS (b->modtime) == UNKNOWN_MODTIME_NSECS) return Qt;
5199 /* If the file name has special constructs in it,
5200 call the corresponding file handler. */
5201 handler = Ffind_file_name_handler (BVAR (b, filename),
5202 Qverify_visited_file_modtime);
5203 if (!NILP (handler))
5204 return call2 (handler, Qverify_visited_file_modtime, buf);
5206 filename = ENCODE_FILE (BVAR (b, filename));
5208 mtime = (stat (SSDATA (filename), &st) == 0
5209 ? get_stat_mtime (&st)
5210 : time_error_value (errno));
5211 if ((EMACS_TIME_EQ (mtime, b->modtime)
5212 /* If both exist, accept them if they are off by one second. */
5213 || (EMACS_TIME_VALID_P (mtime) && EMACS_TIME_VALID_P (b->modtime)
5214 && ((diff = (EMACS_TIME_LT (mtime, b->modtime)
5215 ? sub_emacs_time (b->modtime, mtime)
5216 : sub_emacs_time (mtime, b->modtime))),
5217 EMACS_TIME_LE (diff, make_emacs_time (1, 0)))))
5218 && (b->modtime_size < 0
5219 || st.st_size == b->modtime_size))
5220 return Qt;
5221 return Qnil;
5224 DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime,
5225 Sclear_visited_file_modtime, 0, 0, 0,
5226 doc: /* Clear out records of last mod time of visited file.
5227 Next attempt to save will certainly not complain of a discrepancy. */)
5228 (void)
5230 current_buffer->modtime = make_emacs_time (0, UNKNOWN_MODTIME_NSECS);
5231 current_buffer->modtime_size = -1;
5232 return Qnil;
5235 DEFUN ("visited-file-modtime", Fvisited_file_modtime,
5236 Svisited_file_modtime, 0, 0, 0,
5237 doc: /* Return the current buffer's recorded visited file modification time.
5238 The value is a list of the form (HIGH LOW USEC PSEC), like the time values that
5239 `file-attributes' returns. If the current buffer has no recorded file
5240 modification time, this function returns 0. If the visited file
5241 doesn't exist, HIGH will be -1.
5242 See Info node `(elisp)Modification Time' for more details. */)
5243 (void)
5245 if (EMACS_NSECS (current_buffer->modtime) < 0)
5247 if (EMACS_NSECS (current_buffer->modtime) == NONEXISTENT_MODTIME_NSECS)
5249 /* make_lisp_time won't work here if time_t is unsigned. */
5250 return list4 (make_number (-1), make_number (65535),
5251 make_number (0), make_number (0));
5253 return make_number (0);
5255 return make_lisp_time (current_buffer->modtime);
5258 DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime,
5259 Sset_visited_file_modtime, 0, 1, 0,
5260 doc: /* Update buffer's recorded modification time from the visited file's time.
5261 Useful if the buffer was not read from the file normally
5262 or if the file itself has been changed for some known benign reason.
5263 An argument specifies the modification time value to use
5264 \(instead of that of the visited file), in the form of a list
5265 \(HIGH LOW USEC PSEC) as returned by `current-time'. */)
5266 (Lisp_Object time_list)
5268 if (!NILP (time_list))
5270 current_buffer->modtime = lisp_time_argument (time_list);
5271 current_buffer->modtime_size = -1;
5273 else
5275 register Lisp_Object filename;
5276 struct stat st;
5277 Lisp_Object handler;
5279 filename = Fexpand_file_name (BVAR (current_buffer, filename), Qnil);
5281 /* If the file name has special constructs in it,
5282 call the corresponding file handler. */
5283 handler = Ffind_file_name_handler (filename, Qset_visited_file_modtime);
5284 if (!NILP (handler))
5285 /* The handler can find the file name the same way we did. */
5286 return call2 (handler, Qset_visited_file_modtime, Qnil);
5288 filename = ENCODE_FILE (filename);
5290 if (stat (SSDATA (filename), &st) >= 0)
5292 current_buffer->modtime = get_stat_mtime (&st);
5293 current_buffer->modtime_size = st.st_size;
5297 return Qnil;
5300 static Lisp_Object
5301 auto_save_error (Lisp_Object error_val)
5303 Lisp_Object args[3], msg;
5304 int i, nbytes;
5305 struct gcpro gcpro1;
5306 char *msgbuf;
5307 USE_SAFE_ALLOCA;
5309 auto_save_error_occurred = 1;
5311 ring_bell (XFRAME (selected_frame));
5313 args[0] = build_string ("Auto-saving %s: %s");
5314 args[1] = BVAR (current_buffer, name);
5315 args[2] = Ferror_message_string (error_val);
5316 msg = Fformat (3, args);
5317 GCPRO1 (msg);
5318 nbytes = SBYTES (msg);
5319 msgbuf = SAFE_ALLOCA (nbytes);
5320 memcpy (msgbuf, SDATA (msg), nbytes);
5322 for (i = 0; i < 3; ++i)
5324 if (i == 0)
5325 message2 (msgbuf, nbytes, STRING_MULTIBYTE (msg));
5326 else
5327 message2_nolog (msgbuf, nbytes, STRING_MULTIBYTE (msg));
5328 Fsleep_for (make_number (1), Qnil);
5331 SAFE_FREE ();
5332 UNGCPRO;
5333 return Qnil;
5336 static Lisp_Object
5337 auto_save_1 (void)
5339 struct stat st;
5340 Lisp_Object modes;
5342 auto_save_mode_bits = 0666;
5344 /* Get visited file's mode to become the auto save file's mode. */
5345 if (! NILP (BVAR (current_buffer, filename)))
5347 if (stat (SSDATA (BVAR (current_buffer, filename)), &st) >= 0)
5348 /* But make sure we can overwrite it later! */
5349 auto_save_mode_bits = (st.st_mode | 0600) & 0777;
5350 else if (modes = Ffile_modes (BVAR (current_buffer, filename)),
5351 INTEGERP (modes))
5352 /* Remote files don't cooperate with stat. */
5353 auto_save_mode_bits = (XINT (modes) | 0600) & 0777;
5356 return
5357 Fwrite_region (Qnil, Qnil, BVAR (current_buffer, auto_save_file_name), Qnil,
5358 NILP (Vauto_save_visited_file_name) ? Qlambda : Qt,
5359 Qnil, Qnil);
5362 static Lisp_Object
5363 do_auto_save_unwind (Lisp_Object arg) /* used as unwind-protect function */
5366 FILE *stream = (FILE *) XSAVE_VALUE (arg)->pointer;
5367 auto_saving = 0;
5368 if (stream != NULL)
5370 block_input ();
5371 fclose (stream);
5372 unblock_input ();
5374 return Qnil;
5377 static Lisp_Object
5378 do_auto_save_unwind_1 (Lisp_Object value) /* used as unwind-protect function */
5381 minibuffer_auto_raise = XINT (value);
5382 return Qnil;
5385 static Lisp_Object
5386 do_auto_save_make_dir (Lisp_Object dir)
5388 Lisp_Object result;
5390 auto_saving_dir_umask = 077;
5391 result = call2 (Qmake_directory, dir, Qt);
5392 auto_saving_dir_umask = 0;
5393 return result;
5396 static Lisp_Object
5397 do_auto_save_eh (Lisp_Object ignore)
5399 auto_saving_dir_umask = 0;
5400 return Qnil;
5403 DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "",
5404 doc: /* Auto-save all buffers that need it.
5405 This is all buffers that have auto-saving enabled
5406 and are changed since last auto-saved.
5407 Auto-saving writes the buffer into a file
5408 so that your editing is not lost if the system crashes.
5409 This file is not the file you visited; that changes only when you save.
5410 Normally we run the normal hook `auto-save-hook' before saving.
5412 A non-nil NO-MESSAGE argument means do not print any message if successful.
5413 A non-nil CURRENT-ONLY argument means save only current buffer. */)
5414 (Lisp_Object no_message, Lisp_Object current_only)
5416 struct buffer *old = current_buffer, *b;
5417 Lisp_Object tail, buf, hook;
5418 bool auto_saved = 0;
5419 int do_handled_files;
5420 Lisp_Object oquit;
5421 FILE *stream = NULL;
5422 ptrdiff_t count = SPECPDL_INDEX ();
5423 bool orig_minibuffer_auto_raise = minibuffer_auto_raise;
5424 bool old_message_p = 0;
5425 struct gcpro gcpro1, gcpro2;
5427 if (max_specpdl_size < specpdl_size + 40)
5428 max_specpdl_size = specpdl_size + 40;
5430 if (minibuf_level)
5431 no_message = Qt;
5433 if (NILP (no_message))
5435 old_message_p = push_message ();
5436 record_unwind_protect (pop_message_unwind, Qnil);
5439 /* Ordinarily don't quit within this function,
5440 but don't make it impossible to quit (in case we get hung in I/O). */
5441 oquit = Vquit_flag;
5442 Vquit_flag = Qnil;
5444 /* No GCPRO needed, because (when it matters) all Lisp_Object variables
5445 point to non-strings reached from Vbuffer_alist. */
5447 hook = intern ("auto-save-hook");
5448 Frun_hooks (1, &hook);
5450 if (STRINGP (Vauto_save_list_file_name))
5452 Lisp_Object listfile;
5454 listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
5456 /* Don't try to create the directory when shutting down Emacs,
5457 because creating the directory might signal an error, and
5458 that would leave Emacs in a strange state. */
5459 if (!NILP (Vrun_hooks))
5461 Lisp_Object dir;
5462 dir = Qnil;
5463 GCPRO2 (dir, listfile);
5464 dir = Ffile_name_directory (listfile);
5465 if (NILP (Ffile_directory_p (dir)))
5466 internal_condition_case_1 (do_auto_save_make_dir,
5467 dir, Qt,
5468 do_auto_save_eh);
5469 UNGCPRO;
5472 stream = fopen (SSDATA (listfile), "w");
5475 record_unwind_protect (do_auto_save_unwind,
5476 make_save_value (stream, 0));
5477 record_unwind_protect (do_auto_save_unwind_1,
5478 make_number (minibuffer_auto_raise));
5479 minibuffer_auto_raise = 0;
5480 auto_saving = 1;
5481 auto_save_error_occurred = 0;
5483 /* On first pass, save all files that don't have handlers.
5484 On second pass, save all files that do have handlers.
5486 If Emacs is crashing, the handlers may tweak what is causing
5487 Emacs to crash in the first place, and it would be a shame if
5488 Emacs failed to autosave perfectly ordinary files because it
5489 couldn't handle some ange-ftp'd file. */
5491 for (do_handled_files = 0; do_handled_files < 2; do_handled_files++)
5492 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
5494 buf = XCDR (XCAR (tail));
5495 b = XBUFFER (buf);
5497 /* Record all the buffers that have auto save mode
5498 in the special file that lists them. For each of these buffers,
5499 Record visited name (if any) and auto save name. */
5500 if (STRINGP (BVAR (b, auto_save_file_name))
5501 && stream != NULL && do_handled_files == 0)
5503 block_input ();
5504 if (!NILP (BVAR (b, filename)))
5506 fwrite (SDATA (BVAR (b, filename)), 1,
5507 SBYTES (BVAR (b, filename)), stream);
5509 putc ('\n', stream);
5510 fwrite (SDATA (BVAR (b, auto_save_file_name)), 1,
5511 SBYTES (BVAR (b, auto_save_file_name)), stream);
5512 putc ('\n', stream);
5513 unblock_input ();
5516 if (!NILP (current_only)
5517 && b != current_buffer)
5518 continue;
5520 /* Don't auto-save indirect buffers.
5521 The base buffer takes care of it. */
5522 if (b->base_buffer)
5523 continue;
5525 /* Check for auto save enabled
5526 and file changed since last auto save
5527 and file changed since last real save. */
5528 if (STRINGP (BVAR (b, auto_save_file_name))
5529 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
5530 && BUF_AUTOSAVE_MODIFF (b) < BUF_MODIFF (b)
5531 /* -1 means we've turned off autosaving for a while--see below. */
5532 && XINT (BVAR (b, save_length)) >= 0
5533 && (do_handled_files
5534 || NILP (Ffind_file_name_handler (BVAR (b, auto_save_file_name),
5535 Qwrite_region))))
5537 EMACS_TIME before_time = current_emacs_time ();
5538 EMACS_TIME after_time;
5540 /* If we had a failure, don't try again for 20 minutes. */
5541 if (b->auto_save_failure_time > 0
5542 && EMACS_SECS (before_time) - b->auto_save_failure_time < 1200)
5543 continue;
5545 set_buffer_internal (b);
5546 if (NILP (Vauto_save_include_big_deletions)
5547 && (XFASTINT (BVAR (b, save_length)) * 10
5548 > (BUF_Z (b) - BUF_BEG (b)) * 13)
5549 /* A short file is likely to change a large fraction;
5550 spare the user annoying messages. */
5551 && XFASTINT (BVAR (b, save_length)) > 5000
5552 /* These messages are frequent and annoying for `*mail*'. */
5553 && !EQ (BVAR (b, filename), Qnil)
5554 && NILP (no_message))
5556 /* It has shrunk too much; turn off auto-saving here. */
5557 minibuffer_auto_raise = orig_minibuffer_auto_raise;
5558 message_with_string ("Buffer %s has shrunk a lot; auto save disabled in that buffer until next real save",
5559 BVAR (b, name), 1);
5560 minibuffer_auto_raise = 0;
5561 /* Turn off auto-saving until there's a real save,
5562 and prevent any more warnings. */
5563 XSETINT (BVAR (b, save_length), -1);
5564 Fsleep_for (make_number (1), Qnil);
5565 continue;
5567 if (!auto_saved && NILP (no_message))
5568 message1 ("Auto-saving...");
5569 internal_condition_case (auto_save_1, Qt, auto_save_error);
5570 auto_saved = 1;
5571 BUF_AUTOSAVE_MODIFF (b) = BUF_MODIFF (b);
5572 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
5573 set_buffer_internal (old);
5575 after_time = current_emacs_time ();
5577 /* If auto-save took more than 60 seconds,
5578 assume it was an NFS failure that got a timeout. */
5579 if (EMACS_SECS (after_time) - EMACS_SECS (before_time) > 60)
5580 b->auto_save_failure_time = EMACS_SECS (after_time);
5584 /* Prevent another auto save till enough input events come in. */
5585 record_auto_save ();
5587 if (auto_saved && NILP (no_message))
5589 if (old_message_p)
5591 /* If we are going to restore an old message,
5592 give time to read ours. */
5593 sit_for (make_number (1), 0, 0);
5594 restore_message ();
5596 else if (!auto_save_error_occurred)
5597 /* Don't overwrite the error message if an error occurred.
5598 If we displayed a message and then restored a state
5599 with no message, leave a "done" message on the screen. */
5600 message1 ("Auto-saving...done");
5603 Vquit_flag = oquit;
5605 /* This restores the message-stack status. */
5606 unbind_to (count, Qnil);
5607 return Qnil;
5610 DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved,
5611 Sset_buffer_auto_saved, 0, 0, 0,
5612 doc: /* Mark current buffer as auto-saved with its current text.
5613 No auto-save file will be written until the buffer changes again. */)
5614 (void)
5616 /* FIXME: This should not be called in indirect buffers, since
5617 they're not autosaved. */
5618 BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
5619 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
5620 current_buffer->auto_save_failure_time = 0;
5621 return Qnil;
5624 DEFUN ("clear-buffer-auto-save-failure", Fclear_buffer_auto_save_failure,
5625 Sclear_buffer_auto_save_failure, 0, 0, 0,
5626 doc: /* Clear any record of a recent auto-save failure in the current buffer. */)
5627 (void)
5629 current_buffer->auto_save_failure_time = 0;
5630 return Qnil;
5633 DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p,
5634 0, 0, 0,
5635 doc: /* Return t if current buffer has been auto-saved recently.
5636 More precisely, if it has been auto-saved since last read from or saved
5637 in the visited file. If the buffer has no visited file,
5638 then any auto-save counts as "recent". */)
5639 (void)
5641 /* FIXME: maybe we should return nil for indirect buffers since
5642 they're never autosaved. */
5643 return (SAVE_MODIFF < BUF_AUTOSAVE_MODIFF (current_buffer) ? Qt : Qnil);
5646 /* Reading and completing file names */
5648 DEFUN ("next-read-file-uses-dialog-p", Fnext_read_file_uses_dialog_p,
5649 Snext_read_file_uses_dialog_p, 0, 0, 0,
5650 doc: /* Return t if a call to `read-file-name' will use a dialog.
5651 The return value is only relevant for a call to `read-file-name' that happens
5652 before any other event (mouse or keypress) is handled. */)
5653 (void)
5655 #if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK) \
5656 || defined (HAVE_NS)
5657 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
5658 && use_dialog_box
5659 && use_file_dialog
5660 && have_menus_p ())
5661 return Qt;
5662 #endif
5663 return Qnil;
5666 Lisp_Object
5667 Fread_file_name (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate)
5669 struct gcpro gcpro1;
5670 Lisp_Object args[7];
5672 GCPRO1 (default_filename);
5673 args[0] = intern ("read-file-name");
5674 args[1] = prompt;
5675 args[2] = dir;
5676 args[3] = default_filename;
5677 args[4] = mustmatch;
5678 args[5] = initial;
5679 args[6] = predicate;
5680 RETURN_UNGCPRO (Ffuncall (7, args));
5684 void
5685 syms_of_fileio (void)
5687 DEFSYM (Qoperations, "operations");
5688 DEFSYM (Qexpand_file_name, "expand-file-name");
5689 DEFSYM (Qsubstitute_in_file_name, "substitute-in-file-name");
5690 DEFSYM (Qdirectory_file_name, "directory-file-name");
5691 DEFSYM (Qfile_name_directory, "file-name-directory");
5692 DEFSYM (Qfile_name_nondirectory, "file-name-nondirectory");
5693 DEFSYM (Qunhandled_file_name_directory, "unhandled-file-name-directory");
5694 DEFSYM (Qfile_name_as_directory, "file-name-as-directory");
5695 DEFSYM (Qcopy_file, "copy-file");
5696 DEFSYM (Qmake_directory_internal, "make-directory-internal");
5697 DEFSYM (Qmake_directory, "make-directory");
5698 DEFSYM (Qdelete_directory_internal, "delete-directory-internal");
5699 DEFSYM (Qdelete_file, "delete-file");
5700 DEFSYM (Qrename_file, "rename-file");
5701 DEFSYM (Qadd_name_to_file, "add-name-to-file");
5702 DEFSYM (Qmake_symbolic_link, "make-symbolic-link");
5703 DEFSYM (Qfile_exists_p, "file-exists-p");
5704 DEFSYM (Qfile_executable_p, "file-executable-p");
5705 DEFSYM (Qfile_readable_p, "file-readable-p");
5706 DEFSYM (Qfile_writable_p, "file-writable-p");
5707 DEFSYM (Qfile_symlink_p, "file-symlink-p");
5708 DEFSYM (Qaccess_file, "access-file");
5709 DEFSYM (Qfile_directory_p, "file-directory-p");
5710 DEFSYM (Qfile_regular_p, "file-regular-p");
5711 DEFSYM (Qfile_accessible_directory_p, "file-accessible-directory-p");
5712 DEFSYM (Qfile_modes, "file-modes");
5713 DEFSYM (Qset_file_modes, "set-file-modes");
5714 DEFSYM (Qset_file_times, "set-file-times");
5715 DEFSYM (Qfile_selinux_context, "file-selinux-context");
5716 DEFSYM (Qset_file_selinux_context, "set-file-selinux-context");
5717 DEFSYM (Qfile_newer_than_file_p, "file-newer-than-file-p");
5718 DEFSYM (Qinsert_file_contents, "insert-file-contents");
5719 DEFSYM (Qwrite_region, "write-region");
5720 DEFSYM (Qverify_visited_file_modtime, "verify-visited-file-modtime");
5721 DEFSYM (Qset_visited_file_modtime, "set-visited-file-modtime");
5722 DEFSYM (Qauto_save_coding, "auto-save-coding");
5724 DEFSYM (Qfile_name_history, "file-name-history");
5725 Fset (Qfile_name_history, Qnil);
5727 DEFSYM (Qfile_error, "file-error");
5728 DEFSYM (Qfile_already_exists, "file-already-exists");
5729 DEFSYM (Qfile_date_error, "file-date-error");
5730 DEFSYM (Qexcl, "excl");
5732 DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system,
5733 doc: /* Coding system for encoding file names.
5734 If it is nil, `default-file-name-coding-system' (which see) is used. */);
5735 Vfile_name_coding_system = Qnil;
5737 DEFVAR_LISP ("default-file-name-coding-system",
5738 Vdefault_file_name_coding_system,
5739 doc: /* Default coding system for encoding file names.
5740 This variable is used only when `file-name-coding-system' is nil.
5742 This variable is set/changed by the command `set-language-environment'.
5743 User should not set this variable manually,
5744 instead use `file-name-coding-system' to get a constant encoding
5745 of file names regardless of the current language environment. */);
5746 Vdefault_file_name_coding_system = Qnil;
5748 DEFSYM (Qformat_decode, "format-decode");
5749 DEFSYM (Qformat_annotate_function, "format-annotate-function");
5750 DEFSYM (Qafter_insert_file_set_coding, "after-insert-file-set-coding");
5751 DEFSYM (Qcar_less_than_car, "car-less-than-car");
5753 Fput (Qfile_error, Qerror_conditions,
5754 Fpurecopy (list2 (Qfile_error, Qerror)));
5755 Fput (Qfile_error, Qerror_message,
5756 build_pure_c_string ("File error"));
5758 Fput (Qfile_already_exists, Qerror_conditions,
5759 Fpurecopy (list3 (Qfile_already_exists, Qfile_error, Qerror)));
5760 Fput (Qfile_already_exists, Qerror_message,
5761 build_pure_c_string ("File already exists"));
5763 Fput (Qfile_date_error, Qerror_conditions,
5764 Fpurecopy (list3 (Qfile_date_error, Qfile_error, Qerror)));
5765 Fput (Qfile_date_error, Qerror_message,
5766 build_pure_c_string ("Cannot set file date"));
5768 DEFVAR_LISP ("file-name-handler-alist", Vfile_name_handler_alist,
5769 doc: /* Alist of elements (REGEXP . HANDLER) for file names handled specially.
5770 If a file name matches REGEXP, all I/O on that file is done by calling
5771 HANDLER. If a file name matches more than one handler, the handler
5772 whose match starts last in the file name gets precedence. The
5773 function `find-file-name-handler' checks this list for a handler for
5774 its argument.
5776 HANDLER should be a function. The first argument given to it is the
5777 name of the I/O primitive to be handled; the remaining arguments are
5778 the arguments that were passed to that primitive. For example, if you
5779 do (file-exists-p FILENAME) and FILENAME is handled by HANDLER, then
5780 HANDLER is called like this:
5782 (funcall HANDLER 'file-exists-p FILENAME)
5784 Note that HANDLER must be able to handle all I/O primitives; if it has
5785 nothing special to do for a primitive, it should reinvoke the
5786 primitive to handle the operation \"the usual way\".
5787 See Info node `(elisp)Magic File Names' for more details. */);
5788 Vfile_name_handler_alist = Qnil;
5790 DEFVAR_LISP ("set-auto-coding-function",
5791 Vset_auto_coding_function,
5792 doc: /* If non-nil, a function to call to decide a coding system of file.
5793 Two arguments are passed to this function: the file name
5794 and the length of a file contents following the point.
5795 This function should return a coding system to decode the file contents.
5796 It should check the file name against `auto-coding-alist'.
5797 If no coding system is decided, it should check a coding system
5798 specified in the heading lines with the format:
5799 -*- ... coding: CODING-SYSTEM; ... -*-
5800 or local variable spec of the tailing lines with `coding:' tag. */);
5801 Vset_auto_coding_function = Qnil;
5803 DEFVAR_LISP ("after-insert-file-functions", Vafter_insert_file_functions,
5804 doc: /* A list of functions to be called at the end of `insert-file-contents'.
5805 Each is passed one argument, the number of characters inserted,
5806 with point at the start of the inserted text. Each function
5807 should leave point the same, and return the new character count.
5808 If `insert-file-contents' is intercepted by a handler from
5809 `file-name-handler-alist', that handler is responsible for calling the
5810 functions in `after-insert-file-functions' if appropriate. */);
5811 Vafter_insert_file_functions = Qnil;
5813 DEFVAR_LISP ("write-region-annotate-functions", Vwrite_region_annotate_functions,
5814 doc: /* A list of functions to be called at the start of `write-region'.
5815 Each is passed two arguments, START and END as for `write-region'.
5816 These are usually two numbers but not always; see the documentation
5817 for `write-region'. The function should return a list of pairs
5818 of the form (POSITION . STRING), consisting of strings to be effectively
5819 inserted at the specified positions of the file being written (1 means to
5820 insert before the first byte written). The POSITIONs must be sorted into
5821 increasing order.
5823 If there are several annotation functions, the lists returned by these
5824 functions are merged destructively. As each annotation function runs,
5825 the variable `write-region-annotations-so-far' contains a list of all
5826 annotations returned by previous annotation functions.
5828 An annotation function can return with a different buffer current.
5829 Doing so removes the annotations returned by previous functions, and
5830 resets START and END to `point-min' and `point-max' of the new buffer.
5832 After `write-region' completes, Emacs calls the function stored in
5833 `write-region-post-annotation-function', once for each buffer that was
5834 current when building the annotations (i.e., at least once), with that
5835 buffer current. */);
5836 Vwrite_region_annotate_functions = Qnil;
5837 DEFSYM (Qwrite_region_annotate_functions, "write-region-annotate-functions");
5839 DEFVAR_LISP ("write-region-post-annotation-function",
5840 Vwrite_region_post_annotation_function,
5841 doc: /* Function to call after `write-region' completes.
5842 The function is called with no arguments. If one or more of the
5843 annotation functions in `write-region-annotate-functions' changed the
5844 current buffer, the function stored in this variable is called for
5845 each of those additional buffers as well, in addition to the original
5846 buffer. The relevant buffer is current during each function call. */);
5847 Vwrite_region_post_annotation_function = Qnil;
5848 staticpro (&Vwrite_region_annotation_buffers);
5850 DEFVAR_LISP ("write-region-annotations-so-far",
5851 Vwrite_region_annotations_so_far,
5852 doc: /* When an annotation function is called, this holds the previous annotations.
5853 These are the annotations made by other annotation functions
5854 that were already called. See also `write-region-annotate-functions'. */);
5855 Vwrite_region_annotations_so_far = Qnil;
5857 DEFVAR_LISP ("inhibit-file-name-handlers", Vinhibit_file_name_handlers,
5858 doc: /* A list of file name handlers that temporarily should not be used.
5859 This applies only to the operation `inhibit-file-name-operation'. */);
5860 Vinhibit_file_name_handlers = Qnil;
5862 DEFVAR_LISP ("inhibit-file-name-operation", Vinhibit_file_name_operation,
5863 doc: /* The operation for which `inhibit-file-name-handlers' is applicable. */);
5864 Vinhibit_file_name_operation = Qnil;
5866 DEFVAR_LISP ("auto-save-list-file-name", Vauto_save_list_file_name,
5867 doc: /* File name in which we write a list of all auto save file names.
5868 This variable is initialized automatically from `auto-save-list-file-prefix'
5869 shortly after Emacs reads your init file, if you have not yet given it
5870 a non-nil value. */);
5871 Vauto_save_list_file_name = Qnil;
5873 DEFVAR_LISP ("auto-save-visited-file-name", Vauto_save_visited_file_name,
5874 doc: /* Non-nil says auto-save a buffer in the file it is visiting, when practical.
5875 Normally auto-save files are written under other names. */);
5876 Vauto_save_visited_file_name = Qnil;
5878 DEFVAR_LISP ("auto-save-include-big-deletions", Vauto_save_include_big_deletions,
5879 doc: /* If non-nil, auto-save even if a large part of the text is deleted.
5880 If nil, deleting a substantial portion of the text disables auto-save
5881 in the buffer; this is the default behavior, because the auto-save
5882 file is usually more useful if it contains the deleted text. */);
5883 Vauto_save_include_big_deletions = Qnil;
5885 #ifdef HAVE_FSYNC
5886 DEFVAR_BOOL ("write-region-inhibit-fsync", write_region_inhibit_fsync,
5887 doc: /* Non-nil means don't call fsync in `write-region'.
5888 This variable affects calls to `write-region' as well as save commands.
5889 A non-nil value may result in data loss! */);
5890 write_region_inhibit_fsync = 0;
5891 #endif
5893 DEFVAR_BOOL ("delete-by-moving-to-trash", delete_by_moving_to_trash,
5894 doc: /* Specifies whether to use the system's trash can.
5895 When non-nil, certain file deletion commands use the function
5896 `move-file-to-trash' instead of deleting files outright.
5897 This includes interactive calls to `delete-file' and
5898 `delete-directory' and the Dired deletion commands. */);
5899 delete_by_moving_to_trash = 0;
5900 Qdelete_by_moving_to_trash = intern_c_string ("delete-by-moving-to-trash");
5902 DEFSYM (Qmove_file_to_trash, "move-file-to-trash");
5903 DEFSYM (Qcopy_directory, "copy-directory");
5904 DEFSYM (Qdelete_directory, "delete-directory");
5906 defsubr (&Sfind_file_name_handler);
5907 defsubr (&Sfile_name_directory);
5908 defsubr (&Sfile_name_nondirectory);
5909 defsubr (&Sunhandled_file_name_directory);
5910 defsubr (&Sfile_name_as_directory);
5911 defsubr (&Sdirectory_file_name);
5912 defsubr (&Smake_temp_name);
5913 defsubr (&Sexpand_file_name);
5914 defsubr (&Ssubstitute_in_file_name);
5915 defsubr (&Scopy_file);
5916 defsubr (&Smake_directory_internal);
5917 defsubr (&Sdelete_directory_internal);
5918 defsubr (&Sdelete_file);
5919 defsubr (&Srename_file);
5920 defsubr (&Sadd_name_to_file);
5921 defsubr (&Smake_symbolic_link);
5922 defsubr (&Sfile_name_absolute_p);
5923 defsubr (&Sfile_exists_p);
5924 defsubr (&Sfile_executable_p);
5925 defsubr (&Sfile_readable_p);
5926 defsubr (&Sfile_writable_p);
5927 defsubr (&Saccess_file);
5928 defsubr (&Sfile_symlink_p);
5929 defsubr (&Sfile_directory_p);
5930 defsubr (&Sfile_accessible_directory_p);
5931 defsubr (&Sfile_regular_p);
5932 defsubr (&Sfile_modes);
5933 defsubr (&Sset_file_modes);
5934 defsubr (&Sset_file_times);
5935 defsubr (&Sfile_selinux_context);
5936 defsubr (&Sset_file_selinux_context);
5937 defsubr (&Sset_default_file_modes);
5938 defsubr (&Sdefault_file_modes);
5939 defsubr (&Sfile_newer_than_file_p);
5940 defsubr (&Sinsert_file_contents);
5941 defsubr (&Swrite_region);
5942 defsubr (&Scar_less_than_car);
5943 defsubr (&Sverify_visited_file_modtime);
5944 defsubr (&Sclear_visited_file_modtime);
5945 defsubr (&Svisited_file_modtime);
5946 defsubr (&Sset_visited_file_modtime);
5947 defsubr (&Sdo_auto_save);
5948 defsubr (&Sset_buffer_auto_saved);
5949 defsubr (&Sclear_buffer_auto_save_failure);
5950 defsubr (&Srecent_auto_save_p);
5952 defsubr (&Snext_read_file_uses_dialog_p);
5954 #ifdef HAVE_SYNC
5955 defsubr (&Sunix_sync);
5956 #endif