diff --git a/include/ipmitool/ipmi_user.h b/include/ipmitool/ipmi_user.h index 4a8e481..14ae2d9 100644 --- a/include/ipmitool/ipmi_user.h +++ b/include/ipmitool/ipmi_user.h @@ -88,8 +88,12 @@ struct user_access_rsp { #pragma pack(0) #endif - +struct user_name_t { + uint8_t user_id; + uint8_t user_name[17]; +}; int ipmi_user_main(struct ipmi_intf *, int, char **); +int _ipmi_get_user_name(struct ipmi_intf *intf, struct user_name_t *user_name); #endif /* IPMI_USER_H */ diff --git a/lib/ipmi_user.c b/lib/ipmi_user.c index 140b19b..456b7a3 100644 --- a/lib/ipmi_user.c +++ b/lib/ipmi_user.c @@ -58,6 +58,41 @@ extern int csv_output; #define IPMI_PASSWORD_SET_PASSWORD 0x02 #define IPMI_PASSWORD_TEST_PASSWORD 0x03 +/* _ipmi_get_user_name - Fetch User Name for given User ID. User Name is stored + * into passed structure. + * + * @intf - ipmi interface + * @user_name - user_name_t struct with UID set + * + * returns - negative number means error, positive is a ccode + */ +int +_ipmi_get_user_name(struct ipmi_intf *intf, struct user_name_t *user_name_ptr) +{ + struct ipmi_rq req = {0}; + struct ipmi_rs *rsp; + uint8_t data[1]; + if (user_name_ptr == NULL) { + return (-3); + } + data[0] = user_name_ptr->user_id & 0x3F; + req.msg.netfn = IPMI_NETFN_APP; + req.msg.cmd = IPMI_GET_USER_NAME; + req.msg.data = data; + req.msg.data_len = 1; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + return (-1); + } else if (rsp->ccode > 0) { + return rsp->ccode; + } else if (rsp->data_len != 17) { + return (-2); + } + memset(user_name_ptr->user_name, '\0', 17); + memcpy(user_name_ptr->user_name, rsp->data, 16); + return rsp->ccode; +} + /* * ipmi_get_user_access *