int get_server(const char *job_id_in, char *job_id_out, int jobid_size, char *server_out, int server_size) { char *seq_number = NULL; char *parent_server = NULL; char *current_server = NULL; int rc; rc = parse_jobid(job_id_in, &seq_number, &parent_server, ¤t_server); if (rc != PBSE_NONE) { fprintf(stderr, "something is wrong in parse_jobid"); return(rc); } if ((current_server != NULL) && (current_server[0] != '\0')) { sprintf(server_out, "%s", current_server); } else if ((parent_server != NULL) && (parent_server[0] != '\0')) { sprintf(server_out, "%s", parent_server); } else { server_out[0] = '\0'; } return(PBSE_NONE); }
// Essaie de lire l'argument 1 de `argv` en tant que jobid // Verifie la correspondance entre le status du job et le masque `status` // Si l'argument est vide, choisi un job par défaut en accordance avec `status` // // Retourne le jobid en question // ou INVALID_JOBID si aucun job adéquate n'a été trouvé jobid_t read_jobid (char** argv, JobStatus status) { if (argv[1] == NULL) { // Pas d'argument spécifié pour la commande // Cherche un jobid par défaut. jobid_t jobid = jobs_find_first_by_status(status); if (jobid == INVALID_JOBID) { fprintf(stderr, "No default job found for command `%s`\n", argv[0]); return INVALID_JOBID; } return jobid; } jobid_t jobid; if (argv[1][0] == '%') { // L'argument est un id de job jobid = parse_jobid(argv[1] + 1); if (jobid == INVALID_JOBID) { fprintf(stderr, "Wrong jobid `%s`, expected number between 1 and %d\n", argv[1] + 1, MAXJOBS); return INVALID_JOBID; } if (job_status_match(jobid, FREE)) { fprintf(stderr, "No job with id `%d`\n", jobid + 1); return INVALID_JOBID; } } else { // L'argument est un id de processus pid_t pid = parse_pid(argv[1]); if (pid == 0) { fprintf(stderr, "Invalid pid `%s`\n", argv[1]); return INVALID_JOBID; } jobid = jobs_find_by_pid(pid); if (jobid == INVALID_JOBID) { fprintf(stderr, "No job found for pid `%d`\n", pid); return INVALID_JOBID; } } if (!job_status_match(jobid, status)) { fprintf(stderr, "Can't use command `%s` for job with status `%s`\n", argv[0], job_status_str(jobid)); return INVALID_JOBID; } return jobid; }
static int job_state_cb (const char *key, const char *val, void *arg, int errnum) { int64_t jobid = -1; flux_t h = (flux_t) arg; if (chk_errnum (h, errnum) < 0) flux_log (h, LOG_ERR, "job_state_cb: key(%s), val(%s)", key, val); else if (parse_jobid (key, &jobid) != 0) flux_log (h, LOG_ERR, "job_state_cb: key ill-formed"); else if (invoke_cbs (h, jobid, get_update_jcb (h, jobid, val), errnum) < 0) flux_log (h, LOG_ERR, "job_state_cb: failed to invoke callbacks"); /* always return 0 so that reactor will not return */ return 0; }
/** * Take a job ID string and parse it into * job ID and server name parts. * * @param job_id_in Input string of the form <job number>[.<parent server name>][@<host server url>] * @param job_id_out Output string containing only the job ID part of the input specification. * @param server_out Output string containing nothing or a host url if specified. */ int get_server( char *job_id_in, /* read only */ char *job_id_out, /* write only */ int job_id_out_size, /* sizeof the out buffer */ char *server_out, /* write only */ int server_out_size) /* sizeof the out buffer */ { char *seq_number; char *parent_server; char *current_server; char def_server[PBS_MAXSERVERNAME + 1]; char host_server[PBS_MAXSERVERNAME + 1]; char *c; /* parse the job_id_in into components */ if (!strcasecmp("all",job_id_in)) { snprintf(job_id_out, job_id_out_size, "%s", job_id_in); server_out[0] = '\0'; } else { if (parse_jobid(job_id_in, &seq_number, &parent_server, ¤t_server)) { return(1); } /* Apply the above rules, in order, except for the locate job request. * That request is only sent if the job is not found on the local server. */ if (notNULL(current_server)) { /* @server found */ snprintf(server_out, server_out_size, "%s", current_server); } else if (notNULL(parent_server)) { /* .server found */ snprintf(server_out, server_out_size, "%s", parent_server); } else { /* can't locate a server, so return a NULL to tell pbs_connect to use default */ server_out[0] = '\0'; } /* Make a fully qualified name of the job id. */ if (notNULL(parent_server)) { if (notNULL(current_server)) { snprintf(job_id_out, job_id_out_size, "%s.%s", seq_number, parent_server); /* parent_server might not be resolvable if current_server specified */ } else { if (get_fullhostname(parent_server, host_server, PBS_MAXSERVERNAME, NULL) != 0) { /* FAILURE */ return(1); } snprintf(job_id_out, job_id_out_size, "%s.%s", seq_number, host_server); } if ((c = strchr(parent_server, ':')) != 0) { if (*(c - 1) == '\\') c--; snprintf(job_id_out + strlen(job_id_out), job_id_out_size - strlen(job_id_out), "%s", c); } } else { parent_server = pbs_default(); if ((parent_server == (char *)NULL) || (*parent_server == '\0')) { return(1); } snprintf(def_server, PBS_MAXSERVERNAME, "%s", parent_server); c = def_server; while ((*c != '\n') && (*c != '\0')) c++; *c = '\0'; if (get_fullhostname(def_server, host_server, PBS_MAXSERVERNAME, NULL) != 0) { /* FAILURE */ return(1); } if ((c = strchr(def_server, ':')) != 0) { if (*(c - 1) == '\\') c--; snprintf(job_id_out, job_id_out_size, "%s.%s%s", seq_number, host_server, c); } else snprintf(job_id_out, job_id_out_size, "%s.%s", seq_number, host_server); } /* END else */ } return(PBSE_NONE); } /* END get_server() */
/** * @brief * processes input jobid according to above mentioned rules * * @param[in] job_id_in - input job id * @param[out] job_id_out - processed job id * @param[out] server_out - server name * * @return int * @retval 0 success * @retval 1 error * */ int get_server(char *job_id_in, char *job_id_out, char *server_out) { char *seq_number = NULL; char *parent_server = NULL; char *current_server = NULL; char host_server[PBS_MAXSERVERNAME+1]; if (!job_id_in || !job_id_out || !server_out) return 1; if (pbs_loadconf(0) != 1) return 1; /* parse the job_id_in into components */ if (parse_jobid(job_id_in, &seq_number, &parent_server, ¤t_server)) { free(seq_number); free(parent_server); free(current_server); return 1; } /* Apply the above rules, in order, except for the locate job request. That request is only sent if the job is not found on the local server. */ server_out[0] = '\0'; if (notNULL(current_server)) /* @server found */ strcpy(server_out, current_server); free(current_server); strcpy(job_id_out, seq_number); free(seq_number); if (notNULL(parent_server)) { /* If parent_server matches PBS_SERVER then use it */ if (pbs_conf.pbs_server_name) { if (strcasecmp(parent_server, pbs_conf.pbs_server_name) == 0) { strcat(job_id_out, "."); strcat(job_id_out, pbs_conf.pbs_server_name); free(parent_server); return 0; } } if (get_fullhostname(parent_server, host_server, PBS_MAXSERVERNAME) != 0) { free(parent_server); return 1; } strcat(job_id_out, "."); #ifdef NAS_CANON_JOBID /* localmod 086 */ strcat(job_id_out, host_server); #else strcat(job_id_out, parent_server); #endif /* localmod 086 */ if (server_out[0] == '\0') strcpy(server_out, parent_server); free(parent_server); return 0; } free(parent_server); if (pbs_conf.pbs_server_name) { strcat(job_id_out, "."); strcat(job_id_out, pbs_conf.pbs_server_name); } else { return 1; } return 0; }