228 lines
6.2 KiB
Diff
228 lines
6.2 KiB
Diff
--- 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)
|
|
{
|