home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / rexx / rxsock / rnr.cmd < prev    next >
OS/2 REXX Batch file  |  1993-03-01  |  5KB  |  215 lines

  1. /*------------------------------------------------------------------
  2.  * rnr.cmd :
  3.  *------------------------------------------------------------------
  4.  * 08-09-92 originally by Patrick J. Mueller
  5.  *------------------------------------------------------------------*/
  6.  
  7. trace off
  8.  
  9. parse arg server .
  10.  
  11. if (server = "") then
  12.    do
  13.    say "Expecting a news server name to be passed as a parameter."
  14.    exit 1
  15.    end
  16.  
  17. /*------------------------------------------------------------------
  18.  * initialize socket function package
  19.  *------------------------------------------------------------------*/
  20. if RxFuncQuery("SockLoadFuncs") then
  21.    do
  22.    rc = RxFuncAdd("SockLoadFuncs","RxSock","SockLoadFuncs")
  23.    rc = SockLoadFuncs()
  24.    end
  25.  
  26. /*------------------------------------------------------------------
  27.  * get address of server
  28.  *------------------------------------------------------------------*/
  29. rc = SockGetHostByName(server,"host.!")
  30. if (rc = 0) then
  31.    do
  32.    say "Unable to resolve server name" server
  33.    exit
  34.    end
  35.  
  36. server = host.!addr
  37.  
  38. /*------------------------------------------------------------------
  39.  * open socket
  40.  *------------------------------------------------------------------*/
  41. sock = SockSocket("AF_INET","SOCK_STREAM",0)
  42. if (sock = -1) then
  43.    do
  44.    say "Error opening socket:" errno
  45.    exit
  46.    end
  47.  
  48. /*------------------------------------------------------------------
  49.  * connect socket
  50.  *------------------------------------------------------------------*/
  51. server.!family = "AF_INET"
  52. server.!port   = 119
  53. server.!addr   = server
  54.  
  55. rc = SockConnect(sock,"server.!")
  56. if (rc = -1) then
  57.    Error(sock,rc,"Error connecting to newsserver :" errno)
  58.  
  59. trc = GetResponse(sock)
  60. do i = 1 to line.0
  61.    say line.i
  62. end
  63.  
  64. rc = Interact(sock)
  65.  
  66. /*------------------------------------------------------------------
  67.  * quittin' time!
  68.  *------------------------------------------------------------------*/
  69. rc = SendMessage(sock,"quit")
  70. rc = SockSoclose(sock)
  71.  
  72. exit
  73.  
  74. /*------------------------------------------------------------------
  75.  * get command and execute in a loop
  76.  *------------------------------------------------------------------*/
  77. Interact:        procedure expose !.
  78.    sock = arg(1)
  79.  
  80.    do forever
  81.       say "Enter rn command (or quit)"
  82.       parse pull command
  83.  
  84.       if ("QUIT" == translate(command)) then
  85.          leave
  86.  
  87.       if ("HELP" == translate(command)) then
  88.          do
  89.          rc = Help()
  90.          iterate
  91.          end
  92.  
  93.       if ("" = command) then
  94.          iterate
  95.  
  96.       trc = SendMessage(sock,command)
  97.       trc = GetResponse(sock)
  98.  
  99.       do i = 1 to line.0
  100.          say line.i
  101.       end
  102.  
  103.    end
  104.  
  105.    return ""
  106.  
  107. /*------------------------------------------------------------------
  108.  * help
  109.  *------------------------------------------------------------------*/
  110. Help: procedure
  111.    say "commands:"
  112.    say
  113.    say "quit    - to quit"
  114.    say "group   - to change to a particular group"
  115.    say "article - to see an article"
  116.    say
  117.    return ""
  118.  
  119. /*------------------------------------------------------------------
  120.  * get a response from the server
  121.  *------------------------------------------------------------------*/
  122. GetResponse:     procedure expose !. line.
  123.    sock = arg(1)
  124.  
  125.    moreids = "100 215 220 221 222 223 230 231"
  126.  
  127.    line.0 = 1
  128.    line.1 = GetResponseLine(sock)
  129.  
  130.    parse var line.1 rid .
  131.  
  132.    if (wordpos(rid,moreids) = 0) then
  133.       return ""
  134.  
  135.    do forever
  136.       o = line.0 + 1
  137.  
  138.       line.o = GetResponseLine(sock)
  139.  
  140.       if (line.o = ".") then
  141.          return ""
  142.  
  143.       line.0 = o
  144.    end
  145.  
  146.    return ""
  147.  
  148. /*------------------------------------------------------------------
  149.  * get a line from the server
  150.  *------------------------------------------------------------------*/
  151. GetResponseLine: procedure expose !.
  152.    sock = arg(1)
  153.  
  154.    crlf = d2c(13) || d2c(10)
  155.  
  156.    if (symbol('!.buff') = "LIT") then
  157.       !.buff = ""
  158.  
  159.    do while (pos(crlf,!.buff) = 0)
  160.       rc = SockRecv(sock,"data",8000)
  161.       !.buff = !.buff || data
  162.    end
  163.  
  164.    p = pos(crlf,!.buff)
  165.  
  166.    line = substr(!.buff,1,p-1)
  167.    !.buff = substr(!.buff,p+2)
  168.  
  169.    return line
  170.  
  171. /*------------------------------------------------------------------
  172.  * send a string to the server
  173.  *------------------------------------------------------------------*/
  174. SendMessage:     procedure expose !.
  175.    sock = arg(1)
  176.    data = arg(2) || d2c(13) || d2c(10)
  177.  
  178.    len = length(data)
  179.    do while (len > 0)
  180.       i = SockSend(sock,data);
  181.  
  182.       if (errno <> 0) then
  183.          Error(-1,rc,"Error sending data to server.")
  184.  
  185.       if (i <= 0) then
  186.          Error(sock,100,"Server closed the connection.")
  187.  
  188.       data = substr(data,len+1)
  189.       len  = length(data)
  190.    end
  191.  
  192.    return 0
  193.  
  194. /*------------------------------------------------------------------
  195.  * halting ...
  196.  *------------------------------------------------------------------*/
  197. Halting:
  198.    Error(sock,1,"error on line" sigl)
  199.  
  200. /*------------------------------------------------------------------
  201.  * exit with a message and return code
  202.  *------------------------------------------------------------------*/
  203. Error: procedure
  204.    sock = arg(1)
  205.    retc = arg(2)
  206.    msg  = arg(3)
  207.  
  208.    if (sock <> -1) then
  209.       rc = SockSoClose(sock)
  210.  
  211.    say msg
  212.  
  213.    exit retc
  214.  
  215.