From c14bd833b7b1b3b1283d116a87b6f293377f129b Mon Sep 17 00:00:00 2001 From: Radek Novacek Date: Mon, 8 Apr 2013 11:09:53 +0200 Subject: Support for using libopenlmicommon by external providers * add FindOpenLMI.cmake module * add pkgconfig for OpenLMI * add openlmi.c/h with exported functions * add symlink with major version to openlmicommon library Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=948948 --- src/openlmi.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/openlmi.c (limited to 'src/openlmi.c') diff --git a/src/openlmi.c b/src/openlmi.c new file mode 100644 index 0000000..786bdd2 --- /dev/null +++ b/src/openlmi.c @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2012-2013 Red Hat, Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Radek Novacek + */ + +#include "openlmi.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +static char *_fqdn = NULL; +static int _log_level = _LMI_DEBUG_DEBUG; +static const CMPIBroker *_cb = NULL; +static char *_log_id = NULL; + +static char *getFQDN(void) +{ + struct utsname uts; + if ((uname(&uts) > 0) && (uts.nodename != NULL)) { + return strdup(uts.nodename); + } + char hostname[256]; + hostname[255] = '\0'; + if (gethostname(hostname, 255) == -1) { + // FIXME: what to do, if we can't use gethostname? + return NULL; + } + + struct addrinfo hints; + struct addrinfo *info = NULL, *p; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; // either IPV4 or IPV6 + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_CANONNAME; + + if (getaddrinfo(hostname, "http", &hints, &info) == 0) { + for (p = info; p != NULL; p = p->ai_next) { + if (p->ai_canonname && strstr(p->ai_canonname, "localhost") == NULL) { + char *dn = strdup(p->ai_canonname); + freeaddrinfo(info); + return dn; + } + } + } + if (info != NULL) { + freeaddrinfo(info); + } + return strdup(hostname); +} + +const char *lmi_get_system_name() +{ + if (_fqdn == NULL) { + _fqdn = getFQDN(); + } + return _fqdn; +} + +const char *lmi_get_system_creation_class_name() +{ + return "Linux_ComputerSystem"; +} + +void lmi_init_logging(const char *log_id, const CMPIBroker *cb) +{ + if (_log_id != NULL) { + free(_log_id); + } + _log_id = strdup(log_id); + _cb = cb; +} + +int lmi_log_level(void) +{ + return _log_level; +} + +void lmi_set_log_level(int level) +{ + _log_level = level; +} + +void _lmi_debug(int level, const char *file, int line, const char *format, ...) +{ + const char *lvl[] = { "NONE", "ERROR", "INFO", "WARNING", "DEBUG" }; + if (level > 4) { + level = 4; + } + if (level < 1) { + level = 1; + } + + char *message, *text; + va_list args; + va_start(args, format); + vasprintf(&message, format, args); + va_end(args); + asprintf(&text, "[%s] %s:%d\t%s", lvl[level], file, line, message); + free(message); + + CMPIStatus rc; + rc.rc = CMPI_RC_OK; + if (_cb != NULL) { + // try to use standard CMPI logging + rc = _cb->eft->trace(_cb, CMPI_LEV_INFO, _log_id, text, NULL); + } + + if (_cb == NULL || rc.rc != CMPI_RC_OK) { + // Fallback to stderr + if (level > _log_level) { + free(text); + return; + } + + fprintf(stderr, "%s\n", text); + } + free(text); +} -- cgit