file-roller r2390 - in trunk: . src



Author: paobac
Date: Mon Jul 28 16:11:03 2008
New Revision: 2390
URL: http://svn.gnome.org/viewvc/file-roller?rev=2390&view=rev

Log:
2008-07-28  Paolo Bacchilega  <paobac svn gnome org>

	* src/file-utils.c (get_dest_free_space): finished to port to GIO.
	
	Fixes bug #545161 â file-roller crashed with SIGSEGV in strlen() when 
	extracting tarball.
	Fixes bug #544613 â file-roller crashed with SIGSEGV in remove_directory()


Modified:
   trunk/ChangeLog
   trunk/src/file-utils.c

Modified: trunk/src/file-utils.c
==============================================================================
--- trunk/src/file-utils.c	(original)
+++ trunk/src/file-utils.c	Mon Jul 28 16:11:03 2008
@@ -58,33 +58,33 @@
 	GFile     *file;
 	gboolean   exists;
 
-	if (uri == NULL) 
+	if (uri == NULL)
 		return FALSE;
 
 	file = g_file_new_for_uri (uri);
 	exists = g_file_query_exists (file, NULL);
 	g_object_unref (file);
 
-	return exists;	
+	return exists;
 }
 
 
 static gboolean
-uri_is_filetype (const char *uri, 
+uri_is_filetype (const char *uri,
 		 GFileType   file_type)
 {
 	gboolean   result = FALSE;
 	GFile     *file;
 	GFileInfo *info;
 	GError    *error = NULL;
-	
+
 	file = g_file_new_for_uri (uri);
-	
+
 	if (! g_file_query_exists (file, NULL)) {
 		g_object_unref (file);
 		return FALSE;
 	}
-	
+
 	info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, 0, NULL, &error);
 	if (error == NULL) {
 		result = (g_file_info_get_file_type (info) == file_type);
@@ -93,10 +93,10 @@
 		g_warning ("Failed to get file type for uri %s: %s", uri, error->message);
 		g_error_free (error);
 	}
-	
+
 	g_object_unref (info);
 	g_object_unref (file);
-	
+
 	return result;
 }
 
@@ -120,18 +120,18 @@
 {
 	char     *uri;
 	gboolean  result;
-	
+
 	uri = g_filename_to_uri (path, NULL, NULL);
 	result = uri_is_dir (uri);
 	g_free (uri);
-	
+
 	return result;
 }
 
 gboolean
 uri_is_local (const char  *uri)
 {
-	return strncmp (uri, "file://", 7) == 0; 
+	return strncmp (uri, "file://", 7) == 0;
 }
 
 
@@ -145,12 +145,12 @@
 	int              n = 0;
 
 	file = g_file_new_for_uri (uri);
-	
+
 	if (! g_file_query_exists (file, NULL)) {
 		g_object_unref (file);
 		return TRUE;
 	}
-	
+
 	file_enum = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &error);
 	if (error != NULL) {
 		g_warning ("Failed to enumerate children of %s: %s", uri, error->message);
@@ -159,20 +159,20 @@
 		g_object_unref (file);
 		return TRUE;
 	}
-	
+
 	while ((n == 0) && ((info = g_file_enumerator_next_file (file_enum, NULL, &error)) != NULL)) {
 		if (error != NULL) {
 			g_warning ("Encountered error while enumerating children of %s (ignoring): %s", uri, error->message);
 			g_error_free (error);
 		}
-		else if (! SPECIAL_DIR (g_file_info_get_name (info))) 
+		else if (! SPECIAL_DIR (g_file_info_get_name (info)))
 			n++;
 		g_object_unref (info);
 	}
 
 	g_object_unref (file);
 	g_object_unref (file_enum);
-	
+
 	return (n == 0);
 }
 
@@ -187,12 +187,12 @@
 	int              n = 0;
 
 	file = g_file_new_for_uri (uri);
-	
+
 	if (! g_file_query_exists (file, NULL)) {
 		g_object_unref (file);
 		return FALSE;
 	}
-	
+
 	file_enum = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &err);
 	if (err != NULL) {
 		g_warning ("Failed to enumerate children of %s: %s", uri, err->message);
@@ -201,7 +201,7 @@
 		g_object_unref (file);
 		return FALSE;
 	}
-	
+
 	while ((info = g_file_enumerator_next_file (file_enum, NULL, &err)) != NULL) {
 		const char *name;
 
@@ -217,16 +217,16 @@
 			g_object_unref (info);
  			continue;
 		}
-		
+
 		g_object_unref (info);
-	
-		if (++n > 1) 
+
+		if (++n > 1)
 			break;
 	}
 
 	g_object_unref (file);
 	g_object_unref (file_enum);
-	
+
 	return (n == 1);
 }
 
@@ -239,21 +239,21 @@
 	GFileInfo       *info;
 	GError          *err = NULL;
 	char            *content_uri = NULL;
-	
+
 	file = g_file_new_for_uri (uri);
-	
+
 	if (! g_file_query_exists (file, NULL)) {
 		g_object_unref (file);
 		return NULL;
 	}
-	
+
 	file_enum = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &err);
 	if (err != NULL) {
 		g_warning ("Failed to enumerate children of %s: %s", uri, err->message);
 		g_error_free (err);
 		return NULL;
 	}
-	
+
 	while ((info = g_file_enumerator_next_file (file_enum, NULL, &err)) != NULL) {
 		const char *name;
 
@@ -263,24 +263,24 @@
 			g_object_unref (info);
 			continue;
 		}
-		
+
 		name = g_file_info_get_name (info);
 		if ((strcmp (name, ".") == 0) || (strcmp (name, "..") == 0)) {
 			g_object_unref (info);
 			continue;
 		}
-		
+
 		if (content_uri != NULL) {
 			g_free (content_uri);
 			g_object_unref (info);
 			content_uri = NULL;
 			break;
 		}
-		
+
 		content_uri = build_uri (uri, name, NULL);
 		g_object_unref (info);
 	}
-	
+
 	if (err != NULL) {
 		g_warning ("Failed to get info after enumerating children: %s", err->message);
 		g_clear_error (&err);
@@ -288,8 +288,8 @@
 
 	g_object_unref (file_enum);
 	g_object_unref (file);
-	
-	return content_uri;	
+
+	return content_uri;
 }
 
 
@@ -344,11 +344,11 @@
 	else {
 		g_warning ("Failed to get file size for %s: %s", uri, err->message);
 		g_error_free (err);
-	}	
+	}
 
 	g_object_unref (info);
 	g_object_unref (file);
-	
+
 	return size;
 }
 
@@ -358,17 +358,17 @@
 {
 	char    *uri;
 	goffset  result;
-	
+
 	uri = g_filename_to_uri (path, NULL, NULL);
 	result = get_file_size (uri);
 	g_free (uri);
-	
+
 	return result;
 }
 
 
 static time_t
-get_file_time_type (const char *uri, 
+get_file_time_type (const char *uri,
 		    const char *type)
 {
 	time_t     result = 0;
@@ -378,7 +378,7 @@
 
 	if ((uri == NULL) || (*uri == '\0'))
  		return 0;
-	
+
 	file = g_file_new_for_uri (uri);
 	info = g_file_query_info (file, type, 0, NULL, &err);
 	if (err == NULL) {
@@ -387,12 +387,12 @@
 	else {
 		g_warning ("Failed to get %s: %s", type, err->message);
 		g_error_free (err);
-		result = 0;		
-	}		
-	
+		result = 0;
+	}
+
 	g_object_unref (info);
 	g_object_unref (file);
-	
+
 	return result;
 }
 
@@ -409,11 +409,11 @@
 {
 	char   *uri;
 	time_t  result;
-	
+
 	uri = g_filename_to_uri (path, NULL, NULL);
 	result = get_file_mtime (uri);
 	g_free (uri);
-	
+
 	return result;
 }
 
@@ -533,9 +533,9 @@
 	va_list     args;
 	const char *child;
 	GString    *uri;
-	
+
 	uri = g_string_new (base);
-	
+
 	va_start (args, base);
         while ((child = va_arg (args, const char *)) != NULL) {
         	if (! g_str_has_suffix (uri->str, "/") && ! g_str_has_prefix (child, "/"))
@@ -543,7 +543,7 @@
         	g_string_append (uri, child);
         }
 	va_end (args);
-	
+
 	return g_string_free (uri, FALSE);
 }
 
@@ -581,30 +581,30 @@
 {
 	gboolean  success = TRUE;
 	GFile    *parent;
-	
+
 	if (dir == NULL)
 		return TRUE;
 
 	parent = g_file_get_parent (dir);
-	if (parent != NULL) {	
+	if (parent != NULL) {
 		success = make_directory_tree (parent, mode, error);
 		g_object_unref (parent);
-		if (! success)  
+		if (! success)
 			return FALSE;
 	}
-	
+
 	success = g_file_make_directory (dir, NULL, error);
 	if ((error != NULL) && (*error != NULL) && g_error_matches (*error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
 		g_clear_error (error);
 		success = TRUE;
 	}
-	
-	if (success) 
+
+	if (success)
 		g_file_set_attribute_uint32 (dir,
 					     G_FILE_ATTRIBUTE_UNIX_MODE,
-					     mode, 
-					     0, 
-					     NULL, 
+					     mode,
+					     0,
+					     NULL,
 					     NULL);
 
 	return success;
@@ -618,13 +618,13 @@
 {
 	GFile  *dir;
 	GError *priv_error = NULL;
-	
+
 	if (uri == NULL)
 		return FALSE;
-	
+
 	if (error == NULL)
 		error = &priv_error;
-	
+
 	dir = g_file_new_for_uri (uri);
 	if (! make_directory_tree (dir, mode, error)) {
 		g_warning ("could create directory %s: %s", uri, (*error)->message);
@@ -632,7 +632,7 @@
 			g_clear_error (&priv_error);
 		return FALSE;
 	}
-	
+
 	return TRUE;
 }
 
@@ -644,11 +644,11 @@
 {
 	char     *uri;
 	gboolean  result;
-	
+
 	uri = g_filename_to_uri (path, NULL, NULL);
 	result = ensure_dir_exists (uri, mode, error);
 	g_free (uri);
-	
+
 	return result;
 }
 
@@ -660,7 +660,7 @@
 	int         len;
 	int         p;
 	const char *ext;
-	
+
 	if (filename == NULL)
 		return NULL;
 
@@ -674,12 +674,12 @@
 	if (p < 0)
 		return NULL;
 
-	ext = filename + p;	
+	ext = filename + p;
 	if (ext - 4 > filename) {
 		const char *test = ext - 4;
 		if (strncmp (test, ".tar", 4) == 0)
 			ext = ext - 4;
-	} 
+	}
 	return ext;
 }
 
@@ -700,8 +700,8 @@
 
 
 gboolean
-is_mime_type (const char *mime_type, 
-	      const char *pattern) 
+is_mime_type (const char *mime_type,
+	      const char *pattern)
 {
 	return (strncasecmp (mime_type, pattern, strlen (pattern)) == 0);
 }
@@ -715,9 +715,9 @@
 	GFileInfo  *info;
 	GError     *err = NULL;
  	const char *result = NULL;
- 	
+
  	file = g_file_new_for_uri (filename);
-	info = g_file_query_info (file, 
+	info = g_file_query_info (file,
 				  fast_file_type ?
 				  G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE :
 				  G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
@@ -730,7 +730,7 @@
 		result = get_static_string (g_file_info_get_content_type (info));
 		g_object_unref (info);
 	}
-	
+
 	g_object_unref (file);
 
 	return result;
@@ -743,11 +743,11 @@
 {
 	char       *uri;
 	const char *mime_type;
-	
+
 	uri = g_filename_to_uri (filename, NULL, NULL);
 	mime_type = get_file_mime_type (uri, fast_file_type);
 	g_free (uri);
-	
+
 	return mime_type;
 }
 
@@ -778,19 +778,21 @@
 guint64
 get_dest_free_space (const char *uri)
 {
+	guint64    freespace = 0;
 	GFile     *file;
 	GFileInfo *info;
-	goffset    freespace;
 	GError    *err = NULL;
 
 	file = g_file_new_for_uri (uri);
-	info = g_file_query_info (file, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, 0, NULL, &err);
-	if (err != NULL) {
-		freespace = 0;
+	info = g_file_query_filesystem_info (file, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, &err);
+	if (info != NULL) {
+		freespace = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE);
+		g_object_unref (info);
+	}
+	else {
 		g_warning ("Could not get filesystem free space on volume that contains %s: %s", uri, err->message);
 		g_error_free (err);
 	}
-	g_object_unref (info);
 	g_object_unref (file);
 
 	return freespace;
@@ -805,12 +807,12 @@
 	GFileEnumerator *file_enum;
 	GFileInfo       *info;
 	gboolean         error_occurred = FALSE;
-	
+
 	if (error != NULL)
 		*error = NULL;
-	
-	file_enum = g_file_enumerate_children (dir, 
-					       G_FILE_ATTRIBUTE_STANDARD_NAME "," 
+
+	file_enum = g_file_enumerate_children (dir,
+					       G_FILE_ATTRIBUTE_STANDARD_NAME ","
 					       G_FILE_ATTRIBUTE_STANDARD_TYPE,
 					       0, NULL, error);
 
@@ -818,32 +820,32 @@
 	while (! error_occurred && (info = g_file_enumerator_next_file (file_enum, NULL, error)) != NULL) {
 		char  *child_uri;
 		GFile *child;
-		
+
 		child_uri = build_uri (uri, g_file_info_get_name (info), NULL);
 		child = g_file_new_for_uri (child_uri);
-		
+
 		switch (g_file_info_get_file_type (info)) {
 		case G_FILE_TYPE_DIRECTORY:
-			if (! delete_directory_recursive (child, error)) 
+			if (! delete_directory_recursive (child, error))
 				error_occurred = TRUE;
 			break;
 		default:
-			if (! g_file_delete (child, NULL, error)) 
+			if (! g_file_delete (child, NULL, error))
 				error_occurred = TRUE;
 			break;
 		}
-		
+
 		g_object_unref (child);
 		g_free (child_uri);
 		g_object_unref (info);
 	}
 	g_free (uri);
-	
-	if (! error_occurred && ! g_file_delete (dir, NULL, error)) 
+
+	if (! error_occurred && ! g_file_delete (dir, NULL, error))
  		error_occurred = TRUE;
-	
+
 	g_object_unref (file_enum);
-	
+
 	return ! error_occurred;
 }
 
@@ -854,7 +856,7 @@
 	GFile     *dir;
 	gboolean   result;
 	GError    *error = NULL;
-	
+
 	dir = g_file_new_for_uri (uri);
 	result = delete_directory_recursive (dir, &error);
 	if (! result) {
@@ -862,7 +864,7 @@
 		g_clear_error (&error);
 	}
 	g_object_unref (dir);
-	
+
 	return result;
 }
 
@@ -872,11 +874,11 @@
 {
 	char     *uri;
 	gboolean  result;
-	
+
 	uri = g_filename_to_uri (path, NULL, NULL);
 	result = remove_directory (uri);
 	g_free (uri);
-	
+
 	return result;
 }
 
@@ -954,7 +956,7 @@
 		const char *folder;
 
 		folder = ith_temp_folder_to_try (i);
-		if (strncmp (dir, folder, strlen (folder)) == 0) 
+		if (strncmp (dir, folder, strlen (folder)) == 0)
 			if (strncmp (dir + strlen (folder), "/.fr-", 5) == 0)
 				return TRUE;
 	}
@@ -990,7 +992,7 @@
 		if (*p != '%') {
 			if (*p != *l)
 				return FALSE;
-		} 
+		}
 		else {
 			p++;
 			switch (*p) {
@@ -1163,7 +1165,7 @@
 char *
 get_home_relative_uri (const char *partial_uri)
 {
-	return g_strconcat (get_home_uri (), 
+	return g_strconcat (get_home_uri (),
 			    "/",
 			    partial_uri,
 			    NULL);
@@ -1175,11 +1177,11 @@
 {
 	GFile *file;
 	char  *uri;
-	
+
 	uri = g_strconcat (get_home_uri (), "/", partial_uri, NULL);
 	file = g_file_new_for_uri (uri);
 	g_free (uri);
-	
+
 	return file;
 }
 
@@ -1250,7 +1252,7 @@
 {
 	char *new_uri = NULL;
 	int   n = 1;
-	
+
 	do {
 		g_free (new_uri);
 		if (n == 1)
@@ -1259,8 +1261,8 @@
 			new_uri = g_strdup_printf ("%s/%s%%20(%d)", folder, name, n);
 		n++;
 	} while (uri_exists (new_uri));
-	
-	return new_uri;	
+
+	return new_uri;
 }
 
 
@@ -1269,11 +1271,11 @@
 {
 	char *base_uri;
 	char *new_uri;
-	
+
 	base_uri = remove_level_from_path (uri);
 	new_uri = get_alternative_uri (base_uri, file_name_from_path (uri));
 	g_free (base_uri);
-	
+
 	return new_uri;
 }
 
@@ -1299,7 +1301,7 @@
 
 
 GList *
-gio_file_list_new_from_uri_list (GList *uris) 
+gio_file_list_new_from_uri_list (GList *uris)
 {
 	GList *r = NULL, *scan;
 	for (scan = uris; scan; scan = scan->next)
@@ -1309,21 +1311,21 @@
 
 
 void
-g_key_file_save (GKeyFile *key_file, 
+g_key_file_save (GKeyFile *key_file,
 	         GFile    *file)
 {
 	char   *file_data;
 	gsize   size;
 	GError *error = NULL;
-	
+
 	file_data = g_key_file_to_data (key_file, &size, &error);
 	if (error != NULL) {
 		g_warning ("Could not save options: %s\n", error->message);
 		g_clear_error (&error);
 	}
-	else { 
+	else {
 		GFileOutputStream *stream;
-		
+
 		stream = g_file_replace (file, NULL, FALSE, 0, NULL, &error);
 		if (stream == NULL) {
 			g_warning ("Could not save options: %s\n", error->message);
@@ -1337,9 +1339,9 @@
 			g_warning ("Could not save options: %s\n", error->message);
 			g_clear_error (&error);
 		}
-		
+
 		g_object_unref (stream);
 	}
-	
+
 	g_free (file_data);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]