X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Funlink.c;h=8c58b8d1e2c223f6d937006d668a48e8a61f728a;hb=dd549cc257c7ec9e0780f649ac8ae384a84baba0;hp=2af6f9957b2887eea74b9fe0b394207d60937e32;hpb=4dfcd6c054a5e9e1a371c822a3be90564dd9b690;p=chaz%2Ftar diff --git a/src/unlink.c b/src/unlink.c index 2af6f99..8c58b8d 100644 --- a/src/unlink.c +++ b/src/unlink.c @@ -1,19 +1,21 @@ -/* This file is part of GNU tar. - Copyright (C) 2009 Free Software Foundation, Inc. +/* Unlink files. - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 3, or (at your option) any later - version. + Copyright 2009, 2013 Free Software Foundation, Inc. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - Public License for more details. + This file is part of GNU tar. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + GNU tar is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + GNU tar is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include #include "common.h" @@ -39,10 +41,10 @@ static struct deferred_unlink *dunlink_avail; /* Delay (number of records written) between adding entry to the list and its actual removal. */ -size_t deferred_unlink_delay = 0; +static size_t deferred_unlink_delay = 0; static struct deferred_unlink * -dunlink_alloc () +dunlink_alloc (void) { struct deferred_unlink *p; if (dunlink_avail) @@ -77,7 +79,7 @@ flush_deferred_unlinks (bool force) { if (p->is_dir) { - if (rmdir (p->file_name) != 0) + if (unlinkat (chdir_fd, p->file_name, AT_REMOVEDIR) != 0) { switch (errno) { @@ -101,7 +103,7 @@ flush_deferred_unlinks (bool force) } else { - if (unlink (p->file_name) != 0 && errno != ENOENT) + if (unlinkat (chdir_fd, p->file_name, 0) != 0 && errno != ENOENT) unlink_error (p->file_name); } dunlink_reclaim (p); @@ -116,14 +118,14 @@ flush_deferred_unlinks (bool force) { prev = p; p = next; - } + } } if (!dunlink_head) dunlink_tail = NULL; } void -finish_deferred_unlinks () +finish_deferred_unlinks (void) { flush_deferred_unlinks (true); while (dunlink_avail) @@ -142,13 +144,13 @@ queue_deferred_unlink (const char *name, bool is_dir) if (dunlink_head && records_written > dunlink_head->records_written + deferred_unlink_delay) flush_deferred_unlinks (false); - + p = dunlink_alloc (); p->next = NULL; p->file_name = normalize_filename (name); p->is_dir = is_dir; p->records_written = records_written; - + if (dunlink_tail) dunlink_tail->next = p; else