diff src/fileio.c @ 49207:0064f690e77d

(Fdelete_directory, Fdelete_file): Document the behaviour in front of symlinks. (Fdelete_file): Raise an error on directories.
author Francesco Potortì <pot@gnu.org>
date Mon, 13 Jan 2003 22:17:01 +0000
parents 9b836b1dabe5
children 2cbb0b823e83
line wrap: on
line diff
--- a/src/fileio.c	Mon Jan 13 16:44:07 2003 +0000
+++ b/src/fileio.c	Mon Jan 13 22:17:01 2003 +0000
@@ -188,7 +188,7 @@
 Lisp_Object Vauto_save_list_file_name;
 
 /* Function to call to read a file name.  */
-Lisp_Object Vread_file_name_function; 
+Lisp_Object Vread_file_name_function;
 
 /* Current predicate used by read_file_name_internal.  */
 Lisp_Object Vread_file_name_predicate;
@@ -849,13 +849,13 @@
 static unsigned make_temp_name_count, make_temp_name_count_initialized_p;
 
 /* Value is a temporary file name starting with PREFIX, a string.
-   
+
    The Emacs process number forms part of the result, so there is
    no danger of generating a name being used by another process.
    In addition, this function makes an attempt to choose a name
    which has no existing file.  To make this work, PREFIX should be
    an absolute file name.
-   
+
    BASE64_P non-zero means add the pid as 3 characters in base64
    encoding.  In this case, 6 characters will be added to PREFIX to
    form the file name.  Otherwise, if Emacs is running on a system
@@ -875,7 +875,7 @@
   unsigned char *p, *data;
   char pidbuf[20];
   int pidlen;
-     
+
   CHECK_STRING (prefix);
 
   /* VAL is created by adding 6 characters to PREFIX.  The first
@@ -904,7 +904,7 @@
       pidlen = 3;
 #endif
     }
-  
+
   len = SCHARS (prefix);
   val = make_uninit_string (len + 3 + pidlen);
   data = SDATA (val);
@@ -1195,7 +1195,7 @@
 		   && IS_DIRECTORY_SEP (p[0])
 		   && IS_DIRECTORY_SEP (p[1]))
 	    lose = 1;
-	  
+
 #ifdef VMS
 	  if (p[0] == '\\')
 	    lose = 1;
@@ -1538,7 +1538,7 @@
 	     absolute directory in nm produces "//", which will then be
 	     incorrectly treated as a network share.  Ignore newdir in
 	     this case (keeping the drive letter).  */
-	  if (!(drive && nm[0] && IS_DIRECTORY_SEP (newdir[0]) 
+	  if (!(drive && nm[0] && IS_DIRECTORY_SEP (newdir[0])
 		&& newdir[1] == '\0'))
 #endif
 	    strcpy (target, newdir);
@@ -2402,7 +2402,7 @@
 
 #ifdef WINDOWSNT
   if (!CopyFile (SDATA (encoded_file),
-		 SDATA (encoded_newname), 
+		 SDATA (encoded_newname),
 		 FALSE))
     report_file_error ("Copying file", Fcons (file, Fcons (newname, Qnil)));
   else if (!NILP (keep_time))
@@ -2562,7 +2562,7 @@
 }
 
 DEFUN ("delete-directory", Fdelete_directory, Sdelete_directory, 1, 1, "FDelete directory: ",
-       doc: /* Delete the directory named DIRECTORY.  */)
+       doc: /* Delete the directory named DIRECTORY.  Does not follow symlinks.  */)
      (directory)
      Lisp_Object directory;
 {
@@ -2588,15 +2588,21 @@
 }
 
 DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 1, "fDelete file: ",
-       doc: /* Delete file named FILENAME.
+       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)
      Lisp_Object filename;
 {
   Lisp_Object handler;
   Lisp_Object encoded_file;
-
-  CHECK_STRING (filename);
+  struct gcpro gcpro1;
+
+  GCPRO1 (filename);
+  if (!NILP (Ffile_directory_p (filename)))
+    Fsignal (Qfile_error,
+ 	     Fcons (build_string ("Removing old name: is a directory"),
+ 		    Fcons (filename, Qnil)));
+  UNGCPRO;
   filename = Fexpand_file_name (filename, Qnil);
 
   handler = Ffind_file_name_handler (filename, Qdelete_file);
@@ -3186,7 +3192,7 @@
       bufsize *= 2;
       buf = (char *) xrealloc (buf, bufsize);
       bzero (buf, bufsize);
-      
+
       errno = 0;
       valsize = readlink (SDATA (filename), buf, bufsize);
       if (valsize == -1)
@@ -3204,7 +3210,7 @@
 	}
     }
   while (valsize >= bufsize);
-  
+
   val = make_string (buf, valsize);
   if (buf[0] == '/' && index (buf, ':'))
     val = concat2 (build_string ("/:"), val);
@@ -3524,7 +3530,7 @@
 read_non_regular ()
 {
   int nbytes;
-  
+
   immediate_quit = 1;
   QUIT;
   nbytes = emacs_read (non_regular_fd,
@@ -3790,7 +3796,7 @@
 		  buf->undo_list = Qt;
 		  buf->overlays_before = Qnil;
 		  buf->overlays_after = Qnil;
-		  
+
 		  set_buffer_internal (buf);
 		  Ferase_buffer ();
 		  buf->enable_multibyte_characters = Qnil;
@@ -3800,7 +3806,7 @@
 		  val = call2 (Vset_auto_coding_function,
 			       filename, make_number (nread));
 		  set_buffer_internal (prev);
-		  
+
 		  /* Discard the unwind protect for recovering the
                      current buffer.  */
 		  specpdl_ptr--;
@@ -3965,11 +3971,11 @@
 		break;
 	      total_read += nread;
 	    }
-	  
+
 	  /* Scan this bufferful from the end, comparing with
 	     the Emacs buffer.  */
 	  bufpos = total_read;
-	  
+
 	  /* Compare with same_at_start to avoid counting some buffer text
 	     as matching both at the file's beginning and at the end.  */
 	  while (bufpos > 0 && same_at_end > same_at_start
@@ -4226,7 +4232,7 @@
       if (coding.cmp_data && coding.cmp_data->used)
 	coding_restore_composition (&coding, Fcurrent_buffer ());
       coding_free_composition_data (&coding);
-  
+
       /* Set `inserted' to the number of inserted characters.  */
       inserted = PT - temp;
 
@@ -4271,15 +4277,15 @@
      before exiting the loop, it is set to a negative value if I/O
      error occurs.  */
   how_much = 0;
-  
+
   /* Total bytes inserted.  */
   inserted = 0;
-  
+
   /* Here, we don't do code conversion in the loop.  It is done by
      code_convert_region after all data are read into the buffer.  */
   {
     int gap_size = GAP_SIZE;
-    
+
     while (how_much < total)
       {
 	/* try is reserved in some compilers (Microsoft C) */
@@ -4323,7 +4329,7 @@
 	    this = emacs_read (fd, BEG_ADDR + PT_BYTE - BEG_BYTE + inserted, trytry);
 	    immediate_quit = 0;
 	  }
-      
+
 	if (this <= 0)
 	  {
 	    how_much = this;
@@ -4471,7 +4477,7 @@
   /* Use the conversion type to determine buffer-file-type
      (find-buffer-file-type is now used to help determine the
      conversion).  */
-  if ((coding.eol_type == CODING_EOL_UNDECIDED 
+  if ((coding.eol_type == CODING_EOL_UNDECIDED
        || coding.eol_type == CODING_EOL_LF)
       && ! CODING_REQUIRE_DECODING (&coding))
     current_buffer->buffer_file_type = Qt;
@@ -4516,7 +4522,7 @@
   if (inserted > 0)
     {
       int empty_undo_list_p = 0;
-      
+
       /* If we're anyway going to discard undo information, don't
 	 record it in the first place.  The buffer's undo list at this
 	 point is either nil or t when visiting a file.  */
@@ -4525,12 +4531,12 @@
 	  empty_undo_list_p = NILP (current_buffer->undo_list);
 	  current_buffer->undo_list = Qt;
 	}
-	  
+
       insval = call3 (Qformat_decode,
 		      Qnil, make_number (inserted), visit);
       CHECK_NUMBER (insval);
       inserted = XFASTINT (insval);
-      
+
       if (!NILP (visit))
 	current_buffer->undo_list = empty_undo_list_p ? Qnil : Qt;
     }
@@ -4649,7 +4655,7 @@
 	  if (NILP (current_buffer->enable_multibyte_characters))
 	    force_raw_text = 1;
 	}
-	
+
       if (NILP (val))
 	{
 	  /* Check file-coding-system-alist.  */
@@ -4671,7 +4677,7 @@
 	  val = current_buffer->buffer_file_coding_system;
 	  using_default_coding = 1;
 	}
-	    
+
       if (!force_raw_text
 	  && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
 	/* Confirm that VAL can surely encode the current region.  */
@@ -4965,7 +4971,7 @@
   if (!NILP (append) && !NILP (Ffile_regular_p (filename)))
     {
       long ret;
-      
+
       if (NUMBERP (append))
 	ret = lseek (desc, XINT (append), 1);
       else
@@ -4979,7 +4985,7 @@
 	  report_file_error ("Lseek error", Fcons (filename, Qnil));
 	}
     }
-  
+
   UNGCPRO;
 
 #ifdef VMS
@@ -5211,7 +5217,7 @@
   for (i = 0; CONSP (p); p = XCDR (p), ++i)
     {
       struct buffer *given_buffer = current_buffer;
-      
+
       Vwrite_region_annotations_so_far = annotations;
 
       /* Value is either a list of annotations or nil if the function
@@ -5225,7 +5231,7 @@
 	  XSETFASTINT (end, ZV);
 	  annotations = Qnil;
 	}
-      
+
       if (CONSP (res))
 	annotations = merge (annotations, res, Qcar_less_than_car);
     }
@@ -5512,9 +5518,9 @@
   Lisp_Object args[3], msg;
   int i, nbytes;
   struct gcpro gcpro1;
-  
+
   ring_bell ();
-  
+
   args[0] = build_string ("Auto-saving %s: %s");
   args[1] = current_buffer->name;
   args[2] = Ferror_message_string (error);
@@ -5624,7 +5630,7 @@
       old_message_p = push_message ();
       record_unwind_protect (pop_message_unwind, Qnil);
     }
-  
+
   /* Ordinarily don't quit within this function,
      but don't make it impossible to quit (in case we get hung in I/O).  */
   oquit = Vquit_flag;
@@ -5639,7 +5645,7 @@
   if (STRINGP (Vauto_save_list_file_name))
     {
       Lisp_Object listfile;
-      
+
       listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
 
       /* Don't try to create the directory when shutting down Emacs,
@@ -5657,7 +5663,7 @@
 				       do_auto_save_eh);
 	  UNGCPRO;
 	}
-      
+
       stream = fopen (SDATA (listfile), "w");
       if (stream != NULL)
 	{
@@ -5953,7 +5959,7 @@
 #ifndef VMS
       if (EQ (Vread_file_name_predicate, Qfile_directory_p))
 	{
-	  /* Brute-force speed up for directory checking: 
+	  /* Brute-force speed up for directory checking:
 	     Discard strings which don't end in a slash.  */
 	  for (comp = Qnil; CONSP (all); all = XCDR (all))
 	    {
@@ -6003,7 +6009,7 @@
 Fourth arg MUSTMATCH non-nil means require existing file's name.
  Non-nil and non-t means also require confirmation after completion.
 Fifth arg INITIAL specifies text to start with.
-If optional sixth arg PREDICATE is non-nil, possible completions and the 
+If optional sixth arg PREDICATE is non-nil, possible completions and the
 resulting file name must satisfy (funcall PREDICATE NAME).
 DIR defaults to current buffer's directory default.
 
@@ -6106,11 +6112,11 @@
 #endif
 
   specbind (intern ("minibuffer-completing-file-name"), Qt);
-  specbind (intern ("read-file-name-predicate"), 
+  specbind (intern ("read-file-name-predicate"),
 	    (NILP (predicate) ? Qfile_exists_p : predicate));
 
   GCPRO2 (insdef, default_filename);
-  
+
 #if defined (USE_MOTIF) || defined (HAVE_NTGUI)
   if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
       && use_dialog_box
@@ -6186,7 +6192,7 @@
 	Fset (Qfile_name_history,
 	      Fcons (val1, tem));
     }
-    
+
   return val;
 }
 
@@ -6311,7 +6317,7 @@
   staticpro (&Qformat_decode);
   Qformat_annotate_function = intern ("format-annotate-function");
   staticpro (&Qformat_annotate_function);
-	
+
   Qcar_less_than_car = intern ("car-less-than-car");
   staticpro (&Qcar_less_than_car);
 
@@ -6483,4 +6489,3 @@
   defsubr (&Sunix_sync);
 #endif
 }
-