vendor/golang.org/x/sys/unix/syscall_aix.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
    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)
   521 	if len(p) != 2 {
   565 	if len(p) != 2 {
   522 		return EINVAL
   566 		return EINVAL
   523 	}
   567 	}
   524 	var pp [2]_C_int
   568 	var pp [2]_C_int
   525 	err = pipe(&pp)
   569 	err = pipe(&pp)
   526 	p[0] = int(pp[0])
   570 	if err == nil {
   527 	p[1] = int(pp[1])
   571 		p[0] = int(pp[0])
       
   572 		p[1] = int(pp[1])
       
   573 	}
   528 	return
   574 	return
   529 }
   575 }
   530 
   576 
   531 //sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
   577 //sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
   532 
   578 
   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 	}