mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
glibc: add stat_t64_cp.c to libnonshared.a
Fixes 32-bit architectures.
This commit is contained in:
parent
afb1652c50
commit
37fa6f955d
75
lib/libc/glibc/sysdeps/unix/sysv/linux/stat_t64_cp.c
Normal file
75
lib/libc/glibc/sysdeps/unix/sysv/linux/stat_t64_cp.c
Normal file
@ -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
|
||||
@ -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",
|
||||
@ -284,46 +287,6 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
|
||||
.path = lib_libc_glibc ++ "stdlib" ++ s ++ "at_quick_exit.c",
|
||||
.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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user