home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 823 / FlFingerSIS.sis / flfingerd.opl (.txt) < prev    next >
Encoding:
EPOC OPL Source  |  2001-10-25  |  5.4 KB  |  207 lines

  1.  
  2.  
  3. REM --------------------------------------------------
  4. REM flfingerd - Sample TCP/IP finger server
  5. REM Distributed with FlFinger, D Rushall 1999, 2000
  6. REM Based on Keith Walker's sample echo server for
  7. REM CSocket OPX
  8. REM --------------------------------------------------
  9. REM USE THIS CODE AT YOUR OWN RISK
  10. REM --------------------------------------------------
  11. REM Simple program to server 'finger' requests.
  12. REM
  13. REM Primarily designed to test and demonstrate my
  14. REM finger client, 'FlFinger' and may not respond
  15. REM correctly to all finger requests.
  16. REM
  17. REM To use, compile and run, and then use FlFinger
  18. REM to 'Open connection' to 'someone@localhost',
  19. REM where 'someone' is any valid user name.
  20. REM
  21. REM Could be accessed by other remote finger clients
  22. REM when EPOC device is connected to network, if you
  23. REM really wanted to :-)
  24. REM
  25. REM Serial implementation - only one request can be
  26. REM served at a time.
  27. REM
  28. REM Edit 'buildReply:' to customise response string.
  29. REM
  30. REM See CSocket and CDescriptor OPX documentation for
  31. REM details of socket interface calls, from:
  32. REM http://www.starship.freeserve.co.uk/
  33. REM --------------------------------------------------
  34.  
  35. DECLARE EXTERNAL
  36. INCLUDE "CSocket.oxh"
  37. INCLUDE "CDescriptor.oxh"
  38.  
  39. CONST KBufferLength% = 1024 : REM max response length
  40. CONST KFingerPort& = 79     : REM finger service port
  41.  
  42. EXTERNAL fingerd:
  43.  
  44. REM -- Main code --
  45.  
  46. PROC main:
  47.     gBORDER 3
  48.     PRINT "flfingerd - Sample TCP/IP finger server for EPOC"
  49.     PRINT "Distributed with FlFinger, D Rushall 1999, 2000"
  50.     PRINT
  51.     PRINT "USE THIS CODE AT YOUR OWN RISK"
  52.     PRINT "PRESS Ctrl-Esc TO EXIT"
  53.     PRINT
  54.     fingerd:
  55.     PRINT "--END - PRESS ANY KEY" : GET
  56. ENDP
  57.  
  58. REM -- Build reply string --
  59.  
  60. PROC buildReply:(dReply&,query$)
  61.  
  62.     REM Slug to simulate network delay to make things interesting
  63.     PRINT "Needlessly delaying the reponse..."
  64.     PAUSE 50
  65.  
  66.     REM Clear reply buffer
  67.     DesZero:(dReply&)
  68.  
  69.     REM Build a reply, line by line
  70.     DesAppendStr:(dReply&,"Finger response generated by ")
  71.     DesAppendStr:(dReply&,"'flfingerd', a sample TCP/IP finger server for EPOC")
  72.     DesAppendStr:(dReply&,chr$(13)+chr$(10))
  73.     DesAppendStr:(dReply&,"Your finger request was: "+query$)
  74.     DesAppendStr:(dReply&,chr$(13)+chr$(10))
  75.     DesAppendStr:(dReply&,"Customise 'flfingerd.opl' source to place your own message here.")
  76.  
  77.     REM Finish with a new line
  78.     DesAppendStr:(dReply&,chr$(13)+chr$(10))
  79. ENDP
  80.  
  81. REM -- Test status code and exit if error --
  82.  
  83. PROC check:(passed%,str$)
  84. EXTERNAL server&,socket&,blanksocket&,address&,des&
  85.     IF NOT passed%
  86.         PRINT "--";str$;" FAILED - PRESS ANY KEY"
  87.         GET
  88.         DeleteDes:(des&)
  89.         DeleteSockAddr:(address&)
  90.         DeleteSocket:(socket&)
  91.         DeleteSocket:(blanksocket&)
  92.         DeleteSocketServ:(server&)
  93.         STOP
  94.     ENDIF
  95. ENDP
  96.  
  97. REM -- Very simple finger request server --
  98.  
  99. PROC fingerd:
  100. GLOBAL server&,socket&,blanksocket&,address&,des&,desa&
  101. LOCAL err%,status&,loop%,query$(255)
  102.  
  103.     REM Initialise socket server
  104.  
  105.     server& = NewSocketServ&:
  106.     check:(server&<>0,"NewSocketServ")
  107.     err% = SocketServConnect%:(server&,KSockDefaultMessageSlots&)
  108.     check:(err%=0,"SocketServConnect")
  109.  
  110.     REM Create our listener port address
  111.  
  112.     address&=NewInetAddr4&:(KInetAddrLoop&,KFingerPort&)
  113.     check:(address&<>0,"NewInetAddr4")
  114.     PRINT "Listener on",InetAddrOutput$:(address&);":";SockAddrPort&:(address&)
  115.  
  116.     REM Create, open and bind listening socket
  117.  
  118.     socket& = NewSocket&:
  119.     check:(socket&<>0,"NewSocket")
  120.     err% = SocketOpen4%:(socket&,server&,KAfInet&,KSockStream&,KProtocolInetTcp&)
  121.     check:(err%=0,"SocketOpen4")
  122.     err% = SocketBind%:(socket&,address&)
  123.     check:(err%=0,"SocketBind")
  124.     err% = SocketListen%:(socket&,1)
  125.     check:(err%=0,"SocketListen")
  126.  
  127.     REM Create buffer descriptors
  128.  
  129.     des& = NewDesAlloc&:(1)
  130.     check:(des&<>0,"NewDes")
  131.     desa& = NewDesAlloc&:(KBufferLength%)
  132.     check:(des&<>0,"NewDes a")
  133.  
  134.     REM Main finger listener loop
  135.  
  136.     DO
  137.  
  138.         REM Create and open request socket
  139.  
  140.         blanksocket& = NewSocket&:
  141.         check:(blanksocket&<>0,"NewSocket")
  142.         err% = SocketOpen%:(blanksocket&,server&)
  143.         check:(err%=0,"SocketOpen")
  144.  
  145.         REM Wait for and accept client request
  146.  
  147.         PRINT
  148.         PRINT "Waiting for client..."
  149.         SocketAcceptA:(socket&,blanksocket&,status&)
  150.         IOWAITSTAT32 status&
  151.         Check:(status&=0,"SocketAcceptA")
  152.  
  153.         REM Read incomming query string from socket
  154.  
  155.         PRINT "Client connected..."
  156.         query$ = ""
  157.         DO
  158.             DesZero:(des&)
  159.             SocketReadA:(blanksocket&,des&,status&)
  160.             IOWAITSTAT32 status&
  161.             IF status&=0
  162.                 check:(status&=0,"SocketRead")
  163.                 query$ = query$+DesStr$:(des&)
  164.             ENDIF
  165.         UNTIL status&<>0 or right$(query$,2)=chr$(13)+chr$(10)
  166.         PRINT "Request string is:",query$
  167.  
  168.         REM Build and reply string to client
  169.  
  170.         buildReply:(desa&,query$)
  171.         PRINT "Sending reply..."
  172.         SocketWriteA:(blanksocket&,desa&,status&)
  173.         IOWAITSTAT32 status&
  174.         check:(status&=0,"SocketWrite")
  175.  
  176.         REM Cancel, close and free request socket
  177.  
  178.         SocketCancelAll:(blanksocket&)
  179.         check:(-1,"SocketCancelAll")
  180.         SocketClose:(blanksocket&)
  181.         check:(-1,"SocketClose")
  182.         DeleteSocket:(blanksocket&)
  183.         check:(-1,"DeleteSocket")
  184.  
  185.         REM Loop to get for next request
  186.  
  187.     UNTIL 0 : REM loop indefinitely
  188.  
  189.     REM Cancel and close listening socket
  190.  
  191.     SocketCancelAll:(socket&)
  192.     check:(-1,"SocketCancelAll")
  193.     SocketClose:(socket&)
  194.     check:(-1,"SocketClose")
  195.  
  196.     REM Free resources and done
  197.  
  198.     DeleteDes:(des&)
  199.     DeleteDes:(desa&)
  200.     DeleteInetAddr:(address&)
  201.     DeleteSocket:(socket&)
  202.     DeleteSocketServ:(server&)
  203. ENDP
  204.  
  205.  
  206.  
  207.