X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/ed68db4d2cf55caf6847151079e1b3861e5d0879..971de7fb158335fbda39525feb2d7776a26bc030:/src/fileio.c diff --git a/src/fileio.c b/src/fileio.c index 4ae74de5c6..c81dc6705c 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -53,10 +53,9 @@ along with GNU Emacs. If not, see . */ #include #include -#ifndef vax11c -#ifndef USE_CRT_DLL -extern int errno; -#endif +#ifdef HAVE_LIBSELINUX +#include +#include #endif #include "lisp.h" @@ -84,10 +83,6 @@ extern int errno; #endif #ifdef DOS_NT -#define CORRECT_DIR_SEPS(s) \ - do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \ - else unixtodos_filename (s); \ - } while (0) /* On Windows, drive letters must be alphabetic - on DOS, the Netware redirector allows the six letters between 'Z' and 'a' as well. */ #ifdef MSDOS @@ -245,15 +240,13 @@ Lisp_Object Qfile_name_history; Lisp_Object Qcar_less_than_car; -static int a_write P_ ((int, Lisp_Object, int, int, - Lisp_Object *, struct coding_system *)); -static int e_write P_ ((int, Lisp_Object, int, int, struct coding_system *)); +static int a_write (int, Lisp_Object, int, int, + Lisp_Object *, struct coding_system *); +static int e_write (int, Lisp_Object, int, int, struct coding_system *); void -report_file_error (string, data) - const char *string; - Lisp_Object data; +report_file_error (const char *string, Lisp_Object data) { Lisp_Object errstring; int errorno = errno; @@ -291,8 +284,7 @@ report_file_error (string, data) } Lisp_Object -close_file_unwind (fd) - Lisp_Object fd; +close_file_unwind (Lisp_Object fd) { emacs_close (XFASTINT (fd)); return Qnil; @@ -300,9 +292,8 @@ close_file_unwind (fd) /* Restore point, having saved it as a marker. */ -static Lisp_Object -restore_point_unwind (location) - Lisp_Object location; +Lisp_Object +restore_point_unwind (Lisp_Object location) { Fgoto_char (location); Fset_marker (location, Qnil, Qnil); @@ -337,6 +328,8 @@ Lisp_Object Qfile_accessible_directory_p; Lisp_Object Qfile_modes; Lisp_Object Qset_file_modes; Lisp_Object Qset_file_times; +Lisp_Object Qfile_selinux_context; +Lisp_Object Qset_file_selinux_context; Lisp_Object Qfile_newer_than_file_p; Lisp_Object Qinsert_file_contents; Lisp_Object Qwrite_region; @@ -473,7 +466,7 @@ Given a Unix syntax file name, returns a string ending in slash. */) p = beg + strlen (beg); } } - CORRECT_DIR_SEPS (beg); + dostounix_filename (beg); #endif /* DOS_NT */ return make_specified_string (beg, -1, p - beg, STRING_MULTIBYTE (filename)); @@ -542,8 +535,7 @@ get a current directory to run processes in. */) char * -file_name_as_directory (out, in) - char *out, *in; +file_name_as_directory (char *out, char *in) { int size = strlen (in) - 1; @@ -560,12 +552,11 @@ file_name_as_directory (out, in) /* For Unix syntax, Append a slash if necessary */ if (!IS_DIRECTORY_SEP (out[size])) { - /* Cannot use DIRECTORY_SEP, which could have any value */ - out[size + 1] = '/'; + out[size + 1] = DIRECTORY_SEP; out[size + 2] = '\0'; } #ifdef DOS_NT - CORRECT_DIR_SEPS (out); + dostounix_filename (out); #endif return out; } @@ -608,8 +599,7 @@ For a Unix-syntax file name, just appends a slash. */) */ int -directory_file_name (src, dst) - char *src, *dst; +directory_file_name (char *src, char *dst) { long slen; @@ -626,7 +616,7 @@ directory_file_name (src, dst) ) dst[slen - 1] = 0; #ifdef DOS_NT - CORRECT_DIR_SEPS (dst); + dostounix_filename (dst); #endif return 1; } @@ -692,9 +682,7 @@ static unsigned make_temp_name_count, make_temp_name_count_initialized_p; generated. */ Lisp_Object -make_temp_name (prefix, base64_p) - Lisp_Object prefix; - int base64_p; +make_temp_name (Lisp_Object prefix, int base64_p) { Lisp_Object val; int len, clen; @@ -1031,10 +1019,9 @@ filesystem tree, not (expand-file-name ".." dirname). */) if (!lose) { #ifdef DOS_NT - /* Make sure directories are all separated with / or \ as - desired, but avoid allocation of a new string when not - required. */ - CORRECT_DIR_SEPS (nm); + /* Make sure directories are all separated with /, but + avoid allocation of a new string when not required. */ + dostounix_filename (nm); #ifdef WINDOWSNT if (IS_DIRECTORY_SEP (nm[1])) { @@ -1380,7 +1367,7 @@ filesystem tree, not (expand-file-name ".." dirname). */) target[0] = '/'; target[1] = ':'; } - CORRECT_DIR_SEPS (target); + dostounix_filename (target); #endif /* DOS_NT */ result = make_specified_string (target, -1, o - target, multibyte); @@ -1563,8 +1550,7 @@ See also the function `substitute-in-file-name'.") /* If /~ or // appears, discard everything through first slash. */ static int -file_name_absolute_p (filename) - const unsigned char *filename; +file_name_absolute_p (const unsigned char *filename) { return (IS_DIRECTORY_SEP (*filename) || *filename == '~' @@ -1576,8 +1562,7 @@ file_name_absolute_p (filename) } static unsigned char * -search_embedded_absfilename (nm, endp) - unsigned char *nm, *endp; +search_embedded_absfilename (unsigned char *nm, unsigned char *endp) { unsigned char *p, *s; @@ -1658,7 +1643,7 @@ those `/' is discarded. */) bcopy (SDATA (filename), nm, SBYTES (filename) + 1); #ifdef DOS_NT - CORRECT_DIR_SEPS (nm); + dostounix_filename (nm); substituted = (strcmp (nm, SDATA (filename)) != 0); #endif endp = nm + SBYTES (filename); @@ -1828,8 +1813,7 @@ those `/' is discarded. */) (directory-file-name (expand-file-name FOO)). */ Lisp_Object -expand_and_dir_to_file (filename, defdir) - Lisp_Object filename, defdir; +expand_and_dir_to_file (Lisp_Object filename, Lisp_Object defdir) { register Lisp_Object absname; @@ -1858,12 +1842,7 @@ expand_and_dir_to_file (filename, defdir) If QUICK is nonzero, we ask for y or n, not yes or no. */ void -barf_or_query_if_file_exists (absname, querystring, interactive, statptr, quick) - Lisp_Object absname; - unsigned char *querystring; - int interactive; - struct stat *statptr; - int quick; +barf_or_query_if_file_exists (Lisp_Object absname, unsigned char *querystring, int interactive, struct stat *statptr, int quick) { register Lisp_Object tem, encoded_filename; struct stat statbuf; @@ -1900,7 +1879,7 @@ barf_or_query_if_file_exists (absname, querystring, interactive, statptr, quick) return; } -DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 5, +DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 6, "fCopy file: \nGCopy %s to file: \np\nP", doc: /* Copy FILE to NEWNAME. Both args must be strings. If NEWNAME names a directory, copy FILE there. @@ -1922,10 +1901,13 @@ last-modified time as the old one. (This works on only some systems.) A prefix arg makes KEEP-TIME non-nil. If PRESERVE-UID-GID is non-nil, we try to transfer the -uid and gid of FILE to NEWNAME. */) - (file, newname, ok_if_already_exists, keep_time, preserve_uid_gid) +uid and gid of FILE to NEWNAME. + +If PRESERVE-SELINUX-CONTEXT is non-nil and SELinux is enabled +on the system, we copy the SELinux context of FILE to NEWNAME. */) + (file, newname, ok_if_already_exists, keep_time, preserve_uid_gid, preserve_selinux_context) Lisp_Object file, newname, ok_if_already_exists, keep_time; - Lisp_Object preserve_uid_gid; + Lisp_Object preserve_uid_gid, preserve_selinux_context; { int ifd, ofd, n; char buf[16 * 1024]; @@ -1935,6 +1917,10 @@ uid and gid of FILE to NEWNAME. */) int count = SPECPDL_INDEX (); int input_file_statable_p; Lisp_Object encoded_file, encoded_newname; +#if HAVE_LIBSELINUX + security_context_t con; + int fail, conlength = 0; +#endif encoded_file = encoded_newname = Qnil; GCPRO4 (file, newname, encoded_file, encoded_newname); @@ -1955,8 +1941,9 @@ uid and gid of FILE to NEWNAME. */) if (NILP (handler)) handler = Ffind_file_name_handler (newname, Qcopy_file); if (!NILP (handler)) - RETURN_UNGCPRO (call6 (handler, Qcopy_file, file, newname, - ok_if_already_exists, keep_time, preserve_uid_gid)); + RETURN_UNGCPRO (call7 (handler, Qcopy_file, file, newname, + ok_if_already_exists, keep_time, preserve_uid_gid, + preserve_selinux_context)); encoded_file = ENCODE_FILE (file); encoded_newname = ENCODE_FILE (newname); @@ -2010,6 +1997,15 @@ uid and gid of FILE to NEWNAME. */) copyable by us. */ input_file_statable_p = (fstat (ifd, &st) >= 0); +#if HAVE_LIBSELINUX + if (!NILP (preserve_selinux_context) && is_selinux_enabled ()) + { + conlength = fgetfilecon (ifd, &con); + if (conlength == -1) + report_file_error ("Doing fgetfilecon", Fcons (file, Qnil)); + } +#endif + if (out_st.st_mode != 0 && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino) { @@ -2067,6 +2063,18 @@ uid and gid of FILE to NEWNAME. */) } #endif /* not MSDOS */ +#if HAVE_LIBSELINUX + if (conlength > 0) + { + /* Set the modified context back to the file. */ + fail = fsetfilecon (ofd, con); + if (fail) + report_file_error ("Doing fsetfilecon", Fcons (newname, Qnil)); + + freecon (con); + } +#endif + /* Closing the output clobbers the file times on some systems. */ if (emacs_close (ofd) < 0) report_file_error ("I/O error", Fcons (newname, Qnil)); @@ -2150,12 +2158,7 @@ DEFUN ("delete-directory-internal", Fdelete_directory_internal, CHECK_STRING (directory); directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil)); - - if (delete_by_moving_to_trash) - return call1 (Qmove_file_to_trash, directory); - encoded_dir = ENCODE_FILE (directory); - dir = SDATA (encoded_dir); if (rmdir (dir) != 0) @@ -2164,11 +2167,22 @@ DEFUN ("delete-directory-internal", Fdelete_directory_internal, return Qnil; } -DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 1, "fDelete file: ", +DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 2, + "(list (read-file-name \ + (if (and delete-by-moving-to-trash (null current-prefix-arg)) \ + \"Move file to trash: \" \"Delete file: \") \ + nil default-directory (confirm-nonexistent-file-or-buffer)) \ + (null current-prefix-arg))", doc: /* Delete file named FILENAME. If it is a symlink, remove the symlink. -If file has multiple names, it continues to exist with the other names. */) - (filename) +If file has multiple names, it continues to exist with the other names. +TRASH non-nil means to trash the file instead of deleting, provided +`delete-by-moving-to-trash' is non-nil. + +When called interactively, TRASH is t if no prefix argument is given. +With a prefix argument, TRASH is nil. */) + (filename, trash) Lisp_Object filename; + Lisp_Object trash; { Lisp_Object handler; Lisp_Object encoded_file; @@ -2185,9 +2199,9 @@ If file has multiple names, it continues to exist with the other names. */) handler = Ffind_file_name_handler (filename, Qdelete_file); if (!NILP (handler)) - return call2 (handler, Qdelete_file, filename); + return call3 (handler, Qdelete_file, filename, trash); - if (delete_by_moving_to_trash) + if (delete_by_moving_to_trash && !NILP (trash)) return call1 (Qmove_file_to_trash, filename); encoded_file = ENCODE_FILE (filename); @@ -2198,20 +2212,20 @@ If file has multiple names, it continues to exist with the other names. */) } static Lisp_Object -internal_delete_file_1 (ignore) - Lisp_Object ignore; +internal_delete_file_1 (Lisp_Object ignore) { return Qt; } -/* Delete file FILENAME, returning 1 if successful and 0 if failed. */ +/* Delete file FILENAME, returning 1 if successful and 0 if failed. + This ignores `delete-by-moving-to-trash'. */ int -internal_delete_file (filename) - Lisp_Object filename; +internal_delete_file (Lisp_Object filename) { Lisp_Object tem; - tem = internal_condition_case_1 (Fdelete_file, filename, + + tem = internal_condition_case_2 (Fdelete_file, filename, Qnil, Qt, internal_delete_file_1); return NILP (tem); } @@ -2293,7 +2307,7 @@ This is what happens in interactive use with M-x. */) have copy-file prompt again. */ Fcopy_file (file, newname, NILP (ok_if_already_exists) ? Qnil : Qt, - Qt, Qt); + Qt, Qt, Qt); count = SPECPDL_INDEX (); specbind (Qdelete_by_moving_to_trash, Qnil); @@ -2305,7 +2319,7 @@ This is what happens in interactive use with M-x. */) ) call2 (Qdelete_directory, file, Qt); else - Fdelete_file (file); + Fdelete_file (file, Qnil); unbind_to (count, Qnil); } else @@ -2464,8 +2478,7 @@ On Unix, this is a name starting with a `/' or a `~'. */) /* Return nonzero if file FILENAME exists and can be executed. */ static int -check_executable (filename) - char *filename; +check_executable (char *filename) { #ifdef DOS_NT int len = strlen (filename); @@ -2489,8 +2502,7 @@ check_executable (filename) /* Return nonzero if file FILENAME exists and can be written. */ static int -check_writable (filename) - char *filename; +check_writable (char *filename) { #ifdef MSDOS struct stat st; @@ -2850,6 +2862,140 @@ See `file-symlink-p' to distinguish symlinks. */) #endif } +DEFUN ("file-selinux-context", Ffile_selinux_context, + Sfile_selinux_context, 1, 1, 0, + doc: /* Return SELinux context of file named FILENAME, +as a list ("user", "role", "type", "range"). Return (nil, nil, nil, nil) +if file does not exist, is not accessible, or SELinux is disabled */) + (filename) + Lisp_Object filename; +{ + Lisp_Object absname; + Lisp_Object values[4]; + Lisp_Object handler; +#if HAVE_LIBSELINUX + security_context_t con; + int conlength; + context_t context; +#endif + + absname = expand_and_dir_to_file (filename, current_buffer->directory); + + /* If the file name has special constructs in it, + call the corresponding file handler. */ + handler = Ffind_file_name_handler (absname, Qfile_selinux_context); + if (!NILP (handler)) + return call2 (handler, Qfile_selinux_context, absname); + + absname = ENCODE_FILE (absname); + + values[0] = Qnil; + values[1] = Qnil; + values[2] = Qnil; + values[3] = Qnil; +#if HAVE_LIBSELINUX + if (is_selinux_enabled ()) + { + conlength = lgetfilecon (SDATA (absname), &con); + if (conlength > 0) + { + context = context_new (con); + if (context_user_get (context)) + values[0] = build_string (context_user_get (context)); + if (context_role_get (context)) + values[1] = build_string (context_role_get (context)); + if (context_type_get (context)) + values[2] = build_string (context_type_get (context)); + if (context_range_get (context)) + values[3] = build_string (context_range_get (context)); + context_free (context); + } + if (con) + freecon (con); + } +#endif + + return Flist (sizeof(values) / sizeof(values[0]), values); +} + +DEFUN ("set-file-selinux-context", Fset_file_selinux_context, + Sset_file_selinux_context, 2, 2, 0, + doc: /* Set SELinux context of file named FILENAME to CONTEXT +as a list ("user", "role", "type", "range"). Has no effect if SELinux +is disabled. */) + (filename, context) + Lisp_Object filename, context; +{ + Lisp_Object absname, encoded_absname; + Lisp_Object handler; + Lisp_Object user = CAR_SAFE (context); + Lisp_Object role = CAR_SAFE (CDR_SAFE (context)); + Lisp_Object type = CAR_SAFE (CDR_SAFE (CDR_SAFE (context))); + Lisp_Object range = CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (context)))); +#if HAVE_LIBSELINUX + security_context_t con; + int fail, conlength; + context_t parsed_con; +#endif + + absname = Fexpand_file_name (filename, current_buffer->directory); + + /* If the file name has special constructs in it, + call the corresponding file handler. */ + handler = Ffind_file_name_handler (absname, Qset_file_selinux_context); + if (!NILP (handler)) + return call3 (handler, Qset_file_selinux_context, absname, context); + + encoded_absname = ENCODE_FILE (absname); + +#if HAVE_LIBSELINUX + if (is_selinux_enabled ()) + { + /* Get current file context. */ + conlength = lgetfilecon (SDATA (encoded_absname), &con); + if (conlength > 0) + { + parsed_con = context_new (con); + /* Change the parts defined in the parameter.*/ + if (STRINGP (user)) + { + if (context_user_set (parsed_con, SDATA (user))) + error ("Doing context_user_set"); + } + if (STRINGP (role)) + { + if (context_role_set (parsed_con, SDATA (role))) + error ("Doing context_role_set"); + } + if (STRINGP (type)) + { + if (context_type_set (parsed_con, SDATA (type))) + error ("Doing context_type_set"); + } + if (STRINGP (range)) + { + if (context_range_set (parsed_con, SDATA (range))) + error ("Doing context_range_set"); + } + + /* Set the modified context back to the file. */ + fail = lsetfilecon (SDATA (encoded_absname), context_str (parsed_con)); + if (fail) + report_file_error ("Doing lsetfilecon", Fcons (absname, Qnil)); + + context_free (parsed_con); + } + else + report_file_error("Doing lgetfilecon", Fcons (absname, Qnil)); + + if (con) + freecon (con); + } +#endif + + return Qnil; +} + DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0, doc: /* Return mode bits of file named FILENAME, as an integer. Return nil, if file does not exist or is not accessible. */) @@ -2936,7 +3082,7 @@ The value is an integer. */) return value; } -extern int lisp_time_argument P_ ((Lisp_Object, time_t *, int *)); +extern int lisp_time_argument (Lisp_Object, time_t *, int *); DEFUN ("set-file-times", Fset_file_times, Sset_file_times, 1, 2, 0, doc: /* Set times of file FILENAME to TIME. @@ -3070,8 +3216,7 @@ Lisp_Object Qfind_buffer_file_type; o set back the buffer multibyteness. */ static Lisp_Object -decide_coding_unwind (unwind_data) - Lisp_Object unwind_data; +decide_coding_unwind (Lisp_Object unwind_data) { Lisp_Object multibyte, undo_list, buffer; @@ -3108,7 +3253,7 @@ static EMACS_INT non_regular_nbytes; Value is the number of bytes read. */ static Lisp_Object -read_non_regular () +read_non_regular (void) { EMACS_INT nbytes; @@ -3126,7 +3271,7 @@ read_non_regular () in insert-file-contents. */ static Lisp_Object -read_non_regular_quit () +read_non_regular_quit (void) { return Qnil; } @@ -4098,6 +4243,7 @@ variable `last-coding-system-used' to the coding system actually used. */) if (NILP (handler)) { current_buffer->modtime = st.st_mtime; + current_buffer->modtime_size = st.st_size; current_buffer->filename = orig_filename; } @@ -4279,11 +4425,10 @@ variable `last-coding-system-used' to the coding system actually used. */) RETURN_UNGCPRO (unbind_to (count, val)); } -static Lisp_Object build_annotations P_ ((Lisp_Object, Lisp_Object)); +static Lisp_Object build_annotations (Lisp_Object, Lisp_Object); static Lisp_Object -build_annotations_unwind (arg) - Lisp_Object arg; +build_annotations_unwind (Lisp_Object arg) { Vwrite_region_annotation_buffers = arg; return Qnil; @@ -4701,7 +4846,10 @@ This calls `write-region-annotate-functions' at the start, and to avoid a "file has changed on disk" warning on next attempt to save. */ if (visiting) - current_buffer->modtime = st.st_mtime; + { + current_buffer->modtime = st.st_mtime; + current_buffer->modtime_size = st.st_size; + } if (failure) error ("IO error writing %s: %s", SDATA (filename), @@ -4754,8 +4902,7 @@ DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0, as save-excursion would do. */ static Lisp_Object -build_annotations (start, end) - Lisp_Object start, end; +build_annotations (Lisp_Object start, Lisp_Object end) { Lisp_Object annotations; Lisp_Object p, res; @@ -4844,13 +4991,7 @@ build_annotations (start, end) The return value is negative in case of system call failure. */ static int -a_write (desc, string, pos, nchars, annot, coding) - int desc; - Lisp_Object string; - register int nchars; - int pos; - Lisp_Object *annot; - struct coding_system *coding; +a_write (int desc, Lisp_Object string, int pos, register int nchars, Lisp_Object *annot, struct coding_system *coding) { Lisp_Object tem; int nextpos; @@ -4894,11 +5035,7 @@ a_write (desc, string, pos, nchars, annot, coding) are indexes to the string STRING. */ static int -e_write (desc, string, start, end, coding) - int desc; - Lisp_Object string; - int start, end; - struct coding_system *coding; +e_write (int desc, Lisp_Object string, int start, int end, struct coding_system *coding) { if (STRINGP (string)) { @@ -5010,11 +5147,13 @@ See Info node `(elisp)Modification Time' for more details. */) else st.st_mtime = 0; } - if (st.st_mtime == b->modtime - /* If both are positive, accept them if they are off by one second. */ - || (st.st_mtime > 0 && b->modtime > 0 - && (st.st_mtime == b->modtime + 1 - || st.st_mtime == b->modtime - 1))) + if ((st.st_mtime == b->modtime + /* If both are positive, accept them if they are off by one second. */ + || (st.st_mtime > 0 && b->modtime > 0 + && (st.st_mtime == b->modtime + 1 + || st.st_mtime == b->modtime - 1))) + && (st.st_size == b->modtime_size + || b->modtime_size < 0)) return Qt; return Qnil; } @@ -5026,6 +5165,7 @@ Next attempt to save will certainly not complain of a discrepancy. */) () { current_buffer->modtime = 0; + current_buffer->modtime_size = -1; return Qnil; } @@ -5055,7 +5195,10 @@ An argument specifies the modification time value to use Lisp_Object time_list; { if (!NILP (time_list)) - current_buffer->modtime = cons_to_long (time_list); + { + current_buffer->modtime = cons_to_long (time_list); + current_buffer->modtime_size = -1; + } else { register Lisp_Object filename; @@ -5074,15 +5217,17 @@ An argument specifies the modification time value to use filename = ENCODE_FILE (filename); if (stat (SDATA (filename), &st) >= 0) - current_buffer->modtime = st.st_mtime; + { + current_buffer->modtime = st.st_mtime; + current_buffer->modtime_size = st.st_size; + } } return Qnil; } Lisp_Object -auto_save_error (error) - Lisp_Object error; +auto_save_error (Lisp_Object error) { Lisp_Object args[3], msg; int i, nbytes; @@ -5118,7 +5263,7 @@ auto_save_error (error) } Lisp_Object -auto_save_1 () +auto_save_1 (void) { struct stat st; Lisp_Object modes; @@ -5144,8 +5289,8 @@ auto_save_1 () } static Lisp_Object -do_auto_save_unwind (arg) /* used as unwind-protect function */ - Lisp_Object arg; +do_auto_save_unwind (Lisp_Object arg) /* used as unwind-protect function */ + { FILE *stream = (FILE *) XSAVE_VALUE (arg)->pointer; auto_saving = 0; @@ -5159,16 +5304,15 @@ do_auto_save_unwind (arg) /* used as unwind-protect function */ } static Lisp_Object -do_auto_save_unwind_1 (value) /* used as unwind-protect function */ - Lisp_Object value; +do_auto_save_unwind_1 (Lisp_Object value) /* used as unwind-protect function */ + { minibuffer_auto_raise = XINT (value); return Qnil; } static Lisp_Object -do_auto_save_make_dir (dir) - Lisp_Object dir; +do_auto_save_make_dir (Lisp_Object dir) { Lisp_Object mode; @@ -5178,8 +5322,7 @@ do_auto_save_make_dir (dir) } static Lisp_Object -do_auto_save_eh (ignore) - Lisp_Object ignore; +do_auto_save_eh (Lisp_Object ignore) { return Qnil; } @@ -5449,8 +5592,7 @@ before any other event (mouse or keypress) is handled. */) } Lisp_Object -Fread_file_name (prompt, dir, default_filename, mustmatch, initial, predicate) - Lisp_Object prompt, dir, default_filename, mustmatch, initial, predicate; +Fread_file_name (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate) { struct gcpro gcpro1, gcpro2; Lisp_Object args[7]; @@ -5468,7 +5610,7 @@ Fread_file_name (prompt, dir, default_filename, mustmatch, initial, predicate) void -syms_of_fileio () +syms_of_fileio (void) { Qoperations = intern_c_string ("operations"); Qexpand_file_name = intern_c_string ("expand-file-name"); @@ -5498,6 +5640,8 @@ syms_of_fileio () Qfile_modes = intern_c_string ("file-modes"); Qset_file_modes = intern_c_string ("set-file-modes"); Qset_file_times = intern_c_string ("set-file-times"); + Qfile_selinux_context = intern_c_string("file-selinux-context"); + Qset_file_selinux_context = intern_c_string("set-file-selinux-context"); Qfile_newer_than_file_p = intern_c_string ("file-newer-than-file-p"); Qinsert_file_contents = intern_c_string ("insert-file-contents"); Qwrite_region = intern_c_string ("write-region"); @@ -5533,6 +5677,8 @@ syms_of_fileio () staticpro (&Qfile_modes); staticpro (&Qset_file_modes); staticpro (&Qset_file_times); + staticpro (&Qfile_selinux_context); + staticpro (&Qset_file_selinux_context); staticpro (&Qfile_newer_than_file_p); staticpro (&Qinsert_file_contents); staticpro (&Qwrite_region); @@ -5599,11 +5745,6 @@ of file names regardless of the current language environment. */); Fput (Qfile_date_error, Qerror_message, make_pure_c_string ("Cannot set file date")); - DEFVAR_LISP ("directory-sep-char", &Vdirectory_sep_char, - doc: /* Directory separator character for built-in functions that return file names. -The value is always ?/. Don't use this variable, just use `/'. */); - XSETFASTINT (Vdirectory_sep_char, '/'); - DEFVAR_LISP ("file-name-handler-alist", &Vfile_name_handler_alist, doc: /* *Alist of elements (REGEXP . HANDLER) for file names handled specially. If a file name matches REGEXP, then all I/O on that file is done by calling @@ -5726,8 +5867,10 @@ A non-nil value may result in data loss! */); DEFVAR_BOOL ("delete-by-moving-to-trash", &delete_by_moving_to_trash, doc: /* Specifies whether to use the system's trash can. -When non-nil, the function `move-file-to-trash' will be used by -`delete-file' and `delete-directory'. */); +When non-nil, certain file deletion commands use the function +`move-file-to-trash' instead of deleting files outright. +This includes interactive calls to `delete-file' and +`delete-directory' and the Dired deletion commands. */); delete_by_moving_to_trash = 0; Qdelete_by_moving_to_trash = intern_c_string ("delete-by-moving-to-trash"); Qmove_file_to_trash = intern_c_string ("move-file-to-trash"); @@ -5766,6 +5909,8 @@ When non-nil, the function `move-file-to-trash' will be used by defsubr (&Sfile_modes); defsubr (&Sset_file_modes); defsubr (&Sset_file_times); + defsubr (&Sfile_selinux_context); + defsubr (&Sset_file_selinux_context); defsubr (&Sset_default_file_modes); defsubr (&Sdefault_file_modes); defsubr (&Sfile_newer_than_file_p);