+ /* execute external program */
+ if (rule->program.operation != KEY_OP_UNSET) {
+ char program[PATH_SIZE];
+ char result[PATH_SIZE];
+
+ strlcpy(program, key_val(rule, &rule->program), sizeof(program));
+ apply_format(udev, program, sizeof(program), class_dev, sysfs_device);
+ if (run_program(program, udev->subsystem, result, sizeof(result), NULL, (udev_log_priority >= LOG_INFO)) != 0) {
+ dbg("PROGRAM is false");
+ udev->program_result[0] = '\0';
+ if (rule->program.operation != KEY_OP_NOMATCH)
+ goto exit;
+ } else {
+ int count;
+
+ dbg("PROGRAM matches");
+ remove_trailing_chars(result, '\n');
+ count = replace_untrusted_chars(result);
+ if (count)
+ info("%i untrusted character(s) replaced" , count);
+ dbg("result is '%s'", result);
+ strlcpy(udev->program_result, result, sizeof(udev->program_result));
+ dbg("PROGRAM returned successful");
+ if (rule->program.operation == KEY_OP_NOMATCH)
+ goto exit;
+ }
+ dbg("PROGRAM key is true");
+ }
+
+ /* check for matching result of external program */
+ if (match_key("RESULT", rule, &rule->result, udev->program_result))
+ goto exit;
+
+ /* import variables returned from program or or file into environment */