@@ -192,19 +192,19 @@ mod readwrite_pv64 {
192
192
// 64-bit offsets on 32-bit platforms are passed in endianness-specific
193
193
// lo/hi pairs. See src/backend/linux_raw/conv.rs for details.
194
194
#[ cfg( all( target_endian = "little" , target_pointer_width = "32" ) ) ]
195
- fn lo ( x : u64 ) -> usize {
195
+ fn lo ( x : i64 ) -> usize {
196
196
( x >> 32 ) as usize
197
197
}
198
198
#[ cfg( all( target_endian = "little" , target_pointer_width = "32" ) ) ]
199
- fn hi ( x : u64 ) -> usize {
200
- ( x & 0xffff_ffff ) as usize
199
+ fn hi ( x : i64 ) -> usize {
200
+ x as usize
201
201
}
202
202
#[ cfg( all( target_endian = "big" , target_pointer_width = "32" ) ) ]
203
- fn lo ( x : u64 ) -> usize {
204
- ( x & 0xffff_ffff ) as usize
203
+ fn lo ( x : i64 ) -> usize {
204
+ x as usize
205
205
}
206
206
#[ cfg( all( target_endian = "big" , target_pointer_width = "32" ) ) ]
207
- fn hi ( x : u64 ) -> usize {
207
+ fn hi ( x : i64 ) -> usize {
208
208
( x >> 32 ) as usize
209
209
}
210
210
@@ -226,18 +226,28 @@ mod readwrite_pv64 {
226
226
} else {
227
227
#[ cfg( target_pointer_width = "32" ) ]
228
228
{
229
- libc:: syscall (
230
- libc:: SYS_preadv ,
231
- fd,
232
- iov,
233
- iovcnt,
234
- hi ( offset as u64 ) ,
235
- lo ( offset as u64 ) ,
236
- ) as libc:: ssize_t
229
+ syscall ! {
230
+ fn preadv(
231
+ fd: libc:: c_int,
232
+ iov: * const libc:: iovec,
233
+ iovcnt: libc:: c_int,
234
+ offset_hi: usize ,
235
+ offset_lo: usize
236
+ ) via SYS_preadv -> libc:: ssize_t
237
+ }
238
+ preadv ( fd, iov, iovcnt, hi ( offset) , lo ( offset) )
237
239
}
238
240
#[ cfg( target_pointer_width = "64" ) ]
239
241
{
240
- libc:: syscall ( libc:: SYS_preadv , fd, iov, iovcnt, offset) as libc:: ssize_t
242
+ syscall ! {
243
+ fn preadv(
244
+ fd: libc:: c_int,
245
+ iov: * const libc:: iovec,
246
+ iovcnt: libc:: c_int,
247
+ offset: libc:: off_t
248
+ ) via SYS_preadv -> libc:: ssize_t
249
+ }
250
+ preadv ( fd, iov, iovcnt, offset)
241
251
}
242
252
}
243
253
}
@@ -256,18 +266,28 @@ mod readwrite_pv64 {
256
266
} else {
257
267
#[ cfg( target_pointer_width = "32" ) ]
258
268
{
259
- libc:: syscall (
260
- libc:: SYS_pwritev ,
261
- fd,
262
- iov,
263
- iovcnt,
264
- hi ( offset as u64 ) ,
265
- lo ( offset as u64 ) ,
266
- ) as libc:: ssize_t
269
+ syscall ! {
270
+ fn pwritev(
271
+ fd: libc:: c_int,
272
+ iov: * const libc:: iovec,
273
+ iovcnt: libc:: c_int,
274
+ offset_hi: usize ,
275
+ offset_lo: usize
276
+ ) via SYS_pwritev -> libc:: ssize_t
277
+ }
278
+ pwritev ( fd, iov, iovcnt, hi ( offset) , lo ( offset) )
267
279
}
268
280
#[ cfg( target_pointer_width = "64" ) ]
269
281
{
270
- libc:: syscall ( libc:: SYS_pwritev , fd, iov, iovcnt, offset) as libc:: ssize_t
282
+ syscall ! {
283
+ fn pwritev(
284
+ fd: libc:: c_int,
285
+ iov: * const libc:: iovec,
286
+ iovcnt: libc:: c_int,
287
+ offset: libc:: off_t
288
+ ) via SYS_pwritev -> libc:: ssize_t
289
+ }
290
+ pwritev ( fd, iov, iovcnt, offset)
271
291
}
272
292
}
273
293
}
@@ -303,19 +323,19 @@ mod readwrite_pv64v2 {
303
323
// 64-bit offsets on 32-bit platforms are passed in endianness-specific
304
324
// lo/hi pairs. See src/backend/linux_raw/conv.rs for details.
305
325
#[ cfg( all( target_endian = "little" , target_pointer_width = "32" ) ) ]
306
- fn lo ( x : u64 ) -> usize {
326
+ fn lo ( x : i64 ) -> usize {
307
327
( x >> 32 ) as usize
308
328
}
309
329
#[ cfg( all( target_endian = "little" , target_pointer_width = "32" ) ) ]
310
- fn hi ( x : u64 ) -> usize {
311
- ( x & 0xffff_ffff ) as usize
330
+ fn hi ( x : i64 ) -> usize {
331
+ x as usize
312
332
}
313
333
#[ cfg( all( target_endian = "big" , target_pointer_width = "32" ) ) ]
314
- fn lo ( x : u64 ) -> usize {
315
- ( x & 0xffff_ffff ) as usize
334
+ fn lo ( x : i64 ) -> usize {
335
+ x as usize
316
336
}
317
337
#[ cfg( all( target_endian = "big" , target_pointer_width = "32" ) ) ]
318
- fn hi ( x : u64 ) -> usize {
338
+ fn hi ( x : i64 ) -> usize {
319
339
( x >> 32 ) as usize
320
340
}
321
341
@@ -338,19 +358,30 @@ mod readwrite_pv64v2 {
338
358
} else {
339
359
#[ cfg( target_pointer_width = "32" ) ]
340
360
{
341
- libc:: syscall (
342
- libc:: SYS_preadv2 ,
343
- fd,
344
- iov,
345
- iovcnt,
346
- hi ( offset as u64 ) ,
347
- lo ( offset as u64 ) ,
348
- flags,
349
- ) as libc:: ssize_t
361
+ syscall ! {
362
+ fn preadv2(
363
+ fd: libc:: c_int,
364
+ iov: * const libc:: iovec,
365
+ iovcnt: libc:: c_int,
366
+ offset_hi: usize ,
367
+ offset_lo: usize ,
368
+ flags: libc:: c_int
369
+ ) via SYS_preadv2 -> libc:: ssize_t
370
+ }
371
+ preadv2 ( fd, iov, iovcnt, hi ( offset) , lo ( offset) , flags)
350
372
}
351
373
#[ cfg( target_pointer_width = "64" ) ]
352
374
{
353
- libc:: syscall ( libc:: SYS_preadv2 , fd, iov, iovcnt, offset, flags) as libc:: ssize_t
375
+ syscall ! {
376
+ fn preadv2(
377
+ fd: libc:: c_int,
378
+ iov: * const libc:: iovec,
379
+ iovcnt: libc:: c_int,
380
+ offset: libc:: off_t,
381
+ flags: libc:: c_int
382
+ ) via SYS_preadv2 -> libc:: ssize_t
383
+ }
384
+ preadv2 ( fd, iov, iovcnt, offset, flags)
354
385
}
355
386
}
356
387
}
@@ -370,22 +401,136 @@ mod readwrite_pv64v2 {
370
401
} else {
371
402
#[ cfg( target_pointer_width = "32" ) ]
372
403
{
373
- libc:: syscall (
374
- libc:: SYS_pwritev ,
375
- fd,
376
- iov,
377
- iovcnt,
378
- hi ( offset as u64 ) ,
379
- lo ( offset as u64 ) ,
380
- flags,
381
- ) as libc:: ssize_t
404
+ syscall ! {
405
+ fn pwritev2(
406
+ fd: libc:: c_int,
407
+ iov: * const libc:: iovec,
408
+ iovec: libc:: c_int,
409
+ offset_hi: usize ,
410
+ offset_lo: usize ,
411
+ flags: libc:: c_int
412
+ ) via SYS_pwritev2 -> libc:: ssize_t
413
+ }
414
+ pwritev2 ( fd, iov, iovcnt, hi ( offset) , lo ( offset) , flags)
382
415
}
383
416
#[ cfg( target_pointer_width = "64" ) ]
384
417
{
385
- libc:: syscall ( libc:: SYS_pwritev2 , fd, iov, iovcnt, offset, flags) as libc:: ssize_t
418
+ syscall ! {
419
+ fn pwritev2(
420
+ fd: libc:: c_int,
421
+ iov: * const libc:: iovec,
422
+ iovcnt: libc:: c_int,
423
+ offset: libc:: off_t,
424
+ flags: libc:: c_int
425
+ ) via SYS_pwritev2 -> libc:: ssize_t
426
+ }
427
+ pwritev2 ( fd, iov, iovcnt, offset, flags)
386
428
}
387
429
}
388
430
}
389
431
}
390
432
#[ cfg( all( target_os = "linux" , target_env = "gnu" ) ) ]
391
433
pub ( super ) use readwrite_pv64v2:: { preadv64v2 as preadv2, pwritev64v2 as pwritev2} ;
434
+
435
+ // On non-glibc, assume we don't have `pwritev2`/`preadv2` in libc and use
436
+ // `c::syscall` instead.
437
+ #[ cfg( any(
438
+ target_os = "android" ,
439
+ all( target_os = "linux" , not( target_env = "gnu" ) ) ,
440
+ ) ) ]
441
+ mod readwrite_pv64v2 {
442
+ // 64-bit offsets on 32-bit platforms are passed in endianness-specific
443
+ // lo/hi pairs. See src/backend/linux_raw/conv.rs for details.
444
+ #[ cfg( all( target_endian = "little" , target_pointer_width = "32" ) ) ]
445
+ fn lo ( x : i64 ) -> usize {
446
+ ( x >> 32 ) as usize
447
+ }
448
+ #[ cfg( all( target_endian = "little" , target_pointer_width = "32" ) ) ]
449
+ fn hi ( x : i64 ) -> usize {
450
+ x as usize
451
+ }
452
+ #[ cfg( all( target_endian = "big" , target_pointer_width = "32" ) ) ]
453
+ fn lo ( x : i64 ) -> usize {
454
+ x as usize
455
+ }
456
+ #[ cfg( all( target_endian = "big" , target_pointer_width = "32" ) ) ]
457
+ fn hi ( x : i64 ) -> usize {
458
+ ( x >> 32 ) as usize
459
+ }
460
+
461
+ pub ( in super :: super ) unsafe fn preadv64v2 (
462
+ fd : libc:: c_int ,
463
+ iov : * const libc:: iovec ,
464
+ iovcnt : libc:: c_int ,
465
+ offset : libc:: off64_t ,
466
+ flags : libc:: c_int ,
467
+ ) -> libc:: ssize_t {
468
+ #[ cfg( target_pointer_width = "32" ) ]
469
+ {
470
+ syscall ! {
471
+ fn preadv2(
472
+ fd: libc:: c_int,
473
+ iov: * const libc:: iovec,
474
+ iovcnt: libc:: c_int,
475
+ offset_hi: usize ,
476
+ offset_lo: usize ,
477
+ flags: libc:: c_int
478
+ ) via SYS_preadv2 -> libc:: ssize_t
479
+ }
480
+ preadv2 ( fd, iov, iovcnt, hi ( offset) , lo ( offset) , flags)
481
+ }
482
+ #[ cfg( target_pointer_width = "64" ) ]
483
+ {
484
+ syscall ! {
485
+ fn preadv2(
486
+ fd: libc:: c_int,
487
+ iov: * const libc:: iovec,
488
+ iovcnt: libc:: c_int,
489
+ offset: libc:: off_t,
490
+ flags: libc:: c_int
491
+ ) via SYS_preadv2 -> libc:: ssize_t
492
+ }
493
+ preadv2 ( fd, iov, iovcnt, offset, flags)
494
+ }
495
+ }
496
+ pub ( in super :: super ) unsafe fn pwritev64v2 (
497
+ fd : libc:: c_int ,
498
+ iov : * const libc:: iovec ,
499
+ iovcnt : libc:: c_int ,
500
+ offset : libc:: off64_t ,
501
+ flags : libc:: c_int ,
502
+ ) -> libc:: ssize_t {
503
+ #[ cfg( target_pointer_width = "32" ) ]
504
+ {
505
+ syscall ! {
506
+ fn pwritev2(
507
+ fd: libc:: c_int,
508
+ iov: * const libc:: iovec,
509
+ iovcnt: libc:: c_int,
510
+ offset_hi: usize ,
511
+ offset_lo: usize ,
512
+ flags: libc:: c_int
513
+ ) via SYS_pwritev2 -> libc:: ssize_t
514
+ }
515
+ pwritev2 ( fd, iov, iovcnt, hi ( offset) , lo ( offset) , flags)
516
+ }
517
+ #[ cfg( target_pointer_width = "64" ) ]
518
+ {
519
+ syscall ! {
520
+ fn pwritev2(
521
+ fd: libc:: c_int,
522
+ iov: * const libc:: iovec,
523
+ iovcnt: libc:: c_int,
524
+ offset: libc:: off_t,
525
+ flags: libc:: c_int
526
+ ) via SYS_pwritev2 -> libc:: ssize_t
527
+ }
528
+ pwritev2 ( fd, iov, iovcnt, offset, flags)
529
+ }
530
+ }
531
+ }
532
+ #[ cfg( any(
533
+ target_os = "android" ,
534
+ all( target_os = "linux" , not( target_env = "gnu" ) ) ,
535
+ ) ) ]
536
+ pub ( super ) use readwrite_pv64v2:: { preadv64v2 as preadv2, pwritev64v2 as pwritev2} ;
0 commit comments