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