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