The following commit has been merged in the master branch:
commit df4129517b53d2851368dc5ed5fbcc2b5eec9ee8
Merge: a1b47185c952e9d31607d59420a0cb86e9f492ab 
7a51b50d5ce442970eb3909cddae236b53025877
Author: Sergei Trofimovich <sly...@inbox.ru>
Date:   Sun Feb 1 14:26:54 2009 +0200

    Merge branch 'mc-4.6'
    
    * mc-4.6: (38 commits)
      mhl: mhl_shell_unescape_buf(): fixed memory array OOB.
      completion: fixed complete already escaped secuences.
      completion: added changelog entry for solved #147
      completion: fixed completion of escaped commands in commandline
      Removed unused char*.
      mhl: added mhl_strmove() function (memmove semantics)
      completion: added escapes in command line on completion
      complete: cleanup: #define to enum INPUT_COMPLETION_FLAGS
      added a new parameter for completion flags to input_new
      fish: cleanup: unboxed quoted strings when generate shell commands
      introduced new type SHELL_ESCAPED_STR for more type safety
      added mhl/types.h which defines bool enum, escape.h now using this type
      Removed unused variable
      Changes for use MHL.
      Fixed bug with renamig/copying files with backshashes in names
      Remove some testing stuff
      Temporarry commit. Fixed completion in browse by directoryes.
      Fixed some memory leaks.
      Add $ and ` for escaping and reorder it according to the ascii values
      Rewrite it to use g_string_append_c instead of some homebrew stuff
      ...

diff --combined ChangeLog
index cc5b4da,6e4f378..a63a22d
--- a/ChangeLog
+++ b/ChangeLog
@@@ -1,3 -1,11 +1,11 @@@
+ 2009-01-31 Enrico Weigelt, metux ITS <weig...@metux.de>, Patrick Winnertz 
<win...@debian.org>, Slava Zanko <slavaza...@gmail.com>, Sergei Trofimovich  
<sly...@inbox.ru>
+ 
+       * edit/editcmd.c, mhl/escape.h, mhl/string.h, mhl/types.h, 
src/Makefile.am,
+       * src/boxes.c, src/command.c, src/complete.c, src/complete.h, 
src/file.c,
+       * src/find.c, src/main.c, src/panelize.c, src/util.c, src/utilunix.c,
+       * src/widget.c, src/widget.h, src/wtools.c, vfs/fish.c:
+         fixed shell escaping issues in commandline completion engine
+ 
  2009-01-31 Enrico Weigelt, metux ITS <weig...@metux.de>
  
        * replaced buggy concat_dir_and_file() by mhl_str_dir_plus_file() (in 
mhl/string.h)
@@@ -17,6 -25,11 +25,11 @@@
          This solves "strange" rename cases, when copying/moving is performed 
into
          deleted directory.
  
+ 2009-01-27 Enrico Weigelt, metux ITS <weig...@metux.de>
+ 
+       * mhl/escape.h, src/complete.c, vfs/fish.c: introduced new type 
+         SHELL_ESCAPED_STR for more type safety
+ 
  2009-01-27 Enrico Weigelt, metux IT service <weig...@metux.de>
  
        * mhl/escape.h, mhl/string.h: fixed comments to use /* ... */
@@@ -26,11 -39,6 +39,11 @@@
        * syntax/python.syntax: Added syntax highlighting for
        pytnoh-2.6+ keywords (patch sent by NNemec)
  
 +2009-01-26 Mikhail S. Pobolovets <styx...@gmail.com>
 +
 +      * vfs/fish.c: Iterpret SUP.flags as port number if SUP.flags is not in
 +        0, FISH_FLAG_COMPRESSED and FISH_FLAG_RSH. Weakness: port number
 +
  2009-01-25 Ilia Maslakov <il.sm...@gmail.com>
  
        * src/boxes.c, src/boxes.h, src/dir.c, src/dir.h:
@@@ -42,10 -50,6 +55,10 @@@
        * mhl/string.h, vfs/fish.c, vfs/utilvfs.c, vfs/utilvfs.h: Reworked fish 
code
          so that symlinks and files which special characters works now
  
 +2009-01-25 Mikhail S. Pobolovets <styx...@gmail.com>
 +      * src/cmd.c src/option.c src/setup.c src/main.h: Automatic new 
directory(Mkdir, F7)
 +        name filling. Can be configured (on|off) in 'Configure options'
 +
  2009-01-25 Enrico Weigelt <weig...@metux.de>
  
        * edit/editcmd.c, src/cmd.c, src/ext.c, src/history.h:
@@@ -65,19 -69,10 +78,19 @@@
          - prevent . to match a newline (\n)
          - match from start of line and not from cursor position
  
 +2009-01-24  Enrico Weigelt, metux IT service <weig...@metux.de>
 +
 +      * syntax/Syntax, syntax/nemerle.syntax: Added syntax rules 
 +        for Nemerle source files
 +
 +2009-01-19 Patrick Winnertz <win...@debian.org>
 +
 +      * edit/edit.h: Add two more ints
 +      * src/setup.c: Add keybinding to disable tab highlighting
 +
  2009-01-18 Patrick Winnertz <win...@debian.org>
  
 -      * edit/editdraw.c: Moved var into if clause as it's only used
 -      there
 +      * edit/editdraw.c: Moved var into if clause as it's only used there
        * edit/editlock.c: Removed unnecessary arguement to if condition
        * src/cmd.c: Removed unused pointer
        * src/hotlist.c: Removed unused function save_group
@@@ -115,29 -110,7 +128,29 @@@
  2009-01-11 Patrick Winnertz <win...@debian.org>
  
        * syntax/pascal.syntax: Added syntax highlighting for 
 -      some delphi keywords
 +        some delphi keywords
 +
 +2009-01-10  Enrico Weigelt, metux ITS <weig...@metux.de>
 +
 +      * syntax/Makefile.am syntax/Syntax syntax/haskell.syntax:
 +      added syntax definition for Haskell (taken from rhclub-tree)
 +      * syntax: added ebuild Syntax defition (taken from rhclub-tree)
 +
 +2009-01-10  Enrico Weigelt, metux ITS <weig...@metux.de>
 +
 +      * edit/editcmd.c:
 +      * src/achown.c src/background.c src/boxes.c src/chmod.c:
 +      * src/chown.c src/cmd.c src/command.c src/dir.c src/execute.c:
 +      * src/ext.c src/file.c src/filegui.c src/find.c src/help.c:
 +      * src/learn.c src/main.c src/panelize.c src/screen.c:
 +      * src/selcodepage.c src/subshell.c src/tree.c src/user.c:
 +      * src/utilunix.c src/view.c:
 +      * vfs/cpio.c vfs/direntry.c vfs/extfs.c vfs/fish.c vfs/ftpfs.c:
 +      * vfs/mcfs.c vfs/sfs.c vfs/smbfs.c vfs/tar.c vfs/undelfs.c:
 +      * vfs/utilvfs.c vfs/vfs.c:
 +      
 +      Changed message type codes on calls to message(), query_dialog(),
 +      close_error_pipe() from numeric IDs to symbols D_ERROR, D_NORMAL
  
  2008-12-18  Roland Illig  <roland.il...@gmx.de>
  
@@@ -315,7 -288,7 +328,7 @@@
  
        * doc/mc.1.in: Document `fish_directory_timeout'.
  
 -2006-02-18  David Martin  <<dmart...@excite.com>
 +2006-02-18  David Martin  <dmart...@excite.com>
  
        * doc/es/mc.1.in: Cleanup. Fix key naming.
  
diff --combined edit/editcmd.c
index 9910f5c,d223c35..07286b6
--- a/edit/editcmd.c
+++ b/edit/editcmd.c
@@@ -626,7 -626,7 +626,7 @@@ edit_raw_key_query (const char *heading
                    NULL, heading,
                    DLG_CENTER | DLG_TRYUP | DLG_WANT_TAB);
      add_widget (raw_dlg,
-               input_new (3 - cancel, w - 5, INPUT_COLOR, 2, "", 0));
+               input_new (3 - cancel, w - 5, INPUT_COLOR, 2, "", 0, 
INPUT_COMPLETE_DEFAULT));
      add_widget (raw_dlg, label_new (3 - cancel, 2, query));
      if (cancel)
        add_widget (raw_dlg,
@@@ -2052,7 -2052,7 +2052,7 @@@ edit_replace_cmd (WEdit *edit, int agai
            edit->force |= REDRAW_PAGE;
            edit_render_keypress (edit);
            if (times_replaced) {
 -              message (0, msg, _(" %ld replacements made. "),
 +              message (D_NORMAL, msg, _(" %ld replacements made. "),
                         times_replaced);
            } else
                query_dialog (msg, _(" Search string not found "),
@@@ -2131,7 -2131,7 +2131,7 @@@ void edit_search_cmd (WEdit * edit, in
                }
                if (found) {
  /* in response to number of bookmarks added because of string being found %d 
times */
 -                  message (0, _("Search"), _(" %d items found, %d bookmarks 
added "), found, books);
 +                  message (D_NORMAL, _("Search"), _(" %d items found, %d 
bookmarks added "), found, books);
                } else {
                    edit_error_dialog (_ ("Search"), _ (" Search string not 
found "));
                }
@@@ -2589,7 -2589,7 +2589,7 @@@ edit_block_process_cmd (WEdit *edit, co
                         quoted_name, (char *) NULL));
      }
      g_free (quoted_name);
 -    close_error_pipe (0, 0);
 +    close_error_pipe (D_NORMAL, NULL);
  
      edit_refresh_cmd (edit);
      edit->force |= REDRAW_COMPLETELY;
diff --combined src/boxes.c
index 5c66f3d,0ff72d4..48ac3a9
--- a/src/boxes.c
+++ b/src/boxes.c
@@@ -197,7 -197,7 +197,7 @@@ display_init (int radio_sel, char *init
  
      status =
        input_new (10, 9, INPUT_COLOR, DISPLAY_X - 14, _status[radio_sel],
-                  "mini-input");
+                  "mini-input", INPUT_COMPLETE_DEFAULT);
      add_widget (dd, status);
      input_set_point (status, 0);
  
@@@ -207,7 -207,7 +207,7 @@@
  
      user =
        input_new (7, 9, INPUT_COLOR, DISPLAY_X - 14, init_text,
-                  "user-fmt-input");
+                  "user-fmt-input", INPUT_COMPLETE_DEFAULT);
      add_widget (dd, user);
      input_set_point (user, 0);
  
@@@ -633,7 -633,7 +633,7 @@@ display_bits_box (void
        errmsg =
            init_translation_table (source_codepage, display_codepage);
        if (errmsg)
 -          message (1, MSG_ERROR, "%s", errmsg);
 +          message (D_ERROR, MSG_ERROR, "%s", errmsg);
  #ifndef HAVE_SLANG
        meta (stdscr, display_codepage != 0);
  #else
@@@ -1085,17 -1085,17 +1085,17 @@@ vfs_smb_get_authinfo (const char *host
  
      g_free (title);
  
-     in_user  = input_new (5, istart, INPUT_COLOR, ilen, user, "auth_name");
+     in_user  = input_new (5, istart, INPUT_COLOR, ilen, user, "auth_name", 
INPUT_COMPLETE_DEFAULT);
      add_widget (auth_dlg, in_user);
  
-     in_domain = input_new (3, istart, INPUT_COLOR, ilen, domain, 
"auth_domain");
+     in_domain = input_new (3, istart, INPUT_COLOR, ilen, domain, 
"auth_domain", INPUT_COMPLETE_DEFAULT);
      add_widget (auth_dlg, in_domain);
      add_widget (auth_dlg, button_new (9, b2, B_CANCEL, NORMAL_BUTTON,
                   buts[1], 0));
      add_widget (auth_dlg, button_new (9, b0, B_ENTER, DEFPUSH_BUTTON,
                   buts[0], 0));
  
-     in_password  = input_new (7, istart, INPUT_COLOR, ilen, "", 
"auth_password");
+     in_password  = input_new (7, istart, INPUT_COLOR, ilen, "", 
"auth_password", INPUT_COMPLETE_DEFAULT);
      in_password->completion_flags = 0;
      in_password->is_password = 1;
      add_widget (auth_dlg, in_password);
diff --combined src/command.c
index 35fa5ec,e608bf0..7b7b7c9
--- a/src/command.c
+++ b/src/command.c
@@@ -27,13 -27,14 +27,14 @@@
  #include <errno.h>
  #include <string.h>
  
+ #include <mhl/memory.h>
+ #include <mhl/escape.h>
  #include <mhl/string.h>
  
  #include "global.h"           /* home_dir */
  #include "tty.h"
  #include "widget.h"           /* WInput */
  #include "command.h"
- #include "complete.h"         /* completion constants */
  #include "wtools.h"           /* message () */
  #include "panel.h"            /* view_tree enum. Also, needed by main.h */
  #include "main.h"             /* do_cd */
@@@ -66,6 -67,7 +67,7 @@@ examine_cd (char *path
      const char *t;
  
      /* Tilde expansion */
+     path = mhl_shell_unescape_buf(path);
      path_tilde = tilde_expand (path);
  
      /* Leave space for further expansion */
@@@ -137,6 -139,7 +139,7 @@@
      }
      g_free (q);
      g_free (path_tilde);
+ //    mhl_mem_free(path);
      return result;
  }
  
@@@ -185,7 -188,7 +188,7 @@@ void do_cd_command (char *cmd
      } else
        if (!examine_cd (&cmd [3])) {
            char *d = strip_password (g_strdup (&cmd [3]), 1);
 -          message (1, MSG_ERROR, _(" Cannot chdir to \"%s\" \n %s "),
 +          message (D_ERROR, MSG_ERROR, _(" Cannot chdir to \"%s\" \n %s "),
                     d, unix_error_string (errno));
            g_free (d);
            return;
@@@ -217,7 -220,7 +220,7 @@@ enter (WInput *cmdline
        size_t i, j, cmd_len;
  
        if (!vfs_current_is_local ()) {
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                     _
                     (" Cannot execute commands on non-local filesystems"));
  
@@@ -227,7 -230,7 +230,7 @@@
        /* Check this early before we clean command line
         * (will be checked again by shell_execute) */
        if (use_subshell && subshell_state != INACTIVE) {
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                     _(" The shell is already running a command "));
            return MSG_NOT_HANDLED;
        }
@@@ -292,7 -295,8 +295,8 @@@ command_new (int y, int x, int cols
  {
      WInput *cmd;
  
-     cmd = input_new (y, x, DEFAULT_COLOR, cols, "", "cmdline");
+     cmd = input_new (y, x, DEFAULT_COLOR, cols, "", "cmdline",
+       INPUT_COMPLETE_DEFAULT | INPUT_COMPLETE_CD | INPUT_COMPLETE_COMMANDS | 
INPUT_COMPLETE_SHELL_ESC);
  
      /* Add our hooks */
      cmd->widget.callback = command_callback;
diff --combined src/file.c
index dff29de,6400e3e..cb61307
--- a/src/file.c
+++ b/src/file.c
@@@ -50,6 -50,8 +50,8 @@@
  #include <sys/stat.h>
  #include <unistd.h>
  
+ #include <mhl/memory.h>
+ #include <mhl/escape.h>
  #include <mhl/string.h>
  
  #include "global.h"
@@@ -65,6 -67,7 +67,7 @@@
  #include "widget.h"
  #include "wtools.h"
  #include "background.h"               /* we_are_background */
+ #include "util.h"
  
  /* Needed for current_panel, other_panel and WTree */
  #include "dir.h"
@@@ -178,43 -181,49 +181,49 @@@ do_transform_source (FileOpContext *ctx
      for (next_reg = 1, j = 0, k = 0; j < strlen (ctx->dest_mask); j++) {
        switch (ctx->dest_mask[j]) {
        case '\\':
-           j++;
-           if (!isdigit ((unsigned char) ctx->dest_mask[j])) {
-               /* Backslash followed by non-digit */
-               switch (ctx->dest_mask[j]) {
-               case 'U':
-                   case_conv |= UP_SECT;
-                   case_conv &= ~LOW_SECT;
-                   break;
-               case 'u':
-                   case_conv |= UP_CHAR;
-                   break;
-               case 'L':
-                   case_conv |= LOW_SECT;
-                   case_conv &= ~UP_SECT;
-                   break;
-               case 'l':
-                   case_conv |= LOW_CHAR;
-                   break;
-               case 'E':
-                   case_conv = NO_CONV;
-                   break;
-               default:
-                   /* Backslash as quote mark */
-                   fntarget[k++] =
-                       convert_case (ctx->dest_mask[j], &case_conv);
-               }
+           if (mhl_shell_is_char_escaped (&ctx->dest_mask[j])){
+               fntarget[k++] = ctx->dest_mask[j++];
+               fntarget[k++] = ctx->dest_mask[j];
                break;
            } else {
-               /* Backslash followed by digit */
-               next_reg = ctx->dest_mask[j] - '0';
-               /* Fall through */
+               j++;
+               if (!isdigit ((unsigned char) ctx->dest_mask[j])) {
+                   /* Backslash followed by non-digit */
+                   switch (ctx->dest_mask[j]) {
+                   case 'U':
+                       case_conv |= UP_SECT;
+                       case_conv &= ~LOW_SECT;
+                       break;
+                   case 'u':
+                       case_conv |= UP_CHAR;
+                       break;
+                   case 'L':
+                       case_conv |= LOW_SECT;
+                       case_conv &= ~UP_SECT;
+                       break;
+                   case 'l':
+                       case_conv |= LOW_CHAR;
+                       break;
+                   case 'E':
+                       case_conv = NO_CONV;
+                       break;
+                   default:
+                       /* Backslash as quote mark */
+                       fntarget[k++] =
+                           convert_case (ctx->dest_mask[j], &case_conv);
+                   }
+                   break;
+               } else {
+                   /* Backslash followed by digit */
+                   next_reg = ctx->dest_mask[j] - '0';
+                   /* Fall through */
+               }
            }
  
        case '*':
            if (next_reg < 0 || next_reg >= RE_NREGS
                || ctx->regs.start[next_reg] < 0) {
 -              message (1, MSG_ERROR, _(" Invalid target mask "));
 +              message (D_ERROR, MSG_ERROR, _(" Invalid target mask "));
                transform_error = FILE_ABORT;
                return NULL;
            }
@@@ -314,7 -323,7 +323,7 @@@ check_hardlinks (const char *src_name, 
                    }
                }
            }
 -          message (1, MSG_ERROR, _(" Cannot make the hardlink "));
 +          message (D_ERROR, MSG_ERROR, _(" Cannot make the hardlink "));
            return 0;
        }
      lp = (struct link *) g_malloc (sizeof (struct link) + strlen (src_name)
@@@ -368,7 -377,7 +377,7 @@@ make_symlink (FileOpContext *ctx, cons
  
      if (ctx->stable_symlinks)
        if (!vfs_file_is_local (src_path) || !vfs_file_is_local (dst_path)) {
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                        _(" Cannot make stable symlinks across "
                          "non-local filesystems: \n\n"
                          " Option Stable Symlinks will be disabled "));
@@@ -512,7 -521,7 +521,7 @@@ copy_file_file (FileOpContext *ctx, con
      if (dst_exists) {
        /* Destination already exists */
        if (sb.st_dev == sb2.st_dev && sb.st_ino == sb2.st_ino) {
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                    _(" `%s' and `%s' are the same file "), src_path, dst_path);
            do_refresh ();
            return FILE_SKIP;
@@@ -588,7 -597,7 +597,7 @@@
  
      if (ctx->do_reget) {
        if (mc_lseek (src_desc, ctx->do_reget, SEEK_SET) != ctx->do_reget) {
 -          message (1, _("Warning"),
 +          message (D_ERROR, _("Warning"),
                        _(" Reget failed, about to overwrite file "));
            ctx->do_reget = ctx->do_append = 0;
        }
@@@ -793,7 -802,7 +802,7 @@@
            }
        }
  
-       if (!appending) {
+       if (!appending && ctx->preserve) {
            while (mc_chmod (dst_path, (src_mode & ctx->umask_kill))) {
                temp_status = file_error (
                        _(" Cannot chmod target file \"%s\" \n %s "), dst_path);
@@@ -870,7 -879,7 +879,7 @@@ copy_dir_dir (FileOpContext *ctx, cons
  
      if (is_in_linklist (parent_dirs, s, &cbuf)) {
        /* we found a cyclic symbolic link */
 -      message (1, MSG_ERROR,
 +      message (D_ERROR, MSG_ERROR,
                    _(" Cannot copy cyclic symbolic link \n `%s' "), s);
        return FILE_SKIP;
      }
@@@ -1054,14 -1063,14 +1063,14 @@@ move_file_file (FileOpContext *ctx, con
  
            strcpy (st, path_trunc (s, msize));
            strcpy (dt, path_trunc (d, msize));
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                        _(" `%s' and `%s' are the same file "), st, dt);
            do_refresh ();
            return FILE_SKIP;
        }
  
        if (S_ISDIR (dst_stats.st_mode)) {
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                        _(" Cannot overwrite directory `%s' "), d);
            do_refresh ();
            return FILE_SKIP;
@@@ -1177,7 -1186,7 +1186,7 @@@ move_dir_dir (FileOpContext *ctx, cons
  
        strcpy (st, path_trunc (s, msize));
        strcpy (dt, path_trunc (d, msize));
 -      message (1, MSG_ERROR,
 +      message (D_ERROR, MSG_ERROR,
                    _(" `%s' and `%s' are the same directory "), st, dt);
        do_refresh ();
        return FILE_SKIP;
@@@ -1755,7 -1764,7 +1764,7 @@@ panel_operate (void *source_panel, File
        }
  
        if (!strcmp (source, "..")) {
 -          message (1, MSG_ERROR, _(" Cannot operate on \"..\"! "));
 +          message (D_ERROR, MSG_ERROR, _(" Cannot operate on \"..\"! "));
            return 0;
        }
      }
@@@ -1833,7 -1842,7 +1842,7 @@@
                           g_strconcat (op_names[operation], ": ",
                                        panel->cwd, NULL));
        if (v == -1) {
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                     _(" Sorry, I could not put the job in background "));
        }
  
@@@ -1896,7 -1905,7 +1905,7 @@@
                g_free (dest);
                dest = temp2;
                temp = NULL;
- 
+               
                switch (operation) {
                case OP_COPY:
                    /*
@@@ -1988,6 -1997,9 +1997,9 @@@
                else {
                    char *temp2 = mhl_str_dir_plus_file (dest, temp);
  
+                   source_with_path = mhl_shell_unescape_buf(source_with_path);
+                   temp2 = mhl_shell_unescape_buf(temp2);
+ 
                    switch (operation) {
                    case OP_COPY:
                        /*
diff --combined src/find.c
index 7590811,9ff1ef7..ca06df9
--- a/src/find.c
+++ b/src/find.c
@@@ -167,7 -167,7 +167,7 @@@ find_parm_callback (struct Dlg_head *h
            flags |= REG_ICASE;
  
        if (regcomp (r, in_with->buffer, flags)) {
 -          message (1, MSG_ERROR, _("  Malformed regular expression  "));
 +          message (D_ERROR, MSG_ERROR, _("  Malformed regular expression  "));
            dlg_select_widget (in_with);
            h->running = 1;     /* Don't stop the dialog */
        }
@@@ -276,16 -276,16 +276,16 @@@ find_parameters (char **start_dir, cha
      add_widget (find_dlg, case_sense);
  
      in_with =
-       input_new (8, istart, INPUT_COLOR, ilen, in_contents, "content");
+       input_new (8, istart, INPUT_COLOR, ilen, in_contents, "content", 
INPUT_COMPLETE_DEFAULT);
      add_widget (find_dlg, in_with);
  
      add_widget (find_dlg, recursively_cbox);
      in_name =
-       input_new (5, istart, INPUT_COLOR, ilen, in_start_name, "name");
+       input_new (5, istart, INPUT_COLOR, ilen, in_start_name, "name", 
INPUT_COMPLETE_DEFAULT);
      add_widget (find_dlg, in_name);
  
      in_start =
-       input_new (3, istart, INPUT_COLOR, ilen, in_start_dir, "start");
+       input_new (3, istart, INPUT_COLOR, ilen, in_start_dir, "start", 
INPUT_COMPLETE_DEFAULT);
      add_widget (find_dlg, in_start);
  
      add_widget (find_dlg, label_new (8, 3, labs[2]));
diff --combined src/main.c
index 8be5841,db26945..89fd0fd
--- a/src/main.c
+++ b/src/main.c
@@@ -67,7 -67,6 +67,6 @@@
  #include "widget.h"
  #include "command.h"
  #include "wtools.h"
- #include "complete.h"         /* For the free_completion */
  
  #include "chmod.h"
  #include "chown.h"
@@@ -426,7 -425,7 +425,7 @@@ voi
  do_possible_cd (const char *new_dir)
  {
      if (!do_cd (new_dir, cd_exact))
 -      message (1, _("Warning"),
 +      message (D_ERROR, _("Warning"),
                 _(" The Commander can't change to the directory that \n"
                   " the subshell claims you are in.  Perhaps you have \n"
                   " deleted your working directory, or given yourself \n"
@@@ -472,7 -471,7 +471,7 @@@ quit_cmd_internal (int quiet
      } else {
        if (query_dialog
            (_(" The Midnight Commander "),
 -           _(" Do you really want to quit the Midnight Commander? "), 0,
 +           _(" Do you really want to quit the Midnight Commander? "), 
D_NORMAL,
             2, _("&Yes"), _("&No")) == 0)
            q = 1;
      }
@@@ -687,7 -686,7 +686,7 @@@ directory_history_list (WPanel *panel
      if (_do_panel_cd (panel, s, cd_exact))
        directory_history_add (panel, panel->cwd);
      else
 -      message (1, MSG_ERROR, _("Cannot change directory"));
 +      message (D_ERROR, MSG_ERROR, _("Cannot change directory"));
      g_free (s);
  }
  
@@@ -994,7 -993,7 +993,7 @@@ toggle_fast_reload (void
  {
      fast_reload = !fast_reload;
      if (fast_reload_w == 0 && fast_reload) {
 -      message (0, _(" Information "),
 +      message (D_NORMAL, _(" Information "),
                 _
                 (" Using the fast reload option may not reflect the exact \n"
                  " directory contents. In this case you'll need to do a   \n"
diff --combined src/panelize.c
index f102812,ef80619..d15f093
--- a/src/panelize.c
+++ b/src/panelize.c
@@@ -165,7 -165,7 +165,7 @@@ init_panelize (void
  
      pname =
        input_new (UY + 14, UX, INPUT_COLOR, panelize_dlg->cols - 10, "",
-                  "in");
+                  "in", INPUT_COMPLETE_DEFAULT);
      add_widget (panelize_dlg, pname);
  
      add_widget (panelize_dlg, label_new (UY + 13, UX, _("Command")));
@@@ -266,7 -266,7 +266,7 @@@ external_panelize (void
      char *target = NULL;
  
      if (!vfs_current_is_local ()){
 -      message (1, MSG_ERROR,
 +      message (D_ERROR, MSG_ERROR,
                 _(" Cannot run external panelize in a non-local directory "));
        return;
      }
@@@ -369,7 -369,7 +369,7 @@@ static void do_external_panelize (char 
      open_error_pipe ();
      external = popen (command, "r");
      if (!external){
 -      close_error_pipe (1, _("Cannot invoke command."));
 +      close_error_pipe (D_ERROR, _("Cannot invoke command."));
        return;
      }
      /* Clear the counters and the directory list */
@@@ -420,8 -420,8 +420,8 @@@
        current_panel->count = set_zero_dir (list);
      }
      if (pclose (external) < 0)
 -      message (0, _("External panelize"), _("Pipe close failed"));
 -    close_error_pipe (0, 0);
 +      message (D_NORMAL, _("External panelize"), _("Pipe close failed"));
 +    close_error_pipe (D_NORMAL, NULL);
      try_to_select (current_panel, NULL);
      panel_re_sort (current_panel);
  }
diff --combined src/utilunix.c
index cd3c7cc,1b72b2e..4b088e5
--- a/src/utilunix.c
+++ b/src/utilunix.c
@@@ -41,6 -41,8 +41,8 @@@
  #endif
  #include <unistd.h>
  
+ #include <mhl/string.h>
+ 
  #include "global.h"
  #include "execute.h"
  #include "wtools.h"           /* message() */
@@@ -339,11 -341,11 +341,11 @@@ static int old_error;           /* File descript
  void open_error_pipe (void)
  {
      if (pipe (error_pipe) < 0){
 -      message (0, _("Warning"), _(" Pipe failed "));
 +      message (D_NORMAL, _("Warning"), _(" Pipe failed "));
      }
      old_error = dup (2);
      if(old_error < 0 || close(2) || dup (error_pipe[1]) != 2){
 -      message (0, _("Warning"), _(" Dup failed "));
 +      message (D_NORMAL, _("Warning"), _(" Dup failed "));
        close (error_pipe[0]);
        close (error_pipe[1]);
      }
@@@ -426,7 -428,7 +428,7 @@@ canonicalize_pathname (char *path
        if (p[0] == PATH_SEP && p[1] == PATH_SEP) {
            s = p + 1;
            while (*(++s) == PATH_SEP);
-           strcpy (p + 1, s);
+           mhl_strmove (p + 1, s);
        }
        p++;
      }
@@@ -435,7 -437,7 +437,7 @@@
      p = lpath;
      while (*p) {
        if (p[0] == PATH_SEP && p[1] == '.' && p[2] == PATH_SEP)
-           strcpy (p, p + 2);
+           mhl_strmove (p, p + 2);
        else
            p++;
      }
@@@ -451,7 -453,7 +453,7 @@@
            lpath[1] = 0;
            return;
        } else {
-           strcpy (lpath, lpath + 2);
+           mhl_strmove (lpath, lpath + 2);
        }
      }
  
@@@ -497,10 -499,10 +499,10 @@@
        if (p[3] != 0) {
            if (s == lpath && *s == PATH_SEP) {
                /* "/../foo" -> "/foo" */
-               strcpy (s + 1, p + 4);
+               mhl_strmove (s + 1, p + 4);
            } else {
                /* "token/../foo" -> "foo" */
-               strcpy (s, p + 4);
+               mhl_strmove (s, p + 4);
            }
            p = (s > lpath) ? s - 1 : s;
            continue;
diff --combined vfs/fish.c
index 5d24d52,7df2e1e..6d45387
--- a/vfs/fish.c
+++ b/vfs/fish.c
@@@ -144,7 -144,7 +144,7 @@@ fish_command (struct vfs_class *me, str
      enable_interrupt_key ();
  
      status = write (SUP.sockw, str, strlen (str));
-     g_free (str);
+     mhl_mem_free (str);
  
      disable_interrupt_key ();
      if (status < 0)
@@@ -168,10 -168,10 +168,10 @@@ fish_free_archive (struct vfs_class *me
        close (SUP.sockr);
        SUP.sockw = SUP.sockr = -1;
      }
-     g_free (SUP.host);
-     g_free (SUP.user);
-     g_free (SUP.cwdir);
-     g_free (SUP.password);
+     mhl_mem_free (SUP.host);
+     mhl_mem_free (SUP.user);
+     mhl_mem_free (SUP.cwdir);
+     mhl_mem_free (SUP.password);
  }
  
  static void
@@@ -216,22 -216,13 +216,22 @@@ static in
  fish_open_archive_int (struct vfs_class *me, struct vfs_s_super *super)
  {
      {
 -      const char *argv[10];
 +      char gbuf[10];
 +      const char *argv[10];   /* All of 10 is used now */
        const char *xsh = (SUP.flags == FISH_FLAG_RSH ? "rsh" : "ssh");
        int i = 0;
  
        argv[i++] = xsh;
        if (SUP.flags == FISH_FLAG_COMPRESSED)
            argv[i++] = "-C";
 +
 +      if (SUP.flags > FISH_FLAG_RSH)
 +      {
 +          argv[i++] = "-p";
 +          g_snprintf (gbuf, sizeof (gbuf), "%d", SUP.flags);
 +          argv[i++] = gbuf;
 +      }
 +
        argv[i++] = "-l";
        argv[i++] = SUP.user;
        argv[i++] = SUP.host;
@@@ -251,7 -242,7 +251,7 @@@
            /* Currently, this does not work. ssh reads passwords from
               /dev/tty, not from stdin :-(. */
  
 -          message (1, MSG_ERROR,
 +          message (D_ERROR, MSG_ERROR,
                     _
                     ("Sorry, we cannot do password authenticated connections 
for now."));
            ERRNOR (EPERM, -1);
@@@ -260,7 -251,7 +260,7 @@@
                p = g_strconcat (_(" fish: Password required for "),
                                 SUP.user, " ", (char *) NULL);
                op = vfs_get_password (p);
-               g_free (p);
+               mhl_mem_free (p);
                if (op == NULL)
                    ERRNOR (EPERM, -1);
                SUP.password = op;
@@@ -323,13 -314,13 +323,13 @@@ fish_open_archive (struct vfs_class *me
      p = vfs_split_url (strchr (op, ':') + 1, &host, &user, &flags,
                       &password, 0, URL_NOSLASH);
  
-     g_free (p);
+     mhl_mem_free (p);
  
      SUP.host = host;
      SUP.user = user;
      SUP.flags = flags;
      if (!strncmp (op, "rsh:", 4))
 -      SUP.flags |= FISH_FLAG_RSH;
 +      SUP.flags = FISH_FLAG_RSH;
      SUP.cwdir = NULL;
      if (password)
        SUP.password = password;
@@@ -350,12 -341,12 +350,12 @@@ fish_archive_same (struct vfs_class *me
      op = vfs_split_url (strchr (op, ':') + 1, &host, &user, &flags, 0, 0,
                        URL_NOSLASH);
  
-     g_free (op);
+     mhl_mem_free (op);
  
      flags = ((strcmp (host, SUP.host) == 0)
             && (strcmp (user, SUP.user) == 0) && (flags == SUP.flags));
-     g_free (host);
-     g_free (user);
+     mhl_mem_free (host);
+     mhl_mem_free (user);
  
      return flags;
  }
@@@ -367,7 -358,7 +367,7 @@@ fish_dir_load(struct vfs_class *me, str
      char buffer[8192];
      struct vfs_s_entry *ent = NULL;
      FILE *logfile;
-     char *quoted_path;
+     SHELL_ESCAPED_STR quoted_path;
      int reply_code;
  
  #if 0
@@@ -462,8 -453,8 +462,8 @@@
        "else\n"
                  "echo '### 500'\n"
        "fi\n",
-           quoted_path, quoted_path, quoted_path, quoted_path, quoted_path, 
quoted_path);
-     mhl_mem_free (quoted_path);
+           quoted_path.s, quoted_path.s, quoted_path.s, quoted_path.s, 
quoted_path.s, quoted_path.s);
+     mhl_mem_free (quoted_path.s);
      ent = vfs_s_generate_entry(me, NULL, dir, 0);
      while (1) {
        int res = vfs_s_get_line_interruptible (me, buffer, sizeof (buffer), 
SUP.sockr); 
@@@ -594,7 -585,7 +594,7 @@@
      vfs_s_free_entry (me, ent);
      reply_code = fish_decode_reply(buffer + 4, 0);
      if (reply_code == COMPLETE) {
-       g_free (SUP.cwdir);
+       mhl_mem_free (SUP.cwdir);
        SUP.cwdir = g_strdup (remote_path);
        print_vfs_message (_("%s: done."), me->name);
        return 0;
@@@ -618,7 -609,7 +618,7 @@@ fish_file_store(struct vfs_class *me, s
      struct stat s;
      int was_error = 0;
      int h;
-     char *quoted_name;
+     SHELL_ESCAPED_STR quoted_name;
  
      h = open (localname, O_RDONLY);
  
@@@ -659,7 -650,7 +659,7 @@@
       */
  
      quoted_name = mhl_shell_escape_dup(name);
-     print_vfs_message(_("fish: store %s: sending command..."), quoted_name );
+     print_vfs_message(_("fish: store %s: sending command..."), quoted_name.s 
);
  
      /* FIXME: File size is limited to ULONG_MAX */
      if (!fh->u.fish.append)
@@@ -683,8 -674,8 +683,8 @@@
                        "    rest=`expr $rest - $n`\n"
                        "done\n"
                 "}; echo '### 200'\n",
-                (unsigned long) s.st_size, quoted_name,
-                quoted_name, (unsigned long) s.st_size,
+                (unsigned long) s.st_size, quoted_name.s,
+                quoted_name.s, (unsigned long) s.st_size,
                 (unsigned long) s.st_size);
      else
        n = fish_command (me, super, WAIT_REPLY,
@@@ -700,8 -691,8 +700,8 @@@
                        "    rest=`expr $rest - $n`\n"
                        "done\n"
                 "}; echo '### 200'\n",
-                (unsigned long) s.st_size, quoted_name,
-                quoted_name, (unsigned long) s.st_size);
+                (unsigned long) s.st_size, quoted_name.s,
+                quoted_name.s, (unsigned long) s.st_size);
  
      if (n != PRELIM) {
        close (h);
@@@ -735,14 -726,14 +735,14 @@@
                          (unsigned long) s.st_size);
      }
      close(h);
-     mhl_mem_free(quoted_name);
+     mhl_mem_free(quoted_name.s);
      if ((fish_get_reply (me, SUP.sockr, NULL, 0) != COMPLETE) || was_error)
          ERRNOR (E_REMOTE, -1);
      return 0;
  error_return:
      close(h);
      fish_get_reply(me, SUP.sockr, NULL, 0);
-     mhl_mem_free(quoted_name);
+     mhl_mem_free(quoted_name.s);
      return -1;
  }
  
@@@ -750,7 -741,7 +750,7 @@@ static in
  fish_linear_start (struct vfs_class *me, struct vfs_s_fh *fh, off_t offset)
  {
      char *name;
-     char *quoted_name;
+     SHELL_ESCAPED_STR quoted_name;
      if (offset)
          ERRNOR (E_NOTSUPP, 0);
      name = vfs_s_fullpath (me, fh->ino);
@@@ -779,8 -770,8 +779,8 @@@
                "else\n"
                "echo '### 500'\n"
                "fi\n",
-               quoted_name, quoted_name, quoted_name, quoted_name );
-     g_free (quoted_name);
+               quoted_name.s, quoted_name.s, quoted_name.s, quoted_name.s );
+     mhl_mem_free (quoted_name.s);
      if (offset != PRELIM) ERRNOR (E_REMOTE, 0);
      fh->linear = LS_LINEAR_OPEN;
      fh->u.fish.got = 0;
@@@ -889,17 -880,18 +889,18 @@@ fish_send_command(struct vfs_class *me
  #define PREFIX \
      char buf[BUF_LARGE]; \
      const char *crpath; \
-     char *rpath, *mpath = g_strdup (path); \
+     char *mpath = mhl_str_dup (path); \
+     SHELL_ESCAPED_STR rpath; \
      struct vfs_s_super *super; \
      if (!(crpath = vfs_s_get_path_mangle (me, mpath, &super, 0))) { \
-       g_free (mpath); \
+       mhl_mem_free (mpath); \
        return -1; \
      } \
      rpath = mhl_shell_escape_dup(crpath); \
-     g_free (mpath);
+     mhl_mem_free (mpath);
  
  #define POSTFIX(flags) \
-     g_free (rpath); \
+     mhl_mem_free (rpath.s); \
      return fish_send_command(me, super, buf, flags);
  
  static int
@@@ -909,8 -901,8 +910,8 @@@ fish_chmod (struct vfs_class *me, cons
      g_snprintf(buf, sizeof(buf), "#CHMOD %4.4o /%s\n"
                                 "chmod %4.4o /%s 2>/dev/null\n"
                                 "echo '### 000'\n", 
-           mode & 07777, rpath,
-           mode & 07777, rpath);
+           mode & 07777, rpath.s,
+           mode & 07777, rpath.s);
      POSTFIX(OPT_FLUSH);
  }
  
@@@ -919,24 -911,24 +920,24 @@@ static int fish_##name (struct vfs_clas
  { \
      char buf[BUF_LARGE]; \
      const char *crpath1, *crpath2; \
-     char *rpath1, *rpath2, *mpath1, *mpath2; \
+     char *mpath1, *mpath2; \
      struct vfs_s_super *super1, *super2; \
      if (!(crpath1 = vfs_s_get_path_mangle (me, mpath1 = g_strdup(path1), 
&super1, 0))) { \
-       g_free (mpath1); \
+       mhl_mem_free (mpath1); \
        return -1; \
      } \
      if (!(crpath2 = vfs_s_get_path_mangle (me, mpath2 = g_strdup(path2), 
&super2, 0))) { \
-       g_free (mpath1); \
-       g_free (mpath2); \
+       mhl_mem_free (mpath1); \
+       mhl_mem_free (mpath2); \
        return -1; \
      } \
-     rpath1 = mhl_shell_escape_dup (crpath1); \
-     g_free (mpath1); \
-     rpath2 = mhl_shell_escape_dup (crpath2); \
-     g_free (mpath2); \
-     g_snprintf(buf, sizeof(buf), string "\n", rpath1, rpath2, rpath1, 
rpath2); \
-     mhl_mem_free (rpath1); \
-     mhl_mem_free (rpath2); \
+     SHELL_ESCAPED_STR rpath1 = mhl_shell_escape_dup (crpath1); \
+     mhl_mem_free (mpath1); \
+     SHELL_ESCAPED_STR rpath2 = mhl_shell_escape_dup (crpath2); \
+     mhl_mem_free (mpath2); \
+     g_snprintf(buf, sizeof(buf), string "\n", rpath1.s, rpath2.s, rpath1.s, 
rpath2.s); \
+     mhl_mem_free (rpath1.s); \
+     mhl_mem_free (rpath2.s); \
      return fish_send_command(me, super2, buf, OPT_FLUSH); \
  }
  
@@@ -949,15 -941,15 +950,15 @@@ FISH_OP(link,   "#LINK /%s /%s\n
  
  static int fish_symlink (struct vfs_class *me, const char *setto, const char 
*path)
  {
-     char *qsetto;
+     SHELL_ESCAPED_STR qsetto;
      PREFIX
      qsetto = mhl_shell_escape_dup (setto);
      g_snprintf(buf, sizeof(buf),
              "#SYMLINK %s /%s\n"
            "ln -s %s /%s 2>/dev/null\n"
            "echo '### 000'\n",
-           qsetto, rpath, qsetto, rpath);
-     mhl_mem_free (qsetto);
+           qsetto.s, rpath.s, qsetto.s, rpath.s);
+     mhl_mem_free (qsetto.s);
      POSTFIX(OPT_FLUSH);
  }
  
@@@ -982,16 -974,16 +983,16 @@@ fish_chown (struct vfs_class *me, cons
            "#CHOWN %s /%s\n"
            "chown %s /%s 2>/dev/null\n"
            "echo '### 000'\n", 
-           sowner, rpath,
-           sowner, rpath);
+           sowner, rpath.s,
+           sowner, rpath.s);
        fish_send_command (me, super, buf, OPT_FLUSH); 
        /* FIXME: what should we report if chgrp succeeds but chown fails? */
        g_snprintf (buf, sizeof(buf),
              "#CHGRP /%s \"/%s\"\n"
            "chgrp %s \"/%s\" 2>/dev/null\n"
            "echo '### 000'\n", 
-           sgroup, rpath,
-           sgroup, rpath);
+           sgroup, rpath.s,
+           sgroup, rpath.s);
        /* fish_send_command(me, super, buf, OPT_FLUSH); */
        POSTFIX (OPT_FLUSH)
      }
@@@ -1004,7 -996,7 +1005,7 @@@ static int fish_unlink (struct vfs_clas
              "#DELE /%s\n"
            "rm -f /%s 2>/dev/null\n"
            "echo '### 000'\n",
-           rpath, rpath);
+           rpath.s, rpath.s);
      POSTFIX(OPT_FLUSH);
  }
  
@@@ -1018,7 -1010,7 +1019,7 @@@ static int fish_mkdir (struct vfs_clas
              "#MKD /%s\n"
            "mkdir /%s 2>/dev/null\n"
            "echo '### 000'\n",
-           rpath, rpath);
+           rpath.s, rpath.s);
      POSTFIX(OPT_FLUSH);
  }
  
@@@ -1029,7 -1021,7 +1030,7 @@@ static int fish_rmdir (struct vfs_clas
              "#RMD /%s\n"
            "rmdir /%s 2>/dev/null\n"
            "echo '### 000'\n",
-           rpath, rpath);
+           rpath.s, rpath.s);
      POSTFIX(OPT_FLUSH);
  }
  
@@@ -1065,35 -1057,29 +1066,35 @@@ static voi
  fish_fill_names (struct vfs_class *me, fill_names_f func)
  {
      struct vfs_s_super *super = MEDATA->supers;
 -    const char *flags;
      char *name;
 -    
 -    while (super){
 -      switch (SUP.flags & (FISH_FLAG_RSH | FISH_FLAG_COMPRESSED)) {
 -      case FISH_FLAG_RSH:
 +
 +    char gbuf[10];
 +
 +    while (super)
 +    {
 +      const char *flags = "";
 +      switch (SUP.flags)
 +      {
 +          case FISH_FLAG_RSH:
                flags = ":r";
                break;
 -      case FISH_FLAG_COMPRESSED:
 +          case FISH_FLAG_COMPRESSED:
                flags = ":C";
                break;
 -      case FISH_FLAG_RSH | FISH_FLAG_COMPRESSED:
 -              flags = "";
 -              break;
 -      default:
 -              flags = "";
 +          default:
 +              if (SUP.flags > FISH_FLAG_RSH)
 +              {
 +                  break;
 +                  g_snprintf (gbuf, sizeof (gbuf), ":%d", SUP.flags);
 +                  flags = gbuf;
 +              }
                break;
        }
  
        name = g_strconcat ("/#sh:", SUP.user, "@", SUP.host, flags,
                            "/", SUP.cwdir, (char *) NULL);
        (*func)(name);
-       g_free (name);
+       mhl_mem_free (name);
        super = super->next;
      }
  }

-- 
Midnight Commander Development
_______________________________________________
Mc-devel mailing list
http://mail.gnome.org/mailman/listinfo/mc-devel

Reply via email to