diff options
author | Elliott Hughes <enh@google.com> | 2016-02-29 19:35:13 -0800 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2016-03-02 22:25:36 -0600 |
commit | ffc6fbbde3eeca29d1eb3470610eb7ae5b9025f1 (patch) | |
tree | 836a56b6f2614dd6f2c861a8448a6a47c6f5f0a3 | |
parent | 5231bb553d5e2c04818f6603f30a36653d914881 (diff) | |
download | toybox-ffc6fbbde3eeca29d1eb3470610eb7ae5b9025f1.tar.gz |
Fix file for Java class files, improve script detection, and add tests.
-rw-r--r-- | tests/file.test | 21 | ||||
-rw-r--r-- | toys/pending/file.c | 5 |
2 files changed, 25 insertions, 1 deletions
diff --git a/tests/file.test b/tests/file.test new file mode 100644 index 00000000..86ddd9e1 --- /dev/null +++ b/tests/file.test @@ -0,0 +1,21 @@ +#!/bin/bash + +[ -f testing.sh ] && . testing.sh + +#testing "name" "command" "result" "infile" "stdin" + +touch empty +echo "#!/bin/bash" > bash.script +echo "#! /bin/bash" > bash.script2 +echo "#! /usr/bin/env python" > env.python.script +echo "Hello, world!" > ascii +echo "cafebabe000000310000" | xxd -r -p > java.class + +testing "file empty" "file empty" "empty: empty\n" "" "" +testing "file bash.script" "file bash.script" "bash.script: /bin/bash script\n" "" "" +testing "file bash.script with spaces" "file bash.script2" "bash.script2: /bin/bash script\n" "" "" +testing "file env python script" "file env.python.script" "env.python.script: python script\n" "" "" +testing "file ascii" "file ascii" "ascii: ASCII text\n" "" "" +testing "file java class" "file java.class" "java.class: Java class file, version 49.0\n" "" "" + +rm empty bash.script bash.script2 env.python.script ascii java.class diff --git a/toys/pending/file.c b/toys/pending/file.c index e4820a3b..fbff5867 100644 --- a/toys/pending/file.c +++ b/toys/pending/file.c @@ -170,7 +170,7 @@ static void do_regular_file(int fd, char *name) // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html else if (len>8 && strstart(&s, "\xca\xfe\xba\xbe")) xprintf("Java class file, version %d.%d\n", - (int)peek_be(s+6, 2), (int)peek_be(s, 2)); + (int)peek_be(s+2, 2), (int)peek_be(s, 2)); // https://people.freebsd.org/~kientzle/libarchive/man/cpio.5.txt // the lengths for cpio are size of header + 9 bytes, since any valid @@ -204,6 +204,9 @@ static void do_regular_file(int fd, char *name) // If shell script, report which interpreter if (len>3 && strstart(&s, "#!")) { + // Whitespace is allowed between the #! and the interpreter + while (isspace(*s)) s++; + if (strstart(&s, "/usr/bin/env")) while (isspace(*s)) s++; for (what = s; (s-toybuf)<len && !isspace(*s); s++); strcpy(s, " script"); |