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:
Ray Strode
2005-03-15 05:30:15 +00:00
parent 0790d2fc3e
commit 278e500f99
32 changed files with 831 additions and 305 deletions

View File

@@ -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;