35 func Creat(path string, mode uint32) (fd int, err error) { |
35 func Creat(path string, mode uint32) (fd int, err error) { |
36 return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) |
36 return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) |
37 } |
37 } |
38 |
38 |
39 //sys utimes(path string, times *[2]Timeval) (err error) |
39 //sys utimes(path string, times *[2]Timeval) (err error) |
|
40 |
40 func Utimes(path string, tv []Timeval) error { |
41 func Utimes(path string, tv []Timeval) error { |
41 if len(tv) != 2 { |
42 if len(tv) != 2 { |
42 return EINVAL |
43 return EINVAL |
43 } |
44 } |
44 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) |
45 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) |
45 } |
46 } |
46 |
47 |
47 //sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) |
48 //sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) |
|
49 |
48 func UtimesNano(path string, ts []Timespec) error { |
50 func UtimesNano(path string, ts []Timespec) error { |
49 if len(ts) != 2 { |
51 if len(ts) != 2 { |
50 return EINVAL |
52 return EINVAL |
51 } |
53 } |
52 return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) |
54 return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) |
68 } |
70 } |
69 sa.raw.Family = AF_INET |
71 sa.raw.Family = AF_INET |
70 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
72 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
71 p[0] = byte(sa.Port >> 8) |
73 p[0] = byte(sa.Port >> 8) |
72 p[1] = byte(sa.Port) |
74 p[1] = byte(sa.Port) |
73 for i := 0; i < len(sa.Addr); i++ { |
75 sa.raw.Addr = sa.Addr |
74 sa.raw.Addr[i] = sa.Addr[i] |
|
75 } |
|
76 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil |
76 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil |
77 } |
77 } |
78 |
78 |
79 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { |
79 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { |
80 if sa.Port < 0 || sa.Port > 0xFFFF { |
80 if sa.Port < 0 || sa.Port > 0xFFFF { |
83 sa.raw.Family = AF_INET6 |
83 sa.raw.Family = AF_INET6 |
84 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
84 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
85 p[0] = byte(sa.Port >> 8) |
85 p[0] = byte(sa.Port >> 8) |
86 p[1] = byte(sa.Port) |
86 p[1] = byte(sa.Port) |
87 sa.raw.Scope_id = sa.ZoneId |
87 sa.raw.Scope_id = sa.ZoneId |
88 for i := 0; i < len(sa.Addr); i++ { |
88 sa.raw.Addr = sa.Addr |
89 sa.raw.Addr[i] = sa.Addr[i] |
|
90 } |
|
91 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil |
89 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil |
92 } |
90 } |
93 |
91 |
94 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { |
92 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { |
95 name := sa.Name |
93 name := sa.Name |
217 nfd = 0 |
215 nfd = 0 |
218 } |
216 } |
219 return |
217 return |
220 } |
218 } |
221 |
219 |
222 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { |
220 func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { |
223 // Recvmsg not implemented on AIX |
221 var msg Msghdr |
224 sa := new(SockaddrUnix) |
222 msg.Name = (*byte)(unsafe.Pointer(rsa)) |
225 return -1, -1, -1, sa, ENOSYS |
223 msg.Namelen = uint32(SizeofSockaddrAny) |
226 } |
224 var dummy byte |
227 |
225 if len(oob) > 0 { |
228 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { |
226 // receive at least one normal byte |
229 _, err = SendmsgN(fd, p, oob, to, flags) |
227 if emptyIovecs(iov) { |
|
228 var iova [1]Iovec |
|
229 iova[0].Base = &dummy |
|
230 iova[0].SetLen(1) |
|
231 iov = iova[:] |
|
232 } |
|
233 msg.Control = (*byte)(unsafe.Pointer(&oob[0])) |
|
234 msg.SetControllen(len(oob)) |
|
235 } |
|
236 if len(iov) > 0 { |
|
237 msg.Iov = &iov[0] |
|
238 msg.SetIovlen(len(iov)) |
|
239 } |
|
240 if n, err = recvmsg(fd, &msg, flags); n == -1 { |
|
241 return |
|
242 } |
|
243 oobn = int(msg.Controllen) |
|
244 recvflags = int(msg.Flags) |
230 return |
245 return |
231 } |
246 } |
232 |
247 |
233 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { |
248 func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { |
234 // SendmsgN not implemented on AIX |
249 var msg Msghdr |
235 return -1, ENOSYS |
250 msg.Name = (*byte)(unsafe.Pointer(ptr)) |
|
251 msg.Namelen = uint32(salen) |
|
252 var dummy byte |
|
253 var empty bool |
|
254 if len(oob) > 0 { |
|
255 // send at least one normal byte |
|
256 empty = emptyIovecs(iov) |
|
257 if empty { |
|
258 var iova [1]Iovec |
|
259 iova[0].Base = &dummy |
|
260 iova[0].SetLen(1) |
|
261 iov = iova[:] |
|
262 } |
|
263 msg.Control = (*byte)(unsafe.Pointer(&oob[0])) |
|
264 msg.SetControllen(len(oob)) |
|
265 } |
|
266 if len(iov) > 0 { |
|
267 msg.Iov = &iov[0] |
|
268 msg.SetIovlen(len(iov)) |
|
269 } |
|
270 if n, err = sendmsg(fd, &msg, flags); err != nil { |
|
271 return 0, err |
|
272 } |
|
273 if len(oob) > 0 && empty { |
|
274 n = 0 |
|
275 } |
|
276 return n, nil |
236 } |
277 } |
237 |
278 |
238 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { |
279 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { |
239 switch rsa.Addr.Family { |
280 switch rsa.Addr.Family { |
240 |
281 |
259 case AF_INET: |
300 case AF_INET: |
260 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
301 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
261 sa := new(SockaddrInet4) |
302 sa := new(SockaddrInet4) |
262 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
303 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
263 sa.Port = int(p[0])<<8 + int(p[1]) |
304 sa.Port = int(p[0])<<8 + int(p[1]) |
264 for i := 0; i < len(sa.Addr); i++ { |
305 sa.Addr = pp.Addr |
265 sa.Addr[i] = pp.Addr[i] |
|
266 } |
|
267 return sa, nil |
306 return sa, nil |
268 |
307 |
269 case AF_INET6: |
308 case AF_INET6: |
270 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) |
309 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) |
271 sa := new(SockaddrInet6) |
310 sa := new(SockaddrInet6) |
272 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
311 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
273 sa.Port = int(p[0])<<8 + int(p[1]) |
312 sa.Port = int(p[0])<<8 + int(p[1]) |
274 sa.ZoneId = pp.Scope_id |
313 sa.ZoneId = pp.Scope_id |
275 for i := 0; i < len(sa.Addr); i++ { |
314 sa.Addr = pp.Addr |
276 sa.Addr[i] = pp.Addr[i] |
|
277 } |
|
278 return sa, nil |
315 return sa, nil |
279 } |
316 } |
280 return nil, EAFNOSUPPORT |
317 return nil, EAFNOSUPPORT |
281 } |
318 } |
282 |
319 |
312 } |
349 } |
313 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true |
350 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true |
314 } |
351 } |
315 |
352 |
316 //sys getdirent(fd int, buf []byte) (n int, err error) |
353 //sys getdirent(fd int, buf []byte) (n int, err error) |
|
354 |
317 func Getdents(fd int, buf []byte) (n int, err error) { |
355 func Getdents(fd int, buf []byte) (n int, err error) { |
318 return getdirent(fd, buf) |
356 return getdirent(fd, buf) |
319 } |
357 } |
320 |
358 |
321 //sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) |
359 //sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) |
|
360 |
322 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { |
361 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { |
323 var status _C_int |
362 var status _C_int |
324 var r Pid_t |
363 var r Pid_t |
325 err = ERESTART |
364 err = ERESTART |
326 // AIX wait4 may return with ERESTART errno, while the processus is still |
365 // AIX wait4 may return with ERESTART errno, while the processus is still |
382 |
421 |
383 // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. |
422 // 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 |
423 //sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl |
385 |
424 |
386 //sys fcntl(fd int, cmd int, arg int) (val int, err error) |
425 //sys fcntl(fd int, cmd int, arg int) (val int, err error) |
|
426 |
|
427 //sys fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range |
|
428 |
|
429 func Fsync(fd int) error { |
|
430 return fsyncRange(fd, O_SYNC, 0, 0) |
|
431 } |
387 |
432 |
388 /* |
433 /* |
389 * Direct access |
434 * Direct access |
390 */ |
435 */ |
391 |
436 |
399 //sys Fchdir(fd int) (err error) |
444 //sys Fchdir(fd int) (err error) |
400 //sys Fchmod(fd int, mode uint32) (err error) |
445 //sys Fchmod(fd int, mode uint32) (err error) |
401 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
446 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
402 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
447 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
403 //sys Fdatasync(fd int) (err error) |
448 //sys Fdatasync(fd int) (err error) |
404 //sys Fsync(fd int) (err error) |
|
405 // readdir_r |
449 // readdir_r |
406 //sysnb Getpgid(pid int) (pgid int, err error) |
450 //sysnb Getpgid(pid int) (pgid int, err error) |
407 |
451 |
408 //sys Getpgrp() (pid int) |
452 //sys Getpgrp() (pid int) |
409 |
453 |
460 //sysnb Getuid() (uid int) |
504 //sysnb Getuid() (uid int) |
461 //sys Lchown(path string, uid int, gid int) (err error) |
505 //sys Lchown(path string, uid int, gid int) (err error) |
462 //sys Listen(s int, n int) (err error) |
506 //sys Listen(s int, n int) (err error) |
463 //sys lstat(path string, stat *Stat_t) (err error) |
507 //sys lstat(path string, stat *Stat_t) (err error) |
464 //sys Pause() (err error) |
508 //sys Pause() (err error) |
465 //sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 |
509 //sys pread(fd int, p []byte, offset int64) (n int, err error) = pread64 |
466 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 |
510 //sys pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 |
467 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
511 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
468 //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) |
512 //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) |
469 //sysnb Setregid(rgid int, egid int) (err error) |
513 //sysnb Setregid(rgid int, egid int) (err error) |
470 //sysnb Setreuid(ruid int, euid int) (err error) |
514 //sysnb Setreuid(ruid int, euid int) (err error) |
471 //sys Shutdown(fd int, how int) (err error) |
515 //sys Shutdown(fd int, how int) (err error) |
542 //sys Utime(path string, buf *Utimbuf) (err error) |
588 //sys Utime(path string, buf *Utimbuf) (err error) |
543 |
589 |
544 //sys Getsystemcfg(label int) (n uint64) |
590 //sys Getsystemcfg(label int) (n uint64) |
545 |
591 |
546 //sys umount(target string) (err error) |
592 //sys umount(target string) (err error) |
|
593 |
547 func Unmount(target string, flags int) (err error) { |
594 func Unmount(target string, flags int) (err error) { |
548 if flags != 0 { |
595 if flags != 0 { |
549 // AIX doesn't have any flags for umount. |
596 // AIX doesn't have any flags for umount. |
550 return ENOSYS |
597 return ENOSYS |
551 } |
598 } |