package libc
import (
"strings"
"unsafe"
"golang.org/x/sys/unix"
"modernc.org/libc/fcntl"
"modernc.org/libc/signal"
"modernc.org/libc/sys/types"
"modernc.org/libc/utime"
)
func Xsigaction (t *TLS , signum int32 , act , oldact uintptr ) int32 {
var kact , koldact uintptr
if act != 0 {
sz := int (unsafe .Sizeof (signal .X__sigaction {}))
kact = t .Alloc (sz )
defer t .Free (sz )
(*signal .X__sigaction )(unsafe .Pointer (kact )).F__sigaction_u .F__sa_handler = (*signal .Sigaction )(unsafe .Pointer (act )).F__sigaction_u .F__sa_handler
(*signal .X__sigaction )(unsafe .Pointer (kact )).Fsa_flags = (*signal .Sigaction )(unsafe .Pointer (act )).Fsa_flags
Xmemcpy (t , kact +unsafe .Offsetof (signal .X__sigaction {}.Fsa_mask ), act +unsafe .Offsetof (signal .Sigaction {}.Fsa_mask ), types .Size_t (unsafe .Sizeof (signal .Sigset_t (0 ))))
}
if oldact != 0 {
panic (todo ("" ))
}
if _ , _ , err := unix .Syscall6 (unix .SYS_SIGACTION , uintptr (signum ), kact , koldact , unsafe .Sizeof (signal .Sigset_t (0 )), 0 , 0 ); err != 0 {
t .setErrno (err )
return -1
}
if oldact != 0 {
panic (todo ("" ))
}
return 0
}
func Xfcntl64 (t *TLS , fd , cmd int32 , args uintptr ) (r int32 ) {
var err error
var p uintptr
var i int
switch cmd {
case fcntl .F_GETLK , fcntl .F_SETLK :
p = *(*uintptr )(unsafe .Pointer (args ))
err = unix .FcntlFlock (uintptr (fd ), int (cmd ), (*unix .Flock_t )(unsafe .Pointer (p )))
case fcntl .F_GETFL , fcntl .F_FULLFSYNC :
i , err = unix .FcntlInt (uintptr (fd ), int (cmd ), 0 )
r = int32 (i )
case fcntl .F_SETFD , fcntl .F_SETFL :
arg := *(*int32 )(unsafe .Pointer (args ))
_, err = unix .FcntlInt (uintptr (fd ), int (cmd ), int (arg ))
default :
panic (todo ("%v: %v %v" , origin (1 ), fd , cmd ))
}
if err != nil {
if dmesgs {
dmesg ("%v: fd %v cmd %v p %#x: %v FAIL" , origin (1 ), fcntlCmdStr (fd ), cmd , p , err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %d %s %#x: ok" , origin (1 ), fd , fcntlCmdStr (cmd ), p )
}
return r
}
func Xlstat64 (t *TLS , pathname , statbuf uintptr ) int32 {
if err := unix .Lstat (GoString (pathname ), (*unix .Stat_t )(unsafe .Pointer (statbuf ))); err != nil {
if dmesgs {
dmesg ("%v: %q: %v FAIL" , origin (1 ), GoString (pathname ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %q: ok" , origin (1 ), GoString (pathname ))
}
return 0
}
func Xstat64 (t *TLS , pathname , statbuf uintptr ) int32 {
if err := unix .Stat (GoString (pathname ), (*unix .Stat_t )(unsafe .Pointer (statbuf ))); err != nil {
if dmesgs {
dmesg ("%v: %q: %v FAIL" , origin (1 ), GoString (pathname ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %q: ok" , origin (1 ), GoString (pathname ))
}
return 0
}
func Xfstatfs (t *TLS , fd int32 , buf uintptr ) int32 {
if err := unix .Fstatfs (int (fd ), (*unix .Statfs_t )(unsafe .Pointer (buf ))); err != nil {
if dmesgs {
dmesg ("%v: %v: %v FAIL" , origin (1 ), fd , err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %v: ok" , origin (1 ), fd )
}
return 0
}
func Xstatfs (t *TLS , path uintptr , buf uintptr ) int32 {
if err := unix .Statfs (GoString (path ), (*unix .Statfs_t )(unsafe .Pointer (buf ))); err != nil {
if dmesgs {
dmesg ("%v: %q: %v FAIL" , origin (1 ), GoString (path ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %q: ok" , origin (1 ), GoString (path ))
}
return 0
}
func Xfstat64 (t *TLS , fd int32 , statbuf uintptr ) int32 {
if err := unix .Fstat (int (fd ), (*unix .Stat_t )(unsafe .Pointer (statbuf ))); err != nil {
if dmesgs {
dmesg ("%v: fd %d: %v FAIL" , origin (1 ), fd , err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: fd %d: ok" , origin (1 ), fd )
}
return 0
}
func Xlseek64 (t *TLS , fd int32 , offset types .Off_t , whence int32 ) types .Off_t {
n , err := unix .Seek (int (fd ), int64 (offset ), int (whence ))
if err != nil {
if dmesgs {
dmesg ("%v: %v FAIL" , origin (1 ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" , origin (1 ))
}
return types .Off_t (n )
}
func Xutime (t *TLS , filename , times uintptr ) int32 {
var a []unix .Timeval
if times != 0 {
a = make ([]unix .Timeval , 2 )
a [0 ].Sec = (*utime .Utimbuf )(unsafe .Pointer (times )).Factime
a [1 ].Sec = (*utime .Utimbuf )(unsafe .Pointer (times )).Fmodtime
}
if err := unix .Utimes (GoString (filename ), a ); err != nil {
if dmesgs {
dmesg ("%v: %v FAIL" , origin (1 ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" , origin (1 ))
}
return 0
}
func Xalarm (t *TLS , seconds uint32 ) uint32 {
panic (todo ("" ))
}
func Xtime (t *TLS , tloc uintptr ) types .Time_t {
panic (todo ("" ))
}
func Xmkdir (t *TLS , path uintptr , mode types .Mode_t ) int32 {
if err := unix .Mkdir (GoString (path ), uint32 (mode )); err != nil {
if dmesgs {
dmesg ("%v: %q: %v FAIL" , origin (1 ), GoString (path ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %q: ok" , origin (1 ), GoString (path ))
}
return 0
}
func Xsymlink (t *TLS , target , linkpath uintptr ) int32 {
if err := unix .Symlink (GoString (target ), GoString (linkpath )); err != nil {
if dmesgs {
dmesg ("%v: %v FAIL" , origin (1 ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" , origin (1 ))
}
return 0
}
func Xchmod (t *TLS , pathname uintptr , mode types .Mode_t ) int32 {
if err := unix .Chmod (GoString (pathname ), uint32 (mode )); err != nil {
if dmesgs {
dmesg ("%v: %q %#o: %v FAIL" , origin (1 ), GoString (pathname ), mode , err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %q %#o: ok" , origin (1 ), GoString (pathname ), mode )
}
return 0
}
func Xutimes (t *TLS , filename , times uintptr ) int32 {
var a []unix .Timeval
if times != 0 {
a = make ([]unix .Timeval , 2 )
a [0 ] = *(*unix .Timeval )(unsafe .Pointer (times ))
a [1 ] = *(*unix .Timeval )(unsafe .Pointer (times + unsafe .Sizeof (unix .Timeval {})))
}
if err := unix .Utimes (GoString (filename ), a ); err != nil {
if dmesgs {
dmesg ("%v: %v FAIL" , origin (1 ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" , origin (1 ))
}
return 0
}
func Xunlink (t *TLS , pathname uintptr ) int32 {
if err := unix .Unlink (GoString (pathname )); err != nil {
if dmesgs {
dmesg ("%v: %q: %v" , origin (1 ), GoString (pathname ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" , origin (1 ))
}
return 0
}
func Xaccess (t *TLS , pathname uintptr , mode int32 ) int32 {
if err := unix .Access (GoString (pathname ), uint32 (mode )); err != nil {
if dmesgs {
dmesg ("%v: %q %#o: %v FAIL" , origin (1 ), GoString (pathname ), mode , err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: %q %#o: ok" , origin (1 ), GoString (pathname ), mode )
}
return 0
}
func Xrename (t *TLS , oldpath , newpath uintptr ) int32 {
if err := unix .Rename (GoString (oldpath ), GoString (newpath )); err != nil {
if dmesgs {
dmesg ("%v: %v FAIL" , origin (1 ), err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" , origin (1 ))
}
return 0
}
func Xmknod (t *TLS , pathname uintptr , mode types .Mode_t , dev types .Dev_t ) int32 {
panic (todo ("" ))
}
func Xchown (t *TLS , pathname uintptr , owner types .Uid_t , group types .Gid_t ) int32 {
panic (todo ("" ))
}
func Xlink (t *TLS , oldpath , newpath uintptr ) int32 {
panic (todo ("" ))
}
func Xdup2 (t *TLS , oldfd , newfd int32 ) int32 {
panic (todo ("" ))
}
func Xreadlink (t *TLS , path , buf uintptr , bufsize types .Size_t ) types .Ssize_t {
var n int
var err error
switch {
case buf == 0 || bufsize == 0 :
n , err = unix .Readlink (GoString (path ), nil )
default :
n , err = unix .Readlink (GoString (path ), (*RawMem )(unsafe .Pointer (buf ))[:bufsize :bufsize ])
}
if err != nil {
if dmesgs {
dmesg ("%v: %v FAIL" , err )
}
t .setErrno (err )
return -1
}
if dmesgs {
dmesg ("%v: ok" )
}
return types .Ssize_t (n )
}
func Xfopen64 (t *TLS , pathname , mode uintptr ) uintptr {
m := strings .ReplaceAll (GoString (mode ), "b" , "" )
var flags int
switch m {
case "r" :
flags = fcntl .O_RDONLY
case "r+" :
flags = fcntl .O_RDWR
case "w" :
flags = fcntl .O_WRONLY | fcntl .O_CREAT | fcntl .O_TRUNC
case "w+" :
flags = fcntl .O_RDWR | fcntl .O_CREAT | fcntl .O_TRUNC
case "a" :
flags = fcntl .O_WRONLY | fcntl .O_CREAT | fcntl .O_APPEND
case "a+" :
flags = fcntl .O_RDWR | fcntl .O_CREAT | fcntl .O_APPEND
default :
panic (m )
}
fd , err := unix .Open (GoString (pathname ), int (flags ), 0666 )
if err != nil {
if dmesgs {
dmesg ("%v: %q %q: %v FAIL" , origin (1 ), GoString (pathname ), GoString (mode ), err )
}
t .setErrno (err )
return 0
}
if dmesgs {
dmesg ("%v: %q %q: fd %v" , origin (1 ), GoString (pathname ), GoString (mode ), fd )
}
if p := newFile (t , int32 (fd )); p != 0 {
return p
}
panic ("OOM" )
}
The pages are generated with Golds v0.3.6 . (GOOS=darwin GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .