printer.c revision 5307:ea4512a0e608
1230363Sdas/*
2129203Scognet * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
3129203Scognet * Use is subject to license terms.
4129203Scognet *
5129203Scognet * Licensed under the Academic Free License version 2.1
6129203Scognet */
7129203Scognet
8230190Sdas#pragma ident	"%Z%%M%	%I%	%E% SMI"
9230190Sdas
10230190Sdas#ifdef HAVE_CONFIG_H
11230190Sdas#include <config.h>
12129203Scognet#endif
13230190Sdas
14230190Sdas#include <errno.h>
15230190Sdas#include <strings.h>
16230190Sdas#include <ctype.h>
17230190Sdas#include <stdlib.h>
18230190Sdas#include <stdio.h>
19230363Sdas#include <unistd.h>
20230363Sdas#include <ctype.h>
21230363Sdas
22129203Scognet#include <libhal.h>
23129203Scognet#include <logger.h>
24129203Scognet
25129203Scognet#include "printer.h"
26129203Scognet
27129203Scognetstatic char *
28129203Scognetstrip_ws(char *s)
29230363Sdas{
30230363Sdas	if (s != NULL) {
31230363Sdas		char *p;
32129203Scognet
33129203Scognet		/* skip the leading whitespace */
34230363Sdas		for (; ((*s != NULL) && (isspace(*s) != 0)); s++);
35230363Sdas
36230363Sdas		/* drop the trailing whitespace */
37129203Scognet		for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0));
38129203Scognet		     p--);
39230363Sdas		*(++p) = '\0';
40230363Sdas	}
41230363Sdas
42129203Scognet	return (s);
43129203Scognet}
44230363Sdas
45230363Sdasint
46230363Sdasieee1284_devid_to_printer_info(char *devid_string, char **manufacturer,
47230363Sdas		char **model, char **description, char **class,
48230363Sdas		char **serial_no, char ***command_set)
49230363Sdas{
50230363Sdas	char *iter = NULL;
51230363Sdas	char *s;
52230363Sdas
53230363Sdas	if (devid_string == NULL)
54129203Scognet		return (-1);
55129203Scognet
56230363Sdas	/* parse the 1284 device id string */
57230363Sdas	for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL;
58230363Sdas			s = (char *)strtok_r(NULL, ";\n", &iter)) {
59129203Scognet		char *t, *u, *iter2 = NULL;
60129203Scognet
61230363Sdas		if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL)
62230363Sdas			continue;
63230363Sdas
64230363Sdas		if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL)
65230363Sdas			continue;
66230363Sdas
67230363Sdas		if (((strcasecmp(t, "MFG") == 0) ||
68230363Sdas		     (strcasecmp(t, "MANUFACTURER") == 0)) &&
69230363Sdas		    (manufacturer != NULL))
70230363Sdas				*manufacturer = strdup(strip_ws(u));
71230363Sdas		else if (((strcasecmp(t, "MDL") == 0) ||
72230363Sdas			  (strcasecmp(t, "MODEL") == 0)) &&
73230363Sdas			 (model != NULL))
74230363Sdas				*model = strdup(strip_ws(u));
75230363Sdas		else if (((strcasecmp(t, "DES") == 0) ||
76230363Sdas			  (strcasecmp(t, "DESCRIPTION") == 0)) &&
77230363Sdas			 (description != NULL))
78230363Sdas				*description = strdup(strip_ws(u));
79230363Sdas		else if (((strcasecmp(t, "CLS") == 0) ||
80230363Sdas			  (strcasecmp(t, "CLASS") == 0)) &&
81230363Sdas			 (class != NULL))
82230363Sdas				*class = strdup(strip_ws(u));
83230363Sdas		else if (((strcasecmp(t, "SER") == 0) ||
84129203Scognet			  (strcasecmp(t, "SERNO") == 0)) &&
85129203Scognet			 (serial_no != NULL))
86230363Sdas				*serial_no = strdup(strip_ws(u));
87230363Sdas		else if (((strcasecmp(t, "CMD") == 0) ||
88230363Sdas			  (strcasecmp(t, "COMMAND SET") == 0)) &&
89129203Scognet			 (command_set != NULL)) {
90129203Scognet			/* this should be more dynamic, I got lazy */
91230363Sdas			char *v, *iter3 = NULL;
92230363Sdas			char *cmds[32];
93230363Sdas			int i = 0;
94230363Sdas
95230363Sdas			memset(&cmds, 0, sizeof (cmds));
96230363Sdas#define	NELEM(a)	(sizeof (a) / sizeof (*(a)))
97230363Sdas			for (v = strtok_r(u, ",\n", &iter3);
98230363Sdas			     ((v != NULL) && (i < NELEM(cmds)));
99129203Scognet			     v = strtok_r(NULL, ",\n", &iter3)) {
100129203Scognet				cmds[i++] = strdup(strip_ws(v));
101230363Sdas			}
102230363Sdas#undef NELEM
103230363Sdas			*command_set = calloc(++i, sizeof (char *));
104230363Sdas			for (i = 0; (cmds)[i] != NULL; i++)
105230363Sdas				(*command_set)[i] = cmds[i];
106230363Sdas		}
107230363Sdas	}
108230363Sdas
109230363Sdas	return (0);
110230363Sdas}
111230363Sdas
112230363Sdas
113230363Sdasint
114129203Scognetadd_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer,
115230363Sdas		char *model, char *description, char *serial_number,
116230363Sdas		char **command_set, char *device)
117230363Sdas{
118230363Sdas#define	NP(x)   (x?x:"")
119230363Sdas	HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, "
120230363Sdas		    "description=%s, serial=%s, device=%s\n",
121230363Sdas		    NP(udi), NP(manufacturer), NP(model), NP(description),
122230363Sdas		    NP(serial_number), NP(device)));
123230363Sdas#undef NP
124129203Scognet
125230363Sdas	if (model != NULL)
126230363Sdas		libhal_changeset_set_property_string(cs,
127230363Sdas					"info.product", model);
128230363Sdas	if (manufacturer != NULL)
129230363Sdas		libhal_changeset_set_property_string(cs,
130230363Sdas					"printer.vendor", manufacturer);
131230363Sdas	if (model != NULL)
132230363Sdas		libhal_changeset_set_property_string(cs,
133230363Sdas					"printer.product", model);
134230363Sdas	if (serial_number != NULL)
135230363Sdas		libhal_changeset_set_property_string(cs,
136230363Sdas					"printer.serial", serial_number);
137230363Sdas	if (description != NULL)
138230363Sdas		libhal_changeset_set_property_string(cs,
139230363Sdas					"printer.description", description);
140230363Sdas	if (command_set != NULL)
141230363Sdas		libhal_changeset_set_property_strlist(cs, "printer.commandset",
142230363Sdas					(const char **)command_set);
143230363Sdas	if (device != NULL)
144230363Sdas		libhal_changeset_set_property_string(cs,
145230363Sdas					"printer.device", device);
146230363Sdas
147230363Sdas	return (0);
148230363Sdas}
149230363Sdas