aboutsummaryrefslogtreecommitdiff
path: root/etc/tftp.lua
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2004-07-01 03:32:09 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2004-07-01 03:32:09 +0000
commit7115c12fbc9aae1cd46fdf049697a27fb996181a (patch)
tree2e918f54f729766701aabdef488a6461bc623da1 /etc/tftp.lua
parent7aaba59909e8527190694285f56ca68772c97f6a (diff)
downloadluasocket-7115c12fbc9aae1cd46fdf049697a27fb996181a.tar.gz
luasocket-7115c12fbc9aae1cd46fdf049697a27fb996181a.tar.bz2
luasocket-7115c12fbc9aae1cd46fdf049697a27fb996181a.zip
Moving on to beta2.
Diffstat (limited to 'etc/tftp.lua')
-rw-r--r--etc/tftp.lua25
1 files changed, 13 insertions, 12 deletions
diff --git a/etc/tftp.lua b/etc/tftp.lua
index 2fc914e..70db050 100644
--- a/etc/tftp.lua
+++ b/etc/tftp.lua
@@ -72,50 +72,51 @@ local function tget(gett)
72 local retries, dgram, sent, datahost, dataport, code 72 local retries, dgram, sent, datahost, dataport, code
73 local last = 0 73 local last = 0
74 local con = socket.try(socket.udp()) 74 local con = socket.try(socket.udp())
75 local try = socket.newtry(function() con:close() end)
75 -- convert from name to ip if needed 76 -- convert from name to ip if needed
76 gett.host = socket.try(socket.dns.toip(gett.host)) 77 gett.host = try(socket.dns.toip(gett.host))
77 con:settimeout(1) 78 con:settimeout(1)
78 -- first packet gives data host/port to be used for data transfers 79 -- first packet gives data host/port to be used for data transfers
79 retries = 0 80 retries = 0
80 repeat 81 repeat
81 sent = socket.try(con:sendto(RRQ(gett.path, "octet"), 82 sent = try(con:sendto(RRQ(gett.path, "octet"),
82 gett.host, gett.port)) 83 gett.host, gett.port))
83 dgram, datahost, dataport = con:receivefrom() 84 dgram, datahost, dataport = con:receivefrom()
84 retries = retries + 1 85 retries = retries + 1
85 until dgram or datahost ~= "timeout" or retries > 5 86 until dgram or datahost ~= "timeout" or retries > 5
86 socket.try(dgram, datahost) 87 try(dgram, datahost)
87 -- associate socket with data host/port 88 -- associate socket with data host/port
88 socket.try(con:setpeername(datahost, dataport)) 89 try(con:setpeername(datahost, dataport))
89 -- default sink 90 -- default sink
90 local sink = gett.sink or ltn12.sink.null() 91 local sink = gett.sink or ltn12.sink.null()
91 -- process all data packets 92 -- process all data packets
92 while 1 do 93 while 1 do
93 -- decode packet 94 -- decode packet
94 code = get_OP(dgram) 95 code = get_OP(dgram)
95 socket.try(code ~= OP_ERROR, get_ERROR(dgram)) 96 try(code ~= OP_ERROR, get_ERROR(dgram))
96 socket.try(code == OP_DATA, "unhandled opcode " .. code) 97 try(code == OP_DATA, "unhandled opcode " .. code)
97 -- get data packet parts 98 -- get data packet parts
98 local block, data = split_DATA(dgram) 99 local block, data = split_DATA(dgram)
99 -- if not repeated, write 100 -- if not repeated, write
100 if block == last+1 then 101 if block == last+1 then
101 socket.try(sink(data)) 102 try(sink(data))
102 last = block 103 last = block
103 end 104 end
104 -- last packet brings less than 512 bytes of data 105 -- last packet brings less than 512 bytes of data
105 if string.len(data) < 512 then 106 if string.len(data) < 512 then
106 socket.try(con:send(ACK(block))) 107 try(con:send(ACK(block)))
107 socket.try(con:close()) 108 try(con:close())
108 socket.try(sink(nil)) 109 try(sink(nil))
109 return 1 110 return 1
110 end 111 end
111 -- get the next packet 112 -- get the next packet
112 retries = 0 113 retries = 0
113 repeat 114 repeat
114 sent = socket.try(con:send(ACK(last))) 115 sent = try(con:send(ACK(last)))
115 dgram, err = con:receive() 116 dgram, err = con:receive()
116 retries = retries + 1 117 retries = retries + 1
117 until dgram or err ~= "timeout" or retries > 5 118 until dgram or err ~= "timeout" or retries > 5
118 socket.try(dgram, err) 119 try(dgram, err)
119 end 120 end
120end 121end
121 122