OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 The Go Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style |
| 3 // license that can be found in the LICENSE file. |
| 4 |
| 5 package syscall |
| 6 |
| 7 import ( |
| 8 "sync" |
| 9 "unsafe" |
| 10 ) |
| 11 |
| 12 //sys naclClose(fd int) (err error) = sys_close |
| 13 //sys Exit(code int) (err error) |
| 14 //sys naclFstat(fd int, stat *Stat_t) (err error) = sys_fstat |
| 15 //sys naclRead(fd int, b []byte) (n int, err error) = sys_read |
| 16 //sys naclSeek(fd int, off *int64, whence int) (err error) = sys_lseek |
| 17 |
| 18 const direntSize = 8 + 8 + 2 + 256 |
| 19 |
| 20 // native_client/src/trusted/service_runtime/include/sys/dirent.h |
| 21 type Dirent struct { |
| 22 Ino int64 |
| 23 Off int64 |
| 24 Reclen uint16 |
| 25 Name [256]byte |
| 26 } |
| 27 |
| 28 func ParseDirent(buf []byte, max int, names []string) (consumed int, count int,
newnames []string) { |
| 29 origlen := len(buf) |
| 30 count = 0 |
| 31 for max != 0 && len(buf) > 0 { |
| 32 dirent := (*Dirent)(unsafe.Pointer(&buf[0])) |
| 33 buf = buf[dirent.Reclen:] |
| 34 if dirent.Ino == 0 { // File absent in directory. |
| 35 continue |
| 36 } |
| 37 bytes := (*[512 + PathMax]byte)(unsafe.Pointer(&dirent.Name[0])) |
| 38 var name = string(bytes[0:clen(bytes[:])]) |
| 39 if name == "." || name == ".." { // Useless names |
| 40 continue |
| 41 } |
| 42 max-- |
| 43 count++ |
| 44 names = append(names, name) |
| 45 } |
| 46 return origlen - len(buf), count, names |
| 47 } |
| 48 |
| 49 func clen(n []byte) int { |
| 50 for i := 0; i < len(n); i++ { |
| 51 if n[i] == 0 { |
| 52 return i |
| 53 } |
| 54 } |
| 55 return len(n) |
| 56 } |
| 57 |
| 58 const PathMax = 256 |
| 59 |
| 60 // An Errno is an unsigned number describing an error condition. |
| 61 // It implements the error interface. The zero Errno is by convention |
| 62 // a non-error, so code to convert from Errno to error should use: |
| 63 // err = nil |
| 64 // if errno != 0 { |
| 65 // err = errno |
| 66 // } |
| 67 type Errno uintptr |
| 68 |
| 69 func (e Errno) Error() string { |
| 70 if 0 <= int(e) && int(e) < len(errorstr) { |
| 71 s := errorstr[e] |
| 72 if s != "" { |
| 73 return s |
| 74 } |
| 75 } |
| 76 return "errno " + itoa(int(e)) |
| 77 } |
| 78 |
| 79 func (e Errno) Temporary() bool { |
| 80 return e == EINTR || e == EMFILE || e.Timeout() |
| 81 } |
| 82 |
| 83 func (e Errno) Timeout() bool { |
| 84 return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT |
| 85 } |
| 86 |
| 87 // A Signal is a number describing a process signal. |
| 88 // It implements the os.Signal interface. |
| 89 type Signal int |
| 90 |
| 91 const ( |
| 92 _ Signal = iota |
| 93 SIGCHLD |
| 94 SIGINT |
| 95 SIGKILL |
| 96 SIGTRAP |
| 97 SIGQUIT |
| 98 ) |
| 99 |
| 100 func (s Signal) Signal() {} |
| 101 |
| 102 func (s Signal) String() string { |
| 103 if 0 <= s && int(s) < len(signals) { |
| 104 str := signals[s] |
| 105 if str != "" { |
| 106 return str |
| 107 } |
| 108 } |
| 109 return "signal " + itoa(int(s)) |
| 110 } |
| 111 |
| 112 var signals = [...]string{} |
| 113 |
| 114 // File system |
| 115 |
| 116 const ( |
| 117 Stdin = 0 |
| 118 Stdout = 1 |
| 119 Stderr = 2 |
| 120 ) |
| 121 |
| 122 // native_client/src/trusted/service_runtime/include/sys/fcntl.h |
| 123 const ( |
| 124 O_RDONLY = 0 |
| 125 O_WRONLY = 1 |
| 126 O_RDWR = 2 |
| 127 O_ACCMODE = 3 |
| 128 |
| 129 O_CREAT = 0100 |
| 130 O_CREATE = O_CREAT // for ken |
| 131 O_TRUNC = 01000 |
| 132 O_APPEND = 02000 |
| 133 O_EXCL = 0200 |
| 134 O_NONBLOCK = 04000 |
| 135 O_NDELAY = O_NONBLOCK |
| 136 O_SYNC = 010000 |
| 137 O_FSYNC = O_SYNC |
| 138 O_ASYNC = 020000 |
| 139 |
| 140 O_CLOEXEC = 0 |
| 141 |
| 142 FD_CLOEXEC = 1 |
| 143 ) |
| 144 |
| 145 // native_client/src/trusted/service_runtime/include/sys/fcntl.h |
| 146 const ( |
| 147 F_DUPFD = 0 |
| 148 F_GETFD = 1 |
| 149 F_SETFD = 2 |
| 150 F_GETFL = 3 |
| 151 F_SETFL = 4 |
| 152 F_GETOWN = 5 |
| 153 F_SETOWN = 6 |
| 154 F_GETLK = 7 |
| 155 F_SETLK = 8 |
| 156 F_SETLKW = 9 |
| 157 F_RGETLK = 10 |
| 158 F_RSETLK = 11 |
| 159 F_CNVT = 12 |
| 160 F_RSETLKW = 13 |
| 161 |
| 162 F_RDLCK = 1 |
| 163 F_WRLCK = 2 |
| 164 F_UNLCK = 3 |
| 165 F_UNLKSYS = 4 |
| 166 ) |
| 167 |
| 168 // native_client/src/trusted/service_runtime/include/bits/stat.h |
| 169 const ( |
| 170 S_IFMT = 0000370000 |
| 171 S_IFSHM_SYSV = 0000300000 |
| 172 S_IFSEMA = 0000270000 |
| 173 S_IFCOND = 0000260000 |
| 174 S_IFMUTEX = 0000250000 |
| 175 S_IFSHM = 0000240000 |
| 176 S_IFBOUNDSOCK = 0000230000 |
| 177 S_IFSOCKADDR = 0000220000 |
| 178 S_IFDSOCK = 0000210000 |
| 179 |
| 180 S_IFSOCK = 0000140000 |
| 181 S_IFLNK = 0000120000 |
| 182 S_IFREG = 0000100000 |
| 183 S_IFBLK = 0000060000 |
| 184 S_IFDIR = 0000040000 |
| 185 S_IFCHR = 0000020000 |
| 186 S_IFIFO = 0000010000 |
| 187 |
| 188 S_UNSUP = 0000370000 |
| 189 |
| 190 S_ISUID = 0004000 |
| 191 S_ISGID = 0002000 |
| 192 S_ISVTX = 0001000 |
| 193 |
| 194 S_IREAD = 0400 |
| 195 S_IWRITE = 0200 |
| 196 S_IEXEC = 0100 |
| 197 |
| 198 S_IRWXU = 0700 |
| 199 S_IRUSR = 0400 |
| 200 S_IWUSR = 0200 |
| 201 S_IXUSR = 0100 |
| 202 |
| 203 S_IRWXG = 070 |
| 204 S_IRGRP = 040 |
| 205 S_IWGRP = 020 |
| 206 S_IXGRP = 010 |
| 207 |
| 208 S_IRWXO = 07 |
| 209 S_IROTH = 04 |
| 210 S_IWOTH = 02 |
| 211 S_IXOTH = 01 |
| 212 ) |
| 213 |
| 214 // native_client/src/trusted/service_runtime/include/sys/stat.h |
| 215 // native_client/src/trusted/service_runtime/include/machine/_types.h |
| 216 type Stat_t struct { |
| 217 Dev int64 |
| 218 Ino uint64 |
| 219 Mode uint32 |
| 220 Nlink uint32 |
| 221 Uid uint32 |
| 222 Gid uint32 |
| 223 Rdev int64 |
| 224 Size int64 |
| 225 Blksize int32 |
| 226 Blocks int32 |
| 227 Atime int64 |
| 228 AtimeNsec int64 |
| 229 Mtime int64 |
| 230 MtimeNsec int64 |
| 231 Ctime int64 |
| 232 CtimeNsec int64 |
| 233 } |
| 234 |
| 235 // Processes |
| 236 // Not supported on NaCl - just enough for package os. |
| 237 |
| 238 var ForkLock sync.RWMutex |
| 239 |
| 240 type WaitStatus uint32 |
| 241 |
| 242 func (w WaitStatus) Exited() bool { return false } |
| 243 func (w WaitStatus) ExitStatus() int { return 0 } |
| 244 func (w WaitStatus) Signaled() bool { return false } |
| 245 func (w WaitStatus) Signal() Signal { return 0 } |
| 246 func (w WaitStatus) CoreDump() bool { return false } |
| 247 func (w WaitStatus) Stopped() bool { return false } |
| 248 func (w WaitStatus) Continued() bool { return false } |
| 249 func (w WaitStatus) StopSignal() Signal { return 0 } |
| 250 func (w WaitStatus) TrapCause() int { return 0 } |
| 251 |
| 252 // XXX made up |
| 253 type Rusage struct { |
| 254 Utime Timeval |
| 255 Stime Timeval |
| 256 } |
| 257 |
| 258 // XXX made up |
| 259 type ProcAttr struct { |
| 260 Dir string |
| 261 Env []string |
| 262 Files []uintptr |
| 263 Sys *SysProcAttr |
| 264 } |
| 265 |
| 266 type SysProcAttr struct { |
| 267 } |
| 268 |
| 269 // System |
| 270 |
| 271 func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) |
| 272 func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
{ return 0, 0, ENOSYS } |
| 273 func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
{ return 0, 0, ENOSYS } |
| 274 func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errn
o) { |
| 275 return 0, 0, ENOSYS |
| 276 } |
| 277 |
| 278 func Sysctl(key string) (string, error) { |
| 279 if key == "kern.hostname" { |
| 280 return "naclbox", nil |
| 281 } |
| 282 return "", ENOSYS |
| 283 } |
| 284 |
| 285 // Unimplemented Unix midden heap. |
| 286 |
| 287 const ImplementsGetwd = false |
| 288 |
| 289 func Getwd() (wd string, err error) { return "", ENOSYS } |
| 290 func Getegid() int { return 1 } |
| 291 func Geteuid() int { return 1 } |
| 292 func Getgid() int { return 1 } |
| 293 func Getgroups() ([]int, error) { return []int{1}, nil } |
| 294 func Getpagesize() int { return 65536 } |
| 295 func Getppid() int { return 2 } |
| 296 func Getpid() int { return 3 } |
| 297 func Getuid() int { return 1 } |
| 298 func Kill(pid int, signum Signal) error { return ENOSYS } |
| 299 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
rror) { |
| 300 return 0, ENOSYS |
| 301 } |
| 302 func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
uintptr, err error) { |
| 303 return 0, 0, ENOSYS |
| 304 } |
| 305 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int,
err error) { |
| 306 return 0, ENOSYS |
| 307 } |
| 308 func RouteRIB(facility, param int) ([]byte, error) { return nil,
ENOSYS } |
| 309 func ParseRoutingMessage(b []byte) ([]RoutingMessage, error) { return nil,
ENOSYS } |
| 310 func ParseRoutingSockaddr(msg RoutingMessage) ([]Sockaddr, error) { return nil,
ENOSYS } |
| 311 func SysctlUint32(name string) (value uint32, err error) { return 0, EN
OSYS } |
OLD | NEW |