summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/apk.c21
-rw-r--r--src/apk_defines.h1
-rw-r--r--src/database.c22
3 files changed, 22 insertions, 22 deletions
diff --git a/src/apk.c b/src/apk.c
index b4b9e9b..79a873a 100644
--- a/src/apk.c
+++ b/src/apk.c
@@ -24,6 +24,7 @@
const char *apk_root;
struct apk_repository_url apk_repository_list;
int apk_verbosity = 1, apk_progress = 0, apk_upgrade = 0;
+int apk_clean = 0;
int apk_cwd_fd;
void apk_log(const char *prefix, const char *format, ...)
@@ -110,14 +111,15 @@ static struct apk_repository_url *apk_repository_new(const char *url)
return r;
}
-#define NUM_GENERIC_OPTS 6
+#define NUM_GENERIC_OPTS 7
static struct option generic_options[32] = {
- { "root", required_argument, NULL, 'p' },
- { "repository", required_argument, NULL, 'X' },
- { "quiet", no_argument, NULL, 'q' },
- { "verbose", no_argument, NULL, 'v' },
- { "version", no_argument, NULL, 'V' },
- { "progress", no_argument, NULL, 0x100 },
+ { "root", required_argument, NULL, 'p' },
+ { "repository", required_argument, NULL, 'X' },
+ { "quiet", no_argument, NULL, 'q' },
+ { "verbose", no_argument, NULL, 'v' },
+ { "version", no_argument, NULL, 'V' },
+ { "progress", no_argument, &apk_progress, 1 },
+ { "clean-protected", no_argument, &apk_clean, 1 },
};
int main(int argc, char **argv)
@@ -160,6 +162,8 @@ int main(int argc, char **argv)
while ((r = getopt_long(argc, argv, short_options,
generic_options, &optindex)) != -1) {
switch (r) {
+ case 0:
+ break;
case 'p':
apk_root = optarg;
break;
@@ -177,9 +181,6 @@ int main(int argc, char **argv)
case 'V':
return version();
break;
- case 0x100:
- apk_progress = 1;
- break;
default:
if (applet == NULL || applet->parse == NULL)
return usage();
diff --git a/src/apk_defines.h b/src/apk_defines.h
index efae83f..c27d863 100644
--- a/src/apk_defines.h
+++ b/src/apk_defines.h
@@ -51,6 +51,7 @@ extern csum_t bad_checksum;
#endif
extern int apk_cwd_fd, apk_verbosity, apk_progress, apk_upgrade;
+extern int apk_clean;
#define apk_error(args...) apk_log("ERROR: ", args);
#define apk_warning(args...) if (apk_verbosity > 0) { apk_log("WARNING: ", args); }
diff --git a/src/database.c b/src/database.c
index f6b66c4..108c3ab 100644
--- a/src/database.c
+++ b/src/database.c
@@ -1066,19 +1066,17 @@ static int apk_db_install_archive_entry(void *_ctx,
printf("%s\n", ae->name);
if ((diri->dir->flags & APK_DBDIRF_PROTECTED) &&
- apk_file_get_info(ae->name, &fi) == 0) {
+ apk_file_get_info(ae->name, &fi) == 0 &&
+ (memcmp(file->csum, fi.csum, sizeof(csum_t)) == 0 ||
+ !csum_valid(file->csum))) {
/* Protected file. Extract to separate place */
- snprintf(alt_name, sizeof(alt_name),
- "%s/%s.apk-new",
- diri->dir->dirname, file->filename);
- r = apk_archive_entry_extract(ae, is, alt_name,
- extract_cb, ctx);
- if (memcmp(ae->csum, fi.csum, sizeof(csum_t)) == 0) {
- /* not modified locally. rename to original */
- if (rename(alt_name, ae->name) < 0)
- apk_warning("%s: %s", ae->name,
- strerror(errno));
- }
+ if (!apk_clean) {
+ snprintf(alt_name, sizeof(alt_name),
+ "%s/%s.apk-new",
+ diri->dir->dirname, file->filename);
+ r = apk_archive_entry_extract(ae, is, alt_name,
+ extract_cb, ctx);
+ }
} else {
r = apk_archive_entry_extract(ae, is, NULL,
extract_cb, ctx);