diff options
Diffstat (limited to 'usr/src/cmd/devfsadm/devfsadm.c')
-rw-r--r-- | usr/src/cmd/devfsadm/devfsadm.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/usr/src/cmd/devfsadm/devfsadm.c b/usr/src/cmd/devfsadm/devfsadm.c index d368e03ad2..9b719ac04c 100644 --- a/usr/src/cmd/devfsadm/devfsadm.c +++ b/usr/src/cmd/devfsadm/devfsadm.c @@ -8257,6 +8257,41 @@ lookup_network_dev_name(char *node_path, char *driver_name) return (dev_name); } +static char * +lookup_printer_dev_name(char *node_path) +{ + struct devlink_cb_arg cb_arg; + char *dev_name = NULL; + int i; + +#define DEV_PRINTERS "/dev/printers/" + + cb_arg.count = 0; + cb_arg.rv = 0; + (void) di_devlink_cache_walk(devlink_cache, NULL, node_path, + DI_PRIMARY_LINK, &cb_arg, devlink_cb); + + if (cb_arg.rv == -1 || cb_arg.count == 0) + return (NULL); + + /* first try lookup based on /dev/printers name */ + for (i = 0; i < cb_arg.count; i++) { + if (strncmp(cb_arg.dev_names[i], DEV_PRINTERS, + sizeof (DEV_PRINTERS) - 1) == 0) { + dev_name = s_strdup(cb_arg.dev_names[i]); + break; + } + } + + /* fallback to the first name */ + if ((dev_name == NULL) && (cb_arg.count > 0)) + dev_name = s_strdup(cb_arg.dev_names[0]); + + free_dev_names(&cb_arg); + + return (dev_name); +} + /* * Build an nvlist containing all attributes for devfs events. * Returns nvlist pointer on success, NULL on failure. @@ -8303,6 +8338,11 @@ build_event_attributes(char *class, char *subclass, char *node_path, dev_name_lookup_err = 1; goto out; } + } else if (strcmp(subclass, ESC_PRINTER) == 0) { + if ((dev_name = lookup_printer_dev_name(node_path)) == NULL) { + dev_name_lookup_err = 1; + goto out; + } } if (dev_name) { |