C言語:ディレクトリ内のファイルをリストアップする(2)

昨日のプログラムに、サブディレクトリのファイルを再帰的にリストアップする -r オプションをつけてみた。

#include
#include
#include
#include
#include
#include

void listfiles(char *path, int recursive);
void joinpath(char *path, const char *path1, const char *path2);

int main(int argc, char **argv)
{
    char path[256];
    char result;
    int recursive = 0;

    while ((result = getopt(argc, argv, "r")) != -1) {
        switch(result) {
        case 'r':
            recursive = 1;
            break;
        case '?':
            exit(1);
        }
    }

    if (argc == optind) {
        strcpy(path, ".");
    } else {
        strcpy(path, argv[optind]);
    }

    listfiles(path, recursive);

    return 0;
}

void listfiles(char *path, int recursive)
{
    DIR *dir;
    struct dirent *dp;
    struct stat fi;
    char path2[256];

    dir = opendir(path);
    for (dp = readdir(dir); dp != NULL; dp = readdir(dir)) {
        if (dp->d_name[0] != '.') {
            joinpath(path2, path, dp->d_name);
            stat(path2, &fi);
            if (S_ISDIR(fi.st_mode)) {
                if (recursive) {
                    listfiles(path2, recursive);
                }
            } else {
                printf("%s\n", path2);
            }
        }
    }
    closedir(dir);

    return;
}

void joinpath(char *path, const char *path1, const char *path2)
{
    strcpy(path, path1);
    strcat(path, "/");
    strcat(path, path2);

    return;
}
takatoh@nightschool $ ./listfiles -r .
./stack/linkedlist.c
./stack/linkedlist.h
./stack/main.c
./listfiles
./fib.c
./btreesort.c
./linkedlist.c
./web_color_code.c
./strrand.c
./bmp/win-jpeg.bmp
./bmp/dog2.bmp
./bmp/bmp.c
./bmp/win-4.bmp
./bmp/win-16-1.bmp
./bmp/dog.bmp
./bmp/win-32-bf-888.bmp
./bmp/win-8.bmp
./bmp/win-32.bmp
./bmp/win-16-bf-324.bmp
./bmp/win-32-t.bmp
./bmp/win-16-t.bmp
./bmp/bmp.h
./bmp/os-4.bmp
./bmp/os-1.bmp
./bmp/win-32-bf-td.bmp
./bmp/win-1.bmp
./bmp/win-png.bmp
./bmp/win-8-td.bmp
./bmp/os-8.bmp
./bmp/os-24.bmp
./bmp/win-4-rle.bmp
./bmp/win-16.bmp
./bmp/win-32-bf-833.bmp
./bmp/Makefile
./bmp/win-24.bmp
./bmp/pic1.bmp
./bmp/win-8-rle.bmp
./bmp/bmpinfo.c
./code2rgb.c
./btree/btree.c
./btree/btree.h
./btree/main.c
./mergesort.c
./quicksort.c
./transhex.c
./heapsort.c
./filter.c
./greeting.c
./bubblesort.c
./listfiles.c