From 7c950efa3438b02097d915497d67248dde709e72 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 11 May 2009 15:06:06 +0200 Subject: build-sys: fix blkid.h include for old e2fsprogs When building util-linux-ng-2.15, I get this: ../lib/fsprobe.c:10:19: error: blkid.h: No such file or directory Unfortunately, the blkid.pc uses -I${includedir}/blkidi since e2fsprogs v1.41.2. The old versions use -I${includedir} only. Reported-by: Robert Schwebel Signed-off-by: Karel Zak --- configure.ac | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 46dc3235..ec41ae60 100644 --- a/configure.ac +++ b/configure.ac @@ -180,7 +180,19 @@ have_volume_id=no if test "x$with_fsprobe" = xblkid; then PKG_CHECK_MODULES(BLKID, blkid, [have_blkid=yes], []) - AC_CHECK_LIB(blkid, blkid_evaluate_tag, [have_blkid_evaluate=yes], []) + if test "x$have_blkid" = xyes; then + old_CFLAGS="$CFLAGS" + old_CPPFLAGS="$CPPFLAGS" + old_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS $BLKID_CFLAGS" + CPPFLAGS="$CPPFLAGS $BLKID_CFLAGS" + LDFLAGS="$LDFLAGS $BLKID_LIBS" + AC_CHECK_HEADERS([blkid.h blkid/blkid.h], [break], []) + AC_CHECK_FUNC(blkid_evaluate_tag, [have_blkid_evaluate=yes], []) + CFLAGS="$old_CFLAGS" + CPPFLAGS="$old_CPPFLAGS" + LDFLAGS="$old_LDFLAGS" + fi elif test "x$with_fsprobe" = xvolume_id; then PKG_CHECK_MODULES(VOLUME_ID, volume_id, [have_volume_id=yes], []) elif test "x$with_fsprobe" = xbuiltin; then -- cgit v1.2.3 From 20ad4963249c236f81e9e05be300e1e844d0cfd8 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 14 May 2009 17:40:52 +0200 Subject: build-sys: complete /libs to /shlibs rename Signed-off-by: Karel Zak --- Makefile.am | 2 +- config/include-Makefile.am | 6 +++--- configure.ac | 22 +++++++++++----------- shlibs/blkid/src/Makefile.am | 6 ++---- shlibs/blkid/src/probers/Makefile.am | 2 +- tests/commands.sh.in | 2 +- 6 files changed, 19 insertions(+), 21 deletions(-) (limited to 'configure.ac') diff --git a/Makefile.am b/Makefile.am index 8fea6fa6..0c8fb693 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ SUBDIRS = \ fdisk \ getopt \ lib \ - libs \ + shlibs \ login-utils \ misc-utils \ po \ diff --git a/config/include-Makefile.am b/config/include-Makefile.am index d5da619a..bc943301 100644 --- a/config/include-Makefile.am +++ b/config/include-Makefile.am @@ -16,9 +16,9 @@ dist_noinst_DATA = $(dist_man_MANS) # Paths to in-tree libraries (use ul_ prefix to avoid possible collisions) # -ul_libblkid_srcdir = $(top_srcdir)/libs/blkid/src -ul_libblkid_builddir = $(top_builddir)/libs/blkid/src -ul_libblkid_la = $(top_builddir)/libs/blkid/src/libblkid.la +ul_libblkid_srcdir = $(top_srcdir)/shlibs/blkid/src +ul_libblkid_builddir = $(top_builddir)/shlibs/blkid/src +ul_libblkid_la = $(top_builddir)/shlibs/blkid/src/libblkid.la $(ul_libblkid_la): $(MAKE) -C $(ul_libblkid_builddir) diff --git a/configure.ac b/configure.ac index ec41ae60..1abf688f 100644 --- a/configure.ac +++ b/configure.ac @@ -773,7 +773,6 @@ LIBS="" AC_CONFIG_HEADERS(config.h) AC_CONFIG_FILES([ -Makefile disk-utils/Makefile fdisk/Makefile fsck/Makefile @@ -781,24 +780,25 @@ getopt/Makefile hwclock/Makefile include/Makefile lib/Makefile -libs/Makefile -libs/blkid/blkid.pc -libs/blkid/Makefile -libs/blkid/bin/Makefile -libs/blkid/src/Makefile -libs/blkid/src/probers/Makefile login-utils/Makefile +Makefile +misc-utils/chkdupexe:misc-utils/chkdupexe.pl misc-utils/Makefile mount/Makefile partx/Makefile po/Makefile.in schedutils/Makefile +shlibs/blkid/bin/Makefile +shlibs/blkid/blkid.pc +shlibs/blkid/Makefile +shlibs/blkid/src/Makefile +shlibs/blkid/src/probers/Makefile +shlibs/Makefile sys-utils/Makefile -text-utils/Makefile -tests/Makefile -tests/helpers/Makefile tests/commands.sh -misc-utils/chkdupexe:misc-utils/chkdupexe.pl +tests/helpers/Makefile +tests/Makefile +text-utils/Makefile ]) AC_OUTPUT diff --git a/shlibs/blkid/src/Makefile.am b/shlibs/blkid/src/Makefile.am index 805d0899..2b935e29 100644 --- a/shlibs/blkid/src/Makefile.am +++ b/shlibs/blkid/src/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/config/include-Makefile.am SUBDIRS = probers . -AM_CPPFLAGS += -I$(top_srcdir)/libs/blkid/src +AM_CPPFLAGS += -I$(ul_libblkid_srcdir) common_ldadd = @@ -28,9 +28,7 @@ libblkid_la_SOURCES = cache.c dev.c devname.c devno.c getsize.c llseek.c \ libblkid_la_LIBADD = probers/libblkid_probers.la $(common_ldadd) libblkid_la_DEPENDENCIES = $(libblkid_la_LIBADD) blkid.sym -# TODO: for unknown reason "make distcheck" requires -# full path to the version script -libblkid_la_LDFLAGS = -Wl,--version-script=$(top_srcdir)/libs/blkid/src/blkid.sym \ +libblkid_la_LDFLAGS = -Wl,--version-script=$(ul_libblkid_srcdir)/blkid.sym \ -version-info 1:0:0 tests = test_cache test_config test_dev test_devname test_devno test_getsize \ diff --git a/shlibs/blkid/src/probers/Makefile.am b/shlibs/blkid/src/probers/Makefile.am index d8a98ed2..4591db6a 100644 --- a/shlibs/blkid/src/probers/Makefile.am +++ b/shlibs/blkid/src/probers/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/config/include-Makefile.am -AM_CPPFLAGS += -I$(top_srcdir)/libs/blkid/src +AM_CPPFLAGS += -I$(ul_libblkid_srcdir) noinst_LTLIBRARIES = libblkid_probers.la libblkid_probers_la_SOURCES = \ diff --git a/tests/commands.sh.in b/tests/commands.sh.in index 232ae630..c6a5e26b 100644 --- a/tests/commands.sh.in +++ b/tests/commands.sh.in @@ -45,6 +45,6 @@ TS_CMD_ISLOCAL=${TS_CMD_ISLOCAL-"$TOPDIR/login-utils/islocal_test"} TS_CMD_HWCLOCK=${TS_CMD_HWCLOCK-"$TOPDIR/hwclock/hwclock"} TS_CMD_LSCPU=${TS_CMD_LSCPU-"$TOPDIR/sys-utils/lscpu"} -TS_CMD_BLKID=${TS_CMD_BLKID-"$TOPDIR/libs/blkid/bin/blkid"} +TS_CMD_BLKID=${TS_CMD_BLKID-"$TOPDIR/shlibs/blkid/bin/blkid"} -- cgit v1.2.3 From a88057d9a329c11a5d4eaf7e15ce25b09be800e5 Mon Sep 17 00:00:00 2001 From: Tom Prince Date: Thu, 14 May 2009 22:43:02 -0400 Subject: cal: uClibc has langinfo.h but not _NL_TIME_WEEK_1STDAY. Signed-off-by: Tom Prince --- configure.ac | 2 ++ misc-utils/cal.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 1abf688f..af946a15 100644 --- a/configure.ac +++ b/configure.ac @@ -105,6 +105,8 @@ AC_CHECK_HEADERS([linux/raw.h], [AM_CONDITIONAL([HAVE_RAW], [true])], [AM_CONDITIONAL([HAVE_RAW], [false])]) +AC_CHECK_DECLS([_NL_TIME_WEEK_1STDAY],[],[],[[#include ]]) + AC_CHECK_FUNCS( [inet_aton \ fsync \ diff --git a/misc-utils/cal.c b/misc-utils/cal.c index f2d52e8c..a8534b8c 100644 --- a/misc-utils/cal.c +++ b/misc-utils/cal.c @@ -291,7 +291,7 @@ main(int argc, char **argv) { * the locale database, which can be overridden with the * -s (Sunday) or -m (Monday) options. */ -#ifdef HAVE_LANGINFO_H +#if HAVE_DECL__NL_TIME_WEEK_1STDAY /* * You need to use 2 locale variables to get the first day of the week. * This is needed to support first_weekday=2 and first_workday=1 for -- cgit v1.2.3 From 28d39b6dd71e6a054aa06c66f683a1e15439e56b Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 21 May 2009 13:20:10 +0200 Subject: mount: fix undefined reference to `security_get_initial_context' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > Gentoo-hardened stable have: sys-libs/libselinux-1.34.14 > I have: > mount.c:(.text+0x12ce): undefined reference to `security_get_initial_context' Reported-by: Максим Бритов Addresses-Gentoo-Bug: #270168 Signed-off-by: Karel Zak --- configure.ac | 5 +++++ mount/mount.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index af946a15..b174bce2 100644 --- a/configure.ac +++ b/configure.ac @@ -656,6 +656,11 @@ fi if test "x$have_selinux" = xyes; then SELINUX_LIBS="-lselinux -lsepol" SELINUX_LIBS_STATIC="-lselinux -lsepol" + old_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $SELINUX_LIBS" + # This function is missing in old libselinux 1.xx versions + AC_CHECK_FUNCS([security_get_initial_context]) + LDFLAGS="$old_LDFLAGS" fi AC_SUBST([SELINUX_LIBS]) AC_SUBST([SELINUX_LIBS_STATIC]) diff --git a/mount/mount.c b/mount/mount.c index f48f9d40..cc5b88ae 100644 --- a/mount/mount.c +++ b/mount/mount.c @@ -1561,7 +1561,7 @@ mount_retry: out: -#ifdef HAVE_LIBSELINUX +#if defined(HAVE_LIBSELINUX) && defined(HAVE_SECURITY_GET_INITIAL_CONTEXT) if (res != EX_FAIL && verbose && is_selinux_enabled() > 0) { security_context_t raw = NULL, def = NULL; -- cgit v1.2.3 From 754fed0c144686ad64205aad5c37d50ca8155fba Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Sat, 16 May 2009 01:01:36 +0200 Subject: libuuid: import UUID library from e2fsprogs Signed-off-by: Karel Zak --- config/include-Makefile.am | 9 + configure.ac | 25 +- shlibs/Makefile.am | 2 + shlibs/uuid/COPYING.libuuid | 25 ++ shlibs/uuid/Makefile.am | 10 + shlibs/uuid/man/Makefile.am | 4 + shlibs/uuid/man/uuid.3 | 66 ++++ shlibs/uuid/man/uuid_clear.3 | 60 ++++ shlibs/uuid/man/uuid_compare.3 | 66 ++++ shlibs/uuid/man/uuid_copy.3 | 62 ++++ shlibs/uuid/man/uuid_generate.3 | 104 +++++++ shlibs/uuid/man/uuid_is_null.3 | 62 ++++ shlibs/uuid/man/uuid_parse.3 | 71 +++++ shlibs/uuid/man/uuid_time.3 | 74 +++++ shlibs/uuid/man/uuid_unparse.3 | 79 +++++ shlibs/uuid/src/Makefile.am | 31 ++ shlibs/uuid/src/clear.c | 43 +++ shlibs/uuid/src/compare.c | 55 ++++ shlibs/uuid/src/copy.c | 45 +++ shlibs/uuid/src/gen_uuid.c | 656 ++++++++++++++++++++++++++++++++++++++++ shlibs/uuid/src/gen_uuid_nt.c | 92 ++++++ shlibs/uuid/src/isnull.c | 48 +++ shlibs/uuid/src/pack.c | 69 +++++ shlibs/uuid/src/parse.c | 79 +++++ shlibs/uuid/src/tst_uuid.c | 180 +++++++++++ shlibs/uuid/src/unpack.c | 63 ++++ shlibs/uuid/src/unparse.c | 76 +++++ shlibs/uuid/src/uuid.h | 103 +++++++ shlibs/uuid/src/uuid.sym | 27 ++ shlibs/uuid/src/uuidP.h | 59 ++++ shlibs/uuid/src/uuid_time.c | 171 +++++++++++ shlibs/uuid/src/uuidd.h | 53 ++++ shlibs/uuid/uuid.pc.in | 11 + 33 files changed, 2579 insertions(+), 1 deletion(-) create mode 100644 shlibs/uuid/COPYING.libuuid create mode 100644 shlibs/uuid/Makefile.am create mode 100644 shlibs/uuid/man/Makefile.am create mode 100644 shlibs/uuid/man/uuid.3 create mode 100644 shlibs/uuid/man/uuid_clear.3 create mode 100644 shlibs/uuid/man/uuid_compare.3 create mode 100644 shlibs/uuid/man/uuid_copy.3 create mode 100644 shlibs/uuid/man/uuid_generate.3 create mode 100644 shlibs/uuid/man/uuid_is_null.3 create mode 100644 shlibs/uuid/man/uuid_parse.3 create mode 100644 shlibs/uuid/man/uuid_time.3 create mode 100644 shlibs/uuid/man/uuid_unparse.3 create mode 100644 shlibs/uuid/src/Makefile.am create mode 100644 shlibs/uuid/src/clear.c create mode 100644 shlibs/uuid/src/compare.c create mode 100644 shlibs/uuid/src/copy.c create mode 100644 shlibs/uuid/src/gen_uuid.c create mode 100644 shlibs/uuid/src/gen_uuid_nt.c create mode 100644 shlibs/uuid/src/isnull.c create mode 100644 shlibs/uuid/src/pack.c create mode 100644 shlibs/uuid/src/parse.c create mode 100644 shlibs/uuid/src/tst_uuid.c create mode 100644 shlibs/uuid/src/unpack.c create mode 100644 shlibs/uuid/src/unparse.c create mode 100644 shlibs/uuid/src/uuid.h create mode 100644 shlibs/uuid/src/uuid.sym create mode 100644 shlibs/uuid/src/uuidP.h create mode 100644 shlibs/uuid/src/uuid_time.c create mode 100644 shlibs/uuid/src/uuidd.h create mode 100644 shlibs/uuid/uuid.pc.in (limited to 'configure.ac') diff --git a/config/include-Makefile.am b/config/include-Makefile.am index bc943301..2e4363f2 100644 --- a/config/include-Makefile.am +++ b/config/include-Makefile.am @@ -16,6 +16,7 @@ dist_noinst_DATA = $(dist_man_MANS) # Paths to in-tree libraries (use ul_ prefix to avoid possible collisions) # +# blkid ul_libblkid_srcdir = $(top_srcdir)/shlibs/blkid/src ul_libblkid_builddir = $(top_builddir)/shlibs/blkid/src ul_libblkid_la = $(top_builddir)/shlibs/blkid/src/libblkid.la @@ -23,3 +24,11 @@ ul_libblkid_la = $(top_builddir)/shlibs/blkid/src/libblkid.la $(ul_libblkid_la): $(MAKE) -C $(ul_libblkid_builddir) +# uuid +ul_libuuid_srcdir = $(top_srcdir)/shlibs/uuid/src +ul_libuuid_builddir = $(top_builddir)/shlibs/uuid/src +ul_libuuid_la = $(top_builddir)/shlibs/uuid/src/libuuid.la + +$(ul_libuuid_la): + $(MAKE) -C $(ul_libuuid_builddir) + diff --git a/configure.ac b/configure.ac index b174bce2..6c8d1408 100644 --- a/configure.ac +++ b/configure.ac @@ -84,9 +84,13 @@ AC_CHECK_HEADERS( linux/tiocl.h \ linux/version.h \ locale.h \ - stdlib.h \ + stdint.h \ + inttypes.h \ pty.h \ mntent.h \ + net/if.h \ + net/if_dl.h \ + netinet/in.h \ rpcsvc/nfs_prot.h \ scsi/scsi.h \ stdlib.h \ @@ -94,12 +98,18 @@ AC_CHECK_HEADERS( sys/disklabel.h \ sys/ioctl.h \ sys/io.h \ + sys/time.h \ sys/mkdev.h \ sys/prctl.h \ sys/queue.h \ + sys/sockio.h \ + sys/file.h \ + sys/ioctl.h \ sys/stat.h \ sys/types.h \ + sys/un.h \ sys/user.h \ + sys/resource.h \ unistd.h ]) AC_CHECK_HEADERS([linux/raw.h], [AM_CONDITIONAL([HAVE_RAW], [true])], @@ -119,12 +129,21 @@ AC_CHECK_FUNCS( llseek \ lseek64 \ strtoull \ + sysconf \ + getdtablesize \ + getrlimit \ + srandom \ inotify_init \ prctl \ __secure_getenv \ rpmatch]) AC_FUNC_FSEEKO +AC_CHECK_MEMBER(struct sockaddr.sa_len, + AC_DEFINE_UNQUOTED(HAVE_SA_LEN,1,[Define if struct sockaddr contains sa_len]),, + [#include + #include ]) + dnl Static compilation m4_define([UTIL_STATIC_PROGRAMS], [losetup, mount, umount, fdisk, sfdisk, blkid]) @@ -800,6 +819,10 @@ shlibs/blkid/blkid.pc shlibs/blkid/Makefile shlibs/blkid/src/Makefile shlibs/blkid/src/probers/Makefile +shlibs/uuid/uuid.pc +shlibs/uuid/Makefile +shlibs/uuid/man/Makefile +shlibs/uuid/src/Makefile shlibs/Makefile sys-utils/Makefile tests/commands.sh diff --git a/shlibs/Makefile.am b/shlibs/Makefile.am index e09828e6..8a848cb7 100644 --- a/shlibs/Makefile.am +++ b/shlibs/Makefile.am @@ -3,3 +3,5 @@ SUBDIRS = if BUILD_LIBBLKID SUBDIRS += blkid endif + +SUBDIRS += uuid diff --git a/shlibs/uuid/COPYING.libuuid b/shlibs/uuid/COPYING.libuuid new file mode 100644 index 00000000..2f170683 --- /dev/null +++ b/shlibs/uuid/COPYING.libuuid @@ -0,0 +1,25 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/shlibs/uuid/Makefile.am b/shlibs/uuid/Makefile.am new file mode 100644 index 00000000..dfa80070 --- /dev/null +++ b/shlibs/uuid/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/config/include-Makefile.am + +SUBDIRS = src man + +# pkg-config stuff +pkgconfigdir = $(usrlibexecdir)/pkgconfig +pkgconfig_DATA = uuid.pc + +EXTRA_DIST = README.uuid blkid.pc blkid.pc.in + diff --git a/shlibs/uuid/man/Makefile.am b/shlibs/uuid/man/Makefile.am new file mode 100644 index 00000000..1f926390 --- /dev/null +++ b/shlibs/uuid/man/Makefile.am @@ -0,0 +1,4 @@ +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 diff --git a/shlibs/uuid/man/uuid.3 b/shlibs/uuid/man/uuid.3 new file mode 100644 index 00000000..0f24e67f --- /dev/null +++ b/shlibs/uuid/man/uuid.3 @@ -0,0 +1,66 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid \- DCE compatible Universally Unique Identifier library +.SH SYNOPSIS +.B #include +.SH DESCRIPTION +The UUID library is used to generate unique identifiers for objects +that may be accessible beyond the local system. This library +generates UUIDs compatible with those created by the Open Software +Foundation (OSF) Distributed Computing Environment (DCE) utility +.BR uuidgen . +.sp +The UUIDs generated by this library can be reasonably expected to be +unique within a system, and unique across all systems. They could +be used, for instance, to generate unique HTTP cookies across multiple +web servers without communication between the servers, and without fear +of a name clash. +.SH "CONFORMING TO" +OSF DCE 1.1 +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +The UUID library is part of the e2fsprogs package and is available from +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_is_null (3), +.BR uuid_parse (3), +.BR uuid_time (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_clear.3 b/shlibs/uuid/man/uuid_clear.3 new file mode 100644 index 00000000..46507f08 --- /dev/null +++ b/shlibs/uuid/man/uuid_clear.3 @@ -0,0 +1,60 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_CLEAR 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_clear \- reset value of UUID variable to the NULL value +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "void uuid_clear(uuid_t " uu ); +.fi +.SH DESCRIPTION +The +.B uuid_clear +function sets the value of the supplied uuid variable +.I uu +to the NULL value. +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_is_null (3), +.BR uuid_parse (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_compare.3 b/shlibs/uuid/man/uuid_compare.3 new file mode 100644 index 00000000..ab6d8c80 --- /dev/null +++ b/shlibs/uuid/man/uuid_compare.3 @@ -0,0 +1,66 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_COMPARE 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_compare \- compare whether two UUIDs are the same +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "int uuid_compare(uuid_t " uu1 ", uuid_t " uu2) +.fi +.SH DESCRIPTION +The +.B uuid_compare +function compares the two supplied uuid variables +.IR uu1 " and " uu2 +to each other. +.SH RETURN VALUE +Returns an integer less than, equal to, or greater than zero if +.I uu1 +is found, respectively, to be lexigraphically less than, equal, or +greater than +.IR uu2 . +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_clear (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_is_null (3), +.BR uuid_parse (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_copy.3 b/shlibs/uuid/man/uuid_copy.3 new file mode 100644 index 00000000..2e2126c1 --- /dev/null +++ b/shlibs/uuid/man/uuid_copy.3 @@ -0,0 +1,62 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_COPY 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_copy \- copy a UUID value +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "void uuid_copy(uuid_t " dst ", uuid_t " src); +.fi +.SH DESCRIPTION +The +.B uuid_copy +function copies the UUID variable +.IR src " to " dst . +.SH RETURN VALUE +The copied UUID is returned in the location pointed to by +.IR dst . +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_generate (3), +.BR uuid_is_null (3), +.BR uuid_parse (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_generate.3 b/shlibs/uuid/man/uuid_generate.3 new file mode 100644 index 00000000..d36c1d0d --- /dev/null +++ b/shlibs/uuid/man/uuid_generate.3 @@ -0,0 +1,104 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_GENERATE 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_generate, uuid_generate_random, uuid_generate_time \- create a new unique UUID value +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "void uuid_generate(uuid_t " out ); +.BI "void uuid_generate_random(uuid_t " out ); +.BI "void uuid_generate_time(uuid_t " out ); +.fi +.SH DESCRIPTION +The +.B uuid_generate +function creates a new universally unique identifier (UUID). The uuid will +be generated based on high-quality randomness from +.IR /dev/urandom , +if available. If it is not available, then +.B uuid_generate +will use an alternative algorithm which uses the current time, the +local ethernet MAC address (if available), and random data generated +using a pseudo-random generator. +.sp +The +.B uuid_generate_random +function forces the use of the all-random UUID format, even if +a high-quality random number generator (i.e., +.IR /dev/urandom ) +is not available, in which case a pseudo-random +generator will be subsituted. Note that the use of a pseudo-random +generator may compromise the uniqueness of UUID's +generated in this fashion. +.sp +The +.B uuid_generate_time +function forces the use of the alternative algorithm which uses the +current time and the local ethernet MAC address (if available). +This algorithm used to be the default one used to generate UUID, but +because of the use of the ethernet MAC address, it can leak +information about when and where the UUID was generated. This can cause +privacy problems in some applications, so the +.B uuid_generate +function only uses this algorithm if a high-quality source of +randomness is not available. +.sp +The UUID is 16 bytes (128 bits) long, which gives approximately 3.4x10^38 +unique values (there are approximately 10^80 elemntary particles in +the universe according to Carl Sagan's +.IR Cosmos ). +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 newly created UUID is returned in the memory location pointed to by +.IR out . +.SH "CONFORMING TO" +OSF DCE 1.1 +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuidgen (1), +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_is_null (3), +.BR uuid_parse (3), +.BR uuid_time (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_is_null.3 b/shlibs/uuid/man/uuid_is_null.3 new file mode 100644 index 00000000..4e92eb05 --- /dev/null +++ b/shlibs/uuid/man/uuid_is_null.3 @@ -0,0 +1,62 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_IS_NULL 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_is_null \- compare the value of the UUID to the NULL value +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "int uuid_is_null(uuid_t " uu ); +.fi +.SH DESCRIPTION +The +.B uuid_is_null +function compares the value of the supplied UUID variable +.I uu +to the NULL value. If the value is equal to the NULL UUID, 1 is returned, +otherwise 0 is returned. +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_time (3), +.BR uuid_parse (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_parse.3 b/shlibs/uuid/man/uuid_parse.3 new file mode 100644 index 00000000..55fbddb8 --- /dev/null +++ b/shlibs/uuid/man/uuid_parse.3 @@ -0,0 +1,71 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_PARSE 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_parse \- convert an input UUID string into binary representation +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "int uuid_parse( char *" in ", uuid_t " uu ); +.fi +.SH DESCRIPTION +The +.B uuid_parse +function converts the UUID string given by +.I in +into the binary representation. The input UUID is a string of the form +1b4e28ba\-2fa1\-11d2\-883f\-b9a761bde3fb (in +.BR printf (3) +format "%08x\-%04x\-%04x\-%04x\-%012x", 36 bytes plus the trailing '\\0'). +.SH RETURN VALUE +Upon successfully parsing the input string, 0 is returned, and the UUID is +stored in the location pointed to by +.IR uu , +otherwise \-1 is returned. +.SH "CONFORMING TO" +OSF DCE 1.1 +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_is_null (3), +.BR uuid_time (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_time.3 b/shlibs/uuid/man/uuid_time.3 new file mode 100644 index 00000000..d2aa7b53 --- /dev/null +++ b/shlibs/uuid/man/uuid_time.3 @@ -0,0 +1,74 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_TIME 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_time \- extract the time at which the UUID was created +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "time_t uuid_time(uuid_t " uu ", struct timeval *" ret_tv ) +.fi +.SH DESCRIPTION +The +.B uuid_time +function extracts the time at which the supplied time-based UUID +.I uu +was created. Note that the UUID creation time is only encoded within +certain types of UUIDs. This function can only reasonably expect to +extract the creation time for UUIDs created with the +.BR uuid_generate_time (3) +function. It may or may not work with UUIDs created by other mechanisms. +.SH "RETURN VALUES" +The time at which the UUID was created, in seconds since January 1, 1970 GMT +(the epoch), is returned (see +.BR time "(2))." +The time at which the UUID was created, in seconds and microseconds since +the epoch, is also stored in the location pointed to by +.I ret_tv +(see +.BR gettimeofday "(2))." +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_is_null (3), +.BR uuid_parse (3), +.BR uuid_unparse (3) diff --git a/shlibs/uuid/man/uuid_unparse.3 b/shlibs/uuid/man/uuid_unparse.3 new file mode 100644 index 00000000..5a612ae5 --- /dev/null +++ b/shlibs/uuid/man/uuid_unparse.3 @@ -0,0 +1,79 @@ +.\" Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) +.\" +.\" %Begin-Header% +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, and the entire permission notice in its entirety, +.\" including the disclaimer of warranties. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +.\" WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGE. +.\" %End-Header% +.\" +.\" Created Wed Mar 10 17:42:12 1999, Andreas Dilger +.TH UUID_UNPARSE 3 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@" +.SH NAME +uuid_unparse \- convert an UUID from binary representation to a string +.SH SYNOPSIS +.nf +.B #include +.sp +.BI "void uuid_unparse(uuid_t " uu ", char *" out ); +.BI "void uuid_unparse_upper(uuid_t " uu ", char *" out ); +.BI "void uuid_unparse_lower(uuid_t " uu ", char *" out ); +.fi +.SH DESCRIPTION +The +.B uuid_unparse +function converts the supplied UUID +.I uu +from the binary representation into a 36\-byte string (plus tailing '\\0') +of the form 1b4e28ba\-2fa1\-11d2\-883f\-0016d3cca427 and stores this +value in the character string pointed to by +.IR out . +The case of the hex digits returned by +.B uuid_unparse +may be upper or lower case, and is +dependent on the system-dependent local default. +.PP +If the case of the +hex digits is important then the functions +.B uuid_unparse_upper +and +.B uuid_unparse_lower +may be used. +.SH "CONFORMING TO" +OSF DCE 1.1 +.SH AUTHOR +Theodore Y. Ts'o +.SH AVAILABILITY +.UR http://e2fsprogs.sourceforge.net/ +http://e2fsprogs.sourceforge.net/ +.UE +.SH "SEE ALSO" +.BR uuid (3), +.BR uuid_clear (3), +.BR uuid_compare (3), +.BR uuid_copy (3), +.BR uuid_generate (3), +.BR uuid_time (3), +.BR uuid_is_null (3), +.BR uuid_parse (3) diff --git a/shlibs/uuid/src/Makefile.am b/shlibs/uuid/src/Makefile.am new file mode 100644 index 00000000..cfbb004d --- /dev/null +++ b/shlibs/uuid/src/Makefile.am @@ -0,0 +1,31 @@ +include $(top_srcdir)/config/include-Makefile.am + +AM_CPPFLAGS += -I$(ul_libuuid_srcdir) + +noinst_PROGRAMS = tst_uuid +tst_uuid_LDADD = $(ul_libuuid_la) +tst_uuid_CFLAGS = -I$(ul_libuuid_srcdir) + +# includes +uuidincdir = $(includedir)/uuid +uuidinc_HEADERS = uuid.h + +lib_LTLIBRARIES = libuuid.la +libuuid_la_SOURCES = clear.c compare.c copy.c gen_uuid.c \ + isnull.c pack.c parse.c unpack.c unparse.c uuidd.h \ + uuid.h uuidP.h uuid_time.c $(uuidinc_HEADERS) + +libuuid_la_DEPENDENCIES = $(libuuid_la_LIBADD) uuid.sym + +libuuid_la_LDFLAGS = -Wl,--version-script=$(ul_libuuid_srcdir)/uuid.sym \ + -version-info 1:0:0 + +#tests = test_uuid_time + +EXTRA_DIST = uuid.sym gen_uuid_nt.c +CLEANFILES = $(tests) + +tests: all $(tests) +test_%: %.c + $(COMPILE) -DTEST_PROGRAM $< .libs/libuuid.a -o $@ + diff --git a/shlibs/uuid/src/clear.c b/shlibs/uuid/src/clear.c new file mode 100644 index 00000000..2d91fee9 --- /dev/null +++ b/shlibs/uuid/src/clear.c @@ -0,0 +1,43 @@ +/* + * clear.c -- Clear a UUID + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "string.h" + +#include "uuidP.h" + +void uuid_clear(uuid_t uu) +{ + memset(uu, 0, 16); +} + diff --git a/shlibs/uuid/src/compare.c b/shlibs/uuid/src/compare.c new file mode 100644 index 00000000..f28a7267 --- /dev/null +++ b/shlibs/uuid/src/compare.c @@ -0,0 +1,55 @@ +/* + * compare.c --- compare whether or not two UUID's are the same + * + * Returns 0 if the two UUID's are different, and 1 if they are the same. + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "uuidP.h" +#include + +#define UUCMP(u1,u2) if (u1 != u2) return((u1 < u2) ? -1 : 1); + +int uuid_compare(const uuid_t uu1, const uuid_t uu2) +{ + struct uuid uuid1, uuid2; + + uuid_unpack(uu1, &uuid1); + uuid_unpack(uu2, &uuid2); + + UUCMP(uuid1.time_low, uuid2.time_low); + UUCMP(uuid1.time_mid, uuid2.time_mid); + UUCMP(uuid1.time_hi_and_version, uuid2.time_hi_and_version); + UUCMP(uuid1.clock_seq, uuid2.clock_seq); + return memcmp(uuid1.node, uuid2.node, 6); +} + diff --git a/shlibs/uuid/src/copy.c b/shlibs/uuid/src/copy.c new file mode 100644 index 00000000..ead33aa2 --- /dev/null +++ b/shlibs/uuid/src/copy.c @@ -0,0 +1,45 @@ +/* + * copy.c --- copy UUIDs + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "uuidP.h" + +void uuid_copy(uuid_t dst, const uuid_t src) +{ + unsigned char *cp1; + const unsigned char *cp2; + int i; + + for (i=0, cp1 = dst, cp2 = src; i < 16; i++) + *cp1++ = *cp2++; +} diff --git a/shlibs/uuid/src/gen_uuid.c b/shlibs/uuid/src/gen_uuid.c new file mode 100644 index 00000000..ab73c43e --- /dev/null +++ b/shlibs/uuid/src/gen_uuid.c @@ -0,0 +1,656 @@ +/* + * gen_uuid.c --- generate a DCE-compatible uuid + * + * Copyright (C) 1996, 1997, 1998, 1999 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +/* + * Force inclusion of SVID stuff since we need it if we're compiling in + * gcc-wall wall mode + */ +#define _SVID_SOURCE + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#define UUID MYUUID +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include +#ifdef HAVE_SYS_FILE_H +#include +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif +#ifdef HAVE_NET_IF_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NET_IF_DL_H +#include +#endif +#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H) +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +#include "uuidP.h" +#include "uuidd.h" + +#ifdef HAVE_SRANDOM +#define srand(x) srandom(x) +#define rand() random() +#endif + +#ifdef TLS +#define THREAD_LOCAL static TLS +#else +#define THREAD_LOCAL static +#endif + +#if defined(__linux__) && defined(__NR_gettid) && defined(HAVE_JRAND48) +#define DO_JRAND_MIX +THREAD_LOCAL unsigned short jrand_seed[3]; +#endif + +#ifdef _WIN32 +static void gettimeofday (struct timeval *tv, void *dummy) +{ + FILETIME ftime; + uint64_t n; + + GetSystemTimeAsFileTime (&ftime); + n = (((uint64_t) ftime.dwHighDateTime << 32) + + (uint64_t) ftime.dwLowDateTime); + if (n) { + n /= 10; + n -= ((369 * 365 + 89) * (uint64_t) 86400) * 1000000; + } + + tv->tv_sec = n / 1000000; + tv->tv_usec = n % 1000000; +} + +static int getuid (void) +{ + return 1; +} +#endif + +static int get_random_fd(void) +{ + struct timeval tv; + static int fd = -2; + int i; + + if (fd == -2) { + gettimeofday(&tv, 0); +#ifndef _WIN32 + fd = open("/dev/urandom", O_RDONLY); + if (fd == -1) + fd = open("/dev/random", O_RDONLY | O_NONBLOCK); + if (fd >= 0) { + i = fcntl(fd, F_GETFD); + if (i >= 0) + fcntl(fd, F_SETFD, i | FD_CLOEXEC); + } +#endif + srand((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec); +#ifdef DO_JRAND_MIX + jrand_seed[0] = getpid() ^ (tv.tv_sec & 0xFFFF); + jrand_seed[1] = getppid() ^ (tv.tv_usec & 0xFFFF); + jrand_seed[2] = (tv.tv_sec ^ tv.tv_usec) >> 16; +#endif + } + /* Crank the random number generator a few times */ + gettimeofday(&tv, 0); + for (i = (tv.tv_sec ^ tv.tv_usec) & 0x1F; i > 0; i--) + rand(); + return fd; +} + + +/* + * Generate a series of random bytes. Use /dev/urandom if possible, + * and if not, use srandom/random. + */ +static void get_random_bytes(void *buf, int nbytes) +{ + int i, n = nbytes, fd = get_random_fd(); + int lose_counter = 0; + unsigned char *cp = (unsigned char *) buf; + unsigned short tmp_seed[3]; + + if (fd >= 0) { + while (n > 0) { + i = read(fd, cp, n); + if (i <= 0) { + if (lose_counter++ > 16) + break; + continue; + } + n -= i; + cp += i; + lose_counter = 0; + } + } + + /* + * We do this all the time, but this is the only source of + * randomness if /dev/random/urandom is out to lunch. + */ + for (cp = buf, i = 0; i < nbytes; i++) + *cp++ ^= (rand() >> 7) & 0xFF; +#ifdef DO_JRAND_MIX + memcpy(tmp_seed, jrand_seed, sizeof(tmp_seed)); + jrand_seed[2] = jrand_seed[2] ^ syscall(__NR_gettid); + for (cp = buf, i = 0; i < nbytes; i++) + *cp++ ^= (jrand48(tmp_seed) >> 7) & 0xFF; + memcpy(jrand_seed, tmp_seed, + sizeof(jrand_seed)-sizeof(unsigned short)); +#endif + + return; +} + +/* + * Get the ethernet hardware address, if we can find it... + * + * XXX for a windows version, probably should use GetAdaptersInfo: + * http://www.codeguru.com/cpp/i-n/network/networkinformation/article.php/c5451 + * commenting out get_node_id just to get gen_uuid to compile under windows + * is not the right way to go! + */ +static int get_node_id(unsigned char *node_id) +{ +#ifdef HAVE_NET_IF_H + int sd; + struct ifreq ifr, *ifrp; + struct ifconf ifc; + char buf[1024]; + int n, i; + unsigned char *a; +#ifdef HAVE_NET_IF_DL_H + struct sockaddr_dl *sdlp; +#endif + +/* + * BSD 4.4 defines the size of an ifreq to be + * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len + * However, under earlier systems, sa_len isn't present, so the size is + * just sizeof(struct ifreq) + */ +#ifdef HAVE_SA_LEN +#ifndef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#endif +#define ifreq_size(i) max(sizeof(struct ifreq),\ + sizeof((i).ifr_name)+(i).ifr_addr.sa_len) +#else +#define ifreq_size(i) sizeof(struct ifreq) +#endif /* HAVE_SA_LEN*/ + + sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sd < 0) { + return -1; + } + memset(buf, 0, sizeof(buf)); + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { + close(sd); + return -1; + } + n = ifc.ifc_len; + for (i = 0; i < n; i+= ifreq_size(*ifrp) ) { + ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); + strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); +#ifdef SIOCGIFHWADDR + if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) + continue; + a = (unsigned char *) &ifr.ifr_hwaddr.sa_data; +#else +#ifdef SIOCGENADDR + if (ioctl(sd, SIOCGENADDR, &ifr) < 0) + continue; + a = (unsigned char *) ifr.ifr_enaddr; +#else +#ifdef HAVE_NET_IF_DL_H + sdlp = (struct sockaddr_dl *) &ifrp->ifr_addr; + if ((sdlp->sdl_family != AF_LINK) || (sdlp->sdl_alen != 6)) + continue; + a = (unsigned char *) &sdlp->sdl_data[sdlp->sdl_nlen]; +#else + /* + * XXX we don't have a way of getting the hardware + * address + */ + close(sd); + return 0; +#endif /* HAVE_NET_IF_DL_H */ +#endif /* SIOCGENADDR */ +#endif /* SIOCGIFHWADDR */ + if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) + continue; + if (node_id) { + memcpy(node_id, a, 6); + close(sd); + return 1; + } + } + close(sd); +#endif + return 0; +} + +/* Assume that the gettimeofday() has microsecond granularity */ +#define MAX_ADJUSTMENT 10 + +static int get_clock(uint32_t *clock_high, uint32_t *clock_low, + uint16_t *ret_clock_seq, int *num) +{ + THREAD_LOCAL int adjustment = 0; + THREAD_LOCAL struct timeval last = {0, 0}; + THREAD_LOCAL int state_fd = -2; + THREAD_LOCAL FILE *state_f; + THREAD_LOCAL uint16_t clock_seq; + struct timeval tv; + struct flock fl; + uint64_t clock_reg; + mode_t save_umask; + int len; + + if (state_fd == -2) { + save_umask = umask(0); + state_fd = open("/var/lib/libuuid/clock.txt", + O_RDWR|O_CREAT, 0660); + (void) umask(save_umask); + state_f = fdopen(state_fd, "r+"); + if (!state_f) { + close(state_fd); + state_fd = -1; + } + } + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_pid = 0; + if (state_fd >= 0) { + rewind(state_f); + while (fcntl(state_fd, F_SETLKW, &fl) < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + fclose(state_f); + close(state_fd); + state_fd = -1; + break; + } + } + if (state_fd >= 0) { + unsigned int cl; + unsigned long tv1, tv2; + int a; + + if (fscanf(state_f, "clock: %04x tv: %lu %lu adj: %d\n", + &cl, &tv1, &tv2, &a) == 4) { + clock_seq = cl & 0x3FFF; + last.tv_sec = tv1; + last.tv_usec = tv2; + adjustment = a; + } + } + + if ((last.tv_sec == 0) && (last.tv_usec == 0)) { + get_random_bytes(&clock_seq, sizeof(clock_seq)); + clock_seq &= 0x3FFF; + gettimeofday(&last, 0); + last.tv_sec--; + } + +try_again: + gettimeofday(&tv, 0); + if ((tv.tv_sec < last.tv_sec) || + ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec < last.tv_usec))) { + clock_seq = (clock_seq+1) & 0x3FFF; + adjustment = 0; + last = tv; + } else if ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec == last.tv_usec)) { + if (adjustment >= MAX_ADJUSTMENT) + goto try_again; + adjustment++; + } else { + adjustment = 0; + last = tv; + } + + clock_reg = tv.tv_usec*10 + adjustment; + clock_reg += ((uint64_t) tv.tv_sec)*10000000; + clock_reg += (((uint64_t) 0x01B21DD2) << 32) + 0x13814000; + + if (num && (*num > 1)) { + adjustment += *num - 1; + last.tv_usec += adjustment / 10; + adjustment = adjustment % 10; + last.tv_sec += last.tv_usec / 1000000; + last.tv_usec = last.tv_usec % 1000000; + } + + if (state_fd > 0) { + rewind(state_f); + len = fprintf(state_f, + "clock: %04x tv: %016lu %08lu adj: %08d\n", + clock_seq, last.tv_sec, last.tv_usec, adjustment); + fflush(state_f); + if (ftruncate(state_fd, len) < 0) { + fprintf(state_f, " \n"); + fflush(state_f); + } + rewind(state_f); + fl.l_type = F_UNLCK; + fcntl(state_fd, F_SETLK, &fl); + } + + *clock_high = clock_reg >> 32; + *clock_low = clock_reg; + *ret_clock_seq = clock_seq; + return 0; +} + +static ssize_t read_all(int fd, char *buf, size_t count) +{ + ssize_t ret; + ssize_t c = 0; + + memset(buf, 0, count); + while (count > 0) { + ret = read(fd, buf, count); + if (ret < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + return -1; + } + count -= ret; + buf += ret; + c += ret; + } + return c; +} + +/* + * Close all file descriptors + */ +static void close_all_fds(void) +{ + int i, max; + +#if defined(HAVE_SYSCONF) && defined(_SC_OPEN_MAX) + max = sysconf(_SC_OPEN_MAX); +#elif defined(HAVE_GETDTABLESIZE) + max = getdtablesize(); +#elif defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE) + struct rlimit rl; + + getrlimit(RLIMIT_NOFILE, &rl); + max = rl.rlim_cur; +#else + max = OPEN_MAX; +#endif + + for (i=0; i < max; i++) + close(i); +} + + +/* + * Try using the uuidd daemon to generate the UUID + * + * Returns 0 on success, non-zero on failure. + */ +static int get_uuid_via_daemon(int op, uuid_t out, int *num) +{ +#if defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) + char op_buf[64]; + int op_len; + int s; + ssize_t ret; + int32_t reply_len = 0, expected = 16; + struct sockaddr_un srv_addr; + pid_t pid; + static const char *uuidd_path = UUIDD_PATH; + static int access_ret = -2; + static int start_attempts = 0; + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + return -1; + + srv_addr.sun_family = AF_UNIX; + strcpy(srv_addr.sun_path, UUIDD_SOCKET_PATH); + + if (connect(s, (const struct sockaddr *) &srv_addr, + sizeof(struct sockaddr_un)) < 0) { + if (access_ret == -2) + access_ret = access(uuidd_path, X_OK); + if (access_ret == 0 && start_attempts++ < 5) { + if ((pid = fork()) == 0) { + close_all_fds(); + execl(uuidd_path, "uuidd", "-qT", "300", + (char *) NULL); + exit(1); + } + (void) waitpid(pid, 0, 0); + if (connect(s, (const struct sockaddr *) &srv_addr, + sizeof(struct sockaddr_un)) < 0) + goto fail; + } else + goto fail; + } + op_buf[0] = op; + op_len = 1; + if (op == UUIDD_OP_BULK_TIME_UUID) { + memcpy(op_buf+1, num, sizeof(*num)); + op_len += sizeof(*num); + expected += sizeof(*num); + } + + ret = write(s, op_buf, op_len); + if (ret < 1) + goto fail; + + ret = read_all(s, (char *) &reply_len, sizeof(reply_len)); + if (ret < 0) + goto fail; + + if (reply_len != expected) + goto fail; + + ret = read_all(s, op_buf, reply_len); + + if (op == UUIDD_OP_BULK_TIME_UUID) + memcpy(op_buf+16, num, sizeof(int)); + + memcpy(out, op_buf, 16); + + close(s); + return ((ret == expected) ? 0 : -1); + +fail: + close(s); +#endif + return -1; +} + +void uuid__generate_time(uuid_t out, int *num) +{ + static unsigned char node_id[6]; + static int has_init = 0; + struct uuid uu; + uint32_t clock_mid; + + if (!has_init) { + if (get_node_id(node_id) <= 0) { + get_random_bytes(node_id, 6); + /* + * Set multicast bit, to prevent conflicts + * with IEEE 802 addresses obtained from + * network cards + */ + node_id[0] |= 0x01; + } + has_init = 1; + } + get_clock(&clock_mid, &uu.time_low, &uu.clock_seq, num); + uu.clock_seq |= 0x8000; + uu.time_mid = (uint16_t) clock_mid; + uu.time_hi_and_version = ((clock_mid >> 16) & 0x0FFF) | 0x1000; + memcpy(uu.node, node_id, 6); + uuid_pack(&uu, out); +} + +void uuid_generate_time(uuid_t out) +{ +#ifdef TLS + THREAD_LOCAL int num = 0; + THREAD_LOCAL struct uuid uu; + THREAD_LOCAL time_t last_time = 0; + time_t now; + + if (num > 0) { + now = time(0); + if (now > last_time+1) + num = 0; + } + if (num <= 0) { + num = 1000; + if (get_uuid_via_daemon(UUIDD_OP_BULK_TIME_UUID, + out, &num) == 0) { + last_time = time(0); + uuid_unpack(out, &uu); + num--; + return; + } + num = 0; + } + if (num > 0) { + uu.time_low++; + if (uu.time_low == 0) { + uu.time_mid++; + if (uu.time_mid == 0) + uu.time_hi_and_version++; + } + num--; + uuid_pack(&uu, out); + return; + } +#else + if (get_uuid_via_daemon(UUIDD_OP_TIME_UUID, out, 0) == 0) + return; +#endif + + uuid__generate_time(out, 0); +} + + +void uuid__generate_random(uuid_t out, int *num) +{ + uuid_t buf; + struct uuid uu; + int i, n; + + if (!num || !*num) + n = 1; + else + n = *num; + + for (i = 0; i < n; i++) { + get_random_bytes(buf, sizeof(buf)); + uuid_unpack(buf, &uu); + + uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) + | 0x4000; + uuid_pack(&uu, out); + out += sizeof(uuid_t); + } +} + +void uuid_generate_random(uuid_t out) +{ + int num = 1; + /* No real reason to use the daemon for random uuid's -- yet */ + + uuid__generate_random(out, &num); +} + + +/* + * This is the generic front-end to uuid_generate_random and + * uuid_generate_time. It uses uuid_generate_random only if + * /dev/urandom is available, since otherwise we won't have + * high-quality randomness. + */ +void uuid_generate(uuid_t out) +{ + if (get_random_fd() >= 0) + uuid_generate_random(out); + else + uuid_generate_time(out); +} diff --git a/shlibs/uuid/src/gen_uuid_nt.c b/shlibs/uuid/src/gen_uuid_nt.c new file mode 100644 index 00000000..aa44bfd3 --- /dev/null +++ b/shlibs/uuid/src/gen_uuid_nt.c @@ -0,0 +1,92 @@ +/* + * gen_uuid_nt.c -- Use NT api to generate uuid + * + * Written by Andrey Shedel (andreys@ns.cr.cyco.com) + */ + + +#include "uuidP.h" + +#pragma warning(push,4) + +#pragma comment(lib, "ntdll.lib") + +// +// Here is a nice example why it's not a good idea +// to use native API in ordinary applications. +// Number of parameters in function below was changed from 3 to 4 +// for NT5. +// +// +// NTSYSAPI +// NTSTATUS +// NTAPI +// NtAllocateUuids( +// OUT PULONG p1, +// OUT PULONG p2, +// OUT PULONG p3, +// OUT PUCHAR Seed // 6 bytes +// ); +// +// + +unsigned long +__stdcall +NtAllocateUuids( + void* p1, // 8 bytes + void* p2, // 4 bytes + void* p3 // 4 bytes + ); + +typedef +unsigned long +(__stdcall* +NtAllocateUuids_2000)( + void* p1, // 8 bytes + void* p2, // 4 bytes + void* p3, // 4 bytes + void* seed // 6 bytes + ); + + + +// +// Nice, but instead of including ntddk.h ot winnt.h +// I should define it here because they MISSED __stdcall in those headers. +// + +__declspec(dllimport) +struct _TEB* +__stdcall +NtCurrentTeb(void); + + +// +// The only way to get version information from the system is to examine +// one stored in PEB. But it's pretty dangerouse because this value could +// be altered in image header. +// + +static +int +Nt5(void) +{ + //return NtCuttentTeb()->Peb->OSMajorVersion >= 5; + return (int)*(int*)((char*)(int)(*(int*)((char*)NtCurrentTeb() + 0x30)) + 0xA4) >= 5; +} + + + + +void uuid_generate(uuid_t out) +{ + if(Nt5()) + { + unsigned char seed[6]; + ((NtAllocateUuids_2000)NtAllocateUuids)(out, ((char*)out)+8, ((char*)out)+12, &seed[0] ); + } + else + { + NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12); + } +} diff --git a/shlibs/uuid/src/isnull.c b/shlibs/uuid/src/isnull.c new file mode 100644 index 00000000..931e7e7d --- /dev/null +++ b/shlibs/uuid/src/isnull.c @@ -0,0 +1,48 @@ +/* + * isnull.c --- Check whether or not the UUID is null + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "uuidP.h" + +/* Returns 1 if the uuid is the NULL uuid */ +int uuid_is_null(const uuid_t uu) +{ + const unsigned char *cp; + int i; + + for (i=0, cp = uu; i < 16; i++) + if (*cp++) + return 0; + return 1; +} + diff --git a/shlibs/uuid/src/pack.c b/shlibs/uuid/src/pack.c new file mode 100644 index 00000000..097516d2 --- /dev/null +++ b/shlibs/uuid/src/pack.c @@ -0,0 +1,69 @@ +/* + * Internal routine for packing UUID's + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include "uuidP.h" + +void uuid_pack(const struct uuid *uu, uuid_t ptr) +{ + uint32_t tmp; + unsigned char *out = ptr; + + tmp = uu->time_low; + out[3] = (unsigned char) tmp; + tmp >>= 8; + out[2] = (unsigned char) tmp; + tmp >>= 8; + out[1] = (unsigned char) tmp; + tmp >>= 8; + out[0] = (unsigned char) tmp; + + tmp = uu->time_mid; + out[5] = (unsigned char) tmp; + tmp >>= 8; + out[4] = (unsigned char) tmp; + + tmp = uu->time_hi_and_version; + out[7] = (unsigned char) tmp; + tmp >>= 8; + out[6] = (unsigned char) tmp; + + tmp = uu->clock_seq; + out[9] = (unsigned char) tmp; + tmp >>= 8; + out[8] = (unsigned char) tmp; + + memcpy(out+10, uu->node, 6); +} + diff --git a/shlibs/uuid/src/parse.c b/shlibs/uuid/src/parse.c new file mode 100644 index 00000000..074383ef --- /dev/null +++ b/shlibs/uuid/src/parse.c @@ -0,0 +1,79 @@ +/* + * parse.c --- UUID parsing + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include +#include +#include + +#include "uuidP.h" + +int uuid_parse(const char *in, uuid_t uu) +{ + struct uuid uuid; + int i; + const char *cp; + char buf[3]; + + if (strlen(in) != 36) + return -1; + for (i=0, cp = in; i <= 36; i++,cp++) { + if ((i == 8) || (i == 13) || (i == 18) || + (i == 23)) { + if (*cp == '-') + continue; + else + return -1; + } + if (i== 36) + if (*cp == 0) + continue; + if (!isxdigit(*cp)) + return -1; + } + uuid.time_low = strtoul(in, NULL, 16); + uuid.time_mid = strtoul(in+9, NULL, 16); + uuid.time_hi_and_version = strtoul(in+14, NULL, 16); + uuid.clock_seq = strtoul(in+19, NULL, 16); + cp = in+24; + buf[2] = 0; + for (i=0; i < 6; i++) { + buf[0] = *cp++; + buf[1] = *cp++; + uuid.node[i] = strtoul(buf, NULL, 16); + } + + uuid_pack(&uuid, uu); + return 0; +} diff --git a/shlibs/uuid/src/tst_uuid.c b/shlibs/uuid/src/tst_uuid.c new file mode 100644 index 00000000..e03138f7 --- /dev/null +++ b/shlibs/uuid/src/tst_uuid.c @@ -0,0 +1,180 @@ +/* + * tst_uuid.c --- test program from the UUID library + * + * Copyright (C) 1996, 1997, 1998 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#define UUID MYUUID +#endif + +#include +#include + +#include "uuid.h" + +static int test_uuid(const char * uuid, int isValid) +{ + static const char * validStr[2] = {"invalid", "valid"}; + uuid_t uuidBits; + int parsedOk; + + parsedOk = uuid_parse(uuid, uuidBits) == 0; + + printf("%s is %s", uuid, validStr[isValid]); + if (parsedOk != isValid) { + printf(" but uuid_parse says %s\n", validStr[parsedOk]); + return 1; + } + printf(", OK\n"); + return 0; +} + +#ifdef __GNUC__ +#define ATTR(x) __attribute__(x) +#else +#define ATTR(x) +#endif + +int +main(int argc ATTR((unused)) , char **argv ATTR((unused))) +{ + uuid_t buf, tst; + char str[100]; + struct timeval tv; + time_t time_reg; + unsigned char *cp; + int i; + int failed = 0; + int type, variant; + + uuid_generate(buf); + uuid_unparse(buf, str); + printf("UUID generate = %s\n", str); + printf("UUID: "); + for (i=0, cp = (unsigned char *) &buf; i < 16; i++) { + printf("%02x", *cp++); + } + printf("\n"); + type = uuid_type(buf); variant = uuid_variant(buf); + printf("UUID type = %d, UUID variant = %d\n", type, variant); + if (variant != UUID_VARIANT_DCE) { + printf("Incorrect UUID Variant; was expecting DCE!\n"); + failed++; + } + printf("\n"); + + uuid_generate_random(buf); + uuid_unparse(buf, str); + printf("UUID random string = %s\n", str); + printf("UUID: "); + for (i=0, cp = (unsigned char *) &buf; i < 16; i++) { + printf("%02x", *cp++); + } + printf("\n"); + type = uuid_type(buf); variant = uuid_variant(buf); + printf("UUID type = %d, UUID variant = %d\n", type, variant); + if (variant != UUID_VARIANT_DCE) { + printf("Incorrect UUID Variant; was expecting DCE!\n"); + failed++; + } + if (type != 4) { + printf("Incorrect UUID type; was expecting " + "4 (random type)!\n"); + failed++; + } + printf("\n"); + + uuid_generate_time(buf); + uuid_unparse(buf, str); + printf("UUID string = %s\n", str); + printf("UUID time: "); + for (i=0, cp = (unsigned char *) &buf; i < 16; i++) { + printf("%02x", *cp++); + } + printf("\n"); + type = uuid_type(buf); variant = uuid_variant(buf); + printf("UUID type = %d, UUID variant = %d\n", type, variant); + if (variant != UUID_VARIANT_DCE) { + printf("Incorrect UUID Variant; was expecting DCE!\n"); + failed++; + } + if (type != 1) { + printf("Incorrect UUID type; was expecting " + "1 (time-based type)!\\n"); + failed++; + } + tv.tv_sec = 0; + tv.tv_usec = 0; + time_reg = uuid_time(buf, &tv); + printf("UUID time is: (%ld, %ld): %s\n", tv.tv_sec, tv.tv_usec, + ctime(&time_reg)); + uuid_parse(str, tst); + if (!uuid_compare(buf, tst)) + printf("UUID parse and compare succeeded.\n"); + else { + printf("UUID parse and compare failed!\n"); + failed++; + } + uuid_clear(tst); + if (uuid_is_null(tst)) + printf("UUID clear and is null succeeded.\n"); + else { + printf("UUID clear and is null failed!\n"); + failed++; + } + uuid_copy(buf, tst); + if (!uuid_compare(buf, tst)) + printf("UUID copy and compare succeeded.\n"); + else { + printf("UUID copy and compare failed!\n"); + failed++; + } + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981b", 1); + failed += test_uuid("84949CC5-4701-4A84-895B-354C584A981B", 1); + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981bc", 0); + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981", 0); + failed += test_uuid("84949cc5x4701-4a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc504701-4a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc5-470104a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc5-4701-4a840895b-354c584a981b", 0); + failed += test_uuid("84949cc5-4701-4a84-895b0354c584a981b", 0); + failed += test_uuid("g4949cc5-4701-4a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981g", 0); + + if (failed) { + printf("%d failures.\n", failed); + exit(1); + } + return 0; +} diff --git a/shlibs/uuid/src/unpack.c b/shlibs/uuid/src/unpack.c new file mode 100644 index 00000000..beaaff3c --- /dev/null +++ b/shlibs/uuid/src/unpack.c @@ -0,0 +1,63 @@ +/* + * Internal routine for unpacking UUID + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include "uuidP.h" + +void uuid_unpack(const uuid_t in, struct uuid *uu) +{ + const uint8_t *ptr = in; + uint32_t tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_low = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_mid = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_hi_and_version = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->clock_seq = tmp; + + memcpy(uu->node, ptr, 6); +} + diff --git a/shlibs/uuid/src/unparse.c b/shlibs/uuid/src/unparse.c new file mode 100644 index 00000000..a95bbb04 --- /dev/null +++ b/shlibs/uuid/src/unparse.c @@ -0,0 +1,76 @@ +/* + * unparse.c -- convert a UUID to string + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include + +#include "uuidP.h" + +static const char *fmt_lower = + "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"; + +static const char *fmt_upper = + "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"; + +#ifdef UUID_UNPARSE_DEFAULT_UPPER +#define FMT_DEFAULT fmt_upper +#else +#define FMT_DEFAULT fmt_lower +#endif + +static void uuid_unparse_x(const uuid_t uu, char *out, const char *fmt) +{ + struct uuid uuid; + + uuid_unpack(uu, &uuid); + sprintf(out, fmt, + uuid.time_low, uuid.time_mid, uuid.time_hi_and_version, + uuid.clock_seq >> 8, uuid.clock_seq & 0xFF, + uuid.node[0], uuid.node[1], uuid.node[2], + uuid.node[3], uuid.node[4], uuid.node[5]); +} + +void uuid_unparse_lower(const uuid_t uu, char *out) +{ + uuid_unparse_x(uu, out, fmt_lower); +} + +void uuid_unparse_upper(const uuid_t uu, char *out) +{ + uuid_unparse_x(uu, out, fmt_upper); +} + +void uuid_unparse(const uuid_t uu, char *out) +{ + uuid_unparse_x(uu, out, FMT_DEFAULT); +} diff --git a/shlibs/uuid/src/uuid.h b/shlibs/uuid/src/uuid.h new file mode 100644 index 00000000..e329bf7a --- /dev/null +++ b/shlibs/uuid/src/uuid.h @@ -0,0 +1,103 @@ +/* + * Public include file for the UUID library + * + * Copyright (C) 1996, 1997, 1998 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifndef _UUID_UUID_H +#define _UUID_UUID_H + +#include +#ifndef _WIN32 +#include +#endif +#include + +typedef unsigned char uuid_t[16]; + +/* UUID Variant definitions */ +#define UUID_VARIANT_NCS 0 +#define UUID_VARIANT_DCE 1 +#define UUID_VARIANT_MICROSOFT 2 +#define UUID_VARIANT_OTHER 3 + +/* UUID Type definitions */ +#define UUID_TYPE_DCE_TIME 1 +#define UUID_TYPE_DCE_RANDOM 4 + +/* Allow UUID constants to be defined */ +#ifdef __GNUC__ +#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \ + static const uuid_t name __attribute__ ((unused)) = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15} +#else +#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \ + static const uuid_t name = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* clear.c */ +void uuid_clear(uuid_t uu); + +/* compare.c */ +int uuid_compare(const uuid_t uu1, const uuid_t uu2); + +/* copy.c */ +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); + +/* isnull.c */ +int uuid_is_null(const uuid_t uu); + +/* parse.c */ +int uuid_parse(const char *in, uuid_t uu); + +/* unparse.c */ +void uuid_unparse(const uuid_t uu, char *out); +void uuid_unparse_lower(const uuid_t uu, char *out); +void uuid_unparse_upper(const uuid_t uu, char *out); + +/* uuid_time.c */ +time_t uuid_time(const uuid_t uu, struct timeval *ret_tv); +int uuid_type(const uuid_t uu); +int uuid_variant(const uuid_t uu); + +#ifdef __cplusplus +} +#endif + +#endif /* _UUID_UUID_H */ diff --git a/shlibs/uuid/src/uuid.sym b/shlibs/uuid/src/uuid.sym new file mode 100644 index 00000000..591319aa --- /dev/null +++ b/shlibs/uuid/src/uuid.sym @@ -0,0 +1,27 @@ +/* + * The symbol versioning ensures that a new application requiring symbol foo() + * can't run with old libblkid.so not providing foo() - the global SONAME + * version info can't enforce this since we never change the SONAME. + * + * The original libuuid from e2fsprogs (<=1.41.5) does not to use + * symbol versioning -- all the original symbols are in UUID_1.0 now. + */ +UUID_1.0 { +global: + uuid_clear; + uuid_compare; + uuid_copy; + uuid_generate; + uuid_generate_random; + uuid_generate_time; + uuid_is_null; + uuid_parse; + uuid_unparse; + uuid_unparse_lower; + uuid_unparse_upper; + uuid_time; + uuid_type; + uuid_variant; +local: + *; +}; diff --git a/shlibs/uuid/src/uuidP.h b/shlibs/uuid/src/uuidP.h new file mode 100644 index 00000000..9d30ce2f --- /dev/null +++ b/shlibs/uuid/src/uuidP.h @@ -0,0 +1,59 @@ +/* + * uuid.h -- private header file for uuids + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include + +#include "uuid.h" + +/* + * Offset between 15-Oct-1582 and 1-Jan-70 + */ +#define TIME_OFFSET_HIGH 0x01B21DD2 +#define TIME_OFFSET_LOW 0x13814000 + +struct uuid { + uint32_t time_low; + uint16_t time_mid; + uint16_t time_hi_and_version; + uint16_t clock_seq; + uint8_t node[6]; +}; + + +/* + * prototypes + */ +void uuid_pack(const struct uuid *uu, uuid_t ptr); +void uuid_unpack(const uuid_t in, struct uuid *uu); diff --git a/shlibs/uuid/src/uuid_time.c b/shlibs/uuid/src/uuid_time.c new file mode 100644 index 00000000..f25f5c90 --- /dev/null +++ b/shlibs/uuid/src/uuid_time.c @@ -0,0 +1,171 @@ +/* + * uuid_time.c --- Interpret the time field from a uuid. This program + * violates the UUID abstraction barrier by reaching into the guts + * of a UUID and interpreting it. + * + * Copyright (C) 1998, 1999 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#define UUID MYUUID +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include + +#include "uuidP.h" + +time_t uuid_time(const uuid_t uu, struct timeval *ret_tv) +{ + struct timeval tv; + struct uuid uuid; + uint32_t high; + uint64_t clock_reg; + + uuid_unpack(uu, &uuid); + + high = uuid.time_mid | ((uuid.time_hi_and_version & 0xFFF) << 16); + clock_reg = uuid.time_low | ((uint64_t) high << 32); + + clock_reg -= (((uint64_t) 0x01B21DD2) << 32) + 0x13814000; + tv.tv_sec = clock_reg / 10000000; + tv.tv_usec = (clock_reg % 10000000) / 10; + + if (ret_tv) + *ret_tv = tv; + + return tv.tv_sec; +} + +int uuid_type(const uuid_t uu) +{ + struct uuid uuid; + + uuid_unpack(uu, &uuid); + return ((uuid.time_hi_and_version >> 12) & 0xF); +} + +int uuid_variant(const uuid_t uu) +{ + struct uuid uuid; + int var; + + uuid_unpack(uu, &uuid); + var = uuid.clock_seq; + + if ((var & 0x8000) == 0) + return UUID_VARIANT_NCS; + if ((var & 0x4000) == 0) + return UUID_VARIANT_DCE; + if ((var & 0x2000) == 0) + return UUID_VARIANT_MICROSOFT; + return UUID_VARIANT_OTHER; +} + +#ifdef DEBUG +static const char *variant_string(int variant) +{ + switch (variant) { + case UUID_VARIANT_NCS: + return "NCS"; + case UUID_VARIANT_DCE: + return "DCE"; + case UUID_VARIANT_MICROSOFT: + return "Microsoft"; + default: + return "Other"; + } +} + + +int +main(int argc, char **argv) +{ + uuid_t buf; + time_t time_reg; + struct timeval tv; + int type, variant; + + if (argc != 2) { + fprintf(stderr, "Usage: %s uuid\n", argv[0]); + exit(1); + } + if (uuid_parse(argv[1], buf)) { + fprintf(stderr, "Invalid UUID: %s\n", argv[1]); + exit(1); + } + variant = uuid_variant(buf); + type = uuid_type(buf); + time_reg = uuid_time(buf, &tv); + + printf("UUID variant is %d (%s)\n", variant, variant_string(variant)); + if (variant != UUID_VARIANT_DCE) { + printf("Warning: This program only knows how to interpret " + "DCE UUIDs.\n\tThe rest of the output is likely " + "to be incorrect!!\n"); + } + printf("UUID type is %d", type); + switch (type) { + case 1: + printf(" (time based)\n"); + break; + case 2: + printf(" (DCE)\n"); + break; + case 3: + printf(" (name-based)\n"); + break; + case 4: + printf(" (random)\n"); + break; + default: + printf("\n"); + } + if (type != 1) { + printf("Warning: not a time-based UUID, so UUID time " + "decoding will likely not work!\n"); + } + printf("UUID time is: (%ld, %ld): %s\n", tv.tv_sec, tv.tv_usec, + ctime(&time_reg)); + + return 0; +} +#endif diff --git a/shlibs/uuid/src/uuidd.h b/shlibs/uuid/src/uuidd.h new file mode 100644 index 00000000..528acdc9 --- /dev/null +++ b/shlibs/uuid/src/uuidd.h @@ -0,0 +1,53 @@ +/* + * Definitions used by the uuidd daemon + * + * Copyright (C) 2007 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifndef _UUID_UUIDD_H +#define _UUID_UUIDD_H + +#define UUIDD_SOCKET_PATH "/var/lib/libuuid/request" +#define UUIDD_PIDFILE_PATH "/var/lib/libuuid/uuidd.pid" +#define UUIDD_PATH "/usr/sbin/uuidd" + +#define UUIDD_OP_GETPID 0 +#define UUIDD_OP_GET_MAXOP 1 +#define UUIDD_OP_TIME_UUID 2 +#define UUIDD_OP_RANDOM_UUID 3 +#define UUIDD_OP_BULK_TIME_UUID 4 +#define UUIDD_OP_BULK_RANDOM_UUID 5 +#define UUIDD_MAX_OP UUIDD_OP_BULK_RANDOM_UUID + +extern void uuid__generate_time(uuid_t out, int *num); +extern void uuid__generate_random(uuid_t out, int *num); + +#endif /* _UUID_UUID_H */ diff --git a/shlibs/uuid/uuid.pc.in b/shlibs/uuid/uuid.pc.in new file mode 100644 index 00000000..8e4e6c5f --- /dev/null +++ b/shlibs/uuid/uuid.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: uuid +Description: Universally unique id library +Version: @E2FSPROGS_VERSION@ +Requires: +Cflags: -I${includedir}/uuid +Libs: -L${libdir} -luuid -- cgit v1.2.3 From f6076f557ef9385748db05ccadd4c3eb5a4d460c Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Sat, 16 May 2009 01:26:35 +0200 Subject: libuuid: add --disable-libuuid and LIBUUID_VERSION Signed-off-by: Karel Zak --- configure.ac | 13 ++++++++++++- shlibs/Makefile.am | 6 ++++-- shlibs/uuid/uuid.pc.in | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 6c8d1408..70b89c4a 100644 --- a/configure.ac +++ b/configure.ac @@ -21,6 +21,9 @@ dnl libblkid version LIBBLKID_VERSION="$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_RELEASE" LIBBLKID_DATE="10-Feb-2009" +dnl libuuid version +LIBUUID_VERSION="$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_RELEASE" + # Check whether exec_prefix=/usr: case $exec_prefix:$prefix in NONE:NONE | NONE:/usr | /usr:*) @@ -242,7 +245,7 @@ AC_ARG_ENABLE([mount], [], enable_mount=check ) build_mount=yes -if test "${enable_mount}" = "no"; then +if test "x$enable_mount" = xno; then build_mount=no elif test "x$linux_os" = xyes; then if test "x$have_blkid" = xno && test "x$have_volume_id" = xno; then @@ -255,6 +258,14 @@ fi AM_CONDITIONAL(BUILD_MOUNT, test "x$build_mount" = xyes) +AC_ARG_ENABLE([libuuid], + AS_HELP_STRING([--disable-libuuid], [do not build libuuid and uuid utilities]), + [], enable_libuuid=yes +) +AC_SUBST(LIBUUID_VERSION) +AM_CONDITIONAL(BUILD_LIBUUID, test "x$enable_libuuid" = xyes) + + AC_ARG_ENABLE([fsck], AS_HELP_STRING([--enable-fsck], [do build fsck]), [], enable_fsck=no diff --git a/shlibs/Makefile.am b/shlibs/Makefile.am index 8a848cb7..3e757885 100644 --- a/shlibs/Makefile.am +++ b/shlibs/Makefile.am @@ -1,7 +1,9 @@ SUBDIRS = +if BUILD_LIBUUID +SUBDIRS += uuid +endif + if BUILD_LIBBLKID SUBDIRS += blkid endif - -SUBDIRS += uuid diff --git a/shlibs/uuid/uuid.pc.in b/shlibs/uuid/uuid.pc.in index 8e4e6c5f..52edee2f 100644 --- a/shlibs/uuid/uuid.pc.in +++ b/shlibs/uuid/uuid.pc.in @@ -5,7 +5,7 @@ includedir=@includedir@ Name: uuid Description: Universally unique id library -Version: @E2FSPROGS_VERSION@ +Version: @LIBUUID_VERSION@ Requires: Cflags: -I${includedir}/uuid Libs: -L${libdir} -luuid -- cgit v1.2.3 From 6fed18f2909590c40227c3e14e8e82d129147607 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 18 May 2009 09:35:32 +0200 Subject: build-sys: add UTIL_{SET,RESTORE}_FLAGS Signed-off-by: Karel Zak --- configure.ac | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 70b89c4a..27d8fa35 100644 --- a/configure.ac +++ b/configure.ac @@ -183,6 +183,24 @@ AC_DEFUN([UTIL_CHECK_LIB], [ AM_CONDITIONAL(AS_TR_CPP([HAVE_]suffix), [test [$have_]suffix = yes]) ]) +dnl UTIL_SET_FLAGS(CFLAGS, CPPFLAGS, LDFLAGS) +AC_DEFUN([UTIL_SET_FLAGS], [ + old_CFLAGS="$CFLAGS" + old_CPPFLAGS="$CPPFLAGS" + old_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS $1" + CPPFLAGS="$CPPFLAGS $2" + LDFLAGS="$LDFLAGS $3" +]) + +dnl UTIL_RESTORE_FLAGS() +AC_DEFUN([UTIL_RESTORE_FLAGS], [ + CFLAGS="$old_CFLAGS" + CPPFLAGS="$old_CPPFLAGS" + LDFLAGS="$old_LDFLAGS" +]) + + UTIL_CHECK_LIB(uuid, uuid_is_null) if test "x$have_uuid" = xno; then AC_MSG_WARN([uuid library is not found; mkswap(8) will not generate UUIDs]) @@ -205,17 +223,10 @@ have_volume_id=no if test "x$with_fsprobe" = xblkid; then PKG_CHECK_MODULES(BLKID, blkid, [have_blkid=yes], []) if test "x$have_blkid" = xyes; then - old_CFLAGS="$CFLAGS" - old_CPPFLAGS="$CPPFLAGS" - old_LDFLAGS="$LDFLAGS" - CFLAGS="$CFLAGS $BLKID_CFLAGS" - CPPFLAGS="$CPPFLAGS $BLKID_CFLAGS" - LDFLAGS="$LDFLAGS $BLKID_LIBS" + UTIL_SET_FLAGS($BLKID_CFLAGS, $BLKID_CFLAGS, $BLKID_LIBS) AC_CHECK_HEADERS([blkid.h blkid/blkid.h], [break], []) AC_CHECK_FUNC(blkid_evaluate_tag, [have_blkid_evaluate=yes], []) - CFLAGS="$old_CFLAGS" - CPPFLAGS="$old_CPPFLAGS" - LDFLAGS="$old_LDFLAGS" + UTIL_RESTORE_FLAGS fi elif test "x$with_fsprobe" = xvolume_id; then PKG_CHECK_MODULES(VOLUME_ID, volume_id, [have_volume_id=yes], []) -- cgit v1.2.3 From 17afb0320c77e47a44dc838d3724f89aff06c703 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 18 May 2009 16:01:27 +0200 Subject: build-sys: cleanup libuuid stuff Supported scenarios: * internal libuuid (--enable-libuuid, default) * external libuuid (--disable-libuuid) - systems without pkg-config - systems with pkg-config * systems without libuuid at all (the library is optional for u-l-ng) Signed-off-by: Karel Zak --- configure.ac | 49 ++++++++++++++++++++++++++++++++------------ disk-utils/Makefile.am | 13 +++++++++--- shlibs/blkid/src/Makefile.am | 13 +++++++++--- 3 files changed, 56 insertions(+), 19 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 27d8fa35..574be219 100644 --- a/configure.ac +++ b/configure.ac @@ -201,13 +201,39 @@ AC_DEFUN([UTIL_RESTORE_FLAGS], [ ]) -UTIL_CHECK_LIB(uuid, uuid_is_null) -if test "x$have_uuid" = xno; then - AC_MSG_WARN([uuid library is not found; mkswap(8) will not generate UUIDs]) +AC_ARG_ENABLE([libuuid], + AS_HELP_STRING([--disable-libuuid], [do not build libuuid and uuid utilities]), + [], enable_libuuid=yes +) +AC_SUBST(LIBUUID_VERSION) +AM_CONDITIONAL(BUILD_LIBUUID, test "x$enable_libuuid" = xyes) +have_uuid=yes + +if test "x$enable_libuuid" = xno; then + # Check for external (e2fsprogs) libuuid + PKG_CHECK_MODULES(UUID, uuid, [have_uuid=yes], [have_uuid=no]) + if test "x$have_uuid" = xno; then + # system without pkg-config or so, try classic check + AC_CHECK_LIB(uuid, uuid_is_null, [have_uuid=yes], [have_uuid=no]) + fi + if test "x$have_uuid" = xyes; then + UTIL_SET_FLAGS($UUID_CFLAGS, $UUID_CFLAGS, $UUID_LIBS) + AC_CHECK_HEADERS([uuid.h uuid/uuid.h], [break], []) + UTIL_RESTORE_FLAGS + fi +else + # internal librray + AC_DEFINE(HAVE_UUID_H, 1, [Define to 1 if you have the header file.]) fi -UTIL_CHECK_LIB(util, openpty) -UTIL_CHECK_LIB(termcap, tgetnum) +if test "x$have_uuid" = xyes; then + AC_DEFINE(HAVE_LIBUUID, 1, [Define to 1 if you have the -luuid.]) +else + AC_MSG_WARN([uuid library is not found; mkswap(8) will not generate UUIDs]) +fi +AM_CONDITIONAL(HAVE_UUID, test "x$have_uuid" = xyes) +# default +: ${UUID_LIBS='-luuid'} AC_ARG_WITH([fsprobe], @@ -269,14 +295,6 @@ fi AM_CONDITIONAL(BUILD_MOUNT, test "x$build_mount" = xyes) -AC_ARG_ENABLE([libuuid], - AS_HELP_STRING([--disable-libuuid], [do not build libuuid and uuid utilities]), - [], enable_libuuid=yes -) -AC_SUBST(LIBUUID_VERSION) -AM_CONDITIONAL(BUILD_LIBUUID, test "x$enable_libuuid" = xyes) - - AC_ARG_ENABLE([fsck], AS_HELP_STRING([--enable-fsck], [do build fsck]), [], enable_fsck=no @@ -289,6 +307,8 @@ fi AM_CONDITIONAL(BUILD_FSCK, test "x$enable_fsck" = xyes) + + dnl UTIL_PKG_STATIC(VARIABLE, MODULES) dnl ---------------------------------- AC_DEFUN([UTIL_PKG_STATIC], [ @@ -299,6 +319,7 @@ AC_DEFUN([UTIL_PKG_STATIC], [ fi ]) + # These default values should work in most cases: : ${BLKID_LIBS='-lblkid -luuid'} : ${VOLUME_ID_LIBS='-lvolume_id'} @@ -314,6 +335,8 @@ fi AC_ARG_VAR([BLKID_LIBS_STATIC], [-l options for linking statically with blkid]) AC_ARG_VAR([VOLUME_ID_LIBS_STATIC], [-l options for linking statically with volume_id]) +UTIL_CHECK_LIB(util, openpty) +UTIL_CHECK_LIB(termcap, tgetnum) AM_GNU_GETTEXT_VERSION([0.14.1]) AM_GNU_GETTEXT([external]) diff --git a/disk-utils/Makefile.am b/disk-utils/Makefile.am index 4854d5f6..60481ab7 100644 --- a/disk-utils/Makefile.am +++ b/disk-utils/Makefile.am @@ -12,7 +12,10 @@ sbin_PROGRAMS = mkfs mkswap fsck.minix mkfs.minix mkfs.bfs fsck_minix_SOURCES = fsck.minix.c minix.h mkfs_minix_SOURCES = mkfs.minix.c minix.h $(utils_common) mkfs_bfs_SOURCES = mkfs.bfs.c $(utils_common) + mkswap_SOURCES = mkswap.c $(utils_common) ../lib/wholedisk.c ../lib/pttype.c +mkswap_LDADD = +mkswap_CFLAGS = usrbinexec_PROGRAMS = isosize usrsbinexec_PROGRAMS = @@ -46,10 +49,14 @@ fsck_cramfs_LDADD = -lz mkfs_cramfs_LDADD = -lz endif -mkswap_LDADD = - if HAVE_UUID -mkswap_LDADD += -luuid +if BUILD_LIBUUID +mkswap_LDADD += $(ul_libuuid_la) +mkswap_CFLAGS += -I$(ul_libuuid_srcdir) +else +mkswap_LDADD += $(UUID_LIBS) +mkswap_CFLAGS += $(UUID_CFLAGS) +endif endif if HAVE_SELINUX diff --git a/shlibs/blkid/src/Makefile.am b/shlibs/blkid/src/Makefile.am index 2b935e29..18e5c2e3 100644 --- a/shlibs/blkid/src/Makefile.am +++ b/shlibs/blkid/src/Makefile.am @@ -2,14 +2,21 @@ include $(top_srcdir)/config/include-Makefile.am SUBDIRS = probers . -AM_CPPFLAGS += -I$(ul_libblkid_srcdir) - common_ldadd = +common_cflags = if HAVE_UUID -common_ldadd += -luuid #TODO $(UUID_LIBS) +if BUILD_LIBUUID +common_ldadd += $(ul_libuuid_la) +common_cflags += -I$(ul_libuuid_srcdir) +else +common_ldadd += $(UUID_LIBS) +common_cflags += $(UUID_CFLAGS) +endif endif +AM_CPPFLAGS += -I$(ul_libblkid_srcdir) $(common_cflags) + # includes blkidincdir = $(includedir)/blkid blkidinc_HEADERS = blkid.h -- cgit v1.2.3 From f910b5594f4293046902a6ed1d05e7f6ce0ee6b9 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 19 May 2009 14:08:54 +0200 Subject: build-sys: add --disable-libblkid, remove volume_id support Supported scenarios: * internal libblkid (--enable-libblkid, default) * external libblkid (--disable-libblkid) - systems without pkg-config - systems with pkg-config * systems without libblkid at all (requires --disable-mount and --disable-fsck) Signed-off-by: Karel Zak --- configure.ac | 159 +++++++++++++++++++++++++++-------------------------------- 1 file changed, 72 insertions(+), 87 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 574be219..922b8647 100644 --- a/configure.ac +++ b/configure.ac @@ -169,6 +169,16 @@ m4_foreach([UTIL_PRG], m4_defn([UTIL_STATIC_PROGRAMS]), [ [test "x$static_[]UTIL_PRG" = xyes]) ]) +dnl UTIL_PKG_STATIC(VARIABLE, MODULES) +dnl ---------------------------------- +AC_DEFUN([UTIL_PKG_STATIC], [ + if AC_RUN_LOG([pkg-config --exists --print-errors "$2"]); then + $1=`pkg-config --libs --static "$2"` + else + AC_MSG_ERROR([pkg-config description of $2, needed for static build, is not available]) + fi +]) + dnl UTIL_CHECK_LIB(LIBRARY, FUNCTION, [VARSUFFIX = $1])) dnl The VARSUFFIX is optional and overrides the default behaviour. For example: dnl UTIL_CHECK_LIB(yyy, func, xxx) generates have_xxx and HAVE_LIBXXX @@ -201,6 +211,29 @@ AC_DEFUN([UTIL_RESTORE_FLAGS], [ ]) +AC_ARG_ENABLE([mount], + AS_HELP_STRING([--disable-mount], [do not build mount utilities]), + [], enable_mount=check +) +build_mount=yes +if test "x$enable_mount" = xcheck; then + if test "x$linux_os" = xno; then + AC_MSG_WARN([non-linux system; do not build mount utilities]) + build_mount=no + fi +elif test "x$enable_mount" = xno; then + build_mount=no +fi +AM_CONDITIONAL(BUILD_MOUNT, test "x$build_mount" = xyes) + + +AC_ARG_ENABLE([fsck], + AS_HELP_STRING([--enable-fsck], [do build fsck]), + [], enable_fsck=no +) +AM_CONDITIONAL(BUILD_FSCK, test "x$enable_fsck" = xyes) + + AC_ARG_ENABLE([libuuid], AS_HELP_STRING([--disable-libuuid], [do not build libuuid and uuid utilities]), [], enable_libuuid=yes @@ -222,7 +255,7 @@ if test "x$enable_libuuid" = xno; then UTIL_RESTORE_FLAGS fi else - # internal librray + # internal library AC_DEFINE(HAVE_UUID_H, 1, [Define to 1 if you have the header file.]) fi @@ -236,104 +269,56 @@ AM_CONDITIONAL(HAVE_UUID, test "x$have_uuid" = xyes) : ${UUID_LIBS='-luuid'} -AC_ARG_WITH([fsprobe], - [AS_HELP_STRING([--with-fsprobe=LIB], [library to guess filesystems, LIB should be builtin|blkid|volume_id, default is blkid])], - [], [with_fsprobe=blkid] +AC_ARG_ENABLE([libblkid], + AS_HELP_STRING([--disable-libblkid], [do not build libblkid and blkid utilities]), + [], enable_libblkid=yes ) +AC_SUBST(LIBBLKID_VERSION) +AM_CONDITIONAL(BUILD_LIBBLKID, test "x$enable_libblkid" = xyes) +AC_DEFINE_UNQUOTED(LIBBLKID_VERSION, "$LIBBLKID_VERSION", [libblkid version string]) +AC_DEFINE_UNQUOTED(LIBBLKID_DATE, "$LIBBLKID_DATE", [libblkid date string]) +have_blkid=yes -build_libblkid=no -have_blkid_evaluate=no -have_blkid=no -have_volume_id=no - -if test "x$with_fsprobe" = xblkid; then - PKG_CHECK_MODULES(BLKID, blkid, [have_blkid=yes], []) - if test "x$have_blkid" = xyes; then - UTIL_SET_FLAGS($BLKID_CFLAGS, $BLKID_CFLAGS, $BLKID_LIBS) - AC_CHECK_HEADERS([blkid.h blkid/blkid.h], [break], []) - AC_CHECK_FUNC(blkid_evaluate_tag, [have_blkid_evaluate=yes], []) - UTIL_RESTORE_FLAGS +if test "x$enable_libblkid" = xno; then + if test "x$build_mount" = xyes || test "x$enable_fsck" = xyes; then + # Check for external (e2fsprogs) libblkid + PKG_CHECK_MODULES(BLKID, blkid, [have_blkid=yes], [have_blkid=no]) + if test "x$have_blkid" = xno; then + # system without pkg-config or so, try classic check + AC_CHECK_LIB(blkid, blkid_get_cache, [have_blkid=yes], [have_blkid=no]) + fi + if test "x$have_blkid" = xyes; then + UTIL_SET_FLAGS($BLKID_CFLAGS, $BLKID_CFLAGS, $BLKID_LIBS) + AC_CHECK_HEADERS([blkid.h blkid/blkid.h], [break], []) + UTIL_RESTORE_FLAGS + fi + if test -n "$enable_static_programs"; then + # TODO check only when mount of fsck are requested + UTIL_PKG_STATIC([BLKID_LIBS_STATIC], [blkid]) + fi fi -elif test "x$with_fsprobe" = xvolume_id; then - PKG_CHECK_MODULES(VOLUME_ID, volume_id, [have_volume_id=yes], []) -elif test "x$with_fsprobe" = xbuiltin; then - have_blkid=yes - build_libblkid=yes - have_blkid_evaluate=yes - AC_SUBST(LIBBLKID_VERSION) - AC_DEFINE_UNQUOTED(LIBBLKID_VERSION, "$LIBBLKID_VERSION", [libblkid version string]) - AC_DEFINE_UNQUOTED(LIBBLKID_DATE, "$LIBBLKID_DATE", [libblkid date string]) +else + # internal library + AC_DEFINE(HAVE_BLKID_H, 1, [Define to 1 if you have the header file.]) + AC_DEFINE(HAVE_BLKID_EVALUATE_TAG, 1, [Define to 1 if you have the blkid_evaluate_tag().]) fi -if test "x$have_blkid" = xyes; then +if test "x$have_blkid" = xyes; then AC_DEFINE(HAVE_LIBBLKID, 1, [Define to 1 if you have the -lblkid.]) - if test "x$have_blkid_evaluate" = xyes; then - AC_DEFINE(HAVE_BLKID_EVALUATE_TAG, 1, [Define to 1 if you have the blkid_evaluate_tag().]) - fi -fi - -AM_CONDITIONAL(HAVE_BLKID, test "x$have_blkid" = xyes) -AM_CONDITIONAL(HAVE_VOLUME_ID, test "x$have_volume_id" = xyes) -AM_CONDITIONAL(BUILD_LIBBLKID, test "x$build_libblkid" = xyes) - - -AC_ARG_ENABLE([mount], - AS_HELP_STRING([--disable-mount], [do not build mount utilities]), - [], enable_mount=check -) -build_mount=yes -if test "x$enable_mount" = xno; then - build_mount=no -elif test "x$linux_os" = xyes; then - if test "x$have_blkid" = xno && test "x$have_volume_id" = xno; then - AC_MSG_ERROR([blkid or volume_id is needed to build util-linux-ng mount utilities]) - fi else - AC_MSG_WARN([non-linux system; do not build mount utilities]) - build_mount=no -fi -AM_CONDITIONAL(BUILD_MOUNT, test "x$build_mount" = xyes) - - -AC_ARG_ENABLE([fsck], - AS_HELP_STRING([--enable-fsck], [do build fsck]), - [], enable_fsck=no -) -if test "x$enable_fsck" = xyes; then - if test "x$have_blkid" = xno && test "x$have_volume_id" = xno; then - AC_MSG_ERROR([libblkid or libvolume_id is needed to build util-linux-ng fsck]) + if test "x$build_mount" = xyes; then + AC_MSG_ERROR([libblkid is needed to build util-linux-ng mount]) fi -fi -AM_CONDITIONAL(BUILD_FSCK, test "x$enable_fsck" = xyes) - - - - -dnl UTIL_PKG_STATIC(VARIABLE, MODULES) -dnl ---------------------------------- -AC_DEFUN([UTIL_PKG_STATIC], [ - if AC_RUN_LOG([pkg-config --exists --print-errors "$2"]); then - $1=`pkg-config --libs --static "$2"` - else - AC_MSG_ERROR([pkg-config description of $2, needed for static build, is not available]) + if test "x$enable_fsck" = xyes; then + AC_MSG_ERROR([libblkid is needed to build util-linux-ng fsck]) fi -]) - - -# These default values should work in most cases: -: ${BLKID_LIBS='-lblkid -luuid'} -: ${VOLUME_ID_LIBS='-lvolume_id'} - -# ... but for static build, we need to consult pkg-config: -if test -n "$enable_static_programs"; then - case $with_fsprobe in - blkid) UTIL_PKG_STATIC([BLKID_LIBS_STATIC], [blkid]) ;; - volume_id) UTIL_PKG_STATIC([VOLUME_ID_LIBS_STATIC], [libvolume_id]) ;; - esac fi +AM_CONDITIONAL(HAVE_BLKID, test "x$have_blkid" = xyes) +# default +: ${BLKID_LIBS='-lblkid -luuid'} AC_ARG_VAR([BLKID_LIBS_STATIC], [-l options for linking statically with blkid]) -AC_ARG_VAR([VOLUME_ID_LIBS_STATIC], [-l options for linking statically with volume_id]) + UTIL_CHECK_LIB(util, openpty) UTIL_CHECK_LIB(termcap, tgetnum) -- cgit v1.2.3 From 6c2a09b3e65b9fad67087577a9c86377f3f3b98b Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 19 May 2009 14:17:18 +0200 Subject: build-sys: enable fsck by default Signed-off-by: Karel Zak --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 922b8647..92f40d49 100644 --- a/configure.ac +++ b/configure.ac @@ -228,8 +228,8 @@ AM_CONDITIONAL(BUILD_MOUNT, test "x$build_mount" = xyes) AC_ARG_ENABLE([fsck], - AS_HELP_STRING([--enable-fsck], [do build fsck]), - [], enable_fsck=no + AS_HELP_STRING([--disable-fsck], [do not build fsck]), + [], enable_fsck=yes ) AM_CONDITIONAL(BUILD_FSCK, test "x$enable_fsck" = xyes) -- cgit v1.2.3 From 3ac22f7a17cb1040e3ca962a805ded3ef812dd28 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 21 May 2009 15:52:24 +0200 Subject: build-sys: add --disable-tls * add AX_TLS autoconf macro * add --disabletls option * cleanup gen_uuid.c code to remove gcc warnings when compiled without TLS macro. Signed-off-by: Karel Zak --- .gitignore | 3 +++ configure.ac | 10 ++++++++++ m4/tls.m4 | 48 ++++++++++++++++++++++++++++++++++++++++++++++ shlibs/uuid/src/gen_uuid.c | 30 +++++++++++++++++++---------- 4 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 m4/tls.m4 (limited to 'configure.ac') diff --git a/.gitignore b/.gitignore index 5ab0d1d1..9f6d8b85 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ libtool !m4/ltsugar.m4 !m4/ltversion.m4 !m4/lt~obsolete.m4 + +# libuuid depends on AX_TLS macro +!m4/tls.m4 diff --git a/configure.ac b/configure.ac index 92f40d49..0b3cf359 100644 --- a/configure.ac +++ b/configure.ac @@ -128,6 +128,7 @@ AC_CHECK_FUNCS( nanosleep \ personality \ updwtmp \ + jrand48 \ lchown \ llseek \ lseek64 \ @@ -211,6 +212,15 @@ AC_DEFUN([UTIL_RESTORE_FLAGS], [ ]) +AC_ARG_ENABLE([tls], + AS_HELP_STRING([--disable-tls], [disable use of thread local support]), + [], enable_tls=yes +) +if test "x$enable_tls" = xyes; then + AX_TLS +fi + + AC_ARG_ENABLE([mount], AS_HELP_STRING([--disable-mount], [do not build mount utilities]), [], enable_mount=check diff --git a/m4/tls.m4 b/m4/tls.m4 new file mode 100644 index 00000000..5644ba70 --- /dev/null +++ b/m4/tls.m4 @@ -0,0 +1,48 @@ +# from http://autoconf-archive.cryp.to/ax_tls.html +# +# This was licensed under the GPL with the following exception: +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you make +# and distribute a modified version of the Autoconf Macro, you may +# extend this special exception to the GPL to apply to your modified +# version as well. +# +AC_DEFUN([AX_TLS], [ + AC_MSG_CHECKING(for thread local storage (TLS) class) + AC_CACHE_VAL(ac_cv_tls, [ + ax_tls_keywords="__thread __declspec(thread) none" + for ax_tls_keyword in $ax_tls_keywords; do + case $ax_tls_keyword in + none) ac_cv_tls=none ; break ;; + *) + AC_TRY_COMPILE( + [#include + static void + foo(void) { + static ] $ax_tls_keyword [ int bar; + exit(1); + }], + [], + [ac_cv_tls=$ax_tls_keyword ; break], + ac_cv_tls=none + ) + esac + done +]) + + if test "$ac_cv_tls" != "none"; then + dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here]) + AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) + fi + AC_MSG_RESULT($ac_cv_tls) +]) diff --git a/shlibs/uuid/src/gen_uuid.c b/shlibs/uuid/src/gen_uuid.c index ab73c43e..e0cb5574 100644 --- a/shlibs/uuid/src/gen_uuid.c +++ b/shlibs/uuid/src/gen_uuid.c @@ -175,7 +175,6 @@ static void get_random_bytes(void *buf, int nbytes) int i, n = nbytes, fd = get_random_fd(); int lose_counter = 0; unsigned char *cp = (unsigned char *) buf; - unsigned short tmp_seed[3]; if (fd >= 0) { while (n > 0) { @@ -197,13 +196,18 @@ static void get_random_bytes(void *buf, int nbytes) */ for (cp = buf, i = 0; i < nbytes; i++) *cp++ ^= (rand() >> 7) & 0xFF; + #ifdef DO_JRAND_MIX - memcpy(tmp_seed, jrand_seed, sizeof(tmp_seed)); - jrand_seed[2] = jrand_seed[2] ^ syscall(__NR_gettid); - for (cp = buf, i = 0; i < nbytes; i++) - *cp++ ^= (jrand48(tmp_seed) >> 7) & 0xFF; - memcpy(jrand_seed, tmp_seed, - sizeof(jrand_seed)-sizeof(unsigned short)); + { + unsigned short tmp_seed[3]; + + memcpy(tmp_seed, jrand_seed, sizeof(tmp_seed)); + jrand_seed[2] = jrand_seed[2] ^ syscall(__NR_gettid); + for (cp = buf, i = 0; i < nbytes; i++) + *cp++ ^= (jrand48(tmp_seed) >> 7) & 0xFF; + memcpy(jrand_seed, tmp_seed, + sizeof(jrand_seed)-sizeof(unsigned short)); + } #endif return; @@ -415,6 +419,8 @@ try_again: return 0; } +#if defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) +/* used in get_uuid_via_daemon() only */ static ssize_t read_all(int fd, char *buf, size_t count) { ssize_t ret; @@ -459,7 +465,6 @@ static void close_all_fds(void) close(i); } - /* * Try using the uuidd daemon to generate the UUID * @@ -467,7 +472,6 @@ static void close_all_fds(void) */ static int get_uuid_via_daemon(int op, uuid_t out, int *num) { -#if defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) char op_buf[64]; int op_len; int s; @@ -534,10 +538,16 @@ static int get_uuid_via_daemon(int op, uuid_t out, int *num) fail: close(s); -#endif return -1; } +#else /* !defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) */ +static int get_uuid_via_daemon(int op, uuid_t out, int *num) +{ + return -1; +} +#endif + void uuid__generate_time(uuid_t out, int *num) { static unsigned char node_id[6]; -- cgit v1.2.3 From 69045d3dbaf95ae73eda90bc20234b6a520dab0f Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 22 May 2009 09:08:43 +0200 Subject: uuidd: new command (UUID daemon from e2fsprogs) Signed-off-by: Karel Zak --- configure.ac | 2 + example.files/uuidd.rc | 55 +++++ misc-utils/.gitignore | 1 + misc-utils/Makefile.am | 6 + misc-utils/uuidd.8 | 96 ++++++++ misc-utils/uuidd.c | 572 ++++++++++++++++++++++++++++++++++++++++++++ shlibs/uuid/src/Makefile.am | 2 +- shlibs/uuid/src/uuid.sym | 6 + 8 files changed, 739 insertions(+), 1 deletion(-) create mode 100644 example.files/uuidd.rc create mode 100644 misc-utils/uuidd.8 create mode 100644 misc-utils/uuidd.c (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 0b3cf359..e9a89199 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,8 @@ AC_CHECK_FUNCS( getdtablesize \ getrlimit \ srandom \ + setresgid \ + setresuid \ inotify_init \ prctl \ __secure_getenv \ diff --git a/example.files/uuidd.rc b/example.files/uuidd.rc new file mode 100644 index 00000000..d35645a1 --- /dev/null +++ b/example.files/uuidd.rc @@ -0,0 +1,55 @@ +#! /bin/sh -e +### BEGIN INIT INFO +# Provides: uuidd +# Required-Start: $time $local_fs +# Required-Stop: $time $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: uuidd daemon +# Description: Init script for the uuid generation daemon +### END INIT INFO +# +# Author: "Theodore Ts'o" +# +set -e + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +DAEMON=/usr/sbin/uuidd +PIDFILE=/var/run/uuidd/uuidd.pid + +test -x $DAEMON || exit 0 + +. /lib/lsb/init-functions + +case "$1" in + start) + log_daemon_msg "Starting uuid generator" "uuidd" + start_daemon -p $PIDFILE $DAEMON + log_end_msg $? + ;; + stop) + log_daemon_msg "Stopping uuidd generator" "uuidd" + killproc -p $PIDFILE $DAEMON + log_end_msg $? + ;; + status) + if pidofproc -p $PIDFILE $DAEMON >& /dev/null ; then + echo "$DAEMON is running"; + exit 0; + else + echo "$DAEMON is NOT running"; + if test -f /var/run/uuidd.pid; then exit 2; fi + exit 3; + fi + ;; + force-reload|restart) + $0 stop + $0 start + ;; + *) + echo "Usage: /etc/init.d/uuidd {start|stop|restart|force-reload}" + exit 1 + ;; +esac + +exit 0 diff --git a/misc-utils/.gitignore b/misc-utils/.gitignore index ddb44213..e58c9301 100644 --- a/misc-utils/.gitignore +++ b/misc-utils/.gitignore @@ -13,3 +13,4 @@ whereis kill write uuidgen +uuidd diff --git a/misc-utils/Makefile.am b/misc-utils/Makefile.am index 781e5d2e..087e4a1b 100644 --- a/misc-utils/Makefile.am +++ b/misc-utils/Makefile.am @@ -3,6 +3,7 @@ include $(top_srcdir)/config/include-Makefile.am EXTRA_DIST = README.flushb bin_PROGRAMS = +usrsbinexec_PROGRAMS = usrbinexec_PROGRAMS = cal ddate logger look mcookie \ namei script whereis scriptreplay @@ -22,6 +23,11 @@ usrbinexec_PROGRAMS += uuidgen dist_man_MANS += uuidgen.1 uuidgen_LDADD = $(ul_libuuid_la) uuidgen_CFLAGS = -I$(ul_libuuid_srcdir) + +usrsbinexec_PROGRAMS += uuidd +dist_man_MANS += uuidd.8 +uuidd_LDADD = $(ul_libuuid_la) +uuidd_CFLAGS = -I$(ul_libuuid_srcdir) endif if HAVE_TINFO diff --git a/misc-utils/uuidd.8 b/misc-utils/uuidd.8 new file mode 100644 index 00000000..ae033eaf --- /dev/null +++ b/misc-utils/uuidd.8 @@ -0,0 +1,96 @@ +.\" -*- nroff -*- +.\" Copyright 2007 by Theodore Ts'o. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH UUIDD 8 "May 2009" "Linux" +.SH NAME +uuidd \- UUID generation daemon +.SH SYNOPSIS +.B uuidd +[ +.B \-d +] +[ +.B \-p +.I pidfile +] +[ +.B \-s +.I socketpath +] +[ +.B \-T +.I timeout +] + +.B uuidd +[ +.B \-r +| +.B \-t +] +[ +.B \-n +.I number +] +[ +.B \-s +.I socketpath +] + +.B uuidd \-k +.SH DESCRIPTION +The +.B uuidd +daemon is used by the UUID library to generate +universally unique identifiers (UUIDs), especially time-based UUID's +in a secure and guaranteed-unique fashion, even in the face of large +numbers of threads trying to grab UUID's running on different CPU's. +.SH OPTIONS +.TP +.B \-d +Run +.B uuidd +in debugging mode. This prevents uuidd from running as a daemon. +.TP +.B \-k +If a currently uuidd daemon is running, kill it. +.TP +.BI \-n " number" +When issuing a test request to a running uuidd, request a bulk response +of +.I number +UUID's. +.TP +.BI \-p " pidfile" +Specify the pathname where the pid file should be written. By default, +the pid file is written to /var/lib/libuuid/uuidd.pid. +.TP +.BI \-s " socketpath" +Specify the pathname used for the unix-domain socket used by uuidd. By +default, the pathname used is /var/lib/libuuid/request. This is primarily +for debugging purposes, since the pathname is hard-coded in the libuuid +library. +.TP +.B \-r +Test uuidd by trying to connect to a running uuidd daemon and +request it to return a random-based UUID. +.TP +.B \-t +Test uuidd by trying to connect to a running uuidd daemon and +request it to return a time-based UUID. +.TP +.BI \-T " timeout" +Specify a timeout for uuidd. If specified, then uuidd will exit after +.I timeout +seconds of inactivity. +.SH AUTHOR +The +.B uuidd +daemon was written by Theodore Ts'o . +.SH AVAILABILITY +uuidd is part of the util-linux-ng package and is available from +ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/. +.SH "SEE ALSO" +.BR libuuid (3), +.BR uuidgen (1) diff --git a/misc-utils/uuidd.c b/misc-utils/uuidd.c new file mode 100644 index 00000000..5e597833 --- /dev/null +++ b/misc-utils/uuidd.c @@ -0,0 +1,572 @@ +/* + * uuidd.c --- UUID-generation daemon + * + * Copyright (C) 2007 Theodore Ts'o + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Public + * License. + * %End-Header% + */ +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_GETOPT_H +#include +#else +extern int getopt(int argc, char * const argv[], const char *optstring); +extern char *optarg; +extern int optind; +#endif + +#include "uuid.h" +#include "uuidd.h" + +#include "nls.h" + +#ifdef __GNUC__ +#define CODE_ATTR(x) __attribute__(x) +#else +#define CODE_ATTR(x) +#endif + +static void usage(const char *progname) +{ + fprintf(stderr, _("Usage: %s [-d] [-p pidfile] [-s socketpath] " + "[-T timeout]\n"), progname); + fprintf(stderr, _(" %s [-r|t] [-n num] [-s socketpath]\n"), + progname); + fprintf(stderr, _(" %s -k\n"), progname); + exit(1); +} + +static void die(const char *msg) +{ + perror(msg); + exit(1); +} + +static void create_daemon(void) +{ + pid_t pid; + uid_t euid; + + pid = fork(); + if (pid == -1) { + perror("fork"); + exit(1); + } else if (pid != 0) { + exit(0); + } + + close(0); + close(1); + close(2); + open("/dev/null", O_RDWR); + open("/dev/null", O_RDWR); + open("/dev/null", O_RDWR); + + if (chdir("/")) {} /* Silence warn_unused_result warning */ + (void) setsid(); + euid = geteuid(); + if (setreuid(euid, euid) < 0) + die("setreuid"); +} + +static int read_all(int fd, char *buf, size_t count) +{ + ssize_t ret; + int c = 0; + + memset(buf, 0, count); + while (count > 0) { + ret = read(fd, buf, count); + if (ret < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + return -1; + } + count -= ret; + buf += ret; + c += ret; + } + return c; +} + +static int write_all(int fd, char *buf, size_t count) +{ + ssize_t ret; + int c = 0; + + while (count > 0) { + ret = write(fd, buf, count); + if (ret < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + return -1; + } + count -= ret; + buf += ret; + c += ret; + } + return c; +} + +static const char *cleanup_pidfile, *cleanup_socket; + +static void terminate_intr(int signo CODE_ATTR((unused))) +{ + (void) unlink(cleanup_pidfile); + if (cleanup_socket) + (void) unlink(cleanup_socket); + exit(0); +} + +static int call_daemon(const char *socket_path, int op, char *buf, + int buflen, int *num, const char **err_context) +{ + char op_buf[8]; + int op_len; + int s; + ssize_t ret; + int32_t reply_len = 0; + struct sockaddr_un srv_addr; + + if (((op == 4) || (op == 5)) && !num) { + if (err_context) + *err_context = _("bad arguments"); + errno = EINVAL; + return -1; + } + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + if (err_context) + *err_context = _("socket"); + return -1; + } + + srv_addr.sun_family = AF_UNIX; + strncpy(srv_addr.sun_path, socket_path, sizeof(srv_addr.sun_path)); + srv_addr.sun_path[sizeof(srv_addr.sun_path)-1] = '\0'; + + if (connect(s, (const struct sockaddr *) &srv_addr, + sizeof(struct sockaddr_un)) < 0) { + if (err_context) + *err_context = _("connect"); + close(s); + return -1; + } + + if (op == 5) { + if ((*num)*16 > buflen-4) + *num = (buflen-4) / 16; + } + op_buf[0] = op; + op_len = 1; + if ((op == 4) || (op == 5)) { + memcpy(op_buf+1, num, sizeof(int)); + op_len += sizeof(int); + } + + ret = write_all(s, op_buf, op_len); + if (ret < op_len) { + if (err_context) + *err_context = _("write"); + close(s); + return -1; + } + + ret = read_all(s, (char *) &reply_len, sizeof(reply_len)); + if (ret < 0) { + if (err_context) + *err_context = _("read count"); + close(s); + return -1; + } + if (reply_len < 0 || reply_len > buflen) { + if (err_context) + *err_context = _("bad response length"); + close(s); + return -1; + } + ret = read_all(s, (char *) buf, reply_len); + + if ((ret > 0) && (op == 4)) { + if (reply_len >= (int) (16+sizeof(int))) + memcpy(buf+16, num, sizeof(int)); + else + *num = -1; + } + if ((ret > 0) && (op == 5)) { + if (*num >= (int) sizeof(int)) + memcpy(buf, num, sizeof(int)); + else + *num = -1; + } + + close(s); + + return ret; +} + +static void server_loop(const char *socket_path, const char *pidfile_path, + int debug, int timeout, int quiet) +{ + struct sockaddr_un my_addr, from_addr; + struct flock fl; + socklen_t fromlen; + int32_t reply_len = 0; + uuid_t uu; + mode_t save_umask; + char reply_buf[1024], *cp; + char op, str[37]; + int i, s, ns, len, num; + int fd_pidfile, ret; + + fd_pidfile = open(pidfile_path, O_CREAT | O_RDWR, 0664); + if (fd_pidfile < 0) { + if (!quiet) + fprintf(stderr, "Failed to open/create %s: %s\n", + pidfile_path, strerror(errno)); + exit(1); + } + cleanup_pidfile = pidfile_path; + cleanup_socket = 0; + signal(SIGALRM, terminate_intr); + alarm(30); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_pid = 0; + while (fcntl(fd_pidfile, F_SETLKW, &fl) < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + if (!quiet) + fprintf(stderr, "Failed to lock %s: %s\n", + pidfile_path, strerror(errno)); + exit(1); + } + ret = call_daemon(socket_path, 0, reply_buf, sizeof(reply_buf), 0, 0); + if (ret > 0) { + if (!quiet) + printf(_("uuidd daemon already running at pid %s\n"), + reply_buf); + exit(1); + } + alarm(0); + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + if (!quiet) + fprintf(stderr, _("Couldn't create unix stream " + "socket: %s"), strerror(errno)); + exit(1); + } + + /* + * Create the address we will be binding to. + */ + my_addr.sun_family = AF_UNIX; + strncpy(my_addr.sun_path, socket_path, sizeof(my_addr.sun_path)); + my_addr.sun_path[sizeof(my_addr.sun_path)-1] = '\0'; + (void) unlink(socket_path); + save_umask = umask(0); + if (bind(s, (const struct sockaddr *) &my_addr, + sizeof(struct sockaddr_un)) < 0) { + if (!quiet) + fprintf(stderr, + _("Couldn't bind unix socket %s: %s\n"), + socket_path, strerror(errno)); + exit(1); + } + (void) umask(save_umask); + + if (listen(s, 5) < 0) { + if (!quiet) + fprintf(stderr, _("Couldn't listen on unix " + "socket %s: %s\n"), socket_path, + strerror(errno)); + exit(1); + } + + cleanup_socket = socket_path; + if (!debug) + create_daemon(); + signal(SIGHUP, terminate_intr); + signal(SIGINT, terminate_intr); + signal(SIGTERM, terminate_intr); + signal(SIGALRM, terminate_intr); + signal(SIGPIPE, SIG_IGN); + + sprintf(reply_buf, "%8d\n", getpid()); + if (ftruncate(fd_pidfile, 0)) {} /* Silence warn_unused_result */ + write_all(fd_pidfile, reply_buf, strlen(reply_buf)); + if (fd_pidfile > 1) + close(fd_pidfile); /* Unlock the pid file */ + + while (1) { + fromlen = sizeof(from_addr); + if (timeout > 0) + alarm(timeout); + ns = accept(s, (struct sockaddr *) &from_addr, &fromlen); + alarm(0); + if (ns < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + perror("accept"); + exit(1); + } + len = read(ns, &op, 1); + if (len != 1) { + if (len < 0) + perror("read"); + else + printf(_("Error reading from client, " + "len = %d\n"), len); + goto shutdown_socket; + } + if ((op == 4) || (op == 5)) { + if (read_all(ns, (char *) &num, sizeof(num)) != 4) + goto shutdown_socket; + if (debug) + printf(_("operation %d, incoming num = %d\n"), + op, num); + } else if (debug) + printf("operation %d\n", op); + + switch(op) { + case UUIDD_OP_GETPID: + sprintf(reply_buf, "%d", getpid()); + reply_len = strlen(reply_buf)+1; + break; + case UUIDD_OP_GET_MAXOP: + sprintf(reply_buf, "%d", UUIDD_MAX_OP); + reply_len = strlen(reply_buf)+1; + break; + case UUIDD_OP_TIME_UUID: + num = 1; + uuid__generate_time(uu, &num); + if (debug) { + uuid_unparse(uu, str); + printf(_("Generated time UUID: %s\n"), str); + } + memcpy(reply_buf, uu, sizeof(uu)); + reply_len = sizeof(uu); + break; + case UUIDD_OP_RANDOM_UUID: + num = 1; + uuid__generate_random(uu, &num); + if (debug) { + uuid_unparse(uu, str); + printf(_("Generated random UUID: %s\n"), str); + } + memcpy(reply_buf, uu, sizeof(uu)); + reply_len = sizeof(uu); + break; + case UUIDD_OP_BULK_TIME_UUID: + uuid__generate_time(uu, &num); + if (debug) { + uuid_unparse(uu, str); + printf(_("Generated time UUID %s and %d " + "following\n"), str, num); + } + memcpy(reply_buf, uu, sizeof(uu)); + reply_len = sizeof(uu); + memcpy(reply_buf+reply_len, &num, sizeof(num)); + reply_len += sizeof(num); + break; + case UUIDD_OP_BULK_RANDOM_UUID: + if (num < 0) + num = 1; + if (num > 1000) + num = 1000; + if (num*16 > (int) (sizeof(reply_buf)-sizeof(num))) + num = (sizeof(reply_buf)-sizeof(num)) / 16; + uuid__generate_random((unsigned char *) reply_buf + + sizeof(num), &num); + if (debug) { + printf(_("Generated %d UUID's:\n"), num); + for (i=0, cp=reply_buf+sizeof(num); + i < num; i++, cp+=16) { + uuid_unparse((unsigned char *)cp, str); + printf("\t%s\n", str); + } + } + reply_len = (num*16) + sizeof(num); + memcpy(reply_buf, &num, sizeof(num)); + break; + default: + if (debug) + printf(_("Invalid operation %d\n"), op); + goto shutdown_socket; + } + write_all(ns, (char *) &reply_len, sizeof(reply_len)); + write_all(ns, reply_buf, reply_len); + shutdown_socket: + close(ns); + } +} + +int main(int argc, char **argv) +{ + const char *socket_path = UUIDD_SOCKET_PATH; + const char *pidfile_path = UUIDD_PIDFILE_PATH; + const char *err_context; + char buf[1024], *cp; + char str[37], *tmp; + uuid_t uu; + uid_t uid; + gid_t gid; + int i, c, ret; + int debug = 0, do_type = 0, do_kill = 0, num = 0; + int timeout = 0, quiet = 0, drop_privs = 0; + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + while ((c = getopt (argc, argv, "dkn:qp:s:tT:r")) != EOF) { + switch (c) { + case 'd': + debug++; + drop_privs = 1; + break; + case 'k': + do_kill++; + drop_privs = 1; + break; + case 'n': + num = strtol(optarg, &tmp, 0); + if ((num < 0) || *tmp) { + fprintf(stderr, _("Bad number: %s\n"), optarg); + exit(1); + } + case 'p': + pidfile_path = optarg; + drop_privs = 1; + break; + case 'q': + quiet++; + break; + case 's': + socket_path = optarg; + drop_privs = 1; + break; + case 't': + do_type = UUIDD_OP_TIME_UUID; + drop_privs = 1; + break; + case 'T': + timeout = strtol(optarg, &tmp, 0); + if ((timeout < 0) || *tmp) { + fprintf(stderr, _("Bad number: %s\n"), optarg); + exit(1); + } + break; + case 'r': + do_type = UUIDD_OP_RANDOM_UUID; + drop_privs = 1; + break; + default: + usage(argv[0]); + } + } + uid = getuid(); + if (uid && drop_privs) { + gid = getgid(); +#ifdef HAVE_SETRESGID + if (setresgid(gid, gid, gid) < 0) + die("setresgid"); +#else + if (setregid(gid, gid) < 0) + die("setregid"); +#endif + +#ifdef HAVE_SETRESUID + if (setresuid(uid, uid, uid) < 0) + die("setresuid"); +#else + if (setreuid(uid, uid) < 0) + die("setreuid"); +#endif + } + if (num && do_type) { + ret = call_daemon(socket_path, do_type+2, buf, + sizeof(buf), &num, &err_context); + if (ret < 0) { + printf(_("Error calling uuidd daemon (%s): %s\n"), + err_context, strerror(errno)); + exit(1); + } + if (do_type == UUIDD_OP_TIME_UUID) { + if (ret != sizeof(uu) + sizeof(num)) + goto unexpected_size; + + uuid_unparse((unsigned char *) buf, str); + + printf(_("%s and subsequent %d UUID's\n"), str, num); + } else { + printf(_("List of UUID's:\n")); + cp = buf + 4; + if (ret != (int) (sizeof(num) + num*sizeof(uu))) + goto unexpected_size; + for (i=0; i < num; i++, cp+=16) { + uuid_unparse((unsigned char *) cp, str); + printf("\t%s\n", str); + } + } + exit(0); + } + if (do_type) { + ret = call_daemon(socket_path, do_type, (char *) &uu, + sizeof(uu), 0, &err_context); + if (ret < 0) { + printf(_("Error calling uuidd daemon (%s): %s\n"), + err_context, strerror(errno)); + exit(1); + } + if (ret != sizeof(uu)) { + unexpected_size: + printf(_("Unexpected reply length from server %d\n"), + ret); + exit(1); + } + uuid_unparse(uu, str); + + printf("%s\n", str); + exit(0); + } + + if (do_kill) { + ret = call_daemon(socket_path, 0, buf, sizeof(buf), 0, 0); + if ((ret > 0) && ((do_kill = atoi((char *) buf)) > 0)) { + ret = kill(do_kill, SIGTERM); + if (ret < 0) { + if (!quiet) + fprintf(stderr, + _("Couldn't kill uuidd running " + "at pid %d: %s\n"), do_kill, + strerror(errno)); + exit(1); + } + if (!quiet) + printf(_("Killed uuidd running at pid %d\n"), + do_kill); + } + exit(0); + } + + server_loop(socket_path, pidfile_path, debug, timeout, quiet); + return 0; +} diff --git a/shlibs/uuid/src/Makefile.am b/shlibs/uuid/src/Makefile.am index cfbb004d..cc2ee7df 100644 --- a/shlibs/uuid/src/Makefile.am +++ b/shlibs/uuid/src/Makefile.am @@ -13,7 +13,7 @@ uuidinc_HEADERS = uuid.h lib_LTLIBRARIES = libuuid.la libuuid_la_SOURCES = clear.c compare.c copy.c gen_uuid.c \ isnull.c pack.c parse.c unpack.c unparse.c uuidd.h \ - uuid.h uuidP.h uuid_time.c $(uuidinc_HEADERS) + uuidd.h uuidP.h uuid_time.c $(uuidinc_HEADERS) libuuid_la_DEPENDENCIES = $(libuuid_la_LIBADD) uuid.sym diff --git a/shlibs/uuid/src/uuid.sym b/shlibs/uuid/src/uuid.sym index 591319aa..05d9f393 100644 --- a/shlibs/uuid/src/uuid.sym +++ b/shlibs/uuid/src/uuid.sym @@ -22,6 +22,12 @@ global: uuid_time; uuid_type; uuid_variant; + + /* uuid__* this is not part of the official API, this is + * uuidd (uuid daemon) specific stuff. Hell. + */ + uuid__generate_time; + uuid__generate_random; local: *; }; -- cgit v1.2.3 From 2ec884ac3504cf9ddb506225b346321ebda8af68 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 22 May 2009 09:58:23 +0200 Subject: build-sys: add --disable-uuidd Signed-off-by: Karel Zak --- configure.ac | 17 +++++++++++++++++ shlibs/uuid/src/gen_uuid.c | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index e9a89199..f700f578 100644 --- a/configure.ac +++ b/configure.ac @@ -281,6 +281,23 @@ AM_CONDITIONAL(HAVE_UUID, test "x$have_uuid" = xyes) : ${UUID_LIBS='-luuid'} +AC_ARG_ENABLE([uuidd], + AS_HELP_STRING([--disable-uuidd], [do not build the uuid daemon]), + [], enable_uuidd=auto +) + +case "$enable_uuidd:$have_uuid" in +yes:no) + AC_MSG_ERROR([cannot enable uuidd when libuuid is disabled]) ;; +auto:*) + enable_uuidd=$have_uuid ;; +esac +if test "x$enable_uuidd" = xyes; then + AC_DEFINE(HAVE_UUIDD, 1, [Define to 1 if you want to use uuid daemon.]) +fi +AM_CONDITIONAL(BUILD_UUIDD, test "x$enable_uuidd" = xyes) + + AC_ARG_ENABLE([libblkid], AS_HELP_STRING([--disable-libblkid], [do not build libblkid and blkid utilities]), [], enable_libblkid=yes diff --git a/shlibs/uuid/src/gen_uuid.c b/shlibs/uuid/src/gen_uuid.c index e0cb5574..8497ac67 100644 --- a/shlibs/uuid/src/gen_uuid.c +++ b/shlibs/uuid/src/gen_uuid.c @@ -419,7 +419,7 @@ try_again: return 0; } -#if defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) +#if defined(HAVE_UUIDD) && defined(HAVE_SYS_UN_H) /* used in get_uuid_via_daemon() only */ static ssize_t read_all(int fd, char *buf, size_t count) { @@ -541,7 +541,7 @@ fail: return -1; } -#else /* !defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) */ +#else /* !defined(HAVE_UUIDD) && defined(HAVE_SYS_UN_H) */ static int get_uuid_via_daemon(int op, uuid_t out, int *num) { return -1; -- cgit v1.2.3 From bd6713471f125eafbd6dd464414b4787e4c8f6fc Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 9 Jun 2009 10:15:28 +0200 Subject: build-sys: add --disable-switch_root Signed-off-by: Karel Zak --- configure.ac | 7 +++++++ sys-utils/Makefile.am | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index f700f578..ac5fecd6 100644 --- a/configure.ac +++ b/configure.ac @@ -628,6 +628,13 @@ fi AM_CONDITIONAL(BUILD_CRAMFS, test "x$build_cramfs" = xyes) +AC_ARG_ENABLE([switch_root], + AS_HELP_STRING([--disable-switch_root], [do not build switch_root]), + [], enable_switch_root=no +) +AM_CONDITIONAL(BUILD_SWITCH_ROOT, test "x$enable_switch_root" = xyes) + + AC_ARG_ENABLE([elvtune], AS_HELP_STRING([--enable-elvtune], [build elvtune (only works with 2.2 and 2.4 kernels)]), [], enable_elvtune=no diff --git a/sys-utils/Makefile.am b/sys-utils/Makefile.am index 856d6a1f..6700677f 100644 --- a/sys-utils/Makefile.am +++ b/sys-utils/Makefile.am @@ -1,7 +1,7 @@ include $(top_srcdir)/config/include-Makefile.am bin_PROGRAMS = -sbin_PROGRAMS = switch_root +sbin_PROGRAMS = usrbinexec_PROGRAMS = flock ipcrm ipcs ipcmk renice setsid usrsbinexec_PROGRAMS = readprofile @@ -28,6 +28,10 @@ sbin_PROGRAMS += pivot_root dist_man_MANS += pivot_root.8 endif +if BUILD_SWITCH_ROOT +sbin_PROGRAMS += switch_root +endif + if BUILD_ARCH bin_PROGRAMS += arch dist_man_MANS += arch.1 -- cgit v1.2.3 From 940fd28c95d700054027d530c835bab417ed7309 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 9 Jun 2009 15:21:39 +0200 Subject: build-sys: check for openat() and linux for switch_root Signed-off-by: Peter Jones Signed-off-by: Karel Zak --- configure.ac | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index ac5fecd6..8ea831aa 100644 --- a/configure.ac +++ b/configure.ac @@ -145,6 +145,8 @@ AC_CHECK_FUNCS( rpmatch]) AC_FUNC_FSEEKO +AC_CHECK_FUNCS([openat fstatat unlinkat], [have_openat=yes], [have_openat=no]) + AC_CHECK_MEMBER(struct sockaddr.sa_len, AC_DEFINE_UNQUOTED(HAVE_SA_LEN,1,[Define if struct sockaddr contains sa_len]),, [#include @@ -630,9 +632,27 @@ AM_CONDITIONAL(BUILD_CRAMFS, test "x$build_cramfs" = xyes) AC_ARG_ENABLE([switch_root], AS_HELP_STRING([--disable-switch_root], [do not build switch_root]), - [], enable_switch_root=no + [], enable_switch_root=check ) -AM_CONDITIONAL(BUILD_SWITCH_ROOT, test "x$enable_switch_root" = xyes) + +if test "x$enable_switch_root" = xno; then + build_switch_root=no +else + build_switch_root=yes + case $enable_switch_root:$linux_os in + yes:no) AC_MSG_ERROR([switch_root selected for non-linux system]);; + check:no) AC_MSG_WARN([non-linux system; do not build switch_root]) + build_switch_root=no;; + esac + if test "x$build_switch_root" = xyes; then + case $enable_switch_root:$have_openat in + yes:no) AC_MSG_ERROR([switch_root selected but openat() function not found]);; + check:no) AC_MSG_WARN([openat() function not found; do not build switch_root]) + build_switch_root=no;; + esac + fi +fi +AM_CONDITIONAL(BUILD_SWITCH_ROOT, test "x$build_switch_root" = xyes) AC_ARG_ENABLE([elvtune], -- cgit v1.2.3 From a8dd2fe1332ef9280d1a5db7edfeeb4185edd0ef Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 29 Jun 2009 00:09:02 +0200 Subject: build-sys: release++ (v2.16-rc1) Signed-off-by: Karel Zak --- NEWS | 4 ++++ configure.ac | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'configure.ac') diff --git a/NEWS b/NEWS index 90bb65a6..326a354c 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +util-linux-ng 2.16-rc1: Jun 28 2009 +* see docs/v2.16-ReleaseNotes or complete changelog at + ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/v2.16/v2.16-rc1-ChangeLog + util-linux-ng 2.15: May 5 2009 * see docs/v2.15-ReleaseNotes or complete changelog at ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/v2.15/v2.15-ChangeLog diff --git a/configure.ac b/configure.ac index 8ea831aa..8c17f347 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT(util-linux-ng, 2.15, kzak@redhat.com) +AC_INIT(util-linux-ng, 2.16-rc1, kzak@redhat.com) AC_PREREQ(2.60) -- cgit v1.2.3 From 996fb3580f37a999abde9994d4244f8ea515de3d Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 30 Jun 2009 12:41:54 +0200 Subject: buildsys: move $usr{bin,sbin,lib}execdir definition to ./configure We need to use $usr{bin,sbin,lib}execdir variables in *.pc.in files and these files are generated by ./configure script. Signed-off-by: Karel Zak --- config/include-Makefile.am | 5 ----- configure.ac | 12 ++++++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'configure.ac') diff --git a/config/include-Makefile.am b/config/include-Makefile.am index 2e4363f2..f0077695 100644 --- a/config/include-Makefile.am +++ b/config/include-Makefile.am @@ -1,8 +1,3 @@ -# The original default vaues of bindir and sbindir: -usrbinexecdir = ${exec_prefix}/bin -usrsbinexecdir = ${exec_prefix}/sbin -usrlibexecdir = ${exec_prefix}/$(libdirname) - AM_CPPFLAGS = -include $(top_builddir)/config.h -I$(top_srcdir)/include \ -DLOCALEDIR=\"$(localedir)\" AM_CFLAGS = -fsigned-char diff --git a/configure.ac b/configure.ac index 8c17f347..6a870659 100644 --- a/configure.ac +++ b/configure.ac @@ -49,6 +49,17 @@ case ${libdir} in esac AC_SUBST([libdirname]) +# The original default values of {bin,sbin,lib}dir +usrbinexecdir='${exec_prefix}/bin' +AC_SUBST([usrbinexecdir]) + +usrsbinexecdir='${exec_prefix}/sbin' +AC_SUBST([usrsbinexecdir]) + +usrlibexecdir='${exec_prefix}/'$libdirname +AC_SUBST([usrlibexecdir]) + + AC_PROG_CC_STDC AC_GNU_SOURCE AC_CANONICAL_HOST @@ -917,4 +928,5 @@ tests/Makefile text-utils/Makefile ]) + AC_OUTPUT -- cgit v1.2.3 From 5663298c2c8f3b89be5626ca435b3fd1e5509823 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 2 Jul 2009 14:38:23 +0200 Subject: blkid: move to misc-utils/ directory The others utilities are in one of the top-level directories. That's confusing to have blkid(8) and findfs(8) in shlibs/ tree. Signed-off-by: Karel Zak --- configure.ac | 1 - misc-utils/.gitignore | 2 + misc-utils/Makefile.am | 17 ++ misc-utils/blkid.8 | 211 ++++++++++++++ misc-utils/blkid.c | 633 ++++++++++++++++++++++++++++++++++++++++++ misc-utils/findfs.8 | 35 +++ misc-utils/findfs.c | 60 ++++ shlibs/blkid/Makefile.am | 2 +- shlibs/blkid/bin/Makefile.am | 15 - shlibs/blkid/bin/blkid.8 | 211 -------------- shlibs/blkid/bin/blkid.c | 633 ------------------------------------------ shlibs/blkid/bin/blkid.sh.in | 10 - shlibs/blkid/bin/findfs.8 | 35 --- shlibs/blkid/bin/findfs.c | 60 ---- shlibs/blkid/bin/findfs.sh.in | 10 - tests/commands.sh.in | 2 +- 16 files changed, 960 insertions(+), 977 deletions(-) create mode 100644 misc-utils/blkid.8 create mode 100644 misc-utils/blkid.c create mode 100644 misc-utils/findfs.8 create mode 100644 misc-utils/findfs.c delete mode 100644 shlibs/blkid/bin/Makefile.am delete mode 100644 shlibs/blkid/bin/blkid.8 delete mode 100644 shlibs/blkid/bin/blkid.c delete mode 100644 shlibs/blkid/bin/blkid.sh.in delete mode 100644 shlibs/blkid/bin/findfs.8 delete mode 100644 shlibs/blkid/bin/findfs.c delete mode 100644 shlibs/blkid/bin/findfs.sh.in (limited to 'configure.ac') diff --git a/configure.ac b/configure.ac index 6a870659..96eb68a0 100644 --- a/configure.ac +++ b/configure.ac @@ -911,7 +911,6 @@ mount/Makefile partx/Makefile po/Makefile.in schedutils/Makefile -shlibs/blkid/bin/Makefile shlibs/blkid/blkid.pc shlibs/blkid/Makefile shlibs/blkid/src/Makefile diff --git a/misc-utils/.gitignore b/misc-utils/.gitignore index e58c9301..2242b920 100644 --- a/misc-utils/.gitignore +++ b/misc-utils/.gitignore @@ -14,3 +14,5 @@ kill write uuidgen uuidd +findfs +blkid diff --git a/misc-utils/Makefile.am b/misc-utils/Makefile.am index 272ef75d..7c4561c4 100644 --- a/misc-utils/Makefile.am +++ b/misc-utils/Makefile.am @@ -3,6 +3,7 @@ include $(top_srcdir)/config/include-Makefile.am EXTRA_DIST = README.flushb uuidd.rc bin_PROGRAMS = +sbin_PROGRAMS = usrsbinexec_PROGRAMS = usrbinexec_PROGRAMS = cal ddate logger look mcookie \ @@ -31,6 +32,22 @@ uuidd_CFLAGS = -I$(ul_libuuid_srcdir) endif endif +if BUILD_LIBBLKID +sbin_PROGRAMS += blkid findfs +dist_man_MANS += blkid.8 findfs.8 +blkid_LDADD = $(ul_libblkid_la) +blkid_CFLAGS = -I$(ul_libblkid_srcdir) +findfs_LDADD = $(ul_libblkid_la) +findfs_CFLAGS = -I$(ul_libblkid_srcdir) +if HAVE_STATIC_BLKID +sbin_PROGRAMS += blkid.static +blkid_static_SOURCES = $(blkid_SOURCES) +blkid_static_LDFLAGS = "-all-static" # libtool option +blkid_static_LDADD = $(ul_libblkid_la) +blkid_static_CFLAGS = -I$(ul_libblkid_srcdir) +endif +endif + if HAVE_TINFO cal_LDADD = -ltinfo @NCURSES_LIBS@ else diff --git a/misc-utils/blkid.8 b/misc-utils/blkid.8 new file mode 100644 index 00000000..ff8e8e57 --- /dev/null +++ b/misc-utils/blkid.8 @@ -0,0 +1,211 @@ +.\" Copyright 2000 Andreas Dilger (adilger@turbolinux.com) +.\" +.\" This man page was created for blkid from e2fsprogs-1.25. +.\" +.\" This file may be copied under the terms of the GNU Public License. +.\" +.\" Based on uuidgen, Mon Sep 17 10:42:12 2000, Andreas Dilger +.TH BLKID 8 "February 2009" "Linux" "MAINTENANCE COMMANDS" +.SH NAME +blkid \- command\-line utility to locate/print block device attributes +.SH SYNOPSIS +.B blkid +.RB \-L +.IR label " | " +.RB \-U +.IR uuid + +.B blkid +.RB [ \-ghlv ] +.RB [ \-c +.IR file ] +.RB [ \-w +.IR file ] +.RB [ \-o +.IR format ] +.in +6 +.RB [ \-s +.IR tag ] +.RB [ \-t +.IR NAME=value ] +.I device +[\fIdevice\fR ...] +.in -6 + +.B blkid +.RB -p +.RB [ \-O +.IR offset ] +.RB [ \-S +.IR size ] +.RB [ \-o +.IR format ] +.RB [ \-u +.IR list ] +.I device +[\fIdevice\fR ...] + +.SH DESCRIPTION +The +.B blkid +program is the command-line interface to working with +.BR libblkid (3) +library. It can determine the type of content (e.g. filesystem, swap) +a block device holds, and also attributes (tokens, NAME=value pairs) +from the content metadata (e.g. LABEL or UUID fields). +.PP +.B blkid +has two main forms of operation: either searching for a device with a +specific NAME=value pair, or displaying NAME=value pairs for one or +more devices. +.SH OPTIONS +.TP +.BI \-c " cachefile" +Read from +.I cachefile +instead of reading from the default cache file +.IR /etc/blkid.tab . +If you want to start with a clean cache (i.e. don't report devices previously +scanned but not necessarily available at this time), specify +.IR /dev/null . +.TP +.B \-g +Perform a garbage collection pass on the blkid cache to remove +devices which no longer exist. +.TP +.B \-h +Display a usage message and exit. +.TP +.B \-l +Look up one device that matches the search parameter specified using +the +.B \-t +option. If there are multiple devices that match the specified search +parameter, then the device with the highest priority is returned, and/or +the first device found at a given priority. Device types in order of +decreasing priority are Device Mapper, EVMS, LVM, MD, and finally regular +block devices. If this option is not specified, +.B blkid +will print all of the devices that match the search parameter. +.TP +.B \-L " label " +Look up one device that uses the label (same as: -l -o device -t +LABEL=