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