diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c index b5cae9f12..68f7b2b9b 100644 --- a/archival/libunarchive/get_header_tar.c +++ b/archival/libunarchive/get_header_tar.c @@ -111,25 +111,6 @@ char get_header_tar(archive_handle_t *archive_handle) 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)) @@ -148,6 +129,24 @@ char get_header_tar(archive_handle_t *archive_handle) 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 */ @@ -209,10 +208,12 @@ char get_header_tar(archive_handle_t *archive_handle) /* 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); diff --git a/archival/libunarchive/header_verbose_list.c b/archival/libunarchive/header_verbose_list.c index 130b6a268..7b97e524c 100644 --- a/archival/libunarchive/header_verbose_list.c +++ b/archival/libunarchive/header_verbose_list.c @@ -3,9 +3,6 @@ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -#include -#include -#include #include "libbb.h" #include "unarchive.h" @@ -13,11 +10,11 @@ void header_verbose_list(const file_header_t *file_header) { 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, diff --git a/archival/tar.c b/archival/tar.c index 911c2d35e..6aaa42273 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -563,9 +563,9 @@ static char get_header_tar_Z(archive_handle_t *archive_handle) 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"); } diff --git a/coreutils/dd.c b/coreutils/dd.c index c0df0b75c..96ea32f06 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -29,8 +29,8 @@ static off_t out_full, out_part, in_full, in_part; 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); } diff --git a/coreutils/ls.c b/coreutils/ls.c index 909f4d54e..79e47ee6b 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -574,7 +574,7 @@ static int list_single(struct dnode *dn) 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)); @@ -604,7 +604,7 @@ static int list_single(struct dnode *dn) 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; diff --git a/include/libbb.h b/include/libbb.h index 2ccb6e7bb..ad64bad84 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -88,13 +88,14 @@ # 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 */ @@ -103,12 +104,12 @@ # 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!) */ @@ -703,7 +704,7 @@ extern const char bb_default_login_shell[]; #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 diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index 739a44155..a842401c0 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c @@ -149,7 +149,7 @@ int ftp_receive(ftp_host_info_t *server, FILE *control_stream, } 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 { diff --git a/networking/httpd.c b/networking/httpd.c index 97b04fb03..0de60ba06 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -889,8 +889,8 @@ static int sendHeaders(HttpResponseNum responseNum) 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; diff --git a/networking/wget.c b/networking/wget.c index f9a94627f..5a547ce1f 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -287,7 +287,7 @@ int wget_main(int argc, char **argv) #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); @@ -431,7 +431,7 @@ int wget_main(int argc, char **argv) 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; } diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c index bd2f1e87f..74c7710da 100644 --- a/util-linux/fdisk.c +++ b/util-linux/fdisk.c @@ -2277,7 +2277,7 @@ add_partition(int n, int sys) 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; }