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() rc, 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 if rc ~= 0 then unix.close(fd) return end -- 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') unix.write(fd, '\r\n') unix.write(fd, string.format('failed: %s\r\n', EscapeHtml(VisualizeControlCodes(unix:strerror(err))))) unix.write(fd, '
\r\n') end -- terminate unix.close(fd) unix.exit(0) end main()