platform 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. ##
  2. ## OSSP platform - Unix Platform Identification
  3. ## Copyright (c) 2003 The OSSP Project <http://www.ossp.org/>
  4. ## Copyright (c) 2003 Ralf S. Engelschall <rse@engelschall.com>
  5. ##
  6. ## This file is part of OSSP platform, a Unix platform identification
  7. ## program which can be found at http://www.ossp.org/pkg/tool/platform/.
  8. ##
  9. ## This program is free software; you can redistribute it and/or modify
  10. ## it under the terms of the GNU General Public License as published by
  11. ## the Free Software Foundation; either version 2.0 of the License, or
  12. ## (at your option) any later version.
  13. ##
  14. ## This program is distributed in the hope that it will be useful,
  15. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. ## General Public License for more details.
  18. ##
  19. ## You should have received a copy of the GNU General Public License
  20. ## along with this library; if not, write to the Free Software
  21. ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  22. ## USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
  23. ##
  24. ## platform.sh: the program (language: Bourne-Shell)
  25. ##
  26. # program information
  27. prog_run="${0}"
  28. prog_cmd="platform"
  29. prog_name="OSSP platform"
  30. prog_vers="0.1.0"
  31. prog_date="30-Oct-2003"
  32. ## _________________________________________________________________________
  33. ##
  34. ## COMMAND LINE PARSING
  35. ## (partly derived from GNU shtool's sh.common)
  36. ## _________________________________________________________________________
  37. ##
  38. # the command line specification
  39. str_usage="[-F|--format FORMAT]"
  40. str_usage="$str_usage [-S|--sep STRING]"
  41. str_usage="$str_usage [-C|--conc STRING]"
  42. str_usage="$str_usage [-L|--lower]"
  43. str_usage="$str_usage [-U|--upper]"
  44. str_usage="$str_usage [-v|--verbose]"
  45. str_usage="$str_usage [-c|--concise]"
  46. str_usage="$str_usage [-n|--no-newline]"
  47. str_usage="$str_usage [-t|--type TYPE]"
  48. str_usage="$str_usage [-d|--debug]"
  49. str_usage="$str_usage [-V|--version]"
  50. str_usage="$str_usage [-h|--help]"
  51. arg_spec="0="
  52. opt_spec="F:S:C:L.U.v.c.n.t:d.V.h."
  53. opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,d:debug,V:version,h:help"
  54. opt_F="%{sp} (%{ap})"
  55. opt_S=" "
  56. opt_C="/"
  57. opt_L=no
  58. opt_U=no
  59. opt_t=""
  60. opt_v=no
  61. opt_c=no
  62. opt_n=no
  63. opt_d=no
  64. opt_V=no
  65. opt_h=no
  66. # commonly used ASCII values
  67. ASC_TAB=" "
  68. ASC_NL="
  69. "
  70. # parse argument specification string
  71. eval `echo $arg_spec |\
  72. sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
  73. # parse option specification string
  74. eval `echo $opt_spec |\
  75. sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
  76. # parse option alias string
  77. eval `echo $opt_alias |\
  78. tr 'x-' 'x_' | sed -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`
  79. # interate over argument line
  80. opt_PREV=''
  81. while [ $# -gt 0 ]; do
  82. # special option stops processing
  83. if [ ".$1" = ".--" ]; then
  84. shift
  85. break
  86. fi
  87. # determine option and argument
  88. opt_ARG_OK=no
  89. if [ ".$opt_PREV" != . ]; then
  90. # merge previous seen option with argument
  91. opt_OPT="$opt_PREV"
  92. opt_ARG="$1"
  93. opt_ARG_OK=yes
  94. opt_PREV=''
  95. else
  96. # split argument into option and argument
  97. case "$1" in
  98. --[a-zA-Z0-9]*=*)
  99. eval `echo "x$1" |\
  100. sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`
  101. opt_STR=`echo $opt_OPT | tr 'x-' 'x_'`
  102. eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
  103. ;;
  104. --[a-zA-Z0-9]*)
  105. opt_OPT=`echo "x$1" | cut -c4-`
  106. opt_STR=`echo $opt_OPT | tr 'x-' 'x_'`
  107. eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
  108. opt_ARG=''
  109. ;;
  110. -[a-zA-Z0-9]*)
  111. eval `echo "x$1" |\
  112. sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
  113. -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
  114. ;;
  115. -[a-zA-Z0-9])
  116. opt_OPT=`echo "x$1" | cut -c3-`
  117. opt_ARG=''
  118. ;;
  119. *)
  120. break
  121. ;;
  122. esac
  123. fi
  124. # eat up option
  125. shift
  126. # determine whether option needs an argument
  127. eval "opt_MODE=\$opt_MODE_${opt_OPT}"
  128. if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then
  129. if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then
  130. opt_PREV="$opt_OPT"
  131. continue
  132. fi
  133. fi
  134. # process option
  135. case $opt_MODE in
  136. '.' )
  137. # boolean option
  138. eval "opt_${opt_OPT}=yes"
  139. ;;
  140. ':' )
  141. # option with argument (multiple occurances override)
  142. eval "opt_${opt_OPT}=\"\$opt_ARG\""
  143. ;;
  144. '+' )
  145. # option with argument (multiple occurances append)
  146. eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\""
  147. ;;
  148. * )
  149. echo "${prog_cmd}:Error: unknown option: \`$opt_OPT'" 1>&2
  150. echo "${prog_cmd}:Hint: run \`${prog_run} -h' or \`man ${prog_cmd}' for details" 1>&2
  151. exit 1
  152. ;;
  153. esac
  154. done
  155. if [ ".$opt_PREV" != . ]; then
  156. echo "${prog_cmd}:Error: missing argument to option \`$opt_PREV'" 1>&2
  157. echo "${prog_cmd}:Hint: run \`${prog_run} -h' or \`man ${prog_cmd}' for details" 1>&2
  158. exit 1
  159. fi
  160. # process help option
  161. if [ ".$opt_h" = .yes ]; then
  162. echo "Usage: ${prog_run} ${str_usage}"
  163. exit 0
  164. fi
  165. # process version option
  166. if [ ".$opt_V" = .yes ]; then
  167. echo "${prog_name} ${prog_vers} (${prog_date})"
  168. exit 0
  169. fi
  170. # complain about incorrect number of arguments
  171. case $arg_MODE in
  172. '=' )
  173. if [ $# -ne $arg_NUMS ]; then
  174. echo "${prog_cmd}:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
  175. echo "${prog_cmd}:Hint: run \`${prog_run} -h' or \`man ${prog_cmd}' for details" 1>&2
  176. exit 1
  177. fi
  178. ;;
  179. '+' )
  180. if [ $# -lt $arg_NUMS ]; then
  181. echo "${prog_cmd}:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
  182. echo "${prog_cmd}:Hint: run \`${prog_run} -h' or \`man ${prog_cmd}' for details" 1>&2
  183. exit 1
  184. fi
  185. ;;
  186. esac
  187. ## _________________________________________________________________________
  188. ##
  189. ## OPTION POST-PROCESSING
  190. ## _________________________________________________________________________
  191. ##
  192. if [ ".$opt_t" != . ]; then
  193. case "$opt_t" in
  194. binary )
  195. # binary package id (OpenPKG RPM)
  196. opt_F="%<ap>-%<sp>"
  197. opt_L=yes
  198. opt_S=""
  199. opt_C="+"
  200. ;;
  201. build )
  202. # build time checking (OpenPKG RPM)
  203. opt_F="%<at>-%<st>"
  204. opt_L=yes
  205. opt_S=""
  206. opt_C="+"
  207. ;;
  208. gnu )
  209. # GNU config.guess style <arch>-<vendor>-<os><osversion>
  210. opt_F="%<at>-unknown-%<st>"
  211. opt_L=yes
  212. opt_S=""
  213. opt_C="+"
  214. ;;
  215. web )
  216. # non-whitespace HTTP Server-header id
  217. opt_F="%<sp>-%<ap>"
  218. opt_S="/"
  219. opt_C="+"
  220. ;;
  221. summary)
  222. # human readable verbose summary information
  223. opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])"
  224. opt_S=" "
  225. opt_C="/"
  226. ;;
  227. all-in-one )
  228. # full-table all-in-one information
  229. opt_F=""
  230. opt_F="${opt_F}concise architecture class: %<ac>\\n"
  231. opt_F="${opt_F}regular architecture class: %{ac}\\n"
  232. opt_F="${opt_F}verbose architecture class: %[ac]\\n"
  233. opt_F="${opt_F}concise architecture product: %<ap>\\n"
  234. opt_F="${opt_F}regular architecture product: %{ap}\\n"
  235. opt_F="${opt_F}verbose architecture product: %[ap]\\n"
  236. opt_F="${opt_F}concise architecture technology: %<at>\\n"
  237. opt_F="${opt_F}regular architecture technology: %{at}\\n"
  238. opt_F="${opt_F}verbose architecture technology: %[at]\\n"
  239. opt_F="${opt_F}concise system class: %<sc>\\n"
  240. opt_F="${opt_F}regular system class: %{sc}\\n"
  241. opt_F="${opt_F}verbose system class: %[sc]\\n"
  242. opt_F="${opt_F}concise system product: %<sp>\\n"
  243. opt_F="${opt_F}regular system product: %{sp}\\n"
  244. opt_F="${opt_F}verbose system product: %[sp]\\n"
  245. opt_F="${opt_F}concise system technology: %<st>\\n"
  246. opt_F="${opt_F}regular system technology: %{st}\\n"
  247. opt_F="${opt_F}verbose system technology: %[st]"
  248. ;;
  249. * )
  250. echo "${prog_cmd}:Error: invalid type \`$opt_t'" 1>&2
  251. exit 1
  252. ;;
  253. esac
  254. fi
  255. ## _________________________________________________________________________
  256. ##
  257. ## UTILITY FUNCTIONS
  258. ## _________________________________________________________________________
  259. ##
  260. # map string to lower case
  261. util_lower () {
  262. echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'
  263. }
  264. # map string to upper case
  265. util_upper () {
  266. echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  267. }
  268. ## _________________________________________________________________________
  269. ##
  270. ## ASSEMBLE INITIAL INFORMATION
  271. ## _________________________________________________________________________
  272. ##
  273. UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\
  274. UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\
  275. UNAME_MACHINE='unknown'
  276. UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\
  277. UNAME_SYSTEM='unknown'
  278. UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\
  279. UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\
  280. UNAME_RELEASE='unknown'
  281. UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}"
  282. if [ ".$opt_d" = .yes ]; then
  283. echo "uname => ${UNAME}" 1>&2
  284. fi
  285. AC=""; AP=""; AT=""
  286. SC=""; SP=""; ST=""
  287. ## _________________________________________________________________________
  288. ##
  289. ## DISPATCH INTO PLATFORMS
  290. ## _________________________________________________________________________
  291. ##
  292. case "${UNAME}" in
  293. # FreeBSD
  294. *:FreeBSD:* )
  295. # determine architecture
  296. AC="${UNAME_MACHINE}"
  297. case "${AC}" in
  298. i386 ) AC="iX86" ;;
  299. esac
  300. AP="${AC}"
  301. AT=`(/sbin/sysctl -n hw.model) 2>&1`
  302. case "${AT}" in
  303. *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;;
  304. *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;;
  305. *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;;
  306. * ) AT="${AP}" ;;
  307. esac
  308. # determine system
  309. r=`echo "${UNAME_RELEASE}" |\
  310. sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'`
  311. ST="FreeBSD ${r}"
  312. SP="${ST}"
  313. case "${r}" in
  314. 1.* ) SC="4.3BSD" ;;
  315. * ) SC="4.4BSD" ;;
  316. esac
  317. ;;
  318. # NetBSD
  319. *:NetBSD:* )
  320. # determine architecture
  321. AT="${UNAME_MACHINE}"
  322. AP="${AT}"
  323. case "${AP}" in
  324. i[3-6]86 ) AP="iX86" ;;
  325. esac
  326. AC="${AP}"
  327. # determine system
  328. r=`echo "${UNAME_RELEASE}" | sed -e 's/\(-.*\)$/[\1]/'`
  329. ST="NetBSD ${r}"
  330. SP="${ST}"
  331. case "${r}" in
  332. 0.* ) SC="4.3BSD" ;;
  333. * ) SC="4.4BSD" ;;
  334. esac
  335. ;;
  336. # OpenBSD
  337. *:OpenBSD:* )
  338. # determine architecture
  339. AT="${UNAME_MACHINE}"
  340. AP="${AT}"
  341. case "${AP}" in
  342. i[3-6]86 ) AP="iX86" ;;
  343. esac
  344. AC="${AP}"
  345. # determine system
  346. r=`echo "${UNAME_RELEASE}" | sed -e 's/\(-.*\)$/[\1]/'`
  347. ST="OpenBSD ${r}"
  348. SP="${ST}"
  349. SC="4.4BSD"
  350. ;;
  351. # GNU/Linux
  352. *:Linux:* )
  353. # determine architecture
  354. AT="${UNAME_MACHINE}"
  355. case "${AT}" in
  356. ia64 ) AT="IA64" ;;
  357. x86_64 ) AT='AMD64' ;;
  358. parisc ) AT="HPPA32" ;;
  359. parisc64 ) AT="HPPA64" ;;
  360. esac
  361. AP="${AT}"
  362. case "${AP}" in
  363. i[3-6]86 ) AP='iX86' ;;
  364. esac
  365. AC="${AP}"
  366. # determine system
  367. v_kern=`echo "${UNAME_RELEASE}" |\
  368. sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'`
  369. v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\
  370. sort -n | tail -1 | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null`
  371. ST="GNU/<Linux >${v_libc}/<${v_kern}>"
  372. if [ -f /etc/lsb-release ]; then
  373. eval `( . /etc/lsb-release
  374. echo "SC=\"LSB${LSB_VERSION}\""
  375. if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then
  376. echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\""
  377. fi
  378. ) 2>/dev/null`
  379. fi
  380. if [ ".$SP" = . ]; then
  381. for tagfile in x \
  382. `cd /etc && \
  383. /bin/ls *[_-]release *[_-]version 2>/dev/null | \
  384. sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \
  385. echo redhat-release lsb-release`
  386. do
  387. [ ".${tagfile}" = .x ] && continue
  388. [ ! -f "/etc/${tagfile}" ] && continue
  389. n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'`
  390. v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | head -1 |\
  391. sed -e 's/^/#/' \
  392. -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
  393. -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
  394. -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
  395. -e 's/^#.*$//'`
  396. t=""
  397. if [ ".${n}" = .redhat ]; then
  398. t=`head -1 /etc/${tagfile} | \
  399. sed -e 's/^/#/' \
  400. -e 's/^#.*Red Hat Enterprise Linux \([AEW]S\).*$/\1/' \
  401. -e 's/^#.*$//'`
  402. fi
  403. case "`util_lower ${n}`" in
  404. debian ) n="Debian[ GNU/Linux]" ;;
  405. fedora ) n="Fedora[ GNU/Linux]" ;;
  406. redhat ) n="RedHat[ Linux]" ;;
  407. suse ) n="SuSE[ Linux]" ;;
  408. mandrake ) n="Mandrake[ Linux]" ;;
  409. gentoo ) n="Gentoo[ Linux]" ;;
  410. slackware ) n="Slackware[ Linux]" ;;
  411. turbolinux ) n="TurboLinux" ;;
  412. unitedlinux ) n="UnitedLinux" ;;
  413. * ) n="${n}[ GNU/Linux]" ;;
  414. esac
  415. if [ ".${t}" != . ]; then
  416. n="${n} ${t}"
  417. fi
  418. SP="$n $v"
  419. break
  420. done
  421. fi
  422. [ ".$SP" = . ] && SP="${ST}"
  423. [ ".$SC" = . ] && SC="LSB"
  424. ;;
  425. # Sun Solaris
  426. *:SunOS:* )
  427. # determine architecture
  428. AT="${UNAME_MACHINE}"
  429. case "${AT}" in
  430. i86pc ) AT="iX86" ;;
  431. esac
  432. AP="${AT}"
  433. case "${AP}" in
  434. sun4[cdm] ) AP="SPARC32" ;;
  435. sun4u ) AP="SPARC64" ;;
  436. sun4* ) AP="SPARC" ;;
  437. esac
  438. AC="${AP}"
  439. case "${AC}" in
  440. SPARC* ) AC="SPARC" ;;
  441. esac
  442. # determine system
  443. ST="[Sun ]SunOS ${UNAME_RELEASE}"
  444. v=`echo "${UNAME_RELEASE}" |\
  445. sed -e 's;^4\.;1.;' \
  446. -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \
  447. -e 's;^5\.\([0-9][0-9]*\).*;\1;'`
  448. SP="[Sun ]Solaris $v"
  449. case "${UNAME_RELEASE}" in
  450. 4.* ) SC="4.3BSD" ;;
  451. 5.* ) SC="SVR4" ;;
  452. esac
  453. ;;
  454. # SCO UnixWare
  455. *:UnixWare:* )
  456. # determine architecture
  457. AT="${UNAME_MACHINE}"
  458. case "${AT}" in
  459. i[3-6]86 | ix86at ) AT="iX86" ;;
  460. esac
  461. AP="${AT}"
  462. # determine system
  463. v=`/sbin/uname -v`
  464. ST="[SCO ]UnixWare ${v}"
  465. SP="${ST}"
  466. SC="SVR${UNAME_RELEASE}"
  467. ;;
  468. # QNX
  469. *:QNX:* )
  470. # determine architecture
  471. AT="${UNAME_MACHINE}"
  472. case "${AT}" in
  473. x86pc ) AT="iX86" ;;
  474. esac
  475. AP="${AT}"
  476. # determine system
  477. v="${UNAME_RELEASE}"
  478. ST="QNX[ Neutrino RTOS] ${v}"
  479. v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'`
  480. SP="QNX[ Neutrino RTOS] ${v}"
  481. SC="QNX"
  482. ;;
  483. # SGI IRIX
  484. *:IRIX*:* )
  485. # determine architecture
  486. AT="${UNAME_MACHINE}"
  487. AP="${AT}"
  488. case "${AP}:${UNAME_SYSTEM}" in
  489. IP*:IRIX64 ) AP="MIPS64" ;;
  490. IP*:* ) AP="MIPS" ;;
  491. esac
  492. AC="${AP}"
  493. # determine system
  494. v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'`
  495. ST="[SGI ]IRIX ${v}"
  496. v="${UNAME_RELEASE}"
  497. SP="[SGI ]IRIX ${v}"
  498. SC="4.2BSD/SVR3"
  499. ;;
  500. # HP HP-UX
  501. *:HP-UX:* )
  502. # determine architecture
  503. AT="${UNAME_MACHINE}"
  504. case "${AT}" in
  505. ia64 ) AT="IA64" ;;
  506. 9000/[34]?? ) AT=M68K ;;
  507. 9000/[678][0-9][0-9])
  508. sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
  509. sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
  510. case "${sc_cpu_version}" in
  511. 523 ) AT="HPPA1.0" ;;
  512. 528 ) AT="HPPA1.1" ;;
  513. 532 ) AT="HPPA2.0"
  514. case "${sc_kernel_bits}" in
  515. 32 ) AT="${AT}n" ;;
  516. 64 ) AT="${AT}w" ;;
  517. esac
  518. ;;
  519. esac
  520. ;;
  521. esac
  522. AP="${AT}"
  523. case "${AP}" in
  524. HPPA* ) AP="HPPA" ;;
  525. esac
  526. AC="${AP}"
  527. # determine system
  528. v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'`
  529. ST="[HP ]<HP>-<UX> ${v}"
  530. SP="${ST}"
  531. case "${v}" in
  532. 10.* ) SC="SVR4.2" ;;
  533. [7-9]* ) SC="SVR4" ;;
  534. esac
  535. ;;
  536. # HP Tru64 (OSF1)
  537. *:OSF1:* )
  538. # determine architecture
  539. AP="${UNAME_MACHINE}"
  540. case "${AP}" in
  541. alpha ) AP="Alpha" ;;
  542. esac
  543. alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\
  544. sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | head -n 1`
  545. AT="${AP}${alpha_type}"
  546. AC="${AP}"
  547. # determine system
  548. v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'`
  549. ST="[HP ]Tru64 ${v}"
  550. SP="${ST}"
  551. SC="OSF1"
  552. ;;
  553. # IBM AIX
  554. *:AIX:* )
  555. cpu_arch=rs6000
  556. if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then
  557. cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
  558. if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then
  559. cpu_arch=powerpc
  560. fi
  561. fi
  562. if [ -x /usr/bin/oslevel ]; then
  563. os_level=`/usr/bin/oslevel`
  564. else
  565. os_level="`uname -r`.`uname -v`"
  566. fi
  567. os_level=`echo "${os_level}" |\
  568. sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \
  569. -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'`
  570. AT="${cpu_arch}"
  571. AP="${AT}"
  572. AC="${AP}"
  573. ST="[IBM ]AIX ${os_level}"
  574. SP="${ST}"
  575. case "${os_level}" in
  576. [12]* ) SC="SVR2" ;;
  577. * ) SC="SVR4" ;;
  578. esac
  579. ;;
  580. # Apple MacOS X Darwin
  581. *:Darwin:* )
  582. AT=`uname -p`
  583. case "${AT}" in
  584. powerpc ) AT="PPC" ;;
  585. esac
  586. AP="${AT}"
  587. AC="${AP}"
  588. case "${AC}" in
  589. i?86 ) AC="iX86" ;;
  590. esac
  591. ST="[Apple ]${UNAME_SYSTEM} ${UNAME_RELEASE}"
  592. SP="${ST}"
  593. SC="4.4BSD/Mach3"
  594. ;;
  595. # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO
  596. # *:XXX:* )
  597. # ...
  598. # ;;
  599. # ...A STILL UNKNOWN PLATFORM...
  600. * )
  601. AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"`
  602. AP="${AT}"
  603. AC="${AP}"
  604. v=`echo "${UNAME_RELEASE}" |\
  605. sed -e 's/^/#/' \
  606. -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
  607. -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
  608. -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
  609. -e 's/^#.*$/?/'`
  610. ST="${UNAME_SYSTEM} ${v}"
  611. SP="${ST}"
  612. SC="${SP}"
  613. ;;
  614. esac
  615. ## _________________________________________________________________________
  616. ##
  617. ## PROVIDE RESULT OUTPUT
  618. ## _________________________________________________________________________
  619. ##
  620. # provide fallback values
  621. [ ".$AT" = . ] && AT="${AP:-${AC}}"
  622. [ ".$AP" = . ] && AP="${AT:-${AC}}"
  623. [ ".$AC" = . ] && AC="${AP:-${AT}}"
  624. [ ".$ST" = . ] && ST="${SP:-${SC}}"
  625. [ ".$SP" = . ] && SP="${ST:-${SC}}"
  626. [ ".$SC" = . ] && SC="${SP:-${ST}}"
  627. # support explicit enforced verbose/concise output
  628. if [ ".$opt_v" = .yes ]; then
  629. opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'`
  630. elif [ ".$opt_c" = .yes ]; then
  631. opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'`
  632. fi
  633. # provide verbose and concise variants
  634. AC_V=""; AC_N=""; AC_C=""
  635. AP_V=""; AP_N=""; AP_C=""
  636. AT_V=""; AT_N=""; AT_C=""
  637. SC_V=""; SC_N=""; SC_C=""
  638. SP_V=""; SP_N=""; SP_C=""
  639. ST_V=""; ST_N=""; ST_C=""
  640. for var_lc in at ap ac st sp sc; do
  641. case "$opt_F" in
  642. *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* )
  643. var_uc=`util_upper "$var_lc"`
  644. eval "val=\"\$${var_uc}\""
  645. val_V=""; val_N=""; val_C=""
  646. case "$opt_F" in
  647. *"%[${var_lc}]"* )
  648. val_V=`echo ":$val" | \
  649. sed -e 's/^://' \
  650. -e 's;\[\([^]]*\)\];\1;g' \
  651. -e 's;<\([^>]*\)>;\1;g' \
  652. -e "s; ;§§;g" \
  653. -e "s;/;%%;g" \
  654. -e "s;§§;${opt_S};g" \
  655. -e "s;%%;${opt_C};g"`
  656. eval "${var_uc}_V=\"\${val_V}\""
  657. ;;
  658. esac
  659. case "$opt_F" in
  660. *"%{${var_lc}}"* | *"%${var_lc}"* )
  661. val_N=`echo ":$val" | \
  662. sed -e 's/^://' \
  663. -e 's;\[\([^]]*\)\];;g' \
  664. -e 's;<\([^>]*\)>;\1;g' \
  665. -e "s; ;§§;g" \
  666. -e "s;/;%%;g" \
  667. -e "s;§§;${opt_S};g" \
  668. -e "s;%%;${opt_C};g"`
  669. eval "${var_uc}_N=\"\${val_N}\""
  670. ;;
  671. esac
  672. case "$opt_F" in
  673. *"%<${var_lc}>"* )
  674. val_C=`echo ":$val" | \
  675. sed -e 's/^://' \
  676. -e 's;\[\([^]]*\)\];;g' \
  677. -e 's;[^<]*<\([^>]*\)>;\1;g' \
  678. -e "s; ;§§;g" \
  679. -e "s;/;%%;g" \
  680. -e "s;§§;${opt_S};g" \
  681. -e "s;%%;${opt_C};g"`
  682. eval "${var_uc}_C=\"\${val_C}\""
  683. ;;
  684. esac
  685. ;;
  686. esac
  687. done
  688. # create output string
  689. output=`echo ":$opt_F" |\
  690. sed -e "s/^://" \
  691. -e "s;%\\[ac\\];${AC_V};g" \
  692. -e "s;%{ac};${AC_N};g" \
  693. -e "s;%ac;${AC_N};g" \
  694. -e "s;%<ac>;${AC_C};g" \
  695. -e "s;%\\[ap\\];${AP_V};g" \
  696. -e "s;%{ap};${AP_N};g" \
  697. -e "s;%ap;${AP_N};g" \
  698. -e "s;%<ap>;${AP_C};g" \
  699. -e "s;%\\[at\\];${AT_V};g" \
  700. -e "s;%{at};${AT_N};g" \
  701. -e "s;%at;${AT_N};g" \
  702. -e "s;%<at>;${AT_C};g" \
  703. -e "s;%\\[sc\\];${SC_V};g" \
  704. -e "s;%{sc};${SC_N};g" \
  705. -e "s;%sc;${SC_N};g" \
  706. -e "s;%<sc>;${SC_C};g" \
  707. -e "s;%\\[sp\\];${SP_V};g" \
  708. -e "s;%{sp};${SP_N};g" \
  709. -e "s;%sp;${SP_N};g" \
  710. -e "s;%<sp>;${SP_C};g" \
  711. -e "s;%\\[st\\];${ST_V};g" \
  712. -e "s;%{st};${ST_N};g" \
  713. -e "s;%st;${ST_N};g" \
  714. -e "s;%<st>;${ST_C};g" \
  715. -e 's/\\\\n/^/g' |\
  716. tr '^' '\012'`
  717. # support lower/upper-case mapping
  718. if [ ".$opt_L" = .yes ]; then
  719. output=`util_lower "$output"`
  720. elif [ ".$opt_U" = .yes ]; then
  721. output=`util_upper "$output"`
  722. fi
  723. # display output string
  724. if [ ".$opt_n" = .yes ]; then
  725. echo . | awk '{ printf("%s", output); }' output="$output"
  726. else
  727. echo "$output"
  728. fi