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