This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Mass update of *headers* in dist/U from git
[metaconfig.git] / dist / U / myhostname.U
1 ?RCS: $Id$
2 ?RCS:
3 ?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
4 ?RCS: 
5 ?RCS: You may redistribute only under the terms of the Artistic License,
6 ?RCS: as specified in the README file that comes with the distribution.
7 ?RCS: You may reuse parts of this distribution only within the terms of
8 ?RCS: that same Artistic License; a copy of which may be found at the root
9 ?RCS: of the source tree for dist 4.0.
10 ?RCS:
11 ?RCS: $Log: myhostname.U,v $
12 ?RCS: Revision 3.0.1.3  1997/02/28  16:15:55  ram
13 ?RCS: patch61: improved hostname lookup by using ypmatch when NIS is used
14 ?RCS:
15 ?RCS: Revision 3.0.1.2  1994/10/29  16:25:43  ram
16 ?RCS: patch36: call ./xenix explicitely instead of relying on PATH
17 ?RCS: patch36: now uses new Tr unit to convert to/from lowercase
18 ?RCS:
19 ?RCS: Revision 3.0.1.1  1994/06/20  07:06:20  ram
20 ?RCS: patch30: now a little more clever for domain name guessing
21 ?RCS:
22 ?RCS: Revision 3.0  1993/08/18  12:09:18  ram
23 ?RCS: Baseline for dist 3.0 netwide release.
24 ?RCS:
25 ?MAKE:myhostname phostname mydomain: contains sed test Myread Oldconfig \
26         Guess Loc awk echo sort uniq +usrinc rm hostcat Tr osname
27 ?MAKE:  -pick add $@ %<
28 ?S:myhostname (hostname):
29 ?S:     This variable contains the eventual value of the MYHOSTNAME symbol,
30 ?S:     which is the name of the host the program is going to run on.
31 ?S:     The domain is not kept with hostname, but must be gotten from mydomain.
32 ?S:     The dot comes with mydomain, and need not be supplied by the program.
33 ?S:.
34 ?S:mydomain:
35 ?S:     This variable contains the eventual value of the MYDOMAIN symbol,
36 ?S:     which is the domain of the host the program is going to run on.
37 ?S:     The domain must be appended to myhostname to form a complete host name.
38 ?S:     The dot comes with mydomain, and need not be supplied by the program.
39 ?S:.
40 ?S:phostname:
41 ?S:     This variable contains the eventual value of the PHOSTNAME symbol,
42 ?S:     which is a command that can be fed to popen() to get the host name.
43 ?S:     The program should probably not presume that the domain is or isn't
44 ?S:     there already.
45 ?S:.
46 ?C:MYHOSTNAME (HOSTNAME):
47 ?C:     This symbol contains name of the host the program is going to run on.
48 ?C:     The domain is not kept with hostname, but must be gotten from MYDOMAIN.
49 ?C:     The dot comes with MYDOMAIN, and need not be supplied by the program.
50 ?C:     If gethostname() or uname() exist, MYHOSTNAME may be ignored. If MYDOMAIN
51 ?C:     is not used, MYHOSTNAME will hold the name derived from PHOSTNAME.
52 ?C:.
53 ?C:MYDOMAIN:
54 ?C:     This symbol contains the domain of the host the program is going to
55 ?C:     run on.  The domain must be appended to HOSTNAME to form a complete
56 ?C:     host name.  The dot comes with MYDOMAIN, and need not be supplied by
57 ?C:     the program.  If the host name is derived from PHOSTNAME, the domain
58 ?C:     may or may not already be there, and the program should check.
59 ?C:.
60 ?H:#define MYHOSTNAME "$myhostname"             /**/
61 ?H:#define MYDOMAIN "$mydomain"         /**/
62 ?H:.
63 ?T:cont i tans tmp_re file
64 : now get the host name
65 echo " "
66 echo "Figuring out host name..." >&4
67 case "$myhostname" in
68 '') cont=true
69         echo 'Maybe "hostname" will work...'
70         if tans=`sh -c hostname 2>&1` ; then
71                 myhostname=$tans
72                 phostname=hostname
73                 cont=''
74         fi
75         ;;
76 *) cont='';;
77 esac
78 if $test "$cont"; then
79         if ./xenix; then
80                 echo 'Oh, dear.  Maybe "/etc/systemid" is the key...'
81                 if tans=`cat /etc/systemid 2>&1` ; then
82                         myhostname=$tans
83                         phostname='cat /etc/systemid'
84                         echo "Whadyaknow.  Xenix always was a bit strange..."
85                         cont=''
86                 fi
87         elif $test -r /etc/systemid; then
88                 echo "(What is a non-Xenix system doing with /etc/systemid?)"
89         fi
90 fi
91 if $test "$cont"; then
92         echo 'No, maybe "uuname -l" will work...'
93         if tans=`sh -c 'uuname -l' 2>&1` ; then
94                 myhostname=$tans
95                 phostname='uuname -l'
96         else
97                 echo 'Strange.  Maybe "uname -n" will work...'
98                 if tans=`sh -c 'uname -n' 2>&1` ; then
99                         myhostname=$tans
100                         phostname='uname -n'
101                 else
102                         echo 'Oh well, maybe I can mine it out of whoami.h...'
103                         if tans=`sh -c $contains' sysname $usrinc/whoami.h' 2>&1` ; then
104                                 myhostname=`echo "$tans" | $sed 's/^.*"\(.*\)"/\1/'`
105                                 phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' <$usrinc/whoami.h"
106                         else
107                                 case "$myhostname" in
108                                 '') echo "Does this machine have an identity crisis or something?"
109                                         phostname='';;
110                                 *)
111                                         echo "Well, you said $myhostname before..."
112                                         phostname='echo $myhostname';;
113                                 esac
114                         fi
115                 fi
116         fi
117 fi
118 case "$myhostname" in
119 '') myhostname=noname ;;
120 esac
121 : you do not want to know about this
122 set $myhostname
123 myhostname=$1
124
125 : verify guess
126 if $test "$myhostname" ; then
127         dflt=y
128         rp='Your host name appears to be "'$myhostname'".'" Right?"
129         . ./myread
130         case "$ans" in
131         y*) ;;
132         *) myhostname='';;
133         esac
134 fi
135
136 : bad guess or no guess
137 while $test "X$myhostname" = X ; do
138         dflt=''
139         rp="Please type the (one word) name of your host:"
140         . ./myread
141         myhostname="$ans"
142 done
143
144 : translate upper to lower if necessary
145 case "$myhostname" in
146 *[A-Z]*)
147         echo "(Normalizing case in your host name)"
148         myhostname=`echo $myhostname | ./tr '[A-Z]' '[a-z]'`
149         ;;
150 esac
151
152 ?X: Do not ask for domain name if this is not used later on. In that
153 ?X: case, the hostname may keep its domain name, but it doesn't matter.
154 @if MYDOMAIN || mydomain
155 case "$myhostname" in
156 *.*)
157         dflt=`expr "X$myhostname" : "X[^.]*\(\..*\)"`
158         myhostname=`expr "X$myhostname" : "X\([^.]*\)\."`
159         echo "(Trimming domain name from host name--host name is now $myhostname)"
160         ;;
161 *) case "$mydomain" in
162         '')
163 ?X:
164 ?X: There is currently no way to say we do not want hostcat if mydomain is not
165 ?X: used. One way to achieve that would be to put that code in a mydomain.U
166 ?X: unit. However, we want to stick the sanity checks right after the domain
167 ?X: name computation, or if none is done, right after the hostname computation.
168 ?X:
169                 {
170 ?X: If we use NIS, try ypmatch.
171                         test "X$hostcat" = "Xypcat hosts" &&
172                         ypmatch "$myhostname" hosts 2>/dev/null |\
173                                 $sed -e 's/[     ]*#.*//; s/$/ /' > hosts && \
174                         $test -s hosts
175                 } || {
176 ?X: Extract only the relevant hosts, reducing file size,
177 ?X: remove comments, insert trailing space for later use.
178                         $hostcat | $sed -n -e "s/[       ]*#.*//; s/\$/ /
179                                         /[       ]$myhostname[  . ]/p" > hosts
180                 }
181                 tmp_re="[       . ]"
182                 $test x`$awk "/[0-9].*[  ]$myhostname$tmp_re/ { sum++ }
183                              END { print sum }" hosts` = x1 || tmp_re="[         ]"
184                 dflt=.`$awk \
185                 "/[0-9].*[       ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \
186                         hosts | $sort | $uniq | \
187                         $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"`
188                 case `$echo X$dflt` in
189                 X*\ *)  echo "(Several hosts in /etc/hosts matched hostname)"
190                         dflt=.
191                         ;;
192 ?X: There is no /etc/hosts on os390
193                 X.)
194                         if $test -f /etc/hosts; then
195                                 echo "(You do not have fully-qualified names in /etc/hosts)"
196                         else
197                                 echo "(I cannot locate a hosts database anywhere)"
198                         fi
199                         ;;
200                 esac
201                 case "$dflt" in
202                 .)
203                         tans=`./loc resolv.conf X /etc /usr/etc`
204                         if $test -f "$tans"; then
205                                 echo "(Attempting domain name extraction from $tans)"
206 ?X: Look for either a search or a domain directive.
207                                 dflt=.`$sed -n -e 's/   / /g' \
208                                   -e 's/^search  *\([^ ]*\).*/\1/p' $tans \
209                                   | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
210                                 case "$dflt" in
211                                 .) dflt=.`$sed -n -e 's/        / /g' \
212                                      -e 's/^domain  *\([^ ]*\).*/\1/p' $tans \
213                                      | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
214                                         ;;
215                                 esac
216                         fi
217                         ;;
218                 esac
219                 case "$dflt" in
220                 .) echo "(No help from resolv.conf either -- attempting clever guess)"
221                         dflt=.`sh -c domainname 2>/dev/null`
222                         case "$dflt" in
223                         '') dflt='.';;
224                         .nis.*|.yp.*|.main.*) dflt=`echo $dflt | $sed -e 's/^\.[^.]*//'`;;
225                         esac
226                         ;;
227                 esac
228                 case "$dflt$osname" in
229                 .os390)
230                         file="//'SYS1.TCPPARMS(TCPDATA)'"
231                         echo "(Attempting domain name extraction from $file)"
232                         dflt=.`awk '/^DOMAINORIGIN/ {print $2}' "$file" 2>/dev/null`
233                         ;;
234                         esac
235                 case "$dflt" in
236                 .) echo "(Lost all hope -- silly guess then)"
237                         dflt='.nonet'
238                         ;;
239                 esac
240                 $rm -f hosts
241                 ;;
242         *) dflt="$mydomain";;
243         esac;;
244 esac
245 echo " "
246 rp="What is your domain name?"
247 . ./myread
248 tans="$ans"
249 case "$ans" in
250 '') ;;
251 .*) ;;
252 *) tans=".$tans";;
253 esac
254 mydomain="$tans"
255
256 : translate upper to lower if necessary
257 case "$mydomain" in
258 *[A-Z]*)
259         echo "(Normalizing case in your domain name)"
260         mydomain=`echo $mydomain | ./tr '[A-Z]' '[a-z]'`
261         ;;
262 esac
263
264 @end
265 : a little sanity check here
266 case "$phostname" in
267 '') ;;
268 *)
269         case `$phostname | ./tr '[A-Z]' '[a-z]'` in
270         $myhostname$mydomain|$myhostname) ;;
271         *)
272                 case "$phostname" in
273                 sed*)
274                         echo "(That doesn't agree with your whoami.h file, by the way.)"
275                         ;;
276                 *)
277                         echo "(That doesn't agree with your $phostname command, by the way.)"
278                         ;;
279                 esac
280         ;;
281         esac
282         ;;
283 esac
284