1*4e9cfc9aSjacobs /*
2*4e9cfc9aSjacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
3*4e9cfc9aSjacobs * Use is subject to license terms.
4*4e9cfc9aSjacobs *
5*4e9cfc9aSjacobs * Licensed under the Academic Free License version 2.1
6*4e9cfc9aSjacobs */
7*4e9cfc9aSjacobs
8*4e9cfc9aSjacobs #pragma ident "%Z%%M% %I% %E% SMI"
9*4e9cfc9aSjacobs
10*4e9cfc9aSjacobs #ifdef HAVE_CONFIG_H
11*4e9cfc9aSjacobs #include <config.h>
12*4e9cfc9aSjacobs #endif
13*4e9cfc9aSjacobs
14*4e9cfc9aSjacobs #include <errno.h>
15*4e9cfc9aSjacobs #include <strings.h>
16*4e9cfc9aSjacobs #include <ctype.h>
17*4e9cfc9aSjacobs #include <stdlib.h>
18*4e9cfc9aSjacobs #include <stdio.h>
19*4e9cfc9aSjacobs #include <unistd.h>
20*4e9cfc9aSjacobs #include <ctype.h>
21*4e9cfc9aSjacobs
22*4e9cfc9aSjacobs #include <libhal.h>
23*4e9cfc9aSjacobs #include <logger.h>
24*4e9cfc9aSjacobs
25*4e9cfc9aSjacobs #include "printer.h"
26*4e9cfc9aSjacobs
27*4e9cfc9aSjacobs static char *
strip_ws(char * s)28*4e9cfc9aSjacobs strip_ws(char *s)
29*4e9cfc9aSjacobs {
30*4e9cfc9aSjacobs if (s != NULL) {
31*4e9cfc9aSjacobs char *p;
32*4e9cfc9aSjacobs
33*4e9cfc9aSjacobs /* skip the leading whitespace */
34*4e9cfc9aSjacobs for (; ((*s != NULL) && (isspace(*s) != 0)); s++);
35*4e9cfc9aSjacobs
36*4e9cfc9aSjacobs /* drop the trailing whitespace */
37*4e9cfc9aSjacobs for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0));
38*4e9cfc9aSjacobs p--);
39*4e9cfc9aSjacobs *(++p) = '\0';
40*4e9cfc9aSjacobs }
41*4e9cfc9aSjacobs
42*4e9cfc9aSjacobs return (s);
43*4e9cfc9aSjacobs }
44*4e9cfc9aSjacobs
45*4e9cfc9aSjacobs int
ieee1284_devid_to_printer_info(char * devid_string,char ** manufacturer,char ** model,char ** description,char ** class,char ** serial_no,char *** command_set)46*4e9cfc9aSjacobs ieee1284_devid_to_printer_info(char *devid_string, char **manufacturer,
47*4e9cfc9aSjacobs char **model, char **description, char **class,
48*4e9cfc9aSjacobs char **serial_no, char ***command_set)
49*4e9cfc9aSjacobs {
50*4e9cfc9aSjacobs char *iter = NULL;
51*4e9cfc9aSjacobs char *s;
52*4e9cfc9aSjacobs
53*4e9cfc9aSjacobs if (devid_string == NULL)
54*4e9cfc9aSjacobs return (-1);
55*4e9cfc9aSjacobs
56*4e9cfc9aSjacobs /* parse the 1284 device id string */
57*4e9cfc9aSjacobs for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL;
58*4e9cfc9aSjacobs s = (char *)strtok_r(NULL, ";\n", &iter)) {
59*4e9cfc9aSjacobs char *t, *u, *iter2 = NULL;
60*4e9cfc9aSjacobs
61*4e9cfc9aSjacobs if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL)
62*4e9cfc9aSjacobs continue;
63*4e9cfc9aSjacobs
64*4e9cfc9aSjacobs if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL)
65*4e9cfc9aSjacobs continue;
66*4e9cfc9aSjacobs
67*4e9cfc9aSjacobs if (((strcasecmp(t, "MFG") == 0) ||
68*4e9cfc9aSjacobs (strcasecmp(t, "MANUFACTURER") == 0)) &&
69*4e9cfc9aSjacobs (manufacturer != NULL))
70*4e9cfc9aSjacobs *manufacturer = strdup(strip_ws(u));
71*4e9cfc9aSjacobs else if (((strcasecmp(t, "MDL") == 0) ||
72*4e9cfc9aSjacobs (strcasecmp(t, "MODEL") == 0)) &&
73*4e9cfc9aSjacobs (model != NULL))
74*4e9cfc9aSjacobs *model = strdup(strip_ws(u));
75*4e9cfc9aSjacobs else if (((strcasecmp(t, "DES") == 0) ||
76*4e9cfc9aSjacobs (strcasecmp(t, "DESCRIPTION") == 0)) &&
77*4e9cfc9aSjacobs (description != NULL))
78*4e9cfc9aSjacobs *description = strdup(strip_ws(u));
79*4e9cfc9aSjacobs else if (((strcasecmp(t, "CLS") == 0) ||
80*4e9cfc9aSjacobs (strcasecmp(t, "CLASS") == 0)) &&
81*4e9cfc9aSjacobs (class != NULL))
82*4e9cfc9aSjacobs *class = strdup(strip_ws(u));
83*4e9cfc9aSjacobs else if (((strcasecmp(t, "SER") == 0) ||
84*4e9cfc9aSjacobs (strcasecmp(t, "SERNO") == 0)) &&
85*4e9cfc9aSjacobs (serial_no != NULL))
86*4e9cfc9aSjacobs *serial_no = strdup(strip_ws(u));
87*4e9cfc9aSjacobs else if (((strcasecmp(t, "CMD") == 0) ||
88*4e9cfc9aSjacobs (strcasecmp(t, "COMMAND SET") == 0)) &&
89*4e9cfc9aSjacobs (command_set != NULL)) {
90*4e9cfc9aSjacobs /* this should be more dynamic, I got lazy */
91*4e9cfc9aSjacobs char *v, *iter3 = NULL;
92*4e9cfc9aSjacobs char *cmds[32];
93*4e9cfc9aSjacobs int i = 0;
94*4e9cfc9aSjacobs
95*4e9cfc9aSjacobs memset(&cmds, 0, sizeof (cmds));
96*4e9cfc9aSjacobs #define NELEM(a) (sizeof (a) / sizeof (*(a)))
97*4e9cfc9aSjacobs for (v = strtok_r(u, ",\n", &iter3);
98*4e9cfc9aSjacobs ((v != NULL) && (i < NELEM(cmds)));
99*4e9cfc9aSjacobs v = strtok_r(NULL, ",\n", &iter3)) {
100*4e9cfc9aSjacobs cmds[i++] = strdup(strip_ws(v));
101*4e9cfc9aSjacobs }
102*4e9cfc9aSjacobs #undef NELEM
103*4e9cfc9aSjacobs *command_set = calloc(++i, sizeof (char *));
104*4e9cfc9aSjacobs for (i = 0; (cmds)[i] != NULL; i++)
105*4e9cfc9aSjacobs (*command_set)[i] = cmds[i];
106*4e9cfc9aSjacobs }
107*4e9cfc9aSjacobs }
108*4e9cfc9aSjacobs
109*4e9cfc9aSjacobs return (0);
110*4e9cfc9aSjacobs }
111*4e9cfc9aSjacobs
112*4e9cfc9aSjacobs
113*4e9cfc9aSjacobs int
add_printer_info(LibHalChangeSet * cs,char * udi,char * manufacturer,char * model,char * description,char * serial_number,char ** command_set,char * device)114*4e9cfc9aSjacobs add_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer,
115*4e9cfc9aSjacobs char *model, char *description, char *serial_number,
116*4e9cfc9aSjacobs char **command_set, char *device)
117*4e9cfc9aSjacobs {
118*4e9cfc9aSjacobs #define NP(x) (x?x:"")
119*4e9cfc9aSjacobs HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, "
120*4e9cfc9aSjacobs "description=%s, serial=%s, device=%s\n",
121*4e9cfc9aSjacobs NP(udi), NP(manufacturer), NP(model), NP(description),
122*4e9cfc9aSjacobs NP(serial_number), NP(device)));
123*4e9cfc9aSjacobs #undef NP
124*4e9cfc9aSjacobs
125*4e9cfc9aSjacobs if (model != NULL)
126*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
127*4e9cfc9aSjacobs "info.product", model);
128*4e9cfc9aSjacobs if (manufacturer != NULL)
129*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
130*4e9cfc9aSjacobs "printer.vendor", manufacturer);
131*4e9cfc9aSjacobs if (model != NULL)
132*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
133*4e9cfc9aSjacobs "printer.product", model);
134*4e9cfc9aSjacobs if (serial_number != NULL)
135*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
136*4e9cfc9aSjacobs "printer.serial", serial_number);
137*4e9cfc9aSjacobs if (description != NULL)
138*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
139*4e9cfc9aSjacobs "printer.description", description);
140*4e9cfc9aSjacobs if (command_set != NULL)
141*4e9cfc9aSjacobs libhal_changeset_set_property_strlist(cs, "printer.commandset",
142*4e9cfc9aSjacobs (const char **)command_set);
143*4e9cfc9aSjacobs if (device != NULL)
144*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs,
145*4e9cfc9aSjacobs "printer.device", device);
146*4e9cfc9aSjacobs
147*4e9cfc9aSjacobs return (0);
148*4e9cfc9aSjacobs }
149