zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 37fa6f955d5c2c9e89a5b95751f7c393db1fe822 (tree)
parent afb1652c50f0b25d45ccbbd7aa37f1c20cf61b0b
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Thu, 16 Dec 2021 00:15:26 -0700

glibc: add stat_t64_cp.c to libnonshared.a

Fixes 32-bit architectures.

Diffstat:
Alib/libc/glibc/sysdeps/unix/sysv/linux/stat_t64_cp.c | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/glibc.zig | 61++++++++++++++++---------------------------------------------
2 files changed, 91 insertions(+), 45 deletions(-)

diff --git a/lib/libc/glibc/sysdeps/unix/sysv/linux/stat_t64_cp.c b/lib/libc/glibc/sysdeps/unix/sysv/linux/stat_t64_cp.c @@ -0,0 +1,75 @@ +/* Struct stat/stat64 to stat/stat64 conversion for Linux. + Copyright (C) 2020-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <https://www.gnu.org/licenses/>. */ + +#include <stat_t64_cp.h> +#include <string.h> +#include <errno.h> +#include <time.h> + +#if __TIMESIZE != 64 + +static inline bool +in_time_t_range (__time64_t t) +{ + time_t s = t; + return s == t; +} + +static inline struct timespec +valid_timespec64_to_timespec (const struct __timespec64 ts64) +{ + struct timespec ts; + + ts.tv_sec = (time_t) ts64.tv_sec; + ts.tv_nsec = ts64.tv_nsec; + + return ts; +} + +int +__cp_stat64_t64_stat64 (const struct __stat64_t64 *st64_t64, + struct stat64 *st64) +{ + if (! in_time_t_range (st64_t64->st_atim.tv_sec) + || ! in_time_t_range (st64_t64->st_mtim.tv_sec) + || ! in_time_t_range (st64_t64->st_ctim.tv_sec)) + { + __set_errno (EOVERFLOW); + return -1; + } + + /* Clear both pad and reserved fields. */ + memset (st64, 0, sizeof (*st64)); + + st64->st_dev = st64_t64->st_dev, + st64->st_ino = st64_t64->st_ino; + st64->st_mode = st64_t64->st_mode; + st64->st_nlink = st64_t64->st_nlink; + st64->st_uid = st64_t64->st_uid; + st64->st_gid = st64_t64->st_gid; + st64->st_rdev = st64_t64->st_rdev; + st64->st_size = st64_t64->st_size; + st64->st_blksize = st64_t64->st_blksize; + st64->st_blocks = st64_t64->st_blocks; + st64->st_atim = valid_timespec64_to_timespec (st64_t64->st_atim); + st64->st_mtim = valid_timespec64_to_timespec (st64_t64->st_mtim); + st64->st_ctim = valid_timespec64_to_timespec (st64_t64->st_ctim); + + return 0; +} +#endif diff --git a/src/glibc.zig b/src/glibc.zig @@ -274,7 +274,10 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void { const linux_prefix = lib_libc_glibc ++ "sysdeps" ++ s ++ "unix" ++ s ++ "sysv" ++ s ++ "linux" ++ s; const Flavor = enum { nonshared, shared }; - const Dep = struct { path: []const u8, flavor: Flavor }; + const Dep = struct { + path: []const u8, + flavor: Flavor = .shared, + }; const deps = [_]Dep{ .{ .path = lib_libc_glibc ++ "stdlib" ++ s ++ "atexit.c", @@ -285,46 +288,6 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void { .flavor = .nonshared, }, .{ - .path = linux_prefix ++ "stat.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "fstat.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "lstat.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "stat64.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "fstat64.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "lstat64.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "fstatat.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "fstatat64.c", - .flavor = .shared, - }, - .{ - .path = linux_prefix ++ "mknodat.c", - .flavor = .shared, - }, - .{ - .path = lib_libc_glibc ++ "io" ++ s ++ "mknod.c", - .flavor = .shared, - }, - .{ .path = lib_libc_glibc ++ "sysdeps" ++ s ++ "pthread" ++ s ++ "pthread_atfork.c", .flavor = .nonshared, }, @@ -332,10 +295,18 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void { .path = lib_libc_glibc ++ "debug" ++ s ++ "stack_chk_fail_local.c", .flavor = .nonshared, }, - .{ - .path = lib_libc_glibc ++ "csu" ++ s ++ "errno.c", - .flavor = .shared, - }, + .{ .path = lib_libc_glibc ++ "csu" ++ s ++ "errno.c" }, + .{ .path = linux_prefix ++ "stat.c" }, + .{ .path = linux_prefix ++ "fstat.c" }, + .{ .path = linux_prefix ++ "lstat.c" }, + .{ .path = linux_prefix ++ "stat64.c" }, + .{ .path = linux_prefix ++ "fstat64.c" }, + .{ .path = linux_prefix ++ "lstat64.c" }, + .{ .path = linux_prefix ++ "fstatat.c" }, + .{ .path = linux_prefix ++ "fstatat64.c" }, + .{ .path = linux_prefix ++ "mknodat.c" }, + .{ .path = lib_libc_glibc ++ "io" ++ s ++ "mknod.c" }, + .{ .path = linux_prefix ++ "stat_t64_cp.c" }, }; var c_source_files: [deps.len]Compilation.CSourceFile = undefined;