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.
13 #include "qemu/osdep.h"
14 #include <sys/socket.h>
17 /* #define SOCKET_SCM_DEBUG */
20 * @fd and @fd_to_send will not be checked for validation in this function,
21 * a blank will be sent as iov data to notify qemu.
23 static int send_fd(int fd
, int fd_to_send
)
28 char control
[CMSG_SPACE(sizeof(int))];
31 memset(&msg
, 0, sizeof(msg
));
32 memset(control
, 0, sizeof(control
));
34 /* Send a blank to notify qemu */
35 iov
[0].iov_base
= (void *)" ";
41 msg
.msg_control
= control
;
42 msg
.msg_controllen
= sizeof(control
);
44 cmsg
= CMSG_FIRSTHDR(&msg
);
46 cmsg
->cmsg_len
= CMSG_LEN(sizeof(int));
47 cmsg
->cmsg_level
= SOL_SOCKET
;
48 cmsg
->cmsg_type
= SCM_RIGHTS
;
49 memcpy(CMSG_DATA(cmsg
), &fd_to_send
, sizeof(int));
52 ret
= sendmsg(fd
, &msg
, 0);
53 } while (ret
< 0 && errno
== EINTR
);
56 fprintf(stderr
, "Failed to send msg, reason: %s\n", strerror(errno
));
62 /* Convert string to fd number. */
63 static int get_fd_num(const char *fd_str
)
69 sock
= strtol(fd_str
, &err
, 10);
71 fprintf(stderr
, "Failed in strtol for socket fd, reason: %s\n",
75 if (!*fd_str
|| *err
|| sock
< 0) {
76 fprintf(stderr
, "bad numerical value for socket fd '%s'\n", fd_str
);
84 * To make things simple, the caller needs to specify:
86 * 2. path of the file to be sent.
88 int main(int argc
, char **argv
, char **envp
)
92 #ifdef SOCKET_SCM_DEBUG
94 for (i
= 0; i
< argc
; i
++) {
95 fprintf(stderr
, "Parameter %d: %s\n", i
, argv
[i
]);
101 "Usage: %s < socket-fd > < file-path >\n",
107 sock
= get_fd_num(argv
[1]);
112 /* Now only open a file in readonly mode for test purpose. If more precise
113 control is needed, use python script in file operation, which is
114 supposed to fork and exec this program. */
115 fd
= open(argv
[2], O_RDONLY
);
117 fprintf(stderr
, "Failed to open file '%s'\n", argv
[2]);
121 ret
= send_fd(sock
, fd
);