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