summaryrefslogtreecommitdiff
blob: 05a550a7920efabe173f0f8f7670060f0de14231 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
From https://github.com/ziglang/zig/commit/b20ccff515364cdb8f3e733cc950e53ab77656db Mon Sep 17 00:00:00 2001
From: Andrew Kelley <andrew@ziglang.org>
Date: Mon, 19 Jun 2023 15:17:01 -0700
Subject: [PATCH] std.os: update logic for 64-bit symbol choice

musl v1.2.4 dropped the "64"-suffixed aliases for legacy "LFS64" ("large
file support") interfaces, so this commit changes the corresponding Zig
logic to call the correct names.
--- a/lib/std/os.zig
+++ b/lib/std/os.zig
@@ -890,10 +890,7 @@ pub fn pread(fd: fd_t, buf: []u8, offset: u64) PReadError!usize {
     };
     const adjusted_len = @min(max_count, buf.len);
 
-    const pread_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.pread64
-    else
-        system.pread;
+    const pread_sym = if (lfs64_abi) system.pread64 else system.pread;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     while (true) {
@@ -966,10 +963,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {
     }
 
     while (true) {
-        const ftruncate_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-            system.ftruncate64
-        else
-            system.ftruncate;
+        const ftruncate_sym = if (lfs64_abi) system.ftruncate64 else system.ftruncate;
 
         const ilen = @bitCast(i64, length); // the OS treats this as unsigned
         switch (errno(ftruncate_sym(fd, ilen))) {
@@ -1034,10 +1028,7 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize {
 
     const iov_count = math.cast(u31, iov.len) orelse math.maxInt(u31);
 
-    const preadv_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.preadv64
-    else
-        system.preadv;
+    const preadv_sym = if (lfs64_abi) system.preadv64 else system.preadv;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     while (true) {
@@ -1311,10 +1302,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize {
     };
     const adjusted_len = @min(max_count, bytes.len);
 
-    const pwrite_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.pwrite64
-    else
-        system.pwrite;
+    const pwrite_sym = if (lfs64_abi) system.pwrite64 else system.pwrite;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     while (true) {
@@ -1400,10 +1388,7 @@ pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usiz
         }
     }
 
-    const pwritev_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.pwritev64
-    else
-        system.pwritev;
+    const pwritev_sym = if (lfs64_abi) system.pwritev64 else system.pwritev;
 
     const iov_count = if (iov.len > IOV_MAX) IOV_MAX else @intCast(u31, iov.len);
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
@@ -1514,10 +1499,7 @@ pub fn openZ(file_path: [*:0]const u8, flags: u32, perm: mode_t) OpenError!fd_t
         return open(mem.sliceTo(file_path, 0), flags, perm);
     }
 
-    const open_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.open64
-    else
-        system.open;
+    const open_sym = if (lfs64_abi) system.open64 else system.open;
 
     while (true) {
         const rc = open_sym(file_path, flags, perm);
@@ -1730,10 +1712,7 @@ pub fn openatZ(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t)
         return openat(dir_fd, mem.sliceTo(file_path, 0), flags, mode);
     }
 
-    const openat_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.openat64
-    else
-        system.openat;
+    const openat_sym = if (lfs64_abi) system.openat64 else system.openat;
 
     while (true) {
         const rc = openat_sym(dir_fd, file_path, flags, mode);
@@ -4117,10 +4096,7 @@ pub fn fstat(fd: fd_t) FStatError!Stat {
         @compileError("fstat is not yet implemented on Windows");
     }
 
-    const fstat_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.fstat64
-    else
-        system.fstat;
+    const fstat_sym = if (lfs64_abi) system.fstat64 else system.fstat;
 
     var stat = mem.zeroes(Stat);
     switch (errno(fstat_sym(fd, &stat))) {
@@ -4176,10 +4152,7 @@ pub fn fstatatZ(dirfd: fd_t, pathname: [*:0]const u8, flags: u32) FStatAtError!S
         return fstatatWasi(dirfd, mem.sliceTo(pathname), flags);
     }
 
-    const fstatat_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.fstatat64
-    else
-        system.fstatat;
+    const fstatat_sym = if (lfs64_abi) system.fstatat64 else system.fstatat;
 
     var stat = mem.zeroes(Stat);
     switch (errno(fstatat_sym(dirfd, pathname, &stat, flags))) {
@@ -4416,10 +4389,7 @@ pub fn mmap(
     fd: fd_t,
     offset: u64,
 ) MMapError![]align(mem.page_size) u8 {
-    const mmap_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.mmap64
-    else
-        system.mmap;
+    const mmap_sym = if (lfs64_abi) system.mmap64 else system.mmap;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     const rc = mmap_sym(ptr, length, prot, flags, fd, ioffset);
@@ -4823,10 +4793,7 @@ pub fn lseek_SET(fd: fd_t, offset: u64) SeekError!void {
         }
     }
 
-    const lseek_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.lseek64
-    else
-        system.lseek;
+    const lseek_sym = if (lfs64_abi) system.lseek64 else system.lseek;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     switch (errno(lseek_sym(fd, ioffset, SEEK.SET))) {
@@ -4870,10 +4837,7 @@ pub fn lseek_CUR(fd: fd_t, offset: i64) SeekError!void {
             else => |err| return unexpectedErrno(err),
         }
     }
-    const lseek_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.lseek64
-    else
-        system.lseek;
+    const lseek_sym = if (lfs64_abi) system.lseek64 else system.lseek;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     switch (errno(lseek_sym(fd, ioffset, SEEK.CUR))) {
@@ -4917,10 +4881,7 @@ pub fn lseek_END(fd: fd_t, offset: i64) SeekError!void {
             else => |err| return unexpectedErrno(err),
         }
     }
-    const lseek_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.lseek64
-    else
-        system.lseek;
+    const lseek_sym = if (lfs64_abi) system.lseek64 else system.lseek;
 
     const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
     switch (errno(lseek_sym(fd, ioffset, SEEK.END))) {
@@ -4964,10 +4925,7 @@ pub fn lseek_CUR_get(fd: fd_t) SeekError!u64 {
             else => |err| return unexpectedErrno(err),
         }
     }
-    const lseek_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.lseek64
-    else
-        system.lseek;
+    const lseek_sym = if (lfs64_abi) system.lseek64 else system.lseek;
 
     const rc = lseek_sym(fd, 0, SEEK.CUR);
     switch (errno(rc)) {
@@ -6169,10 +6127,7 @@ pub fn sendfile(
             // TODO we should not need this cast; improve return type of @min
             const adjusted_count = @intCast(usize, adjusted_count_tmp);
 
-            const sendfile_sym = if (builtin.link_libc)
-                system.sendfile64
-            else
-                system.sendfile;
+            const sendfile_sym = if (lfs64_abi) system.sendfile64 else system.sendfile;
 
             while (true) {
                 var offset: off_t = @bitCast(off_t, in_offset);
@@ -7050,10 +7005,7 @@ pub fn prctl(option: PR, args: anytype) PrctlError!u31 {
 pub const GetrlimitError = UnexpectedError;
 
 pub fn getrlimit(resource: rlimit_resource) GetrlimitError!rlimit {
-    const getrlimit_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.getrlimit64
-    else
-        system.getrlimit;
+    const getrlimit_sym = if (lfs64_abi) system.getrlimit64 else system.getrlimit;
 
     var limits: rlimit = undefined;
     switch (errno(getrlimit_sym(resource, &limits))) {
@@ -7067,10 +7019,7 @@ pub fn getrlimit(resource: rlimit_resource) GetrlimitError!rlimit {
 pub const SetrlimitError = error{ PermissionDenied, LimitTooBig } || UnexpectedError;
 
 pub fn setrlimit(resource: rlimit_resource, limits: rlimit) SetrlimitError!void {
-    const setrlimit_sym = if (builtin.os.tag == .linux and builtin.link_libc)
-        system.setrlimit64
-    else
-        system.setrlimit;
+    const setrlimit_sym = if (lfs64_abi) system.setrlimit64 else system.setrlimit;
 
     switch (errno(setrlimit_sym(resource, &limits))) {
         .SUCCESS => return,
@@ -7339,3 +7288,5 @@ pub fn ptrace(request: u32, pid: pid_t, addr: usize, signal: usize) PtraceError!
         },
     };
 }
+
+const lfs64_abi = builtin.os.tag == .linux and builtin.link_libc and builtin.abi.isGnu();