aboutsummaryrefslogtreecommitdiffstats
path: root/com32/rosh/rosh.c
diff options
context:
space:
mode:
authorGene Cumm <gene.cumm@gmail.com>2011-01-31 09:05:59 -0500
committerGene Cumm <gene.cumm@gmail.com>2011-01-31 09:05:59 -0500
commit28f3eaaec3196f1b29f460e7c2bf47e2198c3759 (patch)
treeefc7655be068538fe1dd4a0a1f6ef8e1132c2d35 /com32/rosh/rosh.c
parent57b61307e8a1a2c773a8b3fa2621af0d4aa93819 (diff)
downloadsyslinux-28f3eaaec3196f1b29f460e7c2bf47e2198c3759.tar.gz
syslinux-28f3eaaec3196f1b29f460e7c2bf47e2198c3759.tar.xz
syslinux-28f3eaaec3196f1b29f460e7c2bf47e2198c3759.zip
rosh: 2 bug fixes; more debug code
This fixes two issues when doing "ls -l"; directory entries with a directory argument were not qualified; stat() checked 1, not -1
Diffstat (limited to 'com32/rosh/rosh.c')
-rw-r--r--com32/rosh/rosh.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/com32/rosh/rosh.c b/com32/rosh/rosh.c
index 12e09995..0581087e 100644
--- a/com32/rosh/rosh.c
+++ b/com32/rosh/rosh.c
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------- *
*
- * Copyright 2008-2010 Gene Cumm - All Rights Reserved
+ * Copyright 2008-2011 Gene Cumm - All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@
#define APP_NAME "rosh"
#define APP_AUTHOR "Gene Cumm"
#define APP_YEAR "2010"
-#define APP_VER "beta-b089"
+#define APP_VER "beta-b090"
/* Print version information to stdout
*/
@@ -576,26 +576,32 @@ int rosh_ls_de_size(const char *filestr, struct dirent *de)
* filestr directory name of directory entry
* de directory entry
*/
-int rosh_ls_de_size_mode(struct dirent *de, mode_t * st_mode)
+int rosh_ls_de_size_mode(const char *filestr, struct dirent *de, mode_t * st_mode)
{
int de_size;
-// char filestr2[ROSH_PATH_SZ];
-// int file2pos;
+ char filestr2[ROSH_PATH_SZ];
+ int file2pos;
struct stat fdstat;
int status;
-/* filestr2[0] = 0;
- file2pos = -1;*/
- fdstat.st_size = 0;
- fdstat.st_mode = 0;
-/* if (filestr) {
+ filestr2[0] = 0;
+ file2pos = -1;
+ memset(&fdstat, 0, sizeof fdstat);
+ ROSH_DEBUG2("ls:dsm(%s, %s) ", filestr, de->d_name);
+ if (filestr) {
+ /* FIXME: prevent string overflow */
file2pos = strlen(filestr);
memcpy(filestr2, filestr, file2pos);
- filestr2[file2pos] = '/';
+ if (( filestr2[file2pos - 1] == SEP )) {
+ file2pos--;
+ } else {
+ filestr2[file2pos] = SEP;
+ }
}
- strcpy(filestr2 + file2pos + 1, de->d_name);*/
+ strcpy(filestr2 + file2pos + 1, de->d_name);
errno = 0;
- status = stat(de->d_name, &fdstat);
+ ROSH_DEBUG2("stat(%s) ", filestr2);
+ status = stat(filestr2, &fdstat);
ROSH_DEBUG2("\t--stat()=%d\terr=%d\n", status, errno);
if (errno) {
rosh_error(errno, "ls:szmd.stat", de->d_name);
@@ -754,16 +760,17 @@ void rosh_st_mode2str(mode_t st_mode, char *st_mode_str)
* de directory entry
* optarr Array of options
*/
-void rosh_ls_arg_dir_de(struct dirent *de, const int *optarr)
+void rosh_ls_arg_dir_de(const char *filestr, struct dirent *de, const int *optarr)
{
int de_size;
mode_t st_mode;
char st_mode_str[11];
st_mode = 0;
+ ROSH_DEBUG2("+");
if (optarr[2] > -1)
- printf("%10d ", (int)de->d_ino);
+ printf("%10d ", (int)(de->d_ino));
if (optarr[0] > -1) {
- de_size = rosh_ls_de_size_mode(de, &st_mode);
+ de_size = rosh_ls_de_size_mode(filestr, de, &st_mode);
rosh_st_mode2str(st_mode, st_mode_str);
ROSH_DEBUG2("%04X ", st_mode);
printf("%s %10d ", st_mode_str, de_size);
@@ -791,7 +798,7 @@ void rosh_ls_arg_dir(const char *filestr, DIR * d, const int *optarr)
errno = 0;
while ((de = readdir(d))) {
filepos++;
- rosh_ls_arg_dir_de(de, optarr);
+ rosh_ls_arg_dir_de(filestr, de, optarr);
}
if (errno) {
rosh_error(errno, "ls:arg_dir", filestr);
@@ -846,7 +853,7 @@ void rosh_ls_arg(const char *filestr, const int *optarr)
} else {
ROSH_DEBUG("PATH '%s' is some other file\n", filestr);
}
- rosh_ls_arg_dir_de(&de, optarr);
+ rosh_ls_arg_dir_de(NULL, &de, optarr);
/* if (ifilstr[0] == SEP)
rosh_ls_arg_dir_de(NULL, &de, optarr);
else