xref: /titanic_52/usr/src/cmd/hal/probing/network-printer/probe-snmp.c (revision 4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3)
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 #include <sys/types.h>
11*4e9cfc9aSjacobs #include <sys/socket.h>
12*4e9cfc9aSjacobs #include <netinet/in.h>
13*4e9cfc9aSjacobs #include <arpa/inet.h>
14*4e9cfc9aSjacobs #include <strings.h>
15*4e9cfc9aSjacobs 
16*4e9cfc9aSjacobs #undef PACKAGE_STRING
17*4e9cfc9aSjacobs #undef PACKAGE_VERSION
18*4e9cfc9aSjacobs 
19*4e9cfc9aSjacobs #include <net-snmp/net-snmp-config.h>
20*4e9cfc9aSjacobs #include <net-snmp/net-snmp-includes.h>
21*4e9cfc9aSjacobs 
22*4e9cfc9aSjacobs #include "logger.h"
23*4e9cfc9aSjacobs #include "printer.h"
24*4e9cfc9aSjacobs 
25*4e9cfc9aSjacobs static int
26*4e9cfc9aSjacobs hrDeviceDesc_to_info(char *string, char **manufacturer, char **model,
27*4e9cfc9aSjacobs 		char **description)
28*4e9cfc9aSjacobs {
29*4e9cfc9aSjacobs 	int rc = -1;
30*4e9cfc9aSjacobs 	char *s;
31*4e9cfc9aSjacobs 
32*4e9cfc9aSjacobs 	if (string == NULL)
33*4e9cfc9aSjacobs 		return (-1);
34*4e9cfc9aSjacobs 
35*4e9cfc9aSjacobs 	/* if it has : and ; in it, it's probably a 1284 device id */
36*4e9cfc9aSjacobs 	if ((strchr(string, ':') != NULL) && (strchr(string, ';') != NULL)) {
37*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(string, manufacturer, model,
38*4e9cfc9aSjacobs 				description, NULL, NULL, NULL);
39*4e9cfc9aSjacobs 	} else {
40*4e9cfc9aSjacobs 		rc = 0;
41*4e9cfc9aSjacobs 		*description = strdup(string);
42*4e9cfc9aSjacobs 		*manufacturer = strdup(string);
43*4e9cfc9aSjacobs 		if ((s = strchr(*manufacturer, ' ')) != NULL) {
44*4e9cfc9aSjacobs 			*s++ = NULL;
45*4e9cfc9aSjacobs 			*model = strdup(s);
46*4e9cfc9aSjacobs 		}
47*4e9cfc9aSjacobs 	}
48*4e9cfc9aSjacobs 
49*4e9cfc9aSjacobs 	return (rc);
50*4e9cfc9aSjacobs }
51*4e9cfc9aSjacobs 
52*4e9cfc9aSjacobs static struct snmp_pdu *
53*4e9cfc9aSjacobs snmp_get_item(char *host, char *community, char *mib_item)
54*4e9cfc9aSjacobs {
55*4e9cfc9aSjacobs 	int status;
56*4e9cfc9aSjacobs 	struct snmp_session session, *ss;
57*4e9cfc9aSjacobs 	struct snmp_pdu *request = NULL, *result = NULL;
58*4e9cfc9aSjacobs 	oid Oid[MAX_OID_LEN];
59*4e9cfc9aSjacobs 	unsigned int oid_len = MAX_OID_LEN;
60*4e9cfc9aSjacobs 
61*4e9cfc9aSjacobs 	/* initialize the SNMP session */
62*4e9cfc9aSjacobs 	snmp_sess_init(&session);
63*4e9cfc9aSjacobs 	session.peername = host;
64*4e9cfc9aSjacobs 	session.community = (uchar_t *)community;
65*4e9cfc9aSjacobs 	session.community_len = strlen((const char *)session.community);
66*4e9cfc9aSjacobs 	session.version = SNMP_VERSION_1;
67*4e9cfc9aSjacobs 	session.retries = 0;
68*4e9cfc9aSjacobs 
69*4e9cfc9aSjacobs 	if ((ss = snmp_open(&session)) == NULL)
70*4e9cfc9aSjacobs 		return (NULL);
71*4e9cfc9aSjacobs 
72*4e9cfc9aSjacobs 	/* add the requested data */
73*4e9cfc9aSjacobs 	if (!read_objid(mib_item, Oid, &oid_len))
74*4e9cfc9aSjacobs 		snmp_perror(mib_item);
75*4e9cfc9aSjacobs 
76*4e9cfc9aSjacobs 	/* initialize the request PDU */
77*4e9cfc9aSjacobs 	request = snmp_pdu_create(SNMP_MSG_GET);
78*4e9cfc9aSjacobs 	snmp_add_null_var(request, Oid, oid_len);
79*4e9cfc9aSjacobs 
80*4e9cfc9aSjacobs 	status = snmp_synch_response(ss, request, &result);
81*4e9cfc9aSjacobs 
82*4e9cfc9aSjacobs 	snmp_close(ss);
83*4e9cfc9aSjacobs 
84*4e9cfc9aSjacobs 	return (result);
85*4e9cfc9aSjacobs }
86*4e9cfc9aSjacobs 
87*4e9cfc9aSjacobs static char *
88*4e9cfc9aSjacobs snmp_get_string(char *host, char *community, char *mib_item)
89*4e9cfc9aSjacobs {
90*4e9cfc9aSjacobs 	char *result = NULL;
91*4e9cfc9aSjacobs 	struct snmp_pdu *response = NULL;
92*4e9cfc9aSjacobs 
93*4e9cfc9aSjacobs 	response = snmp_get_item(host, community, mib_item);
94*4e9cfc9aSjacobs 
95*4e9cfc9aSjacobs 	if ((response != NULL) && (response->errstat == SNMP_ERR_NOERROR)) {
96*4e9cfc9aSjacobs 		struct variable_list *v = response->variables;
97*4e9cfc9aSjacobs 
98*4e9cfc9aSjacobs 		if (v->type == ASN_OCTET_STR) {
99*4e9cfc9aSjacobs 			result = calloc(1, v->val_len + 1);
100*4e9cfc9aSjacobs 			memcpy(result, v->val.string, v->val_len);
101*4e9cfc9aSjacobs 		}
102*4e9cfc9aSjacobs 	}
103*4e9cfc9aSjacobs 
104*4e9cfc9aSjacobs 	HAL_DEBUG(("snmp_get_string(%s, %s, %s): %s", host, community, mib_item,
105*4e9cfc9aSjacobs 		(result?result:"NULL")));
106*4e9cfc9aSjacobs 
107*4e9cfc9aSjacobs 	if (response != NULL)
108*4e9cfc9aSjacobs 		snmp_free_pdu(response);
109*4e9cfc9aSjacobs 
110*4e9cfc9aSjacobs 	return (result);
111*4e9cfc9aSjacobs }
112*4e9cfc9aSjacobs 
113*4e9cfc9aSjacobs static int
114*4e9cfc9aSjacobs snmp_brother_printer_info(char *hostname, char *community, char **manufacturer,
115*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
116*4e9cfc9aSjacobs 		char ***command_set)
117*4e9cfc9aSjacobs {
118*4e9cfc9aSjacobs 	int rc = -1;
119*4e9cfc9aSjacobs 	char *tmp = NULL;
120*4e9cfc9aSjacobs 
121*4e9cfc9aSjacobs 	/*
122*4e9cfc9aSjacobs 	 * Brother printers appear to store
123*4e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.2435.2.3.9.1.1.7.0
124*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2435.2.3.9.4.2.1.5.5.1.0
125*4e9cfc9aSjacobs 	 */
126*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
127*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2435.2.3.9.1.1.7.0");
128*4e9cfc9aSjacobs 	if (tmp != NULL) {
129*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
130*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
131*4e9cfc9aSjacobs 		free(tmp);
132*4e9cfc9aSjacobs 
133*4e9cfc9aSjacobs 		if (*serial_no == NULL)
134*4e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
135*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2435.2.3.9.4.2.1.5.5.1.0");
136*4e9cfc9aSjacobs 	}
137*4e9cfc9aSjacobs 
138*4e9cfc9aSjacobs 	return (rc);
139*4e9cfc9aSjacobs }
140*4e9cfc9aSjacobs 
141*4e9cfc9aSjacobs static int
142*4e9cfc9aSjacobs snmp_ricoh_printer_info(char *hostname, char *community, char **manufacturer,
143*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
144*4e9cfc9aSjacobs 		char ***command_set)
145*4e9cfc9aSjacobs {
146*4e9cfc9aSjacobs 	int rc = -1;
147*4e9cfc9aSjacobs 	char *tmp = NULL;
148*4e9cfc9aSjacobs 
149*4e9cfc9aSjacobs 	/*
150*4e9cfc9aSjacobs 	 * OKI printers appear to store
151*4e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.367.3.2.1.1.1.11.0
152*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.367.3.2.1.2.1.4.0
153*4e9cfc9aSjacobs 	 */
154*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
155*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.367.3.2.1.1.1.11.0");
156*4e9cfc9aSjacobs 	if (tmp != NULL) {
157*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
158*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
159*4e9cfc9aSjacobs 		free(tmp);
160*4e9cfc9aSjacobs 
161*4e9cfc9aSjacobs 		if (*serial_no == NULL)
162*4e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
163*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.367.3.2.1.2.1.4.0");
164*4e9cfc9aSjacobs 	}
165*4e9cfc9aSjacobs 
166*4e9cfc9aSjacobs 	return (rc);
167*4e9cfc9aSjacobs }
168*4e9cfc9aSjacobs 
169*4e9cfc9aSjacobs static int
170*4e9cfc9aSjacobs snmp_lexmark_printer_info(char *hostname, char *community, char **manufacturer,
171*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
172*4e9cfc9aSjacobs 		char ***command_set)
173*4e9cfc9aSjacobs {
174*4e9cfc9aSjacobs 	int rc = -1;
175*4e9cfc9aSjacobs 	char *tmp = NULL;
176*4e9cfc9aSjacobs 
177*4e9cfc9aSjacobs 	/*
178*4e9cfc9aSjacobs 	 * Lexmark printers appear to store
179*4e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.641.2.1.2.1.3.1
180*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.641.2.1.2.1.6.1
181*4e9cfc9aSjacobs 	 */
182*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
183*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.641.2.1.2.1.3.1");
184*4e9cfc9aSjacobs 	if (tmp != NULL) {
185*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
186*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
187*4e9cfc9aSjacobs 		free(tmp);
188*4e9cfc9aSjacobs 
189*4e9cfc9aSjacobs 		if (*serial_no == NULL)
190*4e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
191*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.641.2.1.2.1.6.1");
192*4e9cfc9aSjacobs 	}
193*4e9cfc9aSjacobs 
194*4e9cfc9aSjacobs 	return (rc);
195*4e9cfc9aSjacobs }
196*4e9cfc9aSjacobs 
197*4e9cfc9aSjacobs static int
198*4e9cfc9aSjacobs snmp_xerox_phaser_printer_info(char *hostname, char *community,
199*4e9cfc9aSjacobs 		char **manufacturer, char **model, char **description,
200*4e9cfc9aSjacobs 		char **serial_no, char ***command_set, char **uri)
201*4e9cfc9aSjacobs {
202*4e9cfc9aSjacobs 	int rc = -1;
203*4e9cfc9aSjacobs 	char *tmp = NULL;
204*4e9cfc9aSjacobs 
205*4e9cfc9aSjacobs 	/*
206*4e9cfc9aSjacobs 	 * Xerox Phaser XXXX printers store their
207*4e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.253.8.51.1.2.1.20.1
208*4e9cfc9aSjacobs 	 *	Manufacturer:
209*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.128.2.1.3.1.1.0
210*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.16
211*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.4.1.0
212*4e9cfc9aSjacobs 	 *	Model:
213*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.128.2.1.3.1.2.0
214*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.17
215*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.23.2.32.4.2.0
216*4e9cfc9aSjacobs 	 *	Description	SNMPv2-SMI::enterprises.253.8.53.3.2.1.2.1
217*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.253.8.53.3.2.1.3.1
218*4e9cfc9aSjacobs 	 *	Uri		SNMPv2-SMI::enterprises.128.2.1.3.6.23.1.5.1
219*4e9cfc9aSjacobs 	 */
220*4e9cfc9aSjacobs 
221*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
222*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.253.8.51.1.2.1.20.1");
223*4e9cfc9aSjacobs 	if (tmp != NULL) {
224*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
225*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
226*4e9cfc9aSjacobs 		free(tmp);
227*4e9cfc9aSjacobs 	}
228*4e9cfc9aSjacobs 
229*4e9cfc9aSjacobs 	if (*manufacturer == NULL)
230*4e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
231*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.128.2.1.3.1.1.0");
232*4e9cfc9aSjacobs 	if (*manufacturer == NULL)
233*4e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
234*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.16");
235*4e9cfc9aSjacobs 	if (*manufacturer == NULL)
236*4e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
237*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.4.1.0");
238*4e9cfc9aSjacobs 
239*4e9cfc9aSjacobs 	if (*model == NULL)
240*4e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
241*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.128.2.1.3.1.2.0");
242*4e9cfc9aSjacobs 	if (*model == NULL)
243*4e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
244*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.3.2.1.10.1.17");
245*4e9cfc9aSjacobs 	if (*model == NULL)
246*4e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
247*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.23.2.32.4.2.0");
248*4e9cfc9aSjacobs 
249*4e9cfc9aSjacobs 	if (*serial_no == NULL)
250*4e9cfc9aSjacobs 		*serial_no = snmp_get_string(hostname, community,
251*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.253.8.53.3.2.1.3.1");
252*4e9cfc9aSjacobs 
253*4e9cfc9aSjacobs 	if ((*manufacturer != NULL) && (*model != NULL))
254*4e9cfc9aSjacobs 		rc = 0;
255*4e9cfc9aSjacobs 
256*4e9cfc9aSjacobs 	return (rc);
257*4e9cfc9aSjacobs }
258*4e9cfc9aSjacobs 
259*4e9cfc9aSjacobs static int
260*4e9cfc9aSjacobs snmp_qms_printer_info(char *hostname, char *community, char **manufacturer,
261*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
262*4e9cfc9aSjacobs 		char ***command_set, char **uri)
263*4e9cfc9aSjacobs {
264*4e9cfc9aSjacobs 	int rc = -1;
265*4e9cfc9aSjacobs 	char *tmp = NULL;
266*4e9cfc9aSjacobs 
267*4e9cfc9aSjacobs 	/*
268*4e9cfc9aSjacobs 	 * MINOLTA-QMS printers appear to store
269*4e9cfc9aSjacobs 	 *	Prouct Name	SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.1.1.16.1
270*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2590.1.1.1.5.5.1.1.3.2
271*4e9cfc9aSjacobs 	 *	URI		SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.1
272*4e9cfc9aSjacobs 	 *			SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.2
273*4e9cfc9aSjacobs 	 */
274*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
275*4e9cfc9aSjacobs 		"SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.1.1.16.1");
276*4e9cfc9aSjacobs 	if (tmp != NULL) {
277*4e9cfc9aSjacobs 		rc = hrDeviceDesc_to_info(tmp, manufacturer, model,
278*4e9cfc9aSjacobs 					description);
279*4e9cfc9aSjacobs 		free(tmp);
280*4e9cfc9aSjacobs 
281*4e9cfc9aSjacobs 		if (*serial_no == NULL)
282*4e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
283*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2590.1.1.1.5.5.1.1.3.2");
284*4e9cfc9aSjacobs 		tmp = snmp_get_string(hostname, community,
285*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.2");
286*4e9cfc9aSjacobs 		if (tmp == NULL)
287*4e9cfc9aSjacobs 			tmp = snmp_get_string(hostname, community,
288*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2590.1.1.2.1.5.7.14.2.2.1.3.1.1");
289*4e9cfc9aSjacobs 		if (tmp != NULL)
290*4e9cfc9aSjacobs 			*uri = tmp;
291*4e9cfc9aSjacobs 	}
292*4e9cfc9aSjacobs 
293*4e9cfc9aSjacobs 	return (rc);
294*4e9cfc9aSjacobs }
295*4e9cfc9aSjacobs 
296*4e9cfc9aSjacobs static int
297*4e9cfc9aSjacobs snmp_oki_printer_info(char *hostname, char *community, char **manufacturer,
298*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
299*4e9cfc9aSjacobs 		char ***command_set)
300*4e9cfc9aSjacobs {
301*4e9cfc9aSjacobs 	int rc = -1;
302*4e9cfc9aSjacobs 	char *tmp = NULL;
303*4e9cfc9aSjacobs 
304*4e9cfc9aSjacobs 	/*
305*4e9cfc9aSjacobs 	 * OKI printers appear to store
306*4e9cfc9aSjacobs 	 *	Prouct Name	SNMPv2-SMI::enterprises.2001.1.2.683.1.3
307*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2001.1.2.683.1.5
308*4e9cfc9aSjacobs 	 */
309*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
310*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2001.1.2.683.1.3");
311*4e9cfc9aSjacobs 	if (tmp != NULL) {
312*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
313*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
314*4e9cfc9aSjacobs 		free(tmp);
315*4e9cfc9aSjacobs 
316*4e9cfc9aSjacobs 		if (*serial_no == NULL)
317*4e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
318*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2001.1.2.683.1.5");
319*4e9cfc9aSjacobs 	}
320*4e9cfc9aSjacobs 
321*4e9cfc9aSjacobs 	return (rc);
322*4e9cfc9aSjacobs }
323*4e9cfc9aSjacobs 
324*4e9cfc9aSjacobs static int
325*4e9cfc9aSjacobs snmp_hp_printer_info(char *hostname, char *community, char **manufacturer,
326*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
327*4e9cfc9aSjacobs 		char ***command_set)
328*4e9cfc9aSjacobs {
329*4e9cfc9aSjacobs 	int rc = -1;
330*4e9cfc9aSjacobs 	char *tmp = NULL;
331*4e9cfc9aSjacobs 
332*4e9cfc9aSjacobs 	/*
333*4e9cfc9aSjacobs 	 * HP printers appear to store
334*4e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0
335*4e9cfc9aSjacobs 	 *	Serial Number	SNMPv2-SMI::enterprises.2.3.9.4.2.2.5.1.1.17
336*4e9cfc9aSjacobs 	 */
337*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
338*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0");
339*4e9cfc9aSjacobs 	if (tmp != NULL) {
340*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
341*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
342*4e9cfc9aSjacobs 		free(tmp);
343*4e9cfc9aSjacobs 
344*4e9cfc9aSjacobs 		if (*serial_no == NULL)
345*4e9cfc9aSjacobs 			*serial_no = snmp_get_string(hostname, community,
346*4e9cfc9aSjacobs 				"SNMPv2-SMI::enterprises.2.3.9.4.2.2.5.1.1.17");
347*4e9cfc9aSjacobs 	}
348*4e9cfc9aSjacobs 
349*4e9cfc9aSjacobs 	return (rc);
350*4e9cfc9aSjacobs }
351*4e9cfc9aSjacobs 
352*4e9cfc9aSjacobs static int
353*4e9cfc9aSjacobs snmp_ppm_printer_info(char *hostname, char *community, char **manufacturer,
354*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
355*4e9cfc9aSjacobs 		char ***command_set)
356*4e9cfc9aSjacobs {
357*4e9cfc9aSjacobs 	int rc = -1;
358*4e9cfc9aSjacobs 	char *tmp = NULL;
359*4e9cfc9aSjacobs 
360*4e9cfc9aSjacobs 	/*
361*4e9cfc9aSjacobs 	 * The PWG portMon MIB stores
362*4e9cfc9aSjacobs 	 *	1284 DevID	SNMPv2-SMI::enterprises.2699.1.2.1.1.1.3`
363*4e9cfc9aSjacobs 	 */
364*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
365*4e9cfc9aSjacobs 			"SNMPv2-SMI::enterprises.2699.1.2.1.1.1.3");
366*4e9cfc9aSjacobs 	if (tmp != NULL) {
367*4e9cfc9aSjacobs 		rc = ieee1284_devid_to_printer_info(tmp, manufacturer, model,
368*4e9cfc9aSjacobs 				description, NULL, serial_no, command_set);
369*4e9cfc9aSjacobs 		free(tmp);
370*4e9cfc9aSjacobs 	}
371*4e9cfc9aSjacobs 
372*4e9cfc9aSjacobs 	return (rc);
373*4e9cfc9aSjacobs }
374*4e9cfc9aSjacobs 
375*4e9cfc9aSjacobs static int
376*4e9cfc9aSjacobs snmp_prt_printer_info(char *hostname, char *community, char **manufacturer,
377*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
378*4e9cfc9aSjacobs 		char ***command_set)
379*4e9cfc9aSjacobs {
380*4e9cfc9aSjacobs 	int rc = -1;
381*4e9cfc9aSjacobs 	char *tmp = NULL;
382*4e9cfc9aSjacobs 
383*4e9cfc9aSjacobs 	/*
384*4e9cfc9aSjacobs 	 * The Printer Printer MIB stores
385*4e9cfc9aSjacobs 	 *	Vendor	 SNMPv2-SMI::mib-2.43.8.2.1.14.1.1
386*4e9cfc9aSjacobs 	 *	Model	 SNMPv2-SMI::mib-2.43.8.2.1.15.1.1
387*4e9cfc9aSjacobs 	 *	Serial	 SNMPv2-SMI::mib-2.43.8.2.1.17.1.1
388*4e9cfc9aSjacobs 	 */
389*4e9cfc9aSjacobs 
390*4e9cfc9aSjacobs 	if (*manufacturer == NULL)
391*4e9cfc9aSjacobs 		*manufacturer = snmp_get_string(hostname, community,
392*4e9cfc9aSjacobs 				"SNMPv2-SMI::mib-2.43.8.2.1.14.1.1");
393*4e9cfc9aSjacobs 	if (*model == NULL)
394*4e9cfc9aSjacobs 		*model = snmp_get_string(hostname, community,
395*4e9cfc9aSjacobs 				"SNMPv2-SMI::mib-2.43.8.2.1.15.1.1");
396*4e9cfc9aSjacobs 	if (*serial_no == NULL)
397*4e9cfc9aSjacobs 		*serial_no = snmp_get_string(hostname, community,
398*4e9cfc9aSjacobs 				"SNMPv2-SMI::mib-2.43.8.2.1.17.1.1");
399*4e9cfc9aSjacobs 
400*4e9cfc9aSjacobs 	if (*manufacturer != NULL)
401*4e9cfc9aSjacobs 		rc = 0;
402*4e9cfc9aSjacobs 
403*4e9cfc9aSjacobs 	return (rc);
404*4e9cfc9aSjacobs }
405*4e9cfc9aSjacobs 
406*4e9cfc9aSjacobs static int
407*4e9cfc9aSjacobs snmp_host_resource_printer_info(char *hostname, char *community,
408*4e9cfc9aSjacobs 		char **manufacturer, char **model, char **description,
409*4e9cfc9aSjacobs 		char **serial_no, char ***command_set)
410*4e9cfc9aSjacobs {
411*4e9cfc9aSjacobs 	int rc = -1;
412*4e9cfc9aSjacobs 	char *tmp = NULL;
413*4e9cfc9aSjacobs 
414*4e9cfc9aSjacobs 	tmp = snmp_get_string(hostname, community,
415*4e9cfc9aSjacobs 			"HOST-RESOURCES-MIB::hrDeviceDescr.1");
416*4e9cfc9aSjacobs 	if (tmp != NULL) {
417*4e9cfc9aSjacobs 		rc = hrDeviceDesc_to_info(tmp, manufacturer, model,
418*4e9cfc9aSjacobs 					description);
419*4e9cfc9aSjacobs 		free(tmp);
420*4e9cfc9aSjacobs 	}
421*4e9cfc9aSjacobs 
422*4e9cfc9aSjacobs 	return (rc);
423*4e9cfc9aSjacobs }
424*4e9cfc9aSjacobs 
425*4e9cfc9aSjacobs int
426*4e9cfc9aSjacobs snmp_printer_info(char *hostname, char *community, char **manufacturer,
427*4e9cfc9aSjacobs 		char **model, char **description, char **serial_no,
428*4e9cfc9aSjacobs 		char ***command_set, char **uri)
429*4e9cfc9aSjacobs {
430*4e9cfc9aSjacobs 	char *tmp = NULL;
431*4e9cfc9aSjacobs 
432*4e9cfc9aSjacobs 	init_snmp("network-printer-probe");
433*4e9cfc9aSjacobs 	init_mib();
434*4e9cfc9aSjacobs 
435*4e9cfc9aSjacobs 	if (snmp_brother_printer_info(hostname, community, manufacturer, model,
436*4e9cfc9aSjacobs 			description, serial_no, command_set) == 0) {
437*4e9cfc9aSjacobs 		return (0);
438*4e9cfc9aSjacobs 	} else if (snmp_ricoh_printer_info(hostname, community, manufacturer,
439*4e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
440*4e9cfc9aSjacobs 		return (0);
441*4e9cfc9aSjacobs 	} else if (snmp_lexmark_printer_info(hostname, community, manufacturer,
442*4e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
443*4e9cfc9aSjacobs 		return (0);
444*4e9cfc9aSjacobs 	} else if (snmp_xerox_phaser_printer_info(hostname, community,
445*4e9cfc9aSjacobs 			manufacturer, model, description, serial_no,
446*4e9cfc9aSjacobs 			command_set, uri) == 0) {
447*4e9cfc9aSjacobs 		return (0);
448*4e9cfc9aSjacobs 	} else if (snmp_qms_printer_info(hostname, community, manufacturer,
449*4e9cfc9aSjacobs 			model, description, serial_no, command_set, uri) == 0) {
450*4e9cfc9aSjacobs 		return (0);
451*4e9cfc9aSjacobs 	} else if (snmp_oki_printer_info(hostname, community, manufacturer,
452*4e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
453*4e9cfc9aSjacobs 		return (0);
454*4e9cfc9aSjacobs 	} else if (snmp_hp_printer_info(hostname, community, manufacturer,
455*4e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
456*4e9cfc9aSjacobs 		return (0);
457*4e9cfc9aSjacobs 	} else if (snmp_ppm_printer_info(hostname, community, manufacturer,
458*4e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
459*4e9cfc9aSjacobs 		return (0);
460*4e9cfc9aSjacobs 	} else if (snmp_prt_printer_info(hostname, community, manufacturer,
461*4e9cfc9aSjacobs 			model, description, serial_no, command_set) == 0) {
462*4e9cfc9aSjacobs 		return (0);
463*4e9cfc9aSjacobs 	} else if (snmp_host_resource_printer_info(hostname, community,
464*4e9cfc9aSjacobs 			manufacturer, model, description, serial_no,
465*4e9cfc9aSjacobs 			command_set) == 0) {
466*4e9cfc9aSjacobs 		return (0);
467*4e9cfc9aSjacobs 	}
468*4e9cfc9aSjacobs 
469*4e9cfc9aSjacobs 	return (-1);
470*4e9cfc9aSjacobs }
471*4e9cfc9aSjacobs 
472*4e9cfc9aSjacobs #ifdef NOTDEF
473*4e9cfc9aSjacobs 
474*4e9cfc9aSjacobs #define	NP(x)	(x?x:"")
475*4e9cfc9aSjacobs 
476*4e9cfc9aSjacobs int
477*4e9cfc9aSjacobs main(int ac, char *av[])
478*4e9cfc9aSjacobs {
479*4e9cfc9aSjacobs 	int i;
480*4e9cfc9aSjacobs 
481*4e9cfc9aSjacobs 	for (i = 1; av[i] != NULL; i++) {
482*4e9cfc9aSjacobs 		char *hostname = av[i], *manufacturer = NULL, *model = NULL,
483*4e9cfc9aSjacobs 		     *description = NULL, *serial_no = NULL,
484*4e9cfc9aSjacobs 		     **command_set = NULL, *uri = NULL;
485*4e9cfc9aSjacobs 		int rc;
486*4e9cfc9aSjacobs 
487*4e9cfc9aSjacobs 		rc = snmp_printer_info(hostname, &manufacturer, &model,
488*4e9cfc9aSjacobs 				&description, &serial_no, &command_set, &uri);
489*4e9cfc9aSjacobs 		printf("SNMP data for %s...(%d)\n", hostname, rc);
490*4e9cfc9aSjacobs 		printf("\tvendor = %s\n", NP(manufacturer));
491*4e9cfc9aSjacobs 		printf("\tproduct = %s\n", NP(model));
492*4e9cfc9aSjacobs 		printf("\tdescription = %s\n", NP(description));
493*4e9cfc9aSjacobs 		printf("\tserial = %s\n", NP(serial_no));
494*4e9cfc9aSjacobs 		printf("\tdevice = %s\n", NP(uri));
495*4e9cfc9aSjacobs 
496*4e9cfc9aSjacobs 		if (command_set != NULL) {
497*4e9cfc9aSjacobs 			int j;
498*4e9cfc9aSjacobs 
499*4e9cfc9aSjacobs 			printf("\tcommand set = \n");
500*4e9cfc9aSjacobs 			for (j = 0; command_set[j] != NULL; j++)
501*4e9cfc9aSjacobs 				printf("\t\t%s\n", command_set[j]);
502*4e9cfc9aSjacobs 		}
503*4e9cfc9aSjacobs 	}
504*4e9cfc9aSjacobs 
505*4e9cfc9aSjacobs 	return (0);
506*4e9cfc9aSjacobs }
507*4e9cfc9aSjacobs #endif
508