-P fix

Oskar Liljeblad oskar at osk.mine.nu
Thu Sep 5 21:31:01 UTC 2002


Here's my take at fixing this in the TODO file:

  reimplement "-P" in a safer way (temp file instead of stdout) - possibly
  security issues.

My solution is to add another option -p that will allow you to
specify a file that the last working directory is written to.

A new function print_last_working_directory was created since
this functionality is needed in two places in main.c.

I also attempted to update the manual page.

Here's a new mc.sh:

mc ()
{
	TMPFILE="`mktemp`"
	/usr/bin/mc -p "$TMPFILE" "$@"
	cd "`cat $TMPFILE`"
	rm -f "$TMPFILE"
        unset TMPFILE;
}

export -f mc

Note that it requires the mktemp command, which is available in
Debian (debianutils 1.7 or later) and OpenBSD 2.1 or later.

At least use the patch as an inspiration... :)

Oskar Liljeblad (oskar at osk.mine.nu)
-------------- next part --------------
--- src/main.c.orig	2002-09-05 23:18:11.000000000 +0200
+++ src/main.c	2002-09-05 23:17:35.000000000 +0200
@@ -258,6 +258,7 @@
 
 /* If true, then print on stdout the last directory we were at */
 static int print_last_wd = 0;
+static char *print_last_wd_file = NULL;
 static char *last_wd_string;
 static int print_last_revert = 0;
 
@@ -303,6 +304,56 @@
 /* Used during argument processing */
 int finish_program = 0;
 
+static void
+print_last_working_directory (void)
+{
+#if defined(OS2_NT)
+    /* Note: print_last_wd_file not implemented for OS2/NT */
+
+    if (print_last_wd == 2){
+	FILE *bat_file;
+
+	print_last_wd = 0;
+	bat_file = fopen(batch_file_name, "w");
+	if (bat_file != NULL){
+            /* .ado: \r\n for Win95 */
+	    fprintf(bat_file, "@echo off\r\n");
+	    if (isalpha(last_wd_string[0]))
+		fprintf(bat_file, "%c:\r\n", last_wd_string[0]);
+	    fprintf(bat_file, "cd %s\r\n", last_wd_string);
+	    fclose(bat_file);
+	}
+    }
+#endif
+
+    if (print_last_wd || print_last_wd_file) {
+    	int fd = -1;
+
+	if (print_last_wd) {
+	    fd = stdout_fd;
+	}
+	if (print_last_wd_file) {
+	    fd = open(print_last_wd_file, O_WRONLY|O_TRUNC);
+	    if (fd < 0) {
+		fprintf(stderr, "%s: cannot open file - %s\n",
+		    	print_last_wd_file, strerror(errno));
+	    }
+    	}
+	if (fd != -1) {
+            if (print_last_revert || edit_one_file || view_one_file)
+        	write (fd, ".", 1);
+            else
+		write (fd, last_wd_string, strlen (last_wd_string));
+
+	    if (fd != stdout_fd) {
+		close(fd);
+	    }
+	}
+
+        g_free (last_wd_string);
+    }
+}
+
 WPanel *
 get_current_panel (void)
 {
@@ -1935,7 +1986,7 @@
     midnight_shutdown = 1;
 
     /* destroy_dlg destroys even cpanel->cwd, so we have to save a copy :) */
-    if (print_last_wd) {
+    if (print_last_wd || print_last_wd_file) {
 	if (!vfs_current_is_local ())
 	    last_wd_string = g_strdup (".");
 	else
@@ -2154,8 +2205,8 @@
 probably_finish_program (void)
 {
     if (finish_program){
-	if (print_last_wd)
-	    printf (".");
+    	print_last_revert = 1;	/* to make sure "." is printed */
+    	print_last_working_directory ();
 	exit (1);
     }
 }
@@ -2268,6 +2319,8 @@
 #endif
     { "printwd", 	'P', POPT_ARG_NONE, 	&print_last_wd, 	  0,
       N_("Prints working directory at program exit") },
+    { "printwdtofile", 	'p', POPT_ARG_STRING, 	&print_last_wd_file,	  0,
+      N_("Prints working directory at program exit to a specific file") },
     { "resetsoft", 	'k', POPT_ARG_NONE, 	&reset_hp_softkeys, 	  0,
       N_("Resets soft keys on HP terminals") },
     { "slow", 's', POPT_ARG_NONE, 		&slow_terminal, 	  0,
@@ -2595,29 +2648,7 @@
     /* On NT, home_dir is malloced */
     g_free (home_dir);
 #endif
-#if defined(OS2_NT)
-    if (print_last_wd == 2){
-	FILE *bat_file;
-
-	print_last_wd = 0;
-	bat_file = fopen(batch_file_name, "w");
-	if (bat_file != NULL){
-            /* .ado: \r\n for Win95 */
-	    fprintf(bat_file, "@echo off\r\n");
-	    if (isalpha(last_wd_string[0]))
-		fprintf(bat_file, "%c:\r\n", last_wd_string[0]);
-	    fprintf(bat_file, "cd %s\r\n", last_wd_string);
-	    fclose(bat_file);
-	}
-    }
-#endif
-    if (print_last_wd) {
-        if (print_last_revert || edit_one_file || view_one_file)
-            write (stdout_fd, ".", 1);
-        else
-	    write (stdout_fd, last_wd_string, strlen (last_wd_string));
-	g_free (last_wd_string);
-    }
+    print_last_working_directory ();
 
 #ifndef _OS_NT
     g_free (mc_home);
--- doc/mc.1.in.orig	2002-09-05 23:22:02.000000000 +0200
+++ doc/mc.1.in	2002-09-05 23:21:01.000000000 +0200
@@ -6,7 +6,7 @@
 .\"SKIP_SECTION"
 .SH "USAGE"
 .B mc
-[\-abcCdfhPstuUVx?] [\-l log] [dir1 [dir2]] [-v file]
+[\-abcCdfhpPstuUVx?] [\-l log] [dir1 [dir2]] [-v file]
 .SH "DESCRIPTION"
 .LP
 The Midnight Commander is a directory browser/file manager for
@@ -61,6 +61,10 @@
 .B @prefix@/lib/mc/bin/mc.csh
 (tcsh users) in order to have this function defined.
 .TP
+.I "\-p file"
+Similar to the -P option, but instead of printing the last working
+directory to standard out, it will be written to the specified file.
+.TP
 .I "\-s"
 Turns on the slow terminal mode, in this mode the program will not
 draw expensive line drawing characters and will toggle verbose mode


More information about the mc-devel mailing list