4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs/*
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Use is subject to license terms.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Licensed under the Academic Free License version 2.1
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#pragma ident "%Z%%M% %I% %E% SMI"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#ifdef HAVE_CONFIG_H
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <config.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#endif
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <errno.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <strings.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <ctype.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <stdlib.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <stdio.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <unistd.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <ctype.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <libhal.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <logger.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include "printer.h"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsstatic char *
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsstrip_ws(char *s)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs{
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (s != NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *p;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* skip the leading whitespace */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs for (; ((*s != NULL) && (isspace(*s) != 0)); s++);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* drop the trailing whitespace */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs p--);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *(++p) = '\0';
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (s);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs}
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsint
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsieee1284_devid_to_printer_info(char *devid_string, char **manufacturer,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char **model, char **description, char **class,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char **serial_no, char ***command_set)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs{
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *iter = NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *s;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (devid_string == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (-1);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* parse the 1284 device id string */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs s = (char *)strtok_r(NULL, ";\n", &iter)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *t, *u, *iter2 = NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs continue;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs continue;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (((strcasecmp(t, "MFG") == 0) ||
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (strcasecmp(t, "MANUFACTURER") == 0)) &&
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (manufacturer != NULL))
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *manufacturer = strdup(strip_ws(u));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs else if (((strcasecmp(t, "MDL") == 0) ||
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (strcasecmp(t, "MODEL") == 0)) &&
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (model != NULL))
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *model = strdup(strip_ws(u));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs else if (((strcasecmp(t, "DES") == 0) ||
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (strcasecmp(t, "DESCRIPTION") == 0)) &&
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (description != NULL))
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *description = strdup(strip_ws(u));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs else if (((strcasecmp(t, "CLS") == 0) ||
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (strcasecmp(t, "CLASS") == 0)) &&
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (class != NULL))
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *class = strdup(strip_ws(u));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs else if (((strcasecmp(t, "SER") == 0) ||
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (strcasecmp(t, "SERNO") == 0)) &&
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (serial_no != NULL))
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *serial_no = strdup(strip_ws(u));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs else if (((strcasecmp(t, "CMD") == 0) ||
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (strcasecmp(t, "COMMAND SET") == 0)) &&
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (command_set != NULL)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* this should be more dynamic, I got lazy */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *v, *iter3 = NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *cmds[32];
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs int i = 0;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs memset(&cmds, 0, sizeof (cmds));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#define NELEM(a) (sizeof (a) / sizeof (*(a)))
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs for (v = strtok_r(u, ",\n", &iter3);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs ((v != NULL) && (i < NELEM(cmds)));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs v = strtok_r(NULL, ",\n", &iter3)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs cmds[i++] = strdup(strip_ws(v));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#undef NELEM
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *command_set = calloc(++i, sizeof (char *));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs for (i = 0; (cmds)[i] != NULL; i++)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (*command_set)[i] = cmds[i];
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs}
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsint
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsadd_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *model, char *description, char *serial_number,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char **command_set, char *device)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs{
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#define NP(x) (x?x:"")
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, "
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "description=%s, serial=%s, device=%s\n",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs NP(udi), NP(manufacturer), NP(model), NP(description),
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs NP(serial_number), NP(device)));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#undef NP
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (model != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_string(cs,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "info.product", model);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (manufacturer != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_string(cs,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "printer.vendor", manufacturer);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (model != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_string(cs,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "printer.product", model);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (serial_number != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_string(cs,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "printer.serial", serial_number);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (description != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_string(cs,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "printer.description", description);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (command_set != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_strlist(cs, "printer.commandset",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs (const char **)command_set);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (device != NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_changeset_set_property_string(cs,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "printer.device", device);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs}