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