summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar default2022-11-25 13:51:56 +0100
committerGravatar default2022-11-25 13:51:56 +0100
commitee75b3f5f62e077c65aa2edbbbecc38e169b2e9d (patch)
treeee99526a8fc384bd316f9d72897c9328a7da5bcc
parentNew function mtime_nl(). (diff)
downloadsnac2-ee75b3f5f62e077c65aa2edbbbecc38e169b2e9d.tar.gz
snac2-ee75b3f5f62e077c65aa2edbbbecc38e169b2e9d.tar.xz
snac2-ee75b3f5f62e077c65aa2edbbbecc38e169b2e9d.zip
In purge_server(), don't purge objects with 2 (or more) hard links.
This way, an object can be protected from the purge by creating a hard link to it.
-rw-r--r--data.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/data.c b/data.c
index bb31096..08f7e2d 100644
--- a/data.c
+++ b/data.c
@@ -1492,11 +1492,13 @@ d_char *dequeue(snac *snac, char *fn)
1492} 1492}
1493 1493
1494 1494
1495static void _purge_file(const char *fn, int days) 1495static void _purge_file(const char *fn, int days, int n_link)
1496/* purge fn if it's older than days and has less than n_link hard links */
1496{ 1497{
1497 time_t mt = time(NULL) - days * 24 * 3600; 1498 time_t mt = time(NULL) - days * 24 * 3600;
1499 int nl;
1498 1500
1499 if (mtime(fn) < mt) { 1501 if (mtime_nl(fn, &nl) < mt && nl < n_link) {
1500 /* older than the minimum time: delete it */ 1502 /* older than the minimum time: delete it */
1501 unlink(fn); 1503 unlink(fn);
1502 srv_debug(1, xs_fmt("purged %s", fn)); 1504 srv_debug(1, xs_fmt("purged %s", fn));
@@ -1514,7 +1516,7 @@ static void _purge_subdir(snac *snac, const char *subdir, int days)
1514 1516
1515 p = list; 1517 p = list;
1516 while (xs_list_iter(&p, &v)) 1518 while (xs_list_iter(&p, &v))
1517 _purge_file(v, days); 1519 _purge_file(v, days, XS_ALL);
1518 } 1520 }
1519} 1521}
1520 1522
@@ -1523,7 +1525,6 @@ void purge_server(void)
1523/* purge global server data */ 1525/* purge global server data */
1524{ 1526{
1525 int tpd = xs_number_get(xs_dict_get(srv_config, "timeline_purge_days")); 1527 int tpd = xs_number_get(xs_dict_get(srv_config, "timeline_purge_days"));
1526// int lpd = xs_number_get(xs_dict_get(srv_config, "local_purge_days"));
1527 xs *spec = xs_fmt("%s/object/??", srv_basedir); 1528 xs *spec = xs_fmt("%s/object/??", srv_basedir);
1528 xs *dirs = xs_glob(spec, 0, 0); 1529 xs *dirs = xs_glob(spec, 0, 0);
1529 char *p, *v; 1530 char *p, *v;
@@ -1536,7 +1537,7 @@ void purge_server(void)
1536 1537
1537 p2 = files; 1538 p2 = files;
1538 while (xs_list_iter(&p2, &v2)) { 1539 while (xs_list_iter(&p2, &v2)) {
1539 _purge_file(v2, tpd); 1540 _purge_file(v2, tpd, 2);
1540 } 1541 }
1541 } 1542 }
1542} 1543}
@@ -1559,8 +1560,6 @@ void purge_user(snac *snac)
1559void purge_all(void) 1560void purge_all(void)
1560/* purge all users */ 1561/* purge all users */
1561{ 1562{
1562 purge_server();
1563
1564 snac snac; 1563 snac snac;
1565 xs *list = user_list(); 1564 xs *list = user_list();
1566 char *p, *uid; 1565 char *p, *uid;
@@ -1572,4 +1571,6 @@ void purge_all(void)
1572 user_free(&snac); 1571 user_free(&snac);
1573 } 1572 }
1574 } 1573 }
1574
1575 purge_server();
1575} 1576}