/* Rebuild avail_feature_list for given node configuration structure */ extern void build_avail_feature_list(struct config_record *config_ptr) { node_feature_t *feature_ptr; ListIterator feature_iter; char *tmp_str, *token, *last = NULL; /* Clear these nodes from the feature_list record, * then restore as needed */ feature_iter = list_iterator_create(avail_feature_list); bit_not(config_ptr->node_bitmap); while ((feature_ptr = (node_feature_t *) list_next(feature_iter))) { bit_and(feature_ptr->node_bitmap, config_ptr->node_bitmap); } list_iterator_destroy(feature_iter); bit_not(config_ptr->node_bitmap); if (config_ptr->feature) { tmp_str = xstrdup(config_ptr->feature); token = strtok_r(tmp_str, ",", &last); while (token) { _add_config_feature(avail_feature_list, token, config_ptr->node_bitmap); token = strtok_r(NULL, ",", &last); } xfree(tmp_str); } }
/* Given a config_record with it's bitmap already set, update feature_list */ extern void build_config_feature_list(struct config_record *config_ptr) { struct features_record *feature_ptr; ListIterator feature_iter; int i, j; char *tmp_str, *token, *last = NULL; /* Clear these nodes from the feature_list record, * then restore as needed */ feature_iter = list_iterator_create(feature_list); if (feature_iter == NULL) fatal("list_iterator_create malloc failure"); bit_not(config_ptr->node_bitmap); while ((feature_ptr = (struct features_record *) list_next(feature_iter))) { bit_and(feature_ptr->node_bitmap, config_ptr->node_bitmap); } list_iterator_destroy(feature_iter); bit_not(config_ptr->node_bitmap); if (config_ptr->feature) { i = strlen(config_ptr->feature) + 1; /* oversized */ tmp_str = xmalloc(i); /* Remove white space from feature specification */ for (i=0, j=0; config_ptr->feature[i]; i++) { if (!isspace((int)config_ptr->feature[i])) tmp_str[j++] = config_ptr->feature[i]; } if (i != j) strcpy(config_ptr->feature, tmp_str); token = strtok_r(tmp_str, ",", &last); while (token) { _add_config_feature(token, config_ptr->node_bitmap); token = strtok_r(NULL, ",", &last); } xfree(tmp_str); } }