ComputerCraft Archive

samba

computer utility kepler155c github

Description

ComputerCraft OS

Installation

Copy one of these commands into your ComputerCraft terminal:

wget:wget https://raw.githubusercontent.com/kepler155c/opus/develop-1.8/sys/apps/network/samba.lua samba
Archive:wget https://cc.shobie.xyz/cc/get/gh-kepler155c-opus-sys-apps-network-samba samba
Quick Install: wget https://cc.shobie.xyz/cc/get/gh-kepler155c-opus-sys-apps-network-samba samba

Usage

Run: samba

Tags

none

Source

View Original Source

Code Preview

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(table.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)