From 894f8cb1395d3409bb995d18abc1b3409c557d01 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 3 Jan 2014 14:49:37 -0800 Subject: [PATCH] Fix dev_t (for LP64). 32-bit Android's dev_t was wrong too. We can't fix that without ABI breakage, but we can at least fix 64-bit Android. And add tests. Bug: https://code.google.com/p/android/issues/detail?id=54966 Change-Id: Ie2e42cc042b78b669a1a44e55f959dbd9c52c5c9 --- libc/include/sys/_types.h | 1 - libc/include/sys/types.h | 12 +++++++++-- tests/Android.mk | 1 + tests/sys_types_test.cpp | 43 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 tests/sys_types_test.cpp diff --git a/libc/include/sys/_types.h b/libc/include/sys/_types.h index 9a992ae36..9d313d10e 100644 --- a/libc/include/sys/_types.h +++ b/libc/include/sys/_types.h @@ -37,7 +37,6 @@ #include typedef unsigned long __cpuid_t; /* CPU id */ -typedef __int32_t __dev_t; /* device number */ typedef __uint32_t __fixpt_t; /* fixed point number */ typedef __uint32_t __gid_t; /* group id */ typedef __uint32_t __id_t; /* may contain pid, uid or gid */ diff --git a/libc/include/sys/types.h b/libc/include/sys/types.h index e0b655075..f8ae8136c 100644 --- a/libc/include/sys/types.h +++ b/libc/include/sys/types.h @@ -47,10 +47,8 @@ typedef __kernel_caddr_t caddr_t; typedef __kernel_clock_t clock_t; typedef __kernel_clockid_t clockid_t; typedef __kernel_daddr_t daddr_t; -typedef uint32_t dev_t; typedef unsigned long fsblkcnt_t; typedef unsigned long fsfilcnt_t; -typedef uint32_t id_t; typedef __kernel_ino_t ino_t; typedef __kernel_key_t key_t; typedef __kernel_mode_t mode_t; @@ -60,6 +58,13 @@ typedef __kernel_suseconds_t suseconds_t; typedef __kernel_timer_t timer_t; typedef unsigned int useconds_t; +#if !defined(__LP64__) +/* This historical accident means that we had a 32-bit dev_t on 32-bit architectures. */ +typedef uint32_t dev_t; +#else +typedef uint64_t dev_t; +#endif + /* This historical accident means that we had a 32-bit time_t on 32-bit architectures. */ typedef __kernel_time_t time_t; @@ -71,6 +76,9 @@ typedef __kernel_off_t off_t; typedef __kernel_loff_t loff_t; typedef loff_t off64_t; +/* This one really is meant to be just 32 bits! */ +typedef uint32_t id_t; + /* while POSIX wants these in , we * declare then in instead */ #if 0 diff --git a/tests/Android.mk b/tests/Android.mk index 0a4db9134..916d0b28d 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -66,6 +66,7 @@ test_src_files = \ sys_stat_test.cpp \ sys_syscall_test.cpp \ sys_time_test.cpp \ + sys_types_test.cpp \ system_properties_test.cpp \ time_test.cpp \ unistd_test.cpp \ diff --git a/tests/sys_types_test.cpp b/tests/sys_types_test.cpp new file mode 100644 index 000000000..0793be2a4 --- /dev/null +++ b/tests/sys_types_test.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +TEST(sys_types, type_sizes) { + // gids, pids, and uids should be 32-bit on all systems. + ASSERT_EQ(4U, sizeof(gid_t)); + ASSERT_EQ(4U, sizeof(pid_t)); + ASSERT_EQ(4U, sizeof(uid_t)); + // id_t is the 'generic'. + ASSERT_EQ(4U, sizeof(id_t)); + + // Some types were too small on 32-bit Android by mistake, + // but are correct on 64-bit Android. +#if defined(__LP64__) + ASSERT_EQ(8U, sizeof(dev_t)); + ASSERT_EQ(8U, sizeof(off_t)); + ASSERT_EQ(8U, sizeof(time_t)); +#else + ASSERT_EQ(4U, sizeof(dev_t)); + ASSERT_EQ(4U, sizeof(off_t)); + ASSERT_EQ(4U, sizeof(time_t)); +#endif + // These were right even on 32-bit Android. + ASSERT_EQ(8U, sizeof(loff_t)); + ASSERT_EQ(8U, sizeof(off64_t)); +}