* Re: [PATCH 3/6] checktty: Use NGROUPS_MAX instead of NGROUPS
From: Sami Kerola @ 2011-06-09 19:31 UTC (permalink / raw)
To: Josiah Worcester; +Cc: util-linux
In-Reply-To: <1307573568-23643-4-git-send-email-josiahw@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 344 bytes --]
On Thu, Jun 9, 2011 at 00:52, Josiah Worcester <josiahw@gmail.com> wrote:
> -static gid_t mygroups[NGROUPS];
> +static gid_t mygroups[NGROUPS_MAX];
That might fix issue with musl libc, but is that truly an enhancement?
How about using sysconf(_SC_NGROUPS_MAX), e.g. see attachment.
--
Sami Kerola
http://www.iki.fi/kerolasa/
[-- Attachment #2: 0001-checktty-NGROUP-sysconf.txt --]
[-- Type: text/plain, Size: 1383 bytes --]
From bf4382f2f49c99f8cb3db360b54d8825525c153d Mon Sep 17 00:00:00 2001
From: Sami Kerola <kerolasa@iki.fi>
Date: Thu, 9 Jun 2011 21:23:13 +0200
Subject: [PATCH] checktty: NGROUP -> sysconf
Use sysconf return value instead of NGROUP definition to determine size of
grouplist array.
http://pubs.opengroup.org/onlinepubs/009695399/functions/getgroups.html
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
login-utils/checktty.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/login-utils/checktty.c b/login-utils/checktty.c
index f849057..e39d1e2 100644
--- a/login-utils/checktty.c
+++ b/login-utils/checktty.c
@@ -33,13 +33,14 @@
#include "pathnames.h"
#include "login.h"
#include "strutils.h"
+#include "xalloc.h"
#include "c.h"
#ifndef TTY_MAJOR
#define TTY_MAJOR 4
#endif
-static gid_t mygroups[NGROUPS];
+static gid_t *mygroups;
static int num_groups;
#define NAMELEN 128
@@ -311,6 +312,7 @@ main(int argc, char **argv)
{ NULL, NULL }
}, *item;
+ mygroups = xmalloc(sizeof(gid_t) * sysconf(_SC_NGROUPS_MAX));
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_NUMERICHOST | AI_PASSIVE | AI_ADDRCONFIG;
@@ -342,6 +344,7 @@ main(int argc, char **argv)
printf("getaddrinfo() failed\n");
}
+ free(mygroups);
return EXIT_SUCCESS;
}
#endif /* MAIN_TEST_CHECKTTY */
--
1.7.5.2
^ permalink raw reply related
* heads up - move shlibs/*
From: Karel Zak @ 2011-06-09 20:32 UTC (permalink / raw)
To: util-linux
Hi,
I have moved
$(top_srcdir)/shlibs/{blkid,mount,uuid}
directories to the top-level directory, so we have
$(top_srcdir)/libblkid
$(top_srcdir)/libmount
$(top_srcdir)/libuuid
directories now. The "shlibs" directory does not exists anymore.
git pull
git clean -xfd
is probably a good choice...
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* blkid: excessive random reads probing for ZFS on NTFS filesystem
From: John Lindgren @ 2011-06-12 19:02 UTC (permalink / raw)
To: util-linux
Hi,
I noticed blkid causing a noticeable amount of disk hits while
identifying an NTFS (Win7) partition, and did an strace to find out why
this was. It seems that the probe_zfs() function does a
seek-and-read-41-bytes pattern 64 times in the 130 to 520 KB region of
the partition. This of course is slow on a traditional hard disk, and
seems excessive. I don't know the internals of NTFS or of ZFS. Can
someone with a little more knowledge in this area provide some pointers
as to why this might be happening?
-- John Lindgren
^ permalink raw reply
* Typo in blkid manpage
From: John Lindgren @ 2011-06-12 20:24 UTC (permalink / raw)
To: util-linux
Hi,
I think there is a typo in the blkid manpage. Under the section for "-n
list", there is this example:
blkid -p -u nominix /dev/sda1
This should be:
blkid -p -n nominix /dev/sda1
-- John Lindgren
^ permalink raw reply
* Pentecost weekend pull request
From: Sami Kerola @ 2011-06-13 15:13 UTC (permalink / raw)
To: util-linux; +Cc: kerolasa
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=UTF-8, Size: 6423 bytes --]
Hi Karel et.al.
I feel a bit embarrassed to see how many patches I wrote. My
excuse is long, mostly rainy, weekend. Here comes a pull request;
[01/33] mount: take xalloc.h in use
Basiclly code reuse.
[02/33] checktty: NGROUP -> sysconf
This patch was sent earlier, see details bellow.
date Thu, Jun 9, 2011 at 21:31
subject Re: [PATCH 3/6] checktty: Use NGROUPS_MAX instead of NGROUPS
[03/33] checktty: fix unused parameters
Ditto.
[04/33] login-utils: include fix
Inspired what Pádraig Brady did with coreutils I thought
to give a shot to include-what-you-use as well.
http://lists.gnu.org/archive/html/coreutils/2011-06/msg00004.html
The utility clearly works. So it is a good time to think
if checking headers in all files should be TODO item?
[05/33] namei: add --version option
[06/33] namei: use xalloc.h
[07/33] namei: fix to argument handling
The namei patches are trivial.
[08/33] mcookie: use warnx, long options and help screen
[09/33] docs: inform about mcookie long options
[10/33] mcookie: change coding style
The mcookie patches are trivial, with exception of docs
change. Updating manual pages with help2man seems to be
quite good idea. Using the output as is is pretty brain
dead idea, but copy pasting bits of syntax etc seems to
work great. Is this an approach you would like to see in
future?
[11/33] whereis: maintenance fixes
[12/33] cal: maintenance fixes
[13/33] docs: inform about cal long options
Trivial changes.
[14/33] rename: verbose option & maintenance fixes
[15/33] docs: rename.1 verbose, long options and warning
Looking the code this utility seems to be in wrong
package. Rewriting the command to rely heavily on gnulib
copy.h and backupfile.h would make this to be good
addition to coreutils, assuming they accept the command.
Or it could time to deprecate the whole command, and
recommend users to multimove by using scripts.
[16/33] misc-utils: remove misleading README files
[17/33] build-sys: move write to term-utils directory
Maintainer style activities.
[18/33] write: maintenance fixes
[19/33] wipefs: add version printing & compiler warning
[20/33] uuidgen: add long options
[21/33] docs: uuidgen.1 mention long options
[22/33] uuid: define UUID_STR_LEN in uuid.h
[23/33] uuidd: maintenance fixes
[24/33] docs: mention long options in uuidd.8 manual page
[25/33] look: add long options
[26/33] docs: look.1 manual rewrote
Trivial changes.
[27/33] getopt: use xalloc.h
Resubmission of getopts maintenance, see
http://permalink.gmane.org/gmane.linux.utilities.util-linux-ng/3822
[28/33] getopt: remove unnecessary free()
Trivial change.
[29/33] getopt: make user getopt_long parsing to use function pointer
Without this the 33/33 would look unreadable at the point
where the function pointer is used.
[30/33] build-sys: remove unnecessary files from getopt
[31/33] getopt: options struct, usage and version outputs
[32/33] getopt: inform where to send bug reports
I wonder should the config.h PACKAGE_BUGREPORT be
util-linux mail list...
[33/33] getopt: fix coding style
Trivial change.
---
The following changes since commit 42fe2b2b2d19d09241bd7c3dd811463e0095d4aa:
Merge branch 'master', remote-tracking branch 'upstream/master' (2011-06-11 10:10:01 +0200)
are available in the git repository at:
git://github.com/kerolasa/lelux-utiliteetit.git wknd23
disk-utils/mkswap.c | 2 +-
getopt/Makefile.am | 3 +-
getopt/getopt-1.1.3.lsm | 16 --
getopt/getopt-test.bash | 6 -
getopt/getopt-test.tcsh | 7 -
getopt/getopt.c | 514 ++++++++++++++++++------------------
include/xalloc.h | 23 ++
libuuid/src/tst_uuid.c | 2 +-
libuuid/src/uuid.h | 3 +
login-utils/checktty.c | 32 ++-
login-utils/islocal.c | 2 +-
misc-utils/.gitignore | 1 -
misc-utils/Makefile.am | 21 +--
misc-utils/README.flushb | 5 -
misc-utils/README.namei2 | 14 -
misc-utils/README.reset | 20 --
misc-utils/cal.1 | 94 ++++----
misc-utils/cal.c | 166 +++++++-----
misc-utils/look.1 | 121 ++++-----
misc-utils/look.c | 51 +++-
misc-utils/mcookie.1 | 27 ++-
misc-utils/mcookie.c | 267 +++++++++++--------
misc-utils/namei.1 | 4 +
misc-utils/namei.c | 47 ++--
misc-utils/rename.1 | 36 ++-
misc-utils/rename.c | 93 +++++---
misc-utils/uuidd.8 | 88 +++----
misc-utils/uuidd.c | 114 +++++---
misc-utils/uuidgen.1 | 14 +-
misc-utils/uuidgen.c | 38 +++-
misc-utils/whereis.c | 141 +++++++----
misc-utils/wipefs.c | 13 +-
mount/Makefile.am | 2 +-
mount/devname.c | 3 +-
mount/fstab.c | 4 +-
mount/lomount.c | 4 +-
mount/mount.c | 4 +-
mount/mount_mntent.c | 3 +-
mount/sundries.c | 18 +--
mount/sundries.h | 7 +-
mount/umount.c | 3 +-
mount/xmalloc.c | 48 ----
mount/xmalloc.h | 14 -
term-utils/.gitignore | 1 +
term-utils/Makefile.am | 14 +-
{misc-utils => term-utils}/write.1 | 0
{misc-utils => term-utils}/write.c | 215 ++++++++-------
47 files changed, 1236 insertions(+), 1089 deletions(-)
delete mode 100644 getopt/getopt-1.1.3.lsm
delete mode 100755 getopt/getopt-test.bash
delete mode 100755 getopt/getopt-test.tcsh
delete mode 100644 misc-utils/README.flushb
delete mode 100644 misc-utils/README.namei2
delete mode 100644 misc-utils/README.reset
delete mode 100644 mount/xmalloc.c
delete mode 100644 mount/xmalloc.h
rename {misc-utils => term-utils}/write.1 (100%)
rename {misc-utils => term-utils}/write.c (67%)
--
Sami Kerola
http://www.iki.fi/kerolasa/
^ permalink raw reply
* [PATCH] blkid: Don't ignore swap UUID if only first byte is zero.
From: Richard W.M. Jones @ 2011-06-13 17:05 UTC (permalink / raw)
To: kzak, util-linux
[-- Attachment #1: Type: text/plain, Size: 1630 bytes --]
We found that if you use 'mkswap -U' option with a UUID with the first
byte zero (ie. any UUID starting 00....) then blkid was not able to
"see" the UUID.
For example:
# mkswap -f -U 00c1bbe9-cd0f-17a6-bb14-b21cdf0a458b /dev/vda1
Setting up swapspace version 1, size = 1047548 KiB
no label, UUID=00c1bbe9-cd0f-17a6-bb14-b21cdf0a458b
# blkid -o value -s UUID /dev/vda1
[no output from blkid command above, but ...]
# mkswap -f -U 11c1bbe9-cd0f-17a6-bb14-b21cdf0a458b /dev/vda1
Setting up swapspace version 1, size = 1047548 KiB
no label, UUID=11c1bbe9-cd0f-17a6-bb14-b21cdf0a458b
# blkid -o value -s UUID /dev/vda1
11c1bbe9-cd0f-17a6-bb14-b21cdf0a458b
Even worse, mkswap without -U option will sometimes randomly choose a
UUID starting with 00... which blkid fails to read. You can test this
by running a loop with mkswap / blkid. After an expected ~100 runs,
you will see a UUID written by mkswap that blkid cannot read.
I verified that UUIDs starting with 00... are in fact written to the
swap device itself. However I'm still not exactly clear if such UUIDs
are valid. Nevertheless, the attached patch makes it so that blkid
can see such UUIDs, assuming that they are valid.
I tested this by patching Fedora 15 libblkid and running the test
above. With this patch, the blkid command was able to see the UUID
written by mkswap -U.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into Xen guests.
http://et.redhat.com/~rjones/virt-p2v
[-- Attachment #2: 0001-blkid-Don-t-ignore-swap-UUID-if-only-first-byte-is-z.patch --]
[-- Type: text/plain, Size: 1233 bytes --]
>From cee5d4660b3425cfba366353102785a35265c7c4 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 13 Jun 2011 17:43:11 +0100
Subject: [PATCH] blkid: Don't ignore swap UUID if only first byte is zero.
---
libblkid/src/superblocks/swap.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/libblkid/src/superblocks/swap.c b/libblkid/src/superblocks/swap.c
index 325a8fa..129eafa 100644
--- a/libblkid/src/superblocks/swap.c
+++ b/libblkid/src/superblocks/swap.c
@@ -39,6 +39,7 @@ struct swap_header_v1_2 {
static int swap_set_info(blkid_probe pr, const char *version)
{
struct swap_header_v1_2 *hdr;
+ static const unsigned char zero_uuid[16];
/* Swap header always located at offset of 1024 bytes */
hdr = (struct swap_header_v1_2 *) blkid_probe_get_buffer(pr, 1024,
@@ -56,7 +57,8 @@ static int swap_set_info(blkid_probe pr, const char *version)
if (hdr->volume[0] && blkid_probe_set_label(pr, hdr->volume,
sizeof(hdr->volume)) < 0)
return -1;
- if (hdr->uuid[0] && blkid_probe_set_uuid(pr, hdr->uuid) < 0)
+ if (memcmp (hdr->uuid, zero_uuid, sizeof zero_uuid) != 0
+ && blkid_probe_set_uuid(pr, hdr->uuid) < 0)
return -1;
}
--
1.7.5.2
^ permalink raw reply related
* Re: [PATCH 6/6] sfdisk: fix for data type mismatches
From: Karel Zak @ 2011-06-14 11:29 UTC (permalink / raw)
To: Sami Kerola; +Cc: util-linux
In-Reply-To: <1307387239-9022-7-git-send-email-kerolasa@iki.fi>
On Mon, Jun 06, 2011 at 09:07:19PM +0200, Sami Kerola wrote:
> + if ((unsigned long) pno+4 >= ARRAY_SIZE(z->partitions)) {
Why 'unsigned long'? I guess that ARRAY_SIZE returns size_t. Maybe it
would be better to use size_t for partno numbers rather than add the
cast.
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH] uuidgen: print warning if uuidd isn't running
From: Karel Zak @ 2011-06-14 11:45 UTC (permalink / raw)
To: Ludwig Nussel; +Cc: util-linux
In-Reply-To: <1307540101-6376-1-git-send-email-ludwig.nussel@suse.de>
On Wed, Jun 08, 2011 at 03:35:01PM +0200, Ludwig Nussel wrote:
> ---
> misc-utils/uuidgen.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
>
> diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
> index 3cf6ec9..47f8e8f 100644
> --- a/misc-utils/uuidgen.c
> +++ b/misc-utils/uuidgen.c
> @@ -59,7 +59,9 @@ main (int argc, char *argv[])
>
> switch (do_type) {
> case DO_TYPE_TIME:
> - uuid_generate_time(uu);
> + if (uuid_generate_time_safe(uu)) {
> + fprintf(stderr, _("Warning: uuidd not running or not operational. Time based uuid may not be unique.\n"));
IMHO this is overkill -- the uuidd is used very rarely (usually on
large systems with SAP) and it's disabled by default in many
distributions, but the uuidgen(1) util is available everywhere and
used probably often used by admins/scripts.
It would be better to add some WARNING section to the uuidgen(1) man
page to inform users about the disadvantage.
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH] uuidgen: print warning if uuidd isn't running
From: Karel Zak @ 2011-06-14 11:51 UTC (permalink / raw)
To: Ludwig Nussel; +Cc: util-linux
In-Reply-To: <20110614114534.GF14293@nb.net.home>
On Tue, Jun 14, 2011 at 01:45:34PM +0200, Karel Zak wrote:
> On Wed, Jun 08, 2011 at 03:35:01PM +0200, Ludwig Nussel wrote:
> > ---
> > misc-utils/uuidgen.c | 4 +++-
> > 1 files changed, 3 insertions(+), 1 deletions(-)
> >
> > diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
> > index 3cf6ec9..47f8e8f 100644
> > --- a/misc-utils/uuidgen.c
> > +++ b/misc-utils/uuidgen.c
> > @@ -59,7 +59,9 @@ main (int argc, char *argv[])
> >
> > switch (do_type) {
> > case DO_TYPE_TIME:
> > - uuid_generate_time(uu);
> > + if (uuid_generate_time_safe(uu)) {
> > + fprintf(stderr, _("Warning: uuidd not running or not operational. Time based uuid may not be unique.\n"));
>
> IMHO this is overkill -- the uuidd is used very rarely (usually on
> large systems with SAP) and it's disabled by default in many
> distributions, but the uuidgen(1) util is available everywhere and
> used probably often used by admins/scripts.
>
> It would be better to add some WARNING section to the uuidgen(1) man
> page to inform users about the disadvantage.
... we can also add a new option (e.g. --safe) to use
uuid_generate_time_safe().
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH] uuidgen: print warning if uuidd isn't running
From: Ludwig Nussel @ 2011-06-14 12:06 UTC (permalink / raw)
To: util-linux
In-Reply-To: <20110614115125.GG14293@nb.net.home>
Karel Zak wrote:
> On Tue, Jun 14, 2011 at 01:45:34PM +0200, Karel Zak wrote:
> > On Wed, Jun 08, 2011 at 03:35:01PM +0200, Ludwig Nussel wrote:
> > > ---
> > > misc-utils/uuidgen.c | 4 +++-
> > > 1 files changed, 3 insertions(+), 1 deletions(-)
> > >
> > > diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
> > > index 3cf6ec9..47f8e8f 100644
> > > --- a/misc-utils/uuidgen.c
> > > +++ b/misc-utils/uuidgen.c
> > > @@ -59,7 +59,9 @@ main (int argc, char *argv[])
> > >
> > > switch (do_type) {
> > > case DO_TYPE_TIME:
> > > - uuid_generate_time(uu);
> > > + if (uuid_generate_time_safe(uu)) {
> > > + fprintf(stderr, _("Warning: uuidd not running or not operational. Time based uuid may not be unique.\n"));
> >
> > IMHO this is overkill -- the uuidd is used very rarely (usually on
> > large systems with SAP) and it's disabled by default in many
> > distributions, but the uuidgen(1) util is available everywhere and
> > used probably often used by admins/scripts.
That's the problem exactly. uuidgen seems to work for them at first
until lots of uuids within a short time are required. It's a mean
trap.
> > It would be better to add some WARNING section to the uuidgen(1) man
> > page to inform users about the disadvantage.
Well, who reads docu if uuidgen -t appears to work?
> ... we can also add a new option (e.g. --safe) to use
> uuid_generate_time_safe().
... or make -t fail if it's not safe and add a --unsafe option. That
would be the fail-safe approach :-)
cu
Ludwig
--
(o_ Ludwig Nussel
//\
V_/_ http://www.suse.de/
SUSE LINUX Products GmbH, GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply
* RE: [PATCH] uuidgen: print warning if uuidd isn't running
From: Voelker, Bernhard @ 2011-06-14 12:17 UTC (permalink / raw)
To: Ludwig Nussel, util-linux@vger.kernel.org
In-Reply-To: <201106141406.10364.ludwig.nussel@suse.de>
Ludwig Nussel wrote:
> Karel Zak wrote:
>
> Well, who reads docu if uuidgen -t appears to work?
>
>> ... we can also add a new option (e.g. --safe) to use
>> uuid_generate_time_safe().
>
> ... or make -t fail if it's not safe and add a --unsafe option. That
> would be the fail-safe approach :-)
Wasn't there a similar discussion back in Feb. when the *_safe()
function was introduced?
http://www.spinics.net/lists/util-linux-ng/msg03933.html
http://www.spinics.net/lists/util-linux-ng/msg04092.html
Bye,
Berny
^ permalink raw reply
* Re: [PATCH 0/6] Build with musl libc
From: Karel Zak @ 2011-06-14 12:24 UTC (permalink / raw)
To: Josiah Worcester; +Cc: util-linux
In-Reply-To: <1307573568-23643-1-git-send-email-josiahw@gmail.com>
On Wed, Jun 08, 2011 at 04:52:42PM -0600, Josiah Worcester wrote:
> fdisk/fdiskbsdlabel.c | 34 +++++++++++++++++-----------------
> fsck/fsck.c | 2 +-
> hwclock/cmos.c | 7 ++++++-
> lib/tt.c | 2 +-
> login-utils/checktty.c | 7 +++++--
> sys-utils/flock.c | 2 ++
> tests/helpers/test_sysinfo.c | 2 +-
> text-utils/display.c | 32 ++++++++++++++++----------------
> text-utils/hexdump.h | 4 ++--
> 9 files changed, 51 insertions(+), 41 deletions(-)
Applied, thanks.
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH 6/6] hwclock: Don't use asm/io.h if sys/io.h can't be found
From: Karel Zak @ 2011-06-14 12:26 UTC (permalink / raw)
To: Mike Frysinger; +Cc: Josiah Worcester, util-linux
In-Reply-To: <201106082058.26670.vapier@gentoo.org>
On Wed, Jun 08, 2011 at 08:58:25PM -0400, Mike Frysinger wrote:
> On Wednesday, June 08, 2011 18:52:48 Josiah Worcester wrote:
> > -#include <asm/io.h> /* for inb, outb */
> > +/* Disable cmos access; we can no longer use asm/io.h, since
> > + * the kernel does not export that header.
> > + */
> > +#undef __i386__
> > +void outb(int a, int b){}
> > +int inb(int c){ return 0; }
>
> probably should be turned into a header check in configure
I have added asm/io.h check to configure.ac to keep it backwardly
compatible...
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH] uuidgen: print warning if uuidd isn't running
From: Karel Zak @ 2011-06-14 14:38 UTC (permalink / raw)
To: Ludwig Nussel; +Cc: util-linux
In-Reply-To: <201106141406.10364.ludwig.nussel@suse.de>
On Tue, Jun 14, 2011 at 02:06:10PM +0200, Ludwig Nussel wrote:
> Karel Zak wrote:
> > On Tue, Jun 14, 2011 at 01:45:34PM +0200, Karel Zak wrote:
> > > On Wed, Jun 08, 2011 at 03:35:01PM +0200, Ludwig Nussel wrote:
> > > > ---
> > > > misc-utils/uuidgen.c | 4 +++-
> > > > 1 files changed, 3 insertions(+), 1 deletions(-)
> > > >
> > > > diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
> > > > index 3cf6ec9..47f8e8f 100644
> > > > --- a/misc-utils/uuidgen.c
> > > > +++ b/misc-utils/uuidgen.c
> > > > @@ -59,7 +59,9 @@ main (int argc, char *argv[])
> > > >
> > > > switch (do_type) {
> > > > case DO_TYPE_TIME:
> > > > - uuid_generate_time(uu);
> > > > + if (uuid_generate_time_safe(uu)) {
> > > > + fprintf(stderr, _("Warning: uuidd not running or not operational. Time based uuid may not be unique.\n"));
> > >
> > > IMHO this is overkill -- the uuidd is used very rarely (usually on
> > > large systems with SAP) and it's disabled by default in many
> > > distributions, but the uuidgen(1) util is available everywhere and
> > > used probably often used by admins/scripts.
>
> That's the problem exactly. uuidgen seems to work for them at first
> until lots of uuids within a short time are required. It's a mean
> trap.
>
> > > It would be better to add some WARNING section to the uuidgen(1) man
> > > page to inform users about the disadvantage.
>
> Well, who reads docu if uuidgen -t appears to work?
>
> > ... we can also add a new option (e.g. --safe) to use
> > uuid_generate_time_safe().
>
> ... or make -t fail if it's not safe and add a --unsafe option. That
> would be the fail-safe approach :-)
OK. What about --force rather than --unsafe?
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH 1/2] mkfs.minix: standardize superblock attribute settings
From: Karel Zak @ 2011-06-14 14:58 UTC (permalink / raw)
To: Davidlohr Bueso; +Cc: util-linux
In-Reply-To: <1307638115.2155.2.camel@offworld>
On Thu, Jun 09, 2011 at 12:48:35PM -0400, Davidlohr Bueso wrote:
> disk-utils/mkfs.minix.c | 32 +++++++++++++++++++++++++++-----
> 1 files changed, 27 insertions(+), 5 deletions(-)
Applied, thanks.
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH 2/2] mkfs.minix: add fs version options
From: Karel Zak @ 2011-06-14 14:59 UTC (permalink / raw)
To: Davidlohr Bueso; +Cc: util-linux
In-Reply-To: <1307638121.2155.3.camel@offworld>
On Thu, Jun 09, 2011 at 12:48:41PM -0400, Davidlohr Bueso wrote:
> disk-utils/mkfs.minix.8 | 5 ++++-
> disk-utils/mkfs.minix.c | 8 ++++++--
> 2 files changed, 10 insertions(+), 3 deletions(-)
Applied, thanks.
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: Typo in blkid manpage
From: Karel Zak @ 2011-06-14 15:04 UTC (permalink / raw)
To: John Lindgren; +Cc: util-linux
In-Reply-To: <4DF5206F.1070308@tds.net>
On Sun, Jun 12, 2011 at 04:24:15PM -0400, John Lindgren wrote:
> list", there is this example:
>
> blkid -p -u nominix /dev/sda1
>
> This should be:
>
> blkid -p -n nominix /dev/sda1
Already fixed in git tree.
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH] blkid: Don't ignore swap UUID if only first byte is zero.
From: Karel Zak @ 2011-06-14 15:17 UTC (permalink / raw)
To: Richard W.M. Jones; +Cc: util-linux
In-Reply-To: <20110613170541.GY28762@amd.home.annexia.org>
On Mon, Jun 13, 2011 at 06:05:42PM +0100, Richard W.M. Jones wrote:
> libblkid/src/superblocks/swap.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
Applied, thanks.
> + if (memcmp (hdr->uuid, zero_uuid, sizeof zero_uuid) != 0
> + && blkid_probe_set_uuid(pr, hdr->uuid) < 0)
I have removed the memcmp(), it's already in blkid_probe_set_uuid().
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH 6/6] sfdisk: fix for data type mismatches
From: Sami Kerola @ 2011-06-14 20:00 UTC (permalink / raw)
To: Karel Zak; +Cc: util-linux
In-Reply-To: <20110614112919.GE14293@nb.net.home>
On Tue, Jun 14, 2011 at 13:29, Karel Zak <kzak@redhat.com> wrote:
> On Mon, Jun 06, 2011 at 09:07:19PM +0200, Sami Kerola wrote:
>> + =A0 =A0 if ((unsigned long) pno+4 >=3D ARRAY_SIZE(z->partitions)) {
>
> =A0Why 'unsigned long'? I guess that ARRAY_SIZE returns size_t. Maybe it
> =A0would be better to use size_t for partno numbers rather than add the
> =A0cast.
Yes are right, that was silly. I reviewed the patch and changed data
types to size_t. The fix is pushed with force to my git.
p.s. The style in the file is really horrible. How about doing the
following, which will unify the style within the file without changing
everything.
indent -linux -i4 -psl -brf sfdisk.c
--=20
=A0=A0 Sami Kerola
=A0=A0 http://www.iki.fi/kerolasa/
^ permalink raw reply
* [PATCH 1/4] uuidgen: fail if uuidd isn't running
From: Ludwig Nussel @ 2011-06-16 13:59 UTC (permalink / raw)
To: util-linux; +Cc: Ludwig Nussel
time bases uuids are not safe if uuidd is not running.
Add option --force to generate a uuid in this case nevertheless.
---
misc-utils/uuidgen.c | 51 ++++++++++++++++++++++++++++++++++---------------
1 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
index 3cf6ec9..b83b124 100644
--- a/misc-utils/uuidgen.c
+++ b/misc-utils/uuidgen.c
@@ -10,34 +10,43 @@
*/
#include <stdio.h>
-#ifdef HAVE_STDLIB_H
#include <stdlib.h>
-#endif
-#ifdef HAVE_GETOPT_H
#include <getopt.h>
-#else
-extern int getopt(int argc, char * const argv[], const char *optstring);
-extern char *optarg;
-extern int optind;
-#endif
#include "uuid.h"
#include "nls.h"
+#include "c.h"
#define DO_TYPE_TIME 1
#define DO_TYPE_RANDOM 2
-static void usage(const char *progname)
+static const struct option long_options[] = {
+ { "time", 0, NULL, 't' },
+ { "random", 0, NULL, 'r' },
+ { "force", 0, NULL, 128 },
+ { "help", 0, NULL, 'h' },
+ { 0, 0, 0, 0 }
+};
+
+static void usage(int ex)
{
- fprintf(stderr, _("Usage: %s [-r] [-t]\n"), progname);
- exit(1);
+ printf(_("Usage: %s [options]\n"
+ " -r, --random Generate a random-based UUID\n"
+ " -t, --time Generate a time-based UUID\n"
+ " --force print uuid even if it's potentially weak\n"
+ " -h, --help Display this text\n"),
+ program_invocation_short_name);
+ exit(ex);
}
+
+
int
main (int argc, char *argv[])
{
int c;
int do_type = 0;
+ int force = 0;
char str[37];
uuid_t uu;
@@ -45,21 +54,31 @@ main (int argc, char *argv[])
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- while ((c = getopt (argc, argv, "tr")) != EOF)
+ while ((c = getopt_long(argc, argv, "rth", long_options, NULL)) != EOF ) {
switch (c) {
- case 't':
- do_type = DO_TYPE_TIME;
+ case 'h':
+ usage(0);
break;
case 'r':
do_type = DO_TYPE_RANDOM;
break;
+ case 't':
+ do_type = DO_TYPE_TIME;
+ break;
+ case 128:
+ force = 1;
+ break;
default:
- usage(argv[0]);
+ usage(1);
}
+ }
switch (do_type) {
case DO_TYPE_TIME:
- uuid_generate_time(uu);
+ if (uuid_generate_time_safe(uu) && !force) {
+ fprintf(stderr, _("uuidd not running or not operational.\n"));
+ exit(1);
+ }
break;
case DO_TYPE_RANDOM:
uuid_generate_random(uu);
--
1.7.3.4
^ permalink raw reply related
* [PATCH 2/4] uuid: implement uuid_generate_random_safe
From: Ludwig Nussel @ 2011-06-16 13:59 UTC (permalink / raw)
To: util-linux; +Cc: Ludwig Nussel
In-Reply-To: <1308232779-21018-1-git-send-email-ludwig.nussel@suse.de>
uuid_generate_random_safe() cannot really fail but it may use a weak
random number generator as fallback.
---
libuuid/src/gen_uuid.c | 32 +++++++++++++++++++++++++++++---
libuuid/src/uuid.h | 4 +++-
libuuid/src/uuid.sym | 2 ++
misc-utils/uuidgen.c | 10 ++++++++--
4 files changed, 42 insertions(+), 6 deletions(-)
diff --git a/libuuid/src/gen_uuid.c b/libuuid/src/gen_uuid.c
index f4c8997..0c81a5c 100644
--- a/libuuid/src/gen_uuid.c
+++ b/libuuid/src/gen_uuid.c
@@ -693,6 +693,18 @@ void uuid_generate_random(uuid_t out)
__uuid_generate_random(out, &num);
}
+int uuid_generate_random_safe(uuid_t out)
+{
+ int num = 1;
+ /* No real reason to use the daemon for random uuid's -- yet */
+
+ if (get_random_fd() < 0)
+ return -1;
+
+ __uuid_generate_random(out, &num);
+ return 0;
+}
+
/*
* This is the generic front-end to uuid_generate_random and
@@ -700,10 +712,24 @@ void uuid_generate_random(uuid_t out)
* /dev/urandom is available, since otherwise we won't have
* high-quality randomness.
*/
-void uuid_generate(uuid_t out)
+static int _uuid_generate(uuid_t out)
{
if (get_random_fd() >= 0)
- uuid_generate_random(out);
+ {
+ int num = 1;
+ __uuid_generate_random(out, &num);
+ return 0;
+ }
else
- uuid_generate_time(out);
+ return uuid_generate_time_generic(out);
+}
+
+void uuid_generate(uuid_t out)
+{
+ (void)_uuid_generate(out);
+}
+
+int uuid_generate_safe(uuid_t out)
+{
+ return _uuid_generate(out);
}
diff --git a/libuuid/src/uuid.h b/libuuid/src/uuid.h
index 874d65a..2771255 100644
--- a/libuuid/src/uuid.h
+++ b/libuuid/src/uuid.h
@@ -79,7 +79,9 @@ void uuid_copy(uuid_t dst, const uuid_t src);
void uuid_generate(uuid_t out);
void uuid_generate_random(uuid_t out);
void uuid_generate_time(uuid_t out);
-int uuid_generate_time_safe(uuid_t out);
+int uuid_generate_time_safe(uuid_t out) __attribute__((warn_unused_result));
+int uuid_generate_random_safe(uuid_t out) __attribute__((warn_unused_result));
+int uuid_generate_safe(uuid_t out) __attribute__((warn_unused_result));
/* isnull.c */
int uuid_is_null(const uuid_t uu);
diff --git a/libuuid/src/uuid.sym b/libuuid/src/uuid.sym
index 2cad51b..aec79e7 100644
--- a/libuuid/src/uuid.sym
+++ b/libuuid/src/uuid.sym
@@ -30,6 +30,8 @@ global:
UUID_2.20 {
global:
uuid_generate_time_safe;
+ uuid_generate_random_safe;
+ uuid_generate_safe;
} UUID_1.0;
diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
index b83b124..e81e065 100644
--- a/misc-utils/uuidgen.c
+++ b/misc-utils/uuidgen.c
@@ -81,10 +81,16 @@ main (int argc, char *argv[])
}
break;
case DO_TYPE_RANDOM:
- uuid_generate_random(uu);
+ if (uuid_generate_random_safe(uu) && !force) {
+ fprintf(stderr, _("/dev/[u]random unavailable.\n"));
+ exit(1);
+ }
break;
default:
- uuid_generate(uu);
+ if (uuid_generate_safe(uu) && !force) {
+ fprintf(stderr, _("/dev/[u]random unavailable and uuidd not running.\n"));
+ exit(1);
+ }
break;
}
--
1.7.3.4
^ permalink raw reply related
* [PATCH 4/4] update manpage
From: Ludwig Nussel @ 2011-06-16 13:59 UTC (permalink / raw)
To: util-linux; +Cc: Ludwig Nussel
In-Reply-To: <1308232779-21018-1-git-send-email-ludwig.nussel@suse.de>
---
libuuid/man/Makefile.am | 2 +-
libuuid/man/uuid_generate.3 | 28 ++++++++++------------------
misc-utils/uuidgen.1 | 11 ++++++++---
3 files changed, 19 insertions(+), 22 deletions(-)
diff --git a/libuuid/man/Makefile.am b/libuuid/man/Makefile.am
index 8e9ed6d..3880952 100644
--- a/libuuid/man/Makefile.am
+++ b/libuuid/man/Makefile.am
@@ -3,7 +3,7 @@ include $(top_srcdir)/config/include-Makefile.am
dist_man_MANS = uuid.3 uuid_clear.3 uuid_compare.3 uuid_copy.3 uuid_generate.3 \
uuid_is_null.3 uuid_parse.3 uuid_time.3 uuid_unparse.3
-UUID_GENERATE_LINKS = uuid_generate_random.3 uuid_generate_time.3 uuid_generate_time_safe.3
+UUID_GENERATE_LINKS = uuid_generate_random.3 uuid_generate_time.3
man_MANS = $(UUID_GENERATE_LINKS)
CLEANFILES = $(man_MANS)
diff --git a/libuuid/man/uuid_generate.3 b/libuuid/man/uuid_generate.3
index 8185056..2b799ee 100644
--- a/libuuid/man/uuid_generate.3
+++ b/libuuid/man/uuid_generate.3
@@ -31,16 +31,15 @@
.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger
.TH UUID_GENERATE 3 "May 2009" "util-linux" "Libuuid API"
.SH NAME
-uuid_generate, uuid_generate_random, uuid_generate_time,
-uuid_generate_time_safe \- create a new unique UUID value
+uuid_generate, uuid_generate_random, uuid_generate_time
+\- create a new unique UUID value
.SH SYNOPSIS
.nf
.B #include <uuid/uuid.h>
.sp
-.BI "void uuid_generate(uuid_t " out );
-.BI "void uuid_generate_random(uuid_t " out );
-.BI "void uuid_generate_time(uuid_t " out );
-.BI "int uuid_generate_time_safe(uuid_t " out );
+.BI "int uuid_generate(uuid_t " out );
+.BI "int uuid_generate_random(uuid_t " out );
+.BI "int uuid_generate_time(uuid_t " out );
.fi
.SH DESCRIPTION
The
@@ -82,16 +81,7 @@ to this file) and/or the
daemon, if it is running already or can be be spawned by the process (if
installed and the process has enough permissions to run it). If neither of
these two synchronization mechanisms can be used, it is theoretically possible
-that two concurrently running processes obtain the same UUID(s). To tell
-whether the UUID has been generated in a safe manner, use
-.BR uuid_generate_time_safe .
-.sp
-The
-.B uuid_generate_time_safe
-is similar to
-.BR uuid_generate_time ,
-except that it returns a value which denotes whether any of the synchronization
-mechanisms (see above) has been used.
+that two concurrently running processes obtain the same UUID(s).
.sp
The UUID is 16 bytes (128 bits) long, which gives approximately 3.4x10^38
unique values (there are approximately 10^80 elementary particles in
@@ -101,12 +91,14 @@ The new UUID can reasonably be considered unique among all UUIDs created
on the local system, and among UUIDs created on other systems in the past
and in the future.
.SH RETURN VALUE
+The functions return zero if the UUID has been generated in a safe manner and -1
+if the UUID is potentially weak.
The newly created UUID is returned in the memory location pointed to by
.IR out .
-.B uuid_generate_time_safe
-returns zero if the UUID has been generated in a safe manner, -1 otherwise.
.SH "CONFORMING TO"
OSF DCE 1.1
+.sp
+In the original implementation the functions did not have a return value.
.SH AUTHOR
Theodore Y. Ts'o
.SH AVAILABILITY
diff --git a/misc-utils/uuidgen.1 b/misc-utils/uuidgen.1
index 453a7f5..efb6d9b 100644
--- a/misc-utils/uuidgen.1
+++ b/misc-utils/uuidgen.1
@@ -37,15 +37,20 @@ or
options.
.SH OPTIONS
.TP
-.B \-r
+.B \-r, \-\-random
Generate a random-based UUID. This method creates a UUID consisting mostly
of random bits. It requires that the operating system have a high
quality random number generator, such as
.IR /dev/random .
.TP
-.B \-t
+.B \-t, \-\-time
Generate a time-based UUID. This method creates a UUID based on the system
-clock plus the system's ethernet hardware address, if present.
+clock plus the system's ethernet hardware address, if present. uuidd must be
+running to make sure no duplicate uuids are generated.
+.TP
+.B \-\-force
+Force generating a UUID even if it's potentially weak, ie
+/dev/[u]random not available or uuidd not running.
.SH "CONFORMING TO"
OSF DCE 1.1
.SH AUTHOR
--
1.7.3.4
^ permalink raw reply related
* [PATCH 3/4] uuid: use new functions by default
From: Ludwig Nussel @ 2011-06-16 13:59 UTC (permalink / raw)
To: util-linux; +Cc: Ludwig Nussel
In-Reply-To: <1308232779-21018-1-git-send-email-ludwig.nussel@suse.de>
---
libuuid/src/gen_uuid.c | 2 ++
libuuid/src/uuid.h | 12 +++++++++---
misc-utils/uuidgen.c | 6 +++---
3 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/libuuid/src/gen_uuid.c b/libuuid/src/gen_uuid.c
index 0c81a5c..e6f8b74 100644
--- a/libuuid/src/gen_uuid.c
+++ b/libuuid/src/gen_uuid.c
@@ -38,6 +38,8 @@
*/
#define _SVID_SOURCE
+#define LIBUUID_UNSAFE_LEGACY_PROTOTYPES
+
#ifdef _WIN32
#define _WIN32_WINNT 0x0500
#include <windows.h>
diff --git a/libuuid/src/uuid.h b/libuuid/src/uuid.h
index 2771255..fec4f8c 100644
--- a/libuuid/src/uuid.h
+++ b/libuuid/src/uuid.h
@@ -76,12 +76,18 @@ int uuid_compare(const uuid_t uu1, const uuid_t uu2);
void uuid_copy(uuid_t dst, const uuid_t src);
/* gen_uuid.c */
-void uuid_generate(uuid_t out);
-void uuid_generate_random(uuid_t out);
-void uuid_generate_time(uuid_t out);
int uuid_generate_time_safe(uuid_t out) __attribute__((warn_unused_result));
int uuid_generate_random_safe(uuid_t out) __attribute__((warn_unused_result));
int uuid_generate_safe(uuid_t out) __attribute__((warn_unused_result));
+#ifdef LIBUUID_UNSAFE_LEGACY_PROTOTYPES
+void uuid_generate(uuid_t out) __attribute__((deprecated));
+void uuid_generate_random(uuid_t out) __attribute__((deprecated));
+void uuid_generate_time(uuid_t out) __attribute__((deprecated));
+#else
+static inline int uuid_generate_time(uuid_t out) { return uuid_generate_time_safe(out); }
+static inline int uuid_generate_random(uuid_t out) { return uuid_generate_random_safe(out); }
+static inline int uuid_generate(uuid_t out) { return uuid_generate_safe(out); }
+#endif
/* isnull.c */
int uuid_is_null(const uuid_t uu);
diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c
index e81e065..094f953 100644
--- a/misc-utils/uuidgen.c
+++ b/misc-utils/uuidgen.c
@@ -75,19 +75,19 @@ main (int argc, char *argv[])
switch (do_type) {
case DO_TYPE_TIME:
- if (uuid_generate_time_safe(uu) && !force) {
+ if (uuid_generate_time(uu) && !force) {
fprintf(stderr, _("uuidd not running or not operational.\n"));
exit(1);
}
break;
case DO_TYPE_RANDOM:
- if (uuid_generate_random_safe(uu) && !force) {
+ if (uuid_generate_random(uu) && !force) {
fprintf(stderr, _("/dev/[u]random unavailable.\n"));
exit(1);
}
break;
default:
- if (uuid_generate_safe(uu) && !force) {
+ if (uuid_generate(uu) && !force) {
fprintf(stderr, _("/dev/[u]random unavailable and uuidd not running.\n"));
exit(1);
}
--
1.7.3.4
^ permalink raw reply related
* Re: [PATCH 1/4] uuidgen: fail if uuidd isn't running
From: Karel Zak @ 2011-06-16 15:38 UTC (permalink / raw)
To: Ludwig Nussel; +Cc: util-linux
In-Reply-To: <1308232779-21018-1-git-send-email-ludwig.nussel@suse.de>
On Thu, Jun 16, 2011 at 03:59:36PM +0200, Ludwig Nussel wrote:
> -static void usage(const char *progname)
> +static const struct option long_options[] = {
> + { "time", 0, NULL, 't' },
> + { "random", 0, NULL, 'r' },
> + { "force", 0, NULL, 128 },
^^^^
Why not 'f' (as short option)?
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
* Re: [PATCH 2/4] uuid: implement uuid_generate_random_safe
From: Karel Zak @ 2011-06-16 15:54 UTC (permalink / raw)
To: Ludwig Nussel; +Cc: util-linux
In-Reply-To: <1308232779-21018-2-git-send-email-ludwig.nussel@suse.de>
On Thu, Jun 16, 2011 at 03:59:37PM +0200, Ludwig Nussel wrote:
> uuid_generate_random_safe() cannot really fail but it may use a weak
> random number generator as fallback.
> ---
> libuuid/src/gen_uuid.c | 32 +++++++++++++++++++++++++++++---
> libuuid/src/uuid.h | 4 +++-
> libuuid/src/uuid.sym | 2 ++
> misc-utils/uuidgen.c | 10 ++++++++--
> 4 files changed, 42 insertions(+), 6 deletions(-)
>
> diff --git a/libuuid/src/gen_uuid.c b/libuuid/src/gen_uuid.c
> index f4c8997..0c81a5c 100644
> --- a/libuuid/src/gen_uuid.c
> +++ b/libuuid/src/gen_uuid.c
> @@ -693,6 +693,18 @@ void uuid_generate_random(uuid_t out)
> __uuid_generate_random(out, &num);
> }
>
> +int uuid_generate_random_safe(uuid_t out)
> +{
> + int num = 1;
> + /* No real reason to use the daemon for random uuid's -- yet */
> +
> + if (get_random_fd() < 0)
> + return -1;
> +
> + __uuid_generate_random(out, &num);
> + return 0;
> +}
> +
It would be nice to use the same concept for the *_random functions as
we already use for the *_time functions. It means to rename
__uuid_generate_random() to uuid_generate_random_generic().
> /*
> * This is the generic front-end to uuid_generate_random and
> @@ -700,10 +712,24 @@ void uuid_generate_random(uuid_t out)
> * /dev/urandom is available, since otherwise we won't have
> * high-quality randomness.
> */
> -void uuid_generate(uuid_t out)
> +static int _uuid_generate(uuid_t out)
rename to: static int uuid_generate_genetic()
> +void uuid_generate(uuid_t out)
> +{
> + (void)_uuid_generate(out);
Don't use "(void)" in the code :-) It's unnecessary.
> +int uuid_generate_time_safe(uuid_t out) __attribute__((warn_unused_result));
> +int uuid_generate_random_safe(uuid_t out) __attribute__((warn_unused_result));
> +int uuid_generate_safe(uuid_t out) __attribute__((warn_unused_result));
Good idea, but is warn_unused_result supported in old gcc versions?
See include/c.h where we have __GNUC_PREREQ stuff.
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox