xref: /illumos-gate/usr/src/cmd/hal/utils/printer.c (revision 32248f11785f2b2ee12fa041aa8a92932c1245ca)
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