lxc_state_t states[MAX_STATE],
int *state_client_fd)
{
- int stopped;
+ int state, stopped;
ssize_t ret;
- int state = -1;
struct lxc_cmd_rr cmd = {
.req = {
.cmd = LXC_CMD_ADD_STATE_CLIENT,
},
};
- /* Check if already in requested state. */
- state = lxc_getstate(name, lxcpath);
- if (state < 0) {
- TRACE("%s - Failed to retrieve state of container", strerror(errno));
- return -1;
- } else if (states[state]) {
- TRACE("Container is %s state", lxc_state2str(state));
- return state;
- }
-
ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL);
+ if (states[STOPPED] != 0 && stopped != 0)
+ return STOPPED;
+
if (ret < 0) {
ERROR("%s - Failed to execute command", strerror(errno));
return -1;
* function.
*/
if (cmd.rsp.ret < 0) {
- ERROR("Failed to receive socket fd");
+ ERROR("%s - Failed to receive socket fd", strerror(-cmd.rsp.ret));
return -1;
}
+ state = PTR_TO_INT(cmd.rsp.data);
+ if (state < MAX_STATE) {
+ TRACE("Container is already in requested state %s",
+ lxc_state2str(state));
+ return state;
+ }
+
*state_client_fd = cmd.rsp.ret;
+ TRACE("Added state client %d to state client list", cmd.rsp.ret);
return MAX_STATE;
}
return -1;
rsp.ret = lxc_add_state_client(fd, handler, (lxc_state_t *)req->data);
- if (rsp.ret < 0)
- ERROR("Failed to add state client %d to state client list", fd);
- else
- TRACE("Added state client %d to state client list", fd);
+ rsp.data = INT_TO_PTR(rsp.ret);
return lxc_cmd_rsp_send(fd, &rsp);
}
int lxc_add_state_client(int state_client_fd, struct lxc_handler *handler,
lxc_state_t states[MAX_STATE])
{
+ int state;
struct state_client *newclient;
struct lxc_list *tmplist;
return -ENOMEM;
}
- process_lock();
- lxc_list_add_elem(tmplist, newclient);
- lxc_list_add_tail(&handler->state_clients, tmplist);
- process_unlock();
+ state = handler->state;
+ if (states[state] != 1) {
+ lxc_list_add_elem(tmplist, newclient);
+ lxc_list_add_tail(&handler->state_clients, tmplist);
+ process_unlock();
+ } else {
+ process_unlock();
+ free(newclient);
+ return state;
+ }
TRACE("added state client %d to state client list", state_client_fd);
-
- return 0;
+ return MAX_STATE;
}
struct state_client *client;
struct lxc_msg msg = {.type = lxc_msg_state, .value = state};
+ process_lock();
handler->state = state;
TRACE("Set container state to %s", lxc_state2str(state));
- process_lock();
if (lxc_list_empty(&handler->state_clients)) {
TRACE("No state clients registered");
process_unlock();