support: Delete temporary files in LIFO order

This is required to remove temporary directories which contain
temporary files.  Previously, FIFO order meant that directory
removal was attempted when the directory still contained files,
which meant that temporary directory cleanup was essentially
unsupported.
This commit is contained in:
Florian Weimer 2017-05-08 14:32:58 +02:00
parent cd354a3849
commit 706256afb6
2 changed files with 14 additions and 11 deletions

View File

@ -1,3 +1,12 @@
2017-05-08 Florian Weimer <fweimer@redhat.com>
Delete temporary files in LIFO order.
* support/temp_file.c (struct temp_name_list): Replace q member
with next.
(add_temp_file): Add new file to front of linked list.
(support_delete_temp_files): Use next member.
(support_print_temp_files): Likewise.
2017-05-08 Florian Weimer <fweimer@redhat.com>
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Remove

View File

@ -25,7 +25,6 @@
#include <support/support.h>
#include <paths.h>
#include <search.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -33,7 +32,7 @@
/* List of temporary files. */
static struct temp_name_list
{
struct qelem q;
struct temp_name_list *next;
char *name;
} *temp_name_list;
@ -50,10 +49,8 @@ add_temp_file (const char *name)
if (newname != NULL)
{
newp->name = newname;
if (temp_name_list == NULL)
temp_name_list = (struct temp_name_list *) &newp->q;
else
insque (newp, temp_name_list);
newp->next = temp_name_list;
temp_name_list = newp;
}
else
free (newp);
@ -105,8 +102,7 @@ support_delete_temp_files (void)
(void) remove (temp_name_list->name);
free (temp_name_list->name);
struct temp_name_list *next
= (struct temp_name_list *) temp_name_list->q.q_forw;
struct temp_name_list *next = temp_name_list->next;
free (temp_name_list);
temp_name_list = next;
}
@ -119,9 +115,7 @@ support_print_temp_files (FILE *f)
{
struct temp_name_list *n;
fprintf (f, "temp_files=(\n");
for (n = temp_name_list;
n != NULL;
n = (struct temp_name_list *) n->q.q_forw)
for (n = temp_name_list; n != NULL; n = n->next)
fprintf (f, " '%s'\n", n->name);
fprintf (f, ")\n");
}