Skip to content

Commit fd30cfd

Browse files
authored
Auto merge of rust-lang#307 - darnuria:relative-directory-posix2008-api, r=alexcrichton
Add Directory file descriptor relative syscall. Add Directory file descriptor relative syscall. I only added "*at" syscall relative to Posix2008 specification. At the moment OSX and Android are partially supporting this API. This include: * `openat` * `faccessat` * `fchmodat` * `fchownat` * `fstatat` * `linkat` * `mkdirat` * `mknodat` [0] * `readlinkat` * `renameat` * `symlinkat` * `unlinkat` * `mkfifoat` [0][1] [1] Not available on Android at the moment: * `mkfifo` [1] Not available on OSX at the moment: * `mkfifoat` * `mknodat` And exclude operating system specific API: * `renameat2`: Linux specific * `execveat`: Linux specific since 3.19 * `futimesat`: GNU extension * `name_to_handle_at`: GNU extension * `scandirat`: GNU extension * `fanotify_mark`: belong to fanotify API.
2 parents 8a53df9 + 26ee782 commit fd30cfd

File tree

7 files changed

+150
-0
lines changed

7 files changed

+150
-0
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ script:
1818
cargo build --no-default-features &&
1919
rustc ci/style.rs && ./style src;
2020
fi
21+
osx_image: xcode7.3
2122
os:
2223
- linux
2324
- osx

src/unix/bsd/apple/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,33 @@ extern {
13681368
pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char;
13691369
pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
13701370
pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
1371+
1372+
pub fn openat(dirfd: ::c_int, pathname: *const ::c_char,
1373+
flags: ::c_int, ...) -> ::c_int;
1374+
pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char,
1375+
mode: ::c_int, flags: ::c_int) -> ::c_int;
1376+
pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char,
1377+
mode: ::mode_t, flags: ::c_int) -> ::c_int;
1378+
pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char,
1379+
owner: ::uid_t, group: ::gid_t,
1380+
flags: ::c_int) -> ::c_int;
1381+
#[cfg_attr(target_os = "macos", link_name = "fstatat$INODE64")]
1382+
pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char,
1383+
buf: *mut stat, flags: ::c_int) -> ::c_int;
1384+
pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char,
1385+
newdirfd: ::c_int, newpath: *const ::c_char,
1386+
flags: ::c_int) -> ::c_int;
1387+
pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char,
1388+
mode: ::mode_t) -> ::c_int;
1389+
pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char,
1390+
buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t;
1391+
pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char,
1392+
newdirfd: ::c_int, newpath: *const ::c_char)
1393+
-> ::c_int;
1394+
pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int,
1395+
linkpath: *const ::c_char) -> ::c_int;
1396+
pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char,
1397+
flags: ::c_int) -> ::c_int;
13711398
}
13721399

13731400
cfg_if! {

src/unix/bsd/freebsdlike/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,36 @@ extern {
775775
stacksize: *mut ::size_t) -> ::c_int;
776776
pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int;
777777
pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int;
778+
779+
pub fn openat(dirfd: ::c_int, pathname: *const ::c_char,
780+
flags: ::c_int, ...) -> ::c_int;
781+
pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char,
782+
mode: ::c_int, flags: ::c_int) -> ::c_int;
783+
pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char,
784+
mode: ::mode_t, flags: ::c_int) -> ::c_int;
785+
pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char,
786+
owner: ::uid_t, group: ::gid_t,
787+
flags: ::c_int) -> ::c_int;
788+
pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char,
789+
buf: *mut stat, flags: ::c_int) -> ::c_int;
790+
pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char,
791+
newdirfd: ::c_int, newpath: *const ::c_char,
792+
flags: ::c_int) -> ::c_int;
793+
pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char,
794+
mode: ::mode_t) -> ::c_int;
795+
pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
796+
mode: ::mode_t, dev: dev_t) -> ::c_int;
797+
pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char,
798+
buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t;
799+
pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char,
800+
newdirfd: ::c_int, newpath: *const ::c_char)
801+
-> ::c_int;
802+
pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int,
803+
linkpath: *const ::c_char) -> ::c_int;
804+
pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char,
805+
flags: ::c_int) -> ::c_int;
806+
pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
807+
mode: ::mode_t) -> ::c_int;
778808
}
779809

780810
cfg_if! {

src/unix/bsd/openbsdlike/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,36 @@ extern {
494494
winp: *mut ::winsize) -> ::pid_t;
495495
pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
496496
pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
497+
498+
pub fn openat(dirfd: ::c_int, pathname: *const ::c_char,
499+
flags: ::c_int, ...) -> ::c_int;
500+
pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char,
501+
mode: ::c_int, flags: ::c_int) -> ::c_int;
502+
pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char,
503+
mode: ::mode_t, flags: ::c_int) -> ::c_int;
504+
pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char,
505+
owner: ::uid_t, group: ::gid_t,
506+
flags: ::c_int) -> ::c_int;
507+
pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char,
508+
buf: *mut stat, flags: ::c_int) -> ::c_int;
509+
pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char,
510+
newdirfd: ::c_int, newpath: *const ::c_char,
511+
flags: ::c_int) -> ::c_int;
512+
pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char,
513+
mode: ::mode_t) -> ::c_int;
514+
pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
515+
mode: ::mode_t, dev: dev_t) -> ::c_int;
516+
pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char,
517+
buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t;
518+
pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char,
519+
newdirfd: ::c_int, newpath: *const ::c_char)
520+
-> ::c_int;
521+
pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int,
522+
linkpath: *const ::c_char) -> ::c_int;
523+
pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char,
524+
flags: ::c_int) -> ::c_int;
525+
pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
526+
mode: ::mode_t) -> ::c_int;
497527
}
498528

499529
cfg_if! {

src/unix/notbsd/linux/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,10 @@ extern {
629629
remote_iov: *const ::iovec,
630630
riovcnt: ::c_ulong,
631631
flags: ::c_ulong) -> isize;
632+
633+
// Not available now on Android
634+
pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
635+
mode: ::mode_t) -> ::c_int;
632636
}
633637

634638
cfg_if! {

src/unix/notbsd/mod.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,34 @@ extern {
820820
pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int;
821821
pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int;
822822
pub fn sysinfo (info: *mut ::sysinfo) -> ::c_int;
823+
824+
pub fn openat(dirfd: ::c_int, pathname: *const ::c_char,
825+
flags: ::c_int, ...) -> ::c_int;
826+
pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char,
827+
mode: ::c_int, flags: ::c_int) -> ::c_int;
828+
pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char,
829+
mode: ::mode_t, flags: ::c_int) -> ::c_int;
830+
pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char,
831+
owner: ::uid_t, group: ::gid_t,
832+
flags: ::c_int) -> ::c_int;
833+
pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char,
834+
buf: *mut stat, flags: ::c_int) -> ::c_int;
835+
pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char,
836+
newdirfd: ::c_int, newpath: *const ::c_char,
837+
flags: ::c_int) -> ::c_int;
838+
pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char,
839+
mode: ::mode_t) -> ::c_int;
840+
pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
841+
mode: ::mode_t, dev: dev_t) -> ::c_int;
842+
pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char,
843+
buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t;
844+
pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char,
845+
newdirfd: ::c_int, newpath: *const ::c_char)
846+
-> ::c_int;
847+
pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int,
848+
linkpath: *const ::c_char) -> ::c_int;
849+
pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char,
850+
flags: ::c_int) -> ::c_int;
823851
}
824852

825853
cfg_if! {

src/unix/solaris/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,5 +919,35 @@ extern {
919919
pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int;
920920
pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int;
921921
pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int;
922+
923+
pub fn openat(dirfd: ::c_int, pathname: *const ::c_char,
924+
flags: ::c_int, ...) -> ::c_int;
925+
pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char,
926+
mode: ::c_int, flags: ::c_int) -> ::c_int;
927+
pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char,
928+
mode: ::mode_t, flags: ::c_int) -> ::c_int;
929+
pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char,
930+
owner: ::uid_t, group: ::gid_t,
931+
flags: ::c_int) -> ::c_int;
932+
pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char,
933+
buf: *mut stat, flags: ::c_int) -> ::c_int;
934+
pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char,
935+
newdirfd: ::c_int, newpath: *const ::c_char,
936+
flags: ::c_int) -> ::c_int;
937+
pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char,
938+
mode: ::mode_t) -> ::c_int;
939+
pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
940+
mode: ::mode_t, dev: dev_t) -> ::c_int;
941+
pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char,
942+
buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t;
943+
pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char,
944+
newdirfd: ::c_int, newpath: *const ::c_char)
945+
-> ::c_int;
946+
pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int,
947+
linkpath: *const ::c_char) -> ::c_int;
948+
pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char,
949+
flags: ::c_int) -> ::c_int;
950+
pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
951+
mode: ::mode_t) -> ::c_int;
922952
}
923953

0 commit comments

Comments
 (0)