mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-21 01:06:58 +00:00
To include dgram bound && connected sockets, for example CR_FD_UNIXSK: /home/cyrill/crtools/unixsk-2813.img ---------------------------------------- fd 3 type 1 state 1 namelen 0 backlog 0 id 19505 peer 19506 fd 4 type 1 state 1 namelen 0 backlog 0 id 19506 peer 19505 fd 5 type 2 state 7 namelen 0 backlog 0 id 19507 peer 0 fd 6 type 2 state 7 namelen 18 backlog 18 id 19508 peer 0 --> test-socket-bound fd 7 type 2 state 7 namelen 0 backlog 0 id 19509 peer 19510 fd 8 type 2 state 7 namelen 17 backlog 17 id 19510 peer 0 --> test-socket-conn fd 9 type 2 state 7 namelen 23 backlog 23 id 19511 peer 19511 --> test-socket-bound-conn ---------------------------------------- The last one is bound and connected. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
151 lines
3.7 KiB
C
151 lines
3.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/wait.h>
|
|
#include <sys/un.h>
|
|
|
|
#define SK_NAME_BOUND "test-socket-bound"
|
|
#define SK_NAME_CONN "test-socket-conn"
|
|
#define SK_NAME_BOUND_CONN "test-socket-bound-conn"
|
|
|
|
#define SK_DATA_PAIR "data-packet-pair"
|
|
#define SK_DATA_BOUND "data-packet-bound"
|
|
#define SK_DATA_CONN "data-packet-conn"
|
|
#define SK_DATA_BOUND_CONN "data-packet-bound-conn"
|
|
|
|
int main(void)
|
|
{
|
|
struct sockaddr_un name_bound;
|
|
struct sockaddr_un name_conn;
|
|
struct sockaddr_un name_bound_conn;
|
|
int stream_sock[2];
|
|
int sk_dgram_bound_client;
|
|
int sk_dgram_bound_server;
|
|
int sk_dgram_conn_client;
|
|
int sk_dgram_conn_server;
|
|
int sk_dgram_bound_conn;
|
|
char buf[64];
|
|
int ret;
|
|
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, 0, stream_sock) == -1) {
|
|
perror("socketpair");
|
|
exit(1);
|
|
}
|
|
|
|
sk_dgram_bound_client = socket(AF_UNIX, SOCK_DGRAM, 0);
|
|
sk_dgram_bound_server = socket(AF_UNIX, SOCK_DGRAM, 0);
|
|
sk_dgram_conn_client = socket(AF_UNIX, SOCK_DGRAM, 0);
|
|
sk_dgram_conn_server = socket(AF_UNIX, SOCK_DGRAM, 0);
|
|
sk_dgram_bound_conn = socket(AF_UNIX, SOCK_DGRAM, 0);
|
|
|
|
if (sk_dgram_conn_server < 0 ||
|
|
sk_dgram_bound_server < 0 ||
|
|
sk_dgram_conn_client < 0 ||
|
|
sk_dgram_conn_server < 0 ||
|
|
sk_dgram_bound_conn < 0) {
|
|
perror("socket");
|
|
exit(1);
|
|
}
|
|
|
|
unlink(SK_NAME_BOUND);
|
|
unlink(SK_NAME_CONN);
|
|
unlink(SK_NAME_BOUND_CONN);
|
|
|
|
printf("sk_dgram_bound_client: %d\n"
|
|
"sk_dgram_bound_server: %d\n"
|
|
"sk_dgram_conn_client: %d\n"
|
|
"sk_dgram_conn_server: %d\n"
|
|
"sk_dgram_bound_conn: %d\n",
|
|
sk_dgram_bound_client,
|
|
sk_dgram_bound_server,
|
|
sk_dgram_conn_client,
|
|
sk_dgram_conn_server,
|
|
sk_dgram_bound_conn);
|
|
|
|
name_bound.sun_family = AF_UNIX;
|
|
strcpy(name_bound.sun_path, SK_NAME_BOUND);
|
|
|
|
name_conn.sun_family = AF_UNIX;
|
|
strcpy(name_conn.sun_path, SK_NAME_CONN);
|
|
|
|
name_bound_conn.sun_family = AF_UNIX;
|
|
strcpy(name_bound_conn.sun_path, SK_NAME_BOUND_CONN);
|
|
|
|
ret = bind(sk_dgram_bound_server, &name_bound, sizeof(name_bound));
|
|
if (ret) {
|
|
perror("bind");
|
|
exit(1);
|
|
}
|
|
|
|
ret = bind(sk_dgram_conn_server, &name_conn, sizeof(name_conn));
|
|
if (ret) {
|
|
perror("bind");
|
|
exit(1);
|
|
}
|
|
|
|
ret = bind(sk_dgram_bound_conn, &name_bound_conn, sizeof(name_bound_conn));
|
|
if (ret) {
|
|
perror("bind");
|
|
exit(1);
|
|
}
|
|
|
|
ret = connect(sk_dgram_conn_client, &name_conn, sizeof(name_conn));
|
|
if (ret) {
|
|
perror("connect");
|
|
exit(1);
|
|
}
|
|
|
|
ret = connect(sk_dgram_bound_conn, &name_bound_conn, sizeof(name_bound_conn));
|
|
if (ret) {
|
|
perror("connect");
|
|
exit(1);
|
|
}
|
|
|
|
/* first packets */
|
|
|
|
write(stream_sock[0], SK_DATA_PAIR, sizeof(SK_DATA_PAIR));
|
|
|
|
sendto(sk_dgram_bound_client, SK_DATA_BOUND, sizeof(SK_DATA_BOUND), 0,
|
|
&name_bound, sizeof(name_bound));
|
|
|
|
write(sk_dgram_conn_client, SK_DATA_CONN, sizeof(SK_DATA_CONN));
|
|
|
|
write(sk_dgram_bound_conn, SK_DATA_BOUND_CONN, sizeof(SK_DATA_BOUND_CONN));
|
|
|
|
while (1) {
|
|
|
|
read(stream_sock[1], &buf, sizeof(buf));
|
|
printf("stream : '%s'\n", buf);
|
|
|
|
read(sk_dgram_bound_server, &buf, sizeof(buf));
|
|
printf("dgram-bound : '%s'\n", buf);
|
|
|
|
read(sk_dgram_conn_server, &buf, sizeof(buf));
|
|
printf("dgram-conn : '%s'\n", buf);
|
|
|
|
read(sk_dgram_bound_conn, &buf, sizeof(buf));
|
|
printf("dgram-bound-conn : '%s'\n", buf);
|
|
|
|
/*
|
|
* checkpoint should be done here,
|
|
* we don't support queued data yet.
|
|
*/
|
|
printf("pause\n");
|
|
sleep(10);
|
|
|
|
write(stream_sock[0], SK_DATA_PAIR, sizeof(SK_DATA_PAIR));
|
|
|
|
sendto(sk_dgram_bound_client, SK_DATA_BOUND, sizeof(SK_DATA_BOUND), 0,
|
|
&name_bound, sizeof(name_bound));
|
|
|
|
write(sk_dgram_conn_client, SK_DATA_CONN, sizeof(SK_DATA_CONN));
|
|
|
|
write(sk_dgram_bound_conn, SK_DATA_BOUND_CONN, sizeof(SK_DATA_BOUND_CONN));
|
|
}
|
|
|
|
return 0;
|
|
}
|