14e9cfc9aSjacobs /***************************************************************************
24e9cfc9aSjacobs *
34e9cfc9aSjacobs * probe-network-printer.c : Probe for snmp printer device information
44e9cfc9aSjacobs *
54e9cfc9aSjacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
64e9cfc9aSjacobs * Use is subject to license terms.
74e9cfc9aSjacobs *
84e9cfc9aSjacobs * Licensed under the Academic Free License version 2.1
94e9cfc9aSjacobs *
104e9cfc9aSjacobs **************************************************************************/
114e9cfc9aSjacobs
124e9cfc9aSjacobs #ifdef HAVE_CONFIG_H
134e9cfc9aSjacobs # include <config.h>
144e9cfc9aSjacobs #endif
154e9cfc9aSjacobs
164e9cfc9aSjacobs #include <errno.h>
174e9cfc9aSjacobs #include <string.h>
184e9cfc9aSjacobs #include <strings.h>
194e9cfc9aSjacobs #include <ctype.h>
204e9cfc9aSjacobs #include <stdlib.h>
214e9cfc9aSjacobs #include <stdio.h>
224e9cfc9aSjacobs #include <sys/ioctl.h>
234e9cfc9aSjacobs #include <sys/prnio.h>
244e9cfc9aSjacobs #include <fcntl.h>
254e9cfc9aSjacobs #include <unistd.h>
264e9cfc9aSjacobs #include <ctype.h>
274e9cfc9aSjacobs
284e9cfc9aSjacobs #include <libhal.h>
294e9cfc9aSjacobs #include <logger.h>
304e9cfc9aSjacobs
314e9cfc9aSjacobs #include "printer.h"
324e9cfc9aSjacobs
33*2a8bcb4eSToomas Soome int
main(int argc,char * argv[])344e9cfc9aSjacobs main(int argc, char *argv[])
354e9cfc9aSjacobs {
364e9cfc9aSjacobs int ret = 1;
374e9cfc9aSjacobs char *udi;
384e9cfc9aSjacobs char *printer_address,
394e9cfc9aSjacobs *community;
404e9cfc9aSjacobs DBusError error;
414e9cfc9aSjacobs LibHalContext *ctx = NULL;
424e9cfc9aSjacobs LibHalChangeSet *cs = NULL;
434e9cfc9aSjacobs char *manufacturer = NULL,
444e9cfc9aSjacobs *model = NULL,
454e9cfc9aSjacobs *serial_number = NULL,
464e9cfc9aSjacobs *description = NULL,
474e9cfc9aSjacobs **command_set = NULL,
484e9cfc9aSjacobs *device_uri = NULL;
494e9cfc9aSjacobs extern int snmp_printer_info(char *hostname, char *community,
504e9cfc9aSjacobs char **manufacturer, char **model, char **description,
514e9cfc9aSjacobs char **serial_number, char ***command_set,
524e9cfc9aSjacobs char **device_uri);
534e9cfc9aSjacobs
544e9cfc9aSjacobs dbus_error_init(&error);
554e9cfc9aSjacobs
564e9cfc9aSjacobs if ((udi = getenv("UDI")) == NULL)
574e9cfc9aSjacobs goto out;
584e9cfc9aSjacobs
594e9cfc9aSjacobs printer_address = getenv("HAL_PROP_NETWORK_DEVICE_ADDRESS");
604e9cfc9aSjacobs if (printer_address == NULL)
614e9cfc9aSjacobs goto out;
624e9cfc9aSjacobs
634e9cfc9aSjacobs community = getenv("HAL_PROP_NETWORK_DEVICE_SNMP_COMMUNITY");
644e9cfc9aSjacobs if (community == NULL)
654e9cfc9aSjacobs community = "public";
664e9cfc9aSjacobs
674e9cfc9aSjacobs setup_logger();
684e9cfc9aSjacobs
694e9cfc9aSjacobs dbus_error_init(&error);
704e9cfc9aSjacobs
714e9cfc9aSjacobs if ((ctx = libhal_ctx_init_direct(&error)) == NULL)
724e9cfc9aSjacobs goto out;
734e9cfc9aSjacobs
744e9cfc9aSjacobs if ((cs = libhal_device_new_changeset(udi)) == NULL) {
754e9cfc9aSjacobs HAL_DEBUG(("Cannot allocate changeset"));
764e9cfc9aSjacobs goto out;
774e9cfc9aSjacobs }
784e9cfc9aSjacobs
794e9cfc9aSjacobs /* Probe the printer for characteristics via SNMP */
804e9cfc9aSjacobs ret = snmp_printer_info(printer_address, community, &manufacturer,
814e9cfc9aSjacobs &model, &description, &serial_number, &command_set,
824e9cfc9aSjacobs &device_uri);
834e9cfc9aSjacobs if (ret < 0) {
844e9cfc9aSjacobs HAL_DEBUG(("Cannot get snmp data for %s: %s",
854e9cfc9aSjacobs printer_address, strerror(errno)));
864e9cfc9aSjacobs goto out;
874e9cfc9aSjacobs }
884e9cfc9aSjacobs
894e9cfc9aSjacobs /* Add printer characteristics to the HAL device tree */
904e9cfc9aSjacobs ret = add_printer_info(cs, udi, manufacturer, model, description,
914e9cfc9aSjacobs serial_number, command_set, device_uri);
924e9cfc9aSjacobs if (ret < 0) {
934e9cfc9aSjacobs HAL_DEBUG(("Cannot add printer data for %s to %s: %s",
944e9cfc9aSjacobs printer_address, udi, strerror(errno)));
954e9cfc9aSjacobs goto out;
964e9cfc9aSjacobs }
974e9cfc9aSjacobs
984e9cfc9aSjacobs libhal_device_commit_changeset(ctx, cs, &error);
994e9cfc9aSjacobs
1004e9cfc9aSjacobs ret = 0;
1014e9cfc9aSjacobs
1024e9cfc9aSjacobs out:
1034e9cfc9aSjacobs if (cs != NULL) {
1044e9cfc9aSjacobs libhal_device_free_changeset(cs);
1054e9cfc9aSjacobs }
1064e9cfc9aSjacobs
1074e9cfc9aSjacobs if (ctx != NULL) {
1084e9cfc9aSjacobs if (dbus_error_is_set(&error)) {
1094e9cfc9aSjacobs dbus_error_free(&error);
1104e9cfc9aSjacobs }
1114e9cfc9aSjacobs libhal_ctx_shutdown(ctx, &error);
1124e9cfc9aSjacobs libhal_ctx_free(ctx);
1134e9cfc9aSjacobs }
1144e9cfc9aSjacobs
1154e9cfc9aSjacobs return (ret);
1164e9cfc9aSjacobs }
117