1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#!/usr/bin/nawk -f
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License"). You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
#ident "%Z%%M% %I% %E% SMI"
#
# Copyright (c) 1996, by Sun Microsystems, Inc.
# All rights reserved.
#
# Awk code to handle the creation of the YP_MULTI_ entries
# in the hosts.byname map. Called by multi directly.
#
{
# Here we loop through the list of hostnames
# doing two separate things...
# First, we're building a list of hostnames
# for the current IP address ($1).
# Second, if we've seen a name before then
# we add the current address ($1) to a list
# of address associated with this particular
# name ($i).
#
# Note, that we're pretty careful about keeping
# out duplicates (and this has a cost).
for (i = 2; i <= NF; i++) {
# Make the namelist for this address
if (namelist[$1] == "") {
namelist[$1] = $i;
} else if (namelist[$1] == $i) {
;
} else if (index(namelist[$1], $i) == 0) {
namelist[$1] = namelist[$1] " " $i;
} else {
nf = 1;
numnames = split(namelist[$1], n);
for (j = 1; j <= numnames; j++) {
if (n[j] == $i) {
nf = 0;
break;
}
}
if (nf) {
namelist[$1] = namelist[$1] " " $i;
nf = 0;
}
}
# Do we have an address for this name?
# If not, and it's not already there, add it.
if (addr[$i] == "") {
addr[$i] = $1;
} else if (index(addr[$i], $1) == 0) {
addr[$i] = addr[$i] "," $1
}
}
}
END {
# There are now a bunch o addresses in the addr
# array that are actually lists. We go through
# all of them here and build a list of hostname
# aliases into the namelist array.
#
for (host in addr) {
if (index(addr[host], ",") == 0)
continue;
numaddr = split(addr[host], tmpaddr, ",");
for (i = 1; i <= numaddr; i++) {
numnames = split(namelist[tmpaddr[i]], tmpname);
for (j = 1; j <= numnames; j++) {
if (namelist[addr[host]] == "") {
namelist[addr[host]] = tmpname[j];
continue;
}
if (namelist[addr[host]] == tmpname[j]) {
continue;
}
if (index(namelist[addr[host]], tmpname[j]) == 0) {
namelist[addr[host]] = namelist[addr[host]] " " tmpname[j];
continue;
} else {
nf = 1;
for (k = 1; k <= numnames; k++) {
if (tmpname[j] == tmpname[k]) {
nf = 0;
break;
}
}
if (nf == 1) {
namelist[addr[host]] = namelist[addr[host]] " " tmpname[j];
nf = 1;
}
}
}
}
}
# Now do that funky output thang...
for (host in addr) {
if (index(addr[host], ",")) {
printf("YP_MULTI_");
}
printf("%s %s\t%s\n",
host, addr[host], namelist[addr[host]]);
}
}
|