walker.cxx
author Stiletto <blasux@blasux.ru>
Sat, 12 Feb 2011 15:10:08 +0300
changeset 3 38269b62d856
parent 0 56281d90869c
permissions -rw-r--r--
colon fix, scanscript

#include <sys/types.h>
#include <sys/param.h>
#include <dirent.h>
#include <cerrno>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <string>

#include "walker.h"

MagicWalker::MagicWalker(const std::string root) {
    this->root = root;
    magic = magic_open(MAGIC_MIME_TYPE);
    magic_load(magic,NULL);
}

int MagicWalker::HandleDir(const char *dirname) {
    DIR *d = opendir(dirname);
    if(!d) return errno;

    struct dirent *de;
    while (de=readdir(d)) {
        if(strcmp(de->d_name,".") && strcmp(de->d_name,"..")) {
            //printf("%s/%s -- %d\n",dirname,de->d_name,de->d_type);
            char next[MAXPATHLEN+1];
            snprintf(next,MAXPATHLEN,"%s/%s",dirname,de->d_name);
            if (de->d_type&DT_DIR)
                HandleDir(next);
            else if (de->d_type&DT_REG)
                HandleFile(next);
            else
                printf("%d %d\n",DT_REG,de->d_type);
        }
    }
    closedir(d);
    return 0;
}

const char *MagicWalker::GetFileMagic(const char *fname) {
    return magic_file(magic,fname);
}

int MagicWalker::HandleFile(const char *fname) {
    const char *rest = GetFileMagic(fname);
    if (rest)
        printf("%s\nMIMETYPE=%s\n\n",fname,rest);
    else
        printf("%s\nMIMETYPE=\n\n",fname);
    return 0;
}
        
MagicWalker::~MagicWalker () {
    magic_close(magic);
}

#ifdef MAIN_WALKER
int main(int argc, char *argv[]) {
    MagicWalker f("/home/media/music");
    f.Run();
}
#endif