269 func Gettimeofday(tv *Timeval) (err error) { |
266 func Gettimeofday(tv *Timeval) (err error) { |
270 err = gettimeofday(tv, nil) |
267 err = gettimeofday(tv, nil) |
271 return |
268 return |
272 } |
269 } |
273 |
270 |
|
271 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { |
|
272 if raceenabled { |
|
273 raceReleaseMerge(unsafe.Pointer(&ioSync)) |
|
274 } |
|
275 return sendfile(outfd, infd, offset, count) |
|
276 } |
|
277 |
274 // TODO |
278 // TODO |
275 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { |
279 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { |
276 return -1, ENOSYS |
280 return -1, ENOSYS |
277 } |
281 } |
278 |
282 |
|
283 func direntIno(buf []byte) (uint64, bool) { |
|
284 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) |
|
285 } |
|
286 |
|
287 func direntReclen(buf []byte) (uint64, bool) { |
|
288 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) |
|
289 } |
|
290 |
|
291 func direntNamlen(buf []byte) (uint64, bool) { |
|
292 reclen, ok := direntReclen(buf) |
|
293 if !ok { |
|
294 return 0, false |
|
295 } |
|
296 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true |
|
297 } |
|
298 |
279 //sys getdirent(fd int, buf []byte) (n int, err error) |
299 //sys getdirent(fd int, buf []byte) (n int, err error) |
280 func ReadDirent(fd int, buf []byte) (n int, err error) { |
300 func Getdents(fd int, buf []byte) (n int, err error) { |
281 return getdirent(fd, buf) |
301 return getdirent(fd, buf) |
282 } |
302 } |
283 |
303 |
284 //sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) |
304 //sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) |
285 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { |
305 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { |
319 } |
339 } |
320 return int((w >> 8) & 0xFF) |
340 return int((w >> 8) & 0xFF) |
321 } |
341 } |
322 |
342 |
323 func (w WaitStatus) Signaled() bool { return w&0x40 == 0 && w&0xFF != 0 } |
343 func (w WaitStatus) Signaled() bool { return w&0x40 == 0 && w&0xFF != 0 } |
324 func (w WaitStatus) Signal() syscall.Signal { |
344 func (w WaitStatus) Signal() Signal { |
325 if !w.Signaled() { |
345 if !w.Signaled() { |
326 return -1 |
346 return -1 |
327 } |
347 } |
328 return syscall.Signal(w>>16) & 0xFF |
348 return Signal(w>>16) & 0xFF |
329 } |
349 } |
330 |
350 |
331 func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 } |
351 func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 } |
332 |
352 |
333 func (w WaitStatus) CoreDump() bool { return w&0x200 != 0 } |
353 func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 } |
334 |
354 |
335 func (w WaitStatus) TrapCause() int { return -1 } |
355 func (w WaitStatus) TrapCause() int { return -1 } |
336 |
356 |
337 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
357 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
338 |
|
339 // ioctl itself should not be exposed directly, but additional get/set |
|
340 // functions for specific types are permissible. |
|
341 |
|
342 // IoctlSetInt performs an ioctl operation which sets an integer value |
|
343 // on fd, using the specified request number. |
|
344 func IoctlSetInt(fd int, req uint, value int) error { |
|
345 return ioctl(fd, req, uintptr(value)) |
|
346 } |
|
347 |
|
348 func ioctlSetWinsize(fd int, req uint, value *Winsize) error { |
|
349 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
|
350 } |
|
351 |
|
352 func ioctlSetTermios(fd int, req uint, value *Termios) error { |
|
353 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
|
354 } |
|
355 |
|
356 // IoctlGetInt performs an ioctl operation which gets an integer value |
|
357 // from fd, using the specified request number. |
|
358 func IoctlGetInt(fd int, req uint) (int, error) { |
|
359 var value int |
|
360 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
361 return value, err |
|
362 } |
|
363 |
|
364 func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { |
|
365 var value Winsize |
|
366 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
367 return &value, err |
|
368 } |
|
369 |
|
370 func IoctlGetTermios(fd int, req uint) (*Termios, error) { |
|
371 var value Termios |
|
372 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
373 return &value, err |
|
374 } |
|
375 |
358 |
376 // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX |
359 // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX |
377 // There is no way to create a custom fcntl and to keep //sys fcntl easily, |
360 // There is no way to create a custom fcntl and to keep //sys fcntl easily, |
378 // Therefore, the programmer must call dup2 instead of fcntl in this case. |
361 // Therefore, the programmer must call dup2 instead of fcntl in this case. |
379 |
362 |
381 //sys FcntlInt(fd uintptr, cmd int, arg int) (r int,err error) = fcntl |
364 //sys FcntlInt(fd uintptr, cmd int, arg int) (r int,err error) = fcntl |
382 |
365 |
383 // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. |
366 // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. |
384 //sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl |
367 //sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl |
385 |
368 |
386 func Flock(fd int, how int) (err error) { |
369 //sys fcntl(fd int, cmd int, arg int) (val int, err error) |
387 return syscall.Flock(fd, how) |
|
388 } |
|
389 |
370 |
390 /* |
371 /* |
391 * Direct access |
372 * Direct access |
392 */ |
373 */ |
393 |
374 |
394 //sys Acct(path string) (err error) |
375 //sys Acct(path string) (err error) |
395 //sys Chdir(path string) (err error) |
376 //sys Chdir(path string) (err error) |
396 //sys Chroot(path string) (err error) |
377 //sys Chroot(path string) (err error) |
397 //sys Close(fd int) (err error) |
378 //sys Close(fd int) (err error) |
398 //sys Dup(oldfd int) (fd int, err error) |
379 //sys Dup(oldfd int) (fd int, err error) |
399 //sys Dup3(oldfd int, newfd int, flags int) (err error) |
|
400 //sys Exit(code int) |
380 //sys Exit(code int) |
401 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) |
381 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) |
402 //sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) |
|
403 //sys Fchdir(fd int) (err error) |
382 //sys Fchdir(fd int) (err error) |
404 //sys Fchmod(fd int, mode uint32) (err error) |
383 //sys Fchmod(fd int, mode uint32) (err error) |
405 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
384 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
406 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
385 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
407 //sys fcntl(fd int, cmd int, arg int) (val int, err error) |
|
408 //sys Fdatasync(fd int) (err error) |
386 //sys Fdatasync(fd int) (err error) |
409 //sys Fsync(fd int) (err error) |
387 //sys Fsync(fd int) (err error) |
410 // readdir_r |
388 // readdir_r |
411 //sysnb Getpgid(pid int) (pgid int, err error) |
389 //sysnb Getpgid(pid int) (pgid int, err error) |
412 |
390 |
415 //sysnb Getpid() (pid int) |
393 //sysnb Getpid() (pid int) |
416 //sysnb Getppid() (ppid int) |
394 //sysnb Getppid() (ppid int) |
417 //sys Getpriority(which int, who int) (prio int, err error) |
395 //sys Getpriority(which int, who int) (prio int, err error) |
418 //sysnb Getrusage(who int, rusage *Rusage) (err error) |
396 //sysnb Getrusage(who int, rusage *Rusage) (err error) |
419 //sysnb Getsid(pid int) (sid int, err error) |
397 //sysnb Getsid(pid int) (sid int, err error) |
420 //sysnb Kill(pid int, sig syscall.Signal) (err error) |
398 //sysnb Kill(pid int, sig Signal) (err error) |
421 //sys Klogctl(typ int, buf []byte) (n int, err error) = syslog |
399 //sys Klogctl(typ int, buf []byte) (n int, err error) = syslog |
422 //sys Mkdir(dirfd int, path string, mode uint32) (err error) |
400 //sys Mkdir(dirfd int, path string, mode uint32) (err error) |
423 //sys Mkdirat(dirfd int, path string, mode uint32) (err error) |
401 //sys Mkdirat(dirfd int, path string, mode uint32) (err error) |
424 //sys Mkfifo(path string, mode uint32) (err error) |
402 //sys Mkfifo(path string, mode uint32) (err error) |
425 //sys Mknod(path string, mode uint32, dev int) (err error) |
403 //sys Mknod(path string, mode uint32, dev int) (err error) |
427 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) |
405 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) |
428 //sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 |
406 //sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 |
429 //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) |
407 //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) |
430 //sys read(fd int, p []byte) (n int, err error) |
408 //sys read(fd int, p []byte) (n int, err error) |
431 //sys Readlink(path string, buf []byte) (n int, err error) |
409 //sys Readlink(path string, buf []byte) (n int, err error) |
432 //sys Removexattr(path string, attr string) (err error) |
|
433 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) |
410 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) |
434 //sys Setdomainname(p []byte) (err error) |
411 //sys Setdomainname(p []byte) (err error) |
435 //sys Sethostname(p []byte) (err error) |
412 //sys Sethostname(p []byte) (err error) |
436 //sysnb Setpgid(pid int, pgid int) (err error) |
413 //sysnb Setpgid(pid int, pgid int) (err error) |
437 //sysnb Setsid() (pid int, err error) |
414 //sysnb Setsid() (pid int, err error) |
441 //sys Setgid(uid int) (err error) |
418 //sys Setgid(uid int) (err error) |
442 |
419 |
443 //sys Setpriority(which int, who int, prio int) (err error) |
420 //sys Setpriority(which int, who int, prio int) (err error) |
444 //sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) |
421 //sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) |
445 //sys Sync() |
422 //sys Sync() |
446 //sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) |
|
447 //sysnb Times(tms *Tms) (ticks uintptr, err error) |
423 //sysnb Times(tms *Tms) (ticks uintptr, err error) |
448 //sysnb Umask(mask int) (oldmask int) |
424 //sysnb Umask(mask int) (oldmask int) |
449 //sysnb Uname(buf *Utsname) (err error) |
425 //sysnb Uname(buf *Utsname) (err error) |
450 //TODO umount |
|
451 // //sys Unmount(target string, flags int) (err error) = umount |
|
452 //sys Unlink(path string) (err error) |
426 //sys Unlink(path string) (err error) |
453 //sys Unlinkat(dirfd int, path string, flags int) (err error) |
427 //sys Unlinkat(dirfd int, path string, flags int) (err error) |
454 //sys Unshare(flags int) (err error) |
|
455 //sys Ustat(dev int, ubuf *Ustat_t) (err error) |
428 //sys Ustat(dev int, ubuf *Ustat_t) (err error) |
456 //sys write(fd int, p []byte) (n int, err error) |
429 //sys write(fd int, p []byte) (n int, err error) |
457 //sys readlen(fd int, p *byte, np int) (n int, err error) = read |
430 //sys readlen(fd int, p *byte, np int) (n int, err error) = read |
458 //sys writelen(fd int, p *byte, np int) (n int, err error) = write |
431 //sys writelen(fd int, p *byte, np int) (n int, err error) = write |
459 |
432 |
460 //sys Dup2(oldfd int, newfd int) (err error) |
433 //sys Dup2(oldfd int, newfd int) (err error) |
461 //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 |
434 //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 |
462 //sys Fchown(fd int, uid int, gid int) (err error) |
435 //sys Fchown(fd int, uid int, gid int) (err error) |
463 //sys Fstat(fd int, stat *Stat_t) (err error) |
436 //sys fstat(fd int, stat *Stat_t) (err error) |
464 //sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat |
437 //sys fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat |
465 //sys Fstatfs(fd int, buf *Statfs_t) (err error) |
438 //sys Fstatfs(fd int, buf *Statfs_t) (err error) |
466 //sys Ftruncate(fd int, length int64) (err error) |
439 //sys Ftruncate(fd int, length int64) (err error) |
467 //sysnb Getegid() (egid int) |
440 //sysnb Getegid() (egid int) |
468 //sysnb Geteuid() (euid int) |
441 //sysnb Geteuid() (euid int) |
469 //sysnb Getgid() (gid int) |
442 //sysnb Getgid() (gid int) |
470 //sysnb Getuid() (uid int) |
443 //sysnb Getuid() (uid int) |
471 //sys Lchown(path string, uid int, gid int) (err error) |
444 //sys Lchown(path string, uid int, gid int) (err error) |
472 //sys Listen(s int, n int) (err error) |
445 //sys Listen(s int, n int) (err error) |
473 //sys Lstat(path string, stat *Stat_t) (err error) |
446 //sys lstat(path string, stat *Stat_t) (err error) |
474 //sys Pause() (err error) |
447 //sys Pause() (err error) |
475 //sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 |
448 //sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 |
476 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 |
449 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 |
477 //TODO Select |
450 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
478 // //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
|
479 //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) |
451 //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) |
480 //sysnb Setregid(rgid int, egid int) (err error) |
452 //sysnb Setregid(rgid int, egid int) (err error) |
481 //sysnb Setreuid(ruid int, euid int) (err error) |
453 //sysnb Setreuid(ruid int, euid int) (err error) |
482 //sys Shutdown(fd int, how int) (err error) |
454 //sys Shutdown(fd int, how int) (err error) |
483 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) |
455 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) |
484 //sys Stat(path string, stat *Stat_t) (err error) |
456 //sys stat(path string, statptr *Stat_t) (err error) |
485 //sys Statfs(path string, buf *Statfs_t) (err error) |
457 //sys Statfs(path string, buf *Statfs_t) (err error) |
486 //sys Truncate(path string, length int64) (err error) |
458 //sys Truncate(path string, length int64) (err error) |
487 |
459 |
488 //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) |
460 //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) |
489 //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) |
461 //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) |
495 //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) |
467 //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) |
496 //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) |
468 //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) |
497 //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) |
469 //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) |
498 //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) |
470 //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) |
499 //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) |
471 //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) |
500 //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) |
472 |
501 //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) |
473 // In order to use msghdr structure with Control, Controllen, nrecvmsg and nsendmsg must be used. |
|
474 //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = nrecvmsg |
|
475 //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg |
502 |
476 |
503 //sys munmap(addr uintptr, length uintptr) (err error) |
477 //sys munmap(addr uintptr, length uintptr) (err error) |
504 |
478 |
505 var mapper = &mmapper{ |
479 var mapper = &mmapper{ |
506 active: make(map[*byte][]byte), |
480 active: make(map[*byte][]byte), |