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