static void do_test(int lfd, struct sockaddr_in *conn_addr, int closeonexec_flag, int nonblock_flag) { int connfd, acceptfd; int fdf, flf, fdf_pass, flf_pass; struct sockaddr_in claddr; socklen_t addrlen; #ifdef DEBUG tst_resm(TINFO, "=======================================\n"); #endif connfd = socket(AF_INET, SOCK_STREAM, 0); if (connfd == -1) die("Socket Error"); if (connect(connfd, (struct sockaddr *)conn_addr, sizeof(struct sockaddr_in)) == -1) die("Connect Error"); addrlen = sizeof(struct sockaddr_in); #if !(__GLIBC_PREREQ(2,10)) acceptfd = accept4_01(lfd, (struct sockaddr *)&claddr, &addrlen, closeonexec_flag | nonblock_flag); #else acceptfd = accept4(lfd, (struct sockaddr *)&claddr, &addrlen, closeonexec_flag | nonblock_flag); #endif if (acceptfd == -1) { tst_resm(TCONF, "syscall __NR_accept4 not supported on your arch"); } fdf = fcntl(acceptfd, F_GETFD); if (fdf == -1) die("fcntl:F_GETFD"); fdf_pass = ((fdf & FD_CLOEXEC) != 0) == ((closeonexec_flag & SOCK_CLOEXEC) != 0); #ifdef DEBUG tst_resm(TINFO, "Close-on-exec flag is %sset (%s); ", (fdf & FD_CLOEXEC) ? "" : "not ", fdf_pass ? "OK" : "failed"); #endif if (!fdf_pass) tst_resm(TFAIL, "Close-on-exec flag mismatch, should be %x, actual %x", fdf & FD_CLOEXEC, closeonexec_flag & SOCK_CLOEXEC); flf = fcntl(acceptfd, F_GETFL); if (flf == -1) die("fcntl:F_GETFD"); flf_pass = ((flf & O_NONBLOCK) != 0) == ((nonblock_flag & SOCK_NONBLOCK) != 0); #ifdef DEBUG tst_resm(TINFO, "nonblock flag is %sset (%s)\n", (flf & O_NONBLOCK) ? "" : "not ", flf_pass ? "OK" : "failed"); #endif if (!flf_pass) tst_resm(TFAIL, "nonblock flag mismatch, should be %x, actual %x", fdf & O_NONBLOCK, nonblock_flag & SOCK_NONBLOCK); close(acceptfd); close(connfd); if (fdf_pass && flf_pass) tst_resm(TPASS, "Test passed"); }
static void do_test(int lfd, struct sockaddr_in *conn_addr, int closeonexec_flag, int nonblock_flag) { int connfd, acceptfd; int fdf, flf, fdf_pass, flf_pass; struct sockaddr_in claddr; socklen_t addrlen; #ifdef DEBUG tst_resm(TINFO, "=======================================\n"); #endif connfd = socket(AF_INET, SOCK_STREAM, 0); if (connfd == -1) die("Socket Error"); if (connect(connfd, (struct sockaddr *)conn_addr, sizeof(struct sockaddr_in)) == -1) die("Connect Error"); addrlen = sizeof(struct sockaddr_in); s2e_enable_forking(); s2e_make_symbolic(claddr, sizeof(struct sockaddr), "calddr"); s2e_make_symbolic(&addrlen, sizeof(struct sockaddr_in), "addrlen"); #if !(__GLIBC_PREREQ(2, 10)) acceptfd = accept4_01(lfd, (struct sockaddr *)&claddr, &addrlen, closeonexec_flag | nonblock_flag); #else acceptfd = accept4(lfd, (struct sockaddr *)&claddr, &addrlen, closeonexec_flag | nonblock_flag); #endif s2e_disable_forking(); s2e_kill_state(0, "program done!"); if (acceptfd == -1) { if (errno == ENOSYS) { tst_brkm(TCONF, cleanup, "syscall __NR_accept4 not supported"); } else { tst_brkm(TBROK | TERRNO, cleanup, "accept4 failed"); } } fdf = fcntl(acceptfd, F_GETFD); if (fdf == -1) die("fcntl:F_GETFD"); fdf_pass = ((fdf & FD_CLOEXEC) != 0) == ((closeonexec_flag & SOCK_CLOEXEC) != 0); #ifdef DEBUG tst_resm(TINFO, "Close-on-exec flag is %sset (%s); ", (fdf & FD_CLOEXEC) ? "" : "not ", fdf_pass ? "OK" : "failed"); #endif if (!fdf_pass) tst_resm(TFAIL, "Close-on-exec flag mismatch, should be %x, actual %x", fdf & FD_CLOEXEC, closeonexec_flag & SOCK_CLOEXEC); flf = fcntl(acceptfd, F_GETFL); if (flf == -1) die("fcntl:F_GETFD"); flf_pass = ((flf & O_NONBLOCK) != 0) == ((nonblock_flag & SOCK_NONBLOCK) != 0); #ifdef DEBUG tst_resm(TINFO, "nonblock flag is %sset (%s)\n", (flf & O_NONBLOCK) ? "" : "not ", flf_pass ? "OK" : "failed"); #endif if (!flf_pass) tst_resm(TFAIL, "nonblock flag mismatch, should be %x, actual %x", fdf & O_NONBLOCK, nonblock_flag & SOCK_NONBLOCK); close(acceptfd); close(connfd); if (fdf_pass && flf_pass) tst_resm(TPASS, "Test passed"); }