initscript: pass complete path to pidfile to status command
[sliver-openvswitch.git] / lib / cfg.c
index a53e6e3..d0170b6 100644 (file)
--- a/lib/cfg.c
+++ b/lib/cfg.c
@@ -92,6 +92,12 @@ static bool is_type(const char *s, enum cfg_flags);
 #define CC_FILE_NAME CC_ALNUM "._-"
 #define CC_KEY CC_ALNUM "._-@$:+"
 
+void
+cfg_init(void)
+{
+    svec_terminate(&cfg);
+}
+
 /* Sets 'file_name' as the configuration file read by cfg_read().  Returns 0 on
  * success, otherwise a positive errno value if 'file_name' cannot be opened.
  *
@@ -130,7 +136,7 @@ cfg_set_file(const char *file_name)
     slash = strrchr(file_name, '/');
     if (slash) {
         lock_name = xasprintf("%.*s/.%s.~lock~",
-                              slash - file_name, file_name, slash + 1);
+                              (int) (slash - file_name), file_name, slash + 1);
     } else {
         lock_name = xasprintf(".%s.~lock~", file_name);
     }
@@ -183,6 +189,7 @@ cfg_read(void)
     file = fopen(cfg_name, "r");
     if (!file) {
         VLOG_ERR("failed to open \"%s\": %s", cfg_name, strerror(errno));
+        svec_terminate(&cfg);
         return errno;
     }
 
@@ -676,6 +683,25 @@ cfg_del_match(const char *pattern_, ...)
     free(pattern);
 }
 
+/* Fills 'svec' with all of the key-value pairs that match shell glob pattern
+ * 'pattern'.  The caller must first initialize 'svec'. */
+void
+cfg_get_matches(struct svec *svec, const char *pattern_, ...)
+{
+    char *pattern;
+    char **p;
+
+    FORMAT_KEY(pattern_, pattern);
+
+    for (p = cfg.names; *p; p++) {
+        if (!fnmatch(pattern, *p, 0)) {
+            svec_add(svec, *p);
+        }
+    }
+
+    free(pattern);
+}
+
 /* Fills 'svec' with all of the key-value pairs that have sections that
  * begin with 'section'.  The caller must first initialize 'svec'. */
 void