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