int err;
key *kk;
if (k.f & f_retag) {
- if ((kk = key_bytag(&f, tag)) != 0 && strcmp(kk->tag, tag) == 0)
+ if ((kk = key_bytag(&f, tag)) != 0 &&
+ kk->tag &&
+ strcmp(kk->tag, tag) == 0)
key_settag(&f, kk, 0);
}
if ((err = key_settag(&f, k.k, tag)) != 0)
int i;
int rc = 0;
key_filter kf = { 0, 0 };
+ dstr d = DSTR_INIT;
+ const char *outfile = 0;
FILE *fp;
for (;;) {
die(EXIT_FAILURE, "Usage: extract [-f FILTER] FILE [TAG...]");
if (strcmp(*argv, "-") == 0)
fp = stdout;
- else if (!(fp = fopen(*argv, "w"))) {
- die(EXIT_FAILURE, "couldn't open `%s' for writing: %s",
- *argv, strerror(errno));
+ else {
+ outfile = *argv;
+ dstr_putf(&d, "%s.new", outfile);
+ if (!(fp = fopen(d.buf, "w"))) {
+ die(EXIT_FAILURE, "couldn't open `%s' for writing: %s",
+ d.buf, strerror(errno));
+ }
}
doopen(&f, KOPEN_READ);
}
}
}
- if (fclose(fp))
+ if (fclose(fp) || (outfile && rename(d.buf, outfile)))
die(EXIT_FAILURE, "error writing file: %s", strerror(errno));
+ dstr_destroy(&d);
doclose(&f);
return (rc);
}