mirror of https://github.com/hslam/msg.git
update methods
This commit is contained in:
parent
78fcef3823
commit
9f5420e081
|
@ -38,7 +38,7 @@ func main() {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer msg.Remove(msgid)
|
defer msg.Remove(msgid)
|
||||||
err = msg.Snd(msgid, 1, []byte("Hello World"), 0600)
|
err = msg.Send(msgid, 1, []byte("Hello World"), 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
text, err := msg.Rcv(msgid, 1, 0600)
|
text, err := msg.Receive(msgid, 1, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ func TestMsg(t *testing.T) {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer Remove(msgid)
|
defer Remove(msgid)
|
||||||
err = Snd(msgid, 1, []byte(context), 0600)
|
err = Send(msgid, 1, []byte(context), 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ func TestMsg(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
text, err := Rcv(msgid, 1, 0600)
|
text, err := Receive(msgid, 1, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
54
msg_unix.go
54
msg_unix.go
|
@ -54,13 +54,27 @@ func Get(key int, msgflg int) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Snd calls the msgsnd system call.
|
// Snd calls the msgsnd system call.
|
||||||
func Snd(msgid int, msgType uint, msgText []byte, flags int) error {
|
//
|
||||||
if len(msgText) > maxText {
|
// The msgsnd() and msgrcv() system calls are used to send messages to,
|
||||||
return ErrTooLong
|
// and receive messages from, a System V message queue. The calling
|
||||||
}
|
// process must have write permission on the message queue in order to
|
||||||
m := message{Type: msgType}
|
// send a message, and read permission to receive a message.
|
||||||
copy(m.Text[:], msgText)
|
// The msgp argument is a pointer to a caller-defined structure of the
|
||||||
_, _, err := syscall.Syscall6(syscall.SYS_MSGSND, uintptr(msgid), uintptr(unsafe.Pointer(&m)), uintptr(len(msgText)), uintptr(flags), 0, 0)
|
// following general form:
|
||||||
|
//
|
||||||
|
// struct msgbuf {
|
||||||
|
// long mtype; /* message type, must be > 0 */
|
||||||
|
// char mtext[1]; /* message data */
|
||||||
|
// };
|
||||||
|
// The mtext field is an array (or other structure) whose size is speci‐
|
||||||
|
// fied by msgsz, a nonnegative integer value. Messages of zero length
|
||||||
|
// (i.e., no mtext field) are permitted. The mtype field must have a
|
||||||
|
// strictly positive integer value. This value can be used by the re‐
|
||||||
|
// ceiving process for message selection (see the description of ms‐
|
||||||
|
// grcv() below).
|
||||||
|
//
|
||||||
|
func Snd(msgid int, msgp uintptr, msgsz int, msgflg int) error {
|
||||||
|
_, _, err := syscall.Syscall6(syscall.SYS_MSGSND, uintptr(msgid), uintptr(msgp), uintptr(msgsz), uintptr(msgflg), 0, 0)
|
||||||
if err != 0 {
|
if err != 0 {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -68,10 +82,30 @@ func Snd(msgid int, msgType uint, msgText []byte, flags int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rcv calls the msgrcv system call.
|
// Rcv calls the msgrcv system call.
|
||||||
func Rcv(msgid int, msgType uint, flags int) ([]byte, error) {
|
func Rcv(msgid int, msgp uintptr, msgsz int, msgtyp uint, msgflg int) (int, error) {
|
||||||
m := message{Type: msgType}
|
r1, _, err := syscall.Syscall6(syscall.SYS_MSGRCV, uintptr(msgid), msgp, uintptr(msgsz), uintptr(msgtyp), uintptr(msgflg), 0)
|
||||||
length, _, err := syscall.Syscall6(syscall.SYS_MSGRCV, uintptr(msgid), uintptr(unsafe.Pointer(&m)), maxText, uintptr(msgType), uintptr(flags), 0)
|
length := int(r1)
|
||||||
if err != 0 {
|
if err != 0 {
|
||||||
|
return length, err
|
||||||
|
}
|
||||||
|
return length, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send calls the msgsnd system call.
|
||||||
|
func Send(msgid int, msgType uint, msgText []byte, flags int) error {
|
||||||
|
if len(msgText) > maxText {
|
||||||
|
return ErrTooLong
|
||||||
|
}
|
||||||
|
m := message{Type: msgType}
|
||||||
|
copy(m.Text[:], msgText)
|
||||||
|
return Snd(msgid, uintptr(unsafe.Pointer(&m)), len(msgText), flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Receive calls the msgrcv system call.
|
||||||
|
func Receive(msgid int, msgType uint, flags int) ([]byte, error) {
|
||||||
|
m := message{Type: msgType}
|
||||||
|
length, err := Rcv(msgid, uintptr(unsafe.Pointer(&m)), maxText, msgType, flags)
|
||||||
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return m.Text[:length], nil
|
return m.Text[:length], nil
|
||||||
|
|
Loading…
Reference in New Issue