;Copyright (C) 1999 Dmitry Bakhvalov
;
;$Id: id.asm,v 1.6 2001/08/14 18:55:38 konst Exp $
;
;hackers' id
;
;0.01: 25-Oct-1999 initial release
;0.02: 07-Apr-2000 squeezed few bytes (KB)
;0.03: 11-Aug-2001 added groups=list (JH)
;
;syntax: id
; No options so far.
;
; Always returns 0
;
%include "system.inc"
CODESEG
START:
sys_getuid
mov ebx,"uid="
call print_stuff
sys_getgid
mov bl,'g' ; ebx="gid="
call print_stuff
call .groups
mov cl,10 ; print "\n"
push ecx
sys_write STDOUT,esp,1
sys_exit_true
.groups: ;*** Get GROUPS
sys_getgroups 64, groups
mov ebp, eax
mov dl, 7 ; Looks like a bug, but it works.
mov ecx, gstuff
sys_write STDOUT
mov esi, groups
or ebp, ebp
jz .nogroups
.forallgroups:
mov edi, num_buf
push edi
mov ax, [esi]
inc esi
inc esi
call bin_to_dec
dec ebp
or ebp, ebp
jz .nocomma
mov al, ','
stosb
.nocomma:
mov edx, edi
pop ecx
sub edx, ecx
sys_write STDOUT
or ebp, ebp
jnz .forallgroups
.nogroups:
ret
print_stuff:
pushad
test eax,eax
js .error
mov edi,num_buf
push edi ; save num_buf
push ebx ; save "uid="
call bin_to_dec
mov al,9
stosb
pop ebx ; restore "uid="
push ebx ; put "uid=" on the stack
mov ecx,esp ; point ecx to it
mov dl,4 ; len=4
sys_write STDOUT ; write
pop ebx ; restore stack
pop esi ; restore num_buf
mov ecx,esi ; save it in ecx
mov edx,edi
sub edx,ecx
; ecx already holds string, edx holds strlen
sys_write STDOUT
.error:
popad
ret
bin_to_dec: ; Pointer to num_buf in edi, number in eax
xor ecx,ecx
mov ebx,ecx
mov bl,10
.div_again:
xor edx,edx
div ebx
add dl,'0'
push edx
inc ecx
test eax,eax
jnz .div_again
.keep_popping:
pop eax
stosb
loop .keep_popping
ret
gstuff db 'groups='
UDATASEG
groups: resw 64
num_buf: resb 16
END