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 
  79 END {
  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 }