mirror of
https://github.com/kepler155c/opus
synced 2024-11-16 05:34:49 +00:00
89 lines
1.8 KiB
Lua
89 lines
1.8 KiB
Lua
local Event = require('opus.event')
|
|
local Socket = require('opus.socket')
|
|
|
|
local fs = _G.fs
|
|
|
|
local fileUid = 0
|
|
local fileHandles = { }
|
|
|
|
local function remoteOpen(fn, fl)
|
|
local fh = fs.open(fn, fl)
|
|
if fh then
|
|
local methods = { 'close', 'write', 'writeLine', 'flush', 'read', 'readLine', 'readAll', }
|
|
fileUid = fileUid + 1
|
|
fileHandles[fileUid] = fh
|
|
|
|
local vfh = {
|
|
methods = { },
|
|
fileUid = fileUid,
|
|
}
|
|
|
|
for _,m in ipairs(methods) do
|
|
if fh[m] then
|
|
table.insert(vfh.methods, m)
|
|
end
|
|
end
|
|
return vfh
|
|
end
|
|
end
|
|
|
|
local function remoteFileOperation(fileId, op, ...)
|
|
local fh = fileHandles[fileId]
|
|
if fh then
|
|
return fh[op](...)
|
|
end
|
|
end
|
|
|
|
local function sambaConnection(socket)
|
|
while true do
|
|
local msg = socket:read()
|
|
if not msg then
|
|
break
|
|
end
|
|
local fn = fs[msg.fn]
|
|
if msg.fn == 'open' then
|
|
fn = remoteOpen
|
|
elseif msg.fn == 'fileOp' then
|
|
fn = remoteFileOperation
|
|
end
|
|
local ret
|
|
local s, m = pcall(function()
|
|
ret = fn(unpack(msg.args))
|
|
end)
|
|
if not s and m then
|
|
_G.printError('samba: ' .. m)
|
|
end
|
|
socket:write({ response = ret })
|
|
end
|
|
|
|
print('samba: Connection closed')
|
|
end
|
|
|
|
Event.addRoutine(function()
|
|
print('samba: listening on port 139')
|
|
|
|
while true do
|
|
local socket = Socket.server(139)
|
|
|
|
Event.addRoutine(function()
|
|
print('samba: connection from ' .. socket.dhost)
|
|
local s, m = pcall(sambaConnection, socket)
|
|
print('samba: closing connection to ' .. socket.dhost)
|
|
socket:close()
|
|
if not s and m then
|
|
print('Samba error')
|
|
_G.printError(m)
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Event.on('network_attach', function(_, computer)
|
|
fs.mount(fs.combine('network', computer.label), 'netfs', computer.id)
|
|
end)
|
|
|
|
Event.on('network_detach', function(_, computer)
|
|
print('samba: detaching ' .. computer.label)
|
|
fs.unmount(fs.combine('network', computer.label))
|
|
end)
|