несколько раз я вижу, что функции определены ниже:
read_dir(dir)
char *dir;
{
DIR * dirp;
struct dirent *d;
/* open directory */
dirp = opendir(dir);
......... so on
вот в чем важность утверждения
char *dir;
что такое намерение за объявлением указателя вскоре после имени функции, а затем запуск тела функции.