diff options
Diffstat (limited to 'usr/src/cmd/hal/utils/printer.c')
-rw-r--r-- | usr/src/cmd/hal/utils/printer.c | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/usr/src/cmd/hal/utils/printer.c b/usr/src/cmd/hal/utils/printer.c new file mode 100644 index 0000000000..0299ea6bb1 --- /dev/null +++ b/usr/src/cmd/hal/utils/printer.c @@ -0,0 +1,148 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * Licensed under the Academic Free License version 2.1 + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> +#include <strings.h> +#include <ctype.h> +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <ctype.h> + +#include <libhal.h> +#include <logger.h> + +#include "printer.h" + +static char * +strip_ws(char *s) +{ + if (s != NULL) { + char *p; + + /* skip the leading whitespace */ + for (; ((*s != NULL) && (isspace(*s) != 0)); s++); + + /* drop the trailing whitespace */ + for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0)); + p--); + *(++p) = '\0'; + } + + return (s); +} + +int +ieee1284_devid_to_printer_info(char *devid_string, char **manufacturer, + char **model, char **description, char **class, + char **serial_no, char ***command_set) +{ + char *iter = NULL; + char *s; + + if (devid_string == NULL) + return (-1); + + /* parse the 1284 device id string */ + for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL; + s = (char *)strtok_r(NULL, ";\n", &iter)) { + char *t, *u, *iter2 = NULL; + + if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL) + continue; + + if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL) + continue; + + if (((strcasecmp(t, "MFG") == 0) || + (strcasecmp(t, "MANUFACTURER") == 0)) && + (manufacturer != NULL)) + *manufacturer = strdup(strip_ws(u)); + else if (((strcasecmp(t, "MDL") == 0) || + (strcasecmp(t, "MODEL") == 0)) && + (model != NULL)) + *model = strdup(strip_ws(u)); + else if (((strcasecmp(t, "DES") == 0) || + (strcasecmp(t, "DESCRIPTION") == 0)) && + (description != NULL)) + *description = strdup(strip_ws(u)); + else if (((strcasecmp(t, "CLS") == 0) || + (strcasecmp(t, "CLASS") == 0)) && + (class != NULL)) + *class = strdup(strip_ws(u)); + else if (((strcasecmp(t, "SER") == 0) || + (strcasecmp(t, "SERNO") == 0)) && + (serial_no != NULL)) + *serial_no = strdup(strip_ws(u)); + else if (((strcasecmp(t, "CMD") == 0) || + (strcasecmp(t, "COMMAND SET") == 0)) && + (command_set != NULL)) { + /* this should be more dynamic, I got lazy */ + char *v, *iter3 = NULL; + char *cmds[32]; + int i = 0; + + memset(&cmds, 0, sizeof (cmds)); +#define NELEM(a) (sizeof (a) / sizeof (*(a))) + for (v = strtok_r(u, ",\n", &iter3); + ((v != NULL) && (i < NELEM(cmds))); + v = strtok_r(NULL, ",\n", &iter3)) { + cmds[i++] = strdup(strip_ws(v)); + } +#undef NELEM + *command_set = calloc(++i, sizeof (char *)); + for (i = 0; (cmds)[i] != NULL; i++) + (*command_set)[i] = cmds[i]; + } + } + + return (0); +} + + +int +add_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer, + char *model, char *description, char *serial_number, + char **command_set, char *device) +{ +#define NP(x) (x?x:"") + HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, " + "description=%s, serial=%s, device=%s\n", + NP(udi), NP(manufacturer), NP(model), NP(description), + NP(serial_number), NP(device))); +#undef NP + + if (model != NULL) + libhal_changeset_set_property_string(cs, + "info.product", model); + if (manufacturer != NULL) + libhal_changeset_set_property_string(cs, + "printer.vendor", manufacturer); + if (model != NULL) + libhal_changeset_set_property_string(cs, + "printer.product", model); + if (serial_number != NULL) + libhal_changeset_set_property_string(cs, + "printer.serial", serial_number); + if (description != NULL) + libhal_changeset_set_property_string(cs, + "printer.description", description); + if (command_set != NULL) + libhal_changeset_set_property_strlist(cs, "printer.commandset", + (const char **)command_set); + if (device != NULL) + libhal_changeset_set_property_string(cs, + "printer.device", device); + + return (0); +} |