printer.c revision 5307:ea4512a0e608
1230363Sdas/* 2129203Scognet * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 3129203Scognet * Use is subject to license terms. 4129203Scognet * 5129203Scognet * Licensed under the Academic Free License version 2.1 6129203Scognet */ 7129203Scognet 8230190Sdas#pragma ident "%Z%%M% %I% %E% SMI" 9230190Sdas 10230190Sdas#ifdef HAVE_CONFIG_H 11230190Sdas#include <config.h> 12129203Scognet#endif 13230190Sdas 14230190Sdas#include <errno.h> 15230190Sdas#include <strings.h> 16230190Sdas#include <ctype.h> 17230190Sdas#include <stdlib.h> 18230190Sdas#include <stdio.h> 19230363Sdas#include <unistd.h> 20230363Sdas#include <ctype.h> 21230363Sdas 22129203Scognet#include <libhal.h> 23129203Scognet#include <logger.h> 24129203Scognet 25129203Scognet#include "printer.h" 26129203Scognet 27129203Scognetstatic char * 28129203Scognetstrip_ws(char *s) 29230363Sdas{ 30230363Sdas if (s != NULL) { 31230363Sdas char *p; 32129203Scognet 33129203Scognet /* skip the leading whitespace */ 34230363Sdas for (; ((*s != NULL) && (isspace(*s) != 0)); s++); 35230363Sdas 36230363Sdas /* drop the trailing whitespace */ 37129203Scognet for (p = s + strlen(s) - 1; ((p > s) && (isspace(*p) != 0)); 38129203Scognet p--); 39230363Sdas *(++p) = '\0'; 40230363Sdas } 41230363Sdas 42129203Scognet return (s); 43129203Scognet} 44230363Sdas 45230363Sdasint 46230363Sdasieee1284_devid_to_printer_info(char *devid_string, char **manufacturer, 47230363Sdas char **model, char **description, char **class, 48230363Sdas char **serial_no, char ***command_set) 49230363Sdas{ 50230363Sdas char *iter = NULL; 51230363Sdas char *s; 52230363Sdas 53230363Sdas if (devid_string == NULL) 54129203Scognet return (-1); 55129203Scognet 56230363Sdas /* parse the 1284 device id string */ 57230363Sdas for (s = (char *)strtok_r(devid_string, ";\n", &iter); s != NULL; 58230363Sdas s = (char *)strtok_r(NULL, ";\n", &iter)) { 59129203Scognet char *t, *u, *iter2 = NULL; 60129203Scognet 61230363Sdas if ((t = (char *)strtok_r(s, ":\n", &iter2)) == NULL) 62230363Sdas continue; 63230363Sdas 64230363Sdas if ((u = (char *)strtok_r(NULL, ":\n", &iter2)) == NULL) 65230363Sdas continue; 66230363Sdas 67230363Sdas if (((strcasecmp(t, "MFG") == 0) || 68230363Sdas (strcasecmp(t, "MANUFACTURER") == 0)) && 69230363Sdas (manufacturer != NULL)) 70230363Sdas *manufacturer = strdup(strip_ws(u)); 71230363Sdas else if (((strcasecmp(t, "MDL") == 0) || 72230363Sdas (strcasecmp(t, "MODEL") == 0)) && 73230363Sdas (model != NULL)) 74230363Sdas *model = strdup(strip_ws(u)); 75230363Sdas else if (((strcasecmp(t, "DES") == 0) || 76230363Sdas (strcasecmp(t, "DESCRIPTION") == 0)) && 77230363Sdas (description != NULL)) 78230363Sdas *description = strdup(strip_ws(u)); 79230363Sdas else if (((strcasecmp(t, "CLS") == 0) || 80230363Sdas (strcasecmp(t, "CLASS") == 0)) && 81230363Sdas (class != NULL)) 82230363Sdas *class = strdup(strip_ws(u)); 83230363Sdas else if (((strcasecmp(t, "SER") == 0) || 84129203Scognet (strcasecmp(t, "SERNO") == 0)) && 85129203Scognet (serial_no != NULL)) 86230363Sdas *serial_no = strdup(strip_ws(u)); 87230363Sdas else if (((strcasecmp(t, "CMD") == 0) || 88230363Sdas (strcasecmp(t, "COMMAND SET") == 0)) && 89129203Scognet (command_set != NULL)) { 90129203Scognet /* this should be more dynamic, I got lazy */ 91230363Sdas char *v, *iter3 = NULL; 92230363Sdas char *cmds[32]; 93230363Sdas int i = 0; 94230363Sdas 95230363Sdas memset(&cmds, 0, sizeof (cmds)); 96230363Sdas#define NELEM(a) (sizeof (a) / sizeof (*(a))) 97230363Sdas for (v = strtok_r(u, ",\n", &iter3); 98230363Sdas ((v != NULL) && (i < NELEM(cmds))); 99129203Scognet v = strtok_r(NULL, ",\n", &iter3)) { 100129203Scognet cmds[i++] = strdup(strip_ws(v)); 101230363Sdas } 102230363Sdas#undef NELEM 103230363Sdas *command_set = calloc(++i, sizeof (char *)); 104230363Sdas for (i = 0; (cmds)[i] != NULL; i++) 105230363Sdas (*command_set)[i] = cmds[i]; 106230363Sdas } 107230363Sdas } 108230363Sdas 109230363Sdas return (0); 110230363Sdas} 111230363Sdas 112230363Sdas 113230363Sdasint 114129203Scognetadd_printer_info(LibHalChangeSet *cs, char *udi, char *manufacturer, 115230363Sdas char *model, char *description, char *serial_number, 116230363Sdas char **command_set, char *device) 117230363Sdas{ 118230363Sdas#define NP(x) (x?x:"") 119230363Sdas HAL_DEBUG(("udi: %s, snmp data: vendor=%s, product=%s, " 120230363Sdas "description=%s, serial=%s, device=%s\n", 121230363Sdas NP(udi), NP(manufacturer), NP(model), NP(description), 122230363Sdas NP(serial_number), NP(device))); 123230363Sdas#undef NP 124129203Scognet 125230363Sdas if (model != NULL) 126230363Sdas libhal_changeset_set_property_string(cs, 127230363Sdas "info.product", model); 128230363Sdas if (manufacturer != NULL) 129230363Sdas libhal_changeset_set_property_string(cs, 130230363Sdas "printer.vendor", manufacturer); 131230363Sdas if (model != NULL) 132230363Sdas libhal_changeset_set_property_string(cs, 133230363Sdas "printer.product", model); 134230363Sdas if (serial_number != NULL) 135230363Sdas libhal_changeset_set_property_string(cs, 136230363Sdas "printer.serial", serial_number); 137230363Sdas if (description != NULL) 138230363Sdas libhal_changeset_set_property_string(cs, 139230363Sdas "printer.description", description); 140230363Sdas if (command_set != NULL) 141230363Sdas libhal_changeset_set_property_strlist(cs, "printer.commandset", 142230363Sdas (const char **)command_set); 143230363Sdas if (device != NULL) 144230363Sdas libhal_changeset_set_property_string(cs, 145230363Sdas "printer.device", device); 146230363Sdas 147230363Sdas return (0); 148230363Sdas} 149230363Sdas