summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2021-04-01 06:53:49 +0000
committerclaudio <claudio@openbsd.org>2021-04-01 06:53:49 +0000
commit155f32c36892d27d8e0d057f689d4da031f953bc (patch)
tree14f616a4d51211bbce3cc75bc47af24edb7f1d00
parentAdd encoding.c to the various build targets (diff)
downloadwireguard-openbsd-155f32c36892d27d8e0d057f689d4da031f953bc.tar.xz
wireguard-openbsd-155f32c36892d27d8e0d057f689d4da031f953bc.zip
Do a better job at cleaning up. Remove empty directories, scan not only the
known repositories but also clean up no longer known repositories. With this rpki-client keeps its cache nice and shiny. With and OK job@
Diffstat (limited to '')
-rw-r--r--usr.sbin/rpki-client/extern.h3
-rw-r--r--usr.sbin/rpki-client/main.c122
2 files changed, 78 insertions, 47 deletions
diff --git a/usr.sbin/rpki-client/extern.h b/usr.sbin/rpki-client/extern.h
index ffe48b2dea9..9c05f6396f5 100644
--- a/usr.sbin/rpki-client/extern.h
+++ b/usr.sbin/rpki-client/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.60 2021/04/01 06:43:23 claudio Exp $ */
+/* $OpenBSD: extern.h,v 1.61 2021/04/01 06:53:49 claudio Exp $ */
/*
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -306,6 +306,7 @@ struct stats {
size_t vrps; /* total number of vrps */
size_t uniqs; /* number of unique vrps */
size_t del_files; /* number of files removed in cleanup */
+ size_t del_dirs; /* number of directories removed in cleanup */
char *talnames;
struct timeval elapsed_time;
struct timeval user_time;
diff --git a/usr.sbin/rpki-client/main.c b/usr.sbin/rpki-client/main.c
index a5eb0321390..8805f0ee68c 100644
--- a/usr.sbin/rpki-client/main.c
+++ b/usr.sbin/rpki-client/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.127 2021/03/31 16:11:02 claudio Exp $ */
+/* $OpenBSD: main.c,v 1.128 2021/04/01 06:53:49 claudio Exp $ */
/*
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -154,6 +154,26 @@ filepath_exists(char *file)
return RB_FIND(filepath_tree, &fpt, &needle) != NULL;
}
+/*
+ * Return true if a filepath entry exists that starts with path.
+ */
+static int
+filepath_dir_exists(char *path)
+{
+ struct filepath needle;
+ struct filepath *res;
+
+ needle.file = path;
+ res = RB_NFIND(filepath_tree, &fpt, &needle);
+ while (res != NULL && strstr(res->file, path) == res->file) {
+ /* make sure that filepath acctually is in that path */
+ if (res->file[strlen(path)] == '/')
+ return 1;
+ res = RB_NEXT(filepath_tree, &fpt, res);
+ }
+ return 0;
+}
+
RB_GENERATE(filepath_tree, filepath, entry, filepathcmp);
void
@@ -767,56 +787,56 @@ add_to_del(char **del, size_t *dsz, char *file)
return del;
}
-static size_t
+static void
repo_cleanup(void)
{
- size_t i, delsz = 0;
- char *argv[2], **del = NULL;
- struct repo *rp;
+ size_t i, delsz = 0, dirsz = 0;
+ char *argv[3], **del = NULL, **dir = NULL;
FTS *fts;
FTSENT *e;
- SLIST_FOREACH(rp, &repos, entry) {
- argv[0] = rp->local;
- argv[1] = NULL;
- if ((fts = fts_open(argv, FTS_PHYSICAL | FTS_NOSTAT,
- NULL)) == NULL)
- err(1, "fts_open");
- errno = 0;
- while ((e = fts_read(fts)) != NULL) {
- switch (e->fts_info) {
- case FTS_NSOK:
- if (!filepath_exists(e->fts_path))
- del = add_to_del(del, &delsz,
- e->fts_path);
- break;
- case FTS_D:
- case FTS_DP:
- /* TODO empty directory pruning */
- break;
- case FTS_SL:
- case FTS_SLNONE:
- warnx("symlink %s", e->fts_path);
- del = add_to_del(del, &delsz, e->fts_path);
- break;
- case FTS_NS:
- case FTS_ERR:
- warnx("fts_read %s: %s", e->fts_path,
- strerror(e->fts_errno));
- break;
- default:
- warnx("unhandled[%x] %s", e->fts_info,
+ argv[0] = "ta";
+ argv[1] = "rsync";
+ argv[2] = NULL;
+ if ((fts = fts_open(argv, FTS_PHYSICAL | FTS_NOSTAT, NULL)) == NULL)
+ err(1, "fts_open");
+ errno = 0;
+ while ((e = fts_read(fts)) != NULL) {
+ switch (e->fts_info) {
+ case FTS_NSOK:
+ if (!filepath_exists(e->fts_path))
+ del = add_to_del(del, &delsz,
e->fts_path);
- break;
- }
-
- errno = 0;
+ break;
+ case FTS_D:
+ break;
+ case FTS_DP:
+ if (!filepath_dir_exists(e->fts_path))
+ dir = add_to_del(dir, &dirsz,
+ e->fts_path);
+ break;
+ case FTS_SL:
+ case FTS_SLNONE:
+ warnx("symlink %s", e->fts_path);
+ del = add_to_del(del, &delsz, e->fts_path);
+ break;
+ case FTS_NS:
+ case FTS_ERR:
+ warnx("fts_read %s: %s", e->fts_path,
+ strerror(e->fts_errno));
+ break;
+ default:
+ warnx("unhandled[%x] %s", e->fts_info,
+ e->fts_path);
+ break;
}
- if (errno)
- err(1, "fts_read");
- if (fts_close(fts) == -1)
- err(1, "fts_close");
+
+ errno = 0;
}
+ if (errno)
+ err(1, "fts_read");
+ if (fts_close(fts) == -1)
+ err(1, "fts_close");
for (i = 0; i < delsz; i++) {
if (unlink(del[i]) == -1)
@@ -826,8 +846,17 @@ repo_cleanup(void)
free(del[i]);
}
free(del);
+ stats.del_files = delsz;
- return delsz;
+ for (i = 0; i < dirsz; i++) {
+ if (rmdir(dir[i]) == -1)
+ warn("rmdir %s", dir[i]);
+ if (verbose > 1)
+ logx("deleted dir %s", dir[i]);
+ free(dir[i]);
+ }
+ free(dir);
+ stats.del_dirs = dirsz;
}
void
@@ -1231,7 +1260,7 @@ main(int argc, char *argv[])
}
}
- stats.del_files = repo_cleanup();
+ repo_cleanup();
gettimeofday(&now_time, NULL);
timersub(&now_time, &start_time, &stats.elapsed_time);
@@ -1262,7 +1291,8 @@ main(int argc, char *argv[])
logx("Certificate revocation lists: %zu", stats.crls);
logx("Ghostbuster records: %zu", stats.gbrs);
logx("Repositories: %zu", stats.repos);
- logx("Files removed: %zu", stats.del_files);
+ logx("Cleanup: removed %zu files, %zu directories",
+ stats.del_files, stats.del_dirs);
logx("VRP Entries: %zu (%zu unique)", stats.vrps, stats.uniqs);
/* Memory cleanup. */