Self-dectructing scripts

Pavel Roskin proski at gnu.org
Wed Jul 18 03:08:22 UTC 2001


Hello!

The problem with the GNOME edition leaving temporary files has been
solved.  Every script created by exec_extention() now has the `rm' command
at the end, so that it removes itself when it finishes.

The code in gutils.c was trying to keep track of all children in a
separate process.  This seems to be an overkill.  As long as `exec' is not
used in the commands (and it's not used) there is already such process for
each child - the shell running the script.

A long-term solution would be to run /bin/sh (not the subshell) and pipe
the script to its standard input.  But GMC probably will be in the deep
freeze by that time.

A few pessimistic comments have been fixed, too.  It's not _that_ ugly now
to write it in a comment.

-- 
Regards,
Pavel Roskin

------------------------------------------
--- ext.c
+++ ext.c
@@ -139,17 +139,21 @@ exec_extension (const char *filename, co
     else
 	do_local_copy = 0;

+    /*
+     * All commands should be run in /bin/sh regardless of user shell.
+     * To do that, create temporary shell script and run it.
+     * Sometimes it's not needed (e.g. for %cd and %view commands),
+     * but it's easier to create it anyway.
+     */
     cmd_file_fd = mc_mkstemps(&file_name, "mcext", SCRIPT_SUFFIX);

-    /* #warning FIXME: this is ugly */
     if (cmd_file_fd == -1){
 	message (1, MSG_ERROR, _(" Can't create temporary command file \n %s "),
 		 unix_error_string (errno));
 	return;
     }
     cmd_file = fdopen (cmd_file_fd, "w");
-    /* FIXME: This is a hack, that makes us sure, we are using the right syntax */
-    fprintf (cmd_file, "#!/bin/sh\n");
+    fputs ("#!/bin/sh\n", cmd_file);

     prompt [0] = 0;
     for (;*data && *data != '\n'; data++){
@@ -245,7 +249,9 @@ exec_extension (const char *filename, co
 	    }
 	}
     } /* for */
-    fputc ('\n', cmd_file);
+
+    /* Make sure that the file removes itself when it finishes */
+    fprintf (cmd_file, "\n/bin/rm -f %s\n", file_name);
     fclose (cmd_file);

     if ((run_view && !written_nonspace) || is_cd) {
@@ -312,15 +318,6 @@ exec_extension (const char *filename, co
 #endif /* !HAVE_X */
     }
     if (file_name) {
-	/*
-	 * GNOME edition executes file_name in a separate process.
-	 * Cannot remove it here because it may happen before the
-	 * child has executed it.  my_system() in gutil.c has
-	 * (currently defunct) code to remove temporary files.
-	 */
-#ifndef HAVE_X
-	unlink (file_name);
-#endif /* !HAVE_X */
 	g_free (file_name);
     }
     if (localcopy) {
------------------------------------------






More information about the mc-devel mailing list