Ó sir_atmt, já é muito tarde, os teus olhos já estão cansados.
O problema é simplesmente que não estás a passar ao stat() o pathname completo.
Repara, eu percorro o directório /home/abc e tenho lá os ficheiros ".", "..", "bcd" e "cde". Eu tenho que fazer stat é de "/home/abc/bcd" e de "/home/abc/cde", tu estás a fazer stat de "bcd" e de "cde", como queres que ele adivinhe os directórios onde eles estão?
Vais ter de concatenar estes nomes com o do directório inicial. E vai surgir-te um caso especial/ excepção. No caso geral tens de concatenar "/home/abc" com "/" e com "cde", excepto quando o directório inicial é "/home/abc/" ou "/"; neste caso seria só "/" com "cde". Agora, a informação que aproveito para te dar é que não faz mal teres duas barras de seguida, "/home/abc//cde" é a mesma coisa que "/home/abc/cde", ou seja, não precisas de ter um caso especial.
Tenho ainda que te dizer que o readdir é um bocado obsoleto. Hoje em dia temos de partir do princípio que o programa vai ser multithreaded mais cedo ou mais tarde. Ora, o readdir() devolve-te um ponteiro para um buffer estático interno e por isso é não-reentrant; não pode ser usado num programa multithreaded ou numa função recursiva (ou nalgumas).
Habitua-te desde já a usar o equivalente reentrant readdir_r(). E quem diz essa, diz também localtime_r, etc, etc...
Bom sono.
PS: a constante que tem a dimensão máxima de um pathname é PATH_MAX e está definida em unistd.h