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.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-#include "system.h"
-#include "rmt.h"
+#include <system.h>
+#include <rmt.h>
#include "common.h"
#include <quotearg.h>
#include <save-cwd.h>
+#include <unlinkdir.h>
static void call_arg_fatal (char const *, char const *)
__attribute__ ((noreturn));
*destination++ = '\a';
source++;
break;
-
+
case 'b':
*destination++ = '\b';
source++;
*destination++ = '\v';
source++;
break;
-
+
case '?':
*destination++ = 0177;
source++;
for (;;)
if (ISSLASH (file_name[1]))
file_name++;
- else if (file_name[1] == '.'
+ else if (file_name[1] == '.'
&& ISSLASH (file_name[2 + (file_name[2] == '.')]))
file_name += 2 + (file_name[2] == '.');
else
return rmdir (file_name);
}
-/* Remove FILE_NAME, returning 1 on success. If FILE_NAME is a directory,
+/* Remove FILE_NAME, returning 1 on success. If FILE_NAME is a directory,
then if OPTION is RECURSIVE_REMOVE_OPTION is set remove FILE_NAME
recursively; otherwise, remove it only if it is empty. If FILE_NAME is
a directory that cannot be removed (e.g., because it is nonempty)
int
remove_any_file (const char *file_name, enum remove_option option)
{
- /* Try unlink first if we are not root, as this saves us a system
- call in the common case where we're removing a non-directory. */
- if (! we_are_root)
+ /* Try unlink first if we cannot unlink directories, as this saves
+ us a system call in the common case where we're removing a
+ non-directory. */
+ if (cannot_unlink_dir ())
{
if (unlink (file_name) == 0)
return 1;
switch (errno)
{
case ENOTDIR:
- return we_are_root && unlink (file_name) == 0;
+ return cannot_unlink_dir () && unlink (file_name) == 0;
case 0:
case EEXIST:
entry += entrylen + 1)
{
char *file_name_buffer = new_name (file_name, entry);
- int r = remove_any_file (file_name_buffer, 1);
+ int r = remove_any_file (file_name_buffer,
+ RECURSIVE_REMOVE_OPTION);
int e = errno;
free (file_name_buffer);
call_arg_error (char const *call, char const *name)
{
int e = errno;
+ /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+ Directly translating this to another language will not work, first because
+ %s itself is not translated.
+ Translate it as `%s: Function %s failed'. */
ERROR ((0, e, _("%s: Cannot %s"), quotearg_colon (name), call));
}
call_arg_fatal (char const *call, char const *name)
{
int e = errno;
+ /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+ Directly translating this to another language will not work, first because
+ %s itself is not translated.
+ Translate it as `%s: Function %s failed'. */
FATAL_ERROR ((0, e, _("%s: Cannot %s"), quotearg_colon (name), call));
}
call_arg_warn (char const *call, char const *name)
{
int e = errno;
+ /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
+ Directly translating this to another language will not work, first because
+ %s itself is not translated.
+ Translate it as `%s: Function %s failed'. */
WARN ((0, e, _("%s: Warning: Cannot %s"), quotearg_colon (name), call));
}
char buf[UINTMAX_STRSIZE_BOUND];
int e = errno;
ERROR ((0, e,
- ngettext ("%s: Read error at byte %s, reading %lu byte",
- "%s: Read error at byte %s, reading %lu bytes",
+ ngettext ("%s: Read error at byte %s, while reading %lu byte",
+ "%s: Read error at byte %s, while reading %lu bytes",
size),
quotearg_colon (name), STRINGIFY_BIGINT (offset, buf),
(unsigned long) size));
char buf[UINTMAX_STRSIZE_BOUND];
int e = errno;
WARN ((0, e,
- ngettext ("%s: Warning: Read error at byte %s, reading %lu byte",
- "%s: Warning: Read error at byte %s, reading %lu bytes",
+ ngettext ("%s: Warning: Read error at byte %s, while reading %lu byte",
+ "%s: Warning: Read error at byte %s, while reading %lu bytes",
size),
quotearg_colon (name), STRINGIFY_BIGINT (offset, buf),
(unsigned long) size));
quotearg_colon (name), quote_n (1, contents)));
}
+void
+stat_fatal (char const *name)
+{
+ call_arg_fatal ("stat", name);
+}
+
void
stat_error (char const *name)
{