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