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