static int l_posix_spawnattr_getflags(lua_State *L) { int r; posix_spawnattr_t *attr = luaL_checkudata(L, 1, "posix_spawnattr_t"); short int flags; if (0 != (r = posix_spawnattr_getflags(attr, &flags))) { lua_pushnil(L); lua_pushstring(L, strerror(r)); lua_pushinteger(L, r); return 3; } lua_createtable(L, 0, 7); lua_pushboolean(L, flags & POSIX_SPAWN_RESETIDS); lua_setfield(L, -2, "resetids"); lua_pushboolean(L, flags & POSIX_SPAWN_SETPGROUP); lua_setfield(L, -2, "setpgroup"); lua_pushboolean(L, flags & POSIX_SPAWN_SETSIGDEF); lua_setfield(L, -2, "setsigdef"); lua_pushboolean(L, flags & POSIX_SPAWN_SETSIGMASK); lua_setfield(L, -2, "setsigmask"); lua_pushboolean(L, flags & POSIX_SPAWN_SETSCHEDPARAM); lua_setfield(L, -2, "setschedparam"); lua_pushboolean(L, flags & POSIX_SPAWN_SETSCHEDULER); lua_setfield(L, -2, "setscheduler"); #ifdef POSIX_SPAWN_USEVFORK lua_pushboolean(L, flags & POSIX_SPAWN_USEVFORK); lua_setfield(L, -2, "usevfork"); #endif return 1; }
TEST(spawn, posix_spawnattr_setflags_posix_spawnattr_getflags) { posix_spawnattr_t sa; ASSERT_EQ(0, posix_spawnattr_init(&sa)); ASSERT_EQ(0, posix_spawnattr_setflags(&sa, POSIX_SPAWN_RESETIDS)); short flags; ASSERT_EQ(0, posix_spawnattr_getflags(&sa, &flags)); ASSERT_EQ(POSIX_SPAWN_RESETIDS, flags); constexpr short all_flags = POSIX_SPAWN_RESETIDS | POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER | POSIX_SPAWN_USEVFORK | POSIX_SPAWN_SETSID; ASSERT_EQ(0, posix_spawnattr_setflags(&sa, all_flags)); ASSERT_EQ(0, posix_spawnattr_getflags(&sa, &flags)); ASSERT_EQ(all_flags, flags); ASSERT_EQ(0, posix_spawnattr_destroy(&sa)); }
void ChildProcess::Options::setFlags(short flags) { short currentFlags; auto err = posix_spawnattr_getflags(&inner_->attr, ¤tFlags); if (err) { throw std::system_error( err, std::generic_category(), "posix_spawnattr_getflags"); } err = posix_spawnattr_setflags(&inner_->attr, currentFlags | flags); if (err) { throw std::system_error( err, std::generic_category(), "posix_spawnattr_setflags"); } }
static int l_posix_spawnattr_getflags(lua_State *L) { int r; size_t i; posix_spawnattr_t *attr = luaL_checkudata(L, 1, "posix_spawnattr_t"); short int flags; if (0 != (r = posix_spawnattr_getflags(attr, &flags))) { lua_pushnil(L); lua_pushstring(L, strerror(r)); lua_pushinteger(L, r); return 3; } lua_createtable(L, 0, N_SUPPORTED_FLAGS); for (i=0; i<N_SUPPORTED_FLAGS; i++) { lua_pushboolean(L, flags & supported_flags[i].value); lua_setfield(L, -2, supported_flags[i].flagname); } return 1; }
static void tc_libc_spawn_posix_spawnattr_setgetflags(void) { int ret_chk = ERROR; pid_t pid; posix_spawnattr_t st_attr; short int flags; ret_chk = posix_spawnattr_init(&st_attr); TC_ASSERT_EQ("posix_spawnattr_init", ret_chk, OK); ret_chk = posix_spawnattr_setflags(&st_attr, POSIX_SPAWN_SETSCHEDPARAM); TC_ASSERT_EQ("posix_spawnattr_setflags", ret_chk, OK); ret_chk = task_spawn(&pid, "spawn_flag", function_name_spawn, NULL, &st_attr, (char *const *)NULL, (char *const *)NULL); sleep(SEC_3); TC_ASSERT_EQ("task_spawn", ret_chk, OK); ret_chk = posix_spawnattr_getflags(&st_attr, &flags); TC_ASSERT_EQ("posix_spawnattr_getflags", ret_chk, OK); TC_ASSERT_EQ("posix_spawnattr_getflags", flags, POSIX_SPAWN_SETSCHEDPARAM); TC_SUCCESS_RESULT(); }