- /* collect symlinks */
- if (!event->devlink_final &&
- (rule->symlink.operation == KEY_OP_ASSIGN ||
- rule->symlink.operation == KEY_OP_ASSIGN_FINAL ||
- rule->symlink.operation == KEY_OP_ADD)) {
- char temp[UTIL_PATH_SIZE];
- char filename[UTIL_PATH_SIZE];
- char *pos, *next;
- int count = 0;
-
- if (rule->symlink.operation == KEY_OP_ASSIGN_FINAL)
- event->devlink_final = 1;
- if (rule->symlink.operation == KEY_OP_ASSIGN ||
- rule->symlink.operation == KEY_OP_ASSIGN_FINAL) {
- info(event->udev, "reset symlink list\n");
- udev_device_cleanup_devlinks_list(dev);
- }
- /* allow multiple symlinks separated by spaces */
- util_strlcpy(temp, key_val(rule, &rule->symlink), sizeof(temp));
- udev_rules_apply_format(event, temp, sizeof(temp));
- if (rule->string_escape == ESCAPE_UNSET)
- count = util_replace_chars(temp, ALLOWED_CHARS_FILE " ");
- else if (rule->string_escape == ESCAPE_REPLACE)
- count = util_replace_chars(temp, ALLOWED_CHARS_FILE);
- if (count > 0)
- info(event->udev, "%i character(s) replaced\n" , count);
- dbg(event->udev, "rule applied, added symlink(s) '%s'\n", temp);
- pos = temp;
- while (isspace(pos[0]))
- pos++;
- next = strchr(pos, ' ');
- while (next) {
- next[0] = '\0';
- info(event->udev, "add symlink '%s'\n", pos);
- util_strlcpy(filename, udev_get_dev_path(event->udev), sizeof(filename));
- util_strlcat(filename, "/", sizeof(filename));
- util_strlcat(filename, pos, sizeof(filename));
- udev_device_add_devlink(dev, filename);
- while (isspace(next[1]))
- next++;
- pos = &next[1];
- next = strchr(pos, ' ');
- }
- if (pos[0] != '\0') {
- info(event->udev, "add symlink '%s'\n", pos);
- util_strlcpy(filename, udev_get_dev_path(event->udev), sizeof(filename));
- util_strlcat(filename, "/", sizeof(filename));
- util_strlcat(filename, pos, sizeof(filename));
- udev_device_add_devlink(dev, filename);
- }
- }
-
- /* set name, later rules with name set will be ignored */
- if (rule->name.operation == KEY_OP_ASSIGN ||
- rule->name.operation == KEY_OP_ASSIGN_FINAL ||
- rule->name.operation == KEY_OP_ADD) {
- int count;
-
- name_set = 1;
- util_strlcpy(event->name, key_val(rule, &rule->name), sizeof(event->name));
- udev_rules_apply_format(event, event->name, sizeof(event->name));
- if (rule->string_escape == ESCAPE_UNSET ||
- rule->string_escape == ESCAPE_REPLACE) {
- count = util_replace_chars(event->name, ALLOWED_CHARS_FILE);
- if (count > 0)
- info(event->udev, "%i character(s) replaced\n", count);
- }
-
- info(event->udev, "rule applied, '%s' becomes '%s'\n",
- udev_device_get_sysname(dev), event->name);
- if (strcmp(udev_device_get_subsystem(dev), "net") != 0)
- dbg(event->udev, "'%s' owner='%s', group='%s', mode=%#o partitions=%i\n",
- event->name, event->owner, event->group, event->mode,
- udev_device_get_num_fake_partitions(dev));