瀏覽代碼

(rename_directory): New function

Sergey Poznyakoff 19 年之前
父節點
當前提交
a0b4431f26
共有 1 個文件被更改,包括 34 次插入2 次删除
  1. 34 2
      src/extract.c

+ 34 - 2
src/extract.c

@@ -392,13 +392,12 @@ static int
 make_directories (char *file_name)
 {
   char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
-  char *cursor;			/* points into the file name */
+  char *cursor;	        	/* points into the file name */
   int did_something = 0;	/* did we do anything yet? */
   int mode;
   int invert_permissions;
   int status;
 
-
   for (cursor = cursor0; *cursor; cursor++)
     {
       if (! ISSLASH (*cursor))
@@ -1323,6 +1322,39 @@ extract_finish (void)
   apply_nonancestor_delayed_set_stat ("", 1);
 }
 
+bool
+rename_directory (char *src, char *dst)
+{
+  if (rename (src, dst))
+    {
+      int e = errno;
+
+      switch (e)
+	{
+	case ENOENT:
+	  if (make_directories (dst))
+	    {
+	      if (rename (src, dst) == 0)
+		return true;
+	      e = errno;
+	    }
+	  break;
+		    
+	case EXDEV:
+	  /* FIXME: Fall back to recursive copying */
+	  
+	default:
+	  break;
+	}
+
+      ERROR ((0, e, _("Cannot rename %s to %s"),
+	      quote_n (0, src),
+	      quote_n (1, dst)));
+      return false;
+    }
+  return true;
+}
+      
 void
 fatal_exit (void)
 {