changeset 7415:66b32599c835

Return an error indicator.
author Bruno Haible <bruno@clisp.org>
date Fri, 06 Oct 2006 21:37:28 +0000
parents 368fbbd8e59d
children 0350284ebb9c
files lib/ChangeLog lib/clean-temp.c lib/clean-temp.h
diffstat 3 files changed, 72 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,13 @@
+2006-10-06  Bruno Haible  <bruno@clisp.org>
+
+	* clean-temp.h (cleanup_temp_file, cleanup_temp_subdir,
+	cleanup_temp_dir_contents, cleanup_temp_dir): Change return type to
+	int.
+	* clean-temp.c (do_unlink, do_rmdir, cleanup_temp_file,
+	cleanup_temp_subdir, cleanup_temp_dir_contents, cleanup_temp_dir):
+	Return an error indicator.
+	Suggested by Eric Blake.
+
 2006-10-06  Bruno Haible  <bruno@clisp.org>
 
 	* clean-temp.c (PATH_MAX): Provide a fallback for GNU Hurd.
--- a/lib/clean-temp.c
+++ b/lib/clean-temp.c
@@ -408,48 +408,70 @@
     }
 }
 
-/* Remove a file, with optional error message.  */
-static void
+/* Remove a file, with optional error message.
+   Return 0 upon success, or -1 if there was some problem.  */
+static int
 do_unlink (struct temp_dir *dir, const char *absolute_file_name)
 {
   if (unlink (absolute_file_name) < 0 && dir->cleanup_verbose
       && errno != ENOENT)
-    error (0, errno, _("cannot remove temporary file %s"), absolute_file_name);
+    {
+      error (0, errno, _("cannot remove temporary file %s"), absolute_file_name);
+      return -1;
+    }
+  return 0;
 }
 
-/* Remove a directory, with optional error message.  */
-static void
+/* Remove a directory, with optional error message.
+   Return 0 upon success, or -1 if there was some problem.  */
+static int
 do_rmdir (struct temp_dir *dir, const char *absolute_dir_name)
 {
   if (rmdir (absolute_dir_name) < 0 && dir->cleanup_verbose
       && errno != ENOENT)
-    error (0, errno,
-	   _("cannot remove temporary directory %s"), absolute_dir_name);
+    {
+      error (0, errno,
+	     _("cannot remove temporary directory %s"), absolute_dir_name);
+      return -1;
+    }
+  return 0;
 }
 
-/* Remove the given ABSOLUTE_FILE_NAME and unregister it.  */
-void
+/* Remove the given ABSOLUTE_FILE_NAME and unregister it.
+   Return 0 upon success, or -1 if there was some problem.  */
+int
 cleanup_temp_file (struct temp_dir *dir,
 		   const char *absolute_file_name)
 {
-  do_unlink (dir, absolute_file_name);
+  int err;
+
+  err = do_unlink (dir, absolute_file_name);
   unregister_temp_file (dir, absolute_file_name);
+
+  return err;
 }
 
-/* Remove the given ABSOLUTE_DIR_NAME and unregister it.  */
-void
+/* Remove the given ABSOLUTE_DIR_NAME and unregister it.
+   Return 0 upon success, or -1 if there was some problem.  */
+int
 cleanup_temp_subdir (struct temp_dir *dir,
 		     const char *absolute_dir_name)
 {
-  do_rmdir (dir, absolute_dir_name);
+  int err;
+
+  err = do_rmdir (dir, absolute_dir_name);
   unregister_temp_subdir (dir, absolute_dir_name);
+
+  return err;
 }
 
-/* Remove all registered files and subdirectories inside DIR.  */
-void
+/* Remove all registered files and subdirectories inside DIR.
+   Return 0 upon success, or -1 if there was some problem.  */
+int
 cleanup_temp_dir_contents (struct temp_dir *dir)
 {
   struct tempdir *tmpdir = (struct tempdir *)dir;
+  int err = 0;
   gl_list_t list;
   gl_list_iterator_t iter;
   const void *element;
@@ -462,7 +484,7 @@
     {
       char *file = (char *) element;
 
-      do_unlink (dir, file);
+      err |= do_unlink (dir, file);
       gl_list_remove_node (list, node);
       /* Now only we can free file.  */
       free (file);
@@ -476,24 +498,28 @@
     {
       char *subdir = (char *) element;
 
-      do_rmdir (dir, subdir);
+      err |= do_rmdir (dir, subdir);
       gl_list_remove_node (list, node);
       /* Now only we can free subdir.  */
       free (subdir);
     }
   gl_list_iterator_free (&iter);
+
+  return err;
 }
 
 /* Remove all registered files and subdirectories inside DIR and DIR itself.
-   DIR cannot be used any more after this call.  */
-void
+   DIR cannot be used any more after this call.
+   Return 0 upon success, or -1 if there was some problem.  */
+int
 cleanup_temp_dir (struct temp_dir *dir)
 {
   struct tempdir *tmpdir = (struct tempdir *)dir;
+  int err = 0;
   size_t i;
 
-  cleanup_temp_dir_contents (dir);
-  do_rmdir (dir, tmpdir->dirname);
+  err |= cleanup_temp_dir_contents (dir);
+  err |= do_rmdir (dir, tmpdir->dirname);
 
   for (i = 0; i < cleanup_list.tempdir_count; i++)
     if (cleanup_list.tempdir_list[i] == tmpdir)
@@ -510,7 +536,7 @@
 	/* Now only we can free the tmpdir->dirname and tmpdir itself.  */
 	free (tmpdir->dirname);
 	free (tmpdir);
-	return;
+	return err;
       }
 
   /* The user passed an invalid DIR argument.  */
--- a/lib/clean-temp.h
+++ b/lib/clean-temp.h
@@ -89,20 +89,24 @@
 extern void unregister_temp_subdir (struct temp_dir *dir,
 				    const char *absolute_dir_name);
 
-/* Remove the given ABSOLUTE_FILE_NAME and unregister it.  */
-extern void cleanup_temp_file (struct temp_dir *dir,
-			       const char *absolute_file_name);
+/* Remove the given ABSOLUTE_FILE_NAME and unregister it.
+   Return 0 upon success, or -1 if there was some problem.  */
+extern int cleanup_temp_file (struct temp_dir *dir,
+			      const char *absolute_file_name);
 
-/* Remove the given ABSOLUTE_DIR_NAME and unregister it.  */
-extern void cleanup_temp_subdir (struct temp_dir *dir,
-				 const char *absolute_dir_name);
+/* Remove the given ABSOLUTE_DIR_NAME and unregister it.
+   Return 0 upon success, or -1 if there was some problem.  */
+extern int cleanup_temp_subdir (struct temp_dir *dir,
+				const char *absolute_dir_name);
 
-/* Remove all registered files and subdirectories inside DIR.  */
-extern void cleanup_temp_dir_contents (struct temp_dir *dir);
+/* Remove all registered files and subdirectories inside DIR.
+   Return 0 upon success, or -1 if there was some problem.  */
+extern int cleanup_temp_dir_contents (struct temp_dir *dir);
 
 /* Remove all registered files and subdirectories inside DIR and DIR itself.
-   DIR cannot be used any more after this call.  */
-extern void cleanup_temp_dir (struct temp_dir *dir);
+   DIR cannot be used any more after this call.
+   Return 0 upon success, or -1 if there was some problem.  */
+extern int cleanup_temp_dir (struct temp_dir *dir);
 
 /* Open a temporary file in a temporary directory.
    Registers the resulting file descriptor to be closed.  */