diff options
-rwxr-xr-x | tests/ls.test | 3 | ||||
-rw-r--r-- | toys/posix/ls.c | 10 |
2 files changed, 10 insertions, 3 deletions
diff --git a/tests/ls.test b/tests/ls.test index 56f74034..6c8e0efe 100755 --- a/tests/ls.test +++ b/tests/ls.test @@ -50,5 +50,8 @@ rm -rf lstest/* && touch lstest/file1.txt && INODE=`stat -c %i lstest/file1.txt` testing "with -i" "$IN && ls -i 2>/dev/null; $OUT" "$INODE file1.txt\n" "" "" unset INODE +testing "missing" "$IN && ls does-not-exist 2>err ; grep -q 'ls:.*missing.*: No +such file' err || echo missing error; $OUT" "" "" "" + # Removing test dir for cleanup purpose rm -rf lstest diff --git a/toys/posix/ls.c b/toys/posix/ls.c index fbd2405c..4ae352af 100644 --- a/toys/posix/ls.c +++ b/toys/posix/ls.c @@ -583,9 +583,13 @@ void ls_main(void) dt = dirtree_add_node(0, *s, DIRTREE_STATLESS|DIRTREE_SYMFOLLOW*sym); - // note: double_list->prev temporarirly goes in dirtree->parent - if (dt) dlist_add_nomalloc((void *)&TT.files->child, (void *)dt); - else toys.exitval = 1; + // note: double_list->prev temporarily goes in dirtree->parent + if (dt) { + if (!dt->st.st_blksize && !dt->st.st_dev && !dt->st.st_ino) { + perror_msg_raw(*s); + free(dt); + } else dlist_add_nomalloc((void *)&TT.files->child, (void *)dt); + } else toys.exitval = 1; } // Convert double_list into dirtree. |