14e9cfc9aSjacobs /*
24e9cfc9aSjacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
34e9cfc9aSjacobs * Use is subject to license terms.
44e9cfc9aSjacobs *
54e9cfc9aSjacobs * Licensed under the Academic Free License version 2.1
64e9cfc9aSjacobs */
74e9cfc9aSjacobs
84e9cfc9aSjacobs #ifdef HAVE_CONFIG_H
94e9cfc9aSjacobs #include <config.h>
104e9cfc9aSjacobs #endif
114e9cfc9aSjacobs
124e9cfc9aSjacobs #include <errno.h>
134e9cfc9aSjacobs #include <strings.h>
144e9cfc9aSjacobs #include <ctype.h>
154e9cfc9aSjacobs #include <stdlib.h>
164e9cfc9aSjacobs #include <stdio.h>
174e9cfc9aSjacobs #include <unistd.h>
184e9cfc9aSjacobs #include <ctype.h>
194e9cfc9aSjacobs
204e9cfc9aSjacobs #include <libhal.h>
214e9cfc9aSjacobs #include <logger.h>
224e9cfc9aSjacobs
234e9cfc9aSjacobs #include "printer.h"
244e9cfc9aSjacobs
254e9cfc9aSjacobs static char *
strip_ws(char * s)264e9cfc9aSjacobs strip_ws(char *s)
274e9cfc9aSjacobs {
284e9cfc9aSjacobs if (s != NULL) {
294e9cfc9aSjacobs char *p;
304e9cfc9aSjacobs
314e9cfc9aSjacobs /* skip the leading whitespace */
32*32248f11SToomas Soome for (; ((*s != '\0') && (isspace(*s) != 0)); s++);
334e9cfc9aSjacobs
344e9cfc9aSjacobs /* drop the trailing whitespace */
354e9cfc9aSjacobs for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0));
364e9cfc9aSjacobs p--);
374e9cfc9aSjacobs *(++p) = '\0';
384e9cfc9aSjacobs }
394e9cfc9aSjacobs
404e9cfc9aSjacobs return (s);
414e9cfc9aSjacobs }
424e9cfc9aSjacobs
434e9cfc9aSjacobs int
ieee1284_devid_to_printer_info(char * devid_string,char ** manufacturer,char ** model,char ** description,char ** class,char ** serial_no,char *** command_set)444e9cfc9aSjacobs ieee1284_devid_to_printer_info(char *devid_string, char **manufacturer,
454e9cfc9aSjacobs char **model, char **description, char **class,
464e9cfc9aSjacobs char **serial_no, char ***command_set)
474e9cfc9aSjacobs {
484e9cfc9aSjacobs char *iter = NULL;
494e9cfc9aSjacobs char *s;
504e9cfc9aSjacobs
514e9cfc9aSjacobs if (devid_string == NULL)
524e9cfc9aSjacobs return (-1);
534e9cfc9aSjacobs
544e9cfc9aSjacobs /* parse the 1284 device id string */
554e9cfc9aSjacobs for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL;
564e9cfc9aSjacobs s = (char *)strtok_r(NULL, ";\n", &iter)) {
574e9cfc9aSjacobs char *t, *u, *iter2 = NULL;
584e9cfc9aSjacobs
594e9cfc9aSjacobs if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL)
604e9cfc9aSjacobs continue;
614e9cfc9aSjacobs
624e9cfc9aSjacobs if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL)
634e9cfc9aSjacobs continue;
644e9cfc9aSjacobs
654e9cfc9aSjacobs if (((strcasecmp(t, "MFG") == 0) ||
664e9cfc9aSjacobs (strcasecmp(t, "MANUFACTURER") == 0)) &&
674e9cfc9aSjacobs (manufacturer != NULL))
684e9cfc9aSjacobs *manufacturer = strdup(strip_ws(u));
694e9cfc9aSjacobs else if (((strcasecmp(t, "MDL") == 0) ||
704e9cfc9aSjacobs (strcasecmp(t, "MODEL") == 0)) &&
714e9cfc9aSjacobs (model != NULL))
724e9cfc9aSjacobs *model = strdup(strip_ws(u));
734e9cfc9aSjacobs else if (((strcasecmp(t, "DES") == 0) ||
744e9cfc9aSjacobs (strcasecmp(t, "DESCRIPTION") == 0)) &&
754e9cfc9aSjacobs (description != NULL))
764e9cfc9aSjacobs *description = strdup(strip_ws(u));
774e9cfc9aSjacobs else if (((strcasecmp(t, "CLS") == 0) ||
784e9cfc9aSjacobs (strcasecmp(t, "CLASS") == 0)) &&
794e9cfc9aSjacobs (class != NULL))
804e9cfc9aSjacobs *class = strdup(strip_ws(u));
814e9cfc9aSjacobs else if (((strcasecmp(t, "SER") == 0) ||
824e9cfc9aSjacobs (strcasecmp(t, "SERNO") == 0)) &&
834e9cfc9aSjacobs (serial_no != NULL))
844e9cfc9aSjacobs *serial_no = strdup(strip_ws(u));
854e9cfc9aSjacobs else if (((strcasecmp(t, "CMD") == 0) ||
864e9cfc9aSjacobs (strcasecmp(t, "COMMAND SET") == 0)) &&
874e9cfc9aSjacobs (command_set != NULL)) {
884e9cfc9aSjacobs /* this should be more dynamic, I got lazy */
894e9cfc9aSjacobs char *v, *iter3 = NULL;
904e9cfc9aSjacobs char *cmds[32];
914e9cfc9aSjacobs int i = 0;
924e9cfc9aSjacobs
934e9cfc9aSjacobs memset(&cmds, 0, sizeof (cmds));
944e9cfc9aSjacobs #define NELEM(a) (sizeof (a) / sizeof (*(a)))
954e9cfc9aSjacobs for (v = strtok_r(u, ",\n", &iter3);
964e9cfc9aSjacobs ((v != NULL) && (i < NELEM(cmds)));
974e9cfc9aSjacobs v = strtok_r(NULL, ",\n", &iter3)) {
984e9cfc9aSjacobs cmds[i++] = strdup(strip_ws(v));
994e9cfc9aSjacobs }
1004e9cfc9aSjacobs #undef NELEM
1014e9cfc9aSjacobs *command_set = calloc(++i, sizeof (char *));
1024e9cfc9aSjacobs for (i = 0; (cmds)[i] != NULL; i++)
1034e9cfc9aSjacobs (*command_set)[i] = cmds[i];
1044e9cfc9aSjacobs }
1054e9cfc9aSjacobs }
1064e9cfc9aSjacobs
1074e9cfc9aSjacobs return (0);
1084e9cfc9aSjacobs }
1094e9cfc9aSjacobs
1104e9cfc9aSjacobs
1114e9cfc9aSjacobs int
add_printer_info(LibHalChangeSet * cs,char * udi,char * manufacturer,char * model,char * description,char * serial_number,char ** command_set,char * device)1124e9cfc9aSjacobs add_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer,
1134e9cfc9aSjacobs char *model, char *description, char *serial_number,
1144e9cfc9aSjacobs char **command_set, char *device)
1154e9cfc9aSjacobs {
1164e9cfc9aSjacobs #define NP(x) (x?x:"")
1174e9cfc9aSjacobs HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, "
1184e9cfc9aSjacobs "description=%s, serial=%s, device=%s\n",
1194e9cfc9aSjacobs NP(udi), NP(manufacturer), NP(model), NP(description),
1204e9cfc9aSjacobs NP(serial_number), NP(device)));
1214e9cfc9aSjacobs #undef NP
1224e9cfc9aSjacobs
1234e9cfc9aSjacobs if (model != NULL)
1244e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
1254e9cfc9aSjacobs "info.product", model);
1264e9cfc9aSjacobs if (manufacturer != NULL)
1274e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
1284e9cfc9aSjacobs "printer.vendor", manufacturer);
1294e9cfc9aSjacobs if (model != NULL)
1304e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
1314e9cfc9aSjacobs "printer.product", model);
1324e9cfc9aSjacobs if (serial_number != NULL)
1334e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
1344e9cfc9aSjacobs "printer.serial", serial_number);
1354e9cfc9aSjacobs if (description != NULL)
1364e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
1374e9cfc9aSjacobs "printer.description", description);
1384e9cfc9aSjacobs if (command_set != NULL)
1394e9cfc9aSjacobs libhal_changeset_set_property_strlist(cs, "printer.commandset",
1404e9cfc9aSjacobs (const char **)command_set);
1414e9cfc9aSjacobs if (device != NULL)
1424e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
1434e9cfc9aSjacobs "printer.device", device);
1444e9cfc9aSjacobs
1454e9cfc9aSjacobs return (0);
1464e9cfc9aSjacobs }
147