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 }