[GRASS-SVN] r31018 - in grass/branches/releasebranch_6_3: general/manage/lib include lib/gis

svn_grass at osgeo.org svn_grass at osgeo.org
Thu Apr 17 03:55:08 EDT 2008


Author: neteler
Date: 2008-04-17 03:55:07 -0400 (Thu, 17 Apr 2008)
New Revision: 31018

Added:
   grass/branches/releasebranch_6_3/lib/gis/copy_dir.c
Removed:
   grass/branches/releasebranch_6_3/general/manage/lib/copyfile.c
Modified:
   grass/branches/releasebranch_6_3/general/manage/lib/Makefile
   grass/branches/releasebranch_6_3/general/manage/lib/do_copy.c
   grass/branches/releasebranch_6_3/include/gisdefs.h
Log:
Move recursive_copy() into libgis (G_recursive_copy()) to prevent LFS issues [bug #50] (backport from head, c30997 and c31002)

Modified: grass/branches/releasebranch_6_3/general/manage/lib/Makefile
===================================================================
--- grass/branches/releasebranch_6_3/general/manage/lib/Makefile	2008-04-16 20:03:07 UTC (rev 31017)
+++ grass/branches/releasebranch_6_3/general/manage/lib/Makefile	2008-04-17 07:55:07 UTC (rev 31018)
@@ -4,10 +4,6 @@
 
 LIB_NAME = $(MANAGE_LIBNAME)
 
-LIB_OBJS = add_elem.o ask.o copyfile.o do_copy.o do_list.o do_remove.o \
-           do_rename.o empty.o find.o get_len.o menu.o read_list.o \
-           show_elem.o sighold.o
-
 LOCAL_HEADERS = $(wildcard *.h) ../list.h
 
 EXTRA_INC = -I.. $(VECT_INC)

Deleted: grass/branches/releasebranch_6_3/general/manage/lib/copyfile.c
===================================================================
--- grass/branches/releasebranch_6_3/general/manage/lib/copyfile.c	2008-04-16 20:03:07 UTC (rev 31017)
+++ grass/branches/releasebranch_6_3/general/manage/lib/copyfile.c	2008-04-17 07:55:07 UTC (rev 31018)
@@ -1,31 +0,0 @@
-#include <grass/gis.h>
-#include <unistd.h>
-int 
-copyfile (char *element, char *old, char *mapset, char *new)
-{
-    char buf[1024];
-    int in, out;
-    int ix, ox = 0;
-
-    in = G_open_old (element, old, mapset);
-    if (in < 0)
-	return -1;
-    out = G_open_new (element, new);
-    if (out < 0)
-    {
-	close (in);
-	return -2;
-    }
-    while ((ix = read (in, buf, sizeof buf)) > 0)
-	if ((ox = write (out, buf, (size_t)ix)) != ix)
-	    break;
-
-    close (in);
-    close (out);
-
-    if (ix < 0)
-	return -3;
-    if (ix != 0 && ix != ox)
-	return -4;
-    return 0;
-}

Modified: grass/branches/releasebranch_6_3/general/manage/lib/do_copy.c
===================================================================
--- grass/branches/releasebranch_6_3/general/manage/lib/do_copy.c	2008-04-16 20:03:07 UTC (rev 31017)
+++ grass/branches/releasebranch_6_3/general/manage/lib/do_copy.c	2008-04-17 07:55:07 UTC (rev 31018)
@@ -1,16 +1,10 @@
 #include <stdio.h>
 #include <string.h>
-#include <fcntl.h>
 #include <unistd.h>
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <grass/gis.h>
 #include <grass/Vect.h>
 #include "list.h"
 
-static int recursive_copy(const char *src, const char *dst);
-
 /*
  *  returns 0 - success
  *          1 - error
@@ -18,7 +12,7 @@
 int do_copy (int n, char *old, char *mapset, char *new)
 {
     int i, ret, len;
-    char path[1024], path2[1024];
+    char path[GPATH_MAX], path2[GPATH_MAX];
     int result = 0;
 
     G_debug (3, "Copy %s", list[n].alias );
@@ -50,7 +44,7 @@
 		continue;
 	    }
 	    G__file_name (path2, list[n].element[i], new, G_mapset());
-	    if ( recursive_copy(path, path2) == 1 ) 
+	    if ( G_recursive_copy(path, path2) == 1 ) 
 	    {
                 result = 1;
             }
@@ -65,7 +59,7 @@
 /* special case: remove (yes, remove) the secondary color table, if it exists */
     if (G_strcasecmp (list[n].element[0], "cell") == 0)
     {
-	char colr2[50];
+	char colr2[GNAME_MAX];
 
 	sprintf (colr2, "colr2/%s", G_mapset());
 	G_remove (colr2, new);
@@ -75,112 +69,3 @@
     return result;
 }
 
-/* RULE:
- * 1. If destination does not exist, copy source to destination as expected.
- * 2. If destination already exists and it's a file, destination will be
- *    deleted first and apply RULE 1.
- * 3. If destination already exists which is a directory and source is a file,
- *    try to copy source to destination directory.
- * 4. If destination already exists which is a directory and source is also a
- *    directory, try to copy all contents in source to destination directory.
- *
- * This rule is designed according to general/manage/lib/copy.sh.
- *
- * POSSIBLE CASES:
- * if src is a file:
- * 	if dst does not exist:
- * 		copy src to dst				RULE 1
- * 	if dst is a file:
- * 		delete dst and copy src to dst		RULE 2
- * 	if dst is a directory:
- * 		try recursive_copy(src, dst/src)	RULE 3
- * if src is a directory:
- * 	if dst does not exist:
- * 		copy src to dst				RULE 1
- * 	if dst is a file:
- * 		delete dst and copy src to dst		RULE 2
- * 	if dst is a directory:
- * 		try					RULE 4
- * 		for i in `ls src`
- * 		do
- * 			recursive_copy(src/$i, dst/$i)
- * 		done
- *
- * RETURN: 0 if successful, otherwise 1
- */
-static int
-recursive_copy(const char *src, const char *dst)
-{
-	DIR *dirp;
-	struct dirent *dp;
-	struct stat sb;
-	char buf[1024], buf2[1024];
-	int fd, fd2;
-	size_t len, len2;
-	mode_t mode;
-
-	if(G_lstat(src, &sb))
-		return 1;
-
-	/* src is a file */
-	if(!S_ISDIR((mode = sb.st_mode)))
-	{
-		if(!G_lstat(dst, &sb) && S_ISDIR(sb.st_mode))
-		{
-			const char *p = strrchr(src, '/');
-			/* src => dst/src */
-			sprintf(buf, "%s/%s", dst, (p?p+1:src));
-
-			return recursive_copy(src, buf);
-		}
-
-		/* src => dst */
-		if((fd = open(src, O_RDONLY)) < 0)
-			return 1;
-
-		if((fd2 = open(dst, O_CREAT|O_TRUNC|O_WRONLY, mode & 0777)) < 0)
-		{
-			close(fd);
-			return 1;
-		}
-		while((len = read(fd, buf, 1024)) > 0)
-		{
-			while(len && (len2 = write(fd2, buf, len)) >= 0)
-				len -= len2;
-		}
-		close(fd);
-		close(fd2);
-
-		return 0;
-	}
-
-	/* src is a directory */
-
-	if(G_lstat(dst, &sb))
-	{
-		if(G_mkdir(dst))
-			return 1;
-	}else
-	/* if dst already exists and it's a file, try to remove it */
-	if(!S_ISDIR(sb.st_mode))
-	{
-		if(remove(dst) || G_mkdir(dst))
-			return 1;
-	}
-
-	if((dirp = opendir(src)) == NULL)
-		return 1;
-	while((dp = readdir(dirp)) != NULL)
-	{
-		/* do not copy hidden files */
-		if(dp->d_name[0] == '.')
-			continue;
-		sprintf(buf, "%s/%s", src, dp->d_name);
-		sprintf(buf2, "%s/%s", dst, dp->d_name);
-		if(recursive_copy(buf, buf2))
-			return 1;
-	}
-	closedir(dirp);
-
-	return 0;
-}

Modified: grass/branches/releasebranch_6_3/include/gisdefs.h
===================================================================
--- grass/branches/releasebranch_6_3/include/gisdefs.h	2008-04-16 20:03:07 UTC (rev 31017)
+++ grass/branches/releasebranch_6_3/include/gisdefs.h	2008-04-17 07:55:07 UTC (rev 31018)
@@ -372,7 +372,8 @@
 int G_copy(void *, const void *, int);
 
 /* copy_file.c */
-int G_copy_file(const char *infile, const char *outfile);
+int G_copy_file(const char *, const char *);
+int G_recursive_copy(const char *, const char *);
 
 /* dalloc.c */
 double *G_alloc_vector(size_t);

Added: grass/branches/releasebranch_6_3/lib/gis/copy_dir.c
===================================================================
--- grass/branches/releasebranch_6_3/lib/gis/copy_dir.c	                        (rev 0)
+++ grass/branches/releasebranch_6_3/lib/gis/copy_dir.c	2008-04-17 07:55:07 UTC (rev 31018)
@@ -0,0 +1,149 @@
+/****************************************************************************
+ *
+ * MODULE:       GRASS GIS library - copy_dir.c
+ * AUTHOR(S):    Huidae Cho
+ * PURPOSE:      Function to recursively copy a directory
+ * COPYRIGHT:    (C) 2008 by the GRASS Development Team
+ *
+ * NOTE:         Extracted from general/manage/lib/do_copy.c
+ *
+ *               This program is free software under the GNU General Public
+ *               License (>=v2). Read the file COPYING that comes with GRASS
+ *               for details.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <grass/gis.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* RULE:
+ * 1. If destination does not exist, copy source to destination as expected.
+ * 2. If destination already exists and it's a file, destination will be
+ *    deleted first and apply RULE 1.
+ * 3. If destination already exists which is a directory and source is a file,
+ *    try to copy source to destination directory.
+ * 4. If destination already exists which is a directory and source is also a
+ *    directory, try to copy all contents in source to destination directory.
+ *
+ * This rule is designed according to general/manage/lib/copy.sh.
+ *
+ * POSSIBLE CASES:
+ * if src is a file:
+ * 	if dst does not exist:
+ * 		copy src to dst				RULE 1
+ * 	if dst is a file:
+ * 		delete dst and copy src to dst		RULE 2
+ * 	if dst is a directory:
+ * 		try recursive_copy(src, dst/src)	RULE 3
+ * if src is a directory:
+ * 	if dst does not exist:
+ * 		copy src to dst				RULE 1
+ * 	if dst is a file:
+ * 		delete dst and copy src to dst		RULE 2
+ * 	if dst is a directory:
+ * 		try					RULE 4
+ * 		for i in `ls src`
+ * 		do
+ * 			recursive_copy(src/$i, dst/$i)
+ * 		done
+ *
+ * RETURN: 0 if successful, otherwise 1
+ */
+
+int G_recursive_copy(const char *src, const char *dst)
+{
+    DIR *dirp;
+    struct stat sb;
+
+    if (G_lstat(src, &sb) < 0)
+	return 1;
+
+    /* src is a file */
+    if (!S_ISDIR(sb.st_mode))
+    {
+	char buf[4096];
+	int fd, fd2;
+	size_t len, len2;
+
+	if (G_lstat(dst, &sb) == 0 && S_ISDIR(sb.st_mode))
+	{
+	    char path[GPATH_MAX];
+	    const char *p = strrchr(src, '/');
+
+	    /* src => dst/src */
+	    sprintf(path, "%s/%s", dst, (p?p+1:src));
+	    return G_recursive_copy(src, path);
+	}
+
+	/* src => dst */
+	if ((fd = open(src, O_RDONLY)) < 0)
+	    return 1;
+
+	if ((fd2 = open(dst, O_CREAT|O_TRUNC|O_WRONLY, sb.st_mode & 0777)) < 0)
+	{
+	    close(fd);
+	    return 1;
+	}
+
+	while ((len = read(fd, buf, sizeof(buf))) > 0)
+	{
+	    while(len && (len2 = write(fd2, buf, len)) >= 0)
+		len -= len2;
+	}
+
+	close(fd);
+	close(fd2);
+
+	return 0;
+    }
+
+    /* src is a directory */
+    if (G_lstat(dst, &sb) < 0)
+    {
+	if(G_mkdir(dst))
+	    return 1;
+    }
+    else
+	/* if dst already exists and it's a file, try to remove it */
+	if (!S_ISDIR(sb.st_mode))
+	{
+	    if (remove(dst) < 0 || G_mkdir(dst) < 0)
+		return 1;
+	}
+
+    dirp = opendir(src);
+    if (!dirp)
+	return 1;
+
+    for (;;)
+    {
+	char path[GPATH_MAX], path2[GPATH_MAX];
+	struct dirent *dp = readdir(dirp);
+
+	if (!dp)
+	    break;
+
+	/* do not copy hidden files */
+	if (dp->d_name[0] == '.')
+	    continue;
+
+	sprintf(path, "%s/%s", src, dp->d_name);
+	sprintf(path2, "%s/%s", dst, dp->d_name);
+
+	if (G_recursive_copy(path, path2) != 0)
+	    return 1;
+    }
+
+    closedir(dirp);
+
+    return 0;
+}


Property changes on: grass/branches/releasebranch_6_3/lib/gis/copy_dir.c
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the grass-commit mailing list