home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / lua / 5.1 / socket.lua < prev   
Encoding:
Text File  |  2009-07-20  |  4.0 KB  |  134 lines

  1. -----------------------------------------------------------------------------
  2. -- LuaSocket helper module
  3. -- Author: Diego Nehab
  4. -- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $
  5. -----------------------------------------------------------------------------
  6.  
  7. -----------------------------------------------------------------------------
  8. -- Declare module and import dependencies
  9. -----------------------------------------------------------------------------
  10. local base = _G
  11. local string = require("string")
  12. local math = require("math")
  13. local socket = require("socket.core")
  14. module("socket")
  15.  
  16. -----------------------------------------------------------------------------
  17. -- Exported auxiliar functions
  18. -----------------------------------------------------------------------------
  19. function connect(address, port, laddress, lport)
  20.     local sock, err = socket.tcp()
  21.     if not sock then return nil, err end
  22.     if laddress then
  23.         local res, err = sock:bind(laddress, lport, -1)
  24.         if not res then return nil, err end
  25.     end
  26.     local res, err = sock:connect(address, port)
  27.     if not res then return nil, err end
  28.     return sock
  29. end
  30.  
  31. function bind(host, port, backlog)
  32.     local sock, err = socket.tcp()
  33.     if not sock then return nil, err end
  34.     sock:setoption("reuseaddr", true)
  35.     local res, err = sock:bind(host, port)
  36.     if not res then return nil, err end
  37.     res, err = sock:listen(backlog)
  38.     if not res then return nil, err end
  39.     return sock
  40. end
  41.  
  42. try = newtry()
  43.  
  44. function choose(table)
  45.     return function(name, opt1, opt2)
  46.         if base.type(name) ~= "string" then
  47.             name, opt1, opt2 = "default", name, opt1
  48.         end
  49.         local f = table[name or "nil"]
  50.         if not f then base.error("unknown key (".. base.tostring(name) ..")", 3)
  51.         else return f(opt1, opt2) end
  52.     end
  53. end
  54.  
  55. -----------------------------------------------------------------------------
  56. -- Socket sources and sinks, conforming to LTN12
  57. -----------------------------------------------------------------------------
  58. -- create namespaces inside LuaSocket namespace
  59. sourcet = {}
  60. sinkt = {}
  61.  
  62. BLOCKSIZE = 2048
  63.  
  64. sinkt["close-when-done"] = function(sock)
  65.     return base.setmetatable({
  66.         getfd = function() return sock:getfd() end,
  67.         dirty = function() return sock:dirty() end
  68.     }, {
  69.         __call = function(self, chunk, err)
  70.             if not chunk then
  71.                 sock:close()
  72.                 return 1
  73.             else return sock:send(chunk) end
  74.         end
  75.     })
  76. end
  77.  
  78. sinkt["keep-open"] = function(sock)
  79.     return base.setmetatable({
  80.         getfd = function() return sock:getfd() end,
  81.         dirty = function() return sock:dirty() end
  82.     }, {
  83.         __call = function(self, chunk, err)
  84.             if chunk then return sock:send(chunk)
  85.             else return 1 end
  86.         end
  87.     })
  88. end
  89.  
  90. sinkt["default"] = sinkt["keep-open"]
  91.  
  92. sink = choose(sinkt)
  93.  
  94. sourcet["by-length"] = function(sock, length)
  95.     return base.setmetatable({
  96.         getfd = function() return sock:getfd() end,
  97.         dirty = function() return sock:dirty() end
  98.     }, {
  99.         __call = function()
  100.             if length <= 0 then return nil end
  101.             local size = math.min(socket.BLOCKSIZE, length)
  102.             local chunk, err = sock:receive(size)
  103.             if err then return nil, err end
  104.             length = length - string.len(chunk)
  105.             return chunk
  106.         end
  107.     })
  108. end
  109.  
  110. sourcet["until-closed"] = function(sock)
  111.     local done
  112.     return base.setmetatable({
  113.         getfd = function() return sock:getfd() end,
  114.         dirty = function() return sock:dirty() end
  115.     }, {
  116.         __call = function()
  117.             if done then return nil end
  118.             local chunk, err, partial = sock:receive(socket.BLOCKSIZE)
  119.             if not err then return chunk
  120.             elseif err == "closed" then
  121.                 sock:close()
  122.                 done = 1
  123.                 return partial
  124.             else return nil, err end
  125.         end
  126.     })
  127. end
  128.  
  129.  
  130. sourcet["default"] = sourcet["until-closed"]
  131.  
  132. source = choose(sourcet)
  133.  
  134.