mirror of
				https://github.com/jart/cosmopolitan.git
				synced 2025-10-20 16:39:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- example of how to run the ls command
 | |
| -- and pipe its output to the http user
 | |
| local unix = require "unix"
 | |
| function main()
 | |
|    if GetHostOs() == 'WINDOWS' then
 | |
|       cmd = 'dir'
 | |
|    else
 | |
|       cmd = 'ls'
 | |
|    end
 | |
|    ls = assert(unix.commandv(cmd))
 | |
|    reader, writer = assert(unix.pipe(unix.O_CLOEXEC))
 | |
|    oldint = assert(unix.sigaction(unix.SIGINT, unix.SIG_IGN))
 | |
|    oldquit = assert(unix.sigaction(unix.SIGQUIT, unix.SIG_IGN))
 | |
|    oldmask = assert(unix.sigprocmask(unix.SIG_BLOCK, unix.Sigset(unix.SIGCHLD)))
 | |
|    child = assert(unix.fork())
 | |
|    if child == 0 then
 | |
|       unix.close(0)
 | |
|       unix.open("/dev/null", unix.O_RDONLY)
 | |
|       unix.close(1)
 | |
|       unix.dup(writer)
 | |
|       unix.close(2)
 | |
|       unix.open("/dev/null", unix.O_RDONLY)
 | |
|       unix.sigaction(unix.SIGINT, oldint)
 | |
|       unix.sigaction(unix.SIGQUIT, oldquit)
 | |
|       unix.sigprocmask(unix.SIG_SETMASK, oldmask)
 | |
|       unix.execve(ls, {ls, '-Shal'})
 | |
|       unix.exit(127)
 | |
|    else
 | |
|       unix.close(writer)
 | |
|       SetStatus(200)
 | |
|       SetHeader('Content-Type', 'text/plain')
 | |
|       while true do
 | |
|          data, err = unix.read(reader)
 | |
|          if data then
 | |
|             if data ~= '' then
 | |
|                Write(data)
 | |
|             else
 | |
|                break
 | |
|             end
 | |
|          elseif err:errno() ~= unix.EINTR then
 | |
|             Log(kLogWarn, 'read() failed: %s' % {tostring(err)})
 | |
|             break
 | |
|          end
 | |
|       end
 | |
|       unix.close(reader)
 | |
|       Log(kLogWarn, 'wait() begin')
 | |
|       unix.wait(-1)
 | |
|       Log(kLogWarn, 'wait() end')
 | |
|       unix.sigaction(unix.SIGINT, oldint)
 | |
|       unix.sigaction(unix.SIGQUIT, oldquit)
 | |
|       unix.sigprocmask(unix.SIG_SETMASK, oldmask)
 | |
|       return
 | |
|    end
 | |
| end
 | |
| main()
 |