75 return nil, err |
75 return nil, err |
76 } |
76 } |
77 return buf[0 : n/siz], nil |
77 return buf[0 : n/siz], nil |
78 } |
78 } |
79 |
79 |
80 //sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) |
80 func direntIno(buf []byte) (uint64, bool) { |
|
81 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) |
|
82 } |
|
83 |
|
84 func direntReclen(buf []byte) (uint64, bool) { |
|
85 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) |
|
86 } |
|
87 |
|
88 func direntNamlen(buf []byte) (uint64, bool) { |
|
89 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) |
|
90 } |
|
91 |
81 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } |
92 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } |
82 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } |
93 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } |
83 |
94 |
84 const ( |
95 const ( |
85 attrBitMapCount = 5 |
96 attrBitMapCount = 5 |
106 _p0, err = BytePtrFromString(path) |
117 _p0, err = BytePtrFromString(path) |
107 if err != nil { |
118 if err != nil { |
108 return nil, err |
119 return nil, err |
109 } |
120 } |
110 |
121 |
111 _, _, e1 := Syscall6( |
122 if err := getattrlist(_p0, unsafe.Pointer(&attrList), unsafe.Pointer(&attrBuf[0]), uintptr(len(attrBuf)), int(options)); err != nil { |
112 SYS_GETATTRLIST, |
123 return nil, err |
113 uintptr(unsafe.Pointer(_p0)), |
|
114 uintptr(unsafe.Pointer(&attrList)), |
|
115 uintptr(unsafe.Pointer(&attrBuf[0])), |
|
116 uintptr(len(attrBuf)), |
|
117 uintptr(options), |
|
118 0, |
|
119 ) |
|
120 if e1 != 0 { |
|
121 return nil, e1 |
|
122 } |
124 } |
123 size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) |
125 size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) |
124 |
126 |
125 // dat is the section of attrBuf that contains valid data, |
127 // dat is the section of attrBuf that contains valid data, |
126 // without the 4 byte length header. All attribute offsets |
128 // without the 4 byte length header. All attribute offsets |
296 attributes := [2]Timespec{times[1], times[0]} |
295 attributes := [2]Timespec{times[1], times[0]} |
297 options := 0 |
296 options := 0 |
298 if flags&AT_SYMLINK_NOFOLLOW != 0 { |
297 if flags&AT_SYMLINK_NOFOLLOW != 0 { |
299 options |= FSOPT_NOFOLLOW |
298 options |= FSOPT_NOFOLLOW |
300 } |
299 } |
301 _, _, e1 := Syscall6( |
300 return setattrlist( |
302 SYS_SETATTRLIST, |
301 _p0, |
303 uintptr(unsafe.Pointer(_p0)), |
302 unsafe.Pointer(&attrList), |
304 uintptr(unsafe.Pointer(&attrList)), |
303 unsafe.Pointer(&attributes), |
305 uintptr(unsafe.Pointer(&attributes)), |
304 unsafe.Sizeof(attributes), |
306 uintptr(unsafe.Sizeof(attributes)), |
305 options) |
307 uintptr(options), |
306 } |
308 0, |
307 |
309 ) |
308 //sys setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) |
310 if e1 != 0 { |
|
311 return e1 |
|
312 } |
|
313 return nil |
|
314 } |
|
315 |
309 |
316 func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { |
310 func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { |
317 // Darwin doesn't support SYS_UTIMENSAT |
311 // Darwin doesn't support SYS_UTIMENSAT |
318 return ENOSYS |
312 return ENOSYS |
319 } |
313 } |
320 |
314 |
321 /* |
315 /* |
322 * Wrapped |
316 * Wrapped |
323 */ |
317 */ |
324 |
318 |
|
319 //sys fcntl(fd int, cmd int, arg int) (val int, err error) |
|
320 |
325 //sys kill(pid int, signum int, posix int) (err error) |
321 //sys kill(pid int, signum int, posix int) (err error) |
326 |
322 |
327 func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } |
323 func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } |
328 |
324 |
329 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
325 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
330 |
326 |
331 // ioctl itself should not be exposed directly, but additional get/set |
327 //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL |
332 // functions for specific types are permissible. |
|
333 |
|
334 // IoctlSetInt performs an ioctl operation which sets an integer value |
|
335 // on fd, using the specified request number. |
|
336 func IoctlSetInt(fd int, req uint, value int) error { |
|
337 return ioctl(fd, req, uintptr(value)) |
|
338 } |
|
339 |
|
340 func ioctlSetWinsize(fd int, req uint, value *Winsize) error { |
|
341 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
|
342 } |
|
343 |
|
344 func ioctlSetTermios(fd int, req uint, value *Termios) error { |
|
345 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
|
346 } |
|
347 |
|
348 // IoctlGetInt performs an ioctl operation which gets an integer value |
|
349 // from fd, using the specified request number. |
|
350 func IoctlGetInt(fd int, req uint) (int, error) { |
|
351 var value int |
|
352 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
353 return value, err |
|
354 } |
|
355 |
|
356 func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { |
|
357 var value Winsize |
|
358 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
359 return &value, err |
|
360 } |
|
361 |
|
362 func IoctlGetTermios(fd int, req uint) (*Termios, error) { |
|
363 var value Termios |
|
364 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
365 return &value, err |
|
366 } |
|
367 |
328 |
368 func Uname(uname *Utsname) error { |
329 func Uname(uname *Utsname) error { |
369 mib := []_C_int{CTL_KERN, KERN_OSTYPE} |
330 mib := []_C_int{CTL_KERN, KERN_OSTYPE} |
370 n := unsafe.Sizeof(uname.Sysname) |
331 n := unsafe.Sizeof(uname.Sysname) |
371 if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { |
332 if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { |
409 } |
370 } |
410 |
371 |
411 return nil |
372 return nil |
412 } |
373 } |
413 |
374 |
|
375 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { |
|
376 if raceenabled { |
|
377 raceReleaseMerge(unsafe.Pointer(&ioSync)) |
|
378 } |
|
379 var length = int64(count) |
|
380 err = sendfile(infd, outfd, *offset, &length, nil, 0) |
|
381 written = int(length) |
|
382 return |
|
383 } |
|
384 |
|
385 //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) |
|
386 |
414 /* |
387 /* |
415 * Exposed directly |
388 * Exposed directly |
416 */ |
389 */ |
417 //sys Access(path string, mode uint32) (err error) |
390 //sys Access(path string, mode uint32) (err error) |
418 //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) |
391 //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) |
419 //sys Chdir(path string) (err error) |
392 //sys Chdir(path string) (err error) |
420 //sys Chflags(path string, flags int) (err error) |
393 //sys Chflags(path string, flags int) (err error) |
421 //sys Chmod(path string, mode uint32) (err error) |
394 //sys Chmod(path string, mode uint32) (err error) |
422 //sys Chown(path string, uid int, gid int) (err error) |
395 //sys Chown(path string, uid int, gid int) (err error) |
423 //sys Chroot(path string) (err error) |
396 //sys Chroot(path string) (err error) |
|
397 //sys ClockGettime(clockid int32, time *Timespec) (err error) |
424 //sys Close(fd int) (err error) |
398 //sys Close(fd int) (err error) |
425 //sys Dup(fd int) (nfd int, err error) |
399 //sys Dup(fd int) (nfd int, err error) |
426 //sys Dup2(from int, to int) (err error) |
400 //sys Dup2(from int, to int) (err error) |
427 //sys Exchangedata(path1 string, path2 string, options int) (err error) |
401 //sys Exchangedata(path1 string, path2 string, options int) (err error) |
428 //sys Exit(code int) |
402 //sys Exit(code int) |
433 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
407 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
434 //sys Fchown(fd int, uid int, gid int) (err error) |
408 //sys Fchown(fd int, uid int, gid int) (err error) |
435 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
409 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
436 //sys Flock(fd int, how int) (err error) |
410 //sys Flock(fd int, how int) (err error) |
437 //sys Fpathconf(fd int, name int) (val int, err error) |
411 //sys Fpathconf(fd int, name int) (val int, err error) |
438 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 |
|
439 //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 |
|
440 //sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 |
|
441 //sys Fsync(fd int) (err error) |
412 //sys Fsync(fd int) (err error) |
442 //sys Ftruncate(fd int, length int64) (err error) |
413 //sys Ftruncate(fd int, length int64) (err error) |
443 //sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 |
|
444 //sys Getdtablesize() (size int) |
414 //sys Getdtablesize() (size int) |
445 //sysnb Getegid() (egid int) |
415 //sysnb Getegid() (egid int) |
446 //sysnb Geteuid() (uid int) |
416 //sysnb Geteuid() (uid int) |
447 //sysnb Getgid() (gid int) |
417 //sysnb Getgid() (gid int) |
448 //sysnb Getpgid(pid int) (pgid int, err error) |
418 //sysnb Getpgid(pid int) (pgid int, err error) |
458 //sys Kqueue() (fd int, err error) |
428 //sys Kqueue() (fd int, err error) |
459 //sys Lchown(path string, uid int, gid int) (err error) |
429 //sys Lchown(path string, uid int, gid int) (err error) |
460 //sys Link(path string, link string) (err error) |
430 //sys Link(path string, link string) (err error) |
461 //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) |
431 //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) |
462 //sys Listen(s int, backlog int) (err error) |
432 //sys Listen(s int, backlog int) (err error) |
463 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 |
|
464 //sys Mkdir(path string, mode uint32) (err error) |
433 //sys Mkdir(path string, mode uint32) (err error) |
465 //sys Mkdirat(dirfd int, path string, mode uint32) (err error) |
434 //sys Mkdirat(dirfd int, path string, mode uint32) (err error) |
466 //sys Mkfifo(path string, mode uint32) (err error) |
435 //sys Mkfifo(path string, mode uint32) (err error) |
467 //sys Mknod(path string, mode uint32, dev int) (err error) |
436 //sys Mknod(path string, mode uint32, dev int) (err error) |
468 //sys Open(path string, mode int, perm uint32) (fd int, err error) |
437 //sys Open(path string, mode int, perm uint32) (fd int, err error) |
476 //sys Rename(from string, to string) (err error) |
445 //sys Rename(from string, to string) (err error) |
477 //sys Renameat(fromfd int, from string, tofd int, to string) (err error) |
446 //sys Renameat(fromfd int, from string, tofd int, to string) (err error) |
478 //sys Revoke(path string) (err error) |
447 //sys Revoke(path string) (err error) |
479 //sys Rmdir(path string) (err error) |
448 //sys Rmdir(path string) (err error) |
480 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK |
449 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK |
481 //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) |
450 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
482 //sys Setegid(egid int) (err error) |
451 //sys Setegid(egid int) (err error) |
483 //sysnb Seteuid(euid int) (err error) |
452 //sysnb Seteuid(euid int) (err error) |
484 //sysnb Setgid(gid int) (err error) |
453 //sysnb Setgid(gid int) (err error) |
485 //sys Setlogin(name string) (err error) |
454 //sys Setlogin(name string) (err error) |
486 //sysnb Setpgid(pid int, pgid int) (err error) |
455 //sysnb Setpgid(pid int, pgid int) (err error) |
490 //sysnb Setreuid(ruid int, euid int) (err error) |
459 //sysnb Setreuid(ruid int, euid int) (err error) |
491 //sysnb Setrlimit(which int, lim *Rlimit) (err error) |
460 //sysnb Setrlimit(which int, lim *Rlimit) (err error) |
492 //sysnb Setsid() (pid int, err error) |
461 //sysnb Setsid() (pid int, err error) |
493 //sysnb Settimeofday(tp *Timeval) (err error) |
462 //sysnb Settimeofday(tp *Timeval) (err error) |
494 //sysnb Setuid(uid int) (err error) |
463 //sysnb Setuid(uid int) (err error) |
495 //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 |
|
496 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 |
|
497 //sys Symlink(path string, link string) (err error) |
464 //sys Symlink(path string, link string) (err error) |
498 //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) |
465 //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) |
499 //sys Sync() (err error) |
466 //sys Sync() (err error) |
500 //sys Truncate(path string, length int64) (err error) |
467 //sys Truncate(path string, length int64) (err error) |
501 //sys Umask(newmask int) (oldmask int) |
468 //sys Umask(newmask int) (oldmask int) |