diff --git a/ipmitool/configure.in b/ipmitool/configure.in index 7adbe03..6ddb902 100644 --- a/ipmitool/configure.in +++ b/ipmitool/configure.in @@ -226,6 +226,9 @@ AC_CHECK_HEADER([linux/ipmi.h], dnl look for FreeIPMI files AC_CHECK_LIB(freeipmi, ipmi_open_inband, [have_free=yes], [have_free=no]) +if test "x$have_free" != "xyes"; then + AC_CHECK_LIB(freeipmi, ipmi_ctx_open_inband, [have_free=yes], [have_free=no]) +fi AC_ARG_ENABLE([intf-free], [AC_HELP_STRING([--enable-intf-free], [enable FreeIPMI IPMI interface [default=auto]])], @@ -274,7 +277,6 @@ dnl Determine if you got the right FreeIPMI version 0); ], ac_free_version_0_4_0=yes,ac_free_version_0_4_0=no) AC_MSG_RESULT($ac_free_version_0_4_0) - AC_MSG_CHECKING([for libfreeipmi version 0.5.0]) AC_TRY_COMPILE([ #include /* For size_t */ @@ -296,21 +298,44 @@ dnl Determine if you got the right FreeIPMI version ], ac_free_version_0_5_0=yes,ac_free_version_0_5_0=no) AC_MSG_RESULT($ac_free_version_0_5_0) + AC_MSG_CHECKING([for libfreeipmi version 0.6.0]) + AC_TRY_COMPILE([ +#include /* For NULL */ +#include + ], [ + ipmi_ctx_t ctx = NULL; + int rv; + ctx = ipmi_ctx_create(); + rv = ipmi_ctx_open_inband(ctx, + IPMI_DEVICE_KCS, + 0, + 0, + 0, + NULL, + 0, + 0); + ], ac_free_version_0_6_0=yes,ac_free_version_0_6_0=no) + AC_MSG_RESULT($ac_free_version_0_6_0) + if test "x$ac_free_version_0_3_0" = "xyes" \ || test "x$ac_free_version_0_4_0" = "xyes" \ - || test "x$ac_free_version_0_5_0" = "xyes"; then + || test "x$ac_free_version_0_5_0" = "xyes" \ + || test "x$ac_free_version_0_6_0" = "xyes"; then AC_DEFINE(IPMI_INTF_FREE, [1], [Define to 1 to enable FreeIPMI interface.]) AC_SUBST(INTF_FREE, [free]) AC_SUBST(INTF_FREE_LIB, [libintf_free.la]) IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB free/libintf_free.la" if test "x$ac_free_version_0_3_0" = "xyes"; then - AC_DEFINE(IPMI_INTF_FREE_VERSION_0_3_0, [1], [Define to 1 for FreeIPMI 0.3.0.]) + AC_DEFINE(IPMI_INTF_FREE_0_3_0, [1], [Define to 1 for FreeIPMI 0.3.0.]) fi if test "x$ac_free_version_0_4_0" = "xyes"; then - AC_DEFINE(IPMI_INTF_FREE_VERSION_0_4_0, [1], [Define to 1 for FreeIPMI 0.4.0.]) + AC_DEFINE(IPMI_INTF_FREE_0_4_0, [1], [Define to 1 for FreeIPMI 0.4.0.]) fi if test "x$ac_free_version_0_5_0" = "xyes"; then - AC_DEFINE(IPMI_INTF_FREE_VERSION_0_5_0, [1], [Define to 1 for FreeIPMI 0.5.0.]) + AC_DEFINE(IPMI_INTF_FREE_0_5_0, [1], [Define to 1 for FreeIPMI 0.5.0.]) + fi + if test "x$ac_free_version_0_6_0" = "xyes"; then + AC_DEFINE(IPMI_INTF_FREE_0_6_0, [1], [Define to 1 for FreeIPMI 0.6.0.]) fi else enable_intf_free=no diff --git a/ipmitool/src/plugins/free/free.c b/ipmitool/src/plugins/free/free.c index 7933221..db80d06 100644 --- a/ipmitool/src/plugins/free/free.c +++ b/ipmitool/src/plugins/free/free.c @@ -34,6 +34,10 @@ * facility. */ +#if defined(HAVE_CONFIG_H) +# include +#endif + #include #include #include @@ -43,11 +47,15 @@ #include #include +#if IPMI_INTF_FREE_0_3_0 || IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0 #include +#endif -#include - +#if IPMI_INTF_FREE_0_6_0 +ipmi_ctx_t dev = NULL; +#else /* !IPMI_INTF_FREE_0_6_0 */ ipmi_device_t dev = NULL; +#endif /* !IPMI_INTF_FREE_0_6_0 */ extern int verbose; @@ -58,7 +66,7 @@ static int ipmi_free_open(struct ipmi_intf * intf) return -1; } -#if IPMI_INTF_FREE_VERSION_0_3_0 +#if IPMI_INTF_FREE_0_3_0 if (!(dev = ipmi_open_inband (IPMI_DEVICE_KCS, 0, 0, @@ -75,9 +83,9 @@ static int ipmi_free_open(struct ipmi_intf * intf) goto cleanup; } } -#elif IPMI_INTF_FREE_VERSION_0_4_0 +#elif IPMI_INTF_FREE_0_4_0 if (!(dev = ipmi_device_create())) { - perror("ipmi_open_inband()"); + perror("ipmi_device_create"); goto cleanup; } if (ipmi_open_inband (dev, @@ -100,9 +108,9 @@ static int ipmi_free_open(struct ipmi_intf * intf) goto cleanup; } } -#elif IPMI_INTF_FREE_VERSION_0_5_0 +#elif IPMI_INTF_FREE_0_5_0 if (!(dev = ipmi_device_create())) { - perror("ipmi_open_inband()"); + perror("ipmi_device_create"); goto cleanup; } if (ipmi_open_inband (dev, @@ -127,15 +135,47 @@ static int ipmi_free_open(struct ipmi_intf * intf) goto cleanup; } } +#elif IPMI_INTF_FREE_0_6_0 + if (!(dev = ipmi_ctx_create())) { + perror("ipmi_ctx_create"); + goto cleanup; + } + if (ipmi_ctx_open_inband (dev, + IPMI_DEVICE_KCS, + 0, + 0, + 0, + NULL, + 0, + IPMI_FLAGS_DEFAULT) < 0) { + if (ipmi_ctx_open_inband (dev, + IPMI_DEVICE_SSIF, + 0, + 0, + 0, + NULL, + 0, + IPMI_FLAGS_DEFAULT) < 0) { + fprintf(stderr, + "ipmi_open_inband(): %s\n", + ipmi_ctx_strerror(ipmi_ctx_errnum(dev))); + goto cleanup; + } + } #endif intf->opened = 1; return 0; cleanup: if (dev) { +#if IPMI_INTF_FREE_0_3_0 + ipmi_close_device(dev); +#elif IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0 ipmi_close_device(dev); -#if IPMI_INTF_FREE_VERSION_0_4_0 ipmi_device_destroy(dev); +#elif IPMI_INTF_FREE_0_6_0 + ipmi_ctx_close(dev); + ipmi_ctx_destroy(dev); #endif } return -1; @@ -144,9 +184,14 @@ static int ipmi_free_open(struct ipmi_intf * intf) static void ipmi_free_close(struct ipmi_intf * intf) { if (dev) { +#if IPMI_INTF_FREE_0_3_0 + ipmi_close_device(dev); +#elif IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0 ipmi_close_device(dev); -#if IPMI_INTF_FREE_VERSION_0_4_0 ipmi_device_destroy(dev); +#elif IPMI_INTF_FREE_0_6_0 + ipmi_ctx_close(dev); + ipmi_ctx_destroy(dev); #endif } intf->opened = 0; @@ -194,12 +239,16 @@ static struct ipmi_rs * ipmi_free_send_cmd(struct ipmi_intf * intf, struct ipmi_ req->msg.data_len + 1, rs_buf, rs_buf_len)) < 0) { -#if IPMI_INTF_FREE_VERSION_0_3_0 +#if IPMI_INTF_FREE_0_3_0 perror("ipmi_cmd_raw"); -#elif IPMI_INTF_FREE_VERSION_0_4_0 +#elif IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0 fprintf(stderr, "ipmi_cmd_raw: %s\n", ipmi_device_strerror(ipmi_device_errnum(dev))); +#elif IPMI_INTF_FREE_0_6_0 + fprintf(stderr, + "ipmi_cmd_raw: %s\n", + ipmi_ctx_strerror(ipmi_ctx_errnum(dev))); #endif return NULL; }