chiark / gitweb /
udev: export udev_device_new_from_device_id()
[elogind.git] / src / udev / udev-builtin.c
index 508a22ecf8ca199bee1277dc5be60954d88ec7b8..7d89f22792ba25ceea1f6df364cfee6357b85edc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2009 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2007-2012 Kay Sievers <kay.sievers@vrfy.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,8 @@
 
 #include "udev.h"
 
+static bool initialized;
+
 static const struct udev_builtin *builtins[] = {
         [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
         [UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware,
@@ -42,15 +44,20 @@ static const struct udev_builtin *builtins[] = {
 int udev_builtin_init(struct udev *udev)
 {
         unsigned int i;
-        int err;
+        int err = 0;
+
+        if (initialized)
+                return 0;
 
-        for (i = 0; i < ARRAY_SIZE(builtins); i++) {
+        for (i = 0; i < ELEMENTSOF(builtins); i++) {
                 if (builtins[i]->init) {
                         err = builtins[i]->init(udev);
                         if (err < 0)
                                 break;
                 }
         }
+
+        initialized = true;
         return err;
 }
 
@@ -58,9 +65,14 @@ void udev_builtin_exit(struct udev *udev)
 {
         unsigned int i;
 
-        for (i = 0; i < ARRAY_SIZE(builtins); i++)
+        if (!initialized)
+                return;
+
+        for (i = 0; i < ELEMENTSOF(builtins); i++)
                 if (builtins[i]->exit)
                         builtins[i]->exit(udev);
+
+        initialized = false;
 }
 
 bool udev_builtin_validate(struct udev *udev)
@@ -68,7 +80,7 @@ bool udev_builtin_validate(struct udev *udev)
         unsigned int i;
         bool change = false;
 
-        for (i = 0; i < ARRAY_SIZE(builtins); i++)
+        for (i = 0; i < ELEMENTSOF(builtins); i++)
                 if (builtins[i]->validate)
                         if (builtins[i]->validate(udev))
                                 change = true;
@@ -79,7 +91,7 @@ void udev_builtin_list(struct udev *udev)
 {
         unsigned int i;
 
-        for (i = 0; i < ARRAY_SIZE(builtins); i++)
+        for (i = 0; i < ELEMENTSOF(builtins); i++)
                 fprintf(stderr, "  %-12s %s\n", builtins[i]->name, builtins[i]->help);
 }
 
@@ -103,7 +115,7 @@ enum udev_builtin_cmd udev_builtin_lookup(const char *command)
         pos = strchr(name, ' ');
         if (pos)
                 pos[0] = '\0';
-        for (i = 0; i < ARRAY_SIZE(builtins); i++)
+        for (i = 0; i < ELEMENTSOF(builtins); i++)
                 if (strcmp(builtins[i]->name, name) == 0)
                         return i;
         return UDEV_BUILTIN_MAX;