1: 2# NAME: 3# os.sh - operating system specifics 4# 5# DESCRIPTION: 6# This file is included at the start of processing. Its role is 7# to set the variables OS, OSREL, OSMAJOR, MACHINE and MACHINE_ARCH to 8# reflect the current system. 9# 10# It also sets variables such as MAILER, LOCAL_FS, PS_AXC to hide 11# certain aspects of different UNIX flavours. 12# 13# SEE ALSO: 14# site.sh,funcs.sh 15# 16# AUTHOR: 17# Simon J. Gerraty <sjg@crufty.net> 18 19# RCSid: 20# $Id: os.sh,v 1.70 2026/02/25 05:44:34 sjg Exp $ 21# 22# @(#) Copyright (c) 1994-2026 Simon J. Gerraty 23# 24# SPDX-License-Identifier: BSD-2-Clause 25# 26# Please send copies of changes and bug-fixes to: 27# sjg@crufty.net 28# 29 30# this lets us skip sourcing it again 31_OS_SH=: 32 33OS=`uname` 34OSREL=`uname -r` 35OSMAJOR=`IFS=.; set $OSREL; echo $1` 36# we want to retain the raw output from uname -m and -p 37OS_MACHINE=`uname -m` 38OS_MACHINE_ARCH=`uname -p 2>/dev/null || echo $OS_MACHINE` 39 40MACHINE=$OS_MACHINE 41MACHINE_ARCH=$OS_MACHINE_ARCH 42 43# there is at least one case of `uname -p` 44# and even `uname -m` outputting usless info 45# fortunately not both together 46case "$MACHINE" in 47*[!A-Za-z0-9_-]*) MACHINE="$MACHINE_ARCH";; 48esac 49case "$MACHINE_ARCH" in 50unknown|*[!A-Za-z0-9_-]*) MACHINE_ARCH="$MACHINE";; 51esac 52 53# we need this here, and it is not always available... 54Which() { 55 case "$1" in 56 -*) t=$1; shift;; 57 *) t=-x;; 58 esac 59 case "$1" in 60 /*) test $t $1 && echo $1;; 61 *) 62 # some shells cannot correctly handle `IFS` 63 # in conjunction with the for loop. 64 _dirs=`IFS=:; echo ${2:-$PATH}` 65 for d in $_dirs 66 do 67 test $t $d/$1 && { echo $d/$1; break; } 68 done 69 ;; 70 esac 71} 72 73# tr is insanely non-portable wrt char classes, so we need to 74# spell out the alphabet. sed y/// would work too. 75toUpper() { 76 ${TR:-tr} abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 77} 78 79toLower() { 80 ${TR:-tr} ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 81} 82 83K= 84case "$OS" in 85AIX) # everyone loves to be different... 86 OSMAJOR=`uname -v` 87 OSMINOR=`uname -r` 88 OSREL="$OSMAJOR.$OSMINOR" 89 LOCAL_FS=jfs 90 PS_AXC=-e 91 SHARE_ARCH=$OS/$OSMAJOR.X 92 ;; 93CYGWIN*) # uname -s not very useful 94 # uname -o produces just Cygwin which is better 95 OS=Cygwin 96 ;; 97Darwin) # this is more explicit (arm64 vs arm) 98 HOST_ARCH=$MACHINE 99 ;; 100SunOS) 101 CHOWN=`Which chown /usr/etc:/usr/bin` 102 export CHOWN 103 104 # Great! Solaris keeps moving arch(1) 105 # should just bite the bullet and use uname -p 106 arch=`Which arch /usr/bin:/usr/ucb` 107 108 MAILER=/usr/ucb/Mail 109 LOCAL_FS=4.2 110 111 case "$OSREL" in 112 4.0*) 113 # uname -m just says sun which could be anything 114 # so use arch(1). 115 MACHINE_ARCH=`arch` 116 MACHINE=$MACHINE_ARCH 117 ;; 118 4*) 119 MACHINE_ARCH=`arch` 120 ;; 121 5*) 122 K=-k 123 LOCAL_FS=ufs 124 MAILER=mailx 125 PS_AXC=-e 126 # can you believe that ln on Solaris defaults to 127 # overwriting an existing file!!!!! We want one that works! 128 test -x /usr/xpg4/bin/ln && LN=${LN:-/usr/xpg4/bin/ln} 129 # wonderful, 5.8's tr again require's []'s 130 # but /usr/xpg4/bin/tr causes problems if LC_COLLATE is set! 131 # use toUpper/toLower instead. 132 ;; 133 esac 134 case "$OS/$MACHINE_ARCH" in 135 *sun386) SHARE_ARCH=$MACHINE_ARCH;; 136 esac 137 ;; 138*BSD) 139 K=-k 140 MAILER=/usr/bin/Mail 141 LOCAL_FS=local 142 : $-,$ENV 143 case "$-,$ENV" in 144 *i*,*) ;; 145 *,|*ENVFILE*) ;; 146 *) ENV=;; 147 esac 148 # NetBSD at least has good backward compatibility 149 # so NetBSD/i386 is good enough 150 # recent NetBSD uses x86_64 for MACHINE_ARCH 151 case $OS in 152 NetBSD) 153 LOCALBASE=/usr/pkg 154 SHARE_ARCH=$OS/$HOST_ARCH 155 ;; 156 OpenBSD) 157 arch=`Which arch /usr/bin:/usr/ucb:$PATH` 158 MACHINE_ARCH=`$arch -s` 159 ;; 160 esac 161 NAWK=awk 162 export NAWK 163 ;; 164HP-UX) 165 TMP_DIRS="/tmp /usr/tmp" 166 LOCAL_FS=hfs 167 MAILER=mailx 168 # don't rely on /bin/sh, its broken 169 _shell=/bin/ksh; ENV= 170 # also, no one would be interested in OSMAJOR=A 171 case "$OSREL" in 172 ?.09*) OSMAJOR=9; PS_AXC=-e;; 173 ?.10*) OSMAJOR=10; PS_AXC=-e;; 174 esac 175 ;; 176IRIX) 177 LOCAL_FS=efs 178 ;; 179Interix) 180 MACHINE=i386 181 MACHINE_ARCH=i386 182 ;; 183UnixWare|SCO_SV) 184 OSREL=`uname -v` 185 OSMAJOR=`IFS=.; set $OSREL; echo $1` 186 MACHINE_ARCH=`uname -m` 187 ;; 188Linux) 189 # Not really any such thing as Linux, but 190 # this covers red-hat and hopefully others. 191 case $MACHINE in 192 i?86) MACHINE_ARCH=i386;; # we don't care about i686 vs i586 193 esac 194 LOCAL_FS=ext2 195 PS_AXC=axc 196 [ -x /usr/bin/md5sum ] && { MD5=/usr/bin/md5sum; export MD5; } 197 ;; 198QNX) 199 case $MACHINE in 200 x86pc) MACHINE_ARCH=i386;; 201 esac 202 ;; 203Haiku) 204 case $MACHINE in 205 BeBox) MACHINE_ARCH=powerpc;; 206 BeMac) MACHINE_ARCH=powerpc;; 207 BePC) MACHINE_ARCH=i386;; 208 esac 209 ;; 210esac 211LOCALBASE=${LOCALBASE:-/usr/local} 212 213HOSTNAME=${HOSTNAME:-`( hostname ) 2>/dev/null`} 214HOSTNAME=${HOSTNAME:-`( uname -n ) 2>/dev/null`} 215case "$HOSTNAME" in 216*.*) HOST=`IFS=.; set -- $HOSTNAME; echo $1`;; 217*) HOST=$HOSTNAME;; 218esac 219 220TMP_DIRS=${TMP_DIRS:-"/tmp /var/tmp"} 221MACHINE_ARCH=${MACHINE_ARCH:-$MACHINE} 222HOST_ARCH=${HOST_ARCH:-$MACHINE_ARCH} 223case "$HOST_ARCH" in 224x86*64|amd64) MACHINE32_ARCH=i386;; 225*64) MACHINE32_ARCH=${MACHINE32_ARCH:-`echo $MACHINE_ARCH | sed 's,64,32,'`};; 226*) MACHINE32_ARCH=$MACHINE_ARCH;; 227esac 228HOST_ARCH32=${HOST_ARCH32:-$MACHINE32_ARCH} 229MACHINE32=${HOST_ARCH32:-$MACHINE} 230HOST_MACHINE=${HOST_MACHINE:-$MACHINE} 231HOST_MACHINE32=${HOST_MACHINE32:-$MACHINE32} 232export HOST_MACHINE HOST_MACHINE32 233export HOST_ARCH HOST_ARCH32 234# we mount server:/share/arch/$SHARE_ARCH as /usr/local 235SHARE_ARCH_DEFAULT=$OS/$OSMAJOR.X/$HOST_ARCH 236SHARE_ARCH=${SHARE_ARCH:-$SHARE_ARCH_DEFAULT} 237LN=${LN:-ln} 238TR=${TR:-tr} 239 240# Some people like have /share/$HOST_TARGET/bin etc. 241HOST_TARGET=`echo ${OS}${OSMAJOR}-$HOST_ARCH | tr -d / | toLower` 242HOST_TARGET32=`echo ${OS}${OSMAJOR}-$HOST_ARCH32 | tr -d / | toLower` 243export HOST_TARGET HOST_TARGET32 244 245case `echo -e .` in -e*) echo_e=;; *) echo_e=-e;; esac 246case `echo -n .` in -n*) echo_n=; echo_c="\c";; *) echo_n=-n; echo_c=;; esac 247 248Echo() { 249 case "$1" in 250 -e) shift; echo $echo_e "$@";; 251 -n) shift; echo $echo_n "$@$echo_c";; 252 *) echo "$@";; 253 esac 254} 255 256# for systems that deprecate egrep 257case "`echo egrep | egrep 'e|g' 2>&1`" in 258egrep) ;; 259*) egrep() { grep -E "$@"; };; 260esac 261 262export HOSTNAME HOST 263export OS MACHINE MACHINE_ARCH OSREL OSMAJOR LOCAL_FS TMP_DIRS MAILER N C K PS_AXC 264export LN SHARE_ARCH TR 265export LOCALBASE 266 267case /$0 in 268*/os.sh) 269 for v in $* 270 do 271 eval vv=\$$v 272 echo "$v='$vv'" 273 done 274 ;; 275*/host_target32) echo $HOST_TARGET32;; 276*/host_target) echo $HOST_TARGET;; 277esac 278