walker.cxx
changeset 0 56281d90869c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/walker.cxx	Sat Feb 12 13:45:55 2011 +0300
@@ -0,0 +1,62 @@
+#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
\ No newline at end of file