34 #include <sys/socket.h>
47 const char *myname =
"unix_recv_fd";
53 #ifdef CANT_USE_SEND_RECV_MSG
54 msg_warn(
"%s: your system has no support for file descriptor passing",
68 #if defined(CMSG_SPACE) && !defined(NO_MSGHDR_MSG_CONTROL)
70 struct cmsghdr just_for_alignment;
71 char control[CMSG_SPACE(
sizeof(newfd))];
73 struct cmsghdr *cmptr;
75 memset((
void *) &msg, 0,
sizeof(msg));
76 msg.msg_control = control_un.control;
78 msg.msg_controllen = CMSG_LEN(
sizeof(newfd));
80 msg.msg_controllen =
sizeof(control_un.control);
83 msg.msg_accrights = (
char *) &newfd;
84 msg.msg_accrightslen =
sizeof(newfd);
98 iov->iov_len =
sizeof(buf);
102 if (recvmsg(fd, &msg, 0) < 0)
105 #if defined(CMSG_SPACE) && !defined(NO_MSGHDR_MSG_CONTROL)
106 if ((cmptr = CMSG_FIRSTHDR(&msg)) != 0
107 && cmptr->cmsg_len == CMSG_LEN(
sizeof(newfd))) {
108 if (cmptr->cmsg_level != SOL_SOCKET)
109 msg_fatal(
"%s: control level %d != SOL_SOCKET",
110 myname, cmptr->cmsg_level);
111 if (cmptr->cmsg_type != SCM_RIGHTS)
112 msg_fatal(
"%s: control type %d != SCM_RIGHTS",
113 myname, cmptr->cmsg_type);
114 return (*(
int *) CMSG_DATA(cmptr));
118 if (msg.msg_accrightslen ==
sizeof(newfd))
138 int main(
int argc,
char **argv)
148 if (argc < 2 || argc > 3
149 || (endpoint =
split_at(transport = argv[1],
':')) == 0
150 || *endpoint == 0 || *transport == 0)
151 msg_fatal(
"usage: %s transport:endpoint [workaround]", argv[0]);
153 if (strcmp(transport,
"unix") == 0) {
156 msg_fatal(
"invalid transport name: %s", transport);
159 msg_fatal(
"listen %s:%s: %m", transport, endpoint);
161 client_sock = accept(listen_sock, (
struct sockaddr *) 0, (
SOCKADDR_SIZE) 0);
169 while ((read_count = read(client_fd, buf,
sizeof(buf))) > 0)
170 write(1, buf, read_count);
void set_unix_pass_fd_fix(const char *)
int main(int argc, char **argv)
void msg_warn(const char *fmt,...)
NORETURN msg_fatal(const char *fmt,...)
int unix_listen(const char *, int, int)
char * split_at(char *string, int delimiter)
#define UNIX_PASS_FD_FIX_CMSG_LEN
void msg_info(const char *fmt,...)