?RCS: $Id: myhostname.U 167 2013-05-08 17:58:00Z rmanfredi $ ?RCS: ?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi ?RCS: ?RCS: You may redistribute only under the terms of the Artistic License, ?RCS: as specified in the README file that comes with the distribution. ?RCS: You may reuse parts of this distribution only within the terms of ?RCS: that same Artistic License; a copy of which may be found at the root ?RCS: of the source tree for dist 4.0. ?RCS: ?RCS: $Log: myhostname.U,v $ ?RCS: Revision 3.0.1.3 1997/02/28 16:15:55 ram ?RCS: patch61: improved hostname lookup by using ypmatch when NIS is used ?RCS: ?RCS: Revision 3.0.1.2 1994/10/29 16:25:43 ram ?RCS: patch36: call ./xenix explicitly instead of relying on PATH ?RCS: patch36: now uses new Tr unit to convert to/from lowercase ?RCS: ?RCS: Revision 3.0.1.1 1994/06/20 07:06:20 ram ?RCS: patch30: now a little more clever for domain name guessing ?RCS: ?RCS: Revision 3.0 1993/08/18 12:09:18 ram ?RCS: Baseline for dist 3.0 netwide release. ?RCS: ?MAKE:myhostname phostname mydomain: contains sed test Myread Oldconfig \ Guess Loc awk echo sort uniq +usrinc rm hostcat Tr osname ?MAKE: -pick add $@ %< ?S:myhostname (hostname): ?S: This variable contains the eventual value of the MYHOSTNAME symbol, ?S: which is the name of the host the program is going to run on. ?S: The domain is not kept with hostname, but must be gotten from mydomain. ?S: The dot comes with mydomain, and need not be supplied by the program. ?S:. ?S:mydomain: ?S: This variable contains the eventual value of the MYDOMAIN symbol, ?S: which is the domain of the host the program is going to run on. ?S: The domain must be appended to myhostname to form a complete host name. ?S: The dot comes with mydomain, and need not be supplied by the program. ?S:. ?S:phostname: ?S: This variable contains the eventual value of the PHOSTNAME symbol, ?S: which is a command that can be fed to popen() to get the host name. ?S: The program should probably not presume that the domain is or isn't ?S: there already. ?S:. ?C:MYHOSTNAME (HOSTNAME): ?C: This symbol contains name of the host the program is going to run on. ?C: The domain is not kept with hostname, but must be gotten from MYDOMAIN. ?C: The dot comes with MYDOMAIN, and need not be supplied by the program. ?C: If gethostname() or uname() exist, MYHOSTNAME may be ignored. If MYDOMAIN ?C: is not used, MYHOSTNAME will hold the name derived from PHOSTNAME. ?C:. ?C:MYDOMAIN: ?C: This symbol contains the domain of the host the program is going to ?C: run on. The domain must be appended to HOSTNAME to form a complete ?C: host name. The dot comes with MYDOMAIN, and need not be supplied by ?C: the program. If the host name is derived from PHOSTNAME, the domain ?C: may or may not already be there, and the program should check. ?C:. ?H:#define MYHOSTNAME "$myhostname" /**/ ?H:#define MYDOMAIN "$mydomain" /**/ ?H:. ?T:cont i tans tmp_re file : now get the host name echo " " echo "Figuring out host name..." >&4 case "$myhostname" in '') cont=true echo 'Maybe "hostname" will work...' if tans=`sh -c hostname 2>&1` ; then myhostname=$tans phostname=hostname cont='' fi ;; *) cont='';; esac if $test "$cont"; then if ./xenix; then echo 'Oh, dear. Maybe "/etc/systemid" is the key...' if tans=`cat /etc/systemid 2>&1` ; then myhostname=$tans phostname='cat /etc/systemid' echo "Whadyaknow. Xenix always was a bit strange..." cont='' fi elif $test -r /etc/systemid; then echo "(What is a non-Xenix system doing with /etc/systemid?)" fi fi if $test "$cont"; then echo 'No, maybe "uuname -l" will work...' if tans=`sh -c 'uuname -l' 2>&1` ; then myhostname=$tans phostname='uuname -l' else echo 'Strange. Maybe "uname -n" will work...' if tans=`sh -c 'uname -n' 2>&1` ; then myhostname=$tans phostname='uname -n' else echo 'Oh well, maybe I can mine it out of whoami.h...' if tans=`sh -c $contains' sysname $usrinc/whoami.h' 2>&1` ; then myhostname=`echo "$tans" | $sed 's/^.*"\(.*\)"/\1/'` phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' <$usrinc/whoami.h" else case "$myhostname" in '') echo "Does this machine have an identity crisis or something?" phostname='';; *) echo "Well, you said $myhostname before..." phostname='echo $myhostname';; esac fi fi fi fi case "$myhostname" in '') myhostname=noname ;; esac : you do not want to know about this set $myhostname myhostname=$1 : verify guess if $test "$myhostname" ; then dflt=y rp='Your host name appears to be "'$myhostname'".'" Right?" . ./myread case "$ans" in y*) ;; *) myhostname='';; esac fi : bad guess or no guess while $test "X$myhostname" = X ; do dflt='' rp="Please type the (one word) name of your host:" . ./myread myhostname="$ans" done : translate upper to lower if necessary case "$myhostname" in *[A-Z]*) echo "(Normalizing case in your host name)" myhostname=`echo $myhostname | ./tr '[A-Z]' '[a-z]'` ;; esac ?X: Do not ask for domain name if this is not used later on. In that ?X: case, the hostname may keep its domain name, but it doesn't matter. @if MYDOMAIN || mydomain case "$myhostname" in *.*) dflt=`expr "X$myhostname" : "X[^.]*\(\..*\)"` myhostname=`expr "X$myhostname" : "X\([^.]*\)\."` echo "(Trimming domain name from host name--host name is now $myhostname)" ;; *) case "$mydomain" in '') ?X: ?X: There is currently no way to say we do not want hostcat if mydomain is not ?X: used. One way to achieve that would be to put that code in a mydomain.U ?X: unit. However, we want to stick the sanity checks right after the domain ?X: name computation, or if none is done, right after the hostname computation. ?X: { ?X: If we use NIS, try ypmatch. test "X$hostcat" = "Xypcat hosts" && ypmatch "$myhostname" hosts 2>/dev/null |\ $sed -e 's/[ ]*#.*//; s/$/ /' > hosts && \ $test -s hosts } || { ?X: Extract only the relevant hosts, reducing file size, ?X: remove comments, insert trailing space for later use. $hostcat | $sed -n -e "s/[ ]*#.*//; s/\$/ / /[ ]$myhostname[ . ]/p" > hosts } tmp_re="[ . ]" $test x`$awk "/[0-9].*[ ]$myhostname$tmp_re/ { sum++ } END { print sum }" hosts` = x1 || tmp_re="[ ]" dflt=.`$awk \ "/[0-9].*[ ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \ hosts | $sort | $uniq | \ $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"` case `$echo X$dflt` in X*\ *) echo "(Several hosts in /etc/hosts matched hostname)" dflt=. ;; ?X: There is no /etc/hosts on os390 X.) if $test -f /etc/hosts; then echo "(You do not have fully-qualified names in /etc/hosts)" else echo "(I cannot locate a hosts database anywhere)" fi ;; esac case "$dflt" in .) tans=`./loc resolv.conf X /etc /usr/etc` if $test -f "$tans"; then echo "(Attempting domain name extraction from $tans)" ?X: Look for either a search or a domain directive. dflt=.`$sed -n -e 's/ / /g' \ -e 's/^search *\([^ ]*\).*/\1/p' $tans \ | ./tr '[A-Z]' '[a-z]' 2>/dev/null` case "$dflt" in .) dflt=.`$sed -n -e 's/ / /g' \ -e 's/^domain *\([^ ]*\).*/\1/p' $tans \ | ./tr '[A-Z]' '[a-z]' 2>/dev/null` ;; esac fi ;; esac case "$dflt" in .) echo "(No help from resolv.conf either -- attempting clever guess)" dflt=.`sh -c domainname 2>/dev/null` case "$dflt" in '') dflt='.';; .nis.*|.yp.*|.main.*) dflt=`echo $dflt | $sed -e 's/^\.[^.]*//'`;; esac ;; esac case "$dflt$osname" in .os390) file="//'SYS1.TCPPARMS(TCPDATA)'" echo "(Attempting domain name extraction from $file)" dflt=.`awk '/^DOMAINORIGIN/ {print $2}' "$file" 2>/dev/null` ;; esac case "$dflt" in .) echo "(Lost all hope -- silly guess then)" dflt='.nonet' ;; esac $rm -f hosts ;; *) dflt="$mydomain";; esac;; esac echo " " rp="What is your domain name?" . ./myread tans="$ans" case "$ans" in '') ;; .*) ;; *) tans=".$tans";; esac mydomain="$tans" : translate upper to lower if necessary case "$mydomain" in *[A-Z]*) echo "(Normalizing case in your domain name)" mydomain=`echo $mydomain | ./tr '[A-Z]' '[a-z]'` ;; esac @end : a little sanity check here case "$phostname" in '') ;; *) case `$phostname | ./tr '[A-Z]' '[a-z]'` in $myhostname$mydomain|$myhostname) ;; *) case "$phostname" in sed*) echo "(That doesn't agree with your whoami.h file, by the way.)" ;; *) echo "(That doesn't agree with your $phostname command, by the way.)" ;; esac ;; esac ;; esac