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