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 #ifdef HAVE_CONFIG_H 11*4e9cfc9aSjacobs #include <config.h> 12*4e9cfc9aSjacobs #endif 13*4e9cfc9aSjacobs 14*4e9cfc9aSjacobs #include <errno.h> 15*4e9cfc9aSjacobs #include <strings.h> 16*4e9cfc9aSjacobs #include <ctype.h> 17*4e9cfc9aSjacobs #include <stdlib.h> 18*4e9cfc9aSjacobs #include <stdio.h> 19*4e9cfc9aSjacobs #include <unistd.h> 20*4e9cfc9aSjacobs #include <ctype.h> 21*4e9cfc9aSjacobs 22*4e9cfc9aSjacobs #include <libhal.h> 23*4e9cfc9aSjacobs #include <logger.h> 24*4e9cfc9aSjacobs 25*4e9cfc9aSjacobs #include "printer.h" 26*4e9cfc9aSjacobs 27*4e9cfc9aSjacobs static char * 28*4e9cfc9aSjacobs strip_ws(char *s) 29*4e9cfc9aSjacobs { 30*4e9cfc9aSjacobs if (s != NULL) { 31*4e9cfc9aSjacobs char *p; 32*4e9cfc9aSjacobs 33*4e9cfc9aSjacobs /* skip the leading whitespace */ 34*4e9cfc9aSjacobs for (; ((*s != NULL) && (isspace(*s) != 0)); s++); 35*4e9cfc9aSjacobs 36*4e9cfc9aSjacobs /* drop the trailing whitespace */ 37*4e9cfc9aSjacobs for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0)); 38*4e9cfc9aSjacobs p--); 39*4e9cfc9aSjacobs *(++p) = '\0'; 40*4e9cfc9aSjacobs } 41*4e9cfc9aSjacobs 42*4e9cfc9aSjacobs return (s); 43*4e9cfc9aSjacobs } 44*4e9cfc9aSjacobs 45*4e9cfc9aSjacobs int 46*4e9cfc9aSjacobs ieee1284_devid_to_printer_info(char *devid_string, char **manufacturer, 47*4e9cfc9aSjacobs char **model, char **description, char **class, 48*4e9cfc9aSjacobs char **serial_no, char ***command_set) 49*4e9cfc9aSjacobs { 50*4e9cfc9aSjacobs char *iter = NULL; 51*4e9cfc9aSjacobs char *s; 52*4e9cfc9aSjacobs 53*4e9cfc9aSjacobs if (devid_string == NULL) 54*4e9cfc9aSjacobs return (-1); 55*4e9cfc9aSjacobs 56*4e9cfc9aSjacobs /* parse the 1284 device id string */ 57*4e9cfc9aSjacobs for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL; 58*4e9cfc9aSjacobs s = (char *)strtok_r(NULL, ";\n", &iter)) { 59*4e9cfc9aSjacobs char *t, *u, *iter2 = NULL; 60*4e9cfc9aSjacobs 61*4e9cfc9aSjacobs if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL) 62*4e9cfc9aSjacobs continue; 63*4e9cfc9aSjacobs 64*4e9cfc9aSjacobs if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL) 65*4e9cfc9aSjacobs continue; 66*4e9cfc9aSjacobs 67*4e9cfc9aSjacobs if (((strcasecmp(t, "MFG") == 0) || 68*4e9cfc9aSjacobs (strcasecmp(t, "MANUFACTURER") == 0)) && 69*4e9cfc9aSjacobs (manufacturer != NULL)) 70*4e9cfc9aSjacobs *manufacturer = strdup(strip_ws(u)); 71*4e9cfc9aSjacobs else if (((strcasecmp(t, "MDL") == 0) || 72*4e9cfc9aSjacobs (strcasecmp(t, "MODEL") == 0)) && 73*4e9cfc9aSjacobs (model != NULL)) 74*4e9cfc9aSjacobs *model = strdup(strip_ws(u)); 75*4e9cfc9aSjacobs else if (((strcasecmp(t, "DES") == 0) || 76*4e9cfc9aSjacobs (strcasecmp(t, "DESCRIPTION") == 0)) && 77*4e9cfc9aSjacobs (description != NULL)) 78*4e9cfc9aSjacobs *description = strdup(strip_ws(u)); 79*4e9cfc9aSjacobs else if (((strcasecmp(t, "CLS") == 0) || 80*4e9cfc9aSjacobs (strcasecmp(t, "CLASS") == 0)) && 81*4e9cfc9aSjacobs (class != NULL)) 82*4e9cfc9aSjacobs *class = strdup(strip_ws(u)); 83*4e9cfc9aSjacobs else if (((strcasecmp(t, "SER") == 0) || 84*4e9cfc9aSjacobs (strcasecmp(t, "SERNO") == 0)) && 85*4e9cfc9aSjacobs (serial_no != NULL)) 86*4e9cfc9aSjacobs *serial_no = strdup(strip_ws(u)); 87*4e9cfc9aSjacobs else if (((strcasecmp(t, "CMD") == 0) || 88*4e9cfc9aSjacobs (strcasecmp(t, "COMMAND SET") == 0)) && 89*4e9cfc9aSjacobs (command_set != NULL)) { 90*4e9cfc9aSjacobs /* this should be more dynamic, I got lazy */ 91*4e9cfc9aSjacobs char *v, *iter3 = NULL; 92*4e9cfc9aSjacobs char *cmds[32]; 93*4e9cfc9aSjacobs int i = 0; 94*4e9cfc9aSjacobs 95*4e9cfc9aSjacobs memset(&cmds, 0, sizeof (cmds)); 96*4e9cfc9aSjacobs #define NELEM(a) (sizeof (a) / sizeof (*(a))) 97*4e9cfc9aSjacobs for (v = strtok_r(u, ",\n", &iter3); 98*4e9cfc9aSjacobs ((v != NULL) && (i < NELEM(cmds))); 99*4e9cfc9aSjacobs v = strtok_r(NULL, ",\n", &iter3)) { 100*4e9cfc9aSjacobs cmds[i++] = strdup(strip_ws(v)); 101*4e9cfc9aSjacobs } 102*4e9cfc9aSjacobs #undef NELEM 103*4e9cfc9aSjacobs *command_set = calloc(++i, sizeof (char *)); 104*4e9cfc9aSjacobs for (i = 0; (cmds)[i] != NULL; i++) 105*4e9cfc9aSjacobs (*command_set)[i] = cmds[i]; 106*4e9cfc9aSjacobs } 107*4e9cfc9aSjacobs } 108*4e9cfc9aSjacobs 109*4e9cfc9aSjacobs return (0); 110*4e9cfc9aSjacobs } 111*4e9cfc9aSjacobs 112*4e9cfc9aSjacobs 113*4e9cfc9aSjacobs int 114*4e9cfc9aSjacobs add_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer, 115*4e9cfc9aSjacobs char *model, char *description, char *serial_number, 116*4e9cfc9aSjacobs char **command_set, char *device) 117*4e9cfc9aSjacobs { 118*4e9cfc9aSjacobs #define NP(x) (x?x:"") 119*4e9cfc9aSjacobs HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, " 120*4e9cfc9aSjacobs "description=%s, serial=%s, device=%s\n", 121*4e9cfc9aSjacobs NP(udi), NP(manufacturer), NP(model), NP(description), 122*4e9cfc9aSjacobs NP(serial_number), NP(device))); 123*4e9cfc9aSjacobs #undef NP 124*4e9cfc9aSjacobs 125*4e9cfc9aSjacobs if (model != NULL) 126*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs, 127*4e9cfc9aSjacobs "info.product", model); 128*4e9cfc9aSjacobs if (manufacturer != NULL) 129*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs, 130*4e9cfc9aSjacobs "printer.vendor", manufacturer); 131*4e9cfc9aSjacobs if (model != NULL) 132*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs, 133*4e9cfc9aSjacobs "printer.product", model); 134*4e9cfc9aSjacobs if (serial_number != NULL) 135*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs, 136*4e9cfc9aSjacobs "printer.serial", serial_number); 137*4e9cfc9aSjacobs if (description != NULL) 138*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs, 139*4e9cfc9aSjacobs "printer.description", description); 140*4e9cfc9aSjacobs if (command_set != NULL) 141*4e9cfc9aSjacobs libhal_changeset_set_property_strlist(cs, "printer.commandset", 142*4e9cfc9aSjacobs (const char **)command_set); 143*4e9cfc9aSjacobs if (device != NULL) 144*4e9cfc9aSjacobs libhal_changeset_set_property_string(cs, 145*4e9cfc9aSjacobs "printer.device", device); 146*4e9cfc9aSjacobs 147*4e9cfc9aSjacobs return (0); 148*4e9cfc9aSjacobs } 149