// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package syscall // File operations for Darwin import syscall "syscall" //export Stat //export stat, fstat, lstat //export open, creat, close, read, write, pipe //export unlink func StatPtr(s *Stat) int64; type dev_t uint32; type ino_t uint64; type mode_t uint16; type nlink_t uint16; type uid_t uint32; type gid_t uint32; type off_t int64; type blksize_t int64; type blkcnt_t int64; type time_t int64; type Timespec struct { tv_sec time_t; tv_nsec int64; } export type Stat struct { st_dev dev_t; /* ID of device containing file */ st_mode mode_t; /* protection */ st_nlink nlink_t; /* number of hard links */ st_ino ino_t; /* inode number */ st_uid uid_t; /* user ID of owner */ st_gid gid_t; /* group ID of owner */ st_rdev dev_t; /* device ID (if special file) */ st_atime Timespec; /* time of last access */ st_mtime Timespec; /* time of last modification */ st_ctime Timespec; /* time of last status change */ st_birthtimespec Timespec; /* birth time */ st_size off_t; /* total size, in bytes */ st_blocks blkcnt_t; /* number of blocks allocated */ st_blksize blksize_t; /* blocksize for filesystem I/O */ st_flags uint32; st_gen uint32; st_qspare[2] int64; } export const ( O_RDONLY = 0x0; O_WRONLY = 0x1; O_RDWR = 0x2; O_APPEND = 0x8; O_ASYNC = 0x40; O_CREAT = 0x200; O_NOCTTY = 0x20000; O_NONBLOCK = 0x4; O_NDELAY = O_NONBLOCK; O_SYNC = 0x80; O_TRUNC = 0x400; ) 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, BytePtr(&namebuf[0]), mode, perm); return r1, err; } 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, BytePtr(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm); return r1, err; } export func close(fd int64) (ret int64, errno int64) { const SYSCLOSE = 6; r1, r2, err := syscall.Syscall(SYSCLOSE, fd, 0, 0); return r1, err; } export func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { const SYSREAD = 3; r1, r2, err := syscall.Syscall(SYSREAD, fd, BytePtr(buf), nbytes); return r1, err; } export func write(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { const SYSWRITE = 4; r1, r2, err := syscall.Syscall(SYSWRITE, fd, BytePtr(buf), nbytes); return r1, err; } export func pipe(fds *[2]int64) (ret int64, errno int64) { const SYSPIPE = 42; r1, r2, err := syscall.Syscall(SYSPIPE, 0, 0, 0); if r1 < 0 { return r1, err; } fds[0] = r1; fds[1] = r2; return 0, 0; } 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, BytePtr(&namebuf[0]), StatPtr(buf), 0); return r1, err; } export func lstat(name *byte, buf *Stat) (ret int64, errno int64) { const SYSLSTAT = 340; r1, r2, err := syscall.Syscall(SYSLSTAT, BytePtr(name), StatPtr(buf), 0); return r1, err; } export func fstat(fd int64, buf *Stat) (ret int64, errno int64) { const SYSFSTAT = 339; r1, r2, err := syscall.Syscall(SYSFSTAT, fd, StatPtr(buf), 0); return r1, err; } 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, BytePtr(&namebuf[0]), 0, 0); return r1, err; }