int test_starting_service(discovery_service *svc) { svc->receive_callback = starting_service_spy; int retval = discovery_service_start(svc, ASK_ONCE_STRATEGY); JNXCHECK(retval == 0); JNXCHECK(svc->sock_send->socket > 0 && svc->sock_send->addrfamily == AF_INET && svc->sock_send->stype == SOCK_DGRAM); JNXCHECK(svc->udp_listener->socket > 0 && svc->udp_listener->socket->addrfamily == AF_INET && svc->udp_listener->socket->stype == SOCK_DGRAM); if (svc->isrunning) { // check send socket is up and sending int error = 0; socklen_t len = sizeof(error); retval = getsockopt(svc->sock_send->socket, SOL_SOCKET, SO_ERROR, &error, &len); JNXCHECK(retval == 0); } wait_for_flag(&list_message_received); return CLEANUP; }
void do_child() { wait_for_flag(2); exit(0); }
/* * do_master_child() */ void do_master_child(char **av) { pid_t pid1; int status; char user1name[] = "nobody"; char user2name[] = "bin"; struct passwd *ltpuser1, *ltpuser2; TEST_EXP_ENOS(exp_enos); tst_count = 0; *flag = 0; pid1 = FORK_OR_VFORK(); if (pid1 == -1) tst_brkm(TBROK | TERRNO, cleanup, "Fork failed"); if (pid1 == 0) { ltpuser1 = SAFE_GETPWNAM(NULL, user1name); if (setreuid(ltpuser1->pw_uid, ltpuser1->pw_uid) == -1) { perror("setreuid failed (in child)"); exit(1); } *flag = 1; #ifdef UCLINUX if (self_exec(av[0], "") < 0) { perror("self_exec failed"); exit(1); } #else do_child(); #endif } ltpuser2 = SAFE_GETPWNAM(NULL, user2name); if (setreuid(ltpuser2->pw_uid, ltpuser2->pw_uid) == -1) { perror("seteuid failed"); exit(1); } /* wait until child sets its euid */ wait_for_flag(1); TEST(kill(pid1, TEST_SIG)); /* signal the child that we're done */ *flag = 2; if (waitpid(pid1, &status, 0) == -1) { perror("waitpid failed"); exit(1); } if (TEST_RETURN != -1) { printf("kill succeeded unexpectedly\n"); exit(1); } /* * Check to see if the errno was set to the expected * value of 1 : EPERM */ if (TEST_ERRNO == EPERM) { printf("kill failed with EPERM\n"); exit(0); } perror("kill failed unexpectedly"); exit(1); }