MCPcopy Index your code
hub / github.com/F-Stack/f-stack / rtioctl

Function rtioctl

tools/compat/rtioctl.c:73–137  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

71}
72
73int
74rtioctl(char *data, unsigned len, unsigned read_len)
75{
76 struct ff_msg *msg, *retmsg = NULL;
77 unsigned maxlen;
78
79 msg = ff_ipc_msg_alloc();
80 if (msg == NULL) {
81 errno = ENOMEM;
82 return -1;
83 }
84
85 if (len > msg->buf_len) {
86 errno = EINVAL;
87 ff_ipc_msg_free(msg);
88 return -1;
89 }
90
91 if (read_len > msg->buf_len) {
92 read_len = msg->buf_len;
93 }
94
95 maxlen = read_len ? read_len : len;
96
97 msg->msg_type = FF_ROUTE;
98 msg->route.fib = rt_sofib;
99 msg->route.len = len;
100 msg->route.maxlen = maxlen;
101 msg->route.data = msg->buf_addr;
102 memcpy(msg->route.data, data, len);
103 msg->buf_addr += len;
104
105 int ret = ff_ipc_send(msg);
106 if (ret < 0) {
107 errno = EPIPE;
108 ff_ipc_msg_free(msg);
109 return -1;
110 }
111
112 do {
113 if (retmsg != NULL) {
114 ff_ipc_msg_free(retmsg);
115 }
116 ret = ff_ipc_recv(&retmsg, msg->msg_type);
117 if (ret < 0) {
118 errno = EPIPE;
119 return -1;
120 }
121 } while (msg != retmsg);
122
123 if (retmsg->result == 0) {
124 ret = retmsg->route.len;
125
126 if (!rt_shutdown_rd && read_len > 0) {
127 memcpy(data, retmsg->route.data, retmsg->route.len);
128 }
129 } else {
130 ret = -1;

Callers 3

rtmsgFunction · 0.85
route.cFile · 0.85
rtmsgFunction · 0.85

Calls 5

ff_ipc_msg_allocFunction · 0.85
ff_ipc_msg_freeFunction · 0.85
ff_ipc_sendFunction · 0.85
ff_ipc_recvFunction · 0.85
memcpyFunction · 0.50

Tested by

no test coverage detected