1 /*************************************************************************** 2 * 3 * probe-network-printer.c : Probe for snmp printer device information 4 * 5 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 6 * Use is subject to license terms. 7 * 8 * Licensed under the Academic Free License version 2.1 9 * 10 **************************************************************************/ 11 12 #pragma ident "%Z%%M% %I% %E% SMI" 13 14 #ifdef HAVE_CONFIG_H 15 # include <config.h> 16 #endif 17 18 #include <errno.h> 19 #include <string.h> 20 #include <strings.h> 21 #include <ctype.h> 22 #include <stdlib.h> 23 #include <stdio.h> 24 #include <sys/ioctl.h> 25 #include <sys/prnio.h> 26 #include <fcntl.h> 27 #include <unistd.h> 28 #include <ctype.h> 29 30 #include <libhal.h> 31 #include <logger.h> 32 33 #include "printer.h" 34 35 int 36 main(int argc, char *argv[]) 37 { 38 int ret = 1; 39 char *udi; 40 char *printer_address, 41 *community; 42 DBusError error; 43 LibHalContext *ctx = NULL; 44 LibHalChangeSet *cs = NULL; 45 char *manufacturer = NULL, 46 *model = NULL, 47 *serial_number = NULL, 48 *description = NULL, 49 **command_set = NULL, 50 *device_uri = NULL; 51 extern int snmp_printer_info(char *hostname, char *community, 52 char **manufacturer, char **model, char **description, 53 char **serial_number, char ***command_set, 54 char **device_uri); 55 56 dbus_error_init(&error); 57 58 if ((udi = getenv("UDI")) == NULL) 59 goto out; 60 61 printer_address = getenv("HAL_PROP_NETWORK_DEVICE_ADDRESS"); 62 if (printer_address == NULL) 63 goto out; 64 65 community = getenv("HAL_PROP_NETWORK_DEVICE_SNMP_COMMUNITY"); 66 if (community == NULL) 67 community = "public"; 68 69 setup_logger(); 70 71 dbus_error_init(&error); 72 73 if ((ctx = libhal_ctx_init_direct(&error)) == NULL) 74 goto out; 75 76 if ((cs = libhal_device_new_changeset(udi)) == NULL) { 77 HAL_DEBUG(("Cannot allocate changeset")); 78 goto out; 79 } 80 81 /* Probe the printer for characteristics via SNMP */ 82 ret = snmp_printer_info(printer_address, community, &manufacturer, 83 &model, &description, &serial_number, &command_set, 84 &device_uri); 85 if (ret < 0) { 86 HAL_DEBUG(("Cannot get snmp data for %s: %s", 87 printer_address, strerror(errno))); 88 goto out; 89 } 90 91 /* Add printer characteristics to the HAL device tree */ 92 ret = add_printer_info(cs, udi, manufacturer, model, description, 93 serial_number, command_set, device_uri); 94 if (ret < 0) { 95 HAL_DEBUG(("Cannot add printer data for %s to %s: %s", 96 printer_address, udi, strerror(errno))); 97 goto out; 98 } 99 100 libhal_device_commit_changeset(ctx, cs, &error); 101 102 ret = 0; 103 104 out: 105 if (cs != NULL) { 106 libhal_device_free_changeset(cs); 107 } 108 109 if (ctx != NULL) { 110 if (dbus_error_is_set(&error)) { 111 dbus_error_free(&error); 112 } 113 libhal_ctx_shutdown(ctx, &error); 114 libhal_ctx_free(ctx); 115 } 116 117 return (ret); 118 } 119