I'm not asking for help. I'm suggesting a change to the man page. This code performs the tasks performed in the existing examples better. The code on the man page fails if you perform it a second time. This code works when you do it twice. So if you use this code with one process sittting on a port, listening for socket connections and it sends those file descriptors to multiple processes, my examples will work and the existing one won't.
On Fri, Mar 31, 2017 at 11:07 AM Otto Moerbeek <[email protected]> wrote: On Fri, Mar 31, 2017 at 07:45:31AM +0000, Luke Small wrote: > I found the code from > http://www.techdeviancy.com/uds.html, but there are many references to code > like this on google with the line: > "message_buffer[0] = 'F';". > > I made an amalgamation of that code and the EXAMPLE section of CMSG_DATA(3): > > EXAMPLES > The following example constructs a control message containing a file > descriptor and passes it over a socket: > > struct msghdr msg; > struct iovec io_vector[1]; > struct cmsghdr *cmsg; > char message_buffer[1]; > char ancillary_buffer[CMSG_SPACE(sizeof(int))]; > > /* > * at least one vector of one byte must be > * sent or successive reads will fail. > */ > message_buffer[0] = 'F'; > io_vector[0].iov_base = message_buffer; > io_vector[0].iov_len = 1; > > memset(&msg, 0, sizeof(struct msghdr)); > msg.msg_iov = io_vector; > msg.msg_iovlen = 1; > memset(ancillary_buffer, 0, CMSG_SPACE(sizeof(int))); > msg.msg_control = ancillary_buffer; > msg.msg_controllen = CMSG_SPACE(sizeof(int)); > > cmsg = CMSG_FIRSTHDR(&msg); > cmsg->cmsg_level = SOL_SOCKET; > cmsg->cmsg_type = SCM_RIGHTS; > cmsg->cmsg_len = CMSG_LEN(sizeof(int)); > *((int *) CMSG_DATA(cmsg)) = fd; > > if (sendmsg(socket, &msg, 0) == -1) > err(1, "sendmsg"); > > And an example that receives and decomposes the control message: > > struct msghdr msg; > struct cmsghdr *cmsg; > struct iovec io_vector[1]; > char message_buffer[1]; > char ancillary_buffer[CMSG_SPACE(sizeof(int))]; > > memset(&msg, 0, sizeof(struct msghdr)); > memset(ancillary_buffer, 0, CMSG_SPACE(sizeof(int))); > io_vector[0].iov_base = message_buffer; > io_vector[0].iov_len = 1; > msg.msg_iov = io_vector; > msg.msg_iovlen = 1; > msg.msg_control = ancillary_buffer; > msg.msg_controllen = CMSG_SPACE(sizeof(int)); > > if (recvmsg(socket, &msg, 0) == -1) > err(1, "recvmsg"); > if (message_buffer[0] != 'F') > errx(1, "corrupted message"); > if ((msg.msg_flags & MSG_TRUNC) || (msg.msg_flags & MSG_CTRUNC)) > errx(1, "control message truncated"); > for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; > cmsg = CMSG_NXTHDR(&msg, cmsg)) { > if (cmsg->cmsg_len == CMSG_LEN(sizeof(int)) && > cmsg->cmsg_level == SOL_SOCKET && > cmsg->cmsg_type == SCM_RIGHTS) { > fd = *((int *) CMSG_DATA(cmsg)); > /* Do something with the descriptor. */ > } > } > > > > > On Fri, Mar 31, 2017 at 12:03 AM Theo de Raadt <[email protected]> wrote: > > > This is not a "i want help" group. > > > > If you have a diff, you can try submitting it. > > > > If you don't, your questions come off very false. > > If you want help, this is not the right mailing list. This list is for bug reports. And if you send stuff to anoyther mailing list show real, complete example code demonstrating your problem, including a description of expected and observed behaviour. -Otto
