File mc-cvs-fixes.patch of Package mc

--- src/achown.c
+++ src/achown.c
@@ -265,7 +265,7 @@
 	    /* get and put user names in the listbox */
 	    setpwent ();
 	    while ((chl_pass = getpwent ())) {
-		listbox_add_item (chl_list, LISTBOX_APPEND_AT_END, 0,
+		listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0,
 		    chl_pass->pw_name, NULL);
 	    }
 	    endpwent ();
@@ -275,7 +275,7 @@
 	    /* get and put group names in the listbox */
 	    setgrent ();
 	    while ((chl_grp = getgrent ())) {
-		listbox_add_item (chl_list, LISTBOX_APPEND_AT_END, 0,
+		listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0,
 		    chl_grp->gr_name, NULL);
 	    }
 	    endgrent ();
--- src/chown.c
+++ src/chown.c
@@ -180,14 +180,14 @@
     /* get and put user names in the listbox */
     setpwent ();
     while ((l_pass = getpwent ())) {
-	listbox_add_item (l_user, 0, 0, l_pass->pw_name, NULL);
+	listbox_add_item (l_user, LISTBOX_APPEND_SORTED, 0, l_pass->pw_name, NULL);
     }
     endpwent ();
 
     /* get and put group names in the listbox */
     setgrent ();
     while ((l_grp = getgrent ())) {
-	listbox_add_item (l_group, 0, 0, l_grp->gr_name, NULL);
+	listbox_add_item (l_group, LISTBOX_APPEND_SORTED, 0, l_grp->gr_name, NULL);
     }
     endgrent ();
 
--- src/widget.c
+++ src/widget.c
@@ -2402,8 +2402,6 @@
     else
 	l->height = height;
     l->count = 0;
-    l->top = 0;
-    l->current = 0;
     l->cback = callback;
     l->allow_duplicates = 1;
     l->scrollbar = slow_terminal ? 0 : 1;
@@ -2443,6 +2441,22 @@
 	e->next = l->current->next;
 	l->current->next->prev = e;
 	l->current->next = e;
+    } else if (pos == LISTBOX_APPEND_SORTED) {
+	WLEntry *w = l->list;
+
+	while (w->next != l->list && strcmp (e->text, w->text) > 0)
+	    w = w->next;
+	if (w->next == l->list) {
+	    e->prev = w;
+	    e->next = l->list;
+	    w->next = e;
+	    l->list->prev = e;
+	} else {
+	    e->next = w;
+	    e->prev = w->prev;
+	    w->prev->next = e;
+	    w->prev = e;
+	}
     }
     l->count++;
 }
--- src/widget.h
+++ src/widget.h
@@ -181,7 +181,8 @@
 enum append_pos {
     LISTBOX_APPEND_AT_END,	/* append at the end */
     LISTBOX_APPEND_BEFORE,	/* insert before current */
-    LISTBOX_APPEND_AFTER	/* insert after current */
+    LISTBOX_APPEND_AFTER,	/* insert after current */
+    LISTBOX_APPEND_SORTED	/* insert alphabetically */
 };
 
 char *listbox_add_item (WListbox *l, enum append_pos pos, int
--- vfs/direntry.c
+++ vfs/direntry.c
@@ -447,7 +447,6 @@
 
     CALL (free_archive) (me, super);
     g_free (super->name);
-    super->name = NULL;
     g_free(super);
 }
 
--- vfs/fish.c
+++ vfs/fish.c
@@ -355,6 +355,7 @@
     struct vfs_s_entry *ent = NULL;
     FILE *logfile;
     char *quoted_path;
+    int reply_code;
 
     logfile = MEDATA->logfile;
 
@@ -365,6 +366,8 @@
     quoted_path = name_quote (remote_path, 0);
     fish_command (me, super, NONE,
 	    "#LIST /%s\n"
+	    "if ls -1 /%s >/dev/null 2>&1 ;\n"
+	    "then\n"
 	    "ls -lLan /%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"
@@ -375,8 +378,11 @@
 	        "echo \"P$p $u.$g\nE$a$i\nd$m $d $y\n:$n\n\"\n"
 	      "done\n"
 	    ")\n"
-	    "echo '### 200'\n",
-	    remote_path, quoted_path, quoted_path);
+	    "echo '### 200'\n"
+	    "else\n"
+	    "echo '### 500'\n"
+	    "fi\n",
+	    remote_path, quoted_path, quoted_path, quoted_path);
     g_free (quoted_path);
     ent = vfs_s_generate_entry(me, NULL, dir, 0);
     while (1) {
@@ -455,17 +461,21 @@
     }
     
     vfs_s_free_entry (me, ent);
-    me->verrno = E_REMOTE;
-    if (fish_decode_reply(buffer+4, 0) == COMPLETE) {
+    reply_code = fish_decode_reply(buffer + 4, 0);
+    if (reply_code == COMPLETE) {
 	g_free (SUP.cwdir);
 	SUP.cwdir = g_strdup (remote_path);
 	print_vfs_message (_("%s: done."), me->name);
 	return 0;
+    } else if (reply_code == ERROR) {
+	me->verrno = EACCES;
+    } else {
+	me->verrno = E_REMOTE;
     }
 
 error:
     print_vfs_message (_("%s: failure"), me->name);
-    return 1;
+    return -1;
 }
 
 static int
@@ -618,25 +628,39 @@
     g_free (name);
     name = quoted_name;
     fh->u.fish.append = 0;
+
+    /*
+     * Check whether the remote file is readable by using `dd' to copy 
+     * a single byte from the remote file to /dev/null. If `dd' completes
+     * with exit status of 0 use `cat' to send the file contents to the
+     * 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"
+		"then\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"
-		"echo '### 200'\n", 
-		name, name, name );
+		"echo '### 200'\n"
+		"else\n"
+		"echo '### 500'\n" 
+		"fi\n",
+		name, name, name, name );
     g_free (name);
     if (offset != PRELIM) ERRNOR (E_REMOTE, 0);
     fh->linear = LS_LINEAR_OPEN;
     fh->u.fish.got = 0;
-#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 || (defined _LARGE_FILES && _LARGE_FILES)
-    if (sscanf( reply_str, "%llu", &fh->u.fish.total )!=1)
+    errno = 0;
+#if SIZEOF_OFF_T == SIZEOF_LONG
+    fh->u.fish.total = strtol (reply_str, NULL, 10);
 #else
-    if (sscanf( reply_str, "%u", &fh->u.fish.total )!=1)
+    fh->u.fish.total = strtoll (reply_str, NULL, 10);
 #endif
+    if (errno != 0)
 	ERRNOR (E_REMOTE, 0);
     return 1;
 }
@@ -760,7 +784,7 @@
     POSTFIX(OPT_FLUSH);
 }
 
-#define FISH_OP(name, chk, string) \
+#define FISH_OP(name, string) \
 static int fish_##name (struct vfs_class *me, const char *path1, const char *path2) \
 { \
     char buf[BUF_LARGE]; \
@@ -786,13 +810,12 @@
     return fish_send_command(me, super2, buf, OPT_FLUSH); \
 }
 
-#define XTEST if (bucket1 != bucket2) { ERRNOR (EXDEV, -1); }
-FISH_OP(rename, XTEST, "#RENAME /%s /%s\n"
-		       "mv /%s /%s 2>/dev/null\n"
-		       "echo '### 000'" )
-FISH_OP(link,   XTEST, "#LINK /%s /%s\n"
-		       "ln /%s /%s 2>/dev/null\n"
-		       "echo '### 000'" )
+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"
+		"echo '### 000'" )
 
 static int fish_symlink (struct vfs_class *me, const char *setto, const char *path)
 {
openSUSE Build Service is sponsored by