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