nm: Refactor to reduce complexity of nm_suspend()

Signed-off-by: Alexander Amelkin <alexander@amelkin.msk.ru>
This commit is contained in:
Alexander Amelkin 2019-03-07 19:06:49 +03:00
parent 97da8c83ae
commit 0c8ceb78a4
No known key found for this signature in database
GPG Key ID: E893587B5B74178D

View File

@ -1649,7 +1649,51 @@ ipmi_nm_get_suspend(struct ipmi_intf *intf, uint8_t domain, uint8_t policy_id)
return 0; return 0;
} }
static int static
bool
nm_suspend_process_periods(int *argc, char **argv, struct nm_suspend *suspend)
{
bool err = true;
int count = 0;
for (; *argc > 0 && count < IPMI_NM_SUSPEND_PERIOD_MAX;
*argc -= 3, argv += 3, count++)
{
if (*argc < 3) {
lprintf(LOG_ERR,
"Error: suspend period requires a "
"start, stop, and repeat values.\n");
goto out;
}
if (str2uchar(argv[0], &suspend->period[count].start) < 0) {
lprintf(LOG_ERR,
"suspend start value %d must be 0-239.\n",
count);
goto out;
}
if (str2uchar(argv[1], &suspend->period[count].stop) < 0) {
lprintf(LOG_ERR,
"suspend stop value %d must be 0-239.\n",
count);
goto out;
}
if (str2uchar(argv[2], &suspend->period[count].repeat) < 0) {
lprintf(LOG_ERR,
"suspend repeat value %d unable to convert.\n",
count);
goto out;
}
}
if (*argc <= 0) {
err = false;
}
out:
return err;
}
static
int
ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv) ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv)
{ {
uint8_t option; uint8_t option;
@ -1657,9 +1701,7 @@ ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv)
uint8_t domain = 0; /* default domain of platform */ uint8_t domain = 0; /* default domain of platform */
uint8_t policy_id = -1; uint8_t policy_id = -1;
uint8_t have_policy_id = FALSE; uint8_t have_policy_id = FALSE;
uint8_t count = 0;
struct nm_suspend suspend; struct nm_suspend suspend;
int i;
argv++; argv++;
argc--; argc--;
@ -1667,7 +1709,8 @@ ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv)
if (!argv[0] || argc < 3 if (!argv[0] || argc < 3
|| 0xFF == (action = dcmi_str2val(argv[0], nm_suspend_cmds))) || 0xFF == (action = dcmi_str2val(argv[0], nm_suspend_cmds)))
{ {
dcmi_print_strs(nm_suspend_cmds, "Suspend commands", LOG_ERR, 0); dcmi_print_strs(nm_suspend_cmds,
"Suspend commands", LOG_ERR, 0);
return -1; return -1;
} }
memset(&suspend, 0, sizeof(suspend)); memset(&suspend, 0, sizeof(suspend));
@ -1678,8 +1721,10 @@ ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv)
option = dcmi_str2val(argv[0], nm_thresh_param); option = dcmi_str2val(argv[0], nm_thresh_param);
switch (option) { switch (option) {
case 0x01: /* get domain scope */ case 0x01: /* get domain scope */
if ((domain = dcmi_str2val(argv[1], nm_domain_vals)) == 0xFF) { domain = dcmi_str2val(argv[1], nm_domain_vals);
dcmi_print_strs(nm_domain_vals, "Domain Scope:", LOG_ERR, 0); if (0xFF == domain) {
dcmi_print_strs(nm_domain_vals,
"Domain Scope:", LOG_ERR, 0);
return -1; return -1;
} }
argc--; argc--;
@ -1688,7 +1733,8 @@ ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv)
case 0x02: /* policy ID */ case 0x02: /* policy ID */
if (str2uchar(argv[1], &policy_id) < 0) { if (str2uchar(argv[1], &policy_id) < 0) {
lprintf(LOG_ERR, lprintf(LOG_ERR,
"Policy ID must be a positive integer (0-255)\n"); "Policy ID must be a positive "
"integer (0-255)\n");
return -1; return -1;
} }
have_policy_id = TRUE; have_policy_id = TRUE;
@ -1696,34 +1742,12 @@ ipmi_nm_suspend(struct ipmi_intf *intf, int argc, char **argv)
argv++; argv++;
break; break;
case 0xFF: /* process periods */ case 0xFF: /* process periods */
for (i = 0; count < IPMI_NM_SUSPEND_PERIOD_MAX; i += 3, count++) { if (nm_suspend_process_periods(&argc, argv, &suspend)) {
if (argc < 3) { return -1;
lprintf(LOG_ERR, "Error: suspend period requires a "
"start, stop, and repeat values.\n");
return -1;
}
if (str2uchar(argv[i + 0], &suspend.period[count].start) < 0) {
lprintf(LOG_ERR, "suspend start value %d must be 0-239.\n",
count);
return -1;
}
if (str2uchar(argv[i + 1], &suspend.period[count].stop) < 0) {
lprintf(LOG_ERR, "suspend stop value %d must be 0-239.\n",
count);
return -1;
}
if (str2uchar(argv[i + 2], &suspend.period[count].repeat) < 0) {
lprintf(LOG_ERR,
"suspend repeat value %d unable to convert.\n",
count);
return -1;
}
argc -= 3;
if (argc <= 0)
break;
} }
if (argc <= 0) if (argc <= 0) {
break; break;
}
break; break;
default: default:
break; break;