afs_int32 hport;
int i, j, count;
char hoststr[16], hoststr2[16];
+ Capabilities caps;
+
+ caps.Capabilities_val = NULL;
haddr = rxr_HostOf(tcon);
hport = rxr_PortOf(tcon);
retry:
+ if (caps.Capabilities_val)
+ free(caps.Capabilities_val);
+ caps.Capabilities_val = NULL;
+ caps.Capabilities_len = 0;
+
code = 0;
identP = (struct Identity *)rx_GetSpecific(tcon, rxcon_ident_key);
host = h_Lookup_r(haddr, hport, &held);
}
host->hostFlags &= ~ALTADDR;
H_UNLOCK
- code = RXAFSCB_WhoAreYou(host->callback_rxcon, &interf);
+ code = RXAFSCB_TellMeAboutYourself(host->callback_rxcon, &interf,
+ &caps);
+ if ( code == RXGEN_OPCODE )
+ code = RXAFSCB_WhoAreYou(host->callback_rxcon, &interf);
H_LOCK
if ( code == RXGEN_OPCODE ) {
identP = (struct Identity *)malloc(sizeof(struct Identity));
hoststr, ntohs(host->port), code));
host->hostFlags |= VENUSDOWN;
}
+ if (caps.Capabilities_val &&
+ (caps.Capabilities_val[0] & CAPABILITY_ERRORTRANS))
+ host->hostFlags |= HERRORTRANS;
+ else
+ host->hostFlags &= ~(HERRORTRANS);
host->hostFlags |= ALTADDR;
h_Unlock_r(host);
} else if (host) {
if (!(host->Console&1)) {
if (!identP || !interfValid) {
H_UNLOCK
- code = RXAFSCB_WhoAreYou(host->callback_rxcon, &interf);
+ code = RXAFSCB_TellMeAboutYourself(host->callback_rxcon,
+ &interf, &caps);
+ if ( code == RXGEN_OPCODE )
+ code = RXAFSCB_WhoAreYou(host->callback_rxcon, &interf);
H_LOCK
if ( code == RXGEN_OPCODE ) {
identP = (struct Identity *)malloc(sizeof(struct Identity));
host->hostFlags |= RESETDONE;
}
+ if (caps.Capabilities_val &&
+ (caps.Capabilities_val[0] & CAPABILITY_ERRORTRANS))
+ host->hostFlags |= HERRORTRANS;
+ else
+ host->hostFlags &= ~(HERRORTRANS);
host->hostFlags |= ALTADDR;/* host structure iniatilisation complete */
h_Unlock_r(host);
}
+ if (caps.Capabilities_val)
+ free(caps.Capabilities_val);
+ caps.Capabilities_val = NULL;
+ caps.Capabilities_len = 0;
return host;
} /*h_GetHost_r*/