Sorry again for the answer to myself.. but after testing the patches again a bit I found out that not everything worked fine with the patches I posted. After I've corrected this the last hours, I've done heavy testing so that now definitly everythings works as it should. Sorry for the noise on the list. :S Greetings Winnie -- .''`. Patrick Winnertz <winnie debian org> : :' : GNU/Linux Debian Developer `. `'` http://www.der-winnie.de http://people.skolelinux.org/~winnie `- Debian - when you have better things to do than fixing systems
Index: fish.c
===================================================================
RCS file: /cvsroot/mc/mc/vfs/fish.c,v
retrieving revision 1.125
diff -u -r1.125 fish.c
--- fish.c 2 Nov 2007 14:50:41 -0000 1.125
+++ fish.c 27 Feb 2008 13:02:12 -0000
@@ -96,6 +96,7 @@
return code / 100;
}
+
/* Returns a reply code, check /usr/include/arpa/ftp.h for possible values */
static int fish_get_reply (struct vfs_class *me, int sock, char *string_buf, int string_len)
{
@@ -366,17 +367,17 @@
dir->timestamp.tv_sec += fish_directory_timeout;
quoted_path = name_quote (remote_path, 0);
fish_command (me, super, NONE,
- "#LIST /%s\n"
- "if ls -1 /%s >/dev/null 2>&1 ;\n"
+ "#LIST \"/%s\"\n"
+ "if ls -1 \"/%s\" >/dev/null 2>&1 ;\n"
"then\n"
- "ls -lLan /%s 2>/dev/null | grep '^[^cbt]' | (\n"
+ "ls -lQLan \"/%s\" 2>/dev/null | grep '^[^cbt]' | (\n"
"while read p l u g s m d y n; do\n"
- "echo \"P$p $u.$g\nS$s\nd$m $d $y\n:$n\n\"\n"
+ "echo \"P$p $u.$g\nS$s\nd$m $d $y\n:$n\n\"| sed 's#\\\"##g'\n"
"done\n"
")\n"
- "ls -lan /%s 2>/dev/null | grep '^[cb]' | (\n"
+ "ls -Qlan \"/%s\" 2>/dev/null | grep '^[cb]' | (\n"
"while read p l u g a i m d y n; do\n"
- "echo \"P$p $u.$g\nE$a$i\nd$m $d $y\n:$n\n\"\n"
+ "echo \"P$p $u.$g\nE$a$i\nd$m $d $y\n:$n\n\" | sed 's#\\\"##g'\n"
"done\n"
")\n"
"echo '### 200'\n"
@@ -534,9 +535,9 @@
/* FIXME: File size is limited to ULONG_MAX */
if (!fh->u.fish.append)
n = fish_command (me, super, WAIT_REPLY,
- "#STOR %lu /%s\n"
+ "#STOR %lu \"/%s\"\n"
"echo '### 001'\n"
- "file=/%s\n"
+ "file=\"/%s\"\n"
"res=`exec 3>&1\n"
"(\n"
"head -c %lu -q - || echo DD >&3\n"
@@ -558,10 +559,10 @@
(unsigned long) s.st_size);
else
n = fish_command (me, super, WAIT_REPLY,
- "#STOR %lu /%s\n"
+ "#STOR %lu \"/%s\"\n"
"echo '### 001'\n"
"{\n"
- "file=/%s\n"
+ "file=\"/%s\"\n"
"rest=%lu\n"
"while [ $rest -gt 0 ]\n"
"do\n"
@@ -627,7 +628,7 @@
return 0;
quoted_name = name_quote (name, 0);
g_free (name);
- name = quoted_name;
+ name = unescape_string(quoted_name);
fh->u.fish.append = 0;
/*
@@ -637,15 +638,15 @@
* standard output (i.e. over the network).
*/
offset = fish_command (me, FH_SUPER, WANT_STRING,
- "#RETR /%s\n"
- "if dd if=/%s of=/dev/null bs=1 count=1 2>/dev/null ;\n"
+ "#RETR \"/%s\"\n"
+ "if dd if=\"/%s\" of=/dev/null bs=1 count=1 2>/dev/null ;\n"
"then\n"
- "ls -ln /%s 2>/dev/null | (\n"
+ "ls -ln \"/%s\" 2>/dev/null | (\n"
"read p l u g s r\n"
"echo \"$s\"\n"
")\n"
"echo '### 100'\n"
- "cat /%s\n"
+ "cat \"//%s\"\n"
"echo '### 200'\n"
"else\n"
"echo '### 500'\n"
@@ -777,7 +778,7 @@
fish_chmod (struct vfs_class *me, const char *path, int mode)
{
PREFIX
- g_snprintf(buf, sizeof(buf), "#CHMOD %4.4o /%s\n"
+ g_snprintf(buf, sizeof(buf), "#CHMOD %4.4o \"/%s\"\n"
"chmod %4.4o \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
mode & 07777, rpath,
@@ -811,11 +812,11 @@
return fish_send_command(me, super2, buf, OPT_FLUSH); \
}
-FISH_OP(rename, "#RENAME /%s /%s\n"
- "mv /%s /%s 2>/dev/null\n"
+FISH_OP(rename, "#RENAME \"/%s\" \"/%s\"\n"
+ "mv \"/%s\" \"/%s\" 2>/dev/null\n"
"echo '### 000'" )
-FISH_OP(link, "#LINK /%s /%s\n"
- "ln /%s /%s 2>/dev/null\n"
+FISH_OP(link, "#LINK \"/%s\" \"/%s\"\n"
+ "ln \"%s\" \"/%s\" 2>/dev/null\n"
"echo '### 000'" )
static int fish_symlink (struct vfs_class *me, const char *setto, const char *path)
@@ -824,8 +825,8 @@
PREFIX
qsetto = name_quote (setto, 0);
g_snprintf(buf, sizeof(buf),
- "#SYMLINK %s /%s\n"
- "ln -s %s /%s 2>/dev/null\n"
+ "#SYMLINK \"%s\" \"/%s\"\n"
+ "ln -s \"%s\" \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
qsetto, rpath, qsetto, rpath);
g_free (qsetto);
@@ -850,16 +851,16 @@
{
PREFIX
g_snprintf (buf, sizeof(buf),
- "#CHOWN /%s /%s\n"
- "chown %s /%s 2>/dev/null\n"
+ "#CHOWN /%s \"/%s\"\n"
+ "chown %s \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
sowner, rpath,
sowner, rpath);
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"
+ "#CHGRP /%s \"/%s\"\n"
+ "chgrp %s \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
sgroup, rpath,
sgroup, rpath);
@@ -872,8 +873,8 @@
{
PREFIX
g_snprintf(buf, sizeof(buf),
- "#DELE /%s\n"
- "rm -f /%s 2>/dev/null\n"
+ "#DELE \"/%s\"\n"
+ "rm -f \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
rpath, rpath);
POSTFIX(OPT_FLUSH);
@@ -886,8 +887,8 @@
(void) mode;
g_snprintf(buf, sizeof(buf),
- "#MKD /%s\n"
- "mkdir /%s 2>/dev/null\n"
+ "#MKD \"/%s\"\n"
+ "mkdir \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
rpath, rpath);
POSTFIX(OPT_FLUSH);
@@ -897,8 +898,8 @@
{
PREFIX
g_snprintf(buf, sizeof(buf),
- "#RMD /%s\n"
- "rmdir /%s 2>/dev/null\n"
+ "#RMD \"/%s\"\n"
+ "rmdir \"/%s\" 2>/dev/null\n"
"echo '### 000'\n",
rpath, rpath);
POSTFIX(OPT_FLUSH);
Index: complete.c
===================================================================
RCS file: /cvsroot/mc/mc/src/complete.c,v
retrieving revision 1.61
diff -u -w -r1.61 complete.c
--- complete.c 25 Sep 2007 15:33:36 -0000 1.61
+++ complete.c 27 Feb 2008 19:51:30 -0000
@@ -40,6 +40,7 @@
#include "wtools.h"
#include "complete.h"
#include "main.h"
+#include "util.h"
#include "key.h" /* XCTRL and ALT macros */
typedef char *CompletionFunction (char *, int);
@@ -911,6 +912,7 @@
static int
complete_engine (WInput *in, int what_to_do)
{
+ char *complete = NULL;
if (in->completions && in->point != end)
free_completions (in);
if (!in->completions){
@@ -924,7 +926,8 @@
}
if (in->completions){
if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) {
- if (insert_text (in, in->completions [0], strlen (in->completions [0]))){
+ complete = escape_string(in->completions [0]);
+ if (insert_text (in, complete, strlen (complete))){
if (in->completions [1])
beep ();
else
@@ -940,9 +943,11 @@
Dlg_head *query_dlg;
WListbox *query_list;
- for (p=in->completions + 1; *p; count++, p++)
+ for (p=in->completions + 1; *p; count++, p++) {
+ *p = escape_string(*p);
if ((i = strlen (*p)) > maxlen)
maxlen = i;
+ }
start_x = in->widget.x;
start_y = in->widget.y;
if (start_y - 2 >= count) {
Index: command.c
===================================================================
RCS file: /cvsroot/mc/mc/src/command.c,v
retrieving revision 1.34
diff -u -w -r1.34 command.c
--- command.c 26 Sep 2007 10:22:25 -0000 1.34
+++ command.c 27 Feb 2008 19:51:30 -0000
@@ -64,6 +64,7 @@
const char *t;
/* Tilde expansion */
+ path = unescape_string(path);
path_tilde = tilde_expand (path);
/* Leave space for further expansion */
Index: file.c
===================================================================
RCS file: /cvsroot/mc/mc/src/file.c,v
retrieving revision 1.151
diff -u -w -r1.151 file.c
--- file.c 25 Sep 2007 15:33:36 -0000 1.151
+++ file.c 27 Feb 2008 19:51:31 -0000
@@ -63,6 +63,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"
@@ -456,7 +457,7 @@
};
int
-copy_file_file (FileOpContext *ctx, const char *src_path, const char *dst_path,
+copy_file_file (FileOpContext *ctx, const char *s, const char *d,
int ask_overwrite, off_t *progress_count,
double *progress_bytes, int is_toplevel_file)
{
@@ -464,6 +465,8 @@
gid_t src_gid = (gid_t) - 1;
char *buf = NULL;
+ const char *dst_path = NULL;
+ const char *src_path = NULL;
int buf_size = BUF_8K;
int src_desc, dest_desc = -1;
int n_read, n_written;
@@ -479,7 +482,8 @@
/* FIXME: We should not be using global variables! */
ctx->do_reget = 0;
return_status = FILE_RETRY;
-
+ dst_path = unescape_string(d);
+ src_path = unescape_string(s);
if (file_progress_show_source (ctx, src_path) == FILE_ABORT ||
file_progress_show_target (ctx, dst_path) == FILE_ABORT)
return FILE_ABORT;
Index: util.c
===================================================================
RCS file: /cvsroot/mc/mc/src/util.c,v
retrieving revision 1.141
diff -u -w -r1.141 util.c
--- util.c 25 Sep 2007 15:33:37 -0000 1.141
+++ util.c 27 Feb 2008 19:51:32 -0000
@@ -1525,3 +1525,58 @@
return (sep != NULL) ? sep + 1 : result;
}
+/* Unescape paths or other strings for e.g the internal cd */
+char *
+unescape_string ( const char * in ) {
+ char * local = NULL;
+ int i = 0;
+ int j = 20;
+ int k = 0;
+
+ local = g_malloc(j);
+
+ for (i=0;i<=strlen(in);i++) {
+ if (i-k >= j ) {
+ j = j + 20;
+ local = g_realloc(local,j);
+ }
+ if ( (strchr(" \t*|;<>~#",in[i])) && ( strchr("\\",in[i-1])) ) {
+ k++;
+ local[i-k] = in[i];
+ } else {
+ local[i-k] = in[i];
+ }
+ }
+ local[i-k] = '\0';
+
+ return local;
+}
+
+/* To be compatible with the general posix command lines we have to escape *
+ * strings for the command line */
+char *
+escape_string ( const char * in ) {
+ char * local = NULL;
+ int i = 0;
+ int j = 20;
+ int k = 0;
+
+ local = g_malloc(j);
+
+ for (i=0;i<strlen(in);i++) {
+ if (i+k >= j ) { //If 20 chars is too low for the path
+ j = j + 20;
+ local = g_realloc(local,j);
+ }
+ if ( (strchr(" \t*|;<>~#",in[i])) && (! strchr("\\",in[i-1])) ) {
+ local[i+k] = 92; // Ascii for "\"
+ k = k+1;
+ local[i+k] = in[i];
+ } else {
+ local[i+k] = in[i];
+ }
+ }
+ local[i+k] = '\0';
+
+ return local;
+}
Index: util.h
===================================================================
RCS file: /cvsroot/mc/mc/src/util.h,v
retrieving revision 1.78
diff -u -w -r1.78 util.h
--- util.h 3 Feb 2006 17:04:17 -0000 1.78
+++ util.h 27 Feb 2008 19:51:32 -0000
@@ -14,6 +14,8 @@
extern const char *cstrcasestr (const char *haystack, const char *needle);
extern const char *cstrstr (const char *haystack, const char *needle);
+char *unescape_string ( const char * in );
+char *escape_string ( const char * in );
void str_replace(char *s, char from, char to);
int is_printable (int c);
void msglen (const char *text, /* out@*/ int *lines, /* out@*/ int *columns);
Attachment:
signature.asc
Description: This is a digitally signed message part.