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('redbean unix module\r\n') Write('

\r\n') Write('\r\n') Write('redbean unix demo\r\n') Write(' error\r\n') 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('redbean unix module\r\n') Write('

\r\n') Write('\r\n') Write('redbean unix demo\r\n') Write(string.format(' %s\r\n', unix.strerrno(errno))) 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, 'redbean unix module') unix.write(fd, '

\r\n') unix.write(fd, '\r\n') unix.write(fd, 'redbean unix demo\r\n') unix.write(fd, ' success\r\n') unix.write(fd, '

\r\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, '

listing of current directory

\r\n') dir, err = unix.opendir('.') if dir then unix.write(fd, '\r\n') else 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()