Reputation: 59
I want to read from the stdin char by char and compare it with a different char using system-calls only, my problem is , given the code:
#include "util.h"
#define STDOUT 1
#define STDIN 1
#define SYS_READ 3
#define SYS_WRITE 4
#define SYS_OPEN 5
#define SYS_CLOSE 6
#define SYS_LSEEK 19
int main (int argc , char* argv[], char* envp[])
{
char str[512];
int fd;
if((fd= system_call(SYS_OPEN,STDIN,0, 0777))==-1){
system_call(SYS_WRITE,STDOUT,"stdin error", 11);
}
while((system_call(SYS_READ,fd, str,1))>0){
if((strncmp(";",str,1))==0){
system_call(SYS_WRITE,STDOUT,str, 1);
system_call(SYS_WRITE,STDOUT,"\n", 2);
}
else{
system_call(SYS_WRITE,STDOUT,str, 1);
}
}
return 0;
}
I have an Assembly file that turn this: "system_call(SYS_WRITE,STDOUT,"\n", 2);" to write(...);
now the problem is, I don't know how to make it wait for the input, so it never starts the while loop because it didn't read a thing from the input to begin with.
edit, the code to System-Call:
system_call:
push ebp ; Save caller state
mov ebp, esp
sub esp, 4 ; Leave space for local var on stack
pushad ; Save some more caller state
mov eax, [ebp+8] ; Copy function args to registers: leftmost...
mov ebx, [ebp+12] ; Next argument...
mov ecx, [ebp+16] ; Next argument...
mov edx, [ebp+20] ; Next argument...
int 0x80 ; Transfer control to operating system
mov [ebp-4], eax ; Save returned value...
popad ; Restore caller state (registers)
mov eax, [ebp-4] ; place returned value where caller can see it
add esp, 4 ; Restore caller state
pop ebp ; Restore caller state
ret ; Back to caller
I ended up fixing the problem with STDIN(define was off), and not defining a fd to receive the values and it ended up working, not sure why exactly still, I'm guessing fd was set non-blocking .
Upvotes: 2
Views: 819
Reputation: 15738
You defined STDIN as 1, when it should be 0. 1 is STDOUT, so you're trying to read from a file handle that's only for writing.
Upvotes: 2