* Now writes and updates the hash file.
* Unfortunately, there still seems to be a problem in the hash generation... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28412 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -122,6 +122,7 @@ private:
|
|||||||
|
|
||||||
struct file_entry {
|
struct file_entry {
|
||||||
uint8 hash[SHA_DIGEST_LENGTH];
|
uint8 hash[SHA_DIGEST_LENGTH];
|
||||||
|
ino_t node;
|
||||||
std::string path;
|
std::string path;
|
||||||
|
|
||||||
bool operator<(const struct file_entry& other) const
|
bool operator<(const struct file_entry& other) const
|
||||||
@@ -373,6 +374,8 @@ process_directory(const char* path)
|
|||||||
if (dir == NULL)
|
if (dir == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
size_t pathLength = strlen(path);
|
||||||
|
|
||||||
while (struct dirent* entry = readdir(dir)) {
|
while (struct dirent* entry = readdir(dir)) {
|
||||||
if (!strcmp(entry->d_name, ".")
|
if (!strcmp(entry->d_name, ".")
|
||||||
|| !strcmp(entry->d_name, ".."))
|
|| !strcmp(entry->d_name, ".."))
|
||||||
@@ -380,6 +383,7 @@ process_directory(const char* path)
|
|||||||
|
|
||||||
char fullPath[1024];
|
char fullPath[1024];
|
||||||
strlcpy(fullPath, path, sizeof(fullPath));
|
strlcpy(fullPath, path, sizeof(fullPath));
|
||||||
|
if (path[pathLength - 1] != '/')
|
||||||
strlcat(fullPath, "/", sizeof(fullPath));
|
strlcat(fullPath, "/", sizeof(fullPath));
|
||||||
strlcat(fullPath, entry->d_name, sizeof(fullPath));
|
strlcat(fullPath, entry->d_name, sizeof(fullPath));
|
||||||
|
|
||||||
@@ -421,6 +425,7 @@ process_file(const char* path)
|
|||||||
|
|
||||||
file_entry entry;
|
file_entry entry;
|
||||||
memcpy(entry.hash, gSHA.Digest(), SHA_DIGEST_LENGTH);
|
memcpy(entry.hash, gSHA.Digest(), SHA_DIGEST_LENGTH);
|
||||||
|
entry.node = stat.st_ino;
|
||||||
entry.path = path;
|
entry.path = path;
|
||||||
|
|
||||||
printf("%s %s\n", entry.HashString().c_str(), path);
|
printf("%s %s\n", entry.HashString().c_str(), path);
|
||||||
@@ -429,30 +434,98 @@ process_file(const char* path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
write_hash_file(const char* name, int fileCount, char** files)
|
||||||
|
{
|
||||||
|
int file = open(name, O_WRONLY | O_TRUNC | O_CREAT);
|
||||||
|
if (file < 0) {
|
||||||
|
fprintf(stderr, "%s: Could not write hash file \"%s\": %s\n",
|
||||||
|
kProgramName, name, strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
write(file, "HASH", 4);
|
||||||
|
|
||||||
|
write(file, &fileCount, sizeof(int));
|
||||||
|
for (int i = 0; i < fileCount; i++) {
|
||||||
|
int length = strlen(files[i]);
|
||||||
|
write(file, &length, sizeof(int));
|
||||||
|
write(file, files[i], length + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fileCount = gFiles.size();
|
||||||
|
write(file, &fileCount, sizeof(int));
|
||||||
|
for (int i = 0; i < fileCount; i++) {
|
||||||
|
file_entry& entry = gFiles[i];
|
||||||
|
|
||||||
|
write(file, entry.hash, SHA_DIGEST_LENGTH);
|
||||||
|
write(file, &entry.node, sizeof(ino_t));
|
||||||
|
|
||||||
|
int length = entry.path.size();
|
||||||
|
write(file, &length, sizeof(int));
|
||||||
|
write(file, entry.path.c_str(), length + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char** argv)
|
main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
fprintf(stderr, "usage: %s <hash-file> <files>\n", kProgramName);
|
fprintf(stderr, "usage: %s <hash-file> [<files> ...]\n"
|
||||||
|
"\tWhen invoked without files, the hash-file is updated only.\n",
|
||||||
|
kProgramName);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* hashFileName = argv[1];
|
||||||
|
|
||||||
status_t status = gSHA.Init();
|
status_t status = gSHA.Init();
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
fprintf(stderr, "Could not initialize SHA processor: %s\n",
|
fprintf(stderr, "%s: Could not initialize SHA processor: %s\n",
|
||||||
strerror(status));
|
kProgramName, strerror(status));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bigtime_t start = system_time();
|
bigtime_t start = system_time();
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
if (argc == 2) {
|
||||||
|
int file = open(hashFileName, O_RDONLY);
|
||||||
|
if (file < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buffer[2048];
|
||||||
|
read(file, buffer, 4);
|
||||||
|
if (memcmp(buffer, "HASH", 4)) {
|
||||||
|
close(file);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int fileCount;
|
||||||
|
read(file, &fileCount, sizeof(int));
|
||||||
|
|
||||||
|
for (int i = 0; i < fileCount; i++) {
|
||||||
|
int length;
|
||||||
|
read(file, &length, sizeof(int));
|
||||||
|
read(file, buffer, length + 1);
|
||||||
|
process_file(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(file);
|
||||||
|
} else {
|
||||||
|
for (int i = 2; i < argc; i++) {
|
||||||
process_file(argv[i]);
|
process_file(argv[i]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sort(gFiles.begin(), gFiles.end());
|
sort(gFiles.begin(), gFiles.end());
|
||||||
|
|
||||||
bigtime_t runtime = system_time() - start;
|
bigtime_t runtime = system_time() - start;
|
||||||
|
|
||||||
|
write_hash_file(hashFileName, argc - 2, argv + 2);
|
||||||
|
|
||||||
if (gFiles.size() > 0) {
|
if (gFiles.size() > 0) {
|
||||||
printf("Generated hashes for %ld files in %g seconds, %g msec per "
|
printf("Generated hashes for %ld files in %g seconds, %g msec per "
|
||||||
"file.\n", gFiles.size(), runtime / 1000000.0,
|
"file.\n", gFiles.size(), runtime / 1000000.0,
|
||||||
|
|||||||
Reference in New Issue
Block a user