* [Bluez-devel] Device specific configuration
@ 2004-02-03 16:52 Marcel Holtmann
2004-02-03 17:35 ` Fredrik Noring
0 siblings, 1 reply; 5+ messages in thread
From: Marcel Holtmann @ 2004-02-03 16:52 UTC (permalink / raw)
To: BlueZ Mailing List
[-- Attachment #1: Type: text/plain, Size: 130 bytes --]
Hi Folks,
this is the patch for the device specific configuration of hcid, that I
am going to apply. Comments?
Regards
Marcel
[-- Attachment #2: patch --]
[-- Type: text/x-patch, Size: 10250 bytes --]
Index: hcid/hcid.h
===================================================================
RCS file: /cvsroot/bluez/utils/hcid/hcid.h,v
retrieving revision 1.6
diff -u -b -w -B -r1.6 hcid.h
--- hcid/hcid.h 7 Mar 2003 23:10:30 -0000 1.6
+++ hcid/hcid.h 3 Feb 2004 16:52:26 -0000
@@ -26,10 +27,10 @@
#include <sys/types.h>
-#include "glib-ectomy.h"
-
#include <bluetooth/bluetooth.h>
+#include "glib-ectomy.h"
+
#define HCID_CONFIG_FILE "/etc/bluetooth/hcid.conf"
#define HCID_PIN_FILE "/etc/bluetooth/pin"
#define HCID_KEY_FILE "/etc/bluetooth/link_key"
@@ -45,7 +46,15 @@
uint16_t auth;
uint16_t encrypt;
};
-extern struct device_opts devi;
+
+extern struct device_opts default_device;
+extern struct device_opts *parser_device;
+
+struct device_list {
+ char *ref; /* HCI device or Bluetooth address */
+ struct device_list *next;
+ struct device_opts opts;
+};
struct link_key {
bdaddr_t sba;
@@ -83,6 +92,8 @@
#define HCID_PAIRING_ONCE 2
int read_config(char *file);
+
+struct device_opts *alloc_device_opts(char *addr);
gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, gpointer data);
gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data);
Index: hcid/lexer.l
===================================================================
RCS file: /cvsroot/bluez/utils/hcid/lexer.l,v
retrieving revision 1.2
diff -u -b -w -B -r1.2 lexer.l
--- hcid/lexer.l 24 Jun 2002 02:38:01 -0000 1.2
+++ hcid/lexer.l 3 Feb 2004 16:52:26 -0000
@@ -52,6 +52,9 @@
fname [A-Za-z0-9\_\.\-]+
path (\/{fname})+
string \".*\"
+hci hci[0-9]+
+hextuple [0-9a-zA-Z][0-9a-zA-Z]
+bdaddr {hextuple}:{hextuple}:{hextuple}:{hextuple}:{hextuple}:{hextuple}
%x OPTION PARAM
@@ -68,6 +71,16 @@
\n {
lineno++;
+}
+
+{hci} {
+ yylval.str = yytext;
+ return HCI;
+}
+
+{bdaddr} {
+ yylval.str = yytext;
+ return BDADDR;
}
{hex} {
Index: hcid/main.c
===================================================================
RCS file: /cvsroot/bluez/utils/hcid/main.c,v
retrieving revision 1.9
diff -u -b -w -B -r1.9 main.c
--- hcid/main.c 7 Mar 2003 23:10:30 -0000 1.9
+++ hcid/main.c 3 Feb 2004 16:52:26 -0000
@@ -50,7 +51,9 @@
#include "lib.h"
struct hcid_opts hcid;
-struct device_opts devi;
+struct device_opts default_device;
+struct device_opts *parser_device;
+static struct device_list *device_list = NULL;
static GMainLoop *event_loop;
@@ -64,8 +67,93 @@
printf("\thcid [-n not_daemon] [-f config file]\n");
}
+static inline void init_device_defaults(struct device_opts *device_opts)
+{
+ memset(device_opts, 0, sizeof(*device_opts));
+ device_opts->scan = SCAN_PAGE | SCAN_INQUIRY;
+}
+
+struct device_opts *alloc_device_opts(char *ref)
+{
+ struct device_list *device;
+
+ device = malloc(sizeof(struct device_list));
+ if (!device) {
+ syslog(LOG_INFO, "Can't allocate devlist opts buffer. %s(%d)",
+ strerror(errno), errno);
+ exit(1);
+ }
+
+ device->ref = ref;
+ device->next = device_list;
+ device_list = device;
+
+ init_device_defaults(&device->opts);
+
+ return &device->opts;
+}
+
+static void free_device_opts(void)
+{
+ struct device_list *device, *next;
+
+ if (default_device.name) {
+ free(default_device.name);
+ default_device.name = NULL;
+ }
+
+ for (device = device_list; device; device = next) {
+ free(device->ref);
+ if (device->opts.name)
+ free(device->opts.name);
+ next = device->next;
+ free(device);
+ }
+
+ device_list = NULL;
+}
+
+static inline struct device_opts *find_device_opts(char *ref)
+{
+ struct device_list *device;
+
+ for (device = device_list; device; device = device->next)
+ if (!strcmp(ref, device->ref))
+ return &device->opts;
+
+ return NULL;
+}
+
+static struct device_opts *get_device_opts(int sock, int hdev)
+{
+ struct device_opts *device_opts = NULL;
+ struct hci_dev_info di;
+
+ /* First try to get BD_ADDR based settings ... */
+ di.dev_id = hdev;
+ if (!ioctl(sock, HCIGETDEVINFO, (void *) &di)) {
+ char addr[18];
+ ba2str(&di.bdaddr, addr);
+ device_opts = find_device_opts(addr);
+ }
+
+ /* ... then try HCI based settings ... */
+ if (!device_opts) {
+ char ref[8];
+ snprintf(ref, sizeof(ref) - 1, "hci%d", hdev);
+ device_opts = find_device_opts(ref);
+ }
+
+ /* ... and last use the default settings. */
+ if (!device_opts)
+ device_opts = &default_device;
+
+ return device_opts;
+}
+
static void configure_device(int hdev)
{
+ struct device_opts *device_opts;
struct hci_dev_req dr;
int s;
@@ -88,16 +176,17 @@
}
dr.dev_id = hdev;
+ device_opts = get_device_opts(s, hdev);
/* Set scan mode */
- dr.dev_opt = devi.scan;
+ dr.dev_opt = device_opts->scan;
if (ioctl(s, HCISETSCAN, (unsigned long)&dr) < 0) {
syslog(LOG_ERR, "Can't set scan mode on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
}
/* Set authentication */
- if (devi.auth)
+ if (device_opts->auth)
dr.dev_opt = AUTH_ENABLED;
else
dr.dev_opt = AUTH_DISABLED;
@@ -108,7 +197,7 @@
}
/* Set encryption */
- if (devi.encrypt)
+ if (device_opts->encrypt)
dr.dev_opt = ENCRYPT_P2P;
else
dr.dev_opt = ENCRYPT_DISABLED;
@@ -119,8 +208,8 @@
}
/* Set device class */
- if (devi.class) {
- uint32_t class = htobl(devi.class);
+ if (device_opts->class) {
+ uint32_t class = htobl(device_opts->class);
write_class_of_dev_cp cp;
memcpy(cp.dev_class, &class, 3);
@@ -129,9 +218,9 @@
}
/* Set device name */
- if (devi.name) {
+ if (device_opts->name) {
change_local_name_cp cp;
- expand_name(cp.name, devi.name, hdev);
+ expand_name(cp.name, device_opts->name, hdev);
hci_send_cmd(s, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME,
CHANGE_LOCAL_NAME_CP_SIZE, (void *) &cp);
@@ -142,6 +231,7 @@
static void init_device(int hdev)
{
+ struct device_opts *device_opts;
struct hci_dev_req dr;
int s;
@@ -171,10 +261,11 @@
}
dr.dev_id = hdev;
+ device_opts = get_device_opts(s, hdev);
/* Set packet type */
- if (devi.pkt_type) {
- dr.dev_opt = devi.pkt_type;
+ if (device_opts->pkt_type) {
+ dr.dev_opt = device_opts->pkt_type;
if (ioctl(s, HCISETPTYPE, (unsigned long)&dr) < 0) {
syslog(LOG_ERR, "Can't set packet type on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -182,8 +273,8 @@
}
/* Set link mode */
- if (devi.link_mode) {
- dr.dev_opt = devi.link_mode;
+ if (device_opts->link_mode) {
+ dr.dev_opt = device_opts->link_mode;
if (ioctl(s, HCISETLINKMODE, (unsigned long)&dr) < 0) {
syslog(LOG_ERR, "Can't set link mode on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -191,8 +282,8 @@
}
/* Set link policy */
- if (devi.link_policy) {
- dr.dev_opt = devi.link_policy;
+ if (device_opts->link_policy) {
+ dr.dev_opt = device_opts->link_policy;
if (ioctl(s, HCISETLINKPOL, (unsigned long)&dr) < 0) {
syslog(LOG_ERR, "Can't set link policy on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -216,7 +307,7 @@
dl->dev_num = HCI_MAX_DEV;
dr = dl->dev_req;
- if (ioctl(ctl, HCIGETDEVLIST, (void*)dl)) {
+ if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) {
syslog(LOG_INFO, "Can't get device list. %s(%d)",
strerror(errno), errno);
exit(1);
@@ -241,10 +332,7 @@
hcid.auto_init = 0;
hcid.security = 0;
- devi.pkt_type = 0;
- devi.scan = SCAN_PAGE | SCAN_INQUIRY;
- devi.auth = 0;
- devi.encrypt = 0;
+ init_device_defaults(&default_device);
}
static void sig_usr1(int sig)
@@ -466,6 +556,8 @@
/* Start event processor */
g_main_run(event_loop);
+
+ free_device_opts();
syslog(LOG_INFO, "Exit.");
return 0;
Index: hcid/parser.y
===================================================================
RCS file: /cvsroot/bluez/utils/hcid/parser.y,v
retrieving revision 1.5
diff -u -b -w -B -r1.5 parser.y
--- hcid/parser.y 20 Aug 2002 18:42:12 -0000 1.5
+++ hcid/parser.y 3 Feb 2004 16:52:26 -0000
@@ -61,18 +61,18 @@
%token K_PINHELP
%token K_YES K_NO
-%token <str> WORD PATH STRING LIST
+%token <str> WORD PATH STRING LIST HCI BDADDR
%token <num> NUM
%type <num> bool pkt_type link_mode link_policy sec_mode pair_mode
-%type <str> dev_name
+%type <str> dev_name hci bdaddr
%%
config: statement | config statement;
statement:
K_OPTIONS hcid_options
- | K_DEVICE device_options
+ | device device_options
| WORD {
cfg_error("Invalid statement '%s'", $1);
@@ -82,6 +83,20 @@
}
;
+device:
+ K_DEVICE {
+ parser_device = &default_device;
+ }
+
+ | K_DEVICE hci {
+ parser_device = alloc_device_opts($2);
+ }
+
+ | K_DEVICE bdaddr {
+ parser_device = alloc_device_opts($2);
+ }
+ ;
+
hcid_options: '{' hcid_opts '}';
hcid_opts: | hcid_opt ';' | error ';' | hcid_opts hcid_opt ';';
hcid_opt:
@@ -118,7 +133,9 @@
$$ = opt;
}
- | K_NO { $$ = HCID_SEC_NONE; }
+ | K_NO {
+ $$ = HCID_SEC_NONE;
+ }
;
pair_mode:
@@ -137,47 +154,47 @@
device_opts: | device_opt ';' | error ';' | device_opts device_opt ';';
device_opt:
K_PTYPE pkt_type {
- devi.pkt_type = $2;
+ parser_device->pkt_type = $2;
}
| K_LM link_mode {
- devi.link_mode = $2;
+ parser_device->link_mode = $2;
}
| K_LP link_policy {
- devi.link_policy = $2;
+ parser_device->link_policy = $2;
}
| K_NAME dev_name {
- if (devi.name)
- free(devi.name);
- devi.name = $2;
+ if (parser_device->name)
+ free(parser_device->name);
+ parser_device->name = $2;
}
| K_CLASS NUM {
- devi.class = $2;
+ parser_device->class = $2;
}
| K_AUTH bool {
- devi.auth = $2;
+ parser_device->auth = $2;
}
| K_ENCRYPT bool {
- devi.encrypt = $2;
+ parser_device->encrypt = $2;
}
| K_ISCAN bool {
if ($2)
- devi.scan |= SCAN_INQUIRY;
+ parser_device->scan |= SCAN_INQUIRY;
else
- devi.scan &= ~SCAN_INQUIRY;
+ parser_device->scan &= ~SCAN_INQUIRY;
}
| K_PSCAN bool {
if ($2)
- devi.scan |= SCAN_PAGE;
+ parser_device->scan |= SCAN_PAGE;
else
- devi.scan &= ~SCAN_PAGE;
+ parser_device->scan &= ~SCAN_PAGE;
}
| WORD {
@@ -196,6 +213,18 @@
}
;
+hci:
+ HCI {
+ $$ = strdup($1);
+ }
+ ;
+
+bdaddr:
+ BDADDR {
+ $$ = strdup($1);
+ }
+ ;
+
pkt_type:
WORD {
int opt;
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Bluez-devel] Device specific configuration
2004-02-03 16:52 [Bluez-devel] Device specific configuration Marcel Holtmann
@ 2004-02-03 17:35 ` Fredrik Noring
2004-02-03 18:47 ` Marcel Holtmann
0 siblings, 1 reply; 5+ messages in thread
From: Fredrik Noring @ 2004-02-03 17:35 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: BlueZ Mailing List
[-- Attachment #1: Type: text/plain, Size: 714 bytes --]
Marcel,
tis 2004-02-03 klockan 17.52 skrev Marcel Holtmann:
> this is the patch for the device specific configuration of hcid, that I
> am going to apply. Comments?
Here's a new draft for the hcid.1 man page. It includes a description of
hcid.conf. I propose a few modifications, detailed in the the draft, all
possible to make backwards compatible:
1. Device and security settings in the "options" section becomes
deprecated and an alias in favour of "device default". These
parameters are default unless specified in the "device", "device
<hci>" and "device <bdaddr>" sections.
2. "enable" and "disable" becomes deprecated and aliases for
"yes" and "no" respectively.
Fredrik
[-- Attachment #2: hcid.1 --]
[-- Type: text/x-troff-man, Size: 4325 bytes --]
.\"
.\" hcid manual page.
.\" Copyright (C) 2004 Fredrik Noring
.\"
.TH hcid 1
.SH NAME
hcid \- Bluetooth interface daemon
.SH SYNOPSIS
.PP
\fBhcid\fP [\fIoption\fP]...
.SH DESCRIPTION
\fIhcid\fP is the Bluetooth interface daemon. See
http://www.bluez.org/ for more information about Bluetooth for Linux.
The main purpose of \fIhcid\fP is to automatically configure Bluetooth
interfaces (hci0, hci1 ...).
\fIhcid\fP also provides Bluetooth device pairing services.
.SH OPTIONS
The following options are supported:
.TP
\fB-f\fP=\fIfile\fP, \fB--config-file\fP=\fIfile\fP
Use the given configuration file.
.TP
\fB-h\fP, \fB--help\fP
Print on the standard output a description of the command line options.
.TP
\fB-n\fP, \fB--no-daemon\fP
Do not fork as a daemon.
.TP
\fB--version\fP
Print the version of the daemon.
.SH CONFIGURATION FILE
The \fIhcid\fP configuration file is located in
\fB/etc/bluetooth/hcid.conf\fP. It consists of sections and
parameters. A section begins with the name of the section followed by
optional specifiers and the parameters inside curly brackets. Sections
contain parameters of the form:
.TP
\fIname\fP \fIvalue1\fP, \fIvalue2\fP ... ;
.PP
Any character after a hash ('#') character is ignored until newline.
Whitespace is also ignored.
.SH SECTION DESCRIPTION
Sections can be any number of \fBdevice\fP sections. If no specifier
is provided, the parameters are applied to devices that do not match
any other section section. The following optional specifiers are
supported:
.TP
\fInn\fP\fB:\fP\fInn\fP\fB:\fP\fInn\fP\fB:\fP\fInn\fP\fB:\fP\fInn\fP\fB:\fP\fInn\fP
Parameters specified within this section will be applied to the device
with this \fIdevice address\fP.
.TP
\fBhci\fIn\fP
Parameters specified within this section will be applied to the device
with this \fIdevice interface\fP, unless that device is matched by a
\fIdevice address\fP section.
.TP
\fBdefault\fP
Parameters specified within this section will be applied to all device
sections where these are unspecified.
.PP
The following parameters may be present in a \fBdevice\fP section\fB:\fP
.TP
\fBautoinit\fP = yes|no
Automatically initialize new devices. The default is \fBno\fP.
.TP
\fBauth\fP = yes|no
.TP
\fBclass\fP = 0x\fIhhh\FP
.TP
\fBencrypt\fP = yes|no
.TP
\fBiscan\fP = yes|no
.TP
\fBlm\fP = none|accept,master
.TP
\fBlp\fP = none|rswitch,hold,sniff,park
.TP
\fBname\fP = "\fIname\fP"
.TP
\fBpairing\fP = none|multi|once
.TP
\fBpin_helper\fP = \fIfile\fP
.TP
\fBpkt_type\fP = DH1,DM1,HV1
.TP
\fBpscan\fP = yes|no
.TP
\fBsecurity\fP = none|auto|user
.SH SIGNALS
.SH EXAMPLE
Example of \fBhcid.conf\fP file:
.nf
# These parameters are applied to all device sections unless
# specified in those sections.
device default {
# Automatically initialize new devices
autoinit yes;
# Local device name
# %d - device id
# %h - host name
name "%h";
# Security Manager mode
# none - Security manager disabled
# auto - Use local PIN for incoming connections
# user - Always ask user for a PIN
security auto;
# Pairing mode
# none - Pairing disabled
# multi - Allow pairing with already paired devices
# once - Pair once and deny successive attempts
pairing once;
# PIN helper
pin_helper /bin/bluepin;
# Local device class
class 0x100;
# Default packet type
# pkt_type DH1, DM1, HV1;
# Inquiry and Page scan
iscan yes;
pscan yes;
# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
# lm accept, master;
lm accept;
# Default link policy
# none - no specific policy
# rswitch - allow role switch
# hold - allow hold mode
# sniff - allow sniff mode
# park - allow park mode
# lp hold, sniff;
lp hold, sniff, park;
# Authentication and Encryption
# auth yes;
# encrypt yes;
}
# Parameters for a device with address 00:11:22:33:44:55
device 00:11:22:33:44:55 {
encrypt yes;
}
# Parameters for all other devices
device {
pairing multi;
}
.SH FILES
.nf
/etc/bluetooth/hcid.conf
/etc/bluetooth/keytab
/etc/bluetooth/keytab.shadow
.SH AUTHORS
Written by Fredrik Noring and Maxim Krasnyansky.
.SH BUGS
Please send bug reports to <bluez-devel@bluez.org>.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Bluez-devel] Device specific configuration
2004-02-03 17:35 ` Fredrik Noring
@ 2004-02-03 18:47 ` Marcel Holtmann
2004-02-03 19:18 ` Fredrik Noring
0 siblings, 1 reply; 5+ messages in thread
From: Marcel Holtmann @ 2004-02-03 18:47 UTC (permalink / raw)
To: Fredrik Noring; +Cc: BlueZ Mailing List
Hi Fredrik,
> Here's a new draft for the hcid.1 man page. It includes a description of
> hcid.conf. I propose a few modifications, detailed in the the draft, all
> possible to make backwards compatible:
>
> 1. Device and security settings in the "options" section becomes
> deprecated and an alias in favour of "device default". These
> parameters are default unless specified in the "device", "device
> <hci>" and "device <bdaddr>" sections.
>
> 2. "enable" and "disable" becomes deprecated and aliases for
> "yes" and "no" respectively.
please don't include stuff that I haven't yet applied. The device
specific configuration will be applied, but I haven't decided on
anything else. BTW did my patch work fine for you?
What patch brings in "device default {..."? We don't need it, because we
can use "device {..." for it.
Name the tool "Bluetooth HCI daemon", because interface is to generic.
The mailing list is still "bluez-devel@lists.sf.net" and I don't tend to
change it, because the spam stuff of SF is doing a good job.
Regards
Marcel
-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Bluez-devel] Device specific configuration
2004-02-03 18:47 ` Marcel Holtmann
@ 2004-02-03 19:18 ` Fredrik Noring
2004-02-03 23:55 ` Marcel Holtmann
0 siblings, 1 reply; 5+ messages in thread
From: Fredrik Noring @ 2004-02-03 19:18 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: BlueZ Mailing List
Marcel,
tis 2004-02-03 klockan 19.47 skrev Marcel Holtmann:
> please don't include stuff that I haven't yet applied. The device
> specific configuration will be applied, but I haven't decided on
> anything else.
The draft was indended for the development version. Btw., I've made
my patches available at: http://noring.nocrew.org/bluetooth/
> BTW did my patch work fine for you?
Yes, I suppose you mainly changed indentation.
> What patch brings in "device default {..."? We don't need it, because we
> can use "device {..." for it.
It wasn't the same thing. "device { ... }" is the fallback device.
"device default { ... }" was intended to set default parameters for all
other device sections unless specified explicitly in those. But we can
make that the same thing of course.
> The mailing list is still "bluez-devel@lists.sf.net" and I don't tend to
> change it, because the spam stuff of SF is doing a good job.
Sorry, that was a spelling mistake.
Fredrik
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Bluez-devel] Device specific configuration
2004-02-03 19:18 ` Fredrik Noring
@ 2004-02-03 23:55 ` Marcel Holtmann
0 siblings, 0 replies; 5+ messages in thread
From: Marcel Holtmann @ 2004-02-03 23:55 UTC (permalink / raw)
To: Fredrik Noring; +Cc: BlueZ Mailing List
Hi Fredrik,
> > BTW did my patch work fine for you?
>
> Yes, I suppose you mainly changed indentation.
I also changed some other stuff, because I found it too complex. I need
some reports that this patch is working fine and not breaking the normal
expected behaviour.
> > What patch brings in "device default {..."? We don't need it, because we
> > can use "device {..." for it.
>
> It wasn't the same thing. "device { ... }" is the fallback device.
> "device default { ... }" was intended to set default parameters for all
> other device sections unless specified explicitly in those. But we can
> make that the same thing of course.
We need only one of them which is default and the <hciX> or <bdaddr> can
extend these default settings. Everything else is overload.
Regards
Marcel
-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2004-02-03 23:55 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-02-03 16:52 [Bluez-devel] Device specific configuration Marcel Holtmann
2004-02-03 17:35 ` Fredrik Noring
2004-02-03 18:47 ` Marcel Holtmann
2004-02-03 19:18 ` Fredrik Noring
2004-02-03 23:55 ` Marcel Holtmann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.