1 /* Miscellaneous functions, not really specific to GNU tar.
3 Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005 Free Software Foundation, Inc.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any later
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
14 Public License for more details.
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
25 #include <unlinkdir.h>
27 static void call_arg_fatal (char const *, char const *)
28 __attribute__ ((noreturn
));
30 /* Handling strings. */
32 /* Assign STRING to a copy of VALUE if not zero, or to zero. If
33 STRING was nonzero, it is freed first. */
35 assign_string (char **string
, const char *value
)
39 *string
= value
? xstrdup (value
) : 0;
42 /* Allocate a copy of the string quoted as in C, and returns that. If
43 the string does not have to be quoted, it returns a null pointer.
44 The allocated copy should normally be freed with free() after the
45 caller is done with it.
47 This is used in one context only: generating the directory file in
48 incremental dumps. The quoted string is not intended for human
49 consumption; it is intended only for unquote_string. The quoting
50 is locale-independent, so that users needn't worry about locale
51 when reading directory files. This means that we can't use
52 quotearg, as quotearg is locale-dependent and is meant for human
55 quote_copy_string (const char *string
)
57 const char *source
= string
;
58 char *destination
= 0;
64 int character
= *source
++;
71 size_t length
= (source
- string
) - 1;
74 buffer
= xmalloc (length
+ 2 + 2 * strlen (source
) + 1);
75 memcpy (buffer
, string
, length
);
76 destination
= buffer
+ length
;
78 *destination
++ = '\\';
79 *destination
++ = character
== '\\' ? '\\' : 'n';
84 *destination
++ = character
;
96 /* Takes a quoted C string (like those produced by quote_copy_string)
97 and turns it back into the un-quoted original. This is done in
98 place. Returns 0 only if the string was not properly quoted, but
99 completes the unquoting anyway.
101 This is used for reading the saved directory file in incremental
102 dumps. It is used for decoding old `N' records (demangling names).
103 But also, it is used for decoding file arguments, would they come
104 from the shell or a -T file, and for decoding the --exclude
107 unquote_string (char *string
)
110 char *source
= string
;
111 char *destination
= string
;
113 /* Escape sequences other than \\ and \n are no longer generated by
114 quote_copy_string, but accept them for backwards compatibility,
115 and also because unquote_string is used for purposes other than
116 parsing the output of quote_copy_string. */
123 *destination
++ = '\\';
128 *destination
++ = '\a';
133 *destination
++ = '\b';
138 *destination
++ = '\f';
143 *destination
++ = '\n';
148 *destination
++ = '\r';
153 *destination
++ = '\t';
158 *destination
++ = '\v';
163 *destination
++ = 0177;
176 int value
= *source
++ - '0';
178 if (*source
< '0' || *source
> '7')
180 *destination
++ = value
;
183 value
= value
* 8 + *source
++ - '0';
184 if (*source
< '0' || *source
> '7')
186 *destination
++ = value
;
189 value
= value
* 8 + *source
++ - '0';
190 *destination
++ = value
;
196 *destination
++ = '\\';
198 *destination
++ = *source
++;
201 else if (source
!= destination
)
202 *destination
++ = *source
++;
204 source
++, destination
++;
206 if (source
!= destination
)
213 /* Saved names in case backup needs to be undone. */
214 static char *before_backup_name
;
215 static char *after_backup_name
;
217 /* Return 1 if FILE_NAME is obviously "." or "/". */
219 must_be_dot_or_slash (char const *file_name
)
221 file_name
+= FILE_SYSTEM_PREFIX_LEN (file_name
);
223 if (ISSLASH (file_name
[0]))
226 if (ISSLASH (file_name
[1]))
228 else if (file_name
[1] == '.'
229 && ISSLASH (file_name
[2 + (file_name
[2] == '.')]))
230 file_name
+= 2 + (file_name
[2] == '.');
232 return ! file_name
[1];
236 while (file_name
[0] == '.' && ISSLASH (file_name
[1]))
239 while (ISSLASH (*file_name
))
243 return ! file_name
[0] || (file_name
[0] == '.' && ! file_name
[1]);
247 /* Some implementations of rmdir let you remove '.' or '/'.
248 Report an error with errno set to zero for obvious cases of this;
249 otherwise call rmdir. */
251 safer_rmdir (const char *file_name
)
253 if (must_be_dot_or_slash (file_name
))
259 return rmdir (file_name
);
262 /* Remove FILE_NAME, returning 1 on success. If FILE_NAME is a directory,
263 then if OPTION is RECURSIVE_REMOVE_OPTION is set remove FILE_NAME
264 recursively; otherwise, remove it only if it is empty. If FILE_NAME is
265 a directory that cannot be removed (e.g., because it is nonempty)
266 and if OPTION is WANT_DIRECTORY_REMOVE_OPTION, then return -1.
267 Return 0 on error, with errno set; if FILE_NAME is obviously the working
268 directory return zero with errno set to zero. */
270 remove_any_file (const char *file_name
, enum remove_option option
)
272 /* Try unlink first if we cannot unlink directories, as this saves
273 us a system call in the common case where we're removing a
275 bool try_unlink_first
= cannot_unlink_dir ();
277 if (try_unlink_first
)
279 if (unlink (file_name
) == 0)
282 /* POSIX 1003.1-2001 requires EPERM when attempting to unlink a
283 directory without appropriate privileges, but many Linux
284 kernels return the more-sensible EISDIR. */
285 if (errno
!= EPERM
&& errno
!= EISDIR
)
289 if (safer_rmdir (file_name
) == 0)
295 return !try_unlink_first
&& unlink (file_name
) == 0;
299 #if defined ENOTEMPTY && ENOTEMPTY != EEXIST
304 case ORDINARY_REMOVE_OPTION
:
307 case WANT_DIRECTORY_REMOVE_OPTION
:
310 case RECURSIVE_REMOVE_OPTION
:
312 char *directory
= savedir (file_name
);
319 for (entry
= directory
;
320 (entrylen
= strlen (entry
)) != 0;
321 entry
+= entrylen
+ 1)
323 char *file_name_buffer
= new_name (file_name
, entry
);
324 int r
= remove_any_file (file_name_buffer
,
325 RECURSIVE_REMOVE_OPTION
);
327 free (file_name_buffer
);
338 return safer_rmdir (file_name
) == 0;
347 /* Check if FILE_NAME already exists and make a backup of it right now.
348 Return success (nonzero) only if the backup is either unneeded, or
349 successful. For now, directories are considered to never need
350 backup. If THIS_IS_THE_ARCHIVE is nonzero, this is the archive and
351 so, we do not have to backup block or character devices, nor remote
354 maybe_backup_file (const char *file_name
, int this_is_the_archive
)
356 struct stat file_stat
;
358 /* Check if we really need to backup the file. */
360 if (this_is_the_archive
&& _remdev (file_name
))
363 if (stat (file_name
, &file_stat
))
368 stat_error (file_name
);
372 if (S_ISDIR (file_stat
.st_mode
))
375 if (this_is_the_archive
376 && (S_ISBLK (file_stat
.st_mode
) || S_ISCHR (file_stat
.st_mode
)))
379 assign_string (&before_backup_name
, file_name
);
381 /* A run situation may exist between Emacs or other GNU programs trying to
382 make a backup for the same file simultaneously. If theoretically
383 possible, real problems are unlikely. Doing any better would require a
384 convention, GNU-wide, for all programs doing backups. */
386 assign_string (&after_backup_name
, 0);
387 after_backup_name
= find_backup_file_name (file_name
, backup_type
);
388 if (! after_backup_name
)
391 if (rename (before_backup_name
, after_backup_name
) == 0)
394 fprintf (stdlis
, _("Renaming %s to %s\n"),
395 quote_n (0, before_backup_name
),
396 quote_n (1, after_backup_name
));
401 /* The backup operation failed. */
403 ERROR ((0, e
, _("%s: Cannot rename to %s"),
404 quotearg_colon (before_backup_name
),
405 quote_n (1, after_backup_name
)));
406 assign_string (&after_backup_name
, 0);
411 /* Try to restore the recently backed up file to its original name.
412 This is usually only needed after a failed extraction. */
414 undo_last_backup (void)
416 if (after_backup_name
)
418 if (rename (after_backup_name
, before_backup_name
) != 0)
421 ERROR ((0, e
, _("%s: Cannot rename to %s"),
422 quotearg_colon (after_backup_name
),
423 quote_n (1, before_backup_name
)));
426 fprintf (stdlis
, _("Renaming %s back to %s\n"),
427 quote_n (0, after_backup_name
),
428 quote_n (1, before_backup_name
));
429 assign_string (&after_backup_name
, 0);
433 /* Depending on DEREF, apply either stat or lstat to (NAME, BUF). */
435 deref_stat (bool deref
, char const *name
, struct stat
*buf
)
437 return deref
? stat (name
, buf
) : lstat (name
, buf
);
440 /* A description of a working directory. */
445 struct saved_cwd saved_cwd
;
448 /* A vector of chdir targets. wd[0] is the initial working directory. */
449 static struct wd
*wd
;
451 /* The number of working directories in the vector. */
454 /* The allocated size of the vector. */
455 static size_t wd_alloc
;
457 /* DIR is the operand of a -C option; add it to vector of chdir targets,
458 and return the index of its location. */
460 chdir_arg (char const *dir
)
464 wd_alloc
= 2 * (wd_alloc
+ 1);
465 wd
= xrealloc (wd
, sizeof *wd
* wd_alloc
);
474 /* Optimize the common special case of the working directory,
475 or the working directory as a prefix. */
478 while (dir
[0] == '.' && ISSLASH (dir
[1]))
479 for (dir
+= 2; ISSLASH (*dir
); dir
++)
481 if (! dir
[dir
[0] == '.'])
490 /* Change to directory I. If I is 0, change to the initial working
491 directory; otherwise, I must be a value returned by chdir_arg. */
499 struct wd
*prev
= &wd
[previous
];
500 struct wd
*curr
= &wd
[i
];
505 if (save_cwd (&prev
->saved_cwd
) != 0)
506 FATAL_ERROR ((0, 0, _("Cannot save working directory")));
511 if (restore_cwd (&curr
->saved_cwd
))
512 FATAL_ERROR ((0, 0, _("Cannot change working directory")));
516 if (i
&& ! ISSLASH (curr
->name
[0]))
518 if (chdir (curr
->name
) != 0)
519 chdir_fatal (curr
->name
);
526 /* Decode MODE from its binary form in a stat structure, and encode it
527 into a 9-byte string STRING, terminated with a NUL. */
530 decode_mode (mode_t mode
, char *string
)
532 *string
++ = mode
& S_IRUSR
? 'r' : '-';
533 *string
++ = mode
& S_IWUSR
? 'w' : '-';
534 *string
++ = (mode
& S_ISUID
535 ? (mode
& S_IXUSR
? 's' : 'S')
536 : (mode
& S_IXUSR
? 'x' : '-'));
537 *string
++ = mode
& S_IRGRP
? 'r' : '-';
538 *string
++ = mode
& S_IWGRP
? 'w' : '-';
539 *string
++ = (mode
& S_ISGID
540 ? (mode
& S_IXGRP
? 's' : 'S')
541 : (mode
& S_IXGRP
? 'x' : '-'));
542 *string
++ = mode
& S_IROTH
? 'r' : '-';
543 *string
++ = mode
& S_IWOTH
? 'w' : '-';
544 *string
++ = (mode
& S_ISVTX
545 ? (mode
& S_IXOTH
? 't' : 'T')
546 : (mode
& S_IXOTH
? 'x' : '-'));
550 /* Report an error associated with the system call CALL and the
551 optional name NAME. */
553 call_arg_error (char const *call
, char const *name
)
556 /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
557 Directly translating this to another language will not work, first because
558 %s itself is not translated.
559 Translate it as `%s: Function %s failed'. */
560 ERROR ((0, e
, _("%s: Cannot %s"), quotearg_colon (name
), call
));
563 /* Report a fatal error associated with the system call CALL and
564 the optional file name NAME. */
566 call_arg_fatal (char const *call
, char const *name
)
569 /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
570 Directly translating this to another language will not work, first because
571 %s itself is not translated.
572 Translate it as `%s: Function %s failed'. */
573 FATAL_ERROR ((0, e
, _("%s: Cannot %s"), quotearg_colon (name
), call
));
576 /* Report a warning associated with the system call CALL and
577 the optional file name NAME. */
579 call_arg_warn (char const *call
, char const *name
)
582 /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'.
583 Directly translating this to another language will not work, first because
584 %s itself is not translated.
585 Translate it as `%s: Function %s failed'. */
586 WARN ((0, e
, _("%s: Warning: Cannot %s"), quotearg_colon (name
), call
));
590 chdir_fatal (char const *name
)
592 call_arg_fatal ("chdir", name
);
596 chmod_error_details (char const *name
, mode_t mode
)
600 decode_mode (mode
, buf
);
601 ERROR ((0, e
, _("%s: Cannot change mode to %s"),
602 quotearg_colon (name
), buf
));
606 chown_error_details (char const *name
, uid_t uid
, gid_t gid
)
609 ERROR ((0, e
, _("%s: Cannot change ownership to uid %lu, gid %lu"),
610 quotearg_colon (name
), (unsigned long) uid
, (unsigned long) gid
));
614 close_error (char const *name
)
616 call_arg_error ("close", name
);
620 close_warn (char const *name
)
622 call_arg_warn ("close", name
);
626 close_diag (char const *name
)
628 if (ignore_failed_read_option
)
635 exec_fatal (char const *name
)
637 call_arg_fatal ("exec", name
);
641 link_error (char const *target
, char const *source
)
644 ERROR ((0, e
, _("%s: Cannot hard link to %s"),
645 quotearg_colon (source
), quote_n (1, target
)));
649 mkdir_error (char const *name
)
651 call_arg_error ("mkdir", name
);
655 mkfifo_error (char const *name
)
657 call_arg_error ("mkfifo", name
);
661 mknod_error (char const *name
)
663 call_arg_error ("mknod", name
);
667 open_error (char const *name
)
669 call_arg_error ("open", name
);
673 open_fatal (char const *name
)
675 call_arg_fatal ("open", name
);
679 open_warn (char const *name
)
681 call_arg_warn ("open", name
);
685 open_diag (char const *name
)
687 if (ignore_failed_read_option
)
694 read_error (char const *name
)
696 call_arg_error ("read", name
);
700 read_error_details (char const *name
, off_t offset
, size_t size
)
702 char buf
[UINTMAX_STRSIZE_BOUND
];
705 ngettext ("%s: Read error at byte %s, while reading %lu byte",
706 "%s: Read error at byte %s, while reading %lu bytes",
708 quotearg_colon (name
), STRINGIFY_BIGINT (offset
, buf
),
709 (unsigned long) size
));
713 read_warn_details (char const *name
, off_t offset
, size_t size
)
715 char buf
[UINTMAX_STRSIZE_BOUND
];
718 ngettext ("%s: Warning: Read error at byte %s, while reading %lu byte",
719 "%s: Warning: Read error at byte %s, while reading %lu bytes",
721 quotearg_colon (name
), STRINGIFY_BIGINT (offset
, buf
),
722 (unsigned long) size
));
726 read_diag_details (char const *name
, off_t offset
, size_t size
)
728 if (ignore_failed_read_option
)
729 read_warn_details (name
, offset
, size
);
731 read_error_details (name
, offset
, size
);
735 read_fatal (char const *name
)
737 call_arg_fatal ("read", name
);
741 read_fatal_details (char const *name
, off_t offset
, size_t size
)
743 char buf
[UINTMAX_STRSIZE_BOUND
];
746 ngettext ("%s: Read error at byte %s, reading %lu byte",
747 "%s: Read error at byte %s, reading %lu bytes",
749 quotearg_colon (name
), STRINGIFY_BIGINT (offset
, buf
),
750 (unsigned long) size
));
754 readlink_error (char const *name
)
756 call_arg_error ("readlink", name
);
760 readlink_warn (char const *name
)
762 call_arg_warn ("readlink", name
);
766 readlink_diag (char const *name
)
768 if (ignore_failed_read_option
)
769 readlink_warn (name
);
771 readlink_error (name
);
775 savedir_error (char const *name
)
777 call_arg_error ("savedir", name
);
781 savedir_warn (char const *name
)
783 call_arg_warn ("savedir", name
);
787 savedir_diag (char const *name
)
789 if (ignore_failed_read_option
)
792 savedir_error (name
);
796 seek_error (char const *name
)
798 call_arg_error ("seek", name
);
802 seek_error_details (char const *name
, off_t offset
)
804 char buf
[UINTMAX_STRSIZE_BOUND
];
806 ERROR ((0, e
, _("%s: Cannot seek to %s"),
807 quotearg_colon (name
),
808 STRINGIFY_BIGINT (offset
, buf
)));
812 seek_warn (char const *name
)
814 call_arg_warn ("seek", name
);
818 seek_warn_details (char const *name
, off_t offset
)
820 char buf
[UINTMAX_STRSIZE_BOUND
];
822 WARN ((0, e
, _("%s: Warning: Cannot seek to %s"),
823 quotearg_colon (name
),
824 STRINGIFY_BIGINT (offset
, buf
)));
828 seek_diag_details (char const *name
, off_t offset
)
830 if (ignore_failed_read_option
)
831 seek_warn_details (name
, offset
);
833 seek_error_details (name
, offset
);
837 symlink_error (char const *contents
, char const *name
)
840 ERROR ((0, e
, _("%s: Cannot create symlink to %s"),
841 quotearg_colon (name
), quote_n (1, contents
)));
845 stat_fatal (char const *name
)
847 call_arg_fatal ("stat", name
);
851 stat_error (char const *name
)
853 call_arg_error ("stat", name
);
857 stat_warn (char const *name
)
859 call_arg_warn ("stat", name
);
863 stat_diag (char const *name
)
865 if (ignore_failed_read_option
)
872 truncate_error (char const *name
)
874 call_arg_error ("truncate", name
);
878 truncate_warn (char const *name
)
880 call_arg_warn ("truncate", name
);
884 unlink_error (char const *name
)
886 call_arg_error ("unlink", name
);
890 utime_error (char const *name
)
892 call_arg_error ("utime", name
);
896 waitpid_error (char const *name
)
898 call_arg_error ("waitpid", name
);
902 write_error (char const *name
)
904 call_arg_error ("write", name
);
908 write_error_details (char const *name
, size_t status
, size_t size
)
914 ngettext ("%s: Wrote only %lu of %lu byte",
915 "%s: Wrote only %lu of %lu bytes",
917 name
, (unsigned long int) status
, (unsigned long int) size
));
921 write_fatal (char const *name
)
923 call_arg_fatal ("write", name
);
927 write_fatal_details (char const *name
, ssize_t status
, size_t size
)
929 write_error_details (name
, status
, size
);
934 /* Fork, aborting if unsuccessful. */
940 call_arg_fatal ("fork", _("child process"));
944 /* Create a pipe, aborting if unsuccessful. */
949 call_arg_fatal ("pipe", _("interprocess channel"));
952 /* Return PTR, aligned upward to the next multiple of ALIGNMENT.
953 ALIGNMENT must be nonzero. The caller must arrange for ((char *)
954 PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
958 ptr_align (void *ptr
, size_t alignment
)
961 char *p1
= p0
+ alignment
- 1;
962 return p1
- (size_t) p1
% alignment
;
965 /* Return the address of a page-aligned buffer of at least SIZE bytes.
966 The caller should free *PTR when done with the buffer. */
969 page_aligned_alloc (void **ptr
, size_t size
)
971 size_t alignment
= getpagesize ();
972 size_t size1
= size
+ alignment
;
975 *ptr
= xmalloc (size1
);
976 return ptr_align (*ptr
, alignment
);