OSDN Git Service

Merge "fec: add --padding"
authorTreehugger Robot <treehugger-gerrit@google.com>
Fri, 2 Sep 2016 18:13:32 +0000 (18:13 +0000)
committerGerrit Code Review <noreply-gerritcodereview@google.com>
Fri, 2 Sep 2016 18:13:34 +0000 (18:13 +0000)
verity/fec/image.cpp
verity/fec/image.h
verity/fec/main.cpp

index 5c3eb8b..509b102 100644 (file)
@@ -291,14 +291,11 @@ bool image_ecc_load(const std::string& filename, image *ctx)
 
 bool image_ecc_save(image *ctx)
 {
-    assert(sizeof(fec_header) <= FEC_BLOCKSIZE);
-
-    uint8_t header[FEC_BLOCKSIZE];
-    uint8_t *p = header;
+    assert(2 * sizeof(fec_header) <= FEC_BLOCKSIZE);
 
-    memset(p, 0, FEC_BLOCKSIZE);
+    uint8_t header[FEC_BLOCKSIZE] = {0};
 
-    fec_header *f = (fec_header *)p;
+    fec_header *f = (fec_header *)header;
 
     f->magic = FEC_MAGIC;
     f->version = FEC_VERSION;
@@ -310,7 +307,8 @@ bool image_ecc_save(image *ctx)
     SHA256(ctx->fec, ctx->fec_size, f->hash);
 
     /* store a copy of the fec_header at the end of the header block */
-    memcpy(&p[sizeof(header) - sizeof(fec_header)], p, sizeof(fec_header));
+    memcpy(&header[sizeof(header) - sizeof(fec_header)], header,
+        sizeof(fec_header));
 
     assert(ctx->fec_filename);
 
@@ -322,11 +320,24 @@ bool image_ecc_save(image *ctx)
             strerror(errno));
     }
 
-    if (!android::base::WriteFully(fd, ctx->fec, ctx->fec_size) ||
-        !android::base::WriteFully(fd, header, sizeof(header))) {
+    if (!android::base::WriteFully(fd, ctx->fec, ctx->fec_size)) {
         FATAL("failed to write to output: %s\n", strerror(errno));
     }
 
+    if (ctx->padding > 0) {
+        uint8_t padding[FEC_BLOCKSIZE] = {0};
+
+        for (uint32_t i = 0; i < ctx->padding; i += FEC_BLOCKSIZE) {
+            if (!android::base::WriteFully(fd, padding, FEC_BLOCKSIZE)) {
+                FATAL("failed to write padding: %s\n", strerror(errno));
+            }
+        }
+    }
+
+    if (!android::base::WriteFully(fd, header, sizeof(header))) {
+        FATAL("failed to write to header: %s\n", strerror(errno));
+    }
+
     close(fd);
 
     return true;
index 72048c6..64f0e42 100644 (file)
@@ -52,6 +52,7 @@ struct image {
     int rs_n;
     int threads;
     uint32_t fec_size;
+    uint32_t padding;
     uint64_t blocks;
     uint64_t inp_size;
     uint64_t pos;
index 6245f07..93f1ec2 100644 (file)
@@ -107,6 +107,8 @@ static int usage()
            "  -r, --roots=<bytes>               number of parity bytes\n"
            "  -j, --threads=<threads>           number of threads to use\n"
            "  -S                                treat data as a sparse file\n"
+           "encoding options:\n"
+           "  -p, --padding=<bytes>             add padding after ECC data\n"
            "decoding options:\n"
            "  -i, --inplace                     correct <data> in place\n"
         );
@@ -220,6 +222,10 @@ static int decode(image& ctx, const std::vector<std::string>& inp_filenames,
             "files\n");
     }
 
+    if (ctx.padding) {
+        FATAL("invalid parameters: padding is only relevant when encoding\n");
+    }
+
     if (!image_ecc_load(fec_filename, &ctx) ||
             !image_load(inp_filenames, &ctx)) {
         FATAL("failed to read input\n");
@@ -284,10 +290,11 @@ int main(int argc, char **argv)
             {"print-fec-size", required_argument, 0, 's'},
             {"get-ecc-start", required_argument, 0, 'E'},
             {"get-verity-start", required_argument, 0, 'V'},
+            {"padding", required_argument, 0, 'p'},
             {"verbose", no_argument, 0, 'v'},
             {NULL, 0, 0, 0}
         };
-        int c = getopt_long(argc, argv, "hedSr:imj:s:E:V:v", long_options, NULL);
+        int c = getopt_long(argc, argv, "hedSr:ij:s:E:V:p:v", long_options, NULL);
         if (c < 0) {
             break;
         }
@@ -339,6 +346,12 @@ int main(int argc, char **argv)
             mode = MODE_GETVERITYSTART;
             inp_filenames.push_back(optarg);
             break;
+        case 'p':
+            ctx.padding = (uint32_t)parse_arg(optarg, "padding", UINT32_MAX);
+            if (ctx.padding % FEC_BLOCKSIZE) {
+                FATAL("padding must be multiple of %u\n", FEC_BLOCKSIZE);
+            }
+            break;
         case 'v':
             ctx.verbose = true;
             break;