2005-03-14 Ray Strode <rstrode@redhat.com>
Fourth (probably working) cut at porting to dbus 0.30 api and new hal. This cut adds some new logging macros to make debugging easier. * dispatcher-daemon/NetworkManagerDispatcher.c: * info-daemon/NetworkmanagerInfo.c: * info-daemon/NetworkManagerInfoPassphraseDialog.c: * info-daemon/NetworkManagerInfoVPN.c: * src/NetworkManager.c: * src/NetworkManagerAP.c: * src/NetworkManagerAPList.c: * src/NetworkManagerDHCP.c: * src/NetworkManagerDbus.c: * src/NetworkManagerDevice.c: * src/NetworkManagerPolicy.c: * src/NetworkManagerSystem.c: * src/NetworkManagerUtils.c: * src/NetworkManagerWireless.c: * src/autoip.c: * src/nm-dbus-nm.c: * src/backends/NetworkManagerDebian.c: * src/backends/NetworkManagerGentoo.c: * src/backends/NetworkManagerRedHat.c: * src/backends/NetworkManagerSlackware.c: use new logging macros. * dispatcher-daemon/NetworkManagerDispatcher.c: (nmd_dbus_filter): s/dbus_free/g_free/ * info-daemon/Makefile.am: link in utils library. * info-daemon/NetworkmanagerInfo.c: use new logging macros. (nmi_dbus_get_network): don't assume enumerations are 32-bit. (nmi_dbus_nmi_message_handler): don't free what doesn't belong to us. * libnm_glib/libnm_glib.c: (libnm_glib_get_nm_status): (libnm_glib_init): don't free what doesn't belong to us. (libnm_glib_dbus): strdup result, so it doesn't get lost when message is unref'd. * panel-applet/NMWirelessAppletDbus.c: (nmwa_dbus_update_devices): s/dbus_free/g_free/ * src/NetworkManager.c: (nm_monitor_wired_link_state): request initial status dump of all cards when we start up, instead of relying on /sys/.../carrier. (nm_info_handler), (nm_set_up_log_handlers): log handlers to specify what syslog priorites the logging macros default to. * src/NetworkManagerAPList.c: (nm_ap_list_populate_from_nmi): s/dbus_free_string_array/g_strfreev/ * src/NetworkManagerDbus.c: (nm_dbus_get_network_object): validate d-bus message argument types. Advance message iterator after reading argument, prepend instead of append to GSList. * src/NetworkManagerDevice.c: (nm_device_probe_wired_link_status): remove redundant /sys in /sys path. remove wrong contents == NULL means has carrier assumption. * src/nm-netlink-monitor.c (nm_netlink_monitor_request_status): implement function to ask kernel to dump interface link status over netlink socket. * test/*.c: s/dbus_free/g_free/ * utils/nm-utils.h: (nm_print_backtrace): new macro to print backtrace. (nm_get_timestamp): new macro to get sub-second precise unix timestamp. (nm_info), (nm_debug), (nm_warning), (nm_error): new logging functions. nm_info just prints, nm_debug includes timestamp and function, nm_warning includes function, nm_error includes backtrace and sigtrap. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@497 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
@@ -37,6 +37,7 @@
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#include "nm-netlink-monitor.h"
|
||||
#include "nm-utils.h"
|
||||
|
||||
#define NM_NETLINK_MONITOR_EVENT_CONDITIONS \
|
||||
((GIOCondition) (G_IO_IN | G_IO_PRI))
|
||||
@@ -225,7 +226,6 @@ nm_netlink_monitor_init (NmNetlinkMonitor *monitor)
|
||||
monitor->priv = G_TYPE_INSTANCE_GET_PRIVATE (monitor,
|
||||
NM_TYPE_NETLINK_MONITOR,
|
||||
NmNetlinkMonitorPrivate);
|
||||
|
||||
monitor->priv->context = NULL;
|
||||
monitor->priv->io_channel = NULL;
|
||||
monitor->priv->event_source = NULL;
|
||||
@@ -313,10 +313,113 @@ nm_netlink_monitor_detach (NmNetlinkMonitor *monitor)
|
||||
monitor->priv->context = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
nm_netlink_monitor_request_status (NmNetlinkMonitor *monitor)
|
||||
gboolean
|
||||
nm_netlink_monitor_request_status (NmNetlinkMonitor *monitor,
|
||||
GError **error)
|
||||
{
|
||||
|
||||
typedef struct
|
||||
{
|
||||
struct nlmsghdr header;
|
||||
struct rtgenmsg request;
|
||||
} NmNetlinkMonitorStatusPacket;
|
||||
NmNetlinkMonitorStatusPacket packet = { { 0 } };
|
||||
struct sockaddr_nl recipient = { 0 };
|
||||
static guint32 sequence_number;
|
||||
int fd, saved_errno;
|
||||
ssize_t num_bytes_sent;
|
||||
size_t num_bytes_to_send, total_bytes_sent;
|
||||
gdouble max_wait_period, now;
|
||||
const gchar *buffer;
|
||||
GError *socket_error;
|
||||
|
||||
fd = g_io_channel_unix_get_fd (monitor->priv->io_channel);
|
||||
|
||||
recipient.nl_family = AF_NETLINK;
|
||||
recipient.nl_pid = 0; /* going to kernel */
|
||||
recipient.nl_groups = RTMGRP_LINK;
|
||||
|
||||
packet.header.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtgenmsg));
|
||||
packet.header.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
|
||||
packet.header.nlmsg_type = RTM_GETLINK;
|
||||
packet.header.nlmsg_pid = getpid ();
|
||||
/* Might be good to generate a unique sequence number and track
|
||||
the response */
|
||||
packet.header.nlmsg_seq = sequence_number << 16;
|
||||
sequence_number++;
|
||||
|
||||
packet.request.rtgen_family = AF_UNSPEC;
|
||||
|
||||
nm_get_timestamp (&now);
|
||||
|
||||
/* only block for around 1.5 seconds
|
||||
* FIXME: maybe too long? */
|
||||
max_wait_period = now + 1.5;
|
||||
num_bytes_sent = 0;
|
||||
buffer = (const gchar *) &packet;
|
||||
num_bytes_to_send = sizeof (packet);
|
||||
total_bytes_sent = 0;
|
||||
socket_error = NULL;
|
||||
do
|
||||
{
|
||||
num_bytes_sent = sendto (fd,
|
||||
buffer + total_bytes_sent,
|
||||
num_bytes_to_send,
|
||||
MSG_DONTWAIT,
|
||||
(struct sockaddr *) &recipient,
|
||||
sizeof (recipient));
|
||||
if (num_bytes_sent < 0)
|
||||
{
|
||||
saved_errno = errno;
|
||||
|
||||
if ((saved_errno == EAGAIN) ||
|
||||
(saved_errno == EWOULDBLOCK))
|
||||
{
|
||||
nm_get_timestamp (&now);
|
||||
if ((max_wait_period - now) > G_MINDOUBLE)
|
||||
{
|
||||
saved_errno = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
socket_error =
|
||||
g_error_new (NM_NETLINK_MONITOR_ERROR,
|
||||
NM_NETLINK_MONITOR_ERROR_SENDING_TO_SOCKET,
|
||||
"%s", g_strerror (saved_errno));
|
||||
break;
|
||||
}
|
||||
|
||||
total_bytes_sent += num_bytes_sent;
|
||||
num_bytes_to_send -= num_bytes_sent;
|
||||
|
||||
nm_get_timestamp (&now);
|
||||
|
||||
if ((max_wait_period - now) < G_MINDOUBLE)
|
||||
{
|
||||
socket_error =
|
||||
g_error_new (NM_NETLINK_MONITOR_ERROR,
|
||||
NM_NETLINK_MONITOR_ERROR_SENDING_TO_SOCKET,
|
||||
_("operation took too long"));
|
||||
break;
|
||||
}
|
||||
} while (num_bytes_to_send > 0);
|
||||
|
||||
if (socket_error != NULL)
|
||||
{
|
||||
if (error != NULL)
|
||||
g_propagate_error (error, socket_error);
|
||||
else
|
||||
{
|
||||
g_signal_emit (G_OBJECT (monitor),
|
||||
nm_netlink_monitor_signals[ERROR],
|
||||
0, socket_error);
|
||||
g_error_free (socket_error);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -427,7 +530,7 @@ receive_pending_bytes (GIOChannel *channel,
|
||||
if (saved_errno != 0)
|
||||
{
|
||||
g_set_error (error, NM_NETLINK_MONITOR_ERROR,
|
||||
NM_NETLINK_MONITOR_ERROR_READING_SOCKET,
|
||||
NM_NETLINK_MONITOR_ERROR_READING_FROM_SOCKET,
|
||||
_("%s"), g_strerror (saved_errno));
|
||||
succeeded = FALSE;
|
||||
goto out;
|
||||
|
Reference in New Issue
Block a user