2 #include <sys/socket.h>
14 #define TEST_FILENAME "/tmp/passdesc"
16 static int test_buflen
;
17 static void *test_buf
;
20 test_send_desc(int s
, int fd
)
26 uint8_t data
[CMSG_SPACE(sizeof(int))];
31 iov
.iov_base
= test_buf
;
32 iov
.iov_len
= test_buflen
;
34 memset(&msg
, 0, sizeof(msg
));
37 msg
.msg_control
= ctrl
.data
;
38 msg
.msg_controllen
= sizeof(ctrl
.data
);
40 memset(&ctrl
, 0, sizeof(ctrl
));
41 cm
= CMSG_FIRSTHDR(&msg
);
42 cm
->cmsg_len
= CMSG_LEN(sizeof(int));
43 cm
->cmsg_level
= SOL_SOCKET
;
44 cm
->cmsg_type
= SCM_RIGHTS
;
45 *((int *)CMSG_DATA(cm
)) = fd
;
47 n
= sendmsg(s
, &msg
, 0);
49 err(1, "sendmsg failed");
50 else if (n
!= test_buflen
)
51 errx(1, "sendmsg sent %d", n
);
62 uint8_t data
[CMSG_SPACE(sizeof(int))];
68 iov
.iov_base
= test_buf
;
69 iov
.iov_len
= test_buflen
;
71 memset(&msg
, 0, sizeof(msg
));
74 msg
.msg_control
= ctrl
.data
;
75 msg
.msg_controllen
= sizeof(ctrl
.data
);
77 n
= recvmsg(s
, &msg
, MSG_WAITALL
);
79 err(1, "recvmsg failed");
80 else if (n
!= test_buflen
)
81 errx(1, "recvmsg received %d", n
);
83 cm
= CMSG_FIRSTHDR(&msg
);
86 if (cm
->cmsg_len
!= CMSG_LEN(sizeof(int)))
87 errx(1, "cmsg len mismatch");
88 if (cm
->cmsg_level
!= SOL_SOCKET
)
89 errx(1, "cmsg level mismatch");
90 if (cm
->cmsg_type
!= SCM_RIGHTS
)
91 errx(1, "cmsg type mismatch");
93 fd
= *((int *)CMSG_DATA(cm
));
95 n
= read(fd
, data
, sizeof(data
) - 1);
97 err(1, "read failed");
100 fprintf(stderr
, "fd content: %s\n", data
);
104 usage(const char *cmd
)
106 fprintf(stderr
, "%s [-d] [-s] [-p payload_len]\n", cmd
);
111 main(int argc
, char *argv
[])
113 int s
[2], fd
, status
, n
, discard
, skipfd
;
119 while ((opt
= getopt(argc
, argv
, "dp:s")) != -1) {
126 test_buflen
= strtoul(optarg
, NULL
, 10);
138 if (test_buflen
<= 0)
139 test_buflen
= sizeof(int);
140 test_buf
= malloc(test_buflen
);
141 if (test_buf
== NULL
)
142 err(1, "malloc %d failed", test_buflen
);
144 if (socketpair(AF_LOCAL
, SOCK_STREAM
, 0, s
) < 0)
145 err(1, "socketpair(LOCAL, STREAM) failed");
149 if (!discard
&& !skipfd
) {
150 test_recv_desc(s
[1]);
154 fprintf(stderr
, "skipfd\n");
155 n
= read(s
[1], &buf
, sizeof(buf
));
157 err(1, "read failed");
159 fprintf(stderr
, "discard msg\n");
166 fd
= open(TEST_FILENAME
, O_RDWR
| O_TRUNC
| O_CREAT
,
167 S_IWUSR
| S_IRUSR
| S_IRGRP
| S_IROTH
);
169 err(1, "open " TEST_FILENAME
" failed");
171 n
= write(fd
, TEST_FILENAME
, strlen(TEST_FILENAME
));
173 err(1, "write failed");
174 else if (n
!= strlen(TEST_FILENAME
))
175 errx(1, "write %d", n
);
177 ofs
= lseek(fd
, 0, SEEK_SET
);
179 err(1, "lseek failed");
181 errx(1, "lseek offset %jd", (intmax_t)ofs
);
183 test_send_desc(s
[0], fd
);