PageRenderTime 2489ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/tools/Linux/kodi.sh.in

https://gitlab.com/cronmod-dev/xbmc
Autoconf | 210 lines | 159 code | 16 blank | 35 comment | 31 complexity | 15b217dcd61ba0552a581321a74def7b MD5 | raw file
  1. #!/bin/sh
  2. # Copyright (C) 2008-2017 Team XBMC
  3. # http://kodi.tv
  4. #
  5. # This Program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2, or (at your option)
  8. # any later version.
  9. #
  10. # This Program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with XBMC; see the file COPYING. If not, write to
  17. # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  18. # http://www.gnu.org/copyleft/gpl.html
  19. APP=@APP_NAME@
  20. bin_name=@APP_NAME_LC@
  21. SAVED_ARGS="$@"
  22. prefix="@prefix@"
  23. exec_prefix="@exec_prefix@"
  24. datarootdir="@datarootdir@"
  25. LIBDIR="@libdir@"
  26. APP_BINARY=$LIBDIR/${bin_name}/@APP_BINARY@
  27. CRASHLOG_DIR=${CRASHLOG_DIR:-$HOME}
  28. USERDATA_DIR="${HOME}/.${bin_name}"
  29. WINDOWING=${WINDOWING:-"auto"}
  30. # Workaround for high CPU load with nvidia GFX
  31. export __GL_YIELD=USLEEP
  32. # Fix wasting RAM due to fragmentation
  33. export MALLOC_MMAP_THRESHOLD_=131072
  34. # Check for some options used by this script
  35. while [ "$#" -gt "0" ]
  36. do
  37. case "$1" in
  38. --setlibdir)
  39. LIBDIR="$2"
  40. shift; shift
  41. ;;
  42. --windowing)
  43. WINDOWING="$2"
  44. echo "$SAVED_ARGS" | sed "s/--windowing[ ]*$2//g"
  45. shift; shift
  46. ;;
  47. *)
  48. shift
  49. ;;
  50. esac
  51. done
  52. # Note: by default only one of those binaries exists
  53. # To be able to select a different one, if has to be compiled specifically
  54. # Your distribution might provide extra packages for those
  55. if [ "$WINDOWING" = "auto" ]; then
  56. # Wayland
  57. if [ -n "$WAYLAND_DISPLAY" ] && [ -x $LIBDIR/${bin_name}/${bin_name}-wayland ]; then
  58. KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-wayland
  59. # X11
  60. elif echo $DISPLAY | grep -qE ":[0-9]+" && [ -x $LIBDIR/${bin_name}/${bin_name}-x11 ]; then
  61. KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-x11
  62. # GBM/DRM
  63. elif [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && [ -x $LIBDIR/${bin_name}/${bin_name}-gbm ]; then
  64. KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-gbm
  65. # Default kodi.bin
  66. else
  67. KODI_BINARY=${APP_BINARY}
  68. fi
  69. elif [ -n "$WINDOWING" ]; then
  70. KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-${WINDOWING}
  71. else
  72. KODI_BINARY=${APP_BINARY}
  73. fi
  74. if [ ! -x ${KODI_BINARY} ]; then
  75. echo "Error: ${KODI_BINARY} not found"
  76. exit 2
  77. fi
  78. migrate_home()
  79. {
  80. [ "$(basename $0)" = "xbmc" ] && echo "WARNING: Running ${bin_name} as "xbmc" is deprecated and will be removed in later versions, please switch to using the ${bin_name} binary"
  81. #check if data migration is needed
  82. if [ -d "${HOME}/.xbmc" ] && [ ! -d "${USERDATA_DIR}" ]; then
  83. echo "INFO: migrating userdata folder. Renaming ${HOME}/.xbmc to $USERDATA_DIR"
  84. mv ${HOME}/.xbmc $USERDATA_DIR
  85. touch ${USERDATA_DIR}/.kodi_data_was_migrated
  86. fi
  87. }
  88. command_exists()
  89. {
  90. command -pv $1 >/dev/null 2>&1
  91. }
  92. single_stacktrace()
  93. {
  94. # core filename is either "core.$PID" or "core"
  95. find "$1" -maxdepth $2 -name 'core*' | while read core; do
  96. LC_ALL=C gdb --core="$core" --batch 2> /dev/null | grep -q "^Core was generated by \`${KODI_BINARY}" || continue
  97. echo "=====> Core file: "$core" ($(stat -c%y "$core"))" >> $FILE
  98. echo " =========================================" >> $FILE
  99. gdb "${KODI_BINARY}" --core="$core" --batch -ex "thread apply all bt" 2> /dev/null >> $FILE
  100. rm -f "$core"
  101. done
  102. }
  103. print_crash_report()
  104. {
  105. FILE="$CRASHLOG_DIR/${bin_name}_crashlog-`date +%Y%m%d_%H%M%S`.log"
  106. echo "############## $APP CRASH LOG ###############" >> $FILE
  107. echo >> $FILE
  108. echo "################ SYSTEM INFO ################" >> $FILE
  109. printf " Date: " >> $FILE
  110. date >> $FILE
  111. echo " $APP Options: $*" >> $FILE
  112. printf " Arch: " >> $FILE
  113. uname -m >> $FILE
  114. printf " Kernel: " >> $FILE
  115. uname -rvs >> $FILE
  116. printf " Release: " >> $FILE
  117. if [ -f /etc/os-release ]; then
  118. . /etc/os-release
  119. echo $NAME $VERSION >> $FILE
  120. elif command_exists lsb_release; then
  121. echo >> $FILE
  122. lsb_release -a 2> /dev/null | sed -e 's/^/ /' >> $FILE
  123. else
  124. echo "lsb_release not available" >> $FILE
  125. fi
  126. echo "############## END SYSTEM INFO ##############" >> $FILE
  127. echo >> $FILE
  128. echo "############### STACK TRACE #################" >> $FILE
  129. if command_exists gdb; then
  130. if command_exists systemd-coredumpctl; then
  131. systemd-coredumpctl dump -o core $(basename ${KODI_BINARY}) > /dev/null 2>&1
  132. elif command_exists coredumpctl; then
  133. coredumpctl dump -o core $(basename ${KODI_BINARY}) > /dev/null 2>&1
  134. fi
  135. single_stacktrace "$PWD" 1
  136. # Find in plugins directories
  137. if [ $KODI_HOME ]; then
  138. BASEDIR=$KODI_HOME
  139. else
  140. BASEDIR="$LIBDIR/${bin_name}/"
  141. fi
  142. single_stacktrace "$BASEDIR" 5
  143. # find in userdata dir
  144. single_stacktrace "$HOME" 5
  145. # try /proc/sys/kernel/core_pattern
  146. # Check if it does not contain a pipe to a program (see man 5 core)
  147. if [ "$(cat /proc/sys/kernel/core_pattern | cut -c 1)" != "|" ]; then
  148. [ -d "$(dirname $(cat /proc/sys/kernel/core_pattern))" ] && single_stacktrace "$(dirname $(cat /proc/sys/kernel/core_pattern))" 1
  149. fi
  150. else
  151. echo "gdb not installed, can't get stack trace." >> $FILE
  152. fi
  153. echo "############# END STACK TRACE ###############" >> $FILE
  154. echo >> $FILE
  155. echo "################# LOG FILE ##################" >> $FILE
  156. echo >> $FILE
  157. if [ -f $USERDATA_DIR/temp/@APP_NAME_LC@.log ]
  158. then
  159. cat $USERDATA_DIR/temp/@APP_NAME_LC@.log >> $FILE
  160. echo >> $FILE
  161. else
  162. echo "Logfile not found in the usual place." >> $FILE
  163. echo "Please attach it separately." >> $FILE
  164. echo "Use pastebin.com or similar for forums or IRC." >> $FILE
  165. fi
  166. echo >> $FILE
  167. echo "############### END LOG FILE ################" >> $FILE
  168. echo >> $FILE
  169. echo "############ END $APP CRASH LOG #############" >> $FILE
  170. echo "Crash report available at $FILE"
  171. }
  172. migrate_home
  173. if command_exists gdb; then
  174. # Output warning in case ulimit is unsupported by shell
  175. eval ulimit -c unlimited
  176. if [ ! $? = "0" ]; then
  177. echo "${bin_name}: ulimit is unsupported by this shell" 1>&2
  178. fi
  179. fi
  180. LOOP=1
  181. while [ $(( $LOOP )) = "1" ]
  182. do
  183. LOOP=0
  184. ${KODI_BINARY} $SAVED_ARGS
  185. RET=$?
  186. if [ $(( $RET == 65 )) = "1" ]
  187. then # User requested to restart app
  188. LOOP=1
  189. elif [ $(( ($RET >= 131 && $RET <= 136) || $RET == 139 )) = "1" ]
  190. then # Crashed with core dump
  191. print_crash_report
  192. fi
  193. done
  194. exit $RET