2016-08-04 01:29:01 +03:00
|
|
|
// Copyright 2016-present Facebook. All Rights Reserved.
|
|
|
|
//
|
|
|
|
// cdatapack_get.c: Use the index to dump a node's delta chain.
|
2016-08-02 00:05:37 +03:00
|
|
|
//
|
|
|
|
// no-check-code
|
|
|
|
|
2016-08-04 01:29:01 +03:00
|
|
|
#include <inttypes.h>
|
|
|
|
#include <memory.h>
|
2017-08-23 05:09:07 +03:00
|
|
|
#include <sha1dc/sha1.h>
|
2016-08-04 01:29:01 +03:00
|
|
|
#include <stdio.h>
|
2017-08-23 05:09:07 +03:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2017-05-23 21:57:12 +03:00
|
|
|
#include "convert.h"
|
2016-08-04 01:29:01 +03:00
|
|
|
#include "cdatapack.h"
|
|
|
|
|
|
|
|
#define DATAIDX_EXT ".dataidx"
|
|
|
|
#define DATAPACK_EXT ".datapack"
|
|
|
|
|
2016-08-31 22:41:32 +03:00
|
|
|
// if the platform uses XMM registers to run strlen, then we might load
|
|
|
|
// beyond the memory region allocated for the strings. to ensure we keep
|
|
|
|
// valgrind happy, we pad the strings with extra space and initialize the areas.
|
|
|
|
#define XMM_SZ 16
|
|
|
|
|
2016-08-04 01:29:01 +03:00
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
if (argc < 3) {
|
|
|
|
fprintf(stderr, "%s <path> <node>\n", argv[0]);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strlen(argv[2]) != NODE_SZ * 2) {
|
|
|
|
fprintf(stderr, "node should be %d characters long\n", NODE_SZ * 2);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
long len = strlen(argv[1]);
|
2017-04-06 19:30:26 +03:00
|
|
|
char* idx_path = (char*) malloc(len + sizeof(DATAIDX_EXT));
|
|
|
|
char* data_path = (char*) malloc(len + sizeof(DATAPACK_EXT));
|
|
|
|
if (idx_path == NULL || data_path == NULL) {
|
|
|
|
free(idx_path);
|
|
|
|
free(data_path);
|
|
|
|
fprintf(stderr, "Failed to allocate memory for idx_path or data_path\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2016-08-04 01:29:01 +03:00
|
|
|
|
|
|
|
sprintf(idx_path, "%s%s", argv[1], DATAIDX_EXT);
|
|
|
|
sprintf(data_path, "%s%s", argv[1], DATAPACK_EXT);
|
|
|
|
|
|
|
|
datapack_handle_t *handle = open_datapack(
|
|
|
|
idx_path, strlen(idx_path),
|
|
|
|
data_path, strlen(data_path));
|
2017-04-06 19:30:26 +03:00
|
|
|
free(data_path);
|
|
|
|
free(idx_path);
|
2016-08-04 01:29:01 +03:00
|
|
|
|
|
|
|
uint8_t binhash[NODE_SZ];
|
|
|
|
|
|
|
|
unhexlify(argv[2], NODE_SZ * 2, binhash);
|
|
|
|
|
2016-08-30 07:46:43 +03:00
|
|
|
delta_chain_t chain = getdeltachain(handle, binhash);
|
|
|
|
|
|
|
|
if (chain.code != GET_DELTA_CHAIN_OK) {
|
|
|
|
fprintf(stderr, "error retrieving delta chain (code=%d)\n", chain.code);
|
|
|
|
return 1;
|
|
|
|
}
|
2016-08-04 01:29:01 +03:00
|
|
|
|
|
|
|
const char *last_filename = NULL;
|
|
|
|
uint16_t last_filename_sz = 0;
|
|
|
|
|
|
|
|
uint8_t sha[NODE_SZ];
|
|
|
|
|
2016-08-31 22:41:32 +03:00
|
|
|
char node_buffer[NODE_SZ * 2 + XMM_SZ];
|
|
|
|
char deltabase_buffer[NODE_SZ * 2 + XMM_SZ];
|
|
|
|
char sha_buffer[NODE_SZ * 2 + + XMM_SZ];
|
|
|
|
|
|
|
|
// to keep valgrind happy, we initialize the memory *beyond* what hexlify
|
|
|
|
// will write to. that way, when a parallelized strnlen comes along, it
|
|
|
|
// does not find the memory beyond our string uninitialized.
|
|
|
|
memset(&node_buffer[NODE_SZ * 2], 0, XMM_SZ);
|
|
|
|
memset(&deltabase_buffer[NODE_SZ * 2], 0, XMM_SZ);
|
|
|
|
memset(&sha_buffer[NODE_SZ * 2], 0, XMM_SZ);
|
2016-08-04 01:29:01 +03:00
|
|
|
|
2016-08-30 07:46:43 +03:00
|
|
|
for (int ix = 0; ix < chain.links_count; ix ++) {
|
|
|
|
delta_chain_link_t *link = &chain.delta_chain_links[ix];
|
2016-08-04 01:29:01 +03:00
|
|
|
|
sha1: switch to new implementation
Summary:
This diff changes our code to use the new SHA1 library. See the previous diff
for why we do this.
Test Plan:
Run related tests manually:
```
$ make local PYTHON=python2
$ rt test-remotefilelog-*.t
.........................
# Ran 25 tests, 0 skipped, 0 warned, 0 failed.
$ rt test-treemanifest*.t
........
# Ran 8 tests, 0 skipped, 0 warned, 0 failed.
$ rt test-fastmanifest*.t
.........
# Ran 9 tests, 0 skipped, 0 warned, 0 failed.
```
Reviewers: #sourcecontrol, durham
Reviewed By: durham
Subscribers: mjpieters
Differential Revision: https://phabricator.intern.facebook.com/D4945025
Signature: t1:4945025:1493154873:844e55a51ab250354fc08163e0949eed47b0a861
2017-04-26 00:53:32 +03:00
|
|
|
SHA1_CTX ctx;
|
|
|
|
SHA1DCInit(&ctx);
|
|
|
|
SHA1DCUpdate(&ctx, link->delta, link->delta_sz);
|
|
|
|
SHA1DCFinal(sha, &ctx);
|
2016-08-04 01:29:01 +03:00
|
|
|
|
|
|
|
if (last_filename_sz != link->filename_sz ||
|
|
|
|
memcmp(last_filename, link->filename, last_filename_sz) != 0) {
|
|
|
|
// print the filename
|
|
|
|
printf("\n%-.*s\n", link->filename_sz, link->filename);
|
|
|
|
last_filename_sz = link->filename_sz;
|
|
|
|
last_filename = link->filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
hexlify(link->node, NODE_SZ, node_buffer);
|
|
|
|
hexlify(link->deltabase_node, NODE_SZ, deltabase_buffer);
|
|
|
|
hexlify(sha, NODE_SZ, sha_buffer);
|
|
|
|
|
|
|
|
printf("%-*s %-*s %-*s %s\n",
|
|
|
|
NODE_SZ * 2, "Node",
|
|
|
|
NODE_SZ * 2, "Delta Base",
|
|
|
|
NODE_SZ * 2, "Delta SHA1",
|
|
|
|
"Delta Length");
|
2016-08-31 22:41:32 +03:00
|
|
|
printf("%-.*s ",
|
|
|
|
NODE_SZ * 2, node_buffer);
|
|
|
|
printf("%-.*s ",
|
|
|
|
NODE_SZ * 2, deltabase_buffer);
|
|
|
|
printf("%-.*s ",
|
|
|
|
NODE_SZ * 2, sha_buffer);
|
|
|
|
printf("%" PRIu64 "\n",
|
2016-08-04 01:29:01 +03:00
|
|
|
link->delta_sz);
|
|
|
|
|
|
|
|
}
|
2016-08-02 00:05:37 +03:00
|
|
|
}
|