github.com/gotranspile/cxgo@v0.3.7/runtime/stdio/unix.go (about)

     1  package stdio
     2  
     3  import (
     4  	"log"
     5  	"math"
     6  	"os"
     7  	"unsafe"
     8  
     9  	"github.com/gotranspile/cxgo/runtime/csys"
    10  	"github.com/gotranspile/cxgo/runtime/libc"
    11  )
    12  
    13  func Create(path *byte, mode csys.Mode) uintptr {
    14  	panic("TODO")
    15  }
    16  
    17  func Open(path *byte, flags int32, ctls ...interface{}) uintptr {
    18  	spath := libc.GoString(path)
    19  	if len(ctls) != 0 {
    20  		log.Printf("FIXME: open(%q, %x): ignoring controls: %#v", spath, flags, ctls)
    21  	}
    22  	if flags != 0 {
    23  		log.Printf("FIXME: open(%q, %x): ignoring flags: 0x%x", spath, flags, flags)
    24  	}
    25  	// FIXME: handle flags
    26  	f := defaultFS.Open(spath, os.O_RDONLY)
    27  	log.Printf("open(%q, %x): %v", spath, flags, f)
    28  	if f == nil {
    29  		return 0
    30  	}
    31  	return f.FileNo()
    32  }
    33  
    34  func FDControl(fd uintptr, flags int32, ctls ...interface{}) int32 {
    35  	panic("TODO")
    36  }
    37  
    38  func Chdir(path *byte) int32 {
    39  	spath := libc.GoString(path)
    40  	err := FS().Chdir(spath)
    41  	log.Printf("chdir(%q): %v", spath, err)
    42  	if err != nil {
    43  		libc.SetErr(err)
    44  		return -1
    45  	}
    46  	return 0
    47  }
    48  
    49  func Rmdir(path *byte) int32 {
    50  	name := libc.GoString(path)
    51  	err := FS().Rmdir(name)
    52  	log.Printf("rmdir(%q): %v", name, err)
    53  	if err != nil {
    54  		libc.SetErr(err)
    55  		return -1
    56  	}
    57  	return 0
    58  }
    59  
    60  func Unlink(path *byte) int32 {
    61  	name := libc.GoString(path)
    62  	err := FS().Unlink(name)
    63  	log.Printf("unlink(%q): %v", name, err)
    64  	if err != nil {
    65  		libc.SetErr(err)
    66  		return -1
    67  	}
    68  	return 0
    69  }
    70  
    71  func Access(path *byte, flags int32) int32 {
    72  	name := libc.GoString(path)
    73  	_, err := FS().Stat(name)
    74  	log.Printf("access(%q, %x): %v", name, flags, err)
    75  	if err != nil {
    76  		libc.SetErr(err)
    77  		return -1
    78  	}
    79  	// TODO: check access bits
    80  	return 0
    81  }
    82  
    83  func Lseek(fd uintptr, offs uint64, whence int32) uint64 {
    84  	f := ByFD(fd)
    85  	if f == nil {
    86  		return math.MaxUint64
    87  	}
    88  	off := f.Seek(int64(offs), whence)
    89  	if off < 0 {
    90  		return math.MaxUint64
    91  	}
    92  	return uint64(off)
    93  }
    94  
    95  func GetCwd(p *byte, sz int) *byte {
    96  	dir, err := FS().Getwd()
    97  	if err != nil {
    98  		libc.SetErr(err)
    99  		return nil
   100  	}
   101  	dst := unsafe.Slice(p, sz)
   102  	copy(dst, dir)
   103  	return p
   104  }