On Mon, Aug 22, 2016 at 09:55:13AM +0200, Reda Sallahi wrote:
> static int img_dd_conv(const char *arg,
> struct DdIo *in, struct DdIo *out,
> struct DdInfo *dd)
> {
> - if (!strcmp(arg, "notrunc")) {
> - dd->conv |= C_NOTRUNC;
> - return 0;
> - } else {
> - error_report("invalid conversion: '%s'", arg);
> - return 1;
> + const char *tok;
> + char *str, *tmp;
> + int ret = 0;
> + const struct DdSymbols conv[] = {
> + { "notrunc", C_NOTRUNC },
> + { "sync", C_SYNC },
> + { "noerror", C_NOERROR },
> + { "fdatasync", C_FDATASYNC },
> + { "fsync", C_FSYNC },
> + { "excl", C_EXCL },
> + { "nocreat", C_NOCREAT },
> + { "sparse", C_SPARSE },
> + { NULL, 0 }
> + };
> +
> + tmp = str = g_strdup(arg);
> +
> + while (tmp != NULL && !ret) {
> + tok = qemu_strsep(&tmp, ",");
> + int j;
> + for (j = 0; conv[j].name != NULL; j++) {
> + if (!strcmp(tok, conv[j].name)) {
> + if ((dd->conv | conv[j].value) & C_EXCL &&
> + (dd->conv | conv[j].value) & C_NOCREAT) {
> + error_report("cannot combine excl and nocreat");
> + ret = 1;
> + break;
> + }
> + dd->conv |= conv[j].value;
> + break;
> + }
> + }
> + if (conv[j].name == NULL) {
> + error_report("invalid conversion: '%s'", tok);
> + ret = 1;
> + }
> }
> +
> + g_free(str);
> + return ret;
> }
This function is very similar to img_dd_iflag/oflag. The code
duplication can be avoided if you perform the (dd->conv | conv[j].value)
& C_EXCL && (dd->conv | conv[j].value) & C_NOCREAT later.
> @@ -4325,20 +4388,43 @@ static int img_dd(int argc, char **argv)
>
> for (out_pos = out.offset * obsz; in_pos < size; block_count++) {
> int in_ret, out_ret;
> + bsz = in.bsz;
>
> if (in_pos + in.bsz > size) {
> - in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos);
> - } else {
> - in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz);
> + bsz = size - in_pos;
> + }
> +
> + if (dd.conv & C_SYNC) {
> + memset(in.buf, 0, in.bsz);
> }
Why is memset necessary?
signature.asc
Description: PGP signature
