summaryrefslogtreecommitdiffstats
path: root/src/openlmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/openlmi.c')
-rw-r--r--src/openlmi.c139
1 files changed, 139 insertions, 0 deletions
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 <rnovacek@redhat.com>
+ */
+
+#include "openlmi.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/utsname.h>
+#include <string.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <cmpimacs.h>
+
+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);
+}