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