diff options
Diffstat (limited to 'include/ipmitool/helper.h')
-rw-r--r-- | include/ipmitool/helper.h | 113 |
1 files changed, 105 insertions, 8 deletions
diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h index bfaf284..79a5c5b 100644 --- a/include/ipmitool/helper.h +++ b/include/ipmitool/helper.h @@ -30,13 +30,16 @@ * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#ifndef IPMI_HELPER_H -#define IPMI_HELPER_H +#pragma once #include <sys/types.h> #include <inttypes.h> #include <stdio.h> #include <string.h> +#include <stdlib.h> /* For free() */ +#include <stdbool.h> + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) #ifndef TRUE #define TRUE 1 @@ -50,6 +53,12 @@ #define tboolean int #endif +#ifdef __GNUC__ + #define __UNUSED__(x) x __attribute__((unused)) +#else + #define __UNUSED__(x) x +#endif + /* IPMI spec. - UID 0 reserved, 63 maximum UID which can be used */ #ifndef IPMI_UID_MIN # define IPMI_UID_MIN 1 @@ -61,7 +70,7 @@ struct ipmi_intf; struct valstr { - uint16_t val; + uint32_t val; const char * str; }; struct oemvalstr { @@ -70,8 +79,12 @@ struct oemvalstr { const char * str; }; -const char * val2str(uint16_t val, const struct valstr * vs); -const char * oemval2str(uint32_t oem,uint16_t val, const struct oemvalstr * vs); +const char * +specific_val2str(uint32_t val, + const struct valstr *specific, + const struct valstr *generic); +const char *val2str(uint32_t val, const struct valstr * vs); +const char *oemval2str(uint32_t oem, uint32_t val, const struct oemvalstr * vs); int str2double(const char * str, double * double_ptr); int str2long(const char * str, int64_t * lng_ptr); @@ -83,6 +96,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); @@ -90,7 +105,11 @@ int is_ipmi_channel_num(const char *argv_ptr, uint8_t *channel_ptr); int is_ipmi_user_id(const char *argv_ptr, uint8_t *ipmi_uid_ptr); int is_ipmi_user_priv_limit(const char *argv_ptr, uint8_t *ipmi_priv_limit_ptr); -uint16_t str2val(const char * str, const struct valstr * vs); +uint32_t str2val32(const char *str, const struct valstr *vs); +static inline uint16_t str2val(const char *str, const struct valstr *vs) +{ + return (uint16_t)str2val32(str, vs); +} void print_valstr(const struct valstr * vs, const char * title, int loglevel); void print_valstr_2col(const struct valstr * vs, const char * title, int loglevel); @@ -109,6 +128,86 @@ FILE * ipmi_open_file(const char * file, int rw); void ipmi_start_daemon(struct ipmi_intf *intf); uint16_t ipmi_get_oem_id(struct ipmi_intf *intf); +#define IS_SET(v, b) ((v) & (1 << (b))) + +/** + * Free the memory and clear the pointer. + * @param[in] ptr - a pointer to your pointer to free. + */ +static inline void free_n(void *ptr) { + void **pptr = (void **)ptr; + + if (pptr && *pptr) { + free(*pptr); + *pptr = NULL; + } +} + +/* le16toh(), hto16le(), et. al. don't exist for Windows or Apple */ +/* For portability, let's simply define our own versions here */ + +/* IPMI is always little-endian */ +static inline uint16_t ipmi16toh(void *ipmi16) +{ + uint8_t *ipmi = (uint8_t *)ipmi16; + uint16_t h; + + h = (uint16_t)ipmi[1] << 8; /* MSB */ + h |= ipmi[0]; /* LSB */ + + return h; +} + +static inline void htoipmi16(uint16_t h, uint8_t *ipmi) +{ + ipmi[0] = h & 0xFF; /* LSB */ + ipmi[1] = h >> 8; /* MSB */ +} + +static inline uint32_t ipmi24toh(void *ipmi24) +{ + uint8_t *ipmi = (uint8_t *)ipmi24; + uint32_t h = 0; + + h = (uint32_t)ipmi[2] << 16; /* MSB */ + h |= ipmi[1] << 8; + h |= ipmi[0]; /* LSB */ + + return h; +} + +static inline void htoipmi24(uint32_t h, uint8_t *ipmi) +{ + ipmi[0] = h & 0xFF; /* LSB */ + ipmi[1] = (h >> 8) & 0xFF; + ipmi[2] = (h >> 16) & 0xFF; /* MSB */ +} + +static inline uint32_t ipmi32toh(void *ipmi32) +{ + uint8_t *ipmi = ipmi32; + uint32_t h; + + h = (uint32_t)ipmi[3] << 24; /* MSB */ + h |= ipmi[2] << 16; + h |= ipmi[1] << 8; + h |= ipmi[0]; /* LSB */ + + return h; +} + +static inline void htoipmi32(uint32_t h, uint8_t *ipmi) +{ + ipmi[0] = h & 0xFF; /* LSB */ + ipmi[1] = (h >> 8) & 0xFF; + ipmi[2] = (h >> 16) & 0xFF; + ipmi[3] = (h >> 24) & 0xFF; /* MSB */ +} + +uint8_t *array_byteswap(uint8_t *buffer, size_t length); +uint8_t *array_ntoh(uint8_t *buffer, size_t length); +uint8_t *array_letoh(uint8_t *buffer, size_t length); + #define ipmi_open_file_read(file) ipmi_open_file(file, 0) #define ipmi_open_file_write(file) ipmi_open_file(file, 1) @@ -127,5 +226,3 @@ uint16_t ipmi_get_oem_id(struct ipmi_intf *intf); #ifndef __maxlen # define __maxlen(a, b) ({ int x=strlen(a); int y=strlen(b); (x > y) ? x : y;}) #endif - -#endif /* IPMI_HELPER_H */ |