local unix = require 'unix' local function main() if GetMethod() ~= 'GET' and GetMethod() ~= 'HEAD' then ServeError(405) SetHeader('Allow', 'GET, HEAD') return end if IsClientUsingSsl() then SetStatus(400) SetHeader('Content-Type', 'text/html; charset=utf-8') Write('\r\n') Write('
The redbean unix module demo needs to intercept a raw unix socket. It's hard to do that if your file descriptor is encrypted with TLS. Please reload this page using http:// rather than https://.
]]) Write('\r\n') return end -- steal client from redbean fd = GetClientFd() -- this function returns twice pid, errno = unix.fork() if errno then SetStatus(400) SetHeader('Content-Type', 'text/html; charset=utf-8') Write('\r\n') Write('Your redbean doesn't have the ability to fork. Most likely because you enabled sandboxing and fork() isn't in your bpf policy.
]]) Write('\r\n') return end -- the parent process gets the pid if pid ~= 0 then unix.close(fd) return end -- if pid is zero then we're the child -- turn into a daemon unix.umask(0) unix.setsid() if unix.fork() > 0 then unix.exit(0) end unix.close(0) unix.open('/dev/null', unix.O_RDONLY) unix.close(1) unix.open('/dev/null', unix.O_WRONLY) efd = unix.open('/tmp/redbean-unix.log', unix.O_WRONLY | unix.O_CREAT | unix.O_TRUNC, 0600) unix.dup(efd, 2) unix.close(efd) unix.sigaction(unix.SIGHUP, unix.SIG_DFL) unix.sigaction(unix.SIGINT, unix.SIG_DFL) unix.sigaction(unix.SIGQUIT, unix.SIG_DFL) unix.sigaction(unix.SIGTERM, unix.SIG_DFL) unix.sigaction(unix.SIGUSR1, unix.SIG_DFL) unix.sigaction(unix.SIGUSR2, unix.SIG_DFL) unix.sigaction(unix.SIGCHLD, unix.SIG_DFL) -- communicate with client unix.write(fd, 'HTTP/1.0 200 OK\r\n' .. 'Connection: close\r\n' .. 'Date: '.. FormatHttpDateTime(GetDate()) ..'\r\n' .. 'Content-Type: text/html; charset=utf-8\r\n' .. 'Server: redbean unix\r\n' .. '\r\n') unix.write(fd, '\n') unix.write(fd, '\r\n') unix.write(fd, 'your lua code just stole control of your http client\r\n') unix.write(fd, 'socket file descriptor from redbean server, and then\r\n') unix.write(fd, 'became an autonomous daemon reparented on your init!\r\n') unix.write(fd, '
\r\n') -- terminate unix.close(fd) unix.exit(0) end main()