* [PATCH v2] alsactl: Store lockfile in /tmp
@ 2014-05-06 19:32 Julian Scheel
2014-05-07 7:19 ` Takashi Iwai
0 siblings, 1 reply; 6+ messages in thread
From: Julian Scheel @ 2014-05-06 19:32 UTC (permalink / raw)
To: alsa-devel; +Cc: Julian Scheel
It can not be generally assumed that the directories in which asound.state
resides are writable. Instead using /tmp as location for lock files seems more
reliable.
Signed-off-by: Julian Scheel <julian@jusst.de>
---
alsactl/alsactl.c | 7 +++++++
alsactl/alsactl.h | 1 +
alsactl/lock.c | 13 ++++++++++---
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
index 6bc013f..415dfb8 100644
--- a/alsactl/alsactl.c
+++ b/alsactl/alsactl.c
@@ -38,6 +38,9 @@
#ifndef SYS_PIDFILE
#define SYS_PIDFILE "/var/run/alsactl.pid"
#endif
+#ifndef SYS_LOCKPATH
+#define SYS_LOCKPATH "/var/lock"
+#endif
int debugflag = 0;
int force_restore = 1;
@@ -46,6 +49,7 @@ int do_lock = 0;
int use_syslog = 0;
char *command;
char *statefile = NULL;
+char *lockpath = SYS_LOCKPATH;
#define TITLE 0x0100
#define HEADER 0x0200
@@ -71,6 +75,7 @@ static struct arg args[] = {
{ HEADER, NULL, "Available state options:" },
{ FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
{ 'l', "lock", "use file locking to serialize concurrent access" },
+{ FILEARG | 'D', "lock-dir", "directory to use for lock files (default " SYS_LOCKPATH ")" },
{ 'F', "force", "try to restore the matching controls as much as possible" },
{ 0, NULL, " (default mode)" },
{ 'g', "ignore", "ignore 'No soundcards found' error" },
@@ -232,6 +237,8 @@ int main(int argc, char *argv[])
case 'l':
do_lock = 1;
break;
+ case 'D':
+ lockpath = optarg;
case 'F':
force_restore = 1;
break;
diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
index 9109a70..6c6bee5 100644
--- a/alsactl/alsactl.h
+++ b/alsactl/alsactl.h
@@ -5,6 +5,7 @@ extern int do_lock;
extern int use_syslog;
extern char *command;
extern char *statefile;
+extern char *lockpath;
void info_(const char *fcn, long line, const char *fmt, ...);
void error_(const char *fcn, long line, const char *fmt, ...);
diff --git a/alsactl/lock.c b/alsactl/lock.c
index 587a109..c69e285 100644
--- a/alsactl/lock.c
+++ b/alsactl/lock.c
@@ -36,17 +36,24 @@ static int state_lock_(const char *file, int lock, int timeout)
struct flock lck;
struct stat st;
char lcktxt[12];
+ char *filename;
char *nfile;
if (!do_lock)
return 0;
- nfile = malloc(strlen(file) + 6);
+
+ /* only use the actual filename, not the path */
+ filename = strrchr(file, '/');
+ if (!filename)
+ filename = file;
+
+ nfile = malloc(strlen(lockpath) + strlen(filename) + 7);
if (nfile == NULL) {
error("No enough memory...");
return -ENOMEM;
}
- strcpy(nfile, file);
- strcat(nfile, ".lock");
+
+ sprintf(nfile, "%s/%s.lock", lockpath, filename);
lck.l_type = lock ? F_WRLCK : F_UNLCK;
lck.l_whence = SEEK_SET;
lck.l_start = 0;
--
1.9.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] alsactl: Store lockfile in /tmp
2014-05-06 19:32 [PATCH v2] alsactl: Store lockfile in /tmp Julian Scheel
@ 2014-05-07 7:19 ` Takashi Iwai
2014-05-07 8:49 ` Julian Scheel
0 siblings, 1 reply; 6+ messages in thread
From: Takashi Iwai @ 2014-05-07 7:19 UTC (permalink / raw)
To: Julian Scheel; +Cc: alsa-devel
At Tue, 6 May 2014 21:32:19 +0200,
Julian Scheel wrote:
>
> It can not be generally assumed that the directories in which asound.state
> resides are writable. Instead using /tmp as location for lock files seems more
> reliable.
The subject and changelog don't match with the actual change.
Now it's /var/log instead of /tmp, right?
Besides that, it'd be better to allow a full path name for a lock file
instead of a directory name. If you give a different file name via -f
option, you have a high chance to conflict with the existing file in
/var/lock.
Furthermore, for solving *your* problem (restoring from read-only
rootfs), an easier option would be allowing to restore the system
default without locking.
Takashi
>
> Signed-off-by: Julian Scheel <julian@jusst.de>
> ---
> alsactl/alsactl.c | 7 +++++++
> alsactl/alsactl.h | 1 +
> alsactl/lock.c | 13 ++++++++++---
> 3 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
> index 6bc013f..415dfb8 100644
> --- a/alsactl/alsactl.c
> +++ b/alsactl/alsactl.c
> @@ -38,6 +38,9 @@
> #ifndef SYS_PIDFILE
> #define SYS_PIDFILE "/var/run/alsactl.pid"
> #endif
> +#ifndef SYS_LOCKPATH
> +#define SYS_LOCKPATH "/var/lock"
> +#endif
>
> int debugflag = 0;
> int force_restore = 1;
> @@ -46,6 +49,7 @@ int do_lock = 0;
> int use_syslog = 0;
> char *command;
> char *statefile = NULL;
> +char *lockpath = SYS_LOCKPATH;
>
> #define TITLE 0x0100
> #define HEADER 0x0200
> @@ -71,6 +75,7 @@ static struct arg args[] = {
> { HEADER, NULL, "Available state options:" },
> { FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
> { 'l', "lock", "use file locking to serialize concurrent access" },
> +{ FILEARG | 'D', "lock-dir", "directory to use for lock files (default " SYS_LOCKPATH ")" },
> { 'F', "force", "try to restore the matching controls as much as possible" },
> { 0, NULL, " (default mode)" },
> { 'g', "ignore", "ignore 'No soundcards found' error" },
> @@ -232,6 +237,8 @@ int main(int argc, char *argv[])
> case 'l':
> do_lock = 1;
> break;
> + case 'D':
> + lockpath = optarg;
> case 'F':
> force_restore = 1;
> break;
> diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
> index 9109a70..6c6bee5 100644
> --- a/alsactl/alsactl.h
> +++ b/alsactl/alsactl.h
> @@ -5,6 +5,7 @@ extern int do_lock;
> extern int use_syslog;
> extern char *command;
> extern char *statefile;
> +extern char *lockpath;
>
> void info_(const char *fcn, long line, const char *fmt, ...);
> void error_(const char *fcn, long line, const char *fmt, ...);
> diff --git a/alsactl/lock.c b/alsactl/lock.c
> index 587a109..c69e285 100644
> --- a/alsactl/lock.c
> +++ b/alsactl/lock.c
> @@ -36,17 +36,24 @@ static int state_lock_(const char *file, int lock, int timeout)
> struct flock lck;
> struct stat st;
> char lcktxt[12];
> + char *filename;
> char *nfile;
>
> if (!do_lock)
> return 0;
> - nfile = malloc(strlen(file) + 6);
> +
> + /* only use the actual filename, not the path */
> + filename = strrchr(file, '/');
> + if (!filename)
> + filename = file;
> +
> + nfile = malloc(strlen(lockpath) + strlen(filename) + 7);
> if (nfile == NULL) {
> error("No enough memory...");
> return -ENOMEM;
> }
> - strcpy(nfile, file);
> - strcat(nfile, ".lock");
> +
> + sprintf(nfile, "%s/%s.lock", lockpath, filename);
> lck.l_type = lock ? F_WRLCK : F_UNLCK;
> lck.l_whence = SEEK_SET;
> lck.l_start = 0;
> --
> 1.9.2
>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] alsactl: Store lockfile in /tmp
2014-05-07 7:19 ` Takashi Iwai
@ 2014-05-07 8:49 ` Julian Scheel
2014-05-07 9:20 ` Takashi Iwai
2014-05-07 9:23 ` Jaroslav Kysela
0 siblings, 2 replies; 6+ messages in thread
From: Julian Scheel @ 2014-05-07 8:49 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
Am 07.05.2014 09:19, schrieb Takashi Iwai:
> At Tue, 6 May 2014 21:32:19 +0200,
> Julian Scheel wrote:
>>
>> It can not be generally assumed that the directories in which asound.state
>> resides are writable. Instead using /tmp as location for lock files seems more
>> reliable.
>
> The subject and changelog don't match with the actual change.
> Now it's /var/log instead of /tmp, right?
Sorry for that. Must have been too late.
> Besides that, it'd be better to allow a full path name for a lock file
> instead of a directory name. If you give a different file name via -f
> option, you have a high chance to conflict with the existing file in
> /var/lock.
So, you'd prefer a --lock-file/-L option which can be used to set an
explicit lock file?
> Furthermore, for solving *your* problem (restoring from read-only
> rootfs), an easier option would be allowing to restore the system
> default without locking.
While this is true I think making the locking mechanism more robust is a
good thing anyway.
Julian
>
> Takashi
>
>>
>> Signed-off-by: Julian Scheel <julian@jusst.de>
>> ---
>> alsactl/alsactl.c | 7 +++++++
>> alsactl/alsactl.h | 1 +
>> alsactl/lock.c | 13 ++++++++++---
>> 3 files changed, 18 insertions(+), 3 deletions(-)
>>
>> diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
>> index 6bc013f..415dfb8 100644
>> --- a/alsactl/alsactl.c
>> +++ b/alsactl/alsactl.c
>> @@ -38,6 +38,9 @@
>> #ifndef SYS_PIDFILE
>> #define SYS_PIDFILE "/var/run/alsactl.pid"
>> #endif
>> +#ifndef SYS_LOCKPATH
>> +#define SYS_LOCKPATH "/var/lock"
>> +#endif
>>
>> int debugflag = 0;
>> int force_restore = 1;
>> @@ -46,6 +49,7 @@ int do_lock = 0;
>> int use_syslog = 0;
>> char *command;
>> char *statefile = NULL;
>> +char *lockpath = SYS_LOCKPATH;
>>
>> #define TITLE 0x0100
>> #define HEADER 0x0200
>> @@ -71,6 +75,7 @@ static struct arg args[] = {
>> { HEADER, NULL, "Available state options:" },
>> { FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
>> { 'l', "lock", "use file locking to serialize concurrent access" },
>> +{ FILEARG | 'D', "lock-dir", "directory to use for lock files (default " SYS_LOCKPATH ")" },
>> { 'F', "force", "try to restore the matching controls as much as possible" },
>> { 0, NULL, " (default mode)" },
>> { 'g', "ignore", "ignore 'No soundcards found' error" },
>> @@ -232,6 +237,8 @@ int main(int argc, char *argv[])
>> case 'l':
>> do_lock = 1;
>> break;
>> + case 'D':
>> + lockpath = optarg;
>> case 'F':
>> force_restore = 1;
>> break;
>> diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
>> index 9109a70..6c6bee5 100644
>> --- a/alsactl/alsactl.h
>> +++ b/alsactl/alsactl.h
>> @@ -5,6 +5,7 @@ extern int do_lock;
>> extern int use_syslog;
>> extern char *command;
>> extern char *statefile;
>> +extern char *lockpath;
>>
>> void info_(const char *fcn, long line, const char *fmt, ...);
>> void error_(const char *fcn, long line, const char *fmt, ...);
>> diff --git a/alsactl/lock.c b/alsactl/lock.c
>> index 587a109..c69e285 100644
>> --- a/alsactl/lock.c
>> +++ b/alsactl/lock.c
>> @@ -36,17 +36,24 @@ static int state_lock_(const char *file, int lock, int timeout)
>> struct flock lck;
>> struct stat st;
>> char lcktxt[12];
>> + char *filename;
>> char *nfile;
>>
>> if (!do_lock)
>> return 0;
>> - nfile = malloc(strlen(file) + 6);
>> +
>> + /* only use the actual filename, not the path */
>> + filename = strrchr(file, '/');
>> + if (!filename)
>> + filename = file;
>> +
>> + nfile = malloc(strlen(lockpath) + strlen(filename) + 7);
>> if (nfile == NULL) {
>> error("No enough memory...");
>> return -ENOMEM;
>> }
>> - strcpy(nfile, file);
>> - strcat(nfile, ".lock");
>> +
>> + sprintf(nfile, "%s/%s.lock", lockpath, filename);
>> lck.l_type = lock ? F_WRLCK : F_UNLCK;
>> lck.l_whence = SEEK_SET;
>> lck.l_start = 0;
>> --
>> 1.9.2
>>
>> _______________________________________________
>> Alsa-devel mailing list
>> Alsa-devel@alsa-project.org
>> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] alsactl: Store lockfile in /tmp
2014-05-07 8:49 ` Julian Scheel
@ 2014-05-07 9:20 ` Takashi Iwai
2014-05-07 9:23 ` Jaroslav Kysela
1 sibling, 0 replies; 6+ messages in thread
From: Takashi Iwai @ 2014-05-07 9:20 UTC (permalink / raw)
To: Julian Scheel; +Cc: alsa-devel
At Wed, 07 May 2014 10:49:59 +0200,
Julian Scheel wrote:
>
> Am 07.05.2014 09:19, schrieb Takashi Iwai:
> > At Tue, 6 May 2014 21:32:19 +0200,
> > Julian Scheel wrote:
> >>
> >> It can not be generally assumed that the directories in which asound.state
> >> resides are writable. Instead using /tmp as location for lock files seems more
> >> reliable.
> >
> > The subject and changelog don't match with the actual change.
> > Now it's /var/log instead of /tmp, right?
>
> Sorry for that. Must have been too late.
Seems so...
> > Besides that, it'd be better to allow a full path name for a lock file
> > instead of a directory name. If you give a different file name via -f
> > option, you have a high chance to conflict with the existing file in
> > /var/lock.
>
> So, you'd prefer a --lock-file/-L option which can be used to set an
> explicit lock file?
Yes.
> > Furthermore, for solving *your* problem (restoring from read-only
> > rootfs), an easier option would be allowing to restore the system
> > default without locking.
>
> While this is true I think making the locking mechanism more robust is a
> good thing anyway.
Of course, it's good to improve the lock mechanism.
OTOH, adding an option like --no-lock would be good, too.
This is a different solution, and the idea doesn't conflict.
Takashi
> Julian
>
> >
> > Takashi
> >
> >>
> >> Signed-off-by: Julian Scheel <julian@jusst.de>
> >> ---
> >> alsactl/alsactl.c | 7 +++++++
> >> alsactl/alsactl.h | 1 +
> >> alsactl/lock.c | 13 ++++++++++---
> >> 3 files changed, 18 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
> >> index 6bc013f..415dfb8 100644
> >> --- a/alsactl/alsactl.c
> >> +++ b/alsactl/alsactl.c
> >> @@ -38,6 +38,9 @@
> >> #ifndef SYS_PIDFILE
> >> #define SYS_PIDFILE "/var/run/alsactl.pid"
> >> #endif
> >> +#ifndef SYS_LOCKPATH
> >> +#define SYS_LOCKPATH "/var/lock"
> >> +#endif
> >>
> >> int debugflag = 0;
> >> int force_restore = 1;
> >> @@ -46,6 +49,7 @@ int do_lock = 0;
> >> int use_syslog = 0;
> >> char *command;
> >> char *statefile = NULL;
> >> +char *lockpath = SYS_LOCKPATH;
> >>
> >> #define TITLE 0x0100
> >> #define HEADER 0x0200
> >> @@ -71,6 +75,7 @@ static struct arg args[] = {
> >> { HEADER, NULL, "Available state options:" },
> >> { FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
> >> { 'l', "lock", "use file locking to serialize concurrent access" },
> >> +{ FILEARG | 'D', "lock-dir", "directory to use for lock files (default " SYS_LOCKPATH ")" },
> >> { 'F', "force", "try to restore the matching controls as much as possible" },
> >> { 0, NULL, " (default mode)" },
> >> { 'g', "ignore", "ignore 'No soundcards found' error" },
> >> @@ -232,6 +237,8 @@ int main(int argc, char *argv[])
> >> case 'l':
> >> do_lock = 1;
> >> break;
> >> + case 'D':
> >> + lockpath = optarg;
> >> case 'F':
> >> force_restore = 1;
> >> break;
> >> diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
> >> index 9109a70..6c6bee5 100644
> >> --- a/alsactl/alsactl.h
> >> +++ b/alsactl/alsactl.h
> >> @@ -5,6 +5,7 @@ extern int do_lock;
> >> extern int use_syslog;
> >> extern char *command;
> >> extern char *statefile;
> >> +extern char *lockpath;
> >>
> >> void info_(const char *fcn, long line, const char *fmt, ...);
> >> void error_(const char *fcn, long line, const char *fmt, ...);
> >> diff --git a/alsactl/lock.c b/alsactl/lock.c
> >> index 587a109..c69e285 100644
> >> --- a/alsactl/lock.c
> >> +++ b/alsactl/lock.c
> >> @@ -36,17 +36,24 @@ static int state_lock_(const char *file, int lock, int timeout)
> >> struct flock lck;
> >> struct stat st;
> >> char lcktxt[12];
> >> + char *filename;
> >> char *nfile;
> >>
> >> if (!do_lock)
> >> return 0;
> >> - nfile = malloc(strlen(file) + 6);
> >> +
> >> + /* only use the actual filename, not the path */
> >> + filename = strrchr(file, '/');
> >> + if (!filename)
> >> + filename = file;
> >> +
> >> + nfile = malloc(strlen(lockpath) + strlen(filename) + 7);
> >> if (nfile == NULL) {
> >> error("No enough memory...");
> >> return -ENOMEM;
> >> }
> >> - strcpy(nfile, file);
> >> - strcat(nfile, ".lock");
> >> +
> >> + sprintf(nfile, "%s/%s.lock", lockpath, filename);
> >> lck.l_type = lock ? F_WRLCK : F_UNLCK;
> >> lck.l_whence = SEEK_SET;
> >> lck.l_start = 0;
> >> --
> >> 1.9.2
> >>
> >> _______________________________________________
> >> Alsa-devel mailing list
> >> Alsa-devel@alsa-project.org
> >> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> >>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] alsactl: Store lockfile in /tmp
2014-05-07 8:49 ` Julian Scheel
2014-05-07 9:20 ` Takashi Iwai
@ 2014-05-07 9:23 ` Jaroslav Kysela
2014-05-07 13:17 ` Julian Scheel
1 sibling, 1 reply; 6+ messages in thread
From: Jaroslav Kysela @ 2014-05-07 9:23 UTC (permalink / raw)
To: Julian Scheel, Takashi Iwai; +Cc: alsa-devel
Date 7.5.2014 10:49, Julian Scheel wrote:
> Am 07.05.2014 09:19, schrieb Takashi Iwai:
>> At Tue, 6 May 2014 21:32:19 +0200,
>> Julian Scheel wrote:
>>>
>>> It can not be generally assumed that the directories in which asound.state
>>> resides are writable. Instead using /tmp as location for lock files seems more
>>> reliable.
>>
>> The subject and changelog don't match with the actual change.
>> Now it's /var/log instead of /tmp, right?
>
> Sorry for that. Must have been too late.
I also didn't note that. I applied your v2 patch to the git repo - I
forced update now.
>> Besides that, it'd be better to allow a full path name for a lock file
>> instead of a directory name. If you give a different file name via -f
>> option, you have a high chance to conflict with the existing file in
>> /var/lock.
>
> So, you'd prefer a --lock-file/-L option which can be used to set an
> explicit lock file?
I changed '-D' to '-O' option (file) and used '-L' option to select the
"no-lock" behaviour for the global configuration file. Note that the
locking is default only for the global file, other files are not lock
protected.
http://git.alsa-project.org/?p=alsa-utils.git;a=commitdiff;h=158a67f6f5058bec0ac27086a1c6206bfd2ff414
>> Furthermore, for solving *your* problem (restoring from read-only
>> rootfs), an easier option would be allowing to restore the system
>> default without locking.
>
> While this is true I think making the locking mechanism more robust is a
> good thing anyway.
Yup.
Jaroslav
--
Jaroslav Kysela <perex@perex.cz>
Linux Kernel Sound Maintainer
ALSA Project; Red Hat, Inc.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] alsactl: Store lockfile in /tmp
2014-05-07 9:23 ` Jaroslav Kysela
@ 2014-05-07 13:17 ` Julian Scheel
0 siblings, 0 replies; 6+ messages in thread
From: Julian Scheel @ 2014-05-07 13:17 UTC (permalink / raw)
To: Jaroslav Kysela, Takashi Iwai; +Cc: alsa-devel
Am 07.05.2014 11:23, schrieb Jaroslav Kysela:
> Date 7.5.2014 10:49, Julian Scheel wrote:
>> Am 07.05.2014 09:19, schrieb Takashi Iwai:
>>> At Tue, 6 May 2014 21:32:19 +0200,
>>> Julian Scheel wrote:
>>>>
>>>> It can not be generally assumed that the directories in which asound.state
>>>> resides are writable. Instead using /tmp as location for lock files seems more
>>>> reliable.
>>>
>>> The subject and changelog don't match with the actual change.
>>> Now it's /var/log instead of /tmp, right?
>>
>> Sorry for that. Must have been too late.
>
> I also didn't note that. I applied your v2 patch to the git repo - I
> forced update now.
Thank you and sorry again :)
>>> Besides that, it'd be better to allow a full path name for a lock file
>>> instead of a directory name. If you give a different file name via -f
>>> option, you have a high chance to conflict with the existing file in
>>> /var/lock.
>>
>> So, you'd prefer a --lock-file/-L option which can be used to set an
>> explicit lock file?
>
> I changed '-D' to '-O' option (file) and used '-L' option to select the
> "no-lock" behaviour for the global configuration file. Note that the
> locking is default only for the global file, other files are not lock
> protected.
Alright, that looks good.
-Julian
> http://git.alsa-project.org/?p=alsa-utils.git;a=commitdiff;h=158a67f6f5058bec0ac27086a1c6206bfd2ff414
>
>>> Furthermore, for solving *your* problem (restoring from read-only
>>> rootfs), an easier option would be allowing to restore the system
>>> default without locking.
>>
>> While this is true I think making the locking mechanism more robust is a
>> good thing anyway.
>
> Yup.
>
> Jaroslav
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-05-07 13:17 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-06 19:32 [PATCH v2] alsactl: Store lockfile in /tmp Julian Scheel
2014-05-07 7:19 ` Takashi Iwai
2014-05-07 8:49 ` Julian Scheel
2014-05-07 9:20 ` Takashi Iwai
2014-05-07 9:23 ` Jaroslav Kysela
2014-05-07 13:17 ` Julian Scheel
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.