REM >Director:Menus.System.Opensocks
REM by David Thomas,  1997
ON ERROR ERROR EXT ERR,REPORT$+" at line "+STR$ ERL:END

DIM misc% 255
SYS "Socket_Gettsize" TO sk_tsize%

SYS "Director_Menu","Opensockets Sockets -temp"
!misc%=16
FOR si%=0 TO sk_tsize%-1
  SYS "XSocket_Getsockname",si%,misc%+4,misc% TO ;f%
  IF (f%AND1)=0 THEN
    port%=misc%?6<<8 OR misc%?7:ip%=misc%!8
    misc%!40=4:SYS "XSocket_Getsockopt",si%,&FFFF,&1008,misc%+36,misc%+40
    SYS "XSocket_Getpeername",si%,misc%+20,misc% TO r0%;f%
    IF (f%AND1)=0THEN
      d$=FNips(ip%,port%)+" to "+FNips(misc%!24,misc%?22<<8 OR misc%?23)
    ELSE
      IF ip%=0 AND port% THEN d$="Listening on port "+STR$ port% ELSE d$="Error: "+FN_var(r0%+4)
    ENDIF
    SYS "Director_Option",CHR$34+RIGHT$("  "+STR$ si%,3)+" "+d$+" ("+FNproto(misc%!36)+")"+CHR$34+" -sub Dynamic:/Director:Menus.System.SockSub"
  ENDIF
NEXT

SYS "Director_EndMenu"

*Set Director$Menu Sockets

END

DEF FNips(ip%,port%)
IF ip%=&0100007F THEN ="localhost."+STR$(port%)
=STR$(ip%AND255)+"."+STR$((ip%>>8)AND255)+"."+STR$((ip%>>16)AND255)+"."+STR$(ip%>>>24)+":"+STR$(port%)

DEF FNproto(proto%)
IF proto%=1 THEN ="TCP" ELSE IF proto%=2 THEN ="UDP" ELSE IF proto%=3 THEN ="ICMP"
=STR$ proto%

DEF FN_var(p%)
LOCAL s$
SYS "XOS_GenerateError",p% TO s$
=s$
