3 * Rob Zimmermann. All rights reserved.
5 * Keith Bostic. All rights reserved.
7 * See the LICENSE file for redistribution information.
12 #include <sys/types.h>
13 #include <sys/queue.h>
16 #include <bitstring.h>
26 #include "../common/common.h"
29 static int vi_send_
__P((IPVIWIN
*, int));
30 static int vi_send_1
__P((IPVIWIN
*, int, u_int32_t
));
31 static int vi_send_12
__P((IPVIWIN
*ipvi
, int code
, u_int32_t val1
, u_int32_t val2
));
32 static int vi_send_ab1
__P((IPVIWIN
*ipvi
, int code
,
33 const char *str1
, u_int32_t len1
,
34 const char *str2
, u_int32_t len2
, u_int32_t val
));
35 static int vi_send_a1
__P((IPVIWIN
*ipvi
, int code
, const char *str
, u_int32_t len
,
37 static int vi_send_a
__P((IPVIWIN
*ipvi
, int code
, const char *str
, u_int32_t len
));
41 static int vi_set_ops
__P((IPVIWIN
*, IPSIOPS
*));
42 static int vi_win_close
__P((IPVIWIN
*));
44 static int vi_close
__P((IPVI
*));
45 static int vi_new_window
__P((IPVI
*, IPVIWIN
**));
50 * PUBLIC: int vi_create __P((IPVI **, u_int32_t));
53 vi_create(ipvip
, flags
)
59 MALLOC_GOTO(NULL
, ipvi
, IPVI
*, sizeof(IPVI
));
60 memset(ipvi
, 0, sizeof(IPVI
));
65 ipvi
->new_window
= vi_new_window
;
66 ipvi
->close
= vi_close
;
77 vi_new_window (IPVI
*ipvi
, IPVIWIN
**ipviwinp
)
81 MALLOC_GOTO(NULL
, ipviwin
, IPVIWIN
*, sizeof(IPVIWIN
));
82 memset(ipviwin
, 0, sizeof(IPVIWIN
));
85 ipviwin
->ifd
= ipvi
->ifd
;
86 ipviwin
->ofd
= ipvi
->ofd
;
94 socketpair(AF_LOCAL
, SOCK_STREAM
, 0, sockets
);
99 mh
.msg_controllen
= sizeof(ch
);
100 mh
.msg_control
= (void *)&ch
;
103 iov
.iov_base
= &dummy
;
105 ch
.header
.cmsg_level
= SOL_SOCKET
;
106 ch
.header
.cmsg_type
= SCM_RIGHTS
;
107 ch
.header
.cmsg_len
= sizeof(ch
);
109 *(int *)CMSG_DATA(&ch
.header
) = sockets
[1];
110 sendmsg(ipvi
->ofd
, &mh
, 0);
111 *(int *)CMSG_DATA(&ch
.header
) = sockets
[1];
112 sendmsg(ipvi
->ofd
, &mh
, 0);
115 ipviwin
->ifd
= sockets
[0];
116 ipviwin
->ofd
= sockets
[0];
119 #define IPVISET(func) \
120 ipviwin->func = vi_##func;
140 ipviwin
->close
= vi_win_close
;
152 vi_set_ops(ipvi
, ops
)
160 static int vi_close(ipvi
)
163 memset(ipvi
, 6, sizeof(IPVI
));
168 static int vi_win_close(ipviwin
)
171 memset(ipviwin
, 6, sizeof(IPVIWIN
));
184 return vi_send(ipvi
->ofd
, NULL
, &ipb
);
188 vi_send_1(ipvi
, code
, val
)
196 return vi_send(ipvi
->ofd
, "1", &ipb
);
200 vi_send_12(IPVIWIN
*ipvi
, int code
, u_int32_t val1
, u_int32_t val2
)
207 return vi_send(ipvi
->ofd
, "12", &ipb
);
211 vi_send_a(IPVIWIN
*ipvi
, int code
, const char *str
, u_int32_t len
)
218 return vi_send(ipvi
->ofd
, "a", &ipb
);
222 vi_send_a1(IPVIWIN
*ipvi
, int code
, const char *str
, u_int32_t len
,
231 return vi_send(ipvi
->ofd
, "a1", &ipb
);
235 vi_send_ab1(IPVIWIN
*ipvi
, int code
, const char *str1
, u_int32_t len1
,
236 const char *str2
, u_int32_t len2
, u_int32_t val
)
246 return vi_send(ipvi
->ofd
, "ab1", &ipb
);