88 lines
1.8 KiB
C
88 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (c) Ulrich Drepper <drepper@redhat.com>
|
|
* Copyright (c) International Business Machines Corp., 2009
|
|
*/
|
|
|
|
/*
|
|
* Test Name: socketpair02
|
|
*
|
|
* Description:
|
|
* This Program tests the new flag SOCK_CLOEXEC and SOCK_NONBLOCK introduced
|
|
* in socketpair() in kernel 2.6.27.
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <netinet/in.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/syscall.h>
|
|
#include "lapi/fcntl.h"
|
|
#include "tst_test.h"
|
|
|
|
static int fds[2];
|
|
|
|
static struct tcase {
|
|
int type;
|
|
int flag;
|
|
int fl_flag;
|
|
char *des;
|
|
} tcases[] = {
|
|
{SOCK_STREAM, 0, F_GETFD, "no close-on-exec"},
|
|
{SOCK_STREAM | SOCK_CLOEXEC, FD_CLOEXEC, F_GETFD, "close-on-exec"},
|
|
{SOCK_STREAM, 0, F_GETFL, "no non-blocking"},
|
|
{SOCK_STREAM | SOCK_NONBLOCK, O_NONBLOCK, F_GETFL, "non-blocking"}
|
|
};
|
|
|
|
static void verify_socketpair(unsigned int n)
|
|
{
|
|
int res, i;
|
|
struct tcase *tc = &tcases[n];
|
|
|
|
TEST(socketpair(PF_UNIX, tc->type, 0, fds));
|
|
|
|
if (TST_RET == -1)
|
|
tst_brk(TFAIL | TTERRNO, "socketpair() failed");
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
res = SAFE_FCNTL(fds[i], tc->fl_flag);
|
|
|
|
if (tc->flag != 0 && (res & tc->flag) == 0) {
|
|
tst_res(TFAIL, "socketpair() failed to set %s flag for fds[%d]",
|
|
tc->des, i);
|
|
goto ret;
|
|
}
|
|
|
|
if (tc->flag == 0 && (res & tc->flag) != 0) {
|
|
tst_res(TFAIL, "socketpair() failed to set %s flag for fds[%d]",
|
|
tc->des, i);
|
|
goto ret;
|
|
}
|
|
}
|
|
|
|
tst_res(TPASS, "socketpair() passed to set %s flag", tc->des);
|
|
|
|
ret:
|
|
SAFE_CLOSE(fds[0]);
|
|
SAFE_CLOSE(fds[1]);
|
|
}
|
|
|
|
static void cleanup(void)
|
|
{
|
|
if (fds[0] > 0)
|
|
SAFE_CLOSE(fds[0]);
|
|
|
|
if (fds[1] > 0)
|
|
SAFE_CLOSE(fds[1]);
|
|
}
|
|
|
|
static struct tst_test test = {
|
|
.tcnt = ARRAY_SIZE(tcases),
|
|
.test = verify_socketpair,
|
|
.min_kver = "2.6.27",
|
|
.cleanup = cleanup
|
|
};
|