1 #!/usr/xpg4/bin/awk -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 # Copyright (c) 1996, by Sun Microsystems, Inc. 25 # All rights reserved. 26 # 27 # Awk code to handle the creation of the YP_MULTI_ entries 28 # in the hosts.byname map. Called by multi directly. 29 # 30 31 { 32 # Here we loop through the list of hostnames 33 # doing two separate things... 34 # First, we're building a list of hostnames 35 # for the current IP address ($1). 36 # Second, if we've seen a name before then 37 # we add the current address ($1) to a list 38 # of address associated with this particular 39 # name ($i). 40 # 41 # Note, that we're pretty careful about keeping 42 # out duplicates (and this has a cost). 43 44 for (i = 2; i <= NF; i++) { 45 # Make the namelist for this address 46 if (namelist[$1] == "") { 47 namelist[$1] = $i; 48 } else if (namelist[$1] == $i) { 49 ; 50 } else if (index(namelist[$1], $i) == 0) { 51 namelist[$1] = namelist[$1] " " $i; 52 } else { 53 nf = 1; 54 numnames = split(namelist[$1], n); 55 for (j = 1; j <= numnames; j++) { 56 if (n[j] == $i) { 57 nf = 0; 58 break; 59 } 60 } 61 if (nf) { 62 namelist[$1] = namelist[$1] " " $i; 63 nf = 0; 64 } 65 } 66 67 # Do we have an address for this name? 68 # If not, and it's not already there, add it. 69 if (addr[$i] == "") { 70 addr[$i] = $1; 71 } else if (index(addr[$i], $1) == 0) { 72 addr[$i] = addr[$i] "," $1 73 } 74 } 75 } 76 77 END { 78 # There are now a bunch o addresses in the addr 79 # array that are actually lists. We go through 80 # all of them here and build a list of hostname 81 # aliases into the namelist array. 82 # 83 for (host in addr) { 84 if (index(addr[host], ",") == 0) 85 continue; 86 numaddr = split(addr[host], tmpaddr, ","); 87 for (i = 1; i <= numaddr; i++) { 88 numnames = split(namelist[tmpaddr[i]], tmpname); 89 for (j = 1; j <= numnames; j++) { 90 if (namelist[addr[host]] == "") { 91 namelist[addr[host]] = tmpname[j]; 92 continue; 93 } 94 if (namelist[addr[host]] == tmpname[j]) { 95 continue; 96 } 97 if (index(namelist[addr[host]], tmpname[j]) == 0) { 98 namelist[addr[host]] = namelist[addr[host]] " " tmpname[j]; 99 continue; 100 } else { 101 nf = 1; 102 for (k = 1; k <= numnames; k++) { 103 if (tmpname[j] == tmpname[k]) { 104 nf = 0; 105 break; 106 } 107 } 108 if (nf == 1) { 109 namelist[addr[host]] = namelist[addr[host]] " " tmpname[j]; 110 nf = 1; 111 } 112 } 113 } 114 } 115 } 116 117 # Now do that funky output thang... 118 for (host in addr) { 119 if (index(addr[host], ",")) { 120 printf("YP_MULTI_"); 121 } 122 printf("%s %s\t%s\n", 123 host, addr[host], namelist[addr[host]]); 124 } 125 }