/*****************************************************************************\ * Parse, process and respond to a request \*****************************************************************************/ static void _proc_msg(slurm_fd_t new_fd, char *msg) { DEF_TIMERS; char *req, *cmd_ptr, *msg_type = NULL; char response[128]; if (new_fd < 0) return; START_TIMER; if (!msg) { err_code = -300; err_msg = "NULL request message"; error("wiki: NULL request message"); goto resp_msg; } if (_parse_msg(msg, &req) != 0) goto resp_msg; cmd_ptr = strstr(req, "CMD="); if (cmd_ptr == NULL) { err_code = -300; err_msg = "request lacks CMD"; error("wiki: request lacks CMD"); goto resp_msg; } cmd_ptr +=4; err_code = 0; if (strncmp(cmd_ptr, "GETJOBS", 7) == 0) { msg_type = "wiki:GETJOBS"; if (!get_jobs(cmd_ptr, &err_code, &err_msg)) goto free_resp_msg; } else if (strncmp(cmd_ptr, "GETNODES", 8) == 0) { msg_type = "wiki:GETNODES"; if (!get_nodes(cmd_ptr, &err_code, &err_msg)) goto free_resp_msg; } else if (strncmp(cmd_ptr, "STARTJOB", 8) == 0) { msg_type = "wiki:STARTJOB"; start_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "CANCELJOB", 9) == 0) { msg_type = "wiki:CANCELJOB"; cancel_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "SUSPENDJOB", 10) == 0) { msg_type = "wiki:SUSPENDJOB"; suspend_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "RESUMEJOB", 9) == 0) { msg_type = "wiki:RESUMEJOB"; resume_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "MODIFYJOB", 9) == 0) { msg_type = "wiki:MODIFYJOB"; job_modify_wiki(cmd_ptr, &err_code, &err_msg); } else { err_code = -300; err_msg = "unsupported request type"; error("wiki: unrecognized request type: %s", req); } END_TIMER2(msg_type); resp_msg: snprintf(response, sizeof(response), "SC=%d RESPONSE=%s", err_code, err_msg); _send_reply(new_fd, response); return; free_resp_msg: /* Message is pre-formatted by get_jobs and get_nodes * ONLY if no error. Send message and xfree the buffer. */ _send_reply(new_fd, err_msg); xfree(err_msg); return; }
/*****************************************************************************\ * Parse, process and respond to a request \*****************************************************************************/ static void _proc_msg(slurm_fd_t new_fd, char *msg) { DEF_TIMERS; char *req, *cmd_ptr, *msg_type = NULL; char response[128]; if (new_fd < 0) return; START_TIMER; if (!msg) { err_code = -300; err_msg = "NULL request message"; error("wiki: NULL request message"); goto resp_msg; } if (_parse_msg(msg, &req) != 0) goto resp_msg; cmd_ptr = strstr(req, "CMD="); if (cmd_ptr == NULL) { err_code = -300; err_msg = "request lacks CMD"; error("wiki: request lacks CMD"); goto resp_msg; } cmd_ptr +=4; err_code = 0; if (strncmp(cmd_ptr, "GETJOBS", 7) == 0) { msg_type = "wiki:GETJOBS"; if (!get_jobs(cmd_ptr, &err_code, &err_msg)) goto free_resp_msg; } else if (strncmp(cmd_ptr, "GETNODES", 8) == 0) { msg_type = "wiki:GETNODES"; if (!get_nodes(cmd_ptr, &err_code, &err_msg)) goto free_resp_msg; } else if (strncmp(cmd_ptr, "STARTJOB", 8) == 0) { msg_type = "wiki:STARTJOB"; start_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "CANCELJOB", 9) == 0) { msg_type = "wiki:CANCELJOB"; cancel_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "REQUEUEJOB", 10) == 0) { msg_type = "wiki:REQUEUEJOB"; job_requeue_wiki(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "SUSPENDJOB", 10) == 0) { msg_type = "wiki:SUSPENDJOB"; suspend_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "RESUMEJOB", 9) == 0) { msg_type = "wiki:RESUMEJOB"; resume_job(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "JOBADDTASK", 10) == 0) { msg_type = "wiki:JOBADDTASK"; job_add_task(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "JOBRELEASETASK", 14) == 0) { msg_type = "wiki:JOBRELEASETASK"; job_release_task(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "JOBWILLRUN", 10) == 0) { msg_type = "wiki:JOBWILLRUN"; if (strstr(cmd_ptr, "NODES=")) { /* Updated format input and output */ if (!job_will_run2(cmd_ptr, &err_code, &err_msg)) goto free_resp_msg; } else { if (!job_will_run(cmd_ptr, &err_code, &err_msg)) goto free_resp_msg; } } else if (strncmp(cmd_ptr, "MODIFYJOB", 9) == 0) { msg_type = "wiki:MODIFYJOB"; job_modify_wiki(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "NOTIFYJOB", 9) == 0) { msg_type = "wiki:NOTIFYJOB"; job_notify_wiki(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "SIGNALJOB", 9) == 0) { msg_type = "wiki:SIGNALJOB"; job_signal_wiki(cmd_ptr, &err_code, &err_msg); } else if (strncmp(cmd_ptr, "INITIALIZE", 10) == 0) { msg_type = "wiki:INITIALIZE"; initialize_wiki(cmd_ptr, &err_code, &err_msg); } else { err_code = -300; err_msg = "unsupported request type"; error("wiki: unrecognized request type: %s", req); } END_TIMER2(msg_type); resp_msg: snprintf(response, sizeof(response), "SC=%d RESPONSE=%s", err_code, err_msg); _send_reply(new_fd, response); return; free_resp_msg: /* Message is pre-formatted by get_jobs and get_nodes * ONLY if no error. Send message and xfree the buffer. */ _send_reply(new_fd, err_msg); xfree(err_msg); return; }