diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c index a9a3f2886f5769c6c8b0f402c653906a9c4de1be..8e99f01484bc8b81a6ef59be4a0abb7d31224194 100644 --- a/src/common/slurm_protocol_defs.c +++ b/src/common/slurm_protocol_defs.c @@ -111,17 +111,19 @@ extern void slurm_destroy_char(void *object) xfree(tmp); } -extern void slurm_addto_char_list(List char_list, char *names) +/* returns number of objects added to list */ +extern int slurm_addto_char_list(List char_list, char *names) { int i=0, start=0; char *name = NULL, *tmp_char = NULL; ListIterator itr = NULL; char quote_c = '\0'; int quote = 0; + int count = 0; if(!char_list) { error("No list was given to fill in"); - return; + return 0; } itr = list_iterator_create(char_list); @@ -152,6 +154,7 @@ extern void slurm_addto_char_list(List char_list, char *names) if(!tmp_char) { _make_lower(name); list_append(char_list, name); + count++; } else xfree(name); list_iterator_reset(itr); @@ -178,11 +181,13 @@ extern void slurm_addto_char_list(List char_list, char *names) if(!tmp_char) { _make_lower(name); list_append(char_list, name); + count++; } else xfree(name); } } list_iterator_destroy(itr); + return count; } void slurm_free_last_update_msg(last_update_msg_t * msg) diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h index 83036f60ac943dd002258c78887a1f51260ea3f3..41793131688b80291f9d6bfab5f2e8f811933aa8 100644 --- a/src/common/slurm_protocol_defs.h +++ b/src/common/slurm_protocol_defs.h @@ -746,7 +746,7 @@ extern void slurm_msg_t_init (slurm_msg_t *msg); extern void slurm_msg_t_copy(slurm_msg_t *dest, slurm_msg_t *src); extern void slurm_destroy_char(void *object); -extern void slurm_addto_char_list(List char_list, char *names); +extern int slurm_addto_char_list(List char_list, char *names); /* free message functions */ void inline slurm_free_checkpoint_tasks_msg(checkpoint_tasks_msg_t * msg); diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c index eb780c04dd6172b6dcd77ff60bf5bee6a0e7a896..d63491eb3968ffa148451d8667f333fc537a878e 100644 --- a/src/sacctmgr/account_functions.c +++ b/src/sacctmgr/account_functions.c @@ -81,26 +81,27 @@ static int _set_cond(int *start, int argc, char *argv[], acct_cond->assoc_cond->acct_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(acct_cond->assoc_cond->acct_list, - argv[i]+end); - u_set = 1; + if(slurm_addto_char_list( + acct_cond->assoc_cond->acct_list, + argv[i]+end)) + u_set = 1; } else if (!strncasecmp (argv[i], "Clusters", 1)) { if(!acct_cond->assoc_cond->cluster_list) { acct_cond->assoc_cond->cluster_list = list_create(slurm_destroy_char); } - slurm_addto_char_list( - acct_cond->assoc_cond->cluster_list, - argv[i]+end); - a_set = 1; + if(slurm_addto_char_list( + acct_cond->assoc_cond->cluster_list, + argv[i]+end)) + a_set = 1; } else if (!strncasecmp (argv[i], "Descriptions", 1)) { if(!acct_cond->description_list) { acct_cond->description_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(acct_cond->description_list, - argv[i]+end); - u_set = 1; + if(slurm_addto_char_list(acct_cond->description_list, + argv[i]+end)) + u_set = 1; } else if (!strncasecmp (argv[i], "Format", 1)) { if(format_list) slurm_addto_char_list(format_list, argv[i]+end); @@ -109,9 +110,9 @@ static int _set_cond(int *start, int argc, char *argv[], acct_cond->organization_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(acct_cond->organization_list, - argv[i]+end); - u_set = 1; + if(slurm_addto_char_list(acct_cond->organization_list, + argv[i]+end)) + u_set = 1; } else if (!strncasecmp (argv[i], "Parent", 1)) { acct_cond->assoc_cond->parent_acct = strip_quotes(argv[i]+end, NULL); @@ -176,19 +177,19 @@ static int _set_rec(int *start, int argc, char *argv[], u_set = 1; } else if (!strncasecmp (argv[i], "FairShare", 1)) { if (get_uint(argv[i]+end, &assoc->fairshare, - "FairShare") == SLURM_SUCCESS) + "FairShare") == SLURM_SUCCESS) a_set = 1; } else if (!strncasecmp (argv[i], "MaxCPUSec", 4)) { if (get_uint(argv[i]+end, &assoc->max_cpu_secs_per_job, - "MaxCPUSec") == SLURM_SUCCESS) + "MaxCPUSec") == SLURM_SUCCESS) a_set = 1; } else if (!strncasecmp (argv[i], "MaxJobs", 4)) { if (get_uint(argv[i]+end, &assoc->max_jobs, - "MaxJobs") == SLURM_SUCCESS) + "MaxJobs") == SLURM_SUCCESS) a_set = 1; } else if (!strncasecmp (argv[i], "MaxNodes", 4)) { if (get_uint(argv[i]+end, &assoc->max_nodes_per_job, - "MaxNodes") == SLURM_SUCCESS) + "MaxNodes") == SLURM_SUCCESS) a_set = 1; } else if (!strncasecmp (argv[i], "MaxWall", 4)) { mins = time_str2mins(argv[i]+end); @@ -198,7 +199,7 @@ static int _set_rec(int *start, int argc, char *argv[], a_set = 1; } else { printf(" Bad MaxWall time format: %s\n", - argv[i]); + argv[i]); } } else if (!strncasecmp (argv[i], "Organization", 1)) { acct->organization = strip_quotes(argv[i]+end, NULL); @@ -1151,6 +1152,7 @@ extern int sacctmgr_delete_account(int argc, char *argv[]) xmalloc(sizeof(acct_account_cond_t)); int i=0; List ret_list = NULL; + ListIterator itr = NULL; int set = 0; if(!(set = _set_cond(&i, argc, argv, acct_cond, NULL))) { @@ -1159,6 +1161,28 @@ extern int sacctmgr_delete_account(int argc, char *argv[]) return SLURM_ERROR; } + /* check to see if person is trying to remove root account. This is + * bad, and should not be allowed outside of deleting a cluster. + */ + if(acct_cond->assoc_cond + && acct_cond->assoc_cond->acct_list + && list_count(acct_cond->assoc_cond->acct_list)) { + char *tmp_char = NULL; + itr = list_iterator_create(acct_cond->assoc_cond->acct_list); + while((tmp_char = list_next(itr))) { + if(!strcasecmp(tmp_char, "root")) + break; + } + list_iterator_destroy(itr); + if(tmp_char) { + printf(" You are not allowed to remove " + "the root account.\n" + " Use remove cluster instead.\n"); + destroy_acct_account_cond(acct_cond); + return SLURM_ERROR; + } + } + notice_thread_init(); if(set == 1) { ret_list = acct_storage_g_remove_accounts( diff --git a/src/sacctmgr/cluster_functions.c b/src/sacctmgr/cluster_functions.c index 79309326c72dd9e9f143c6e5044d90300ea66ec4..90960ac7aa1271e900b1fb33983e4ab712ed8535 100644 --- a/src/sacctmgr/cluster_functions.c +++ b/src/sacctmgr/cluster_functions.c @@ -56,9 +56,9 @@ static int _set_cond(int *start, int argc, char *argv[], continue; } else if(!end || !strncasecmp (argv[i], "Names", 1)) { if(cluster_list) { - slurm_addto_char_list(cluster_list, - argv[i]+end); - set = 1; + if(slurm_addto_char_list(cluster_list, + argv[i]+end)) + set = 1; } } else if (!strncasecmp (argv[i], "Format", 1)) { if(format_list) diff --git a/src/sacctmgr/common.c b/src/sacctmgr/common.c index 55efdb1841444aa6c45e4fc0ef28b10f8869ab84..d043fcdf95a6ccb7b492fda16daaaba06032a61b 100644 --- a/src/sacctmgr/common.c +++ b/src/sacctmgr/common.c @@ -540,8 +540,8 @@ extern int get_uint(char *in_value, uint32_t *out_value, char *type) return SLURM_SUCCESS; } -extern void addto_qos_char_list(List char_list, List qos_list, char *names, - int option) +extern int addto_qos_char_list(List char_list, List qos_list, char *names, + int option) { int i=0, start=0; char *name = NULL, *tmp_char = NULL; @@ -549,15 +549,16 @@ extern void addto_qos_char_list(List char_list, List qos_list, char *names, char quote_c = '\0'; int quote = 0; uint32_t id=0; + int count = 0; if(!char_list) { error("No list was given to fill in"); - return; + return 0; } if(!qos_list || !list_count(qos_list)) { debug2("No real qos_list"); - return; + return 0; } itr = list_iterator_create(char_list); @@ -596,6 +597,7 @@ extern void addto_qos_char_list(List char_list, List qos_list, char *names, if(!tmp_char) { list_append(char_list, name); + count++; } else xfree(name); } @@ -630,14 +632,16 @@ extern void addto_qos_char_list(List char_list, List qos_list, char *names, break; } - if(!tmp_char) + if(!tmp_char) { list_append(char_list, name); - else + count++; + } else xfree(name); } } end_it: list_iterator_destroy(itr); + return count; } extern void sacctmgr_print_coord_list(print_field_t *field, List value) diff --git a/src/sacctmgr/qos_functions.c b/src/sacctmgr/qos_functions.c index 3b9b1d398a106a2b7d5bc54dee82dad15f056b18..9be093173d05d15ae0617fb34249d7ff49253465 100644 --- a/src/sacctmgr/qos_functions.c +++ b/src/sacctmgr/qos_functions.c @@ -66,23 +66,25 @@ static int _set_cond(int *start, int argc, char *argv[], qos_cond->name_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(qos_cond->name_list, argv[i]+end); - set = 1; + if(slurm_addto_char_list(qos_cond->name_list, + argv[i]+end)) + set = 1; } else if(!strncasecmp (argv[i], "Descriptions", 1)) { if(!qos_cond->description_list) { qos_cond->description_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(qos_cond->description_list, - argv[i]+end); - set = 1; + if(slurm_addto_char_list(qos_cond->description_list, + argv[i]+end)) + set = 1; } else if(!strncasecmp (argv[i], "Ids", 1)) { if(!qos_cond->id_list) { qos_cond->id_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(qos_cond->id_list, argv[i]+end); - set = 1; + if(slurm_addto_char_list(qos_cond->id_list, + argv[i]+end)) + set = 1; } else { printf(" Unknown condition: %s\n" " Use keyword 'set' to modify " diff --git a/src/sacctmgr/sacctmgr.h b/src/sacctmgr/sacctmgr.h index 342c1083a6ff409fbfdc7d01949d28a3f0371ae1..b935efa51b0c21ca75837f7e8c8f3d3d19d3aee3 100644 --- a/src/sacctmgr/sacctmgr.h +++ b/src/sacctmgr/sacctmgr.h @@ -144,8 +144,8 @@ 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); -extern void addto_qos_char_list(List char_list, List qos_list, char *names, - int option); +extern int addto_qos_char_list(List char_list, List qos_list, char *names, + int option); extern void sacctmgr_print_coord_list(print_field_t *field, List value); extern void sacctmgr_print_qos_list(print_field_t *field, List qos_list, List value); diff --git a/src/sacctmgr/txn_functions.c b/src/sacctmgr/txn_functions.c index e15ba87851ae3954cbbaaea2ffa97e781554ab36..3322040b930d9fa3144b8fab4af2f87bc7099e3f 100644 --- a/src/sacctmgr/txn_functions.c +++ b/src/sacctmgr/txn_functions.c @@ -58,25 +58,26 @@ static int _set_cond(int *start, int argc, char *argv[], txn_cond->id_list = list_create(slurm_destroy_char); - slurm_addto_char_list(txn_cond->id_list, argv[i]+end); - set = 1; + if(slurm_addto_char_list(txn_cond->id_list, + argv[i]+end)) + set = 1; } else if (!strncasecmp (argv[i], "Action", 4)) { /* FIX ME! fill this in */ /* if(!txn_cond->action_list) */ /* txn_cond->action_list = */ /* list_create(slurm_destroy_char); */ -/* slurm_addto_char_list(txn_cond->action_list, */ -/* argv[i]+end); */ +/* if(slurm_addto_char_list(txn_cond->action_list, */ +/* argv[i]+end)) */ /* set = 1; */ } else if (!strncasecmp (argv[i], "Actors", 4) || !strncasecmp (argv[i], "User", 1)) { if(!txn_cond->actor_list) txn_cond->actor_list = list_create(slurm_destroy_char); - slurm_addto_char_list(txn_cond->actor_list, - argv[i]+end); - set = 1; + if(slurm_addto_char_list(txn_cond->actor_list, + argv[i]+end)) + set = 1; } else if (!strncasecmp (argv[i], "Format", 1)) { if(format_list) slurm_addto_char_list(format_list, argv[i]+end); diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c index 41e7afcff40cce41220228207e58a32b6183d1d8..c5a2d9339b06502b6beb31d7fb51de83365b7759 100644 --- a/src/sacctmgr/user_functions.c +++ b/src/sacctmgr/user_functions.c @@ -81,17 +81,19 @@ static int _set_cond(int *start, int argc, char *argv[], user_cond->assoc_cond->user_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(user_cond->assoc_cond->user_list, - argv[i]+end); - u_set = 1; + if(slurm_addto_char_list( + user_cond->assoc_cond->user_list, + argv[i]+end)) + u_set = 1; } else if (!strncasecmp (argv[i], "Account", 2)) { if(!user_cond->assoc_cond->acct_list) { user_cond->assoc_cond->acct_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(user_cond->assoc_cond->acct_list, - argv[i]+end); - a_set = 1; + if(slurm_addto_char_list( + user_cond->assoc_cond->acct_list, + argv[i]+end)) + a_set = 1; } else if (!strncasecmp (argv[i], "AdminLevel", 2)) { user_cond->admin_level = str_2_acct_admin_level(argv[i]+end); @@ -101,17 +103,18 @@ static int _set_cond(int *start, int argc, char *argv[], user_cond->assoc_cond->cluster_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(user_cond->assoc_cond->cluster_list, - argv[i]+end); - a_set = 1; + if(slurm_addto_char_list( + user_cond->assoc_cond->cluster_list, + argv[i]+end)) + a_set = 1; } else if (!strncasecmp (argv[i], "DefaultAccount", 1)) { if(!user_cond->def_acct_list) { user_cond->def_acct_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(user_cond->def_acct_list, - argv[i]+end); - u_set = 1; + if(slurm_addto_char_list(user_cond->def_acct_list, + argv[i]+end)) + u_set = 1; } else if (!strncasecmp (argv[i], "Format", 1)) { if(format_list) slurm_addto_char_list(format_list, argv[i]+end); @@ -120,9 +123,10 @@ static int _set_cond(int *start, int argc, char *argv[], user_cond->assoc_cond->partition_list = list_create(slurm_destroy_char); } - slurm_addto_char_list(user_cond->assoc_cond->partition_list, - argv[i]+end); - a_set = 1; + if(slurm_addto_char_list( + user_cond->assoc_cond->partition_list, + argv[i]+end)) + a_set = 1; } else if (!strncasecmp (argv[i], "QosLevel", 1)) { int option = 0; if(!user_cond->qos_list) { @@ -188,14 +192,14 @@ static int _set_rec(int *start, int argc, char *argv[], if(!association) continue; if (get_uint(argv[i]+end, &association->fairshare, - "FairShare") == SLURM_SUCCESS) + "FairShare") == SLURM_SUCCESS) a_set = 1; } else if (!strncasecmp (argv[i], "MaxCPUSec", 4)) { if(!association) continue; if (get_uint(argv[i]+end, - &association->max_cpu_secs_per_job, - "MaxCPUSec") == SLURM_SUCCESS) + &association->max_cpu_secs_per_job, + "MaxCPUSec") == SLURM_SUCCESS) a_set = 1; } else if (!strncasecmp (argv[i], "MaxJobs", 4)) { if(!association)