usr/src/lib/libslp/javalib/com/sun/slp/ServerDATable.java
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 0 68f95e015346
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
 * Copyright (c) 1999 by Sun Microsystems, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
//  ServerDATable.java: Abstract class for DA Table in the DA/SA server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
//  Author:           James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
//  Created On:       Wed May 20 08:30:46 1998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
//  Last Modified By: James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
//  Last Modified On: Tue Mar  9 12:36:37 1999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
//  Update Count:     124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
package com.sun.slp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
import java.util.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
import java.net.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * ServerDATable is an abstract class that provides the interface for DA
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * and scope discovery, storage of DA information from incoming DAAdverts,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * and forwarding of registrations and deregistration to DAs having
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * the same scopes. A variety of implementations are possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * The getServerDATable() method creates the right one from a subclass.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 * We keep separate track of the superclass DA table and the server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * DA table so that these two classes can co-exist in the same JVM.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 * Note that the code for forwarding registrations must keep track of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * only those registrations that were done on this host. It does this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * by saving the registrations as they come in. The forwarding code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * is optimized so that forwarding of a new message is fast, while
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * forwarding of a message due to discovery of a new DA is somewhat
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * slower. This helps assure that SA clients get good service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * The ServerDATable also does active discovery for the SA server/DA,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * in a separate thread.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 * @author James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
abstract class ServerDATable extends DATable {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
    // The active discovery object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
    protected static ActiveDiscoverer activeDiscoverer = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
    // The table of regs to forward. Keys are the reg URL and locale, values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
    //  are the SSrvReg objects.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
    protected Hashtable forwardRegs = new Hashtable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
    // This acts as a guard protecting an non-initialized DA table:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
    //  If the DA Table hasn't been populated by active discovery yet,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
    //  other threads accessing the DA table will block on readyLock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
    private static Object readyLock = new Object();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
    // Keeps track of which DAs support which SPIs. The actual mapping
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
    //  is DA InetAddress to LinkedList of SPI Strings. recordNewDA
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
    //  populates this.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
    protected Hashtable daSPIsHash = new Hashtable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
     * Get the right server DA table from the subclass.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
     * @return Table for handling DAs in the server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
    static ServerDATable getServerDATable()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	ServerDATable table = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	synchronized (readyLock) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	    // Note that we are expecting this subclass. We will get a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	    //  cast exception if somebody instantiated with a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	    //  DATable subclass.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	    if (daTable != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		return (ServerDATable)daTable;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	    conf = SLPConfig.getSLPConfig();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	    // Call the superclass method to link it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	    daTable = linkAndInstantiateFromProp();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	    table = (ServerDATable)daTable;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	    // Advertise for *all* scopes. This is because we need to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	    //  be able to support clients that do user scoping.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	    Vector useScopes = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	    activeDiscoverer =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		new ActiveDiscoverer(Defaults.version,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
				     table,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
				     useScopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
				     conf.getMulticastAddress());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	    activeDiscoverer.start();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	}	// readyLock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	return table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
     * Record a new DA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
     * @param URL The DAAdvert URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
     * @param scopes The scopes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
     * @param version DA version number.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
     * @param attrs Attributes of DA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
     * @param spis SPIs supported by DA
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
     * @return True if recorded, false if not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
    abstract long
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	recordNewDA(ServiceURL url,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		    Vector scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		    long timestamp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		    int version,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		    Vector attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		    String spis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
     * Return a hashtable in ServiceTable.findServices() format (e.g.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
     * URL's as keys, scopes as values) for DAs matching the query.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
     * @param query Query for DA attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
    abstract Hashtable returnMatchingDAs(String query)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	throws ServiceLocationException;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
     * Forward a registration or deregistration to all DAs that have matching
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
     * scopes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
     * @param msg Registration or deregistration message, server side.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
     * @param source The address of the source.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
    void forwardSAMessage(SrvLocMsg msg, InetAddress source)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	SrvLocHeader hdr = msg.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	// If the message is not from this host (on any interface)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	//  then don't forward it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	if (!conf.isLocalHostSource(source)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	// Record it so we can forward to a new DA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	if (msg instanceof SSrvReg || msg instanceof CSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	    ServiceURL url;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	    if (msg instanceof SSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		url = ((SSrvReg)msg).URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		url = ((CSrvReg)msg).URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	    String key = makeKey(url, hdr.locale); // need locale also...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	    forwardRegs.put(key, msg);  // fresh doesn't matter.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	    SSrvDereg smsg = (SSrvDereg)msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	    // Only remove if tags are null. Otherwise, the updated record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	    //  will be sought.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	    if (smsg.tags == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		String key = makeKey(smsg.URL, hdr.locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		forwardRegs.remove(key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	// We only forward registrations to v2 DAs because we are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	//  acting as an SA server here. There is no requirement
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	//  for v2 SAs to communicate with v1 DAs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	// Get a hashtable of DAs that match the scopes in the message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	Hashtable daScopeRec = findDAScopes(hdr.scopes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	// We are only concerned with the unicast key, since it contains
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	//  the DAs to which forwarding is required.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	Vector daRecs = (Vector)daScopeRec.get(UNICAST_KEY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	// If there are no daRecs, then simply return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	if (daRecs == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	// Otherwise, forward the registration to all DAs in the vector.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	int i, n = daRecs.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	    DARecord rec = (DARecord)daRecs.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	    Vector daAddresses = rec.daAddresses;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	    int j, m = daAddresses.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	    for (j = 0; j < m; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		InetAddress addr = (InetAddress)daAddresses.elementAt(j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		// Don't forward if it's the host from which the registration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		//  came. Otherwise, we're hosed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		if (!source.equals(addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		    forwardRegOrDereg(addr, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
    // Make a key for the service agent message table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
    private String makeKey(ServiceURL url, Locale locale) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	return url.toString() + "/" + locale.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
     * Handle an incoming DAAdvert. Presence must be recorded in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
     * implementation specific server DA table and any registrations need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
     * to be forwarded if the boot timestamp is different from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
     * old boot timestamp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
     * @param advert Incoming DAAdvert.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
    void handleAdvertIn(CDAAdvert advert) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	SrvLocHeader hdr = advert.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	// Remove if DA is going down.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	if (advert.isGoingDown()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	    InetAddress addr = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	    try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		addr = InetAddress.getByName(advert.URL.getHost());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	    } catch (UnknownHostException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		conf.writeLog("unknown_da_address",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
			      new Object[] {advert.URL.getHost()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	    if (removeDA(addr, hdr.scopes)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		if (conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		    conf.writeLog("sdat_delete_da",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
				  new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			advert.URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			    hdr.scopes});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	    // verify the DAAdvert
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	    if (advert.authBlock != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		    AuthBlock.verifyAll(advert.authBlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		} catch (ServiceLocationException e) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		    if (conf.traceDrop()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			conf.writeLog("sdat_daadvert_vrfy_failed",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
				      new Object[] {advert.URL});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	    long timestamp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		recordNewDA(advert.URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
			    hdr.scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
			    advert.timestamp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
			    hdr.version,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
			    advert.attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			    advert.spis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	    // Don't forward if the advert was rejected, or if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	    //  old timestamp greater than or equal to the new timestamp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	    //  If the old timestamp is greater than or equal to the new,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	    //  it means that we have already forwarded to this DA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	    //  IF the old timestamp is less, it means that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	    //  the DA has crashed and come up again since we last saw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	    //  it, so we may have missed forwarding something to it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	    if (timestamp >= advert.timestamp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		if (conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		    conf.writeLog("sdat_add_da_no_forward",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
				  new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
			advert.URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
			    hdr.scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
			    new Long(timestamp)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	    if (conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		conf.writeLog("sdat_add_da",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
		    advert.URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
			hdr.scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
			new Long(advert.timestamp)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	    // Forward existing registrations to the new advert.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	    forwardRegistrations(advert.URL, hdr.scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
				 advert.timestamp, hdr.version);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
    // Private methods.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
    private void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	forwardRegistrations(ServiceURL url,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
			     Vector scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			     long timestamp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
			     int version) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	// Wait a random amount of time before forwarding.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	    Thread.currentThread().sleep(conf.getRandomWait());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	} catch (InterruptedException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	// Get the registrations to forward.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	Enumeration regs = forwardRegs.elements();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	// Get the address of the DA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	InetAddress addr = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	String host = url.getHost();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	    addr = InetAddress.getByName(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	} catch (UnknownHostException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	    if (conf.traceDrop() || conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		conf.writeLog("sdat_drop_fwd",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		    host});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	ServiceTable serviceTable = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	    serviceTable = ServiceTable.getServiceTable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	    // By this time, we should have it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	// Forward the registrations. Keep track of any deleted elements.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	Vector deleted = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	while (regs.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	    SrvLocMsg reg = (SrvLocMsg)regs.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	    ServiceURL regurl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	    if (reg instanceof SSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		regurl = ((SSrvReg)reg).URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		regurl = ((CSrvReg)reg).URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	    SrvLocHeader hdr = reg.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	    // Get the record and modify the reg to reflect the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	    //  record. We must do this because the SA may have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	    //  changed the record since it was first registred
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	    //  and we do not keep track of the changes here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	    ServiceStore.ServiceRecord rec =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		serviceTable.getServiceRecord(regurl, hdr.locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	    // If the record is null, it means that the entry was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	    //  aged out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	    if (rec == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
		deleted.addElement(reg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
		// Check that the scopes match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		Vector sscopes = (Vector)hdr.scopes.clone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		DATable.filterScopes(sscopes, scopes, false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		if (sscopes.size() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		    continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		if (reg instanceof SSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		    SSrvReg sreg = (SSrvReg)reg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		    hdr.scopes = (Vector)hdr.scopes.clone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		    sreg.attrList = (Vector)rec.getAttrList().clone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		    sreg.URLSignature = rec.getURLSignature();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		    sreg.attrSignature = rec.getAttrSignature();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
		forwardRegOrDereg(addr, reg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	// Remove any deleted elements from the hashtable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	//  We do this in a separate loop because enumerations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	//  aren't synchronized.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	int i, n = deleted.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	    SrvLocMsg reg = (SrvLocMsg)deleted.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	    SrvLocHeader hdr = reg.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	    ServiceURL regurl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	    if (reg instanceof SSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		regurl = ((SSrvReg)reg).URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		regurl = ((CSrvReg)reg).URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	    String key = makeKey(regurl, hdr.locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	    forwardRegs.remove(key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
    // Forward the registration or deregistration to the URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
    private void forwardRegOrDereg(InetAddress addr, SrvLocMsg rqst) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	SrvLocHeader hdr = rqst.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	// Don't forward to myself! Otherwise, nasty recursion happens.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
	if (conf.isLocalHostSource(addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	// If security is on, only forward if this DA can verify the authblocks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	if (conf.getHasSecurity()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	    LinkedList spis = (LinkedList)daSPIsHash.get(addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	    if (spis == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		// internal error; skip this DA to be safe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	    Hashtable auths = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	    if (rqst instanceof SSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		auths = ((SSrvReg)rqst).URLSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	    } else if (rqst instanceof SSrvDereg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
		auths = ((SSrvDereg)rqst).URLSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
		// shouldn't even be forwarding this!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	    // If each authblock is equiv to at least one SPI, forward the reg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	    Enumeration abs = auths.elements();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	    while (abs.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		AuthBlock ab = (AuthBlock)abs.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		// check each DA SPI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		boolean daSPImatch = false;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
		for (int SPIi = 0; SPIi < spis.size(); SPIi++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		    if (AuthBlock.checkEquiv((String)spis.get(SPIi), ab)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
			daSPImatch = true;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		if (!daSPImatch) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	if (conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	    conf.writeLog("sdat_forward",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
			  new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		Integer.toHexString(hdr.xid),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		    addr});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	// Send it via TCP. DAs should understand TCP, and it's reliable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	SrvLocMsg rply = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	    // Construct the client side message, for outgoing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	    if (rqst instanceof SSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		SSrvReg rrqst = (SSrvReg)rqst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
		CSrvReg msg = new CSrvReg(hdr.fresh,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
					  hdr.locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
					  rrqst.URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
					  hdr.scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
					  rrqst.attrList,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
					  rrqst.URLSignature,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
					  rrqst.attrSignature);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		rply = msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	    } else if (rqst instanceof SSrvDereg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
		SSrvDereg drqst = (SSrvDereg)rqst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
		CSrvDereg msg = new CSrvDereg(hdr.locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
					      drqst.URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
					      hdr.scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
					      drqst.tags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
					      drqst.URLSignature);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		rply = msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	    } else if (rqst instanceof CSrvReg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		rply = rqst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	    rply = Transact.transactTCPMsg(addr, rply, false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	    if (conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		conf.writeLog("sdat_forward_exception",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		    Integer.toHexString(hdr.xid),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
			new Integer(ex.getErrorCode()),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
			ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	// Report any errors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	if (rply == null ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	    rply.getErrorCode() != ServiceLocationException.OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	    if (conf.traceDATraffic()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		conf.writeLog("sdat_forward_err",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
		    Integer.toHexString(hdr.xid),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
			addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
			(rply == null ? "<null>":
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
			 Integer.toString(rply.getErrorCode()))});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
}