aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2023-12-17 04:00:06 -0600
committerRob Landley <rob@landley.net>2023-12-17 04:00:06 -0600
commit5e48211929b6842ece062bee871675c9be36102f (patch)
tree392f357f3e2cc0c1625476b73ee9ec115a52bcac
parenta967146c9c181ed5b2880c1db3d2e184a105f750 (diff)
downloadtoybox-5e48211929b6842ece062bee871675c9be36102f.tar.gz
Switch peek() family from int64_t to long long so base types are consistent
on 32/64 bit, and switch some 64 bit constants to ULL for 32 bit.
-rw-r--r--lib/lib.c15
-rw-r--r--lib/lib.h6
-rw-r--r--toys/posix/file.c2
-rw-r--r--toys/posix/tar.c2
4 files changed, 13 insertions, 12 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 5bc8b7e8..a27c7bbf 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -106,7 +106,8 @@ void perror_exit_raw(char *msg)
perror_exit("%s", msg);
}
-// Keep reading until full or EOF
+// Keep reading until full or EOF. Note: assumes sigaction(SA_RESTART),
+// otherwise SIGSTOP/SIGCONT can return 0 from read/write without EOF.
ssize_t readall(int fd, void *buf, size_t len)
{
size_t count = 0;
@@ -665,19 +666,19 @@ int highest_bit(unsigned long l)
}
// Inefficient, but deals with unaligned access
-int64_t peek_le(void *ptr, unsigned size)
+long long peek_le(void *ptr, unsigned size)
{
- int64_t ret = 0;
+ long long ret = 0;
char *c = ptr;
int i;
- for (i=0; i<size; i++) ret |= ((int64_t)c[i])<<(i*8);
+ for (i=0; i<size; i++) ret |= ((long long)c[i])<<(i*8);
return ret;
}
-int64_t peek_be(void *ptr, unsigned size)
+long long peek_be(void *ptr, unsigned size)
{
- int64_t ret = 0;
+ long long ret = 0;
char *c = ptr;
int i;
@@ -685,7 +686,7 @@ int64_t peek_be(void *ptr, unsigned size)
return ret;
}
-int64_t peek(void *ptr, unsigned size)
+long long peek(void *ptr, unsigned size)
{
return (IS_BIG_ENDIAN ? peek_be : peek_le)(ptr, size);
}
diff --git a/lib/lib.h b/lib/lib.h
index 13a8e4dc..1ea16b6c 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -210,9 +210,9 @@ void msleep(long milliseconds);
void nanomove(struct timespec *ts, long long offset);
long long nanodiff(struct timespec *old, struct timespec *new);
int highest_bit(unsigned long l);
-int64_t peek_le(void *ptr, unsigned size);
-int64_t peek_be(void *ptr, unsigned size);
-int64_t peek(void *ptr, unsigned size);
+long long peek_le(void *ptr, unsigned size);
+long long peek_be(void *ptr, unsigned size);
+long long peek(void *ptr, unsigned size);
void poke_le(void *ptr, long long val, unsigned size);
void poke_be(void *ptr, long long val, unsigned size);
void poke(void *ptr, long long val, unsigned size);
diff --git a/toys/posix/file.c b/toys/posix/file.c
index 1fdbefde..70e15a03 100644
--- a/toys/posix/file.c
+++ b/toys/posix/file.c
@@ -305,7 +305,7 @@ static void do_regular_file(int fd, char *name)
xputc('\n');
} else if (len>4 && strstart(&s, "BZh") && isdigit(*s))
xprintf("bzip2 compressed data, block size = %c00k\n", *s);
- else if (len>31 && peek_be(s, 7) == 0xfd377a585a0000UL)
+ else if (len>31 && peek_be(s, 7) == 0xfd377a585a0000ULL)
xputs("xz compressed data");
else if (len>10 && strstart(&s, "\x1f\x8b")) xputs("gzip compressed data");
else if (len>32 && !smemcmp(s+1, "\xfa\xed\xfe", 3)) {
diff --git a/toys/posix/tar.c b/toys/posix/tar.c
index e760a43a..00cbe968 100644
--- a/toys/posix/tar.c
+++ b/toys/posix/tar.c
@@ -1063,7 +1063,7 @@ void tar_main(void)
// detect gzip and bzip signatures
if (SWAP_BE16(*(short *)hdr)==0x1f8b) toys.optflags |= FLAG_z;
else if (!smemcmp(hdr, "BZh", 3)) toys.optflags |= FLAG_j;
- else if (peek_be(hdr, 7) == 0xfd377a585a0000UL) toys.optflags |= FLAG_J;
+ else if (peek_be(hdr, 7) == 0xfd377a585a0000ULL) toys.optflags |= FLAG_J;
else error_exit("Not tar");
// if we can seek back we don't need to loop and copy data