diff options
Diffstat (limited to 'src/syscall')
-rw-r--r-- | src/syscall/Makefile | 22 | ||||
-rw-r--r-- | src/syscall/file_amd64_darwin.go | 34 | ||||
-rw-r--r-- | src/syscall/file_amd64_linux.go | 34 | ||||
-rw-r--r-- | src/syscall/syscall.go | 14 |
4 files changed, 81 insertions, 23 deletions
diff --git a/src/syscall/Makefile b/src/syscall/Makefile index 468909a10..9ae0c6a72 100644 --- a/src/syscall/Makefile +++ b/src/syscall/Makefile @@ -8,23 +8,31 @@ CC=$(O)c AS=$(O)a GC=$(O)g -PKG=syscall.a +PKG=$(GOROOT)/pkg/syscall.a -OFILES=\ +O1=\ syscall.$O \ errstr_$(GOOS).$O \ + +O2=\ file_$(GOARCH)_$(GOOS).$O \ syscall_$(GOARCH)_$(GOOS).$O \ -install: $(PKG) - cp $(PKG) $(GOROOT)/pkg/$(PKG) +install: nuke $(PKG) + +$(PKG): a1 a2 + +a1: $(O1) + $(O)ar grc $(PKG) $(O1) + rm *.6 -$(PKG): $(OFILES) - $(O)ar grc $(PKG) $(OFILES) +a2: $(O2) + $(O)ar grc $(PKG) $(O2) + rm *.6 nuke: - rm -f *.$(O) *.a $(GOROOT)/pkg/$(PKG) + rm -f *.$(O) *.a $(PKG) clean: rm -f *.$(O) *.a diff --git a/src/syscall/file_amd64_darwin.go b/src/syscall/file_amd64_darwin.go index 58cf6e93b..95d3ce55d 100644 --- a/src/syscall/file_amd64_darwin.go +++ b/src/syscall/file_amd64_darwin.go @@ -65,15 +65,25 @@ const ( O_TRUNC = 0x400; ) -export func open(name *byte, mode int64, flags int64) (ret int64, errno int64) { +const NameBufsize = 512 + +export func open(name string, mode int64, perm int64) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSOPEN = 5; - r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags); + r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), mode, perm); return r1, err; } -export func creat(name *byte, mode int64) (ret int64, errno int64) { +export func creat(name string, perm int64) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSOPEN = 5; - r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC); + r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm); return r1, err; } @@ -106,9 +116,13 @@ export func pipe(fds *[2]int64) (ret int64, errno int64) { return 0, 0; } -export func stat(name *byte, buf *Stat) (ret int64, errno int64) { +export func stat(name string, buf *Stat) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSSTAT = 338; - r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(name), StatToInt(buf), 0); + r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(&namebuf[0]), StatToInt(buf), 0); return r1, err; } @@ -124,8 +138,12 @@ export func fstat(fd int64, buf *Stat) (ret int64, errno int64) { return r1, err; } -export func unlink(name *byte) (ret int64, errno int64) { +export func unlink(name string) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSUNLINK = 10; - r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0); + r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(&namebuf[0]), 0, 0); return r1, err; } diff --git a/src/syscall/file_amd64_linux.go b/src/syscall/file_amd64_linux.go index d00222a26..dc99d7de3 100644 --- a/src/syscall/file_amd64_linux.go +++ b/src/syscall/file_amd64_linux.go @@ -66,15 +66,25 @@ const ( O_TRUNC = 0x200; ) -export func open(name *byte, mode int64, flags int64) (ret int64, errno int64) { +const NameBufsize = 512 + +export func open(name string, mode int64, perm int64) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSOPEN = 2; - r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags); + r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), mode, perm); return r1, err; } -export func creat(name *byte, mode int64) (ret int64, errno int64) { +export func creat(name string, perm int64) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSOPEN = 2; - r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC); + r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm); return r1, err; } @@ -108,9 +118,13 @@ export func pipe(fds *[2]int64) (ret int64, errno int64) { return 0, 0; } -export func stat(name *byte, buf *Stat) (ret int64, errno int64) { +export func stat(name string, buf *Stat) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSSTAT = 4; - r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(name), StatToInt(buf), 0); + r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(&namebuf[0]), StatToInt(buf), 0); return r1, err; } @@ -126,8 +140,12 @@ export func fstat(fd int64, buf *Stat) (ret int64, errno int64) { return r1, err; } -export func unlink(name *byte) (ret int64, errno int64) { +export func unlink(name string) (ret int64, errno int64) { + var namebuf [NameBufsize]byte; + if !StringToBytes(&namebuf, name) { + return -1, syscall.ENAMETOOLONG + } const SYSUNLINK = 87; - r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0); + r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(&namebuf[0]), 0, 0); return r1, err; } diff --git a/src/syscall/syscall.go b/src/syscall/syscall.go index 7f31c11c9..384be2429 100644 --- a/src/syscall/syscall.go +++ b/src/syscall/syscall.go @@ -11,3 +11,17 @@ package syscall export func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); export func AddrToInt(b *byte) int64; +/* + * Used to convert file names to byte arrays for passing to kernel, + * but useful elsewhere too. + */ +export func StringToBytes(b *[]byte, s string) bool { + if len(s) >= len(b) { + return false + } + for i := 0; i < len(s); i++ { + b[i] = s[i] + } + b[len(s)] = '\000'; // not necessary - memory is zeroed - but be explicit + return true +} |