END_TEST START_TEST(tc_connect_localunixdomain_dup) { pid_t childpid; char *sockname; sockname = tempnam(NULL, "ac"); switch (childpid = check_fork()) { case -1: fail("couldn't fork"); break; case 0: /* child / client */ tc_connect_lud_client(sockname); check_waitpid_and_exit(0); break; default: /* parent / server */ tc_connect_lud_serverdup(sockname); check_waitpid_and_exit(childpid); break; } if (access(sockname, F_OK) == 0) fail("unix domain test: socket not removed!"); }
END_TEST /* * This is the same test as tc_connect_localunixdomain, but "swap" * order of execution of server and client. In the past this happened * sporadically and triggered bug #279. */ START_TEST(tc_connect_localunixdomain_swapped) { pid_t childpid; char *sockname; sockname = tempnam(NULL, "ac"); switch (childpid = check_fork()) { case -1: fail("couldn't fork"); break; case 0: /* child / client */ sleep(2); tc_connect_lud_client(sockname); check_waitpid_and_exit(0); break; default: /* parent / server */ tc_connect_lud_server(sockname); check_waitpid_and_exit(childpid); break; } if (access(sockname, F_OK) == 0) fail("unix domain test: socket not removed!"); }
END_TEST START_TEST(test_fork2_pass) { pid_t pid; pid_t pid2; if((pid = check_fork()) < 0) { ck_abort_msg("Failed to fork new process"); } else if (pid > 0) { if((pid2 = check_fork()) < 0) { ck_abort_msg("Failed to fork new process"); } else if (pid2 == 0) { ck_assert_msg(1, NULL); check_waitpid_and_exit(0); } check_waitpid_and_exit(pid2); } check_waitpid_and_exit(pid); }
END_TEST START_TEST(test_fork2_fail) { pid_t pid; pid_t pid2; if((pid = check_fork()) < 0) { ck_abort_msg("Failed to fork new process"); } else if (pid > 0) { if((pid2 = check_fork()) < 0) { ck_abort_msg("Failed to fork new process"); } else if (pid2 == 0) { ck_abort_msg("Expected fail"); check_waitpid_and_exit(0); } check_waitpid_and_exit(pid2); ck_abort_msg("Expected fail"); } check_waitpid_and_exit(pid); }
END_TEST START_TEST(tc_connect_localip) { union { struct sockaddr_storage ss; struct sockaddr_in in; } sa; struct achat_channel *s = NULL; achat_rc rc = ACHAT_RC_ERROR; pid_t childpid; socklen_t sslen; s = acc_create(); fail_if(s == NULL, "couldn't create server channel"); fail_if(s->euid != (uid_t)-1, "euid expected -1 but is %i", s->euid); fail_if(s->egid != (gid_t)-1, "egid expected -1 but is %i", s->egid); rc = acc_settail(s, ACC_TAIL_SERVER); fail_if(rc != ACHAT_RC_OK, "server settail failed with rc=%d", rc); rc = acc_setsslmode(s, ACC_SSLMODE_CLEAR); fail_if(rc != ACHAT_RC_OK, "server setsslmode failed with rc=%d", rc); mark_point(); bzero(&sa.ss, sizeof(sa.ss)); sa.in.sin_family = AF_INET; sa.in.sin_port = 0; inet_aton("127.0.0.1", &(sa.in.sin_addr)); rc = acc_setaddr(s, &sa.ss, sizeof(struct sockaddr_in)); if (rc != ACHAT_RC_OK) fail("server setaddr failed with rc=%d", rc); mark_point(); rc = acc_prepare(s); fail_if(rc != ACHAT_RC_OK, "server prepare failed with rc=%d [%s]", rc, anoubis_strerror(errno)); mark_point(); bzero(&sa.ss, sizeof(sa.ss)); sslen = sizeof(sa.ss); if (getsockname(s->fd, (struct sockaddr *)&sa.ss, &sslen) == -1) fail("error while asking about server socket name [%s]", anoubis_strerror(errno)); fail_if(sa.in.sin_port == 0, "couldn't determine port of server socket"); mark_point(); switch (childpid = check_fork()) { case -1: fail("couldn't fork"); break; case 0: /* child / client */ tc_connect_lip_client(ntohs(sa.in.sin_port)); check_waitpid_and_exit(0); break; default: /* parent / server */ rc = acc_open(s); fail_if(rc != ACHAT_RC_OK, "server open failed with rc=%d [%s]", rc, anoubis_strerror(errno)); fail_unless(s->euid == (uid_t)-1, "euid: -1 expected but is %i", s->euid); fail_unless(s->egid == (gid_t)-1, "egid: -1 expected but is %i", s->egid); rc = acc_destroy(s); fail_if(rc != ACHAT_RC_OK, "server destroy failed with rc=%d", rc); check_waitpid_and_exit(childpid); break; } }