docs: fix memory traces command
[vpp.git] / extras / gomemif / memif / control_channel_unsafe.go
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2020 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17
18 package memif
19
20 import (
21         "fmt"
22         "os"
23         "syscall"
24         "unsafe"
25 )
26
27 // sendMsg sends a control message from contorl channels message queue
28 func (cc *controlChannel) sendMsg() (err error) {
29         if len(cc.msgQueue) < 1 {
30                 return nil
31         }
32         // Get message buffer
33         msg := cc.msgQueue[0]
34         // Dequeue
35         cc.msgQueue = cc.msgQueue[1:]
36
37         iov := &syscall.Iovec{
38                 Base: &msg.Buffer.Bytes()[0],
39                 Len:  msgSize,
40         }
41
42         msgh := syscall.Msghdr{
43                 Iov:    iov,
44                 Iovlen: 1,
45         }
46
47         if msg.Fd > 0 {
48                 oob := syscall.UnixRights(msg.Fd)
49                 msgh.Control = &oob[0]
50                 msgh.Controllen = uint64(syscall.CmsgSpace(4))
51         }
52
53         _, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, uintptr(cc.event.Fd), uintptr(unsafe.Pointer(&msgh)), uintptr(0))
54         if errno != 0 {
55                 err = os.NewSyscallError("sendmsg", errno)
56                 return fmt.Errorf("SYS_SENDMSG: %s", errno)
57         }
58
59         return nil
60 }