[Rawstudio-commit] r3108 - branches/rawstudio-ng-color/librawstudio

Anders Brander anders at brander.dk
Thu Jan 28 18:34:38 CET 2010


Author: abrander
Date: 2010-01-28 18:34:38 +0100 (Thu, 28 Jan 2010)
New Revision: 3108

Modified:
   branches/rawstudio-ng-color/librawstudio/rs-utils.c
   branches/rawstudio-ng-color/librawstudio/rs-utils.h
Log:
Added rs_file_copy().

Modified: branches/rawstudio-ng-color/librawstudio/rs-utils.c
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-utils.c	2010-01-28 17:32:37 UTC (rev 3107)
+++ branches/rawstudio-ng-color/librawstudio/rs-utils.c	2010-01-28 17:34:38 UTC (rev 3108)
@@ -681,3 +681,56 @@
 	char temp [PATH_MAX+1];
 	return realpath(path, temp);
 }
+
+/**
+ * Copy a file from one location to another
+ * @param source An absolute path to a source file
+ * @param deastination An absolute path to a destination file (not folder), will be overwritten if exists
+ * @return TRUE on success, FALSE on failure
+ */
+gboolean
+rs_file_copy(const gchar *source, const gchar *destination)
+{
+	gboolean ret = FALSE;
+	const gint buffer_size = 1024*1024;
+	gint source_fd, destination_fd;
+	gint bytes_read, bytes_written;
+	struct stat st;
+	mode_t default_mode = 00666; /* We set this relaxed to respect the users umask */
+
+	g_return_val_if_fail(source != NULL, FALSE);
+	g_return_val_if_fail(source[0] != '\0', FALSE);
+	g_return_val_if_fail(g_path_is_absolute(source), FALSE);
+
+	g_return_val_if_fail(destination != NULL, FALSE);
+	g_return_val_if_fail(destination[0] != '\0', FALSE);
+	g_return_val_if_fail(g_path_is_absolute(destination), FALSE);
+
+	source_fd = open(source, O_RDONLY);
+	if (source_fd > 0)
+	{
+		/* Try to copy permissions too */
+		if (fstat(source_fd, &st) == 0)
+			default_mode = st.st_mode;
+		destination_fd = creat(destination, default_mode);
+
+		if (destination_fd > 0)
+		{
+			gpointer buffer = g_malloc(buffer_size);
+			do {
+				bytes_read = read(source_fd, buffer, buffer_size);
+				bytes_written = write(destination_fd, buffer, bytes_read);
+				if (bytes_written != bytes_read)
+					g_warning("%s was truncated", destination);
+			} while(bytes_read > 0);
+			g_free(buffer);
+
+			ret = TRUE;
+
+			close(destination_fd);
+		}
+		close(source_fd);
+	}
+
+	return ret;
+}

Modified: branches/rawstudio-ng-color/librawstudio/rs-utils.h
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-utils.h	2010-01-28 17:32:37 UTC (rev 3107)
+++ branches/rawstudio-ng-color/librawstudio/rs-utils.h	2010-01-28 17:34:38 UTC (rev 3108)
@@ -167,4 +167,13 @@
 const gchar * rs_human_focal(gdouble min, gdouble max);
 gchar * rs_normalize_path(gchar *path);
 
+/**
+ * Copy a file from one location to another
+ * @param source An absolute path to a source file
+ * @param deastination An absolute path to a destination file (not folder), will be overwritten if exists
+ * @return TRUE on success, FALSE on failure
+ */
+gboolean
+rs_file_copy(const gchar *source, const gchar *destination);
+
 #endif /* RS_UTILS_H */




More information about the Rawstudio-commit mailing list