#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