diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c index 870b8324843589637121de1dcfcca1369744283f..8e7659bb1e41cab9839a9103ee89f576304b1439 100644 --- a/src/sacctmgr/account_functions.c +++ b/src/sacctmgr/account_functions.c @@ -118,19 +118,22 @@ static int _set_rec(int *start, int argc, char *argv[], } else if (strncasecmp (argv[i], "Description", 1) == 0) { acct->description = xstrdup(argv[i]+end); u_set = 1; - } else if (strncasecmp (argv[i], "Fairshare", 1) == 0) { - assoc->fairshare = atoi(argv[i]+end); - a_set = 1; + } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { + if (get_uint(argv[i]+end, &assoc->fairshare, + "FairShare") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxCPUSec", 4) == 0) { - assoc->max_cpu_secs_per_job = - atoi(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, &assoc->max_cpu_secs_per_job, + "MaxCPUSec") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { - assoc->max_jobs = atoi(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, &assoc->max_jobs, + "MaxJobs") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { - assoc->max_nodes_per_job = atoi(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, &assoc->max_nodes_per_job, + "MaxNodes") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { assoc->max_wall_duration_per_job = (uint32_t) time_str2mins(argv[i]+end); @@ -244,11 +247,11 @@ extern int sacctmgr_add_account(int argc, char *argv[]) List assoc_list = NULL; List local_assoc_list = NULL; List local_account_list = NULL; - uint32_t fairshare = -2; - uint32_t max_jobs = -2; - uint32_t max_nodes_per_job = -2; - uint32_t max_wall_duration_per_job = -2; - uint32_t max_cpu_secs_per_job = -2; + uint32_t fairshare = NO_VAL; + uint32_t max_jobs = NO_VAL; + uint32_t max_nodes_per_job = NO_VAL; + uint32_t max_wall_duration_per_job = NO_VAL; + uint32_t max_cpu_secs_per_job = NO_VAL; char *acct_str = NULL; char *assoc_str = NULL; int limit_set = 0; @@ -262,17 +265,21 @@ extern int sacctmgr_add_account(int argc, char *argv[]) } else if (strncasecmp (argv[i], "Description", 1) == 0) { description = xstrdup(argv[i]+end); } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { - fairshare = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &fairshare, + "FairShare") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxCPUSecs", 4) == 0) { - max_cpu_secs_per_job = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_cpu_secs_per_job, + "MaxCPUSecs") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { - max_jobs = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_jobs, + "MaxJobs") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { - max_nodes_per_job = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_nodes_per_job, + "MaxNodes") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { max_wall_duration_per_job = (uint32_t) time_str2mins(argv[i]+end); @@ -531,16 +538,16 @@ extern int sacctmgr_add_account(int argc, char *argv[]) if(limit_set) { printf(" Settings\n"); - if((int)fairshare != -2) + if(fairshare != NO_VAL) printf(" Fairshare = %u\n", fairshare); - if((int)max_cpu_secs_per_job != -2) + if(max_cpu_secs_per_job != NO_VAL) printf(" MaxCPUSecs = %u\n", max_cpu_secs_per_job); - if((int)max_jobs != -2) + if(max_jobs != NO_VAL) printf(" MaxJobs = %u\n", max_jobs); - if((int)max_nodes_per_job != -2) + if(max_nodes_per_job != NO_VAL) printf(" MaxNodes = %u\n", max_nodes_per_job); - if((int)max_wall_duration_per_job != -2) { + if(max_wall_duration_per_job != NO_VAL) { char time_buf[32]; mins2time_str((time_t) max_wall_duration_per_job, time_buf, sizeof(time_buf)); @@ -732,17 +739,17 @@ extern int sacctmgr_modify_account(int argc, char *argv[]) acct_cond->assoc_cond = xmalloc(sizeof(acct_association_cond_t)); acct_cond->assoc_cond->cluster_list = list_create(slurm_destroy_char); acct_cond->assoc_cond->acct_list = list_create(slurm_destroy_char); - acct_cond->assoc_cond->fairshare = -2; - acct_cond->assoc_cond->max_cpu_secs_per_job = -2; - acct_cond->assoc_cond->max_jobs = -2; - acct_cond->assoc_cond->max_nodes_per_job = -2; - acct_cond->assoc_cond->max_wall_duration_per_job = -2; + acct_cond->assoc_cond->fairshare = NO_VAL; + acct_cond->assoc_cond->max_cpu_secs_per_job = NO_VAL; + acct_cond->assoc_cond->max_jobs = NO_VAL; + acct_cond->assoc_cond->max_nodes_per_job = NO_VAL; + acct_cond->assoc_cond->max_wall_duration_per_job = NO_VAL; - assoc->fairshare = -2; - assoc->max_cpu_secs_per_job = -2; - assoc->max_jobs = -2; - assoc->max_nodes_per_job = -2; - assoc->max_wall_duration_per_job = -2; + assoc->fairshare = NO_VAL; + assoc->max_cpu_secs_per_job = NO_VAL; + assoc->max_jobs = NO_VAL; + assoc->max_nodes_per_job = NO_VAL; + assoc->max_wall_duration_per_job = NO_VAL; for (i=0; i<argc; i++) { if (strncasecmp (argv[i], "Where", 5) == 0) { diff --git a/src/sacctmgr/association_functions.c b/src/sacctmgr/association_functions.c index 2479a2bf5f578c885cad6643193e6c4ba0ff1abd..cd76212aebbdfdfcd3265e2288fc977c80d29abc 100644 --- a/src/sacctmgr/association_functions.c +++ b/src/sacctmgr/association_functions.c @@ -104,43 +104,55 @@ static int _set_rec(int *start, int argc, char *argv[], int set = 0; for (i=(*start); i<argc; i++) { - if (strncasecmp (argv[i], "Id=", 3) == 0) { - association->id = atoi(argv[i]+3); - set = 1; - } else if (strncasecmp (argv[i], "User=", 5) == 0) { - association->user = xstrdup(argv[i]+5); - set = 1; - } else if (strncasecmp (argv[i], "Account=", 8) == 0) { - association->account = xstrdup(argv[i]+8); - set = 1; - } else if (strncasecmp (argv[i], "Cluster=", 8) == 0) { - association->cluster = xstrdup(argv[i]+8); - set = 1; - } else if (strncasecmp (argv[i], "Partition=", 10) == 0) { - association->partition = xstrdup(argv[i]+10); + int end = parse_option_end(argv[i]); + if (strncasecmp (argv[i], "Where", 5) == 0) { + i--; + break; + } + if (!end) { + printf(" Bad format on %s: End your option with " + "an '=' sign\n", argv[i]); + } else if (strncasecmp (argv[i], "Id", ) == 0) { + if (get_uint(argv[i]+end, &association->id, + "Id") == SLURM_SUCCESS) + set = 1; + } else if (strncasecmp (argv[i], "User", 2) == 0) { + association->user = xstrdup(argv[i]+end); set = 1; - } else if (strncasecmp (argv[i], "Parent=", 7) == 0) { - association->parent_account = xstrdup(argv[i]+7); + } else if (strncasecmp (argv[i], "Account", 2) == 0) { + association->account = xstrdup(argv[i]+end); set = 1; - } else if (strncasecmp (argv[i], "FairShare=", 10) == 0) { - association->fairshare = atoi(argv[i]+10); + } else if (strncasecmp (argv[i], "Cluster", 2) == 0) { + association->cluster = xstrdup(argv[i]+end); set = 1; - } else if (strncasecmp (argv[i], "MaxJobs=", 8) == 0) { - association->max_jobs = atoi(argv[i]+8); + } else if (strncasecmp (argv[i], "Partition", 4) == 0) { + association->partition = xstrdup(argv[i]+end); set = 1; - } else if (strncasecmp (argv[i], "MaxNodes=", 9) == 0) { - association->max_nodes_per_job = atoi(argv[i]+9); + } else if (strncasecmp (argv[i], "Parent", 4) == 0) { + association->parent_account = xstrdup(argv[i]+end); set = 1; - } else if (strncasecmp (argv[i], "MaxWall=", 8) == 0) { + } else if (strncasecmp (argv[i], "FairShare", 4) == 0) { + if (get_uint(argv[i]+end, &association->fairshare, + "FairShare") == SLURM_SUCCESS) + set = 1; + } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { + if (get_uint(argv[i]+end, &association->max_jobs, + "MaxJobs") == SLURM_SUCCESS) + set = 1; + } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { + if (get_uint(argv[i]+end, + &association->max_nodes_per_job, + "MaxNodes") == SLURM_SUCCESS) + set = 1; + } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { association->max_wall_duration_per_job = - (uint32_t) time_str2mins(argv[i]+8); + (uint32_t) time_str2mins(argv[i]+end); set = 1; - } else if (strncasecmp (argv[i], "MaxCPUSecs=", 11) == 0) { - association->max_cpu_seconds_per_job = atoi(argv[i]+11); - set = 1; - } else if (strncasecmp (argv[i], "Where", 5) == 0) { - i--; - break; + } else if (strncasecmp (argv[i], "MaxCPUSecs", 4) == 0) { + if (get_uint(argv[i]+end, + &association->max_cpu_seconds_per_job, + "MaxCPUSecs") == SLURM_SUCCESS) + set = 1; } else { printf(" error: Valid options are 'DefaultAccount=' " "'ExpediteLevel=' and 'AdminLevel='\n"); @@ -272,14 +284,15 @@ extern int sacctmgr_list_association(int argc, char *argv[]) assoc_cond->cluster_list = list_create(destroy_char); for (i=0; i<argc; i++) { - if (strncasecmp (argv[i], "Ids=", 4) == 0) { - addto_char_list(assoc_cond->id_list, argv[i]+3); - } else if (strncasecmp (argv[i], "Users=", 6) == 0) { - addto_char_list(assoc_cond->user_list, argv[i]+6); - } else if (strncasecmp (argv[i], "Accounts=", 9) == 0) { - addto_char_list(assoc_cond->account_list, argv[i]+9); - } else if (strncasecmp (argv[i], "Clusters=", 9) == 0) { - addto_char_list(assoc_cond->cluster_list, argv[i]+9); + int end = parse_option_end(argv[i]); + if (strncasecmp (argv[i], "Ids", 2) == 0) { + addto_char_list(assoc_cond->id_list, argv[i]+end); + } else if (strncasecmp (argv[i], "Users", 2) == 0) { + addto_char_list(assoc_cond->user_list, argv[i]+end); + } else if (strncasecmp (argv[i], "Accounts", 2) == 0) { + addto_char_list(assoc_cond->account_list, argv[i]+end); + } else if (strncasecmp (argv[i], "Clusters", ) == 0) { + addto_char_list(assoc_cond->cluster_list, argv[i]+end); } else { error("Valid options are 'Ids=' 'Users=' 'Accounts=' " "and 'Clusters='"); diff --git a/src/sacctmgr/cluster_functions.c b/src/sacctmgr/cluster_functions.c index 2fd8f4c9e368e0e55f78808b62f72db5b07cdf14..3bb151f87526634bcfc8de47af4aa071eb220cef 100644 --- a/src/sacctmgr/cluster_functions.c +++ b/src/sacctmgr/cluster_functions.c @@ -85,22 +85,27 @@ static int _set_rec(int *start, int argc, char *argv[], printf(" Bad format on %s: End your option with " "an '=' sign\n", argv[i]); } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { - cluster->default_fairshare = atoi(argv[i]+end); - set = 1; + if (get_uint(argv[i]+end, &cluster->default_fairshare, + "FairShare") == SLURM_SUCCESS) + set = 1; } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { - cluster->default_max_jobs = atoi(argv[i]+end); - set = 1; + if (get_uint(argv[i]+end, &cluster->default_max_jobs, + "MaxJobs") == SLURM_SUCCESS) + set = 1; } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { - cluster->default_max_nodes_per_job = atoi(argv[i]+end); - set = 1; + if (get_uint(argv[i]+end, + &cluster->default_max_nodes_per_job, + "MaxNodes") == SLURM_SUCCESS) + set = 1; } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { cluster->default_max_wall_duration_per_job = (uint32_t) time_str2mins(argv[i]+end); set = 1; } else if (strncasecmp (argv[i], "MaxCPUSecs=", 11) == 0) { - cluster->default_max_cpu_secs_per_job = - atoi(argv[i]+end); - set = 1; + if (get_uint(argv[i]+end, + &cluster->default_max_cpu_secs_per_job, + "MaxCPUSecs") == SLURM_SUCCESS) + set = 1; } else { printf(" Unknown option: %s\n" " Use keyword 'where' to modify condition\n", @@ -120,11 +125,11 @@ extern int sacctmgr_add_cluster(int argc, char *argv[]) acct_cluster_rec_t *cluster = NULL; List name_list = list_create(slurm_destroy_char); List cluster_list = NULL; - uint32_t fairshare = -2; - uint32_t max_cpu_secs_per_job = -2; - uint32_t max_jobs = -2; - uint32_t max_nodes_per_job = -2; - uint32_t max_wall_duration_per_job = -2; + uint32_t fairshare = NO_VAL; + uint32_t max_cpu_secs_per_job = NO_VAL; + uint32_t max_jobs = NO_VAL; + uint32_t max_nodes_per_job = NO_VAL; + uint32_t max_wall_duration_per_job = NO_VAL; int limit_set = 0; ListIterator itr = NULL, itr_c = NULL; char *name = NULL; @@ -222,16 +227,16 @@ extern int sacctmgr_add_cluster(int argc, char *argv[]) if(limit_set) { printf(" User Defaults\n"); - if((int)fairshare != -2) + if(fairshare != NO_VAL) printf(" Fairshare = %u\n", fairshare); - if((int)max_cpu_secs_per_job != -2) + if(max_cpu_secs_per_job != NO_VAL) printf(" MaxCPUSecs = %u\n", max_cpu_secs_per_job); - if((int)max_jobs != -2) + if(max_jobs != NO_VAL) printf(" MaxJobs = %u\n", max_jobs); - if((int)max_nodes_per_job != -2) + if(max_nodes_per_job != NO_VAL) printf(" MaxNodes = %u\n", max_nodes_per_job); - if((int)max_wall_duration_per_job != -2) { + if(max_wall_duration_per_job != NO_VAL) { char time_buf[32]; mins2time_str((time_t) max_wall_duration_per_job, time_buf, sizeof(time_buf)); @@ -366,18 +371,18 @@ extern int sacctmgr_modify_cluster(int argc, char *argv[]) printf(" Setting\n"); if(rec_set) printf(" User Defaults =\n"); - if((int)cluster->default_fairshare != -2) + if(cluster->default_fairshare != NO_VAL) printf(" Fairshare = %u\n", cluster->default_fairshare); - if((int)cluster->default_max_cpu_secs_per_job != -2) + if(cluster->default_max_cpu_secs_per_job != NO_VAL) printf(" MaxCPUSecs = %u\n", cluster->default_max_cpu_secs_per_job); - if((int)cluster->default_max_jobs != -2) + if(cluster->default_max_jobs != NO_VAL) printf(" MaxJobs = %u\n", cluster->default_max_jobs); - if((int)cluster->default_max_nodes_per_job != -2) + if(cluster->default_max_nodes_per_job != NO_VAL) printf(" MaxNodes = %u\n", cluster->default_max_nodes_per_job); - if((int)cluster->default_max_wall_duration_per_job != -2) { + if(cluster->default_max_wall_duration_per_job != NO_VAL) { char time_buf[32]; mins2time_str((time_t) cluster->default_max_wall_duration_per_job, diff --git a/src/sacctmgr/common.c b/src/sacctmgr/common.c index 350d6e4ef86800a5b98420f4c14a59e4c1aa4520..ea94663cc63459f98ae3d835255b37f110aedcdc 100644 --- a/src/sacctmgr/common.c +++ b/src/sacctmgr/common.c @@ -544,3 +544,21 @@ extern acct_cluster_rec_t *sacctmgr_find_cluster_from_list( return cluster; } + +extern int get_uint(char *in_value, uint32_t *out_value, char *type) +{ + char *ptr = NULL; + long num; + + num = strtol(in_value, &ptr, 10); + if ((num == 0) && ptr && ptr[0]) { + error("Invalid value for %s", type); + return SLURM_ERROR; + } + + if (num < 0) + *out_value = INFINITE; /* flag to clear */ + else + *out_value = (uint32_t) num; + return SLURM_SUCCESS; +} diff --git a/src/sacctmgr/print.c b/src/sacctmgr/print.c index 2f7eef2dc5984b45098eb1700cbb7fb30b292c3d..81c13cf3e5b3905f6ed11f8d8dfd004f2275d122 100644 --- a/src/sacctmgr/print.c +++ b/src/sacctmgr/print.c @@ -102,7 +102,7 @@ extern void print_str(type_t type, print_field_t *field, char *value) } } -extern void print_int(type_t type, print_field_t *field, uint32_t value) +extern void print_uint(type_t type, print_field_t *field, uint32_t value) { switch(type) { case HEADLINE: @@ -113,7 +113,8 @@ extern void print_int(type_t type, print_field_t *field, uint32_t value) "---------------------------------------"); break; case VALUE: - if((int)value < 0) + /* (value == unset) || (value == cleared) */ + if((value == NO_VAL) || (value == INFINITE)) printf("%-*s ", field->len, " "); else printf("%*u ", field->len, value); @@ -135,7 +136,8 @@ extern void print_time(type_t type, print_field_t *field, uint32_t value) "---------------------------------------"); break; case VALUE: - if((int)value < 0) + /* (value == unset) || (value == cleared) */ + if((value == NO_VAL) || (value == INFINITE)) printf("%-*s ", field->len, " "); else { char time_buf[32]; diff --git a/src/sacctmgr/print.h b/src/sacctmgr/print.h index d0441e80ebeb4e60e9157938dbbb60dfffcbeaa2..7e2d770c931521a998e092b8a9686e43e90fc792 100644 --- a/src/sacctmgr/print.h +++ b/src/sacctmgr/print.h @@ -82,7 +82,7 @@ extern void destroy_print_field(void *object); extern void print_header(List print_fields_list); extern void print_date(void); extern void print_str(type_t type, print_field_t *field, char *value); -extern void print_int(type_t type, print_field_t *field, uint32_t value); +extern void print_uint(type_t type, print_field_t *field, uint32_t value); extern void print_time(type_t type, print_field_t *field, uint32_t value); #endif diff --git a/src/sacctmgr/sacctmgr.c b/src/sacctmgr/sacctmgr.c index db37ae8e55d92143087d8cf6084780bb7313ff73..fad8b73fea59e1bf86060df2838e2cdd2f330cf8 100644 --- a/src/sacctmgr/sacctmgr.c +++ b/src/sacctmgr/sacctmgr.c @@ -680,11 +680,11 @@ static sacctmgr_file_opts_t *_parse_options(char *options) int start=0, i=0, end=0; char *sub = NULL; sacctmgr_file_opts_t *file_opts = xmalloc(sizeof(sacctmgr_file_opts_t)); - file_opts->fairshare = -2; - file_opts->max_cpu_secs_per_job = -2; - file_opts->max_jobs = -2; - file_opts->max_nodes_per_job = -2; - file_opts->max_wall_duration_per_job = -2; + file_opts->fairshare = NO_VAL; + file_opts->max_cpu_secs_per_job = NO_VAL; + file_opts->max_jobs = NO_VAL; + file_opts->max_nodes_per_job = NO_VAL; + file_opts->max_wall_duration_per_job = NO_VAL; while(options[i]) { start=i; @@ -710,13 +710,17 @@ static sacctmgr_file_opts_t *_parse_options(char *options) } else if (strncasecmp (sub, "Description", 3) == 0) { file_opts->desc = xstrdup(sub+end); } else if (strncasecmp (sub, "Fairshare", 1) == 0) { - file_opts->fairshare = atoi(sub+end); + get_uint(sub+end, &file_opts->fairshare, + "FairShare"); } else if (strncasecmp (sub, "MaxCPUSec", 4) == 0) { - file_opts->max_cpu_secs_per_job = atoi(sub+end); + get_uint(sub+end, &file_opts->max_cpu_secs_per_job, + "MaxCPUSec"); } else if (strncasecmp (sub, "MaxJobs", 4) == 0) { - file_opts->max_jobs = atoi(sub+end); + get_uint(sub+end, &file_opts->max_jobs, + "MaxJobs"); } else if (strncasecmp (sub, "MaxNodes", 4) == 0) { - file_opts->max_nodes_per_job = atoi(sub+end); + get_uint(sub+end, &file_opts->max_nodes_per_job, + "MaxNodes"); } else if (strncasecmp (sub, "MaxWall", 4) == 0) { file_opts->max_wall_duration_per_job = (uint32_t) time_str2mins(sub+end); @@ -1136,19 +1140,19 @@ static void _load_file (int argc, char *argv[]) fs_field.name = "FairShare"; fs_field.len = 10; - fs_field.print_routine = print_int; + fs_field.print_routine = print_uint; mc_field.name = "MaxCPUSecs"; mc_field.len = 10; - mc_field.print_routine = print_int; + mc_field.print_routine = print_uint; mj_field.name = "MaxJobs"; mj_field.len = 7; - mj_field.print_routine = print_int; + mj_field.print_routine = print_uint; mn_field.name = "MaxNodes"; mn_field.len = 8; - mn_field.print_routine = print_int; + mn_field.print_routine = print_uint; mw_field.name = "MaxWall"; mw_field.len = 7; @@ -1199,11 +1203,11 @@ static void _load_file (int argc, char *argv[]) while((assoc = list_next(itr))) { print_str(VALUE, &name_field, assoc->acct); print_str(VALUE, &parent_field, assoc->parent_acct); - print_int(VALUE, &fs_field, assoc->fairshare); - print_int(VALUE, &mc_field, - assoc->max_cpu_secs_per_job); - print_int(VALUE, &mj_field, assoc->max_jobs); - print_int(VALUE, &mn_field, assoc->max_nodes_per_job); + print_uint(VALUE, &fs_field, assoc->fairshare); + print_uint(VALUE, &mc_field, + assoc->max_cpu_secs_per_job); + print_uint(VALUE, &mj_field, assoc->max_jobs); + print_uint(VALUE, &mn_field, assoc->max_nodes_per_job); print_time(VALUE, &mw_field, assoc->max_wall_duration_per_job); printf("\n"); @@ -1262,13 +1266,13 @@ static void _load_file (int argc, char *argv[]) while((assoc = list_next(itr))) { print_str(VALUE, &name_field, assoc->user); print_str(VALUE, &acct_field, assoc->acct); - print_int(VALUE, &fs_field, assoc->fairshare); - print_int(VALUE, &mc_field, - assoc->max_cpu_secs_per_job); - print_int(VALUE, &mj_field, assoc->max_jobs); - print_int(VALUE, &mn_field, assoc->max_nodes_per_job); - print_int(VALUE, &mw_field, - assoc->max_wall_duration_per_job); + print_uint(VALUE, &fs_field, assoc->fairshare); + print_uint(VALUE, &mc_field, + assoc->max_cpu_secs_per_job); + print_uint(VALUE, &mj_field, assoc->max_jobs); + print_uint(VALUE, &mn_field, assoc->max_nodes_per_job); + print_uint(VALUE, &mw_field, + assoc->max_wall_duration_per_job); printf("\n"); } list_iterator_destroy(itr); diff --git a/src/sacctmgr/sacctmgr.h b/src/sacctmgr/sacctmgr.h index 37de498314548dc98f1b0e1fcbb0c49628be0aa6..bb7eedf85a281a1d0d7903a02a2f83589a142e13 100644 --- a/src/sacctmgr/sacctmgr.h +++ b/src/sacctmgr/sacctmgr.h @@ -150,6 +150,7 @@ extern void destroy_sacctmgr_action(void *object); extern int notice_thread_init(); extern int notice_thread_fini(); extern int commit_check(char *warning); +extern int get_uint(char *in_value, uint32_t *out_value, char *type); /* you need to free the objects returned from these functions */ extern acct_association_rec_t *sacctmgr_find_association(char *user, diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c index b0e919d1944a92b2c022e37418dd09442d5723cf..5e0828528b4cb079892977320f5a4f0054d235f5 100644 --- a/src/sacctmgr/user_functions.c +++ b/src/sacctmgr/user_functions.c @@ -126,23 +126,29 @@ static int _set_rec(int *start, int argc, char *argv[], } else if (strncasecmp (argv[i], "DefaultAccount", 1) == 0) { user->default_acct = xstrdup(argv[i]+end); u_set = 1; - } else if (strncasecmp (argv[i], "Fairshare", 1) == 0) { - association->fairshare = atoi(argv[i]+end); - a_set = 1; + } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { + if (get_uint(argv[i]+end, &association->fairshare, + "FairShare") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxCPUSec", 4) == 0) { - association->max_cpu_secs_per_job = - atoi(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, + &association->max_cpu_secs_per_job, + "MaxCPUSec") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { - association->max_jobs = atoi(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, &association->max_jobs, + "MaxJobs") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { - association->max_nodes_per_job = atoi(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, + &association->max_nodes_per_job, + "MaxNodes") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { - association->max_wall_duration_per_job = - (uint32_t) time_str2mins(argv[i]+end); - a_set = 1; + if (get_uint(argv[i]+end, + &association->max_wall_duration_per_job, + "MaxWall") == SLURM_SUCCESS) + a_set = 1; } else if (strncasecmp (argv[i], "QosLevel", 1) == 0) { user->qos = str_2_acct_qos(argv[i]+end); u_set = 1; @@ -243,11 +249,11 @@ extern int sacctmgr_add_user(int argc, char *argv[]) List local_assoc_list = NULL; List local_acct_list = NULL; List local_user_list = NULL; - uint32_t fairshare = -2; - uint32_t max_jobs = -2; - uint32_t max_nodes_per_job = -2; - uint32_t max_wall_duration_per_job = -2; - uint32_t max_cpu_secs_per_job = -2; + uint32_t fairshare = NO_VAL; + uint32_t max_jobs = NO_VAL; + uint32_t max_nodes_per_job = NO_VAL; + uint32_t max_wall_duration_per_job = NO_VAL; + uint32_t max_cpu_secs_per_job = NO_VAL; char *user_str = NULL; char *assoc_str = NULL; int limit_set = 0; @@ -283,21 +289,25 @@ extern int sacctmgr_add_user(int argc, char *argv[]) addto_char_list(assoc_cond->acct_list, argv[i]+end); } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { - fairshare = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &fairshare, + "FairShare") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxCPUSecs", 4) == 0) { - max_cpu_secs_per_job = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_cpu_secs_per_job, + "MaxCPUSecs") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { - max_jobs = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_jobs, + "MaxJobs") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { - max_nodes_per_job = atoi(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_nodes_per_job, + "MaxNodes") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { - max_wall_duration_per_job = - (uint32_t) time_str2mins(argv[i]+end); - limit_set = 1; + if (get_uint(argv[i]+end, &max_wall_duration_per_job, + "MaxWall") == SLURM_SUCCESS) + limit_set = 1; } else if (strncasecmp (argv[i], "Names", 1) == 0) { addto_char_list(assoc_cond->user_list, argv[i]+end); } else if (strncasecmp (argv[i], "Partitions", 1) == 0) { @@ -575,16 +585,16 @@ no_default: if(limit_set) { printf(" Non Default Settings\n"); - if((int)fairshare != -2) + if(fairshare != NO_VAL) printf(" Fairshare = %u\n", fairshare); - if((int)max_cpu_secs_per_job != -2) + if(max_cpu_secs_per_job != NO_VAL) printf(" MaxCPUSecs = %u\n", max_cpu_secs_per_job); - if((int)max_jobs != -2) + if(max_jobs != NO_VAL) printf(" MaxJobs = %u\n", max_jobs); - if((int)max_nodes_per_job != -2) + if(max_nodes_per_job != NO_VAL) printf(" MaxNodes = %u\n", max_nodes_per_job); - if((int)max_wall_duration_per_job != -2) { + if(max_wall_duration_per_job != NO_VAL) { char time_buf[32]; mins2time_str((time_t) max_wall_duration_per_job, time_buf, sizeof(time_buf)); @@ -711,12 +721,12 @@ extern int sacctmgr_list_user(int argc, char *argv[]) maxjobs_field.name = "MaxJobs"; maxjobs_field.len = 7; - maxjobs_field.print_routine = print_int; + maxjobs_field.print_routine = print_uint; list_append(print_fields_list, &maxjobs_field); maxnodes_field.name = "MaxNodes"; maxnodes_field.len = 8; - maxnodes_field.print_routine = print_int; + maxnodes_field.print_routine = print_uint; list_append(print_fields_list, &maxnodes_field); maxwall_field.name = "MaxWall"; @@ -754,10 +764,10 @@ extern int sacctmgr_list_user(int argc, char *argv[]) assoc->cluster); print_str(VALUE, &acct_field, assoc->acct); print_str(VALUE, &part_field, assoc->partition); - print_int(VALUE, &maxjobs_field, - assoc->max_jobs); - print_int(VALUE, &maxnodes_field, - assoc->max_nodes_per_job); + print_uint(VALUE, &maxjobs_field, + assoc->max_jobs); + print_uint(VALUE, &maxnodes_field, + assoc->max_nodes_per_job); print_time(VALUE, &maxwall_field, assoc->max_wall_duration_per_job); first = 0; @@ -793,17 +803,17 @@ extern int sacctmgr_modify_user(int argc, char *argv[]) user_cond->assoc_cond->acct_list = list_create(slurm_destroy_char); user_cond->assoc_cond->cluster_list = list_create(slurm_destroy_char); user_cond->assoc_cond->partition_list = list_create(slurm_destroy_char); - user_cond->assoc_cond->fairshare = -2; - user_cond->assoc_cond->max_cpu_secs_per_job = -2; - user_cond->assoc_cond->max_jobs = -2; - user_cond->assoc_cond->max_nodes_per_job = -2; - user_cond->assoc_cond->max_wall_duration_per_job = -2; + user_cond->assoc_cond->fairshare = NO_VAL; + user_cond->assoc_cond->max_cpu_secs_per_job = NO_VAL; + user_cond->assoc_cond->max_jobs = NO_VAL; + user_cond->assoc_cond->max_nodes_per_job = NO_VAL; + user_cond->assoc_cond->max_wall_duration_per_job = NO_VAL; - assoc->fairshare = -2; - assoc->max_cpu_secs_per_job = -2; - assoc->max_jobs = -2; - assoc->max_nodes_per_job = -2; - assoc->max_wall_duration_per_job = -2; + assoc->fairshare = NO_VAL; + assoc->max_cpu_secs_per_job = NO_VAL; + assoc->max_jobs = NO_VAL; + assoc->max_nodes_per_job = NO_VAL; + assoc->max_wall_duration_per_job = NO_VAL; for (i=0; i<argc; i++) { if (strncasecmp (argv[i], "Where", 5) == 0) {