int handle_immigration_request(struct nl_msg *req_msg) { struct nl_msg *msg = NULL; struct nlattr *nla; int ret = 0; int seq; struct internal_state* state = get_current_state(); // In params int uid; int slot_index; char* name; // Out params int accept = 1; seq = nlmsg_hdr(req_msg)->nlmsg_seq; nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_UID); if (nla == NULL) return -EBADMSG; uid = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_INDEX); if (nla == NULL) return -EBADMSG; slot_index = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_NAME); if (nla == NULL) return -EBADMSG; //name = nl_data_get(nla_get_data(nla)); name = nla_data(nla); //printf("NPM CALLED FOR NAME: %s\n", name); if ( immigration_request_callback ) immigration_request_callback(uid, slot_index, name, &accept); if ( (ret=prepare_response_message(state->handle, DIRECTOR_IMMIGRATION_REQUEST_RESPONSE, state->gnl_fid, seq, &msg) ) != 0 ) { goto done; } ret = nla_put_u32(msg, DIRECTOR_A_DECISION, accept); if (ret != 0) goto error_del_resp; ret = send_request_message(state->handle, msg, 0); goto done; error_del_resp: nlmsg_free(msg); done: return ret; }
int handle_task_exitted(struct nl_msg *req_msg) { struct nl_msg *msg = NULL; struct nlattr *nla; int ret = 0; int seq; struct internal_state* state = get_current_state(); struct rusage *rusage; // In params pid_t pid; int exit_code; seq = nlmsg_hdr(req_msg)->nlmsg_seq; nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_PID); if (nla == NULL) return -EBADMSG; pid = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_EXIT_CODE); if (nla == NULL) return -EBADMSG; exit_code = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_RUSAGE); if (nla == NULL) return -EBADMSG; //rusage = nl_data_get(nla_get_data(nla)); rusage = nla_data(nla); if ( task_exitted_callback ) task_exitted_callback(pid, exit_code, rusage); if ( (ret=prepare_response_message(state->sk, DIRECTOR_ACK, state->gnl_fid, seq, &msg) ) != 0 ) { goto done; } if (ret != 0) goto error_del_resp; ret = send_request_message(state->sk, msg, 0); goto done; error_del_resp: nlmsg_free(msg); done: return ret; }
int handle_immigration_confirmed(struct nl_msg *req_msg) { struct nl_msg *msg = NULL; struct nlattr *nla; int ret = 0; int seq; struct internal_state* state = get_current_state(); // In params int uid; int slot_index; char* name; pid_t local_pid; pid_t remote_pid; unsigned long jiffies; seq = nlmsg_hdr(req_msg)->nlmsg_seq; nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_UID); if (nla == NULL) return -EBADMSG; uid = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_INDEX); if (nla == NULL) return -EBADMSG; slot_index = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_NAME); if (nla == NULL) return -EBADMSG; //name = nl_data_get(nla_get_data(nla)); name = nla_data(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_JIFFIES); if (nla == NULL) return -EBADMSG; jiffies = nla_get_u64(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_PID); if (nla == NULL) return -EBADMSG; local_pid = nla_get_u32(nla); nla = nlmsg_find_attr(nlmsg_hdr(req_msg), sizeof(struct genlmsghdr), DIRECTOR_A_REMOTE_PID); if (nla == NULL) return -EBADMSG; remote_pid = nla_get_u32(nla); //printf("NPM CALLED FOR NAME: %s\n", name); if ( immigration_confirmed_callback ) immigration_confirmed_callback(uid, slot_index, name, jiffies, local_pid, remote_pid); if ( (ret=prepare_response_message(state->sk, DIRECTOR_ACK, state->gnl_fid, seq, &msg) ) != 0 ) { goto done; } ret = send_request_message(state->sk, msg, 0); goto done; error_del_resp: nlmsg_free(msg); done: return ret; }