bb_error_msg_and_die("invalid tar header checksum");
}
-#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
- if (longname) {
- file_header->name = longname;
- longname = NULL;
- }
- else if (linkname) {
- file_header->name = linkname;
- linkname = NULL;
- } else
-#endif
- {
- file_header->name = xstrndup(tar.name, sizeof(tar.name));
- if (tar.prefix[0]) {
- char *temp = file_header->name;
- file_header->name = concat_path_file(tar.prefix, temp);
- free(temp);
- }
- }
-
/* getOctal trashes subsequent field, therefore we call it
* on fields in reverse order */
#define GET_OCTAL(a) getOctal((a), sizeof(a))
file_header->mode = 07777 & GET_OCTAL(tar.mode);
#undef GET_OCTAL
+#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
+ if (longname) {
+ file_header->name = longname;
+ longname = NULL;
+ }
+ else if (linkname) {
+ file_header->name = linkname;
+ linkname = NULL;
+ } else
+#endif
+ { /* we trash mode[0] here, it's ok */
+ tar.name[sizeof(tar.name)] = '\0';
+ if (tar.prefix[0])
+ file_header->name = concat_path_file(tar.prefix, tar.name);
+ else
+ file_header->name = xstrdup(tar.name);
+ }
+
/* Set bits 12-15 of the files mode */
switch (tar.typeflag) {
/* busybox identifies hard links as being regular files with 0 size and a link name */
/* Strip trailing '/' in directories */
/* Must be done after mode is set as '/' is used to check if its a directory */
cp = last_char_is(file_header->name, '/');
- if (cp) *cp = '\0';
if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {
archive_handle->action_header(archive_handle->file_header);
+ /* Note that we kill the '/' only after action_header() */
+ /* (like GNU tar 1.15.1: verbose mode outputs "dir/dir/") */
+ if (cp) *cp = '\0';
archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
archive_handle->action_data(archive_handle);
llist_add_to(&(archive_handle->passed), file_header->name);
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
#include "libbb.h"
#include "unarchive.h"
{
struct tm *mtime = localtime(&(file_header->mtime));
- printf("%s %d/%d%10u %4u-%02u-%02u %02u:%02u:%02u %s",
+ printf("%s %d/%d %9"OFF_FMT"u %4u-%02u-%02u %02u:%02u:%02u %s",
bb_mode_string(file_header->mode),
file_header->uid,
file_header->gid,
- (unsigned int) file_header->size,
+ file_header->size,
1900 + mtime->tm_year,
1 + mtime->tm_mon,
mtime->tm_mday,
archive_handle->seek = seek_by_read;
/* do the decompression, and cleanup */
- if (xread_char(archive_handle->src_fd) != 0x1f ||
- xread_char(archive_handle->src_fd) != 0x9d)
- {
+ if (xread_char(archive_handle->src_fd) != 0x1f
+ || xread_char(archive_handle->src_fd) != 0x9d
+ ) {
bb_error_msg_and_die("invalid magic");
}
static void dd_output_status(int ATTRIBUTE_UNUSED cur_signal)
{
- fprintf(stderr, "%"OFF_FMT"+%"OFF_FMT" records in\n"
- "%"OFF_FMT"+%"OFF_FMT" records out\n",
+ fprintf(stderr, "%"OFF_FMT"d+%"OFF_FMT"d records in\n"
+ "%"OFF_FMT"d+%"OFF_FMT"d records out\n",
in_full, in_part,
out_full, out_part);
}
column += printf("%7ld ", (long) dn->dstat.st_ino);
break;
case LIST_BLOCKS:
- column += printf("%4"OFF_FMT" ", (off_t) dn->dstat.st_blocks >> 1);
+ column += printf("%4"OFF_FMT"d ", (off_t) dn->dstat.st_blocks >> 1);
break;
case LIST_MODEBITS:
column += printf("%-10s ", (char *) bb_mode_string(dn->dstat.st_mode));
column += printf("%9s ",
make_human_readable_str(dn->dstat.st_size, 1, 0));
} else {
- column += printf("%9"OFF_FMT" ", (off_t) dn->dstat.st_size);
+ column += printf("%9"OFF_FMT"d ", (off_t) dn->dstat.st_size);
}
}
break;
# define STRTOOFF strtol
# define SAFE_STRTOOFF safe_strtol
# define XSTRTOUOFF xstrtoul
-# define OFF_FMT "ld"
+/* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */
+# define OFF_FMT "l"
# else
/* "long" is too short, need "long long" */
# define STRTOOFF strtoll
# define SAFE_STRTOOFF safe_strtoll
# define XSTRTOUOFF xstrtoull
-# define OFF_FMT "lld"
+# define OFF_FMT "ll"
# endif
#else
# if 0 /* #if UINT_MAX == 0xffffffff */
# define STRTOOFF strtol
# define SAFE_STRTOOFF safe_strtoi
# define XSTRTOUOFF xstrtou
-# define OFF_FMT "d"
+# define OFF_FMT ""
# else
# define STRTOOFF strtol
# define SAFE_STRTOOFF safe_strtol
# define XSTRTOUOFF xstrtoul
-# define OFF_FMT "ld"
+# define OFF_FMT "l"
# endif
#endif
/* scary. better ideas? (but do *test* them first!) */
#define RB_POWER_OFF 0x4321fedc
#endif
-// Make sure we call functions instead of macros.
+/* Make sure we call functions instead of macros. */
#undef isalnum
#undef isalpha
#undef isascii
}
if (do_continue) {
- sprintf(buf, "REST %"OFF_FMT, beg_range);
+ sprintf(buf, "REST %"OFF_FMT"d", beg_range);
if (ftpcmd(buf, NULL, control_stream, buf) != 350) {
do_continue = 0;
} else {
if (config->ContentLength != -1) { /* file */
strftime(timeStr, sizeof(timeStr), RFC1123FMT, gmtime(&config->last_mod));
- len += sprintf(buf+len, "Last-Modified: %s\r\n%s %"OFF_FMT"\r\n",
- timeStr, "Content-length:", (off_t) config->ContentLength);
+ len += sprintf(buf+len, "Last-Modified: %s\r\n%s %"OFF_FMT"d\r\n",
+ timeStr, "Content-length:", config->ContentLength);
}
strcat(buf, "\r\n");
len += 2;
#endif
if (beg_range)
- fprintf(sfp, "Range: bytes=%"OFF_FMT"-\r\n", beg_range);
+ fprintf(sfp, "Range: bytes=%"OFF_FMT"d-\r\n", beg_range);
#if ENABLE_FEATURE_WGET_LONG_OPTIONS
if (extra_headers)
fputs(extra_headers, sfp);
dfp = open_socket(&s_in);
if (beg_range) {
- sprintf(buf, "REST %"OFF_FMT, beg_range);
+ sprintf(buf, "REST %"OFF_FMT"d", beg_range);
if (ftpcmd(buf, NULL, sfp, buf) == 350)
content_len -= beg_range;
}
if (start > limit)
break;
if (start >= temp+units_per_sector && num_read) {
- printf(_("Sector %"OFF_FMT" is already allocated\n"), temp);
+ printf(_("Sector %"OFF_FMT"d is already allocated\n"), temp);
temp = start;
num_read = 0;
}