70 lines
1.9 KiB
Lua
70 lines
1.9 KiB
Lua
-- SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
local ffi = require('ffi')
|
|
local C = ffi.C
|
|
|
|
local function count_sockets()
|
|
local dns_socks = 0
|
|
local control_socks = 0
|
|
for _, socket in ipairs(net.list()) do
|
|
if socket.kind == 'control' then
|
|
control_socks = control_socks + 1
|
|
elseif (socket.kind == 'dns' or
|
|
socket.kind == 'xdp' or
|
|
socket.kind == 'tls' or
|
|
socket.kind == 'doh_legacy' or
|
|
socket.kind == 'doh2') then
|
|
dns_socks = dns_socks + 1
|
|
end
|
|
end
|
|
return dns_socks, control_socks
|
|
end
|
|
|
|
local n_dns_socks, n_control_socks = count_sockets()
|
|
|
|
-- Check and set control sockets path
|
|
worker.control_path = worker.control_path or (worker.cwd .. '/control/')
|
|
|
|
-- Bind to control socket by default
|
|
if n_control_socks == 0 and not env.KRESD_NO_LISTEN then
|
|
local path = worker.control_path..worker.pid
|
|
local ok, err = pcall(net.listen, path, nil, { kind = 'control' })
|
|
if not ok then
|
|
log_warn(C.LOG_GRP_NETWORK, 'bind to '..path..' failed '..err)
|
|
end
|
|
end
|
|
|
|
-- Listen on localhost
|
|
if n_dns_socks == 0 and not env.KRESD_NO_LISTEN then
|
|
local ok, err = pcall(net.listen, '127.0.0.1')
|
|
if not ok then
|
|
error('bind to 127.0.0.1@53 '..err)
|
|
end
|
|
-- Binding to other ifaces may fail
|
|
ok, err = pcall(net.listen, '127.0.0.1', 853)
|
|
if not ok then
|
|
log_info(ffi.C.LOG_GRP_NETWORK, 'bind to 127.0.0.1@853 '..err)
|
|
end
|
|
ok, err = pcall(net.listen, '::1')
|
|
if not ok then
|
|
log_info(ffi.C.LOG_GRP_NETWORK, 'bind to ::1@53 '..err)
|
|
end
|
|
ok, err = pcall(net.listen, '::1', 853)
|
|
if not ok then
|
|
log_info(ffi.C.LOG_GRP_NETWORK, 'bind to ::1@853 '..err)
|
|
end
|
|
-- Exit when kresd isn't listening on any interfaces
|
|
n_dns_socks, _ = count_sockets()
|
|
if n_dns_socks == 0 then
|
|
panic('not listening on any interface, exiting...')
|
|
end
|
|
end
|
|
-- Open cache if not set/disabled
|
|
if not cache.current_size then
|
|
cache.size = 100 * MB
|
|
end
|
|
|
|
-- If no addresses for root servers are set, load them from the default file
|
|
if C.kr_zonecut_is_empty(kres.context().root_hints) then
|
|
_hint_root_file()
|
|
end
|