#include #include #include /* * readdir fills up the buffer with the readdir system call. it also * gives a third parameter (currently ignored, but should be 1) that * can with a future kernel be enhanced to be the number of entries * to be gotten. * * Right now the readdir system call return the number of characters * in the name - in the future it will probably return the number of * entries gotten. No matter - right now we just check for positive: * that will always work (as we know that it cannot be bigger than 1 * in the future: we just asked for one entry). */ struct dirent *readdir(DIR * dir) { int result; int count = NUMENT; if (!dir) { errno = EBADF; return NULL; } if (dir->dd_size <= dir->dd_loc) { /* read count of directory entries. For now it should be one. */ #if defined(__PIC__) || defined (__pic__) __asm__ volatile ("pushl %%ebx\n\t" "movl %%esi,%%ebx\n\t" "int $0x80\n\t" "popl %%ebx" :"=a" (result) :"0" (SYS_readdir),"S" (dir->dd_fd), "c" ((long) dir->dd_buf),"d" (count)); #else __asm__ ("movel %2,d1\n\t" "movel %3,d2\n\t" "movel %4,d3\n\t" "movel %1,d0\n\t" "trap #0\n\t" "movel d0,%0" : "=g" (result) : "i" (SYS_readdir), "g" (dir->dd_fd), "g" (dir->dd_buf), "g" (count) : "d0", "d1", "d2", "d3" ); #endif if (result <= 0) { if (result < 0) errno = -result; return NULL; } /* * Right now the readdir system call return the number of * characters in the name - in the future it will probably return * the number of entries gotten. No matter - right now we just * check for positive: */ #if 0 dir->dd_size = result; #else dir->dd_size = 1; #endif dir->dd_loc = 0; } return &(dir->dd_buf [(dir->dd_loc)++]); }