From e11f463b4ea988dfe4314b2fd3d9c91315f10965 Mon Sep 17 00:00:00 2001 From: Alexander Amelkin Date: Mon, 27 May 2019 20:05:36 +0300 Subject: [PATCH] Add a helper args2buf() function The function converts a set of command line arguments representing byte values into a byte buffer and verifies each individual value to be a valid data byte. Signed-off-by: Alexander Amelkin --- include/ipmitool/helper.h | 3 +++ lib/helper.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h index 237eb31..ccb538c 100644 --- a/include/ipmitool/helper.h +++ b/include/ipmitool/helper.h @@ -38,6 +38,7 @@ #include #include #include /* For free() */ +#include #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) @@ -92,6 +93,8 @@ int str2ushort(const char * str, uint16_t * ushrt_ptr); int str2char(const char * str, int8_t * chr_ptr); int str2uchar(const char * str, uint8_t * uchr_ptr); +bool args2buf(int argc, char *argv[], uint8_t *out, size_t len); + int eval_ccode(const int ccode); int is_fru_id(const char *argv_ptr, uint8_t *fru_id_ptr); diff --git a/lib/helper.c b/lib/helper.c index f19fbce..46c4282 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -1080,3 +1080,35 @@ ipmi_get_oem_id(struct ipmi_intf *intf) return oem_id; } + +/** Parse command line arguments as numeric byte values (dec or hex) + * and store them in a \p len sized buffer \p out. + * + * @param[in] argc Number of arguments + * @param[in] argv Array of arguments + * @param[out] out The output buffer + * @param[in] len Length of the output buffer in bytes (no null-termination + * is assumed, the input data is treated as raw byte values, + * not as a string. + * + * @returns A success status indicator + * @return false Error + * @return true Success + */ +bool +args2buf(int argc, char *argv[], uint8_t *out, size_t len) +{ + size_t i; + + for (i = 0; i < len && i < (size_t)argc; ++i) { + uint8_t byte; + + if (str2uchar(argv[i], &byte)) { + lprintf(LOG_ERR, "Bad byte value: %s", argv[i]); + return false; + } + + out[i] = byte; + } + return true; +}