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 #include <sys/types.h>
94e9cfc9aSjacobs #include <sys/socket.h>
104e9cfc9aSjacobs #include <netinet/in.h>
114e9cfc9aSjacobs #include <arpa/inet.h>
124e9cfc9aSjacobs #include <strings.h>
134e9cfc9aSjacobs 
144e9cfc9aSjacobs #undef PACKAGE_STRING
154e9cfc9aSjacobs #undef PACKAGE_VERSION
164e9cfc9aSjacobs 
174e9cfc9aSjacobs #include <net-snmp/net-snmp-config.h>
184e9cfc9aSjacobs #include <net-snmp/net-snmp-includes.h>
194e9cfc9aSjacobs 
204e9cfc9aSjacobs #include "logger.h"
214e9cfc9aSjacobs #include "printer.h"
224e9cfc9aSjacobs 
234e9cfc9aSjacobs static int
hrDeviceDesc_to_info(char * string,char ** manufacturer,char ** model,char ** description)244e9cfc9aSjacobs hrDeviceDesc_to_info(char *string, char **manufacturer, char **model,
254e9cfc9aSjacobs 		char **description)
264e9cfc9aSjacobs {
274e9cfc9aSjacobs 	int rc = -1;
284e9cfc9aSjacobs 	char *s;
294e9cfc9aSjacobs 
304e9cfc9aSjacobs 	if (string == NULL)
314e9cfc9aSjacobs 		return (-1);
324e9cfc9aSjacobs 
334e9cfc9aSjacobs 	/* if it has : and ; in it, it's probably a 1284 device id */
344e9cfc9aSjacobs 	if ((strchr(string, ':') != NULL) && (strchr(string, ';') != NULL)) {
354e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(string, manufacturer, model,
364e9cfc9aSjacobs 				description, NULL, NULL, NULL);
374e9cfc9aSjacobs 	} else {
384e9cfc9aSjacobs 		rc = 0;
394e9cfc9aSjacobs 		*description = strdup(string);
404e9cfc9aSjacobs 		*manufacturer = strdup(string);
414e9cfc9aSjacobs 		if ((s = strchr(*manufacturer, ' ')) != NULL) {
42*32248f11SToomas Soome 			*s++ = '\0';
434e9cfc9aSjacobs 			*model = strdup(s);
444e9cfc9aSjacobs 		}
454e9cfc9aSjacobs 	}
464e9cfc9aSjacobs 
474e9cfc9aSjacobs 	return (rc);
484e9cfc9aSjacobs }
494e9cfc9aSjacobs 
504e9cfc9aSjacobs static struct snmp_pdu *
snmp_get_item(char * host,char * community,char * mib_item)514e9cfc9aSjacobs snmp_get_item(char *host, char *community, char *mib_item)
524e9cfc9aSjacobs {
534e9cfc9aSjacobs 	struct snmp_session session, *ss;
544e9cfc9aSjacobs 	struct snmp_pdu *request = NULL, *result = NULL;
554e9cfc9aSjacobs 	oid Oid[MAX_OID_LEN];
564e9cfc9aSjacobs 	unsigned int oid_len = MAX_OID_LEN;
574e9cfc9aSjacobs 
584e9cfc9aSjacobs 	/* initialize the SNMP session */
594e9cfc9aSjacobs 	snmp_sess_init(&session);
604e9cfc9aSjacobs 	session.peername = host;
614e9cfc9aSjacobs 	session.community = (uchar_t *)community;
624e9cfc9aSjacobs 	session.community_len = strlen((const char *)session.community);
634e9cfc9aSjacobs 	session.version = SNMP_VERSION_1;
644e9cfc9aSjacobs 	session.retries = 0;
654e9cfc9aSjacobs 
664e9cfc9aSjacobs 	if ((ss = snmp_open(&session)) == NULL)
674e9cfc9aSjacobs 		return (NULL);
684e9cfc9aSjacobs 
694e9cfc9aSjacobs 	/* add the requested data */
704e9cfc9aSjacobs 	if (!read_objid(mib_item, Oid, &oid_len))
714e9cfc9aSjacobs 		snmp_perror(mib_item);
724e9cfc9aSjacobs 
734e9cfc9aSjacobs 	/* initialize the request PDU */
744e9cfc9aSjacobs 	request = snmp_pdu_create(SNMP_MSG_GET);
754e9cfc9aSjacobs 	snmp_add_null_var(request, Oid, oid_len);
764e9cfc9aSjacobs 
77d9e525a8SToomas Soome 	(void) snmp_synch_response(ss, request, &result);
784e9cfc9aSjacobs 
794e9cfc9aSjacobs 	snmp_close(ss);
804e9cfc9aSjacobs 
814e9cfc9aSjacobs 	return (result);
824e9cfc9aSjacobs }
834e9cfc9aSjacobs 
844e9cfc9aSjacobs static char *
snmp_get_string(char * host,char * community,char * mib_item)854e9cfc9aSjacobs snmp_get_string(char *host, char *community, char *mib_item)
864e9cfc9aSjacobs {
874e9cfc9aSjacobs 	char *result = NULL;
884e9cfc9aSjacobs 	struct snmp_pdu *response = NULL;
894e9cfc9aSjacobs 
904e9cfc9aSjacobs 	response = snmp_get_item(host, community, mib_item);
914e9cfc9aSjacobs 
924e9cfc9aSjacobs 	if ((response != NULL) && (response->errstat == SNMP_ERR_NOERROR)) {
934e9cfc9aSjacobs 		struct variable_list *v = response->variables;
944e9cfc9aSjacobs 
954e9cfc9aSjacobs 		if (v->type == ASN_OCTET_STR) {
964e9cfc9aSjacobs 			result = calloc(1, v->val_len + 1);
974e9cfc9aSjacobs 			memcpy(result, v->val.string, v->val_len);
984e9cfc9aSjacobs 		}
994e9cfc9aSjacobs 	}
1004e9cfc9aSjacobs 
1014e9cfc9aSjacobs 	HAL_DEBUG(("snmp_get_string(%s, %s, %s): %s", host, community, mib_item,
1024e9cfc9aSjacobs 		(result?result:"NULL")));
1034e9cfc9aSjacobs 
1044e9cfc9aSjacobs 	if (response != NULL)
1054e9cfc9aSjacobs 		snmp_free_pdu(response);
1064e9cfc9aSjacobs 
1074e9cfc9aSjacobs 	return (result);
1084e9cfc9aSjacobs }
1094e9cfc9aSjacobs 
1104e9cfc9aSjacobs static int
snmp_brother_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)1114e9cfc9aSjacobs snmp_brother_printer_info(char *hostname, char *community, char **manufacturer,
1124e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
1134e9cfc9aSjacobs 		char ***command_set)
1144e9cfc9aSjacobs {
1154e9cfc9aSjacobs 	int rc = -1;
1164e9cfc9aSjacobs 	char *tmp = NULL;
1174e9cfc9aSjacobs 
1184e9cfc9aSjacobs 	/*
1194e9cfc9aSjacobs 	 * Brother printers appear to store
1204e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.2435.2.3.9.1.1.7.0
1214e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2435.2.3.9.4.2.1.5.5.1.0
1224e9cfc9aSjacobs 	 */
1234e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
1244e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2435.2.3.9.1.1.7.0");
1254e9cfc9aSjacobs 	if (tmp != NULL) {
1264e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
1274e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
1284e9cfc9aSjacobs 		free(tmp);
1294e9cfc9aSjacobs 
1304e9cfc9aSjacobs 		if (*serial_no == NULL)
1314e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
1324e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2435.2.3.9.4.2.1.5.5.1.0");
1334e9cfc9aSjacobs 	}
1344e9cfc9aSjacobs 
1354e9cfc9aSjacobs 	return (rc);
1364e9cfc9aSjacobs }
1374e9cfc9aSjacobs 
1384e9cfc9aSjacobs static int
snmp_ricoh_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)1394e9cfc9aSjacobs snmp_ricoh_printer_info(char *hostname, char *community, char **manufacturer,
1404e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
1414e9cfc9aSjacobs 		char ***command_set)
1424e9cfc9aSjacobs {
1434e9cfc9aSjacobs 	int rc = -1;
1444e9cfc9aSjacobs 	char *tmp = NULL;
1454e9cfc9aSjacobs 
1464e9cfc9aSjacobs 	/*
1474e9cfc9aSjacobs 	 * OKI printers appear to store
1484e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.367.3.2.1.1.1.11.0
1494e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.367.3.2.1.2.1.4.0
1504e9cfc9aSjacobs 	 */
1514e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
1524e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.367.3.2.1.1.1.11.0");
1534e9cfc9aSjacobs 	if (tmp != NULL) {
1544e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
1554e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
1564e9cfc9aSjacobs 		free(tmp);
1574e9cfc9aSjacobs 
1584e9cfc9aSjacobs 		if (*serial_no == NULL)
1594e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
1604e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.367.3.2.1.2.1.4.0");
1614e9cfc9aSjacobs 	}
1624e9cfc9aSjacobs 
1634e9cfc9aSjacobs 	return (rc);
1644e9cfc9aSjacobs }
1654e9cfc9aSjacobs 
1664e9cfc9aSjacobs static int
snmp_lexmark_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)1674e9cfc9aSjacobs snmp_lexmark_printer_info(char *hostname, char *community, char **manufacturer,
1684e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
1694e9cfc9aSjacobs 		char ***command_set)
1704e9cfc9aSjacobs {
1714e9cfc9aSjacobs 	int rc = -1;
1724e9cfc9aSjacobs 	char *tmp = NULL;
1734e9cfc9aSjacobs 
1744e9cfc9aSjacobs 	/*
1754e9cfc9aSjacobs 	 * Lexmark printers appear to store
1764e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.641.2.1.2.1.3.1
1774e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.641.2.1.2.1.6.1
1784e9cfc9aSjacobs 	 */
1794e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
1804e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.641.2.1.2.1.3.1");
1814e9cfc9aSjacobs 	if (tmp != NULL) {
1824e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
1834e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
1844e9cfc9aSjacobs 		free(tmp);
1854e9cfc9aSjacobs 
1864e9cfc9aSjacobs 		if (*serial_no == NULL)
1874e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
1884e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.641.2.1.2.1.6.1");
1894e9cfc9aSjacobs 	}
1904e9cfc9aSjacobs 
1914e9cfc9aSjacobs 	return (rc);
1924e9cfc9aSjacobs }
1934e9cfc9aSjacobs 
1944e9cfc9aSjacobs static int
snmp_xerox_phaser_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set,char ** uri)1954e9cfc9aSjacobs snmp_xerox_phaser_printer_info(char *hostname, char *community,
1964e9cfc9aSjacobs 		char **manufacturer, char **model, char **description,
1974e9cfc9aSjacobs 		char **serial_no, char ***command_set, char **uri)
1984e9cfc9aSjacobs {
1994e9cfc9aSjacobs 	int rc = -1;
2004e9cfc9aSjacobs 	char *tmp = NULL;
2014e9cfc9aSjacobs 
2024e9cfc9aSjacobs 	/*
2034e9cfc9aSjacobs 	 * Xerox Phaser XXXX printers store their
2044e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.253.8.51.1.2.1.20.1
2054e9cfc9aSjacobs 	 *	Manufacturer:
2064e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.128.2.1.3.1.1.0
2074e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.16
2084e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.4.1.0
2094e9cfc9aSjacobs 	 *	Model:
2104e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.128.2.1.3.1.2.0
2114e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.17
2124e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.4.2.0
2134e9cfc9aSjacobs 	 *	Description	SNMPv2-SMI::enterprises.253.8.53.3.2.1.2.1
2144e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.253.8.53.3.2.1.3.1
2154e9cfc9aSjacobs 	 *	Uri		SNMPv2-SMI::enterprises.128.2.1.3.6.23.1.5.1
2164e9cfc9aSjacobs 	 */
2174e9cfc9aSjacobs 
2184e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
2194e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.253.8.51.1.2.1.20.1");
2204e9cfc9aSjacobs 	if (tmp != NULL) {
2214e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
2224e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
2234e9cfc9aSjacobs 		free(tmp);
2244e9cfc9aSjacobs 	}
2254e9cfc9aSjacobs 
2264e9cfc9aSjacobs 	if (*manufacturer == NULL)
2274e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
2284e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.128.2.1.3.1.1.0");
2294e9cfc9aSjacobs 	if (*manufacturer == NULL)
2304e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
2314e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.16");
2324e9cfc9aSjacobs 	if (*manufacturer == NULL)
2334e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
2344e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.4.1.0");
2354e9cfc9aSjacobs 
2364e9cfc9aSjacobs 	if (*model == NULL)
2374e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
2384e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.128.2.1.3.1.2.0");
2394e9cfc9aSjacobs 	if (*model == NULL)
2404e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
2414e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.17");
2424e9cfc9aSjacobs 	if (*model == NULL)
2434e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
2444e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.4.2.0");
2454e9cfc9aSjacobs 
2464e9cfc9aSjacobs 	if (*serial_no == NULL)
2474e9cfc9aSjacobs 		*serial_no = snmp_get_string(hostname, community,
2484e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.253.8.53.3.2.1.3.1");
2494e9cfc9aSjacobs 
2504e9cfc9aSjacobs 	if ((*manufacturer != NULL) && (*model != NULL))
2514e9cfc9aSjacobs 		rc = 0;
2524e9cfc9aSjacobs 
2534e9cfc9aSjacobs 	return (rc);
2544e9cfc9aSjacobs }
2554e9cfc9aSjacobs 
2564e9cfc9aSjacobs static int
snmp_qms_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set,char ** uri)2574e9cfc9aSjacobs snmp_qms_printer_info(char *hostname, char *community, char **manufacturer,
2584e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
2594e9cfc9aSjacobs 		char ***command_set, char **uri)
2604e9cfc9aSjacobs {
2614e9cfc9aSjacobs 	int rc = -1;
2624e9cfc9aSjacobs 	char *tmp = NULL;
2634e9cfc9aSjacobs 
2644e9cfc9aSjacobs 	/*
2654e9cfc9aSjacobs 	 * MINOLTA-QMS printers appear to store
2664e9cfc9aSjacobs 	 *	Prouct Name	SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.1.1.16.1
2674e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2590.1.1.1.5.5.1.1.3.2
2684e9cfc9aSjacobs 	 *	URI		SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.1
2694e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.2
2704e9cfc9aSjacobs 	 */
2714e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
2724e9cfc9aSjacobs 		"SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.1.1.16.1");
2734e9cfc9aSjacobs 	if (tmp != NULL) {
2744e9cfc9aSjacobs 		rc = hrDeviceDesc_to_info(tmp, manufacturer, model,
2754e9cfc9aSjacobs 					description);
2764e9cfc9aSjacobs 		free(tmp);
2774e9cfc9aSjacobs 
2784e9cfc9aSjacobs 		if (*serial_no == NULL)
2794e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
2804e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2590.1.1.1.5.5.1.1.3.2");
2814e9cfc9aSjacobs 		tmp = snmp_get_string(hostname, community,
2824e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.2");
2834e9cfc9aSjacobs 		if (tmp == NULL)
2844e9cfc9aSjacobs 			tmp = snmp_get_string(hostname, community,
2854e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.1");
2864e9cfc9aSjacobs 		if (tmp != NULL)
2874e9cfc9aSjacobs 			*uri = tmp;
2884e9cfc9aSjacobs 	}
2894e9cfc9aSjacobs 
2904e9cfc9aSjacobs 	return (rc);
2914e9cfc9aSjacobs }
2924e9cfc9aSjacobs 
2934e9cfc9aSjacobs static int
snmp_oki_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)2944e9cfc9aSjacobs snmp_oki_printer_info(char *hostname, char *community, char **manufacturer,
2954e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
2964e9cfc9aSjacobs 		char ***command_set)
2974e9cfc9aSjacobs {
2984e9cfc9aSjacobs 	int rc = -1;
2994e9cfc9aSjacobs 	char *tmp = NULL;
3004e9cfc9aSjacobs 
3014e9cfc9aSjacobs 	/*
3024e9cfc9aSjacobs 	 * OKI printers appear to store
3034e9cfc9aSjacobs 	 *	Prouct Name	SNMPv2-SMI::enterprises.2001.1.2.683.1.3
3044e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2001.1.2.683.1.5
3054e9cfc9aSjacobs 	 */
3064e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
3074e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2001.1.2.683.1.3");
3084e9cfc9aSjacobs 	if (tmp != NULL) {
3094e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
3104e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
3114e9cfc9aSjacobs 		free(tmp);
3124e9cfc9aSjacobs 
3134e9cfc9aSjacobs 		if (*serial_no == NULL)
3144e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
3154e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2001.1.2.683.1.5");
3164e9cfc9aSjacobs 	}
3174e9cfc9aSjacobs 
3184e9cfc9aSjacobs 	return (rc);
3194e9cfc9aSjacobs }
3204e9cfc9aSjacobs 
3214e9cfc9aSjacobs static int
snmp_hp_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)3224e9cfc9aSjacobs snmp_hp_printer_info(char *hostname, char *community, char **manufacturer,
3234e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
3244e9cfc9aSjacobs 		char ***command_set)
3254e9cfc9aSjacobs {
3264e9cfc9aSjacobs 	int rc = -1;
3274e9cfc9aSjacobs 	char *tmp = NULL;
3284e9cfc9aSjacobs 
3294e9cfc9aSjacobs 	/*
3304e9cfc9aSjacobs 	 * HP printers appear to store
3314e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0
3324e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2.3.9.4.2.2.5.1.1.17
3334e9cfc9aSjacobs 	 */
3344e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
3354e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0");
3364e9cfc9aSjacobs 	if (tmp != NULL) {
3374e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
3384e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
3394e9cfc9aSjacobs 		free(tmp);
3404e9cfc9aSjacobs 
3414e9cfc9aSjacobs 		if (*serial_no == NULL)
3424e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
3434e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2.3.9.4.2.2.5.1.1.17");
3444e9cfc9aSjacobs 	}
3454e9cfc9aSjacobs 
3464e9cfc9aSjacobs 	return (rc);
3474e9cfc9aSjacobs }
3484e9cfc9aSjacobs 
3494e9cfc9aSjacobs static int
snmp_ppm_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)3504e9cfc9aSjacobs snmp_ppm_printer_info(char *hostname, char *community, char **manufacturer,
3514e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
3524e9cfc9aSjacobs 		char ***command_set)
3534e9cfc9aSjacobs {
3544e9cfc9aSjacobs 	int rc = -1;
3554e9cfc9aSjacobs 	char *tmp = NULL;
3564e9cfc9aSjacobs 
3574e9cfc9aSjacobs 	/*
3584e9cfc9aSjacobs 	 * The PWG portMon MIB stores
3594e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.2699.1.2.1.1.1.3`
3604e9cfc9aSjacobs 	 */
3614e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
3624e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2699.1.2.1.1.1.3");
3634e9cfc9aSjacobs 	if (tmp != NULL) {
3644e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
3654e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
3664e9cfc9aSjacobs 		free(tmp);
3674e9cfc9aSjacobs 	}
3684e9cfc9aSjacobs 
3694e9cfc9aSjacobs 	return (rc);
3704e9cfc9aSjacobs }
3714e9cfc9aSjacobs 
3724e9cfc9aSjacobs static int
snmp_prt_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)3734e9cfc9aSjacobs snmp_prt_printer_info(char *hostname, char *community, char **manufacturer,
3744e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
3754e9cfc9aSjacobs 		char ***command_set)
3764e9cfc9aSjacobs {
3774e9cfc9aSjacobs 	int rc = -1;
3784e9cfc9aSjacobs 	char *tmp = NULL;
3794e9cfc9aSjacobs 
3804e9cfc9aSjacobs 	/*
3814e9cfc9aSjacobs 	 * The Printer Printer MIB stores
3824e9cfc9aSjacobs 	 *	Vendor	 SNMPv2-SMI::mib-2.43.8.2.1.14.1.1
3834e9cfc9aSjacobs 	 *	Model	 SNMPv2-SMI::mib-2.43.8.2.1.15.1.1
3844e9cfc9aSjacobs 	 *	Serial	 SNMPv2-SMI::mib-2.43.8.2.1.17.1.1
3854e9cfc9aSjacobs 	 */
3864e9cfc9aSjacobs 
3874e9cfc9aSjacobs 	if (*manufacturer == NULL)
3884e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
3894e9cfc9aSjacobs 				"SNMPv2-SMI::mib-2.43.8.2.1.14.1.1");
3904e9cfc9aSjacobs 	if (*model == NULL)
3914e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
3924e9cfc9aSjacobs 				"SNMPv2-SMI::mib-2.43.8.2.1.15.1.1");
3934e9cfc9aSjacobs 	if (*serial_no == NULL)
3944e9cfc9aSjacobs 		*serial_no = snmp_get_string(hostname, community,
3954e9cfc9aSjacobs 				"SNMPv2-SMI::mib-2.43.8.2.1.17.1.1");
3964e9cfc9aSjacobs 
3974e9cfc9aSjacobs 	if (*manufacturer != NULL)
3984e9cfc9aSjacobs 		rc = 0;
3994e9cfc9aSjacobs 
4004e9cfc9aSjacobs 	return (rc);
4014e9cfc9aSjacobs }
4024e9cfc9aSjacobs 
4034e9cfc9aSjacobs static int
snmp_host_resource_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set)4044e9cfc9aSjacobs snmp_host_resource_printer_info(char *hostname, char *community,
4054e9cfc9aSjacobs 		char **manufacturer, char **model, char **description,
4064e9cfc9aSjacobs 		char **serial_no, char ***command_set)
4074e9cfc9aSjacobs {
4084e9cfc9aSjacobs 	int rc = -1;
4094e9cfc9aSjacobs 	char *tmp = NULL;
4104e9cfc9aSjacobs 
4114e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
4124e9cfc9aSjacobs 			"HOST-RESOURCES-MIB::hrDeviceDescr.1");
4134e9cfc9aSjacobs 	if (tmp != NULL) {
4144e9cfc9aSjacobs 		rc = hrDeviceDesc_to_info(tmp, manufacturer, model,
4154e9cfc9aSjacobs 					description);
4164e9cfc9aSjacobs 		free(tmp);
4174e9cfc9aSjacobs 	}
4184e9cfc9aSjacobs 
4194e9cfc9aSjacobs 	return (rc);
4204e9cfc9aSjacobs }
4214e9cfc9aSjacobs 
4224e9cfc9aSjacobs int
snmp_printer_info(char * hostname,char * community,char ** manufacturer,char ** model,char ** description,char ** serial_no,char *** command_set,char ** uri)4234e9cfc9aSjacobs snmp_printer_info(char *hostname, char *community, char **manufacturer,
4244e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
4254e9cfc9aSjacobs 		char ***command_set, char **uri)
4264e9cfc9aSjacobs {
4274e9cfc9aSjacobs 	char *tmp = NULL;
4284e9cfc9aSjacobs 
4294e9cfc9aSjacobs 	init_snmp("network-printer-probe");
4304e9cfc9aSjacobs 	init_mib();
4314e9cfc9aSjacobs 
4324e9cfc9aSjacobs 	if (snmp_brother_printer_info(hostname, community, manufacturer, model,
4334e9cfc9aSjacobs 			description, serial_no, command_set) == 0) {
4344e9cfc9aSjacobs 		return (0);
4354e9cfc9aSjacobs 	} else if (snmp_ricoh_printer_info(hostname, community, manufacturer,
4364e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
4374e9cfc9aSjacobs 		return (0);
4384e9cfc9aSjacobs 	} else if (snmp_lexmark_printer_info(hostname, community, manufacturer,
4394e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
4404e9cfc9aSjacobs 		return (0);
4414e9cfc9aSjacobs 	} else if (snmp_xerox_phaser_printer_info(hostname, community,
4424e9cfc9aSjacobs 			manufacturer, model, description, serial_no,
4434e9cfc9aSjacobs 			command_set, uri) == 0) {
4444e9cfc9aSjacobs 		return (0);
4454e9cfc9aSjacobs 	} else if (snmp_qms_printer_info(hostname, community, manufacturer,
4464e9cfc9aSjacobs 			model, description, serial_no, command_set, uri) == 0) {
4474e9cfc9aSjacobs 		return (0);
4484e9cfc9aSjacobs 	} else if (snmp_oki_printer_info(hostname, community, manufacturer,
4494e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
4504e9cfc9aSjacobs 		return (0);
4514e9cfc9aSjacobs 	} else if (snmp_hp_printer_info(hostname, community, manufacturer,
4524e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
4534e9cfc9aSjacobs 		return (0);
4544e9cfc9aSjacobs 	} else if (snmp_ppm_printer_info(hostname, community, manufacturer,
4554e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
4564e9cfc9aSjacobs 		return (0);
4574e9cfc9aSjacobs 	} else if (snmp_prt_printer_info(hostname, community, manufacturer,
4584e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
4594e9cfc9aSjacobs 		return (0);
4604e9cfc9aSjacobs 	} else if (snmp_host_resource_printer_info(hostname, community,
4614e9cfc9aSjacobs 			manufacturer, model, description, serial_no,
4624e9cfc9aSjacobs 			command_set) == 0) {
4634e9cfc9aSjacobs 		return (0);
4644e9cfc9aSjacobs 	}
4654e9cfc9aSjacobs 
4664e9cfc9aSjacobs 	return (-1);
4674e9cfc9aSjacobs }
4684e9cfc9aSjacobs 
4694e9cfc9aSjacobs #ifdef NOTDEF
4704e9cfc9aSjacobs 
4714e9cfc9aSjacobs #define	NP(x)	(x?x:"")
4724e9cfc9aSjacobs 
4734e9cfc9aSjacobs int
main(int ac,char * av[])4744e9cfc9aSjacobs main(int ac, char *av[])
4754e9cfc9aSjacobs {
4764e9cfc9aSjacobs 	int i;
4774e9cfc9aSjacobs 
4784e9cfc9aSjacobs 	for (i = 1; av[i] != NULL; i++) {
4794e9cfc9aSjacobs 		char *hostname = av[i], *manufacturer = NULL, *model = NULL,
4804e9cfc9aSjacobs 		     *description = NULL, *serial_no = NULL,
4814e9cfc9aSjacobs 		     **command_set = NULL, *uri = NULL;
4824e9cfc9aSjacobs 		int rc;
4834e9cfc9aSjacobs 
4844e9cfc9aSjacobs 		rc = snmp_printer_info(hostname, &manufacturer, &model,
4854e9cfc9aSjacobs 				&description, &serial_no, &command_set, &uri);
4864e9cfc9aSjacobs 		printf("SNMP data for %s...(%d)\n", hostname, rc);
4874e9cfc9aSjacobs 		printf("\tvendor = %s\n", NP(manufacturer));
4884e9cfc9aSjacobs 		printf("\tproduct = %s\n", NP(model));
4894e9cfc9aSjacobs 		printf("\tdescription = %s\n", NP(description));
4904e9cfc9aSjacobs 		printf("\tserial = %s\n", NP(serial_no));
4914e9cfc9aSjacobs 		printf("\tdevice = %s\n", NP(uri));
4924e9cfc9aSjacobs 
4934e9cfc9aSjacobs 		if (command_set != NULL) {
4944e9cfc9aSjacobs 			int j;
4954e9cfc9aSjacobs 
4964e9cfc9aSjacobs 			printf("\tcommand set = \n");
4974e9cfc9aSjacobs 			for (j = 0; command_set[j] != NULL; j++)
4984e9cfc9aSjacobs 				printf("\t\t%s\n", command_set[j]);
4994e9cfc9aSjacobs 		}
5004e9cfc9aSjacobs 	}
5014e9cfc9aSjacobs 
5024e9cfc9aSjacobs 	return (0);
5034e9cfc9aSjacobs }
5044e9cfc9aSjacobs #endif
505