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