/* * verify that a node count in arg is of a known form (count or min-max) * OUT min, max specified minimum and maximum node counts * RET true if valid */ bool verify_node_count(const char *arg, int *min_nodes, int *max_nodes) { char *ptr, *min_str, *max_str; char *leftover; /* Does the string contain a "-" character? If so, treat as a range. * otherwise treat as an absolute node count. */ if ((ptr = index(arg, '-')) != NULL) { min_str = xstrndup(arg, ptr-arg); *min_nodes = _str_to_nodes(min_str, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", min_str); xfree(min_str); return false; } xfree(min_str); if (*min_nodes == 0) *min_nodes = 1; max_str = xstrndup(ptr+1, strlen(arg)-((ptr+1)-arg)); *max_nodes = _str_to_nodes(max_str, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", max_str); xfree(max_str); return false; } xfree(max_str); } else { *min_nodes = *max_nodes = _str_to_nodes(arg, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", arg); return false; } if (*min_nodes == 0) { /* whitespace does not a valid node count make */ error("\"%s\" is not a valid node count", arg); return false; } } if ((*max_nodes != 0) && (*max_nodes < *min_nodes)) { error("Maximum node count %d is less than" " minimum node count %d", *max_nodes, *min_nodes); return false; } return true; }
/* * verify that a node count in arg is of a known form (count or min-max) * OUT min, max specified minimum and maximum node counts * RET true if valid */ bool verify_node_count(const char *arg, int *min_nodes, int *max_nodes) { char *ptr, *min_str, *max_str; char *leftover; /* Does the string contain a "-" character? If so, treat as a range. * otherwise treat as an absolute node count. */ if ((ptr = index(arg, '-')) != NULL) { min_str = xstrndup(arg, ptr-arg); *min_nodes = _str_to_nodes(min_str, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", min_str); xfree(min_str); return false; } xfree(min_str); #ifdef HAVE_ALPS_CRAY if (*min_nodes < 0) { #else if (*min_nodes == 0) { #endif *min_nodes = 1; } max_str = xstrndup(ptr+1, strlen(arg)-((ptr+1)-arg)); *max_nodes = _str_to_nodes(max_str, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", max_str); xfree(max_str); return false; } xfree(max_str); } else { *min_nodes = *max_nodes = _str_to_nodes(arg, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", arg); return false; } #ifdef HAVE_ALPS_CRAY if (*min_nodes < 0) { #else if (*min_nodes == 0) { #endif /* whitespace does not a valid node count make */ error("\"%s\" is not a valid node count", arg); return false; } } if ((*max_nodes != 0) && (*max_nodes < *min_nodes)) { error("Maximum node count %d is less than" " minimum node count %d", *max_nodes, *min_nodes); return false; } return true; } /* * If the node list supplied is a file name, translate that into * a list of nodes, we orphan the data pointed to * RET true if the node list is a valid one */ bool verify_node_list(char **node_list_pptr, enum task_dist_states dist, int task_count) { char *nodelist = NULL; xassert (node_list_pptr); xassert (*node_list_pptr); if (strchr(*node_list_pptr, '/') == NULL) return true; /* not a file name */ /* If we are using Arbitrary grab count out of the hostfile using them exactly the way we read it in since we are saying, lay it out this way! */ if ((dist & SLURM_DIST_STATE_BASE) == SLURM_DIST_ARBITRARY) nodelist = slurm_read_hostfile(*node_list_pptr, task_count); else nodelist = slurm_read_hostfile(*node_list_pptr, NO_VAL); if (!nodelist) return false; xfree(*node_list_pptr); *node_list_pptr = xstrdup(nodelist); free(nodelist); return true; }