4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs/***************************************************************************
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * probe-network-printer.c : Probe for snmp printer device information
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Use is subject to license terms.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Licensed under the Academic Free License version 2.1
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs **************************************************************************/
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#pragma ident "%Z%%M% %I% %E% SMI"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#ifdef HAVE_CONFIG_H
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs# include <config.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#endif
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <errno.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <string.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <strings.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <ctype.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <stdlib.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <stdio.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <sys/ioctl.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <sys/prnio.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <fcntl.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <unistd.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <ctype.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <libhal.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include <logger.h>
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include "printer.h"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsint
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsmain(int argc, char *argv[])
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs{
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs int ret = 1;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *udi;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *printer_address,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *community;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs DBusError error;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs LibHalContext *ctx = NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs LibHalChangeSet *cs = NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char *manufacturer = NULL,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *model = NULL,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *serial_number = NULL,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *description = NULL,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs **command_set = NULL,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs *device_uri = NULL;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs extern int snmp_printer_info(char *hostname, char *community,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char **manufacturer, char **model, char **description,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char **serial_number, char ***command_set,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs char **device_uri);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs dbus_error_init(&error);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((udi = getenv("UDI")) == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs goto out;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs printer_address = getenv("HAL_PROP_NETWORK_DEVICE_ADDRESS");
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (printer_address == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs goto out;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs community = getenv("HAL_PROP_NETWORK_DEVICE_SNMP_COMMUNITY");
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (community == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs community = "public";
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs setup_logger();
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs dbus_error_init(&error);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((ctx = libhal_ctx_init_direct(&error)) == NULL)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs goto out;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((cs = libhal_device_new_changeset(udi)) == NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("Cannot allocate changeset"));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs goto out;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* Probe the printer for characteristics via SNMP */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs ret = snmp_printer_info(printer_address, community, &manufacturer,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs &model, &description, &serial_number, &command_set,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs &device_uri);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (ret < 0) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("Cannot get snmp data for %s: %s",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs printer_address, strerror(errno)));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs goto out;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* Add printer characteristics to the HAL device tree */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs ret = add_printer_info(cs, udi, manufacturer, model, description,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs serial_number, command_set, device_uri);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (ret < 0) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("Cannot add printer data for %s to %s: %s",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs printer_address, udi, strerror(errno)));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs goto out;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_device_commit_changeset(ctx, cs, &error);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs ret = 0;
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsout:
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (cs != NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_device_free_changeset(cs);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (ctx != NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (dbus_error_is_set(&error)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs dbus_error_free(&error);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_ctx_shutdown(ctx, &error);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs libhal_ctx_free(ctx);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs }
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (ret);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs}