File: nil-linux-amd64.asm
   1 ; The MIT License (MIT)
   2 ;
   3 ; Copyright (c) 2026 pacman64
   4 ;
   5 ; Permission is hereby granted, free of charge, to any person obtaining a copy
   6 ; of this software and associated documentation files (the "Software"), to deal
   7 ; in the Software without restriction, including without limitation the rights
   8 ; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   9 ; copies of the Software, and to permit persons to whom the Software is
  10 ; furnished to do so, subject to the following conditions:
  11 ;
  12 ; The above copyright notice and this permission notice shall be included in
  13 ; all copies or substantial portions of the Software.
  14 ;
  15 ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 ; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 ; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18 ; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 ; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20 ; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21 ; SOFTWARE.
  22 
  23 
  24 ; To compile this app for linux/amd64, use the commands
  25 ;
  26 ; nasm -f elf64 -o nil-linux-amd64.o nil-linux-amd64.asm
  27 ; ld -n -s nil-linux-amd64.o -o nil
  28 
  29 
  30 ; nil
  31 ;
  32 ; Emit nothing, while also discarding all bytes from the standard input, if
  33 ; data are being piped into it.
  34 
  35 
  36 stdin equ 0
  37 statbuf_size equ 32
  38 chunk_max_size equ 32 * 1024
  39 sys_read equ 0
  40 sys_fstat equ 5
  41 sys_exit equ 60
  42 
  43 section .text
  44 
  45 global _start
  46 
  47 _start:
  48 
  49 sub rsp, statbuf_size
  50 
  51 ; fstat(stdin, stat = rsp)
  52     mov rax, sys_fstat
  53     mov rdi, stdin
  54     mov rsi, rsp
  55     syscall
  56 
  57 cmp rax, 0
  58 jne fail
  59 
  60 mov al, [rsp+8]
  61 cmp al, 3
  62 jne piped
  63 
  64 add rsp, statbuf_size
  65 
  66 quit:
  67 
  68 ; exit(0)
  69     mov rax, sys_exit
  70     mov rdi, 0
  71     syscall
  72 
  73 fail:
  74 
  75 ; exit(1)
  76     mov rax, sys_exit
  77     mov rdi, 1
  78     syscall
  79 
  80 piped:
  81 
  82 add rsp, statbuf_size
  83 sub rsp, chunk_max_size
  84 mov rbx, rsp
  85 
  86 discard_stdin:
  87     push rbx
  88 
  89     ; read(stdin, buf = rbx, size = chunk_max_size)
  90         mov rax, sys_read
  91         mov rdi, stdin
  92         mov rsi, rbx
  93         mov rdx, chunk_max_size
  94         syscall
  95 
  96     pop rbx
  97 
  98     cmp rax, -1
  99     je fail
 100     cmp rax, 0
 101     je quit
 102 
 103     jmp discard_stdin