How to get Winscp to work with Android toolbox
The problem is the format of the ls -l command. The problem is the number of fields is not what Winscp is expecting. The 'link' field is missing and the date is in an iso format which has a different number of fields than the GNU/Linux version. The fix is a simple change to the ls command. Here is my commit to my local repo.
Modify ls command format so that Winscp will work.
diff --git a/toolbox/ls.c b/toolbox/ls.c
index e530521..434e8af 100644
--- a/toolbox/ls.c
+++ b/toolbox/ls.c
@@ -168,6 +168,7 @@ static int listfile_long(const char *path, int flags)
char mode[16];
char user[16];
char group[16];
+ char nlink[16];
const char *name;
/* name is anything after the final '/', or the whole path if none*/
@@ -182,6 +183,8 @@ static int listfile_long(const char *path, int flags)
return -1;
}
+ sprintf(nlink, "%d", s.st_nlink);
+
mode2str(s.st_mode, mode);
if (flags & LIST_LONG_NUMERIC) {
sprintf(user, "%ld", s.st_uid);
@@ -191,7 +194,8 @@ static int listfile_long(const char *path, int flags)
group2str(s.st_gid, group);
}
- strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime));
+// strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime));
+ strftime(date, 32, "%b %e %H:%M", localtime((const time_t*)&s.st_mtime));
date[31] = 0;
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
@@ -200,14 +204,14 @@ static int listfile_long(const char *path, int flags)
switch(s.st_mode & S_IFMT) {
case S_IFBLK:
case S_IFCHR:
- printf("%s %-8s %-8s %3d, %3d %s %s\n",
- mode, user, group,
+ printf("%s %s %-8s %-8s %3d, %3d %s %s\n",
+ mode, nlink, user, group,
(int) MAJOR(s.st_rdev), (int) MINOR(s.st_rdev),
date, name);
break;
case S_IFREG:
- printf("%s %-8s %-8s %8lld %s %s\n",
- mode, user, group, s.st_size, date, name);
+ printf("%s %s %-8s %-8s %8lld %s %s\n",
+ mode, nlink, user, group, s.st_size, date, name);
break;
case S_IFLNK: {
char linkto[256];
@@ -225,13 +229,13 @@ static int listfile_long(const char *path, int flags)
linkto[len] = 0;
}
- printf("%s %-8s %-8s %s %s -> %s\n",
- mode, user, group, date, name, linkto);
+ printf("%s %s %-8s %-8s %8lld %s %s -> %s\n",
+ mode, nlink, user, group, s.st_size, date, name, linkto);
break;
}
default:
- printf("%s %-8s %-8s %s %s\n",
- mode, user, group, date, name);
+ printf("%s %s %-8s %-8s %8lld %s %s\n",
+ mode, nlink, user, group, s.st_size, date, name);
}
return 0;
Modify ls command format so that Winscp will work.
diff --git a/toolbox/ls.c b/toolbox/ls.c
index e530521..434e8af 100644
--- a/toolbox/ls.c
+++ b/toolbox/ls.c
@@ -168,6 +168,7 @@ static int listfile_long(const char *path, int flags)
char mode[16];
char user[16];
char group[16];
+ char nlink[16];
const char *name;
/* name is anything after the final '/', or the whole path if none*/
@@ -182,6 +183,8 @@ static int listfile_long(const char *path, int flags)
return -1;
}
+ sprintf(nlink, "%d", s.st_nlink);
+
mode2str(s.st_mode, mode);
if (flags & LIST_LONG_NUMERIC) {
sprintf(user, "%ld", s.st_uid);
@@ -191,7 +194,8 @@ static int listfile_long(const char *path, int flags)
group2str(s.st_gid, group);
}
- strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime));
+// strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime));
+ strftime(date, 32, "%b %e %H:%M", localtime((const time_t*)&s.st_mtime));
date[31] = 0;
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
@@ -200,14 +204,14 @@ static int listfile_long(const char *path, int flags)
switch(s.st_mode & S_IFMT) {
case S_IFBLK:
case S_IFCHR:
- printf("%s %-8s %-8s %3d, %3d %s %s\n",
- mode, user, group,
+ printf("%s %s %-8s %-8s %3d, %3d %s %s\n",
+ mode, nlink, user, group,
(int) MAJOR(s.st_rdev), (int) MINOR(s.st_rdev),
date, name);
break;
case S_IFREG:
- printf("%s %-8s %-8s %8lld %s %s\n",
- mode, user, group, s.st_size, date, name);
+ printf("%s %s %-8s %-8s %8lld %s %s\n",
+ mode, nlink, user, group, s.st_size, date, name);
break;
case S_IFLNK: {
char linkto[256];
@@ -225,13 +229,13 @@ static int listfile_long(const char *path, int flags)
linkto[len] = 0;
}
- printf("%s %-8s %-8s %s %s -> %s\n",
- mode, user, group, date, name, linkto);
+ printf("%s %s %-8s %-8s %8lld %s %s -> %s\n",
+ mode, nlink, user, group, s.st_size, date, name, linkto);
break;
}
default:
- printf("%s %-8s %-8s %s %s\n",
- mode, user, group, date, name);
+ printf("%s %s %-8s %-8s %8lld %s %s\n",
+ mode, nlink, user, group, s.st_size, date, name);
}
return 0;