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