AFS-Monitor
view release on metacpan or search on metacpan
src/Monitor.xs view on Meta::CPAN
case 'r':
if (memcmp( flag, "rxstats", 7) == 0 ) {
rxstats = (int) SvIV(value);
}
break;
case 's':
if (memcmp( flag, "servers", 7) == 0 ) {
hostName = (char *) SvPV(value, PL_na);
}
break;
case 'v':
if (memcmp( flag, "version", 7) == 0 ) {
version_flag = (int) SvIV(value);
}
break;
default:
break;
} /* switch */
} /* while */
/* fprintf(STDERR, "Done parsing args\n\n"); */
/* lookup host */
if (hostName) {
th = hostutil_GetHostByName(hostName);
if (!th) {
sprintf(buffer, "rxdebug: host %s not found in host table", hostName);
VSETCODE(-1, buffer);
XSRETURN_UNDEF;
}
memcpy(&host, th->h_addr, sizeof(afs_int32));
}
else host = htonl(0x7f000001); /* IP localhost */
if (!portName)
port = htons(7000); /* default is fileserver */
else {
if ((port = rxdebug_PortNumber(portName)) == -1)
port = rxdebug_PortName(portName);
if (port == -1) {
sprintf(buffer, "rxdebug: can't resolve port name %s", portName);
VSETCODE(-1, buffer);
XSRETURN_UNDEF;
}
}
dallyCounter = 0;
hostAddr.s_addr = host;
/* add address and port to RETVAL hash */
hv_store(RETVAL, "address", 7, newSVpv(inet_ntoa(hostAddr), 0), 0);
hv_store(RETVAL, "port", 4, newSViv(ntohs(port)), 0);
s = socket(AF_INET, SOCK_DGRAM, 0);
taddr.sin_family = AF_INET;
taddr.sin_port = 0;
taddr.sin_addr.s_addr = 0;
#ifdef STRUCT_SOCKADDR_HAS_SA_LEN
taddr.sin_len = sizeof(struct sockaddr_in);
#endif
code = bind(s, (struct sockaddr *) &taddr, sizeof(struct sockaddr_in));
FSSETCODE(code);
if (code) {
perror("bind");
XSRETURN_UNDEF;
}
if (version_flag) /* add version to RETVAL and finish */
{
code = rx_GetServerVersion(s, host, port, length, version);
if (code < 0)
{
sprintf(buffer, "get version call failed with code %d, errno %d",code,errno);
BSETCODE(code, buffer);
XSRETURN_UNDEF;
}
hv_store(RETVAL, "version", 7, newSVpv(version, 0), 0);
goto done;
}
code = rx_GetServerDebug(s, host, port, &tstats, &supportedDebugValues);
if (code < 0) {
sprintf(buffer, "getstats call failed with code %d", code);
BSETCODE(code, buffer);
XSRETURN_UNDEF;
}
withSecStats = (supportedDebugValues & RX_SERVER_DEBUG_SEC_STATS);
withAllConn = (supportedDebugValues & RX_SERVER_DEBUG_ALL_CONN);
withRxStats = (supportedDebugValues & RX_SERVER_DEBUG_RX_STATS);
withWaiters = (supportedDebugValues & RX_SERVER_DEBUG_WAITER_CNT);
withIdleThreads = (supportedDebugValues & RX_SERVER_DEBUG_IDLE_THREADS);
withPeers = (supportedDebugValues & RX_SERVER_DEBUG_ALL_PEER);
TSTATS = newHV();
hv_store(TSTATS, "nFreePackets", 12, newSViv(tstats.nFreePackets), 0);
hv_store(TSTATS, "packetReclaims", 14, newSViv(tstats.packetReclaims), 0);
hv_store(TSTATS, "callsExecuted", 13, newSViv(tstats.callsExecuted), 0);
hv_store(TSTATS, "usedFDs", 7, newSViv(tstats.usedFDs), 0);
hv_store(TSTATS, "waitingForPackets", 17, newSViv(tstats.waitingForPackets), 0);
hv_store(TSTATS, "version", 7, newSViv(tstats.version), 0);
if (withWaiters)
hv_store(TSTATS, "nWaiting", 8, newSViv(tstats.nWaiting), 0);
if ( withIdleThreads )
hv_store(TSTATS, "idleThreads", 11, newSViv(tstats.idleThreads), 0);
hv_store(RETVAL, "tstats", 6, newRV_inc((SV*)(TSTATS)), 0);
/* get rxstats if requested, and supported by the server */
/* hash containing stats added at key 'rxstats' in RETVAL */
if (rxstats)
{
if (!withRxStats)
{
noRxStats:
withRxStats = 0;
warn("WARNING: Server doesn't support retrieval of Rx statistics\n");
}
else {
struct rx_statistics rxstats;
/* should gracefully handle the case where rx_statistics grows */
code = rx_GetServerStats(s, host, port, &rxstats, &supportedStatValues);
if (code < 0) {
( run in 2.313 seconds using v1.01-cache-2.11-cpan-2398b32b56e )