chiark / gitweb /
[PATCH] fix log option code so that it actually works for all udev programs.
[elogind.git] / udev_config.c
index 262108dff7d25a09dcbcf6062928b5552ed40df6..34ef82b8812c24220819c9ff9f85ab923fa0fa22 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Userspace devfs
  *
- * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
  *
  *
  *     This program is free software; you can redistribute it and/or modify it
 
 #include "udev.h"
 #include "udev_version.h"
+#include "logging.h"
 #include "namedev.h"
 #include "libsysfs/libsysfs.h"
 
 /* global variables */
 char sysfs_path[SYSFS_PATH_MAX];
-char udev_config_dir[PATH_MAX];
 char udev_root[PATH_MAX];
 char udev_db_filename[PATH_MAX+NAME_MAX];
-char udev_permission_filename[PATH_MAX+NAME_MAX];
+char udev_permissions_filename[PATH_MAX+NAME_MAX];
 char udev_rules_filename[PATH_MAX+NAME_MAX];
 char udev_config_filename[PATH_MAX+NAME_MAX];
-char default_mode_str[NAME_MAX];
+char default_mode_str[MODE_SIZE];
+char default_owner_str[OWNER_SIZE];
+char default_group_str[GROUP_SIZE];
+int udev_log;
 
 
+static int string_is_true(char *str)
+{
+       if (strcasecmp(str, "true") == 0)
+               return 1;
+       if (strcasecmp(str, "yes") == 0)
+               return 1;
+       return 0;
+}
+
 static void init_variables(void)
 {
+       /* fill up the defaults.  
+        * If any config values are specified, they will
+        * override these values. */
        strfieldcpy(udev_root, UDEV_ROOT);
-       strfieldcpy(udev_config_dir, UDEV_CONFIG_DIR);
+       strfieldcpy(udev_db_filename, UDEV_DB);
+       strfieldcpy(udev_config_filename, UDEV_CONFIG_FILE);
+       strfieldcpy(udev_rules_filename, UDEV_RULES_FILE);
+       strfieldcpy(udev_permissions_filename, UDEV_PERMISSION_FILE);
+       udev_log = string_is_true(UDEV_LOG_DEFAULT);
 }
 
 #define set_var(_name, _var)                           \
@@ -60,6 +79,47 @@ static void init_variables(void)
                strncpy(_var, value, sizeof(_var));     \
        }
 
+#define set_bool(_name, _var)                          \
+       if (strcasecmp(variable, _name) == 0) {         \
+               dbg_parse("%s = '%s'", _name, value);   \
+               _var = string_is_true(value);           \
+       }
+
+int parse_get_pair(char **orig_string, char **left, char **right)
+{
+       char *temp;
+       char *string = *orig_string;
+
+       if (!string)
+               return -ENODEV;
+
+       /* eat any whitespace */
+       while (isspace(*string) || *string == ',')
+               ++string;
+
+       /* split based on '=' */
+       temp = strsep(&string, "=");
+       *left = temp;
+       if (!string)
+               return -ENODEV;
+
+       /* take the right side and strip off the '"' */
+       while (isspace(*string))
+               ++string;
+       if (*string == '"')
+               ++string;
+       else
+               return -ENODEV;
+
+       temp = strsep(&string, "\"");
+       if (!string || *temp == '\0')
+               return -ENODEV;
+       *right = temp;
+       *orig_string = string;
+       
+       return 0;
+}
+
 static int parse_config_file(void)
 {
        char line[255];
@@ -100,7 +160,7 @@ static int parse_config_file(void)
                if (*temp == COMMENT_CHARACTER)
                        continue;
 
-               retval = get_pair(&temp, &variable, &value);
+               retval = parse_get_pair(&temp, &variable, &value);
                if (retval)
                        break;
                
@@ -109,8 +169,11 @@ static int parse_config_file(void)
                set_var("udev_root", udev_root);
                set_var("udev_db", udev_db_filename);
                set_var("udev_rules", udev_rules_filename);
-               set_var("udev_permissions", udev_permission_filename);
+               set_var("udev_permissions", udev_permissions_filename);
                set_var("default_mode", default_mode_str);
+               set_var("default_owner", default_owner_str);
+               set_var("default_group", default_group_str);
+               set_bool("udev_log", udev_log);
        }
        dbg_parse("%s:%d:%Zd: error parsing '%s'", udev_config_filename,
                  lineno, temp - line, temp);
@@ -122,10 +185,6 @@ exit:
 static void get_dirs(void)
 {
        char *temp;
-       char *udev_db = UDEV_DB;
-       char *udev_config = UDEV_CONFIG_FILE;
-       char *udev_rules = UDEV_RULES_FILE;
-       char *udev_permission = UDEV_PERMISSION_FILE;
        int retval;
 
        retval = sysfs_get_mnt_path(sysfs_path, SYSFS_PATH_MAX);
@@ -139,51 +198,26 @@ static void get_dirs(void)
                temp = getenv("SYSFS_PATH");
                if (temp)
                        strfieldcpy(sysfs_path, temp);
-               temp = getenv("UDEV_CONFIG_DIR");
-               if (temp)
-                       strfieldcpy(udev_config_dir, temp);
-               temp = getenv("UDEV_ROOT");
-               if (temp)
-                       strfieldcpy(udev_root, temp);
-               temp = getenv("UDEV_DB");
-               if (temp)
-                       udev_db = temp;
                temp = getenv("UDEV_CONFIG_FILE");
                if (temp)
-                       udev_config = temp;
-               temp = getenv("UDEV_RULES_FILE");
-               if (temp)
-                       udev_rules = temp;
-               temp = getenv("UDEV_PERMISSION_FILE");
-               if (temp)
-                       udev_permission = temp;
+                       strfieldcpy(udev_config_filename, temp);
        }
        dbg("sysfs_path='%s'", sysfs_path);
 
-       strncpy(udev_db_filename, udev_root, sizeof(udev_db_filename));
-       strncat(udev_db_filename, udev_db, sizeof(udev_db_filename));
-
-       strncpy(udev_config_filename, udev_config_dir, sizeof(udev_config_filename));
-       strncat(udev_config_filename, udev_config, sizeof(udev_config_filename));
-       
-       strncpy(udev_rules_filename, udev_config_dir, sizeof(udev_permission_filename));
-       strncat(udev_rules_filename, udev_rules, sizeof(udev_permission_filename));
-
-       strncpy(udev_permission_filename, udev_config_dir, sizeof(udev_permission_filename));
-       strncat(udev_permission_filename, udev_permission, sizeof(udev_permission_filename));
-
        dbg_parse("udev_root = %s", udev_root);
        dbg_parse("udev_config_filename = %s", udev_config_filename);
        dbg_parse("udev_db_filename = %s", udev_db_filename);
        dbg_parse("udev_rules_filename = %s", udev_rules_filename);
-       dbg_parse("udev_permission_filename = %s", udev_permission_filename);
+       dbg_parse("udev_permissions_filename = %s", udev_permissions_filename);
+       dbg_parse("udev_log = %d", udev_log);
        parse_config_file();
 
        dbg_parse("udev_root = %s", udev_root);
        dbg_parse("udev_config_filename = %s", udev_config_filename);
        dbg_parse("udev_db_filename = %s", udev_db_filename);
        dbg_parse("udev_rules_filename = %s", udev_rules_filename);
-       dbg_parse("udev_permission_filename = %s", udev_permission_filename);
+       dbg_parse("udev_permissions_filename = %s", udev_permissions_filename);
+       dbg_parse("udev_log_str = %d", udev_log);
 }
 
 void udev_init_config(void)