walker.cxx
author Stiletto <blasux@blasux.ru>
Sat, 18 Jun 2011 16:12:00 +0400
changeset 8 c9b4af5f3122
parent 0 56281d90869c
permissions -rw-r--r--
cos hellper script
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     1
#include <sys/types.h>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     2
#include <sys/param.h>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     3
#include <dirent.h>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     4
#include <cerrno>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     5
#include <cassert>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     6
#include <cstdio>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     7
#include <cstring>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     8
#include <string>
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
     9
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    10
#include "walker.h"
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    11
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    12
MagicWalker::MagicWalker(const std::string root) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    13
    this->root = root;
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    14
    magic = magic_open(MAGIC_MIME_TYPE);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    15
    magic_load(magic,NULL);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    16
}
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    17
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    18
int MagicWalker::HandleDir(const char *dirname) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    19
    DIR *d = opendir(dirname);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    20
    if(!d) return errno;
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    21
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    22
    struct dirent *de;
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    23
    while (de=readdir(d)) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    24
        if(strcmp(de->d_name,".") && strcmp(de->d_name,"..")) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    25
            //printf("%s/%s -- %d\n",dirname,de->d_name,de->d_type);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    26
            char next[MAXPATHLEN+1];
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    27
            snprintf(next,MAXPATHLEN,"%s/%s",dirname,de->d_name);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    28
            if (de->d_type&DT_DIR)
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    29
                HandleDir(next);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    30
            else if (de->d_type&DT_REG)
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    31
                HandleFile(next);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    32
            else
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    33
                printf("%d %d\n",DT_REG,de->d_type);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    34
        }
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    35
    }
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    36
    closedir(d);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    37
    return 0;
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    38
}
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    39
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    40
const char *MagicWalker::GetFileMagic(const char *fname) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    41
    return magic_file(magic,fname);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    42
}
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    43
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    44
int MagicWalker::HandleFile(const char *fname) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    45
    const char *rest = GetFileMagic(fname);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    46
    if (rest)
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    47
        printf("%s\nMIMETYPE=%s\n\n",fname,rest);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    48
    else
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    49
        printf("%s\nMIMETYPE=\n\n",fname);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    50
    return 0;
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    51
}
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    52
        
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    53
MagicWalker::~MagicWalker () {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    54
    magic_close(magic);
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    55
}
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    56
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    57
#ifdef MAIN_WALKER
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    58
int main(int argc, char *argv[]) {
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    59
    MagicWalker f("/home/media/music");
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    60
    f.Run();
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    61
}
56281d90869c Initial commit
Stiletto <blasux@blasux.ru>
parents:
diff changeset
    62
#endif