Re: help with sys_stat

Frank Kotler <[email protected]>
Newsgroups org.kernel.vger.linux-assembly
Message-ID <[email protected]>
Niel A wrote:
> hey guys! it's me again (with another useless program! hehehehe)

They're *all* useless... until you put the pieces together to do 
something useful. (This is on my to-do list...)

> actually.. i have two problems.. how to use struc in nasm.. and how to determine if a file is a directory...
> 
> i'm totally clueless about this .. so i used struc straightforward in segment. bss based on struct stat in /usr/include/asm/stat.h
> 
> segment .bss
> struc stat

This can go anywhere - like a "%define", it doesn't generate any code. 
It's a "typedef". An instance of your struc would want to go in .data, 
if it's initialized, or in .bss if you just want to reserve space for it 
(this case, I think)... If you "%include 'system.inc'" from asmutils, 
you've *got* the "typedef"...

my_stat_buf resb stat_size


> 	.st_dev	resw		1
> 	-- snip --
...     .??? resw               1
...     .??? resd               1
...     .st_mode resw           1  ; <- this one!
> endstruc
> 
> ? but somehow, i think that i should make a struc somewhere at the beginning .. like a prototype of some sort and use it's name in segment .bss intead.

You probably want both. The "typedef" anyplace, and an instance in .bss.

> so far, i have a filename in edi and i call stat like ..
> 	mov eax, 106	; stat
> 	mov ebx, edi	; file
> 	mov ecx, stat

This may be a problem. You want some memory (stat_size bytes) to point 
this at. Just "struc" doesn't allocate memory - you'd want "istruc", or 
"stat_size" reserved in .bss, or just subtract it from esp...

> 	int 80h
> 
> any suggestions on this one ? i'm reading asmutil's "rm" alongside making my own program.. but i'm only interested in determining if a given filename is a directory or not. do i also have to deal with trailing slashes in directory names?? 

I think not. Once you've got the buffer filled, you can just test "mybuf 
+ stat.st_mode" for the directory bit. Note that C gives these in 
octal!!! "NNNNq" for nasm...

This is pretty crude...

     mov eax, 106  ; sys_stat
     lea ebx, [edi + 10]         ; filename
     sub esp, 64                 ; stat_size
     mov ecx, esp
     int 80h

     test dword [ecx + 8], 40000q
     jz notsubdir
     ...
(don't forget to add stat_size back onto the stack to "free" the buffer, 
if you do it this way!)

Soon, we'll tackle some "time" functions and figure out what in hell 
timezone you're in :)

Best,
Frank
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.