2 * SCM_RIGHTS with unix socket help program for test
4 * Copyright IBM, Inc. 2013
7 * Wenchao Xia <xiawenc@linux.vnet.ibm.com>
9 * This work is licensed under the terms of the GNU LGPL, version 2 or later.
10 * See the COPYING.LIB file in the top-level directory.
15 #include <sys/socket.h>
18 #include <sys/types.h>
23 /* #define SOCKET_SCM_DEBUG */
26 * @fd and @fd_to_send will not be checked for validation in this function,
27 * a blank will be sent as iov data to notify qemu.
29 static int send_fd(int fd
, int fd_to_send
)
34 char control
[CMSG_SPACE(sizeof(int))];
37 memset(&msg
, 0, sizeof(msg
));
38 memset(control
, 0, sizeof(control
));
40 /* Send a blank to notify qemu */
41 iov
[0].iov_base
= (void *)" ";
47 msg
.msg_control
= control
;
48 msg
.msg_controllen
= sizeof(control
);
50 cmsg
= CMSG_FIRSTHDR(&msg
);
52 cmsg
->cmsg_len
= CMSG_LEN(sizeof(int));
53 cmsg
->cmsg_level
= SOL_SOCKET
;
54 cmsg
->cmsg_type
= SCM_RIGHTS
;
55 memcpy(CMSG_DATA(cmsg
), &fd_to_send
, sizeof(int));
58 ret
= sendmsg(fd
, &msg
, 0);
59 } while (ret
< 0 && errno
== EINTR
);
62 fprintf(stderr
, "Failed to send msg, reason: %s\n", strerror(errno
));
68 /* Convert string to fd number. */
69 static int get_fd_num(const char *fd_str
)
75 sock
= strtol(fd_str
, &err
, 10);
77 fprintf(stderr
, "Failed in strtol for socket fd, reason: %s\n",
81 if (!*fd_str
|| *err
|| sock
< 0) {
82 fprintf(stderr
, "bad numerical value for socket fd '%s'\n", fd_str
);
90 * To make things simple, the caller needs to specify:
92 * 2. path of the file to be sent.
94 int main(int argc
, char **argv
, char **envp
)
98 #ifdef SOCKET_SCM_DEBUG
100 for (i
= 0; i
< argc
; i
++) {
101 fprintf(stderr
, "Parameter %d: %s\n", i
, argv
[i
]);
107 "Usage: %s < socket-fd > < file-path >\n",
113 sock
= get_fd_num(argv
[1]);
118 /* Now only open a file in readonly mode for test purpose. If more precise
119 control is needed, use python script in file operation, which is
120 supposed to fork and exec this program. */
121 fd
= open(argv
[2], O_RDONLY
);
123 fprintf(stderr
, "Failed to open file '%s'\n", argv
[2]);
127 ret
= send_fd(sock
, fd
);