1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245 |
- package unix
- import (
- "encoding/binary"
- "runtime"
- "syscall"
- "unsafe"
- )
- func Access(path string, mode uint32) (err error) {
- return Faccessat(AT_FDCWD, path, mode, 0)
- }
- func Chmod(path string, mode uint32) (err error) {
- return Fchmodat(AT_FDCWD, path, mode, 0)
- }
- func Chown(path string, uid int, gid int) (err error) {
- return Fchownat(AT_FDCWD, path, uid, gid, 0)
- }
- func Creat(path string, mode uint32) (fd int, err error) {
- return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
- }
- func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) (err error) {
- if pathname == "" {
- return fanotifyMark(fd, flags, mask, dirFd, nil)
- }
- p, err := BytePtrFromString(pathname)
- if err != nil {
- return err
- }
- return fanotifyMark(fd, flags, mask, dirFd, p)
- }
- func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {
-
-
-
- if flags&^AT_SYMLINK_NOFOLLOW != 0 {
- return EINVAL
- } else if flags&AT_SYMLINK_NOFOLLOW != 0 {
- return EOPNOTSUPP
- }
- return fchmodat(dirfd, path, mode)
- }
- func IoctlRetInt(fd int, req uint) (int, error) {
- ret, _, err := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), 0)
- if err != 0 {
- return 0, err
- }
- return int(ret), nil
- }
- func IoctlSetPointerInt(fd int, req uint, value int) error {
- v := int32(value)
- return ioctl(fd, req, uintptr(unsafe.Pointer(&v)))
- }
- func IoctlSetRTCTime(fd int, value *RTCTime) error {
- err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value)))
- runtime.KeepAlive(value)
- return err
- }
- func IoctlSetRTCWkAlrm(fd int, value *RTCWkAlrm) error {
- err := ioctl(fd, RTC_WKALM_SET, uintptr(unsafe.Pointer(value)))
- runtime.KeepAlive(value)
- return err
- }
- func IoctlGetUint32(fd int, req uint) (uint32, error) {
- var value uint32
- err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
- return value, err
- }
- func IoctlGetRTCTime(fd int) (*RTCTime, error) {
- var value RTCTime
- err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value)))
- return &value, err
- }
- func IoctlGetRTCWkAlrm(fd int) (*RTCWkAlrm, error) {
- var value RTCWkAlrm
- err := ioctl(fd, RTC_WKALM_RD, uintptr(unsafe.Pointer(&value)))
- return &value, err
- }
- func Link(oldpath string, newpath string) (err error) {
- return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)
- }
- func Mkdir(path string, mode uint32) (err error) {
- return Mkdirat(AT_FDCWD, path, mode)
- }
- func Mknod(path string, mode uint32, dev int) (err error) {
- return Mknodat(AT_FDCWD, path, mode, dev)
- }
- func Open(path string, mode int, perm uint32) (fd int, err error) {
- return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm)
- }
- func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {
- return openat(dirfd, path, flags|O_LARGEFILE, mode)
- }
- func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
- if len(fds) == 0 {
- return ppoll(nil, 0, timeout, sigmask)
- }
- return ppoll(&fds[0], len(fds), timeout, sigmask)
- }
- func Readlink(path string, buf []byte) (n int, err error) {
- return Readlinkat(AT_FDCWD, path, buf)
- }
- func Rename(oldpath string, newpath string) (err error) {
- return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath)
- }
- func Rmdir(path string) error {
- return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR)
- }
- func Symlink(oldpath string, newpath string) (err error) {
- return Symlinkat(oldpath, AT_FDCWD, newpath)
- }
- func Unlink(path string) error {
- return Unlinkat(AT_FDCWD, path, 0)
- }
- func Utimes(path string, tv []Timeval) error {
- if tv == nil {
- err := utimensat(AT_FDCWD, path, nil, 0)
- if err != ENOSYS {
- return err
- }
- return utimes(path, nil)
- }
- if len(tv) != 2 {
- return EINVAL
- }
- var ts [2]Timespec
- ts[0] = NsecToTimespec(TimevalToNsec(tv[0]))
- ts[1] = NsecToTimespec(TimevalToNsec(tv[1]))
- err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
- if err != ENOSYS {
- return err
- }
- return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
- }
- func UtimesNano(path string, ts []Timespec) error {
- if ts == nil {
- err := utimensat(AT_FDCWD, path, nil, 0)
- if err != ENOSYS {
- return err
- }
- return utimes(path, nil)
- }
- if len(ts) != 2 {
- return EINVAL
- }
- err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
- if err != ENOSYS {
- return err
- }
-
-
- var tv [2]Timeval
- for i := 0; i < 2; i++ {
- tv[i] = NsecToTimeval(TimespecToNsec(ts[i]))
- }
- return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
- }
- func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
- if ts == nil {
- return utimensat(dirfd, path, nil, flags)
- }
- if len(ts) != 2 {
- return EINVAL
- }
- return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
- }
- func Futimesat(dirfd int, path string, tv []Timeval) error {
- if tv == nil {
- return futimesat(dirfd, path, nil)
- }
- if len(tv) != 2 {
- return EINVAL
- }
- return futimesat(dirfd, path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
- }
- func Futimes(fd int, tv []Timeval) (err error) {
-
-
- return Utimes("/proc/self/fd/"+itoa(fd), tv)
- }
- const ImplementsGetwd = true
- func Getwd() (wd string, err error) {
- var buf [PathMax]byte
- n, err := Getcwd(buf[0:])
- if err != nil {
- return "", err
- }
-
- if n < 1 || n > len(buf) || buf[n-1] != 0 {
- return "", EINVAL
- }
- return string(buf[0 : n-1]), nil
- }
- func Getgroups() (gids []int, err error) {
- n, err := getgroups(0, nil)
- if err != nil {
- return nil, err
- }
- if n == 0 {
- return nil, nil
- }
-
- if n < 0 || n > 1<<20 {
- return nil, EINVAL
- }
- a := make([]_Gid_t, n)
- n, err = getgroups(n, &a[0])
- if err != nil {
- return nil, err
- }
- gids = make([]int, n)
- for i, v := range a[0:n] {
- gids[i] = int(v)
- }
- return
- }
- func Setgroups(gids []int) (err error) {
- if len(gids) == 0 {
- return setgroups(0, nil)
- }
- a := make([]_Gid_t, len(gids))
- for i, v := range gids {
- a[i] = _Gid_t(v)
- }
- return setgroups(len(a), &a[0])
- }
- type WaitStatus uint32
- const (
- mask = 0x7F
- core = 0x80
- exited = 0x00
- stopped = 0x7F
- shift = 8
- )
- func (w WaitStatus) Exited() bool { return w&mask == exited }
- func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited }
- func (w WaitStatus) Stopped() bool { return w&0xFF == stopped }
- func (w WaitStatus) Continued() bool { return w == 0xFFFF }
- func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
- func (w WaitStatus) ExitStatus() int {
- if !w.Exited() {
- return -1
- }
- return int(w>>shift) & 0xFF
- }
- func (w WaitStatus) Signal() syscall.Signal {
- if !w.Signaled() {
- return -1
- }
- return syscall.Signal(w & mask)
- }
- func (w WaitStatus) StopSignal() syscall.Signal {
- if !w.Stopped() {
- return -1
- }
- return syscall.Signal(w>>shift) & 0xFF
- }
- func (w WaitStatus) TrapCause() int {
- if w.StopSignal() != SIGTRAP {
- return -1
- }
- return int(w>>shift) >> 8
- }
- func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
- var status _C_int
- wpid, err = wait4(pid, &status, options, rusage)
- if wstatus != nil {
- *wstatus = WaitStatus(status)
- }
- return
- }
- func Mkfifo(path string, mode uint32) error {
- return Mknod(path, mode|S_IFIFO, 0)
- }
- func Mkfifoat(dirfd int, path string, mode uint32) error {
- return Mknodat(dirfd, path, mode|S_IFIFO, 0)
- }
- func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
- if sa.Port < 0 || sa.Port > 0xFFFF {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_INET
- p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
- p[0] = byte(sa.Port >> 8)
- p[1] = byte(sa.Port)
- for i := 0; i < len(sa.Addr); i++ {
- sa.raw.Addr[i] = sa.Addr[i]
- }
- return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil
- }
- func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
- if sa.Port < 0 || sa.Port > 0xFFFF {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_INET6
- p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
- p[0] = byte(sa.Port >> 8)
- p[1] = byte(sa.Port)
- sa.raw.Scope_id = sa.ZoneId
- for i := 0; i < len(sa.Addr); i++ {
- sa.raw.Addr[i] = sa.Addr[i]
- }
- return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil
- }
- func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
- name := sa.Name
- n := len(name)
- if n >= len(sa.raw.Path) {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_UNIX
- for i := 0; i < n; i++ {
- sa.raw.Path[i] = int8(name[i])
- }
-
- sl := _Socklen(2)
- if n > 0 {
- sl += _Socklen(n) + 1
- }
- if sa.raw.Path[0] == '@' {
- sa.raw.Path[0] = 0
-
- sl--
- }
- return unsafe.Pointer(&sa.raw), sl, nil
- }
- type SockaddrLinklayer struct {
- Protocol uint16
- Ifindex int
- Hatype uint16
- Pkttype uint8
- Halen uint8
- Addr [8]byte
- raw RawSockaddrLinklayer
- }
- func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) {
- if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_PACKET
- sa.raw.Protocol = sa.Protocol
- sa.raw.Ifindex = int32(sa.Ifindex)
- sa.raw.Hatype = sa.Hatype
- sa.raw.Pkttype = sa.Pkttype
- sa.raw.Halen = sa.Halen
- for i := 0; i < len(sa.Addr); i++ {
- sa.raw.Addr[i] = sa.Addr[i]
- }
- return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil
- }
- type SockaddrNetlink struct {
- Family uint16
- Pad uint16
- Pid uint32
- Groups uint32
- raw RawSockaddrNetlink
- }
- func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_NETLINK
- sa.raw.Pad = sa.Pad
- sa.raw.Pid = sa.Pid
- sa.raw.Groups = sa.Groups
- return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil
- }
- type SockaddrHCI struct {
- Dev uint16
- Channel uint16
- raw RawSockaddrHCI
- }
- func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_BLUETOOTH
- sa.raw.Dev = sa.Dev
- sa.raw.Channel = sa.Channel
- return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil
- }
- type SockaddrL2 struct {
- PSM uint16
- CID uint16
- Addr [6]uint8
- AddrType uint8
- raw RawSockaddrL2
- }
- func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_BLUETOOTH
- psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm))
- psm[0] = byte(sa.PSM)
- psm[1] = byte(sa.PSM >> 8)
- for i := 0; i < len(sa.Addr); i++ {
- sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i]
- }
- cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid))
- cid[0] = byte(sa.CID)
- cid[1] = byte(sa.CID >> 8)
- sa.raw.Bdaddr_type = sa.AddrType
- return unsafe.Pointer(&sa.raw), SizeofSockaddrL2, nil
- }
- type SockaddrRFCOMM struct {
-
- Addr [6]uint8
-
-
- Channel uint8
- raw RawSockaddrRFCOMM
- }
- func (sa *SockaddrRFCOMM) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_BLUETOOTH
- sa.raw.Channel = sa.Channel
- sa.raw.Bdaddr = sa.Addr
- return unsafe.Pointer(&sa.raw), SizeofSockaddrRFCOMM, nil
- }
- type SockaddrCAN struct {
- Ifindex int
- RxID uint32
- TxID uint32
- raw RawSockaddrCAN
- }
- func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) {
- if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_CAN
- sa.raw.Ifindex = int32(sa.Ifindex)
- rx := (*[4]byte)(unsafe.Pointer(&sa.RxID))
- for i := 0; i < 4; i++ {
- sa.raw.Addr[i] = rx[i]
- }
- tx := (*[4]byte)(unsafe.Pointer(&sa.TxID))
- for i := 0; i < 4; i++ {
- sa.raw.Addr[i+4] = tx[i]
- }
- return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil
- }
- type SockaddrALG struct {
- Type string
- Name string
- Feature uint32
- Mask uint32
- raw RawSockaddrALG
- }
- func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) {
-
- if len(sa.Type) > 13 {
- return nil, 0, EINVAL
- }
- if len(sa.Name) > 63 {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_ALG
- sa.raw.Feat = sa.Feature
- sa.raw.Mask = sa.Mask
- typ, err := ByteSliceFromString(sa.Type)
- if err != nil {
- return nil, 0, err
- }
- name, err := ByteSliceFromString(sa.Name)
- if err != nil {
- return nil, 0, err
- }
- copy(sa.raw.Type[:], typ)
- copy(sa.raw.Name[:], name)
- return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil
- }
- type SockaddrVM struct {
-
-
-
-
- CID uint32
- Port uint32
- raw RawSockaddrVM
- }
- func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_VSOCK
- sa.raw.Port = sa.Port
- sa.raw.Cid = sa.CID
- return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil
- }
- type SockaddrXDP struct {
- Flags uint16
- Ifindex uint32
- QueueID uint32
- SharedUmemFD uint32
- raw RawSockaddrXDP
- }
- func (sa *SockaddrXDP) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_XDP
- sa.raw.Flags = sa.Flags
- sa.raw.Ifindex = sa.Ifindex
- sa.raw.Queue_id = sa.QueueID
- sa.raw.Shared_umem_fd = sa.SharedUmemFD
- return unsafe.Pointer(&sa.raw), SizeofSockaddrXDP, nil
- }
- const px_proto_oe = 0
- type SockaddrPPPoE struct {
- SID uint16
- Remote []byte
- Dev string
- raw RawSockaddrPPPoX
- }
- func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) {
- if len(sa.Remote) != 6 {
- return nil, 0, EINVAL
- }
- if len(sa.Dev) > IFNAMSIZ-1 {
- return nil, 0, EINVAL
- }
- *(*uint16)(unsafe.Pointer(&sa.raw[0])) = AF_PPPOX
-
-
-
-
-
-
-
-
- binary.BigEndian.PutUint32(sa.raw[2:6], px_proto_oe)
-
-
- binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID)
- copy(sa.raw[8:14], sa.Remote)
- for i := 14; i < 14+IFNAMSIZ; i++ {
- sa.raw[i] = 0
- }
- copy(sa.raw[14:], sa.Dev)
- return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
- }
- type SockaddrTIPC struct {
-
-
- Scope int
-
-
-
-
-
-
-
- Addr TIPCAddr
- raw RawSockaddrTIPC
- }
- type TIPCAddr interface {
- tipcAddrtype() uint8
- tipcAddr() [12]byte
- }
- func (sa *TIPCSocketAddr) tipcAddr() [12]byte {
- var out [12]byte
- copy(out[:], (*(*[unsafe.Sizeof(TIPCSocketAddr{})]byte)(unsafe.Pointer(sa)))[:])
- return out
- }
- func (sa *TIPCSocketAddr) tipcAddrtype() uint8 { return TIPC_SOCKET_ADDR }
- func (sa *TIPCServiceRange) tipcAddr() [12]byte {
- var out [12]byte
- copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceRange{})]byte)(unsafe.Pointer(sa)))[:])
- return out
- }
- func (sa *TIPCServiceRange) tipcAddrtype() uint8 { return TIPC_SERVICE_RANGE }
- func (sa *TIPCServiceName) tipcAddr() [12]byte {
- var out [12]byte
- copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceName{})]byte)(unsafe.Pointer(sa)))[:])
- return out
- }
- func (sa *TIPCServiceName) tipcAddrtype() uint8 { return TIPC_SERVICE_ADDR }
- func (sa *SockaddrTIPC) sockaddr() (unsafe.Pointer, _Socklen, error) {
- if sa.Addr == nil {
- return nil, 0, EINVAL
- }
- sa.raw.Family = AF_TIPC
- sa.raw.Scope = int8(sa.Scope)
- sa.raw.Addrtype = sa.Addr.tipcAddrtype()
- sa.raw.Addr = sa.Addr.tipcAddr()
- return unsafe.Pointer(&sa.raw), SizeofSockaddrTIPC, nil
- }
- type SockaddrL2TPIP struct {
- Addr [4]byte
- ConnId uint32
- raw RawSockaddrL2TPIP
- }
- func (sa *SockaddrL2TPIP) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_INET
- sa.raw.Conn_id = sa.ConnId
- for i := 0; i < len(sa.Addr); i++ {
- sa.raw.Addr[i] = sa.Addr[i]
- }
- return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP, nil
- }
- type SockaddrL2TPIP6 struct {
- Addr [16]byte
- ZoneId uint32
- ConnId uint32
- raw RawSockaddrL2TPIP6
- }
- func (sa *SockaddrL2TPIP6) sockaddr() (unsafe.Pointer, _Socklen, error) {
- sa.raw.Family = AF_INET6
- sa.raw.Conn_id = sa.ConnId
- sa.raw.Scope_id = sa.ZoneId
- for i := 0; i < len(sa.Addr); i++ {
- sa.raw.Addr[i] = sa.Addr[i]
- }
- return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP6, nil
- }
- func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
- switch rsa.Addr.Family {
- case AF_NETLINK:
- pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))
- sa := new(SockaddrNetlink)
- sa.Family = pp.Family
- sa.Pad = pp.Pad
- sa.Pid = pp.Pid
- sa.Groups = pp.Groups
- return sa, nil
- case AF_PACKET:
- pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))
- sa := new(SockaddrLinklayer)
- sa.Protocol = pp.Protocol
- sa.Ifindex = int(pp.Ifindex)
- sa.Hatype = pp.Hatype
- sa.Pkttype = pp.Pkttype
- sa.Halen = pp.Halen
- for i := 0; i < len(sa.Addr); i++ {
- sa.Addr[i] = pp.Addr[i]
- }
- return sa, nil
- case AF_UNIX:
- pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
- sa := new(SockaddrUnix)
- if pp.Path[0] == 0 {
-
-
-
-
-
- pp.Path[0] = '@'
- }
-
-
-
-
-
- n := 0
- for n < len(pp.Path) && pp.Path[n] != 0 {
- n++
- }
- bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
- sa.Name = string(bytes)
- return sa, nil
- case AF_INET:
- proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL)
- if err != nil {
- return nil, err
- }
- switch proto {
- case IPPROTO_L2TP:
- pp := (*RawSockaddrL2TPIP)(unsafe.Pointer(rsa))
- sa := new(SockaddrL2TPIP)
- sa.ConnId = pp.Conn_id
- for i := 0; i < len(sa.Addr); i++ {
- sa.Addr[i] = pp.Addr[i]
- }
- return sa, nil
- default:
- pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
- sa := new(SockaddrInet4)
- p := (*[2]byte)(unsafe.Pointer(&pp.Port))
- sa.Port = int(p[0])<<8 + int(p[1])
- for i := 0; i < len(sa.Addr); i++ {
- sa.Addr[i] = pp.Addr[i]
- }
- return sa, nil
- }
- case AF_INET6:
- proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL)
- if err != nil {
- return nil, err
- }
- switch proto {
- case IPPROTO_L2TP:
- pp := (*RawSockaddrL2TPIP6)(unsafe.Pointer(rsa))
- sa := new(SockaddrL2TPIP6)
- sa.ConnId = pp.Conn_id
- sa.ZoneId = pp.Scope_id
- for i := 0; i < len(sa.Addr); i++ {
- sa.Addr[i] = pp.Addr[i]
- }
- return sa, nil
- default:
- pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
- sa := new(SockaddrInet6)
- p := (*[2]byte)(unsafe.Pointer(&pp.Port))
- sa.Port = int(p[0])<<8 + int(p[1])
- sa.ZoneId = pp.Scope_id
- for i := 0; i < len(sa.Addr); i++ {
- sa.Addr[i] = pp.Addr[i]
- }
- return sa, nil
- }
- case AF_VSOCK:
- pp := (*RawSockaddrVM)(unsafe.Pointer(rsa))
- sa := &SockaddrVM{
- CID: pp.Cid,
- Port: pp.Port,
- }
- return sa, nil
- case AF_BLUETOOTH:
- proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL)
- if err != nil {
- return nil, err
- }
-
- switch proto {
- case BTPROTO_L2CAP:
- pp := (*RawSockaddrL2)(unsafe.Pointer(rsa))
- sa := &SockaddrL2{
- PSM: pp.Psm,
- CID: pp.Cid,
- Addr: pp.Bdaddr,
- AddrType: pp.Bdaddr_type,
- }
- return sa, nil
- case BTPROTO_RFCOMM:
- pp := (*RawSockaddrRFCOMM)(unsafe.Pointer(rsa))
- sa := &SockaddrRFCOMM{
- Channel: pp.Channel,
- Addr: pp.Bdaddr,
- }
- return sa, nil
- }
- case AF_XDP:
- pp := (*RawSockaddrXDP)(unsafe.Pointer(rsa))
- sa := &SockaddrXDP{
- Flags: pp.Flags,
- Ifindex: pp.Ifindex,
- QueueID: pp.Queue_id,
- SharedUmemFD: pp.Shared_umem_fd,
- }
- return sa, nil
- case AF_PPPOX:
- pp := (*RawSockaddrPPPoX)(unsafe.Pointer(rsa))
- if binary.BigEndian.Uint32(pp[2:6]) != px_proto_oe {
- return nil, EINVAL
- }
- sa := &SockaddrPPPoE{
- SID: binary.BigEndian.Uint16(pp[6:8]),
- Remote: pp[8:14],
- }
- for i := 14; i < 14+IFNAMSIZ; i++ {
- if pp[i] == 0 {
- sa.Dev = string(pp[14:i])
- break
- }
- }
- return sa, nil
- case AF_TIPC:
- pp := (*RawSockaddrTIPC)(unsafe.Pointer(rsa))
- sa := &SockaddrTIPC{
- Scope: int(pp.Scope),
- }
-
-
- switch pp.Addrtype {
- case TIPC_SERVICE_RANGE:
- sa.Addr = (*TIPCServiceRange)(unsafe.Pointer(&pp.Addr))
- case TIPC_SERVICE_ADDR:
- sa.Addr = (*TIPCServiceName)(unsafe.Pointer(&pp.Addr))
- case TIPC_SOCKET_ADDR:
- sa.Addr = (*TIPCSocketAddr)(unsafe.Pointer(&pp.Addr))
- default:
- return nil, EINVAL
- }
- return sa, nil
- }
- return nil, EAFNOSUPPORT
- }
- func Accept(fd int) (nfd int, sa Sockaddr, err error) {
- var rsa RawSockaddrAny
- var len _Socklen = SizeofSockaddrAny
- nfd, err = accept(fd, &rsa, &len)
- if err != nil {
- return
- }
- sa, err = anyToSockaddr(fd, &rsa)
- if err != nil {
- Close(nfd)
- nfd = 0
- }
- return
- }
- func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
- var rsa RawSockaddrAny
- var len _Socklen = SizeofSockaddrAny
- nfd, err = accept4(fd, &rsa, &len, flags)
- if err != nil {
- return
- }
- if len > SizeofSockaddrAny {
- panic("RawSockaddrAny too small")
- }
- sa, err = anyToSockaddr(fd, &rsa)
- if err != nil {
- Close(nfd)
- nfd = 0
- }
- return
- }
- func Getsockname(fd int) (sa Sockaddr, err error) {
- var rsa RawSockaddrAny
- var len _Socklen = SizeofSockaddrAny
- if err = getsockname(fd, &rsa, &len); err != nil {
- return
- }
- return anyToSockaddr(fd, &rsa)
- }
- func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
- var value IPMreqn
- vallen := _Socklen(SizeofIPMreqn)
- err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
- return &value, err
- }
- func GetsockoptUcred(fd, level, opt int) (*Ucred, error) {
- var value Ucred
- vallen := _Socklen(SizeofUcred)
- err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
- return &value, err
- }
- func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) {
- var value TCPInfo
- vallen := _Socklen(SizeofTCPInfo)
- err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
- return &value, err
- }
- func GetsockoptString(fd, level, opt int) (string, error) {
- buf := make([]byte, 256)
- vallen := _Socklen(len(buf))
- err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
- if err != nil {
- if err == ERANGE {
- buf = make([]byte, vallen)
- err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
- }
- if err != nil {
- return "", err
- }
- }
- return string(buf[:vallen-1]), nil
- }
- func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) {
- var value TpacketStats
- vallen := _Socklen(SizeofTpacketStats)
- err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
- return &value, err
- }
- func GetsockoptTpacketStatsV3(fd, level, opt int) (*TpacketStatsV3, error) {
- var value TpacketStatsV3
- vallen := _Socklen(SizeofTpacketStatsV3)
- err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
- return &value, err
- }
- func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
- return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
- }
- func SetsockoptPacketMreq(fd, level, opt int, mreq *PacketMreq) error {
- return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
- }
- func SetsockoptSockFprog(fd, level, opt int, fprog *SockFprog) error {
- return setsockopt(fd, level, opt, unsafe.Pointer(fprog), unsafe.Sizeof(*fprog))
- }
- func SetsockoptCanRawFilter(fd, level, opt int, filter []CanFilter) error {
- var p unsafe.Pointer
- if len(filter) > 0 {
- p = unsafe.Pointer(&filter[0])
- }
- return setsockopt(fd, level, opt, p, uintptr(len(filter)*SizeofCanFilter))
- }
- func SetsockoptTpacketReq(fd, level, opt int, tp *TpacketReq) error {
- return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp))
- }
- func SetsockoptTpacketReq3(fd, level, opt int, tp *TpacketReq3) error {
- return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp))
- }
- func KeyctlString(cmd int, id int) (string, error) {
-
-
-
-
- var buffer []byte
- for {
-
- length, err := KeyctlBuffer(cmd, id, buffer, 0)
- if err != nil {
- return "", err
- }
-
- if length <= len(buffer) {
-
- return string(buffer[:length-1]), nil
- }
-
- buffer = make([]byte, length)
- }
- }
- func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) {
- createInt := 0
- if create {
- createInt = 1
- }
- return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0)
- }
- func KeyctlSetperm(id int, perm uint32) error {
- _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0)
- return err
- }
- func KeyctlJoinSessionKeyring(name string) (ringid int, err error) {
- return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name)
- }
- func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) {
- return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid)
- }
- func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error {
- return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid)
- }
- func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) {
- return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer)
- }
- func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error {
- if keyType == "" {
- return keyctlRestrictKeyring(KEYCTL_RESTRICT_KEYRING, ringid)
- }
- return keyctlRestrictKeyringByType(KEYCTL_RESTRICT_KEYRING, ringid, keyType, restriction)
- }
- func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
- var msg Msghdr
- var rsa RawSockaddrAny
- msg.Name = (*byte)(unsafe.Pointer(&rsa))
- msg.Namelen = uint32(SizeofSockaddrAny)
- var iov Iovec
- if len(p) > 0 {
- iov.Base = &p[0]
- iov.SetLen(len(p))
- }
- var dummy byte
- if len(oob) > 0 {
- if len(p) == 0 {
- var sockType int
- sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
- if err != nil {
- return
- }
-
- if sockType != SOCK_DGRAM {
- iov.Base = &dummy
- iov.SetLen(1)
- }
- }
- msg.Control = &oob[0]
- msg.SetControllen(len(oob))
- }
- msg.Iov = &iov
- msg.Iovlen = 1
- if n, err = recvmsg(fd, &msg, flags); err != nil {
- return
- }
- oobn = int(msg.Controllen)
- recvflags = int(msg.Flags)
-
- if rsa.Addr.Family != AF_UNSPEC {
- from, err = anyToSockaddr(fd, &rsa)
- }
- return
- }
- func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
- _, err = SendmsgN(fd, p, oob, to, flags)
- return
- }
- func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
- var ptr unsafe.Pointer
- var salen _Socklen
- if to != nil {
- var err error
- ptr, salen, err = to.sockaddr()
- if err != nil {
- return 0, err
- }
- }
- var msg Msghdr
- msg.Name = (*byte)(ptr)
- msg.Namelen = uint32(salen)
- var iov Iovec
- if len(p) > 0 {
- iov.Base = &p[0]
- iov.SetLen(len(p))
- }
- var dummy byte
- if len(oob) > 0 {
- if len(p) == 0 {
- var sockType int
- sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
- if err != nil {
- return 0, err
- }
-
- if sockType != SOCK_DGRAM {
- iov.Base = &dummy
- iov.SetLen(1)
- }
- }
- msg.Control = &oob[0]
- msg.SetControllen(len(oob))
- }
- msg.Iov = &iov
- msg.Iovlen = 1
- if n, err = sendmsg(fd, &msg, flags); err != nil {
- return 0, err
- }
- if len(oob) > 0 && len(p) == 0 {
- n = 0
- }
- return n, nil
- }
- func BindToDevice(fd int, device string) (err error) {
- return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)
- }
- func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {
-
-
-
-
- var buf [SizeofPtr]byte
-
-
-
-
-
- n := 0
- if addr%SizeofPtr != 0 {
- err = ptrace(req, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
- if err != nil {
- return 0, err
- }
- n += copy(out, buf[addr%SizeofPtr:])
- out = out[n:]
- }
-
- for len(out) > 0 {
-
-
- err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
- if err != nil {
- return n, err
- }
- copied := copy(out, buf[0:])
- n += copied
- out = out[copied:]
- }
- return n, nil
- }
- func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
- return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out)
- }
- func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
- return ptracePeek(PTRACE_PEEKDATA, pid, addr, out)
- }
- func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) {
- return ptracePeek(PTRACE_PEEKUSR, pid, addr, out)
- }
- func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) {
-
-
-
- n := 0
- if addr%SizeofPtr != 0 {
- var buf [SizeofPtr]byte
- err = ptrace(peekReq, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
- if err != nil {
- return 0, err
- }
- n += copy(buf[addr%SizeofPtr:], data)
- word := *((*uintptr)(unsafe.Pointer(&buf[0])))
- err = ptrace(pokeReq, pid, addr-addr%SizeofPtr, word)
- if err != nil {
- return 0, err
- }
- data = data[n:]
- }
-
- for len(data) > SizeofPtr {
- word := *((*uintptr)(unsafe.Pointer(&data[0])))
- err = ptrace(pokeReq, pid, addr+uintptr(n), word)
- if err != nil {
- return n, err
- }
- n += SizeofPtr
- data = data[SizeofPtr:]
- }
-
- if len(data) > 0 {
- var buf [SizeofPtr]byte
- err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
- if err != nil {
- return n, err
- }
- copy(buf[0:], data)
- word := *((*uintptr)(unsafe.Pointer(&buf[0])))
- err = ptrace(pokeReq, pid, addr+uintptr(n), word)
- if err != nil {
- return n, err
- }
- n += len(data)
- }
- return n, nil
- }
- func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
- return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data)
- }
- func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
- return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
- }
- func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) {
- return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data)
- }
- func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
- return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
- }
- func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
- return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
- }
- func PtraceSetOptions(pid int, options int) (err error) {
- return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options))
- }
- func PtraceGetEventMsg(pid int) (msg uint, err error) {
- var data _C_long
- err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
- msg = uint(data)
- return
- }
- func PtraceCont(pid int, signal int) (err error) {
- return ptrace(PTRACE_CONT, pid, 0, uintptr(signal))
- }
- func PtraceSyscall(pid int, signal int) (err error) {
- return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal))
- }
- func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
- func PtraceInterrupt(pid int) (err error) { return ptrace(PTRACE_INTERRUPT, pid, 0, 0) }
- func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
- func PtraceSeize(pid int) (err error) { return ptrace(PTRACE_SEIZE, pid, 0, 0) }
- func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
- func Reboot(cmd int) (err error) {
- return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
- }
- func direntIno(buf []byte) (uint64, bool) {
- return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
- }
- func direntReclen(buf []byte) (uint64, bool) {
- return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
- }
- func direntNamlen(buf []byte) (uint64, bool) {
- reclen, ok := direntReclen(buf)
- if !ok {
- return 0, false
- }
- return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
- }
- func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
-
-
- if data == "" {
- return mount(source, target, fstype, flags, nil)
- }
- datap, err := BytePtrFromString(data)
- if err != nil {
- return err
- }
- return mount(source, target, fstype, flags, datap)
- }
- func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
- if raceenabled {
- raceReleaseMerge(unsafe.Pointer(&ioSync))
- }
- return sendfile(outfd, infd, offset, count)
- }
- func Dup2(oldfd, newfd int) error {
-
- if runtime.GOOS == "android" || runtime.GOARCH == "riscv64" || runtime.GOARCH == "arm64" {
- return Dup3(oldfd, newfd, 0)
- }
- return dup2(oldfd, newfd)
- }
- func Getpgrp() (pid int) {
- pid, _ = Getpgid(0)
- return
- }
- func PrctlRetInt(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (int, error) {
- ret, _, err := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)
- if err != 0 {
- return 0, err
- }
- return int(ret), nil
- }
- func Setuid(uid int) (err error) {
- return EOPNOTSUPP
- }
- func Setgid(uid int) (err error) {
- return EOPNOTSUPP
- }
- func SetfsgidRetGid(gid int) (int, error) {
- return setfsgid(gid)
- }
- func SetfsuidRetUid(uid int) (int, error) {
- return setfsuid(uid)
- }
- func Setfsgid(gid int) error {
- _, err := setfsgid(gid)
- return err
- }
- func Setfsuid(uid int) error {
- _, err := setfsuid(uid)
- return err
- }
- func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) {
- return signalfd(fd, sigmask, _C__NSIG/8, flags)
- }
- func bytes2iovec(bs [][]byte) []Iovec {
- iovecs := make([]Iovec, len(bs))
- for i, b := range bs {
- iovecs[i].SetLen(len(b))
- if len(b) > 0 {
- iovecs[i].Base = &b[0]
- } else {
- iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero))
- }
- }
- return iovecs
- }
- func offs2lohi(offs int64) (lo, hi uintptr) {
- return uintptr(offs), uintptr(uint64(offs) >> SizeofLong)
- }
- func Readv(fd int, iovs [][]byte) (n int, err error) {
- iovecs := bytes2iovec(iovs)
- n, err = readv(fd, iovecs)
- readvRacedetect(iovecs, n, err)
- return n, err
- }
- func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
- iovecs := bytes2iovec(iovs)
- lo, hi := offs2lohi(offset)
- n, err = preadv(fd, iovecs, lo, hi)
- readvRacedetect(iovecs, n, err)
- return n, err
- }
- func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
- iovecs := bytes2iovec(iovs)
- lo, hi := offs2lohi(offset)
- n, err = preadv2(fd, iovecs, lo, hi, flags)
- readvRacedetect(iovecs, n, err)
- return n, err
- }
- func readvRacedetect(iovecs []Iovec, n int, err error) {
- if !raceenabled {
- return
- }
- for i := 0; n > 0 && i < len(iovecs); i++ {
- m := int(iovecs[i].Len)
- if m > n {
- m = n
- }
- n -= m
- if m > 0 {
- raceWriteRange(unsafe.Pointer(iovecs[i].Base), m)
- }
- }
- if err == nil {
- raceAcquire(unsafe.Pointer(&ioSync))
- }
- }
- func Writev(fd int, iovs [][]byte) (n int, err error) {
- iovecs := bytes2iovec(iovs)
- if raceenabled {
- raceReleaseMerge(unsafe.Pointer(&ioSync))
- }
- n, err = writev(fd, iovecs)
- writevRacedetect(iovecs, n)
- return n, err
- }
- func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
- iovecs := bytes2iovec(iovs)
- if raceenabled {
- raceReleaseMerge(unsafe.Pointer(&ioSync))
- }
- lo, hi := offs2lohi(offset)
- n, err = pwritev(fd, iovecs, lo, hi)
- writevRacedetect(iovecs, n)
- return n, err
- }
- func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
- iovecs := bytes2iovec(iovs)
- if raceenabled {
- raceReleaseMerge(unsafe.Pointer(&ioSync))
- }
- lo, hi := offs2lohi(offset)
- n, err = pwritev2(fd, iovecs, lo, hi, flags)
- writevRacedetect(iovecs, n)
- return n, err
- }
- func writevRacedetect(iovecs []Iovec, n int) {
- if !raceenabled {
- return
- }
- for i := 0; n > 0 && i < len(iovecs); i++ {
- m := int(iovecs[i].Len)
- if m > n {
- m = n
- }
- n -= m
- if m > 0 {
- raceReadRange(unsafe.Pointer(iovecs[i].Base), m)
- }
- }
- }
- var mapper = &mmapper{
- active: make(map[*byte][]byte),
- mmap: mmap,
- munmap: munmap,
- }
- func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
- return mapper.Mmap(fd, offset, length, prot, flags)
- }
- func Munmap(b []byte) (err error) {
- return mapper.Munmap(b)
- }
- func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) {
- var p unsafe.Pointer
- if len(iovs) > 0 {
- p = unsafe.Pointer(&iovs[0])
- }
- n, _, errno := Syscall6(SYS_VMSPLICE, uintptr(fd), uintptr(p), uintptr(len(iovs)), uintptr(flags), 0, 0)
- if errno != 0 {
- return 0, syscall.Errno(errno)
- }
- return int(n), nil
- }
- func isGroupMember(gid int) bool {
- groups, err := Getgroups()
- if err != nil {
- return false
- }
- for _, g := range groups {
- if g == gid {
- return true
- }
- }
- return false
- }
- func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
- if flags == 0 {
- return faccessat(dirfd, path, mode)
- }
- if err := Faccessat2(dirfd, path, mode, flags); err != ENOSYS {
- return err
- }
-
-
-
-
-
- if flags & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 {
- return EINVAL
- }
- var st Stat_t
- if err := Fstatat(dirfd, path, &st, flags&AT_SYMLINK_NOFOLLOW); err != nil {
- return err
- }
- mode &= 7
- if mode == 0 {
- return nil
- }
- var uid int
- if flags&AT_EACCESS != 0 {
- uid = Geteuid()
- } else {
- uid = Getuid()
- }
- if uid == 0 {
- if mode&1 == 0 {
-
- return nil
- }
- if st.Mode&0111 != 0 {
-
- return nil
- }
- return EACCES
- }
- var fmode uint32
- if uint32(uid) == st.Uid {
- fmode = (st.Mode >> 6) & 7
- } else {
- var gid int
- if flags&AT_EACCESS != 0 {
- gid = Getegid()
- } else {
- gid = Getgid()
- }
- if uint32(gid) == st.Gid || isGroupMember(gid) {
- fmode = (st.Mode >> 3) & 7
- } else {
- fmode = st.Mode & 7
- }
- }
- if fmode&mode == mode {
- return nil
- }
- return EACCES
- }
- type fileHandle struct {
- Bytes uint32
- Type int32
- }
- type FileHandle struct {
- *fileHandle
- }
- func NewFileHandle(handleType int32, handle []byte) FileHandle {
- const hdrSize = unsafe.Sizeof(fileHandle{})
- buf := make([]byte, hdrSize+uintptr(len(handle)))
- copy(buf[hdrSize:], handle)
- fh := (*fileHandle)(unsafe.Pointer(&buf[0]))
- fh.Type = handleType
- fh.Bytes = uint32(len(handle))
- return FileHandle{fh}
- }
- func (fh *FileHandle) Size() int { return int(fh.fileHandle.Bytes) }
- func (fh *FileHandle) Type() int32 { return fh.fileHandle.Type }
- func (fh *FileHandle) Bytes() []byte {
- n := fh.Size()
- if n == 0 {
- return nil
- }
- return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n]
- }
- func NameToHandleAt(dirfd int, path string, flags int) (handle FileHandle, mountID int, err error) {
- var mid _C_int
-
-
- size := uint32(32 + unsafe.Sizeof(fileHandle{}))
- didResize := false
- for {
- buf := make([]byte, size)
- fh := (*fileHandle)(unsafe.Pointer(&buf[0]))
- fh.Bytes = size - uint32(unsafe.Sizeof(fileHandle{}))
- err = nameToHandleAt(dirfd, path, fh, &mid, flags)
- if err == EOVERFLOW {
- if didResize {
-
- return
- }
- didResize = true
- size = fh.Bytes + uint32(unsafe.Sizeof(fileHandle{}))
- continue
- }
- if err != nil {
- return
- }
- return FileHandle{fh}, int(mid), nil
- }
- }
- func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err error) {
- return openByHandleAt(mountFD, handle.fileHandle, flags)
- }
- func Klogset(typ int, arg int) (err error) {
- var p unsafe.Pointer
- _, _, errno := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(p), uintptr(arg))
- if errno != 0 {
- return errnoErr(errno)
- }
- return nil
- }
- type RemoteIovec struct {
- Base uintptr
- Len int
- }
|