diff --git a/Makefile b/Makefile index 654982a6f99..7be8ba78038 100644 --- a/Makefile +++ b/Makefile @@ -122,7 +122,7 @@ TGTS= all all-man buildenv buildenvvars buildkernel buildworld \ _build-tools _cross-tools _includes _libraries _depend \ build32 builddtb distribute32 install32 xdev xdev-build xdev-install \ xdev-links native-xtools create-kernel-packages stageworld \ - create-world-packages packages + create-world-packages packages installconfig TGTS+= ${SUBDIR_TARGETS} diff --git a/Makefile.inc1 b/Makefile.inc1 index f1b8edfe79e..b8f6c945336 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -1028,10 +1028,15 @@ redistribute: .MAKE DISTRIBUTION=lib32 .endif -distrib-dirs distribution: .MAKE +distrib-dirs: .MAKE cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \ ${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET} +distribution: .MAKE + cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \ + ${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET} + ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 installconfig + # # buildkernel and installkernel # @@ -1446,6 +1451,8 @@ _cat= bin/cat .if ${BOOTSTRAPPING} < 1000033 _lex= usr.bin/lex + +${_bt}-usr.bin/lex: ${_bt}-usr.bin/m4 .endif # r277259 crunchide: Correct 64-bit section header offset diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index ba44dea0f41..50cefe37932 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,69 @@ # xargs -n1 | sort | uniq -d; # done +# 20151006: new libc++ import +OLD_FILES+=usr/include/c++/__tuple_03 +# 20151006: new clang import which bumps version from 3.6.1 to 3.7.0. +OLD_FILES+=usr/lib/clang/3.6.1/include/__stddef_max_align_t.h +OLD_FILES+=usr/lib/clang/3.6.1/include/__wmmintrin_aes.h +OLD_FILES+=usr/lib/clang/3.6.1/include/__wmmintrin_pclmul.h +OLD_FILES+=usr/lib/clang/3.6.1/include/adxintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/altivec.h +OLD_FILES+=usr/lib/clang/3.6.1/include/ammintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/arm_acle.h +OLD_FILES+=usr/lib/clang/3.6.1/include/arm_neon.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avx2intrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avx512bwintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avx512erintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avx512fintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avx512vlbwintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avx512vlintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/avxintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/bmi2intrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/bmiintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/cpuid.h +OLD_FILES+=usr/lib/clang/3.6.1/include/emmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/f16cintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/fma4intrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/fmaintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/ia32intrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/immintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/lzcntintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/mm3dnow.h +OLD_FILES+=usr/lib/clang/3.6.1/include/mm_malloc.h +OLD_FILES+=usr/lib/clang/3.6.1/include/mmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/module.modulemap +OLD_FILES+=usr/lib/clang/3.6.1/include/nmmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/pmmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/popcntintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/prfchwintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/rdseedintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/rtmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/shaintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/smmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/tbmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/tmmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/wmmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/x86intrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/xmmintrin.h +OLD_FILES+=usr/lib/clang/3.6.1/include/xopintrin.h +OLD_DIRS+=usr/lib/clang/3.6.1/include +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.asan-i386.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.asan-x86_64.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.asan_cxx-i386.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.asan_cxx-x86_64.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.profile-arm.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.profile-i386.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.profile-x86_64.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.san-i386.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.san-x86_64.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.ubsan-i386.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.ubsan-x86_64.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.ubsan_cxx-i386.a +OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.ubsan_cxx-x86_64.a +OLD_DIRS+=usr/lib/clang/3.6.1/lib/freebsd +OLD_DIRS+=usr/lib/clang/3.6.1/lib +OLD_DIRS+=usr/lib/clang/3.6.1 # 20150928: unused sgsmsg utility is removed OLD_FILES+=usr/bin/sgsmsg # 20150926: remove links to removed/unimplemented mbuf(9) macros diff --git a/UPDATING b/UPDATING index f1da8edd7cd..5d97659fbbd 100644 --- a/UPDATING +++ b/UPDATING @@ -31,6 +31,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW: disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20151006: + Clang, llvm, lldb, compiler-rt and libc++ have been upgraded to 3.7.0. + Please see the 20141231 entry below for information about prerequisites + and upgrading, if you are not already using clang 3.5.0 or higher. + 20150924: Kernel debug files have been moved to /usr/lib/debug/boot/kernel/, and renamed from .symbols to .debug. This reduces the size requirements diff --git a/bin/Makefile b/bin/Makefile index ae509c41470..b3385dcd32d 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -40,21 +40,10 @@ SUBDIR= cat \ test \ uuidgen -.if ${MK_RCMDS} != "no" -SUBDIR+= rcp -.endif - -.if ${MK_SENDMAIL} != "no" -SUBDIR+= rmail -.endif - -.if ${MK_TCSH} != "no" -SUBDIR+= csh -.endif - -.if ${MK_TESTS} != "no" -SUBDIR+= tests -.endif +SUBDIR.${MK_RCMDS}+= rcp +SUBDIR.${MK_SENDMAIL}+= rmail +SUBDIR.${MK_TCSH}+= csh +SUBDIR.${MK_TESTS}+= tests .include diff --git a/bin/cat/cat.c b/bin/cat/cat.c index f724cb0b8b9..b5f99ee667f 100644 --- a/bin/cat/cat.c +++ b/bin/cat/cat.c @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #endif #include @@ -167,6 +168,7 @@ scanfiles(char *argv[], int cooked) FILE *fp; i = 0; + fd = -1; while ((path = argv[i]) != NULL || i == 0) { if (path == NULL || strcmp(path, "-") == 0) { filename = "stdin"; @@ -302,31 +304,40 @@ raw_cat(int rfd) static int udom_open(const char *path, int flags) { - struct sockaddr_un sou; - int fd; - unsigned int len; - - bzero(&sou, sizeof(sou)); + struct addrinfo hints, *res, *res0; + char rpath[PATH_MAX]; + int fd = -1; + int error; /* - * Construct the unix domain socket address and attempt to connect + * Construct the unix domain socket address and attempt to connect. */ - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd >= 0) { - sou.sun_family = AF_UNIX; - if ((len = strlcpy(sou.sun_path, path, - sizeof(sou.sun_path))) >= sizeof(sou.sun_path)) { - close(fd); - errno = ENAMETOOLONG; + bzero(&hints, sizeof(hints)); + hints.ai_family = AF_LOCAL; + if (realpath(path, rpath) == NULL) + return (-1); + error = getaddrinfo(rpath, NULL, &hints, &res0); + if (error) { + warn("%s", gai_strerror(error)); + errno = EINVAL; + return (-1); + } + for (res = res0; res != NULL; res = res->ai_next) { + fd = socket(res->ai_family, res->ai_socktype, + res->ai_protocol); + if (fd < 0) { + freeaddrinfo(res0); return (-1); } - len = offsetof(struct sockaddr_un, sun_path[len+1]); - - if (connect(fd, (void *)&sou, len) < 0) { + error = connect(fd, res->ai_addr, res->ai_addrlen); + if (error == 0) + break; + else { close(fd); fd = -1; } } + freeaddrinfo(res0); /* * handle the open flags by shutting down appropriate directions diff --git a/bin/ls/tests/Makefile b/bin/ls/tests/Makefile index 38770e3a052..ba8038c1ce9 100644 --- a/bin/ls/tests/Makefile +++ b/bin/ls/tests/Makefile @@ -6,6 +6,6 @@ ATF_TESTS_SH+= ls_tests # This seems like overkill, but the idea in mind is that all of the testcases # should be runnable as !root TEST_METADATA.ls_tests+= required_user="unprivileged" -TEST_METADATA.ls_tests+= required_files="/usr/bin/nc" +TEST_METADATA.ls_tests+= required_files="/usr/bin/awk /usr/bin/nc /usr/bin/sort" .include diff --git a/bin/ls/tests/ls_tests.sh b/bin/ls/tests/ls_tests.sh index 6e6ebb76f06..160f09d4885 100755 --- a/bin/ls/tests/ls_tests.sh +++ b/bin/ls/tests/ls_tests.sh @@ -45,7 +45,7 @@ create_test_inputs() { create_test_dir - atf_check -e empty -s exit:0 mkdir -m 0755 -p a/b + atf_check -e empty -s exit:0 mkdir -m 0755 -p a/b/1 atf_check -e empty -s exit:0 ln -s a/b c atf_check -e empty -s exit:0 touch d atf_check -e empty -s exit:0 ln d e @@ -53,12 +53,10 @@ create_test_inputs() atf_check -e empty -s exit:0 mkdir .g atf_check -e empty -s exit:0 mkfifo h atf_check -e ignore -s exit:0 dd if=/dev/zero of=i count=1000 bs=1 - atf_check -e empty -s exit:0 \ - sh -c "pid=${ATF_TMPDIR}/nc.pid; daemon -p \$pid nc -lU j; sleep 2; pkill -F \$pid" atf_check -e empty -s exit:0 touch klmn atf_check -e empty -s exit:0 touch opqr atf_check -e empty -s exit:0 touch stuv - atf_check -e empty -s exit:0 touch wxyz + atf_check -e empty -s exit:0 install -m 0755 /dev/null wxyz atf_check -e empty -s exit:0 touch 0b00000001 atf_check -e empty -s exit:0 touch 0b00000010 atf_check -e empty -s exit:0 touch 0b00000011 @@ -74,40 +72,36 @@ create_test_inputs() atf_check -e empty -s exit:0 touch 0b00001101 atf_check -e empty -s exit:0 touch 0b00001110 atf_check -e empty -s exit:0 touch 0b00001111 + + atf_check -e empty -s exit:0 sync } -atf_test_case a_flag -a_flag_head() -{ - atf_set "descr" "Verify -a support" -} +KB=1024 +MB=$(( 1024 * $KB )) +GB=$(( 1024 * $MB )) +TB=$(( 1024 * $GB )) +PB=$(( 1024 * $TB )) -a_flag_body() +create_test_inputs2() { create_test_dir - # Make sure "." and ".." show up with -a - atf_check -e empty -o match:'\.[[:space:]]+\.\.' -s exit:0 ls -ax - - create_test_inputs - - WITH_a=$PWD/../with_a.out - WITHOUT_a=$PWD/../without_a.out - - atf_check -e empty -o save:$WITH_a -s exit:0 ls -A - atf_check -e empty -o save:$WITHOUT_a -s exit:0 ls - - echo "-A usage" - cat $WITH_a - echo "No -A usage" - cat $WITHOUT_a - - for dot_path in '\.f' '\.g'; do - atf_check -e empty -o not-empty -s exit:0 grep "${dot_path}" \ - $WITH_a - atf_check -e empty -o empty -s not-exit:0 grep "${dot_path}" \ - $WITHOUT_a + for filesize in 1 512 $(( 2 * $KB )) $(( 10 * $KB )) $(( 512 * $KB )); \ + do + atf_check -e ignore -o empty -s exit:0 \ + dd if=/dev/zero of=${filesize}.file bs=1 \ + count=1 oseek=${filesize} conv=sparse + files="${files} ${filesize}.file" done + + for filesize in $MB $GB $TB; do + atf_check -e ignore -o empty -s exit:0 \ + dd if=/dev/zero of=${filesize}.file bs=$MB \ + count=1 oseek=$(( $filesize / $MB )) conv=sparse + files="${files} ${filesize}.file" + done + + atf_check -e empty -s exit:0 sync } atf_test_case A_flag @@ -192,21 +186,101 @@ C_flag_head() atf_set "descr" "Verify that the output from ls -C is multi-column, sorted down" } +print_index() +{ + local i=1 + local wanted_index=$1; shift + + while [ $i -le $wanted_index ]; do + if [ $i -eq $wanted_index ]; then + echo $1 + return + fi + shift + : $(( i += 1 )) + done +} + C_flag_body() { create_test_inputs WITH_C=$PWD/../with_C.out + export COLUMNS=40 atf_check -e empty -o save:$WITH_C -s exit:0 ls -C echo "With -C usage" cat $WITH_C - atf_check -e ignore -o not-empty -s exit:0 \ - egrep "0b00000001[[:space:]]+0b00000111[[:space:]]+0b00001101[[:space:]]+e[[:space:]]+stuv" $WITH_C - atf_check -e ignore -o not-empty -s exit:0 \ - egrep "0b00000010[[:space:]]+0b00001000[[:space:]]+0b00001110[[:space:]]+h[[:space:]]+wxyz" $WITH_C + paths=$(find -s . -mindepth 1 -maxdepth 1 \! -name '.*' -exec basename {} \; ) + set -- $paths + num_paths=$# + num_columns=2 + + max_num_paths_per_column=$(( $(( $num_paths + 1 )) / $num_columns )) + + local i=1 + while [ $i -le $max_num_paths_per_column ]; do + column_1=$(print_index $i $paths) + column_2=$(print_index $(( $i + $max_num_paths_per_column )) $paths) + #echo "paths[$(( $i + $max_num_paths_per_column ))] = $column_2" + expected_expr="$column_1" + if [ -n "$column_2" ]; then + expected_expr="$expected_expr[[:space:]]+$column_2" + fi + atf_check -e ignore -o not-empty -s exit:0 \ + egrep "$expected_expr" $WITH_C + : $(( i += 1 )) + done +} + +atf_test_case D_flag +D_flag_head() +{ + atf_set "descr" "Verify that the output from ls -D modifies the time format used with ls -l" +} + +D_flag_body() +{ + atf_check -e empty -o empty -s exit:0 touch a.file + atf_check -e empty -o match:"$(stat -f '%c[[:space:]]+%N' a.file)" \ + -s exit:0 ls -lD '%s' +} + +atf_test_case F_flag +F_flag_head() +{ + atf_set "descr" "Verify that the output from ls -F prints out appropriate symbols after files" +} + +F_flag_body() +{ + create_test_inputs + + atf_check -e empty -s exit:0 \ + sh -c "pid=${ATF_TMPDIR}/nc.pid; daemon -p \$pid nc -lU j; sleep 2; pkill -F \$pid" + + atf_check -e empty -o match:'a/' -s exit:0 ls -F + atf_check -e empty -o match:'c@' -s exit:0 ls -F + atf_check -e empty -o match:'h\|' -s exit:0 ls -F + atf_check -e empty -o match:'j=' -s exit:0 ls -F + #atf_check -e empty -o match:'%' -s exit:0 ls -F + atf_check -e empty -o match:'stuv' -s exit:0 ls -F + atf_check -e empty -o match:'wxyz\*' -s exit:0 ls -F +} + +atf_test_case H_flag +H_flag_head() +{ + atf_set "descr" "Verify that ls -H follows symlinks" +} + +H_flag_body() +{ + create_test_inputs + + atf_check -e empty -o match:'1' -s exit:0 ls -H c } atf_test_case I_flag @@ -251,9 +325,323 @@ I_flag_voids_implied_A_flag_when_root_body() atf_check -o match:'\.g' -s exit:0 ls -A -I } +atf_test_case L_flag +L_flag_head() +{ + atf_set "descr" "Verify that -L prints out the symbolic link and conversely -P prints out the target for the symbolic link" +} + +L_flag_body() +{ + atf_check -e empty -o empty -s exit:0 ln -s target1/target2 link1 + atf_check -e empty -o match:link1 -s exit:0 ls -L + atf_check -e empty -o not-match:target1/target2 -s exit:0 ls -L +} + +atf_test_case R_flag +R_flag_head() +{ + atf_set "descr" "Verify that the output from ls -R prints out the directory contents recursively" +} + +R_flag_body() +{ + create_test_inputs + + WITH_R=$PWD/../with_R.out + WITH_R_expected_output=$PWD/../with_R_expected.out + + atf_check -e empty -o save:$WITH_R -s exit:0 ls -R + + set -- . $(find -s . \! -name '.*' -type d) + while [ $# -gt 0 ]; do + dir=$1; shift + [ "$dir" != "." ] && echo "$dir:" + (cd $dir && ls -1A | sed -e '/^\./d') + [ $# -ne 0 ] && echo + done > $WITH_R_expected_output + + echo "-R usage" + cat $WITH_R + echo "-R expected output" + cat $WITH_R_expected_output + + atf_check_equal "$(cat $WITH_R)" "$(cat $WITH_R_expected_output)" +} + +atf_test_case S_flag +S_flag_head() +{ + atf_set "descr" "Verify that -S sorts by file size, then by filename lexicographically" +} + +S_flag_body() +{ + create_test_dir + + file_list_dir=$PWD/../files + + atf_check -e empty -o empty -s exit:0 mkdir -p $file_list_dir + + create_test_inputs + create_test_inputs2 + + WITH_S=$PWD/../with_S.out + WITHOUT_S=$PWD/../without_S.out + + atf_check -e empty -o save:$WITH_S ls -D '%s' -lS + atf_check -e empty -o save:$WITHOUT_S ls -D '%s' -l + + WITH_S_parsed=$(awk '! /^total/ { print $7 }' $WITH_S) + set -- $(awk '! /^total/ { print $5, $7 }' $WITHOUT_S) + while [ $# -gt 0 ]; do + size=$1; shift + filename=$1; shift + echo $filename >> $file_list_dir/${size} + done + file_lists=$(find $file_list_dir -type f -exec basename {} \; | sort -nr) + WITHOUT_S_parsed=$(for file_list in $file_lists; do sort < $file_list_dir/$file_list; done) + + echo "-lS usage (parsed)" + echo "$WITH_S_parsed" + echo "-l usage (parsed)" + echo "$WITHOUT_S_parsed" + + atf_check_equal "$WITHOUT_S_parsed" "$WITH_S_parsed" +} + +atf_test_case T_flag +T_flag_head() +{ + atf_set "descr" "Verify -T support" +} + +T_flag_body() +{ + create_test_dir + + atf_check -e empty -o empty -s exit:0 touch a.file + + birthtime_in_secs=$(stat -f %B -t %s a.file) + birthtime=$(date -j -f %s $birthtime_in_secs +"[[:space:]]+%b[[:space:]]+%e[[:space:]]+%H:%M:%S[[:space:]]+%Y") + + atf_check -e empty -o match:"$birthtime"'[[:space:]]+a\.file' \ + -s exit:0 ls -lT a.file +} + +atf_test_case a_flag +a_flag_head() +{ + atf_set "descr" "Verify -a support" +} + +a_flag_body() +{ + create_test_dir + + # Make sure "." and ".." show up with -a + atf_check -e empty -o match:'\.[[:space:]]+\.\.' -s exit:0 ls -ax + + create_test_inputs + + WITH_a=$PWD/../with_a.out + WITHOUT_a=$PWD/../without_a.out + + atf_check -e empty -o save:$WITH_a -s exit:0 ls -a + atf_check -e empty -o save:$WITHOUT_a -s exit:0 ls + + echo "-a usage" + cat $WITH_a + echo "No -a usage" + cat $WITHOUT_a + + for dot_path in '\.f' '\.g'; do + atf_check -e empty -o not-empty -s exit:0 grep "${dot_path}" \ + $WITH_a + atf_check -e empty -o empty -s not-exit:0 grep "${dot_path}" \ + $WITHOUT_a + done +} + +atf_test_case b_flag +b_flag_head() +{ + atf_set "descr" "Verify that the output from ls -b prints out non-printable characters" +} + +b_flag_body() +{ + atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" + + atf_check -e empty -o empty -s exit:0 touch "$(printf "y\013z")" + atf_check -e empty -o match:'y\\vz' -s exit:0 ls -b +} + +atf_test_case d_flag +d_flag_head() +{ + atf_set "descr" "Verify that -d doesn't descend down directories" +} + +d_flag_body() +{ + create_test_dir + + output=$PWD/../output + + atf_check -e empty -o empty -s exit:0 mkdir -p a/b + + for path in . $PWD a; do + atf_check -e empty -o save:$output -s exit:0 ls -d $path + atf_check_equal "$(cat $output)" "$path" + done +} + +atf_test_case f_flag +f_flag_head() +{ + atf_set "descr" "Verify that -f prints out the contents of a directory unsorted" +} + +f_flag_body() +{ + create_test_inputs + + output=$PWD/../output + + # XXX: I don't have enough understanding of how the algorithm works yet + # to determine more than the fact that all the entries printed out + # exist + paths=$(find -s . -mindepth 1 -maxdepth 1 \! -name '.*' -exec basename {} \; ) + + atf_check -e empty -o save:$output -s exit:0 ls -f + + for path in $paths; do + atf_check -e ignore -o not-empty -s exit:0 \ + egrep "^$path$" $output + done +} + +atf_test_case g_flag +g_flag_head() +{ + atf_set "descr" "Verify that -g does nothing (compatibility flag)" +} + +g_flag_body() +{ + create_test_inputs2 + for file in $files; do + atf_check -e empty -o match:"$(ls -a $file)" -s exit:0 \ + ls -ag $file + atf_check -e empty -o match:"$(ls -la $file)" -s exit:0 \ + ls -alg $file + done +} + +atf_test_case h_flag +h_flag_head() +{ + atf_set "descr" "Verify that -h prints out the humanized units for file sizes with ls -l" + atf_set "require.files" "/usr/bin/bc" +} + +h_flag_body() +{ + # XXX: this test doesn't currently show how 999 bytes will be 999B, + # but 1000 bytes will be 1.0K, due to how humanize_number(3) works. + create_test_inputs2 + for file in $files; do + file_size=$(stat -f '%z' "$file") || \ + atf_fail "stat'ing $file failed" + scale=2 + if [ $file_size -lt $KB ]; then + divisor=1 + scale=0 + suffix=B + elif [ $file_size -lt $MB ]; then + divisor=$KB + suffix=K + elif [ $file_size -lt $GB ]; then + divisor=$MB + suffix=M + elif [ $file_size -lt $TB ]; then + divisor=$GB + suffix=G + elif [ $file_size -lt $PB ]; then + divisor=$TB + suffix=T + else + divisor=$PB + suffix=P + fi + + bc_expr="$(printf "scale=%s\n%s/%s\nquit" $scale $file_size $divisor)" + size_humanized=$(bc -e "$bc_expr" | tr '.' '\.' | sed -e 's,\.00,,') + + atf_check -e empty -o match:"$size_humanized.+$file" \ + -s exit:0 ls -hl $file + done +} + +atf_test_case i_flag +i_flag_head() +{ + atf_set "descr" "Verify that -i prints out the inode for files" +} + +i_flag_body() +{ + create_test_inputs + + paths=$(find -L . -mindepth 1) + [ -n "$paths" ] || atf_skip 'Could not find any paths to iterate over (!)' + + for path in $paths; do + atf_check -e empty \ + -o match:"$(stat -f '[[:space:]]*%i[[:space:]]+%N' $path)" \ + -s exit:0 ls -d1i $path + done +} + +atf_test_case k_flag +k_flag_head() +{ + atf_set "descr" "Verify that -k prints out the size with a block size of 1kB" +} + +k_flag_body() +{ + create_test_inputs2 + for file in $files; do + atf_check -e empty \ + -o match:"[[:space:]]+$(stat -f "%z" $file)[[:space:]]+.+[[:space:]]+$file" ls -lk $file + done +} + +atf_test_case l_flag +l_flag_head() +{ + atf_set "descr" "Verify that -l prints out the output in long format" +} + +l_flag_body() +{ + + atf_check -e empty -o empty -s exit:0 touch a.file + + birthtime_in_secs=$(stat -f "%B" -t "%s" a.file) + birthtime=$(date -j -f "%s" $birthtime_in_secs +"%b[[:space:]]+%e[[:space:]]+%H:%M") + + expected_output=$(stat -f "%Sp[[:space:]]+%l[[:space:]]+%Su[[:space:]]+%Sg[[:space:]]+%z[[:space:]]+$birthtime[[:space:]]+a\\.file" a.file) + + atf_check -e empty -o match:"$expected_output" -s exit:0 ls -l a.file +} + +atf_test_case lcomma_flag lcomma_flag_head() { - atf_set "descr" "Verify that -l, prints out the size with , delimiters" + atf_set "descr" "Verify that -l, prints out the size with ',' delimiters" } lcomma_flag_body() @@ -265,9 +653,211 @@ lcomma_flag_body() env LC_ALL=en_US.ISO8859-1 ls -l, i } +atf_test_case m_flag +m_flag_head() +{ + atf_set "descr" "Verify that the output from ls -m is comma-separated" +} + +m_flag_body() +{ + create_test_dir + + output=$PWD/../output + + atf_check -e empty -o empty -s exit:0 touch ,, "a,b " c d e + + atf_check -e empty -o save:$output -s exit:0 ls -m + + atf_check_equal "$(cat $output)" ",,, a,b , c, d, e" +} + +atf_test_case n_flag +n_flag_head() +{ + atf_set "descr" "Verify that the output from ls -n prints out numeric GIDs/UIDs instead of symbolic GIDs/UIDs" + atf_set "require.user" "root" +} + +n_flag_body() +{ + daemon_gid=$(id -g daemon) || atf_skip "could not resolve gid for daemon (!)" + nobody_uid=$(id -u nobody) || atf_skip "could not resolve uid for nobody (!)" + + atf_check -e empty -o empty -s exit:0 touch a.file + atf_check -e empty -o empty -s exit:0 chown $nobody_uid:$daemon_gid a.file + + atf_check -e empty \ + -o match:'\-rw\-r\-\-r\-\-[[:space:]]+1[[:space:]]+'"$nobody_uid[[:space:]]+$daemon_gid"'[[:space:]]+.+a\.file' \ + ls -ln a.file + +} + +atf_test_case o_flag +o_flag_head() +{ + atf_set "descr" "Verify that the output from ls -o prints out the chflag values or '-' if none are set" + atf_set "require.user" "root" +} + +o_flag_body() +{ + local size=12345 + + create_test_dir + + atf_check -e ignore -o empty -s exit:0 dd if=/dev/zero of=a.file \ + bs=$size count=1 + atf_check -e ignore -o empty -s exit:0 dd if=/dev/zero of=b.file \ + bs=$size count=1 + atf_check -e empty -o empty -s exit:0 chflags uarch a.file + + atf_check -e empty -o match:"[[:space:]]+uarch[[:space:]]$size+.+a\\.file" \ + -s exit:0 ls -lo a.file + atf_check -e empty -o match:"[[:space:]]+\\-[[:space:]]$size+.+b\\.file" \ + -s exit:0 ls -lo b.file +} + +atf_test_case p_flag +p_flag_head() +{ + atf_set "descr" "Verify that the output from ls -p prints out '/' after directories" +} + +p_flag_body() +{ + create_test_inputs + + paths=$(find -L .) + [ -n "$paths" ] || atf_skip 'Could not find any paths to iterate over (!)' + + for path in $paths; do + suffix= + # If path is not a symlink and is a directory, then the suffix + # must be "/". + if [ ! -L "${path}" -a -d "$path" ]; then + suffix=/ + fi + atf_check -e empty -o match:"$path${suffix}" -s exit:0 \ + ls -dp $path + done +} + +atf_test_case q_flag_and_w_flag +q_flag_and_w_flag_head() +{ + atf_set "descr" "Verify that the output from ls -q prints out '?' for ESC and ls -w prints out the escape character" +} + +q_flag_and_w_flag_body() +{ + atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" + + create_test_dir + + test_file="$(printf "y\01z")" + + atf_check -e empty -o empty -s exit:0 touch "$test_file" + + atf_check -e empty -o match:'y\?z' -s exit:0 ls -q "$test_file" + atf_check -e empty -o match:"$test_file" -s exit:0 ls -w "$test_file" +} + +atf_test_case r_flag +r_flag_head() +{ + atf_set "descr" "Verify that the output from ls -r sorts the same way as reverse sorting with sort(1)" +} + +r_flag_body() +{ + create_test_inputs + + WITH_r=$PWD/../with_r.out + WITH_sort=$PWD/../with_sort.out + + atf_check -e empty -o save:$WITH_r -s exit:0 ls -1r + atf_check -e empty -o save:$WITH_sort -s exit:0 sh -c 'ls -1 | sort -r' + + echo "Sorted with -r" + cat $WITH_r + echo "Reverse sorted with sort(1)" + cat $WITH_sort + + atf_check_equal "$(cat $WITH_r)" "$(cat $WITH_sort)" +} + +atf_test_case s_flag +s_flag_head() +{ + atf_set "descr" "Verify that the output from ls -s matches the output from stat(1)" +} + +s_flag_body() +{ + create_test_inputs2 + for file in $files; do + atf_check -e empty \ + -o match:"$(stat -f "%b" $file)[[:space:]]+$file" ls -s $file + done +} + +atf_test_case t_flag +t_flag_head() +{ + atf_set "descr" "Verify that the output from ls -t sorts by modification time" +} + +t_flag_body() +{ + create_test_dir + + atf_check -e empty -o empty -s exit:0 touch a.file + atf_check -e empty -o empty -s exit:0 touch b.file + + atf_check -e empty -s exit:0 sync + + atf_check -e empty -o match:'a\.file' -s exit:0 sh -c 'ls -lt | tail -n 1' + atf_check -e empty -o match:'b\.file.*a\.file' -s exit:0 ls -Ct + + atf_check -e empty -o empty -s exit:0 rm a.file + atf_check -e empty -o empty -s exit:0 sh -c 'echo "i am a" > a.file' + + atf_check -e empty -s exit:0 sync + + atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lt | tail -n 1' + atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Ct +} + +atf_test_case u_flag +u_flag_head() +{ + atf_set "descr" "Verify that the output from ls -u sorts by last access" +} + +u_flag_body() +{ + create_test_dir + + atf_check -e empty -o empty -s exit:0 touch a.file + atf_check -e empty -o empty -s exit:0 touch b.file + atf_check -e empty -s exit:0 sync + + atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lu | tail -n 1' + atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Cu + + atf_check -e empty -o empty -s exit:0 sh -c 'echo "i am a" > a.file' + atf_check -e empty -o match:'i am a' -s exit:0 cat a.file + atf_check -e empty -s exit:0 sync + + atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lu | tail -n 1' + atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Cu +} + +atf_test_case x_flag x_flag_head() { - atf_set "descr" "Verify that -x prints out one item per line" + atf_set "descr" "Verify that the output from ls -x is multi-column, sorted across" } x_flag_body() @@ -284,9 +874,34 @@ x_flag_body() atf_check -e ignore -o not-empty -s exit:0 \ egrep "a[[:space:]]+c[[:space:]]+d[[:space:]]+e[[:space:]]+h" $WITH_x atf_check -e ignore -o not-empty -s exit:0 \ - egrep "i[[:space:]]+j[[:space:]]+klmn[[:space:]]+opqr[[:space:]]+stuv" $WITH_x + egrep "i[[:space:]]+klmn[[:space:]]+opqr[[:space:]]+stuv[[:space:]]+wxyz" $WITH_x } +atf_test_case y_flag +y_flag_head() +{ + atf_set "descr" "Verify that the output from ls -y sorts the same way as sort(1)" +} + +y_flag_body() +{ + create_test_inputs + + WITH_sort=$PWD/../with_sort.out + WITH_y=$PWD/../with_y.out + + atf_check -e empty -o save:$WITH_sort -s exit:0 sh -c 'ls -1 | sort' + atf_check -e empty -o save:$WITH_y -s exit:0 ls -1y + + echo "Sorted with sort(1)" + cat $WITH_sort + echo "Sorted with -y" + cat $WITH_y + + atf_check_equal "$(cat $WITH_sort)" "$(cat $WITH_y)" +} + +atf_test_case 1_flag 1_flag_head() { atf_set "descr" "Verify that -1 prints out one item per line" @@ -313,47 +928,47 @@ x_flag_body() atf_init_test_cases() { + export BLOCKSIZE=512 atf_add_test_case A_flag atf_add_test_case A_flag_implied_when_root atf_add_test_case B_flag atf_add_test_case C_flag - #atf_add_test_case D_flag - #atf_add_test_case F_flag + atf_add_test_case D_flag + atf_add_test_case F_flag #atf_add_test_case G_flag - #atf_add_test_case H_flag + atf_add_test_case H_flag atf_add_test_case I_flag atf_add_test_case I_flag_voids_implied_A_flag_when_root - #atf_add_test_case L_flag + atf_add_test_case L_flag #atf_add_test_case P_flag - #atf_add_test_case R_flag - #atf_add_test_case S_flag - #atf_add_test_case T_flag + atf_add_test_case R_flag + atf_add_test_case S_flag + atf_add_test_case T_flag #atf_add_test_case U_flag #atf_add_test_case W_flag #atf_add_test_case Z_flag atf_add_test_case a_flag - #atf_add_test_case b_flag + atf_add_test_case b_flag #atf_add_test_case c_flag - #atf_add_test_case d_flag - #atf_add_test_case f_flag - #atf_add_test_case g_flag - #atf_add_test_case h_flag - #atf_add_test_case i_flag - #atf_add_test_case k_flag - #atf_add_test_case l_flag + atf_add_test_case d_flag + atf_add_test_case f_flag + atf_add_test_case g_flag + atf_add_test_case h_flag + atf_add_test_case i_flag + atf_add_test_case k_flag + atf_add_test_case l_flag atf_add_test_case lcomma_flag - #atf_add_test_case m_flag - #atf_add_test_case n_flag - #atf_add_test_case o_flag - #atf_add_test_case p_flag - #atf_add_test_case q_flag - #atf_add_test_case r_flag - #atf_add_test_case s_flag - #atf_add_test_case t_flag - #atf_add_test_case u_flag - #atf_add_test_case w_flag + atf_add_test_case m_flag + atf_add_test_case n_flag + atf_add_test_case o_flag + atf_add_test_case p_flag + atf_add_test_case q_flag_and_w_flag + atf_add_test_case r_flag + atf_add_test_case s_flag + atf_add_test_case t_flag + atf_add_test_case u_flag atf_add_test_case x_flag - #atf_add_test_case y_flag + atf_add_test_case y_flag atf_add_test_case 1_flag } diff --git a/contrib/compiler-rt/LICENSE.TXT b/contrib/compiler-rt/LICENSE.TXT index aee8347b0c3..aa4115e2a79 100644 --- a/contrib/compiler-rt/LICENSE.TXT +++ b/contrib/compiler-rt/LICENSE.TXT @@ -14,7 +14,7 @@ Full text of the relevant licenses is included below. University of Illinois/NCSA Open Source License -Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT +Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT All rights reserved. @@ -55,7 +55,7 @@ SOFTWARE. ============================================================================== -Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT +Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/contrib/compiler-rt/include/sanitizer/coverage_interface.h b/contrib/compiler-rt/include/sanitizer/coverage_interface.h index 88a7e480081..404b71e3086 100644 --- a/contrib/compiler-rt/include/sanitizer/coverage_interface.h +++ b/contrib/compiler-rt/include/sanitizer/coverage_interface.h @@ -39,6 +39,23 @@ extern "C" { // Some of the entries in *data will be zero. uintptr_t __sanitizer_get_coverage_guards(uintptr_t **data); + // The coverage instrumentation may optionally provide imprecise counters. + // Rather than exposing the counter values to the user we instead map + // the counters to a bitset. + // Every counter is associated with 8 bits in the bitset. + // We define 8 value ranges: 1, 2, 3, 4-7, 8-15, 16-31, 32-127, 128+ + // The i-th bit is set to 1 if the counter value is in the i-th range. + // This counter-based coverage implementation is *not* thread-safe. + + // Returns the number of registered coverage counters. + uintptr_t __sanitizer_get_number_of_counters(); + // Updates the counter 'bitset', clears the counters and returns the number of + // new bits in 'bitset'. + // If 'bitset' is nullptr, only clears the counters. + // Otherwise 'bitset' should be at least + // __sanitizer_get_number_of_counters bytes long and 8-aligned. + uintptr_t + __sanitizer_update_counter_bitset_and_clear_counters(uint8_t *bitset); #ifdef __cplusplus } // extern "C" #endif diff --git a/contrib/compiler-rt/include/sanitizer/dfsan_interface.h b/contrib/compiler-rt/include/sanitizer/dfsan_interface.h index 79dbf2f364c..84ffd49f8af 100644 --- a/contrib/compiler-rt/include/sanitizer/dfsan_interface.h +++ b/contrib/compiler-rt/include/sanitizer/dfsan_interface.h @@ -91,6 +91,16 @@ void dfsan_set_write_callback(dfsan_write_callback_t labeled_write_callback); ///