github.com/nvi-inc/svipc@v0.1.0/syscall_linux_386.go (about)

     1  package svipc
     2  
     3  import (
     4  	"unsafe"
     5  
     6  	"golang.org/x/sys/unix"
     7  )
     8  
     9  const (
    10  	IPCOP_SEMOP      = 1
    11  	IPCOP_SEMGET     = 2
    12  	IPCOP_SEMCTL     = 3
    13  	IPCOP_SEMTIMEDOP = 4
    14  	IPCOP_MSGSND     = 11
    15  	IPCOP_MSGRCV     = 12
    16  	IPCOP_MSGGET     = 13
    17  	IPCOP_MSGCTL     = 14
    18  	IPCOP_SHMAT      = 21
    19  	IPCOP_SHMDT      = 22
    20  	IPCOP_SHMGET     = 23
    21  	IPCOP_SHMCTL     = 24
    22  
    23  	IPC_64 = 0x0100
    24  )
    25  
    26  //SEM
    27  
    28  func Semget(key IpcKey, nsems int, flags int) (id int, err error) {
    29  	ret, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SEMGET, uintptr(key), uintptr(nsems), uintptr(flags), 0, 0)
    30  	id = int(ret)
    31  	if errno != 0 {
    32  		err = errno
    33  	}
    34  	return
    35  }
    36  
    37  func Semop(id int, buf unsafe.Pointer, n int) (err error) {
    38  	_, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SEMOP, uintptr(id), uintptr(n), 0, uintptr(buf), 0)
    39  	if errno != 0 {
    40  		err = errno
    41  	}
    42  	return
    43  }
    44  
    45  func Semctl(id int, num int, cmd int) (n int, err error) {
    46  	var buf uintptr //currently unused
    47  	ret, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SEMCTL, uintptr(id), uintptr(num), uintptr(cmd|IPC_64), uintptr(unsafe.Pointer(&buf)), 0)
    48  	n = int(ret)
    49  	if errno != 0 {
    50  		err = errno
    51  	}
    52  	return
    53  }
    54  
    55  //SHM
    56  
    57  func Shmget(key IpcKey, size uintptr, flag int) (shmid uintptr, err error) {
    58  	shmid, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SHMGET, uintptr(key), size, uintptr(flag), 0, 0)
    59  	if errno != 0 {
    60  		err = errno
    61  	}
    62  	return
    63  }
    64  
    65  func Shmat(id uintptr, addr uintptr, flag int) (ptr unsafe.Pointer, err error) {
    66  	_, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SHMAT, id, uintptr(flag), uintptr(unsafe.Pointer(&addr)), addr, 0)
    67  	if errno != 0 {
    68  		err = errno
    69  	}
    70  	ptr = unsafe.Pointer(addr)
    71  	return
    72  }
    73  
    74  func Shmctl(id uintptr, cmd int, shmid *ShmId) (err error) {
    75  	ptr := uintptr(unsafe.Pointer(shmid))
    76  	_, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SHMCTL, id, uintptr(cmd|IPC_64), 0, ptr, 0)
    77  	if errno != 0 {
    78  		err = errno
    79  	}
    80  	return
    81  }
    82  
    83  func Shmdt(addr unsafe.Pointer) (err error) {
    84  	_, _, errno := unix.Syscall6(unix.SYS_IPC, IPCOP_SHMDT, 0, 0, 0, uintptr(addr), 0)
    85  	if errno != 0 {
    86  		err = errno
    87  	}
    88  	return
    89  }