Fix a output bug in dump_memory() where 0x7f was displayed as-is.
Add a better interface(s) reader thread handling. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3270 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -842,7 +842,7 @@ void dump_memory
|
||||
|
||||
for (j = i; j < len && j < i+16;j++)
|
||||
{
|
||||
if ( byte[j] >= ' ' && byte[j] < 0x7f )
|
||||
if ( byte[j] >= ' ' && byte[j] <= 0x7e )
|
||||
*ptr = byte[j];
|
||||
else
|
||||
*ptr = '.';
|
||||
@@ -853,7 +853,8 @@ void dump_memory
|
||||
ptr++;
|
||||
*ptr = '\0';
|
||||
|
||||
DPRINTF(prefix);
|
||||
if (prefix)
|
||||
DPRINTF(prefix);
|
||||
DPRINTF(text);
|
||||
|
||||
// next line
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
// #include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <KernelExport.h>
|
||||
#include <OS.h>
|
||||
@@ -68,6 +68,7 @@ status_t start_datalink_layer()
|
||||
close_module_list(module_list);
|
||||
};
|
||||
|
||||
// auto-start interface(s)
|
||||
acquire_sem(g_interfaces.lock);
|
||||
iface = g_interfaces.first;
|
||||
while (iface) {
|
||||
@@ -169,7 +170,12 @@ status_t unregister_interface(ifnet_t *iface)
|
||||
release_sem(g_interfaces.lock);
|
||||
|
||||
printf("datalink: unregister_interface(%s)\n", iface->if_name);
|
||||
return iface->module->uninit(iface);
|
||||
|
||||
enable_interface(iface, false);
|
||||
iface->module->uninit(iface);
|
||||
put_module(iface->module->info.name);
|
||||
free(iface);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -177,7 +183,9 @@ status_t unregister_interface(ifnet_t *iface)
|
||||
status_t enable_interface(ifnet_t *iface, bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
// enable this interface
|
||||
thread_id tid;
|
||||
char name[B_OS_NAME_LENGTH * 2];
|
||||
|
||||
if (iface->if_flags & IFF_UP)
|
||||
// already up
|
||||
@@ -185,8 +193,9 @@ status_t enable_interface(ifnet_t *iface, bool enable)
|
||||
|
||||
iface->module->up(iface);
|
||||
|
||||
tid = spawn_kernel_thread(interface_reader, iface->if_name,
|
||||
B_NORMAL_PRIORITY, iface);
|
||||
strncpy(name, iface->if_name, sizeof(name));
|
||||
strncat(name, " reader", sizeof(name));
|
||||
tid = spawn_kernel_thread(interface_reader, name, B_NORMAL_PRIORITY, iface);
|
||||
if (tid < 0) {
|
||||
printf("datalink: enable_interface(%s): failed to start reader thread -> %d [%s]\n",
|
||||
iface->if_name, (int) tid, strerror(tid));
|
||||
@@ -195,13 +204,25 @@ status_t enable_interface(ifnet_t *iface, bool enable)
|
||||
|
||||
iface->if_reader_thread = tid;
|
||||
iface->if_flags |= IFF_UP;
|
||||
printf("datalink: starting interface %s...\n", iface->if_name);
|
||||
printf("datalink: %s interface reader started.\n", iface->if_name);
|
||||
return resume_thread(tid);
|
||||
|
||||
} else {
|
||||
|
||||
// disable this interface
|
||||
if ((iface->if_flags & IFF_UP) == 0)
|
||||
// already down
|
||||
return B_OK;
|
||||
|
||||
if (iface->if_reader_thread) {
|
||||
kill_thread(iface->if_reader_thread);
|
||||
status_t status;
|
||||
|
||||
send_signal_etc(iface->if_reader_thread, SIGTERM, 0);
|
||||
wait_for_thread(iface->if_reader_thread, &status);
|
||||
iface->if_reader_thread = -1;
|
||||
printf("datalink: %s interface reader stopped.\n", iface->if_name);
|
||||
};
|
||||
|
||||
iface->if_flags &= ~IFF_UP;
|
||||
return iface->module->down(iface);
|
||||
};
|
||||
@@ -213,7 +234,7 @@ status_t interface_reader(void *args)
|
||||
{
|
||||
ifnet_t *iface = args;
|
||||
net_data *nd;
|
||||
status_t status;
|
||||
status_t status;
|
||||
|
||||
if (!iface || iface->module == NULL)
|
||||
return B_ERROR;
|
||||
@@ -222,6 +243,7 @@ status_t interface_reader(void *args)
|
||||
status = iface->module->receive_data(iface, &nd);
|
||||
if (status < B_OK || nd == NULL)
|
||||
continue;
|
||||
|
||||
dump_data(nd);
|
||||
delete_data(nd, false);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user