check_errno.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #!/usr/bin/env bash
  2. # Small script to test fpc to system error numbers
  3. addtoerrno=0
  4. errnonew=./errno-new.inc
  5. temps="check_errno_list.sh check_reverse_errno_list.sh test-errno* $errnonew"
  6. if [ "$1" == "clean" ] ; then
  7. echo "Deleting $temps"
  8. rm -f $temps
  9. exit
  10. fi
  11. if [ "$1" == "verbose" ] ; then
  12. verbose=1
  13. echo "Being verbose"
  14. shift
  15. else
  16. verbose=0
  17. fi
  18. # Location of error number in system header
  19. errno_header="/usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h"
  20. errno_include=./errno.inc
  21. # Sustitution made to pass from fpc syscall number
  22. # to system define
  23. fpc_errno_prefix=ESysE
  24. errno_prefix=E
  25. # Test C file to grab all loaded headers
  26. cat > test-errno.c <<EOF
  27. #include <errno.h>
  28. int
  29. dummy ()
  30. {
  31. return 0;
  32. }
  33. EOF
  34. # Default C compiler is gcc
  35. # Can be overwritten by setting CC variable
  36. # But I don't know if other compilers also generate
  37. # .i files with --save-temps option
  38. if [ "$CC" == "" ] ; then
  39. CC=gcc
  40. fi
  41. # Use gcc with --save-temps option to create .i file
  42. $CC --save-temps -c ./test-errno.c
  43. # list of errno.h headers listed
  44. errno_headers=` sed -n "s:.*\"\(.*\.h\)\".*:\1:p" test-errno.i |sort | uniq`
  45. echo "Headers found are \"$errno_headers\""
  46. if [ "$errno_headers" != "" ] ; then
  47. errno_header="$errno_headers"
  48. fi
  49. # You should only need to change the variables above
  50. sed -n "s:^[[:space:]]*${fpc_errno_prefix}\\([_a-zA-Z0-9]*\\)[[:space:]]*=[[:space:]]*\\([0-9][0-9]*\\).*:check_errno_number ${errno_prefix}\1 \2:p" ${errno_include} > check_errno_list.sh
  51. sed -n "s:#define[[:space:]]*${errno_prefix}\\([_a-zA-Z0-9]*\\)[[:space:]][[:space:]]*\\(-*[0-9A-Za-z_]*\\)[[:space:]]*\(.*\):check_reverse_errno_number ${fpc_errno_prefix}\1 \2 \"\3\":p" ${errno_header} > check_reverse_errno_list.sh
  52. function check_errno_number ()
  53. {
  54. sys=$1
  55. value=$2
  56. if [ $verbose -ne 0 ] ; then
  57. echo Testing $sys value $value
  58. fi
  59. # Remember value of this constant
  60. eval ${sys}=${value}
  61. found=`sed -n "/#define[[:space:]][[:space:]]*${sys}[^A-Za-z0-9_]/p" ${errno_header}`
  62. val=`sed -n "s:#define[[:space:]][[:space:]]*${sys}[^A-Za-z0-9_][^A-Za-z0-9_]*\([0-9]*\).*:\1:p" ${errno_header}`
  63. extval=`sed -n "s:#define[[:space:]][[:space:]]*${sys}[^A-Za-z0-9_][^A-Za-z0-9_]*\([0-9A-Za-z_]*\).*:\1:p" ${errno_header}`
  64. if [ $verbose -ne 0 ] ; then
  65. echo Test for $sys found \"${found}\" \"${value}\" \"${val}\"
  66. fi
  67. if [ "${val}" == "${value}" ] ; then
  68. if [ $verbose -ne 0 ] ; then
  69. echo ${sys} value ${val} is correct
  70. fi
  71. else
  72. if [ "${val}" == "" ] ; then
  73. foundvalue=`sed -n "/#define.*[^A-Za-z0-9_]${value}$/p" ${errno_header}`
  74. if [ "${foundvalue}" == "" ] ; then
  75. foundvalue=`sed -n "s:\/\* ${value} is compa: ${value} is compa:p" ${errno_header}`
  76. fi
  77. fi
  78. if [ "$extval" != "" ] ; then
  79. eval indirectval=\$$extval
  80. echo "indirectval =\"$indirectval\" for \"$extval\""
  81. if [ "$indirectval" != "$value" ] ; then
  82. echo problem for ${sys} expected ${value}, line is \"${found}\", val found is \"${indirectval}\"
  83. else
  84. echo "$sys is defined as $extval which is $indirectval as expected $value"
  85. fi
  86. else
  87. echo "problem for ${sys} expected ${value}, line is \"${found}\", val found is \"${val}\""
  88. fi
  89. fi
  90. }
  91. function check_reverse_errno_number ()
  92. {
  93. errname=$1
  94. errvalue=$2
  95. found=`grep -i -w $1 ${errno_include}`
  96. comment="$3"
  97. comment=${comment##*\/\*}
  98. comment=${comment%%*\*\/}
  99. if [ "${found}" == "" ] ; then
  100. echo "Error ${errname}, value ${errvalue}, not in ${errno_include} file"
  101. if [ $addtoerrno -eq 0 ] ; then
  102. addtoerrno=1
  103. echo "{ List of missing system error number found in $errno_header }" > $errnonew
  104. fi
  105. echo " $errname = $errvalue; { $comment }" >> $errnonew
  106. fi
  107. }
  108. set -f
  109. echo "Checking all entries of ${errno_include} file"
  110. source ./check_errno_list.sh
  111. echo "Checking all defines from \"$errno_header\""
  112. source ./check_reverse_errno_list.sh
  113. if [ $addtoerrno -eq 1 ] ; then
  114. echo " Missing error number found"
  115. echo " New values are in \"$errnonew\"
  116. echo You might want to add these lines to \"$errno_include\""
  117. fi