diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
commit | 7b15ed9ef455b6b66c6b376898a88aef5d6a9970 (patch) | |
tree | 3ef530baa80cdf29436ba981f5783be6b4d2202b /src/pkg/syscall/syscall_darwin.go | |
parent | 50104cc32a498f7517a51c8dc93106c51c7a54b4 (diff) | |
download | golang-7b15ed9ef455b6b66c6b376898a88aef5d6a9970.tar.gz |
Imported Upstream version 2011.04.13upstream/2011.04.13
Diffstat (limited to 'src/pkg/syscall/syscall_darwin.go')
-rw-r--r-- | src/pkg/syscall/syscall_darwin.go | 76 |
1 files changed, 53 insertions, 23 deletions
diff --git a/src/pkg/syscall/syscall_darwin.go b/src/pkg/syscall/syscall_darwin.go index 552c9c154..30b57cf55 100644 --- a/src/pkg/syscall/syscall_darwin.go +++ b/src/pkg/syscall/syscall_darwin.go @@ -12,6 +12,8 @@ package syscall +import "unsafe" + const OS = "darwin" type SockaddrDatalink struct { @@ -26,6 +28,34 @@ type SockaddrDatalink struct { raw RawSockaddrDatalink } +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + if dirent.Reclen == 0 { + buf = nil + break + } + buf = buf[dirent.Reclen:] + if dirent.Ino == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:dirent.Namlen]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + /* * Wrapped */ @@ -45,8 +75,8 @@ func Kill(pid int, signum int) (errno int) { return kill(pid, signum, 1) } //sys Chown(path string, uid int, gid int) (errno int) //sys Chroot(path string) (errno int) //sys Close(fd int) (errno int) -//sys Dup(fd int) (nfd int, errno int) -//sys Dup2(from int, to int) (errno int) +//sysnb Dup(fd int) (nfd int, errno int) +//sysnb Dup2(from int, to int) (errno int) //sys Exchangedata(path1 string, path2 string, options int) (errno int) //sys Exit(code int) //sys Fchdir(fd int) (errno int) @@ -61,20 +91,20 @@ func Kill(pid int, signum int) (errno int) { return kill(pid, signum, 1) } //sys Ftruncate(fd int, length int64) (errno int) //sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, errno int) = SYS_GETDIRENTRIES64 //sys Getdtablesize() (size int) -//sys Getegid() (egid int) -//sys Geteuid() (uid int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) //sys Getfsstat(buf []Statfs_t, flags int) (n int, errno int) = SYS_GETFSSTAT64 -//sys Getgid() (gid int) -//sys Getpgid(pid int) (pgid int, errno int) -//sys Getpgrp() (pgrp int) -//sys Getpid() (pid int) -//sys Getppid() (ppid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, errno int) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, errno int) -//sys Getrlimit(which int, lim *Rlimit) (errno int) -//sys Getrusage(who int, rusage *Rusage) (errno int) -//sys Getsid(pid int) (sid int, errno int) -//sys Getuid() (uid int) -//sys Issetugid() (tainted bool) +//sysnb Getrlimit(which int, lim *Rlimit) (errno int) +//sysnb Getrusage(who int, rusage *Rusage) (errno int) +//sysnb Getsid(pid int) (sid int, errno int) +//sysnb Getuid() (uid int) +//sysnb Issetugid() (tainted bool) //sys Kqueue() (fd int, errno int) //sys Lchown(path string, uid int, gid int) (errno int) //sys Link(path string, link string) (errno int) @@ -95,18 +125,18 @@ func Kill(pid int, signum int) (errno int) { return kill(pid, signum, 1) } //sys Seek(fd int, offset int64, whence int) (newoffset int64, errno int) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (errno int) //sys Setegid(egid int) (errno int) -//sys Seteuid(euid int) (errno int) -//sys Setgid(gid int) (errno int) +//sysnb Seteuid(euid int) (errno int) +//sysnb Setgid(gid int) (errno int) //sys Setlogin(name string) (errno int) -//sys Setpgid(pid int, pgid int) (errno int) +//sysnb Setpgid(pid int, pgid int) (errno int) //sys Setpriority(which int, who int, prio int) (errno int) //sys Setprivexec(flag int) (errno int) -//sys Setregid(rgid int, egid int) (errno int) -//sys Setreuid(ruid int, euid int) (errno int) -//sys Setrlimit(which int, lim *Rlimit) (errno int) -//sys Setsid() (pid int, errno int) -//sys Settimeofday(tp *Timeval) (errno int) -//sys Setuid(uid int) (errno int) +//sysnb Setregid(rgid int, egid int) (errno int) +//sysnb Setreuid(ruid int, euid int) (errno int) +//sysnb Setrlimit(which int, lim *Rlimit) (errno int) +//sysnb Setsid() (pid int, errno int) +//sysnb Settimeofday(tp *Timeval) (errno int) +//sysnb Setuid(uid int) (errno int) //sys Stat(path string, stat *Stat_t) (errno int) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (errno int) = SYS_STATFS64 //sys Symlink(path string, link string) (errno int) |