1f9e4e3e2Sschwarze#!/bin/sh 2f9e4e3e2Sschwarze# 3607cf24dSschwarze# Copyright (c) 2015, 2018 Ingo Schwarze <schwarze@openbsd.org> 4f9e4e3e2Sschwarze# 5f9e4e3e2Sschwarze# Permission to use, copy, modify, and distribute this software for any 6f9e4e3e2Sschwarze# purpose with or without fee is hereby granted, provided that the above 7f9e4e3e2Sschwarze# copyright notice and this permission notice appear in all copies. 8f9e4e3e2Sschwarze# 9f9e4e3e2Sschwarze# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10f9e4e3e2Sschwarze# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11f9e4e3e2Sschwarze# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12f9e4e3e2Sschwarze# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13f9e4e3e2Sschwarze# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14f9e4e3e2Sschwarze# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15f9e4e3e2Sschwarze# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16f9e4e3e2Sschwarze 17f9e4e3e2Sschwarzetest_ps() 18f9e4e3e2Sschwarze{ 19f9e4e3e2Sschwarze args=$1 20f9e4e3e2Sschwarze ps_vars=$2 21f9e4e3e2Sschwarze ps_args=$3 22f9e4e3e2Sschwarze expected=$4 23f9e4e3e2Sschwarze if [ "X$args" = "X${args%=*}" ]; then 2468b2a4f5Sschwarze if [ -n "$args" ]; then 2568b2a4f5Sschwarze ./shortsleep "$args" & 2668b2a4f5Sschwarze else 2768b2a4f5Sschwarze ./shortsleep & 2868b2a4f5Sschwarze fi 29f9e4e3e2Sschwarze else 30f9e4e3e2Sschwarze env -i $args ./shortsleep & 31f9e4e3e2Sschwarze fi 32f9e4e3e2Sschwarze pid=$! 33f9e4e3e2Sschwarze 34f9e4e3e2Sschwarze # Give the forked process some time to set up its process name. 358291f059Svisa until ps -p $pid -o wchan | grep -q nanoslp; do :; done 36f9e4e3e2Sschwarze 37f9e4e3e2Sschwarze result=`env $ps_vars ps -p $pid $ps_args | tail -n +2` 38f9e4e3e2Sschwarze kill $pid 39f9e4e3e2Sschwarze if [ "$result" != "$expected" ]; then 40f9e4e3e2Sschwarze echo "$args & $ps_vars ps $ps_args" 41f9e4e3e2Sschwarze echo "expected: >$expected<" 42f9e4e3e2Sschwarze echo "result: >$result<" 43f9e4e3e2Sschwarze exit 1; 44f9e4e3e2Sschwarze fi 45f9e4e3e2Sschwarze} 46f9e4e3e2Sschwarze 47*1b6cbe56Santonunset LC_ALL 48*1b6cbe56Santon 49f9e4e3e2Sschwarzemypid=`printf %5d $$` 50f9e4e3e2Sschwarze 51f9e4e3e2Sschwarze# not in the last column, limited width 52f9e4e3e2Sschwarzetest_ps "" "" "-o command,ppid" "./shortsleep $mypid" 53f9e4e3e2Sschwarzetest_ps "" "" "-c -o command,ppid" "shortsleep $mypid" 54607cf24dSschwarzetest_ps "E=1" "" "-eo command,ppid" "E=1 ./shortsleep $mypid" 55f9e4e3e2Sschwarzetest_ps "E=1" "" "-ceo command,ppid" "E=1 shortsleep $mypid" 56f9e4e3e2Sschwarzetest_ps "long_argument" "" "-o command,ppid" "./shortsleep lon $mypid" 57f9e4e3e2Sschwarzetest_ps "long_argument" "" "-co command,ppid" "shortsleep $mypid" 58607cf24dSschwarzetest_ps "E=long" "" "-eo command,ppid" "E=long ./shortsl $mypid" 59f9e4e3e2Sschwarzetest_ps "E=long" "" "-ceo command,ppid" "E=long shortslee $mypid" 60f9e4e3e2Sschwarzetest_ps "E=1 L=very_long_var" "" "-eo command,ppid" "E=1 L=very_long_ $mypid" 61f9e4e3e2Sschwarzetest_ps "E=1 L=very_long_var" "" "-ceo command,ppid" "E=1 L=very_long_ $mypid" 62f9e4e3e2Sschwarze 63f9e4e3e2Sschwarze# not in the last column, unlimited width 64f9e4e3e2Sschwarzetest_ps "" "" "-wwo command,ppid" "./shortsleep $mypid" 65f9e4e3e2Sschwarzetest_ps "" "" "-cwwo command,ppid" "shortsleep $mypid" 66607cf24dSschwarzetest_ps "E=1" "" "-ewwo command,ppid" "E=1 ./shortsleep $mypid" 67f9e4e3e2Sschwarzetest_ps "E=1" "" "-cewwo command,ppid" "E=1 shortsleep $mypid" 68f9e4e3e2Sschwarzetest_ps "long_argument" "" "-wwo command,ppid" "./shortsleep lon $mypid" 69f9e4e3e2Sschwarzetest_ps "long_argument" "" "-cwwo command,ppid" "shortsleep $mypid" 70607cf24dSschwarzetest_ps "E=long" "" "-ewwo command,ppid" "E=long ./shortsl $mypid" 71f9e4e3e2Sschwarzetest_ps "E=long" "" "-cewwo command,ppid" "E=long shortslee $mypid" 72f9e4e3e2Sschwarzetest_ps "E=1 L=very_long_var" "" "-ewwo command,ppid" \ 73f9e4e3e2Sschwarze "E=1 L=very_long_ $mypid" 74f9e4e3e2Sschwarzetest_ps "E=1 L=very_long_var" "" "-cewwo command,ppid" \ 75f9e4e3e2Sschwarze "E=1 L=very_long_ $mypid" 76f9e4e3e2Sschwarze 77a9017490Sschwarze# UTF-8 78a9017490Sschwarze#width 1 79a9017490Sschwarzetest_ps "ñン" \ 80a9017490Sschwarze "LC_CTYPE=en_US.UTF-8" "-wwo command,ppid" \ 81a9017490Sschwarze "./shortsleep ñン $mypid" 82a9017490Sschwarze# width 0 (combining) 83a9017490Sschwarzetest_ps "x̀" "LC_CTYPE=en_US.UTF-8" "-wwo command,ppid" \ 84a9017490Sschwarze "./shortsleep x̀ $mypid" 85a9017490Sschwarze# width 2 (east asian) 86a9017490Sschwarzetest_ps "쿿" "LC_CTYPE=en_US.UTF-8" "-wwo command,ppid" \ 87a9017490Sschwarze "./shortsleep 쿿 $mypid" 88a9017490Sschwarze# non-printable 89a9017490Sschwarzetest_ps "" "LC_CTYPE=en_US.UTF-8" "-wwo command,ppid" \ 90a9017490Sschwarze "./shortsleep � $mypid" 91a9017490Sschwarze 9231236b74Sschwarze# UTF-8 in the C locale 9331236b74Sschwarzetest_ps "E=ñ" "LC_CTYPE=C" "-ewwo command,ppid" \ 94*1b6cbe56Santon "E=\M-C\M-1 ./sho $mypid" 9531236b74Sschwarzetest_ps "E=ン" "LC_CTYPE=C" "-ewwo command,ppid" \ 96*1b6cbe56Santon "E=\M-o\M->\M^] . $mypid" 9731236b74Sschwarzetest_ps "E=x̀" "LC_CTYPE=C" "-ewwo command,ppid" \ 98*1b6cbe56Santon "E=x\M-L\M^@ ./sh $mypid" 9931236b74Sschwarzetest_ps "E=쿿" "LC_CTYPE=C" "-ewwo command,ppid" \ 100*1b6cbe56Santon "E=\M-l\M-?\M-? . $mypid" 10131236b74Sschwarze 1024c651f54Sschwarze# invalid 8-bit bytes 103607cf24dSschwarzetest_ps "E=x�x" "" "-ewwo command,ppid" "E=x\M^?x ./short $mypid" 104607cf24dSschwarzetest_ps "E=x�x" "" "-ewwo command,ppid" "E=x\M-1x ./short $mypid" 105607cf24dSschwarzetest_ps "E=x�x" "" "-ewwo command,ppid" "E=x\M-Cx ./short $mypid" 106607cf24dSschwarzetest_ps "E=x�x" "" "-ewwo command,ppid" "E=x\M-o\M->x ./s $mypid" 1074c651f54Sschwarze 108f9e4e3e2Sschwarze# in the last column, limited width 109f9e4e3e2Sschwarzetest_ps "" "" "-o command" "./shortsleep" 110f9e4e3e2Sschwarzetest_ps "" "" "-co command" "shortsleep" 111f9e4e3e2Sschwarzetest_ps "" "COLUMNS=4" "-o command" "./sh" 112f9e4e3e2Sschwarzetest_ps "" "COLUMNS=4" "-co command" "shor" 113f9e4e3e2Sschwarzetest_ps "" "COLUMNS=10" "-o ppid,command" "$mypid ./sh" 114f9e4e3e2Sschwarzetest_ps "" "COLUMNS=10" "-co ppid,command" "$mypid shor" 115f9e4e3e2Sschwarzetest_ps "" "COLUMNS=4" "-o ppid,command" "$mypid ./shortsleep" 116f9e4e3e2Sschwarzetest_ps "" "COLUMNS=4" "-co ppid,command" "$mypid shortsleep" 117f9e4e3e2Sschwarzetest_ps "long_arg" "COLUMNS=4" "-o ppid,command" "$mypid ./shortsleep lon" 118f9e4e3e2Sschwarzetest_ps "long_arg" "COLUMNS=4" "-co ppid,command" "$mypid shortsleep" 119607cf24dSschwarzetest_ps "E=1" "" "-eo command" "E=1 ./shortsleep" 120f9e4e3e2Sschwarzetest_ps "E=1" "" "-ceo command" "E=1 shortsleep" 121607cf24dSschwarzetest_ps "E=1" "COLUMNS=7" "-eo command" "E=1 ./s" 122607cf24dSschwarzetest_ps "E=1" "COLUMNS=6" "-eo command" "E=1 ./" 123607cf24dSschwarzetest_ps "E=1" "COLUMNS=5" "-eo command" "E=1 ." 124f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=4" "-eo command" "E=1 " 125f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=3" "-eo command" "E=1" 126f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=2" "-eo command" "E=" 127f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=5" "-ceo command" "E=1 s" 128f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=4" "-ceo command" "E=1 " 129f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=3" "-ceo command" "E=1" 130f9e4e3e2Sschwarzetest_ps "E=1" "COLUMNS=2" "-ceo command" "E=" 131f9e4e3e2Sschwarze 132f9e4e3e2Sschwarze# in the last column, unlimited width 133f9e4e3e2Sschwarzetest_ps "" "" "-wwo command" "./shortsleep" 134f9e4e3e2Sschwarzetest_ps "" "" "-cwwo command" "shortsleep" 135f9e4e3e2Sschwarzetest_ps "long_argument" "" "-wwo command" "./shortsleep long_argument" 136f9e4e3e2Sschwarzetest_ps "long_argument" "" "-cwwo command" "shortsleep" 137607cf24dSschwarzetest_ps "E=1" "" "-ewwo command" "E=1 ./shortsleep" 138f9e4e3e2Sschwarzetest_ps "E=1" "" "-cewwo command" "E=1 shortsleep" 139f9e4e3e2Sschwarzetest_ps "E=1 L=very_long_var" "" "-ewwo command" \ 140607cf24dSschwarze "E=1 L=very_long_var ./shortsleep" 141f9e4e3e2Sschwarzetest_ps "E=1 L=very_long_var" "" "-cewwo command" \ 142f9e4e3e2Sschwarze "E=1 L=very_long_var shortsleep" 143f9e4e3e2Sschwarze 14468b2a4f5Sschwarze# test vis(3)ing 14568b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^A\\^B\\^C" 14668b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^D\\^E\\^F\\a" 14768b2a4f5Sschwarzetest_ps " x 14868b2a4f5Sschwarze" "" "-o command" "./shortsleep \\b\\tx\\n\\v" 14968b2a4f5Sschwarzetest_ps " 15068b2a4f5Sschwarze" "" "-o command" "./shortsleep \\f\\r\\^N\\^O" 15168b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^P\\^Q\\^R\\^S" 15268b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^T\\^U\\^V\\^W" 15368b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^X\\^Y\\^Z\\^[" 15468b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^\\\\^]\\^^\\^_" 15568b2a4f5Sschwarzetest_ps "x x" "" "-o command" "./shortsleep x x" 15668b2a4f5Sschwarzetest_ps "" "" "-o command" "./shortsleep \\^?" 157f9e4e3e2Sschwarze 158exit 0 159