/* * Richard A. DeVenezia * Obtain IP address of host * * Tested platforms: * Windows NT 4 and SAS v6.12/v8.1 * * Adapted from: * VBnet - Randy Birch, MSKB, http://www.mvps.org/vbnet/code/network/ipaddress.htm */ filename sascbtbl catalog 'WORK.WINAPI.IPADDR.SOURCE'; data _null_; file sascbtbl ; infile cards length=len; length line $200; input line $varying. len; put line; cards4; ROUTINE WSAStartup MODULE=WSOCK32 MINARG=8 MAXARG=8 STACKPOP=CALLED RETURNS=LONG ; arg 1 NUM INPUT BYVALUE FORMAT=PIB4. ; * long wVersionRequired ; arg 2 NUM UPDATE FDSTART FORMAT=IB2. ; * int wVersion - lpWSADATA ; arg 3 NUM UPDATE FORMAT=IB2. ; * int wHighVersion ; arg 4 NUM UPDATE FORMAT=PIB1. ; * byte szDescription (0 To MAX_WSADescription=256) ; arg 5 NUM UPDATE FORMAT=PIB1. ; * byte szSystemStatus(0 To MAX_WSASYSStatus=128) ; arg 6 NUM UPDATE FORMAT=IB2. ; * int wMaxSockets ; arg 7 NUM UPDATE FORMAT=IB2. ; * int wMaxUDPDG ; arg 8 NUM UPDATE FORMAT=PIB4. ; * long dwVendorInfo ; ROUTINE WSACleanup MODULE=WSOCK32 MINARG=0 MAXARG=0 STACKPOP=CALLED RETURNS=LONG ; ROUTINE gethostname MODULE=WSOCK32 MINARG=2 MAXARG=2 STACKPOP=CALLED RETURNS=LONG ; arg 1 CHAR UPDATE FORMAT=$CSTR200. ; * szHost ; arg 2 NUM BYVALUE UPDATE FORMAT=PIB4. ; * long dwHostLen; ROUTINE gethostbyname MODULE=WSOCK32 MINARG=1 MAXARG=1 STACKPOP=CALLED RETURNS=LONG ; arg 1 CHAR INPUT FORMAT=$CSTR200. ; * szHost ; ;;;; run; %* WS_VERSION_REQD = 0101x ; %let hostname = UNKNOWN; %let ipaddr = UNKNOWN; data _null_; retain v1-v7 0; rc = moduleN ('WSAStartup', 0101x, v1, v2, v3, v4, v5, v6, v7); if rc ^= 0 then do; put "WSAStartup failed"; stop; end; if v5 < 1 then do; put "SystemStatus < 1"; stop; %* require one socket to get ip addr; end; major = BAND (v1, 000FFx); minor = BAND (v1, 0FF00x) / 0100x; if major < 1 or (major=1 and minor<1) then do; put "WSA version insufficient"; goto CleanUp; end; length hostname $200; hostname = ''; rc = moduleN ('gethostname', hostname, 200); if rc = -1 then do; put 'Unable to gethostname'; goto CleanUp; end; lpHost = moduleN ('gethostbyname', hostname); hLen = peek (lpHost+10, 2); hAddr = peek (lpHost+12, 4); lAddr = peek (hAddr); length ipAddr $20; ipAddr = ''; dot=''; do i = 0 to hLen-1; ipAddr = trim(ipAddr) || trim(dot) || put (peek (lAddr+i,1), 3.) ; dot='.'; end; call symput ('HOSTNAME', trim(hostname)); call symput ('IPADDR', compress(ipAddr)); CleanUp: rc = moduleN ('WSACleanup'); stop; run; %put HOST &HOSTNAME HAS IP ADDRESS &IPADDR;