mirror of https://github.com/hslam/msg.git
update msg
This commit is contained in:
parent
ca5652f23c
commit
78fcef3823
|
@ -24,10 +24,10 @@ func TestMsg(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second * 2)
|
time.Sleep(time.Millisecond * 200)
|
||||||
close(done)
|
close(done)
|
||||||
}()
|
}()
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Millisecond * 100)
|
||||||
key, err := ftok.Ftok("/tmp", 0x22)
|
key, err := ftok.Ftok("/tmp", 0x22)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|
39
msg_unix.go
39
msg_unix.go
|
@ -11,10 +11,26 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// IPC_CREAT creates if key is nonexistent
|
// IPC_CREAT creates if key is nonexistent
|
||||||
IPC_CREAT = 00001000
|
IPC_CREAT = 01000
|
||||||
|
|
||||||
|
// IPC_EXCL fails if key exists.
|
||||||
|
IPC_EXCL = 02000
|
||||||
|
|
||||||
|
// IPC_NOWAIT returns error no wait.
|
||||||
|
IPC_NOWAIT = 04000
|
||||||
|
|
||||||
|
// IPC_PRIVATE is private key
|
||||||
|
IPC_PRIVATE = 00000
|
||||||
|
|
||||||
|
// SEM_UNDO sets up adjust on exit entry
|
||||||
|
SEM_UNDO = 010000
|
||||||
|
|
||||||
// IPC_RMID removes identifier
|
// IPC_RMID removes identifier
|
||||||
IPC_RMID = 0
|
IPC_RMID = 0
|
||||||
|
// IPC_SET sets ipc_perm options.
|
||||||
|
IPC_SET = 1
|
||||||
|
// IPC_STAT gets ipc_perm options.
|
||||||
|
IPC_STAT = 2
|
||||||
|
|
||||||
maxText = 8192
|
maxText = 8192
|
||||||
)
|
)
|
||||||
|
@ -28,22 +44,23 @@ type message struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get calls the msgget system call.
|
// Get calls the msgget system call.
|
||||||
func Get(key int, msgflg int) (uintptr, error) {
|
func Get(key int, msgflg int) (int, error) {
|
||||||
msgid, _, err := syscall.Syscall(syscall.SYS_MSGGET, uintptr(key), uintptr(msgflg), 0)
|
r1, _, err := syscall.Syscall(syscall.SYS_MSGGET, uintptr(key), uintptr(msgflg), 0)
|
||||||
if int(msgid) < 0 {
|
msgid := int(r1)
|
||||||
return 0, syscall.Errno(err)
|
if msgid < 0 {
|
||||||
|
return msgid, syscall.Errno(err)
|
||||||
}
|
}
|
||||||
return msgid, nil
|
return msgid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Snd calls the msgsnd system call.
|
// Snd calls the msgsnd system call.
|
||||||
func Snd(msgid uintptr, msgType uint, msgText []byte, flags uint) error {
|
func Snd(msgid int, msgType uint, msgText []byte, flags int) error {
|
||||||
if len(msgText) > maxText {
|
if len(msgText) > maxText {
|
||||||
return ErrTooLong
|
return ErrTooLong
|
||||||
}
|
}
|
||||||
m := message{Type: msgType}
|
m := message{Type: msgType}
|
||||||
copy(m.Text[:], msgText)
|
copy(m.Text[:], msgText)
|
||||||
_, _, err := syscall.Syscall6(syscall.SYS_MSGSND, msgid, uintptr(unsafe.Pointer(&m)), uintptr(len(msgText)), uintptr(flags), 0, 0)
|
_, _, err := syscall.Syscall6(syscall.SYS_MSGSND, uintptr(msgid), uintptr(unsafe.Pointer(&m)), uintptr(len(msgText)), uintptr(flags), 0, 0)
|
||||||
if err != 0 {
|
if err != 0 {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -51,9 +68,9 @@ func Snd(msgid uintptr, msgType uint, msgText []byte, flags uint) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rcv calls the msgrcv system call.
|
// Rcv calls the msgrcv system call.
|
||||||
func Rcv(msgid uintptr, msgType uint, flags uint) ([]byte, error) {
|
func Rcv(msgid int, msgType uint, flags int) ([]byte, error) {
|
||||||
m := message{Type: msgType}
|
m := message{Type: msgType}
|
||||||
length, _, err := syscall.Syscall6(syscall.SYS_MSGRCV, msgid, uintptr(unsafe.Pointer(&m)), maxText, uintptr(msgType), uintptr(flags), 0)
|
length, _, err := syscall.Syscall6(syscall.SYS_MSGRCV, uintptr(msgid), uintptr(unsafe.Pointer(&m)), maxText, uintptr(msgType), uintptr(flags), 0)
|
||||||
if err != 0 {
|
if err != 0 {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -61,8 +78,8 @@ func Rcv(msgid uintptr, msgType uint, flags uint) ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes the message queue with the given id.
|
// Remove removes the message queue with the given id.
|
||||||
func Remove(msgid uintptr) error {
|
func Remove(msgid int) error {
|
||||||
r1, _, errno := syscall.Syscall(syscall.SYS_MSGCTL, msgid, IPC_RMID, 0)
|
r1, _, errno := syscall.Syscall(syscall.SYS_MSGCTL, uintptr(msgid), IPC_RMID, 0)
|
||||||
if int(r1) < 0 {
|
if int(r1) < 0 {
|
||||||
return syscall.Errno(errno)
|
return syscall.Errno(errno)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue