summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 7549e5e)
raw | patch | inline | side by side (parent: 7549e5e)
author | Florian Forster <ff@octo.it> | |
Sun, 2 May 2010 07:24:58 +0000 (09:24 +0200) | ||
committer | Florian Forster <octo@leeloo.lan.home.verplant.org> | |
Sun, 2 May 2010 07:24:58 +0000 (09:24 +0200) |
graph_list.c | patch | blob | history |
diff --git a/graph_list.c b/graph_list.c
index 1306335d3cdd9a84f69cc16efbfe17a25327cf45..eeab51a05190eef6f21ad2a36f9d21c174bcdd3f 100644 (file)
--- a/graph_list.c
+++ b/graph_list.c
#include <string.h>
#include <time.h>
#include <errno.h>
+#include <assert.h>
#include "graph_list.h"
#include "common.h"
static size_t graph_list_length = 0;
static time_t gl_last_update = 0;
+/* "Safe" version of strcmp(3): Either or both pointers may be NULL. */
+static int strcmp_s (const char *s1, const char *s2) /* {{{ */
+{
+ if ((s1 == NULL) && (s2 == NULL))
+ return (0);
+ else if (s1 == NULL)
+ return (1);
+ else if (s2 == NULL)
+ return (-1);
+ assert ((s1 != NULL) && (s2 != NULL));
+
+ return (strcmp (s1, s2));
+} /* }}} int strcmp_s */
+
+static int gl_compare (const void *p0, const void *p1) /* {{{ */
+{
+ const graph_list_t *gl0 = p0;
+ const graph_list_t *gl1 = p1;
+ int status;
+
+ status = strcmp (gl0->host, gl1->host);
+ if (status != 0)
+ return (status);
+
+ status = strcmp (gl0->plugin, gl1->plugin);
+ if (status != 0)
+ return (status);
+
+ status = strcmp_s (gl0->plugin_instance, gl1->plugin_instance);
+ if (status != 0)
+ return (status);
+
+ status = strcmp (gl0->type, gl1->type);
+ if (status != 0)
+ return (status);
+
+ return (strcmp_s (gl0->type_instance, gl1->type_instance));
+} /* }}} int gl_compare */
+
static void gl_clear_entry (graph_list_t *gl) /* {{{ */
{
if (gl == NULL)
gl->type_instance = NULL;
} /* }}} void gl_clear_entry */
-static void gl_clear (void)
+static void gl_clear (void) /* {{{ */
{
size_t i;
gl.type = NULL;
gl.type_instance = NULL;
- /* TODO: Free old list */
-
status = foreach_host (callback_host, &gl);
+
+ if (graph_list_length > 1)
+ qsort (graph_list, graph_list_length, sizeof (*graph_list), gl_compare);
+
return (status);
} /* }}} int gl_update */