On Thursday 18 June 2009 10:47:56 Colin Watson wrote:
> Many modern Linux installers use UUIDs rather than device names to
> identify devices. This works better if mkswap sets a UUID.
>
> Signed-off-by: Colin Watson <[email protected]>
> ---
>  Makefile                            |    1 +
>  e2fsprogs/old_e2fsprogs/uuid/Kbuild |    1 +
>  util-linux/Kbuild                   |    2 ++
>  util-linux/mkswap.c                 |   13 +++++++++++++
>  4 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index ffa6948..633711a 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -451,6 +451,7 @@ libs-y            := \
>               coreutils/libcoreutils/ \
>               debianutils/ \
>               e2fsprogs/ \
> +             e2fsprogs/old_e2fsprogs/uuid/ \
>               editors/ \
>               findutils/ \
>               init/ \

AAAAHHH!!!!!  KILL IT WITH FIRE!

Here's the uuid creation function I wrote for toybox a couple years back, 
after reading more standards documents than are strictly healthy to see what I 
could get away with _not_ doing:

// According to http://www.opengroup.org/onlinepubs/9629399/apdxa.htm
// we should generate a uuid structure by reading a clock with 100 nanosecond
// precision, normalizing it to the start of the gregorian calendar in 1582,
// and looking up our eth0 mac address.
//
// On the other hand, we have 128 bits to come up with a unique identifier, of
// which 6 have a defined value.  /dev/urandom it is.

static void create_uuid(char *uuid)
{
        // Read 128 random bits
        int fd = xopen("/dev/urandom", O_RDONLY);
        xreadall(fd, uuid, 16);
        close(fd);

        // Claim to be a DCE format UUID.
        uuid[6] = (uuid[6] & 0x0F) | 0x40;
        uuid[8] = (uuid[8] & 0x3F) | 0x80;

        // rfc2518 section 6.4.1 suggests if we're not using a macaddr, we 
should
        // set bit 1 of the node ID, which is the mac multicast bit.  This 
means we
        // should never collide with anybody actually using a macaddr.
        uuid[11] = uuid[11] | 128;
}

> +static void mkswap_generate_uuid(void *buf)
> +{
> +     uuid_t uuid_dat;
> +     char uuid_string[37];
> +
> +     uuid_generate(uuid_dat);
> +     memcpy(buf, uuid_dat, sizeof(uuid_dat));
> +     uuid_unparse(uuid_dat, uuid_string);

And here's a totally untested, off the top of my head guess at a uuid_unparse() 
that may have endianness issues but should at least be internally consistent.  
Probably has at least one major thinko, haven't even tried compiling it, but 
you get the idea:

void uuid_unparse(char *in, char *out)
{
        int i=0, fields[4,6,8,10,16], ipos=0, opos=0;

        for (;;) {
                opos += sprintf(out+opos, "%02x", in[ipos++]);

                if (ipos > fields[i]) {
                        if (i++) {
                                if (i==5) break;
                                out[pos++]='-';
                        }
                }
        }
}

Please please please please please don't resurrect bits of old_e2fsprogs.  
Rewriting it from scratch, fine.  Using it out of the old_ directory: ew.

Rob
-- 
Latency is more important than throughput. It's that simple. - Linus Torvalds
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to