Don't allow stdout and stderr from extfs scripts pollute the screen.

Andrew V. Samoilov sav at bcs.zp.ua
Thu Nov 28 13:48:25 UTC 2002


Hello,

patch below prevents stderr from extfs scripts pollute the screen. I
even thinks about new flag for my_system() like REPORT_ERRORS. Also 
unwanted stdout from scripts can be redirected to stderr in extfs_cmd()
by adding "1>&2".

ChangeLog:
* extfs.c (open_archive): Use open_error_pipe() and close_error_pipe()
to prevent stderr from extfs scripts pollute the screen.
(extfs_cmd): New function to run extfs scripts and handle stderr in one
place.
(extfs_open): Use extfs_cmd().
(extfs_close): Likewise.
(extfs_unlink): Likewise.
(extfs_mkdir): Likewise.
(extfs_rmdir): Likewise.

--
Regards,
Andrew V. Samoilov.

--- extfs.c	Mon Nov  4 09:28:41 2002
+++ extfs.c	Thu Nov 28 15:16:04 2002
@@ -229,7 +229,9 @@ static FILE *open_archive (int fstype, c
     if (tmp)
 	g_free (tmp);
     g_free (mc_extfsdir);
+    open_error_pipe ();
     result = popen (cmd, "r");
+    close_error_pipe (1, NULL);
     g_free (cmd);
     if (result == NULL) {
         if (local_name != NULL && uses_archive)
@@ -563,6 +565,38 @@ static char *get_archive_name (struct ar
 	return archive_name;
 }
 
+/* Don't pass localname as NULL */
+static int
+extfs_cmd (const char *extfs_cmd, struct archive *archive,
+	   struct entry *entry, const char *localname)
+{
+    char *file;
+    char *quoted_file;
+    char *archive_name;
+    char *mc_extfsdir;
+    char *cmd;
+    int retval;
+
+    file = get_path_from_entry (entry);
+    quoted_file = name_quote (file, 0);
+    g_free (file);
+    archive_name = name_quote (get_archive_name (archive), 0);
+
+    mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR);
+    cmd = g_strconcat (mc_extfsdir, extfs_prefixes[archive->fstype],
+		       extfs_cmd, archive_name, " ", quoted_file, " ",
+		       localname, NULL);
+    g_free (quoted_file);
+    g_free (mc_extfsdir);
+    g_free (archive_name);
+
+    open_error_pipe ();
+    retval = my_system (EXECUTE_AS_SHELL, shell, cmd);
+    g_free (cmd);
+    close_error_pipe (1, NULL);
+    return retval;
+}
+
 static void extfs_run (char *file)
 {
     struct archive *archive;
@@ -590,7 +624,6 @@ static void *extfs_open (vfs *me, char *
     struct pseudofile *extfs_info;
     struct archive *archive;
     char *q;
-    char *mc_extfsdir;
     struct entry *entry;
     int local_handle;
     int created = 0;
@@ -607,42 +640,28 @@ static void *extfs_open (vfs *me, char *
     	return NULL;
     if ((entry = my_resolve_symlinks (entry)) == NULL)
 	return NULL;
+
     if (S_ISDIR (entry->inode->mode)) ERRNOR (EISDIR, NULL);
+
     if (entry->inode->local_filename == NULL) {
-        char *cmd;
-	char *archive_name, *p;
-        
-	{
-	    int handle;
-	    handle = mc_mkstemps (&entry->inode->local_filename, "extfs", NULL);
 
-	    if (handle == -1)
-		return NULL;
-	    close(handle);
-	}
-	p = get_path_from_entry (entry);
-	q = name_quote (p, 0);
-	g_free (p);
-	archive_name = name_quote (get_archive_name (archive), 0);
+	int handle;
+	handle = mc_mkstemps (&entry->inode->local_filename, "extfs", NULL);
 
-        mc_extfsdir = concat_dir_and_file (mc_home, "extfs/");
-        cmd = g_strconcat (mc_extfsdir, extfs_prefixes [archive->fstype],
-                             " copyout ", 
-                            archive_name, 
-                            " ", q, " ", entry->inode->local_filename, NULL);
-	g_free (q);
-	g_free (mc_extfsdir);
-	g_free (archive_name);
-        if (my_system (EXECUTE_AS_SHELL, shell, cmd) && !created){
-            free (entry->inode->local_filename);
-            entry->inode->local_filename = NULL;
-            g_free (cmd);
-            my_errno = EIO;
-            return NULL;
-        }
-        g_free (cmd);
+	if (handle == -1)
+	    return NULL;
+	close (handle);
+
+	if (extfs_cmd
+	    (" copyout ", archive, entry, entry->inode->local_filename)
+	    && !created) {
+	    free (entry->inode->local_filename);
+	    entry->inode->local_filename = NULL;
+	    my_errno = EIO;
+	    return NULL;
+	}
     }
-    
+
     local_handle = open (entry->inode->local_filename, NO_LINEAR(flags),
 			 mode);
     if (local_handle == -1) ERRNOR (EIO, NULL);
@@ -675,42 +694,21 @@ static int extfs_close (void *data)
     close (file->local_handle);
 
     /* Commit the file if it has changed */
-    if (file->has_changed){
-	struct archive *archive;
-	char   *archive_name, *file_name;
-	char   *cmd;
-	char   *mc_extfsdir;
-	char   *p;
-	
-	archive = file->archive;
-	archive_name = name_quote (get_archive_name (archive), 0);
-	p = get_path_from_entry (file->entry);
-	file_name = name_quote (p, 0);
-	g_free (p);
-	
-	mc_extfsdir = concat_dir_and_file (mc_home, "extfs/");
-	cmd = g_strconcat (mc_extfsdir,
-			    extfs_prefixes [archive->fstype],
-			    " copyin ", archive_name, " ",
-			    file_name, " ",
-			    file->entry->inode->local_filename, NULL);
-	g_free (archive_name);
-	g_free (file_name);
-	g_free (mc_extfsdir);
-	if (my_system (EXECUTE_AS_SHELL, shell, cmd))
+    if (file->has_changed) {
+	if (extfs_cmd (" copyin ", file->archive, file->entry,
+		       file->entry->inode->local_filename))
 	    errno_code = EIO;
-	g_free (cmd);
 	{
 	    struct stat file_status;
-	    if (stat(file->entry->inode->local_filename,&file_status) != 0)
-    		errno_code = EIO;
+	    if (stat (file->entry->inode->local_filename, &file_status) != 0)
+		errno_code = EIO;
 	    else
 		file->entry->inode->size = file_status.st_size;
 	}
 
 	file->entry->inode->mtime = time (NULL);
     }
-    
+
     file->archive->fd_usage--;
     if (!file->archive->fd_usage) {
         struct vfs_stamping *parent;
@@ -1012,10 +1010,7 @@ static int extfs_unlink (vfs *me, char *
 {
     struct archive *archive;
     char *q;
-    char *mc_extfsdir;
     struct entry *entry;
-    char *cmd;
-    char *archive_name, *p;
 
     if ((q = get_path_mangle (file, &archive, 0, 0)) == NULL)
 	return -1;
@@ -1026,23 +1021,10 @@ static int extfs_unlink (vfs *me, char *
 	return -1;
     if (S_ISDIR (entry->inode->mode)) ERRNOR (EISDIR, -1);
 
-    p = get_path_from_entry (entry);
-    q = name_quote (p, 0);
-    g_free (p);
-    archive_name = name_quote (get_archive_name (archive), 0);
-
-    mc_extfsdir = concat_dir_and_file (mc_home, "extfs/");
-    cmd = g_strconcat (mc_extfsdir, extfs_prefixes [archive->fstype],
-		       " rm ",  archive_name, " ", q, NULL);
-    g_free (q);
-    g_free (mc_extfsdir);
-    g_free (archive_name);
-    if (my_system (EXECUTE_AS_SHELL, shell, cmd)){
-        g_free (cmd);
+    if (extfs_cmd (" rm ", archive, entry, "")){
         my_errno = EIO;
         return -1;
     }
-    g_free (cmd);
     remove_entry (entry);
 
     return 0;
@@ -1052,10 +1034,7 @@ static int extfs_mkdir (vfs *me, char *p
 {
     struct archive *archive;
     char *q;
-    char *mc_extfsdir;
     struct entry *entry;
-    char *cmd;
-    char *archive_name, *p;
 
     if ((q = get_path_mangle (path, &archive, 0, 0)) == NULL)
 	return -1;
@@ -1068,24 +1047,11 @@ static int extfs_mkdir (vfs *me, char *p
 	return -1;
     if (!S_ISDIR (entry->inode->mode)) ERRNOR (ENOTDIR, -1);
 
-    p = get_path_from_entry (entry);
-    q = name_quote (p, 0);
-    g_free (p);
-    archive_name = name_quote (get_archive_name (archive), 0);
-
-    mc_extfsdir = concat_dir_and_file (mc_home, "extfs/");
-    cmd = g_strconcat (mc_extfsdir, extfs_prefixes [archive->fstype],
-		       " mkdir ",  archive_name, " ", q, NULL);
-    g_free (q);
-    g_free (mc_extfsdir);
-    g_free (archive_name);
-    if (my_system (EXECUTE_AS_SHELL, shell, cmd)){
-	g_free (cmd);
+    if (extfs_cmd (" mkdir ", archive, entry, "")){
 	my_errno = EIO;
 	remove_entry (entry);
 	return -1;
     }
-    g_free (cmd);
 
     return 0;
 }
@@ -1094,10 +1060,7 @@ static int extfs_rmdir (vfs *me, char *p
 {
     struct archive *archive;
     char *q;
-    char *mc_extfsdir;
     struct entry *entry;
-    char *cmd;
-    char *archive_name, *p;
 
     if ((q = get_path_mangle (path, &archive, 0, 0)) == NULL)
 	return -1;
@@ -1108,23 +1071,10 @@ static int extfs_rmdir (vfs *me, char *p
 	return -1;
     if (!S_ISDIR (entry->inode->mode)) ERRNOR (ENOTDIR, -1);
 
-    p = get_path_from_entry (entry);
-    q = name_quote (p, 0);
-    g_free (p);
-    archive_name = name_quote (get_archive_name (archive), 0);
-
-    mc_extfsdir = concat_dir_and_file (mc_home, "extfs/");
-    cmd = g_strconcat (mc_extfsdir, extfs_prefixes [archive->fstype],
-		       " rmdir ",  archive_name, " ", q, NULL);
-    g_free (q);
-    g_free (mc_extfsdir);
-    g_free (archive_name);
-    if (my_system (EXECUTE_AS_SHELL, shell, cmd)){
-        g_free (cmd);
+    if (extfs_cmd (" rmdir ", archive, entry, "")){
         my_errno = EIO;
         return -1;
     }
-    g_free (cmd);
     remove_entry (entry);
 
     return 0;





More information about the mc-devel mailing list