From: Thomas J. <fa...@ap...> - 2002-02-05 12:51:32
|
Update of /var/lib/cvs/mindex In directory apollo:/tmp/cvs-serv26823 Modified Files: scanner.h scanner.cpp mediaList.h mediaList.cpp md5.h md5.cpp indexer.cpp Log Message: - added CSV export - improved cmdline parsing - ... more. Index: scanner.h =================================================================== RCS file: /var/lib/cvs/mindex/scanner.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- scanner.h 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ scanner.h 5 Feb 2002 12:49:44 -0000 1.2 @@ -1 +1,8 @@ -int scan_directory(char* directory, mediaList &FileList); +struct genericFile { + char name[_MAX_FNAME + _MAX_EXT]; + char directory[_MAX_PATH]; + long int size; + struct genericFile *next; +}; + +int scan_directory(char* directory, mediaList &FileList); \ No newline at end of file Index: scanner.cpp =================================================================== RCS file: /var/lib/cvs/mindex/scanner.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- scanner.cpp 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ scanner.cpp 5 Feb 2002 12:49:44 -0000 1.2 @@ -1,60 +1,62 @@ -#include <io.h> -#include <direct.h> -#include <iostream> -#include "mediaList.h" -#include "scanner.h" -using namespace std; - -int scan_directory(char* directory, mediaList &FileList) -{ - struct _finddata_t a_file; - long hFile; - - - if (_chdir(directory)!= 0) { - cout << "Error changing into Directory: " << directory << " - skipping." << endl; - return 1; - } - if (strlen(directory) < 80) cout << directory << endl; - else { - char* tmpdir = (char*) malloc(77); memset(tmpdir, '\0', 77); - strncpy(tmpdir, directory, 76); - cout << tmpdir << "..." << endl; - free(tmpdir); - } - - if( (hFile = _findfirst( "*.*", &a_file )) == -1L ) - cout << "Empty Directory.\n"; - else { - - if ( a_file.attrib & _A_SUBDIR ) { - if ( ! ( !(strcmp(a_file.name, ".")) || !(strcmp(a_file.name, "..")))) { - char *buffer = (char*) malloc( strlen(directory)+strlen(a_file.name)+2 ); - strcpy(buffer, directory); strcat(buffer, a_file.name); strcat(buffer, "/"); - cout << endl; - scan_directory(buffer, FileList); //be recursive - free(buffer); - } - } else { - // Add the File to the Database here... - FileList.prepend(a_file.name, directory, a_file.size); - } - - while( _findnext( hFile, &a_file ) == 0 ) - { - if ( a_file.attrib & _A_SUBDIR ) { - if ( !(strcmp(a_file.name, ".")) || !(strcmp(a_file.name, ".."))) continue; - char *buffer = (char*) malloc( strlen(directory)+strlen(a_file.name)+2 ); - strcpy(buffer, directory); strcat(buffer, a_file.name); strcat(buffer, "/"); - cout << endl; - scan_directory(buffer,FileList); //be recursive - free(buffer); - } else { - // Add the File to the Database here... - FileList.prepend(a_file.name, directory, a_file.size); - } - } - _findclose( hFile ); - } - return 0; -} +#include <io.h> +#include <direct.h> +#include <iostream> +#include "mediaList.h" +#include "scanner.h" +using namespace std; + +int scan_directory(char* directory, mediaList &FileList) +{ + struct _finddata_t a_file; + long hFile; + + + if (_chdir(directory)!= 0) { + cout << "Error changing into Directory: " << directory << " - skipping." << endl; + return 1; + } + if (strlen(directory) < 80) cout << directory << endl; + else { + char* tmpdir = (char*) malloc(77); memset(tmpdir, '\0', 77); + strncpy(tmpdir, directory, 76); + cout << tmpdir << "..." << endl; + //free(tmpdir); + } + + if( (hFile = _findfirst( "*.*", &a_file )) == -1L ) + cout << "Empty Directory.\n"; + else { + + if ( a_file.attrib & _A_SUBDIR ) { + if ( ! ( !(strcmp(a_file.name, ".")) || !(strcmp(a_file.name, "..")))) { + char *buffer = (char*) malloc( strlen(directory)+strlen(a_file.name)+2 ); + strcpy(buffer, directory); strcat(buffer, a_file.name); strcat(buffer, "/"); + cout << endl; + scan_directory(buffer, FileList); //be recursive + // free(buffer); + } + } else { + // Add the File to the Database here... + //if (a_file.attrib & 0x0008) cout << "found a volume ID!" << endl; + FileList.prepend(a_file.name, directory, a_file.size); + } + + while( _findnext( hFile, &a_file ) == 0 ) + { + if ( a_file.attrib & _A_SUBDIR ) { + if ( !(strcmp(a_file.name, ".")) || !(strcmp(a_file.name, ".."))) continue; + char *buffer = (char*) malloc( strlen(directory)+strlen(a_file.name)+2 ); + strcpy(buffer, directory); strcat(buffer, a_file.name); strcat(buffer, "/"); + cout << endl; + scan_directory(buffer,FileList); //be recursive + //free(buffer); + } else { + // Add the File to the Database here... + //if (a_file.attrib & 0x0008) cout << "found a volume ID!" << endl; + FileList.prepend(a_file.name, directory, a_file.size); + } + } + _findclose( hFile ); + } + return 0; +} Index: mediaList.h =================================================================== RCS file: /var/lib/cvs/mindex/mediaList.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- mediaList.h 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ mediaList.h 5 Feb 2002 12:49:44 -0000 1.2 @@ -1,32 +1,25 @@ - -#ifndef _MAX_FNAME - #include <limits.h> - #define _MAX_FNAME NAME_MAX - #define _MAX_PATH PATH_MAX - #define _MAX_EXT 0 -#endif - -class mediaList -{ - public: - void prepend(char inName[_MAX_FNAME+_MAX_EXT], char path[_MAX_PATH], unsigned long size); - void del(); - void print(); - mediaList(); - ~mediaList(); - - private: - - double OverallSize; - - struct list_element { - char* FileName; - char* FilePath; - int size; - char* sig; - list_element* next; - }; - list_element *anchor; - - void md5(list_element* &t); -}; +class mediaList +{ + public: + void prepend(char inName[_MAX_FNAME+_MAX_EXT], char path[_MAX_PATH], unsigned long size); + void saveToCSV(char* toFile); + void del(); + void print(); + mediaList(); + ~mediaList(); + + private: + + double OverallSize; + + struct list_element { + char* FileName; + char* FilePath; + int size; + char* sig; + list_element* next; + }; + list_element *anchor; + + void md5(list_element* &t); +}; \ No newline at end of file Index: mediaList.cpp =================================================================== RCS file: /var/lib/cvs/mindex/mediaList.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- mediaList.cpp 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ mediaList.cpp 5 Feb 2002 12:49:44 -0000 1.2 @@ -1,156 +1,164 @@ -#include <iostream> -#include <iomanip> -#ifdef _WIN32 - #include <io.h> -#else - #include <stdio.h> - #include <stdlib.h> -#endif -#include <errno.h> -#include <fcntl.h> -#include <memory.h> -#include "mediaList.h" -#include "md5.h" -using namespace std; - -/* - * Constructor - initialize anchor and osize - */ -mediaList::mediaList() -{ - anchor = NULL; - OverallSize=0; -} - -/* - * prepend(...) - prepend an entry to the SLL (behind the upmost entry) - */ -void mediaList::prepend(char inName[_MAX_FNAME+_MAX_EXT], char path[_MAX_PATH], unsigned long size) -{ - list_element *t = new list_element(); - t->next = anchor; //throw the anchor onto our backman's ship - - t->FileName = (char*) malloc(strlen(inName)); - strcpy(t->FileName, inName); - t->FilePath = (char*) malloc(strlen(path)); - strcpy(t->FilePath,path); - - t->size = size; - OverallSize += (size/1048576); //that's 1024^2 --> we get MB. - - md5(t); - anchor=t; //prepare to receive an anchor soon ^.^ -} - - - -/* - * print() - Spit out what you have - */ -void mediaList::print() -{ - list_element *t = anchor; - while (t != 0) { - cout << setw(10) << setfill(' ') << t->FileName << setw(10) << setfill(' ') << t->FilePath << setw(5) << setfill(' ') << t->size << setw(32) << setfill(' ') << t->sig << endl; - t=t->next; - } - cout.precision(2); - cout << endl << "Overall Size: " << OverallSize << " MB" << endl; -} - - - - -/* - * md5 -> generate MD5 Hash of a given list_element (=file) - */ -void mediaList::md5(list_element* &t) -{ - const int BUFFSIZE = 16384; - FILE *in = NULL; - int i; - unsigned char buffer[BUFFSIZE], signature[16]; - struct MD5Context md5c; - - char* result = (char*) malloc(32); - char* cp = (char*) malloc(strlen(t->FileName)+strlen(t->FilePath)); - - strcpy(cp, t->FilePath); - strcat(cp, t->FileName); - - if ((in = fopen(cp, "rb")) == NULL) { - cout << endl << "Cannot open input file " << cp << endl; - cout << "Error: " << strerror(errno) << endl; - result = "00000000000000000000000000000000"; - } else { - - - #ifdef _WIN32 - _setmode(_fileno(in), _O_BINARY); //oh gosh, i hate windows - #endif - - MD5Init(&md5c); - - const int TERMWIDTH = 38; - float needed=t->size/BUFFSIZE; - if (needed<1) needed = 1; - int cnt=1; - float done=0; - - char* shortFileName; - if (strlen(t->FileName) > 38) { - shortFileName = (char*) malloc(39); - memset(shortFileName, '\0', 39); - strncpy(shortFileName, t->FileName, 35); - strcat(shortFileName, "..."); - } else { - shortFileName = (char*) malloc(strlen(t->FileName)); - strcpy(shortFileName, t->FileName); - } - - while ((i = fread(buffer, 1, sizeof(buffer), in)) > 0) { - done = ((TERMWIDTH/needed) * (float)cnt); - if (done <= TERMWIDTH) { - cout << "\r|"; - for (int n=0; n < done; n++) cout << "*"; - for (float m=((TERMWIDTH-1)-done); m > 0; m--) cout << " "; - cout.fill(' '); - cout << "| " << setw(38) << shortFileName; - } - MD5Update(&md5c, buffer, (unsigned) i); - cnt++; - } - - MD5Final(signature, &md5c); - fclose(in); - - SigToString(signature, result); - } - - t->sig = (char*) malloc(32); //had big problems finding THIS Bug... was an nonallocatedarray o_O - strcpy(t->sig, result); -} - - - - -/* - * Delete an entry (the upmost) of the SLL - */ -void mediaList::del() -{ - list_element *t = anchor; - if(t) { - anchor = t->next; - delete t; - } -} - -/* - * Just a destructor. (nice cleanup ^-^) - */ -mediaList::~mediaList() -{ - while(anchor) del(); -} - +#include <iostream> +#include <fstream> +#include <iomanip> +#include <io.h> +#include <fcntl.h> +#include "mediaList.h" +#include "md5.h" +using namespace std; + +/* + * Constructor - initialize anchor and osize + */ +mediaList::mediaList() +{ + anchor = NULL; + OverallSize=0; +} + +/* + * prepend(...) - prepend an entry to the SLL (behind the upmost entry) + */ +void mediaList::prepend(char inName[_MAX_FNAME+_MAX_EXT], char path[_MAX_PATH], unsigned long size) +{ + list_element *t = new list_element(); + t->next = anchor; //throw the anchor onto our backman's ship + + t->FileName = (char*) malloc(strlen(inName)); + strcpy(t->FileName, inName); + t->FilePath = (char*) malloc(strlen(path)); + strcpy(t->FilePath,path); + + t->size = size; + OverallSize += (size/1048576); //that's 1024^2 --> we get MB. + + md5(t); + anchor=t; //prepare to receive an anchor soon ^.^ +} + + + +/* + * print() - Spit out what you have + */ +void mediaList::print() +{ + list_element *t = anchor; + while (t != 0) { + cout << setw(10) << setfill(' ') << t->FileName << setw(10) << setfill(' ') << t->FilePath << setw(5) << setfill(' ') << t->size << setw(32) << setfill(' ') << t->sig << endl; + t=t->next; + } + cout.precision(2); + cout << endl << "Overall Size: " << fixed << OverallSize << " MB" << endl; +} + + +/* + * saveToCSV(filename) - Save the gathered information to a csv file + */ +void mediaList::saveToCSV(char* toFile) +{ + ofstream* outFile = new ofstream(toFile); + *outFile << "### generated by MediaIndexer 0.1" << endl; + + list_element *t = anchor; + while (t != 0) { + *outFile << "\"" << t->FileName << "\",\""<< t->FilePath << "\"," << t->size << "," << t->sig << endl; + t=t->next; + } + + outFile->close(); +} + +/* + * md5 -> generate MD5 Hash of a given list_element (=file) + */ +void mediaList::md5(list_element* &t) +{ + const int BUFFSIZE = 16384; + FILE *in = NULL; + int i; + unsigned char buffer[BUFFSIZE], signature[16]; + struct MD5Context md5c; + + char* result = (char*) malloc(32); + char* cp = (char*) malloc(strlen(t->FileName)+strlen(t->FilePath)); + + strcpy(cp, t->FilePath); strcat(cp, t->FileName); + + if ((in = fopen(cp, "rb")) == NULL) { + //cout << endl << "Cannot open input file " << t->FileName << endl; + //cout << "Error: " << strerror(errno) << endl; + result = "00000000000000000000000000000000"; + } else { + + + #ifdef _WIN32 + _setmode(_fileno(in), _O_BINARY); //oh gosh, i hate windows + #endif + + MD5Init(&md5c); + + const int TERMWIDTH = 38; + float needed=t->size/BUFFSIZE; + if (needed<1) needed = 1; + int cnt=1; + float done=0; + + char* shortFileName; + if (strlen(t->FileName) > 38) { + shortFileName = (char*) malloc(39); + memset(shortFileName, '\0', 39); + strncpy(shortFileName, t->FileName, 35); + strcat(shortFileName, "..."); + } else { + shortFileName = (char*) malloc(strlen(t->FileName)); + strcpy(shortFileName, t->FileName); + } + + while ((i = fread(buffer, 1, sizeof(buffer), in)) > 0) { + done = ((TERMWIDTH/needed) * (float)cnt); + if (done <= TERMWIDTH) { + cout << "\r|"; + for (int n=0; n < done; n++) cout << "*"; + for (float m=((TERMWIDTH-1)-done); m > 0; m--) cout << " "; + cout.fill(' '); + cout << "| " << left << setw(38) << shortFileName; + } + MD5Update(&md5c, buffer, (unsigned) i); + cnt++; + } + + MD5Final(signature, &md5c); + fclose(in); + + SigToString(signature, result); + } + + t->sig = (char*) malloc(32); //had big problems finding THIS Bug... was an nonallocatedarray o_O + strcpy(t->sig, result); +} + + + + +/* + * Delete an entry (the upmost) of the SLL + */ +void mediaList::del() +{ + list_element *t = anchor; + if(t) { + anchor = t->next; + delete t; + } +} + +/* + * Just a destructor. (nice cleanup ^-^) + */ +mediaList::~mediaList() +{ + while(anchor) del(); +} + Index: md5.h =================================================================== RCS file: /var/lib/cvs/mindex/md5.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- md5.h 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ md5.h 5 Feb 2002 12:49:44 -0000 1.2 @@ -8,11 +8,11 @@ uint32 bits[2]; unsigned char in[64]; }; - -extern void MD5Init(struct MD5Context *ctx); -extern void MD5Update(struct MD5Context *ctx, unsigned char *buf, unsigned len); -extern void MD5Final(unsigned char digest[16], struct MD5Context *ctx); + +extern void MD5Init(struct MD5Context *ctx); +extern void MD5Update(struct MD5Context *ctx, unsigned char *buf, unsigned len); +extern void MD5Final(unsigned char digest[16], struct MD5Context *ctx); extern void MD5Transform(uint32 buf[4], uint32 in[16]); -extern void SigToString(unsigned char sig[], char *&result); +extern void SigToString(unsigned char sig[], char *&result); #endif /* !MD5_H */ Index: md5.cpp =================================================================== RCS file: /var/lib/cvs/mindex/md5.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- md5.cpp 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ md5.cpp 5 Feb 2002 12:49:44 -0000 1.2 @@ -1,8 +1,6 @@ #include <memory.h> #include "md5.h" #include <iostream> -#include <stdlib.h> -#include <stdio.h> using namespace std; #ifdef sgi @@ -42,7 +40,7 @@ strcat(result, out); } - free(out); +// free(out); } /* Index: indexer.cpp =================================================================== RCS file: /var/lib/cvs/mindex/indexer.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- indexer.cpp 5 Feb 2002 12:42:12 -0000 1.1.1.1 +++ indexer.cpp 5 Feb 2002 12:49:44 -0000 1.2 @@ -1,78 +1,112 @@ -/* - * MediaIndexer - Where the hell is <any_filename_here>... ^-^ - * - * written by Thomas Jakobi aka FAKE 2002 - * Version: 0 (pre-alpha) - * Based on a lot pd work i read through.... thanks! - */ - -#include <iostream> -#ifdef _WIN32 - #include <direct.h> -#endif -#include <stdlib.h> -#include "mediaList.h" -#include "scanner.h" -using namespace std; - -int main(int argc, char** argv) -{ - - if (argc < 2) { - #ifdef _WIN32 - cout << endl << "Usage: " << argv[0] << " [-D Drive] <directory>" << endl; - cout << "Example: " << argv[0] << " (-DC) /videos" << endl; - #else - cout << endl << "Usage: " << argv[0] << " <directory>" << endl; - cout << "Example: " << argv[0] << " /opt/something" << endl; - #endif - return 1; - } - - char* directory_to_scan; - - #ifdef _WIN32 - int curdrive = _getdrive(); - if (memcmp(argv[1], "-D",2)==0) { - int drivetoindex = argv[1][2]; - //switch to specified drive - if (drivetoindex > 90) drivetoindex -= 32; //cheap conversion (strupr ^-^); - cout << "You wanted to index drive: " << (char) drivetoindex << endl; - drivetoindex -= 64; _chdrive(drivetoindex); - - directory_to_scan = (char*) malloc(strlen(argv[2])); - strcpy(directory_to_scan, argv[2]); - } else { - directory_to_scan = (char*) malloc(strlen(argv[1])); - strcpy(directory_to_scan, argv[1]); - } - #else - directory_to_scan = (char*) malloc(strlen(argv[1])); - strcpy(directory_to_scan, argv[1]); - #endif - - mediaList FileList; - - - scan_directory(directory_to_scan, FileList); - cout << endl << endl << "processing files finished." << endl; - - /*char* Name = (char*) malloc(256); - char* Storage = (char*) malloc(256); - memset(Name, 0, 256);memset(Storage, 0, 256); - cout << "Name the Media: [255] "; cin.getline(Name,255); - cout << endl << "And where you will put it now: [255] " ; - cin.getline(Storage,255);cout << endl; - *outfile << "\"" << Name << "\",\"" << Storage << "\"," << "foo" << endl; - free(Storage); free(Name); */ - - //verkettete liste ausgeben: - FileList.print(); - - - free(directory_to_scan); - #ifdef _WIN32 - _chdrive(curdrive); - #endif - return 0; -} +/* + * MediaIndexer - Where the hell is <any_filename_here>... ^-^ + * + * written by Thomas Jakobi aka FAKE 2002 + * Version: 0 (pre-alpha) + * Based on a lot pd work i read through.... thanks! + */ + +#include <iostream> +#include "mediaList.h" +#include "scanner.h" +using namespace std; + +#ifdef _WIN32 + #include <direct.h> + #include <windows.h> + #include <winbase.h> +#endif + +int main(int argc, char** argv) +{ + + if (argc < 2) { + #ifdef _WIN32 + cout << endl << "Usage: " << argv[0] << " [-DDrive] [-CFilename] <directory>" << endl; + cout << " -D# Specifiy Drive to Index (# may be a-z, A-Z)" << endl; + cout << " -CFilename Switch to CSV Mode. Write the index generated to Filename only." << endl; + cout << "Example: " << argv[0] << " (-DC) (-CIndex.csv) /videos" << endl; + #else + cout << endl << "Usage: " << argv[0] << " [-CFilename] <directory>" << endl; + cout << " -DNodename Specifiy device node to Index (not yet implemented)" << endl; + cout << " -CFilename Switch to CSV Mode. Write the index generated to Filename only." << endl; + cout << "Example: " << argv[0] << " (-CIndex.csv) /opt/something" << endl; + #endif + return 1; + } + + char *directory_to_scan, *csvFile, *curdir; + bool doCSV = false; + + #ifdef _WIN32 + int curdrive = _getdrive(); + #endif + + curdir = (char*) malloc(_MAX_PATH); + getcwd(curdir, _MAX_PATH); + + for (int n=1; n < argc; n++) { + if (memcmp(argv[n], "-C", 2)==0) { + csvFile = (char*) malloc(strlen(argv[n])); + memset(csvFile, '\0', strlen(argv[n])); + for(int i=2; i < strlen(argv[n]); i++) csvFile[(i-2)] = argv[n][i]; + doCSV = true; + } else if (memcmp(argv[n], "-D", 2)==0) { + #ifndef _WIN32 + cout << "Device Node option not yet implemented, sorry." << endl; + #else + int drivetoindex = argv[n][2]; + //switch to specified drive + if (drivetoindex > 90) drivetoindex -= 32; //cheap conversion (strupr ^-^); + cout << "You wanted to index drive: " << (char) drivetoindex << endl; + drivetoindex -= 64; _chdrive(drivetoindex); + #endif + } else { + directory_to_scan = (char*) malloc(strlen(argv[n])); + strcpy(directory_to_scan, argv[n]); + } + + } + + mediaList FileList; + + scan_directory(directory_to_scan, FileList); + cout << endl << endl << "processing files finished." << endl; + + //The Disk's Serial Number and Volume Label (Windows API call for compatibility) +#ifdef _WIN32 + char *vname = (char*) malloc(255); + unsigned long *serial; + serial = (unsigned long *) malloc(sizeof(unsigned long)); + memset(serial, 0, sizeof(unsigned long)); + + GetVolumeInformation(NULL, vname, 255, serial, NULL, NULL, NULL, NULL); + cout << vname << " (" << hex << *serial << ") indexed. " << endl; +#endif + + /* + char* Name = (char*) malloc(256); + char* Storage = (char*) malloc(256); + memset(Name, 0, 256);memset(Storage, 0, 256); + cout << "Name the Media: [255] "; cin.getline(Name,255); + cout << endl << "And where you will put it now: [255] " ; + cin.getline(Storage,255);cout << endl; + *outfile << "\"" << Name << "\",\"" << Storage << "\"," << "foo" << endl; + */ + + //verkettete liste ausgeben: + //FileList.print(); + + + chdir(curdir); + if (doCSV) { + cout << endl << "writing list to csv file '" << csvFile << "' ... "; + FileList.saveToCSV(csvFile); + cout << " done." << endl; + } + + #ifdef _WIN32 + _chdrive(curdrive); + #endif + return 0; +} |