97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Use is subject to license terms.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Licensed under the Academic Free License version 2.1
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#include "../../hald/logger.h"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs#define DBUS_INTERFACE "org.freedesktop.Hal.Device.NetworkDiscovery"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobstypedef struct {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsnds_snmp_scan(LibHalContext *ctx, char *parent, char *community, char *network)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* scan for devices */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs for (elem = list; elem != NULL; elem = g_list_next(elem)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs scan_for_devices_using_snmp(ctx, parent, community, network);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* remove devices that haven't been seen since before this scan */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs nds_snmp_scan(args->ctx, args->parent, args->community, args->network);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsnds_EnablePrinterScanningViaSNMP(LibHalContext *ctx, char *parent, int interval,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("NetworkDiscovery.EnablePrinterScanningViaSNMP(0x%8.8x, %s, %d, %s, %s)",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs ctx, NP(parent), interval, NP(community), NP(network)));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* are we already discoverying network devices ? */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* setup for network device discovery */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((snmp_cb_data = calloc(1, sizeof (*snmp_cb_data))) != NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* prime the pump with an initial scan */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* add a regular network scan */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs g_timeout_add(interval * 1000, nds_snmp_scan_cb, snmp_cb_data);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("NetworkDiscovery.DisablePrinterScanningViaSNMP(0x%8.8x)", ctx));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsnds_ScanForPrintersViaSNMP(LibHalContext *ctx, char *parent, char *community,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("NetworkDiscovery.ScanForPrintersViaSNMP(0x%8.8x, %s, %s, %s)",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (nds_snmp_scan(ctx, parent, community, network));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsnds_filter_function(DBusConnection *connection, DBusMessage *message,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs const char *member = dbus_message_get_member(message);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs rc = nds_EnablePrinterScanningViaSNMP(ctx, udi, interval,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs rc = nds_ScanForPrintersViaSNMP(ctx, udi, community, network);
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China /* bypass not-handled messages */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_WARNING(("Unknown DBus message: %s, %s ", member, path));
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((reply = dbus_message_new_method_return(message)) == NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_WARNING(("Could not allocate memory for the DBus reply"));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs dbus_message_append_args(reply, DBUS_TYPE_INT32, &rc,
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (!dbus_connection_send(connection, reply, NULL)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobsnds_claim_interface(LibHalContext *ctx, char *udi, DBusError *error)
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "<method name=\"EnablePrinterScanningViaSNMP\">\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"interval\" direction=\"in\" type=\"i\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"community\" direction=\"in\" type=\"s\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"network\" direction=\"in\" type=\"s\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"return_code\" direction=\"out\" type=\"i\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "</method>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "<method name=\"DisablePrinterScanningViaSNMP\">\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"return_code\" direction=\"out\" type=\"i\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "</method>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "<method name=\"ScanForPrintersViaSNMP\">\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"community\" direction=\"in\" type=\"s\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"network\" direction=\"in\" type=\"s\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs " <arg name=\"return_code\" direction=\"out\" type=\"i\"/>\n"
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs "</method>\n";
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_DEBUG(("nds_claim_interface(0x%8.8x, %s, 0x%8.8x): %s",
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((connection = libhal_ctx_get_dbus_connection(ctx)) == NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (-1);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs HAL_WARNING(("Could not claim interface: %s", error->message));
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (-1);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs dbus_connection_add_filter(connection, nds_filter_function, ctx, NULL);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs dbus_connection_set_exit_on_disconnect(connection, 0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * Start with the 'basic' privilege set and then remove any
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs * of the 'basic' privileges that will not be needed.
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((pPrivSet = priv_str_to_set("basic", ",", NULL)) == NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* Clear privileges we will not need from the 'basic' set */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* Set the permitted privilege set. */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (setppriv(PRIV_SET, PRIV_PERMITTED, pPrivSet) != 0) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* Clear the limit set. */
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if ((ctx = libhal_ctx_init_direct(&error)) == NULL) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs if (!libhal_device_addon_is_ready(ctx, udi, &error)) {
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs return (0);
4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3jacobs /* NOTREACHED */